Skip to content

Commit 6b8c88c

Browse files
authored
Merge pull request bytecodealliance#27 from dhil/wasmfx-merge
Merge with upstream
2 parents ae39c7c + eba7b2d commit 6b8c88c

File tree

64 files changed

+1588
-1581
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+1588
-1581
lines changed

Cargo.lock

Lines changed: 20 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ wasmtime-runtime = { workspace = true }
3939
clap = { workspace = true, features = ["color", "suggestions", "derive"] }
4040
anyhow = { workspace = true }
4141
target-lexicon = { workspace = true }
42-
tracing-subscriber = { workspace = true }
4342
once_cell = { workspace = true }
4443
listenfd = "1.0.0"
4544
wat = { workspace = true }
@@ -265,7 +264,7 @@ indexmap = "2.0.0"
265264
pretty_env_logger = "0.5.0"
266265
syn = "2.0.25"
267266
test-log = { version = "0.2", default-features = false, features = ["trace"] }
268-
tracing-subscriber = { version = "0.3.1", default-features = false, features = ['fmt', 'env-filter', 'ansi'] }
267+
tracing-subscriber = { version = "0.3.1", default-features = false, features = ['fmt', 'env-filter', 'ansi', 'tracing-log'] }
269268
url = "2.3.1"
270269

271270
[features]

cranelift/codegen/src/ir/memtype.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,9 @@ pub struct MemoryTypeField {
160160
}
161161

162162
impl MemoryTypeField {
163-
/// Get the fact, if any, on a field. Fills in a default inferred
164-
/// fact based on the type if no explicit fact is present.
163+
/// Get the fact, if any, on a field.
165164
pub fn fact(&self) -> Option<&Fact> {
166-
self.fact
167-
.as_ref()
168-
.or_else(|| Fact::infer_from_type(self.ty))
165+
self.fact.as_ref()
169166
}
170167
}
171168

cranelift/codegen/src/ir/pcc.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,6 @@ impl<'a> FactContext<'a> {
230230
// Reflexivity.
231231
(l, r) if l == r => true,
232232

233-
// Any value on the LHS subsumes a minimal (always-true)
234-
// fact about the max value of a given bitwidth on the
235-
// RHS: e.g., no matter the value, the bottom 8 bits will
236-
// always be <= 255.
237-
(_, Fact::ValueMax { bit_width, max }) if *max == max_value_for_width(*bit_width) => {
238-
true
239-
}
240-
241233
(
242234
Fact::ValueMax {
243235
bit_width: bw_lhs,
@@ -487,8 +479,7 @@ impl<'a> FactContext<'a> {
487479
pub fn load<'b>(&'b self, fact: &Fact, access_ty: ir::Type) -> PccResult<Option<&'b Fact>> {
488480
Ok(self
489481
.struct_field(fact, access_ty)?
490-
.and_then(|field| field.fact())
491-
.or_else(|| Fact::infer_from_type(access_ty)))
482+
.and_then(|field| field.fact()))
492483
}
493484

494485
/// Check a store.

cranelift/codegen/src/isa/aarch64/pcc.rs

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use crate::ir::pcc::*;
44
use crate::ir::types::*;
55
use crate::ir::MemFlags;
6+
use crate::ir::Type;
67
use crate::isa::aarch64::inst::args::{PairAMode, ShiftOp};
78
use crate::isa::aarch64::inst::ALUOp;
89
use crate::isa::aarch64::inst::Inst;
@@ -11,8 +12,11 @@ use crate::machinst::Reg;
1112
use crate::machinst::VCode;
1213
use crate::trace;
1314

14-
fn get_fact(vcode: &VCode<Inst>, reg: Reg) -> PccResult<&Fact> {
15-
vcode.vreg_fact(reg.into()).ok_or(PccError::MissingFact)
15+
fn get_fact_or_default(vcode: &VCode<Inst>, reg: Reg) -> PccResult<&Fact> {
16+
vcode
17+
.vreg_fact(reg.into())
18+
.or_else(|| Fact::infer_from_type(vcode.vreg_type(reg.into())))
19+
.ok_or(PccError::MissingFact)
1620
}
1721

1822
fn has_fact(vcode: &VCode<Inst>, reg: Reg) -> bool {
@@ -130,21 +134,19 @@ pub(crate) fn check(ctx: &FactContext, vcode: &VCode<Inst>, inst: &Inst) -> PccR
130134
rd,
131135
rn,
132136
rm,
133-
} if has_fact(vcode, *rn) && has_fact(vcode, *rm) => {
134-
check_output(&ctx, vcode, rd.to_reg(), || {
135-
let rn = get_fact(vcode, *rn)?;
136-
let rm = get_fact(vcode, *rm)?;
137-
fail_if_missing(ctx.add(rn, rm, size.bits().into()))
138-
})
139-
}
137+
} => check_output(&ctx, vcode, rd.to_reg(), || {
138+
let rn = get_fact_or_default(vcode, *rn)?;
139+
let rm = get_fact_or_default(vcode, *rm)?;
140+
fail_if_missing(ctx.add(rn, rm, size.bits().into()))
141+
}),
140142
Inst::AluRRImm12 {
141143
alu_op: ALUOp::Add,
142144
size,
143145
rd,
144146
rn,
145147
imm12,
146-
} if has_fact(vcode, *rn) => check_output(&ctx, vcode, rd.to_reg(), || {
147-
let rn = get_fact(vcode, *rn)?;
148+
} => check_output(&ctx, vcode, rd.to_reg(), || {
149+
let rn = get_fact_or_default(vcode, *rn)?;
148150
let imm_fact = Fact::ValueMax {
149151
bit_width: size.bits().into(),
150152
max: imm12.value(),
@@ -160,8 +162,8 @@ pub(crate) fn check(ctx: &FactContext, vcode: &VCode<Inst>, inst: &Inst) -> PccR
160162
shiftop,
161163
} if shiftop.op() == ShiftOp::LSL && has_fact(vcode, *rn) && has_fact(vcode, *rm) => {
162164
check_output(&ctx, vcode, rd.to_reg(), || {
163-
let rn = get_fact(vcode, *rn)?;
164-
let rm = get_fact(vcode, *rm)?;
165+
let rn = get_fact_or_default(vcode, *rn)?;
166+
let rm = get_fact_or_default(vcode, *rm)?;
165167
let rm_shifted = fail_if_missing(ctx.shl(
166168
&rm,
167169
size.bits().into(),
@@ -179,8 +181,8 @@ pub(crate) fn check(ctx: &FactContext, vcode: &VCode<Inst>, inst: &Inst) -> PccR
179181
extendop,
180182
} if has_fact(vcode, *rn) && has_fact(vcode, *rm) => {
181183
check_output(&ctx, vcode, rd.to_reg(), || {
182-
let rn = get_fact(vcode, *rn)?;
183-
let rm = get_fact(vcode, *rm)?;
184+
let rn = get_fact_or_default(vcode, *rn)?;
185+
let rm = get_fact_or_default(vcode, *rm)?;
184186
let rm_extended = fail_if_missing(extend_fact(&ctx, rm, *extendop))?;
185187
fail_if_missing(ctx.add(&rn, &rm_extended, size.bits().into()))
186188
})
@@ -193,7 +195,7 @@ pub(crate) fn check(ctx: &FactContext, vcode: &VCode<Inst>, inst: &Inst) -> PccR
193195
immshift,
194196
} if has_fact(vcode, *rn) && has_fact(vcode, *rn) => {
195197
check_output(&ctx, vcode, rd.to_reg(), || {
196-
let rn = get_fact(vcode, *rn)?;
198+
let rn = get_fact_or_default(vcode, *rn)?;
197199
fail_if_missing(ctx.shl(&rn, size.bits().into(), immshift.value().into()))
198200
})
199201
}
@@ -204,7 +206,7 @@ pub(crate) fn check(ctx: &FactContext, vcode: &VCode<Inst>, inst: &Inst) -> PccR
204206
from_bits,
205207
to_bits,
206208
} if has_fact(vcode, *rn) => check_output(&ctx, vcode, rd.to_reg(), || {
207-
let rn = get_fact(vcode, *rn)?;
209+
let rn = get_fact_or_default(vcode, *rn)?;
208210
fail_if_missing(ctx.uextend(&rn, (*from_bits).into(), (*to_bits).into()))
209211
}),
210212
Inst::AluRRR { size, rd, .. }
@@ -249,7 +251,7 @@ fn check_load(
249251
vcode: &VCode<Inst>,
250252
ty: Type,
251253
) -> PccResult<()> {
252-
let result_fact = rd.map(|rd| get_fact(vcode, rd)).transpose()?;
254+
let result_fact = rd.and_then(|rd| vcode.vreg_fact(rd.into()));
253255
check_addr(
254256
ctx,
255257
flags,
@@ -268,7 +270,7 @@ fn check_store(
268270
vcode: &VCode<Inst>,
269271
ty: Type,
270272
) -> PccResult<()> {
271-
let stored_fact = rd.map(|rd| get_fact(vcode, rd)).transpose()?;
273+
let stored_fact = rd.and_then(|rd| vcode.vreg_fact(rd.into()));
272274
check_addr(
273275
ctx,
274276
flags,
@@ -312,14 +314,14 @@ fn check_addr<'a>(
312314

313315
match addr {
314316
&AMode::RegReg { rn, rm } => {
315-
let rn = get_fact(vcode, rn)?;
316-
let rm = get_fact(vcode, rm)?;
317+
let rn = get_fact_or_default(vcode, rn)?;
318+
let rm = get_fact_or_default(vcode, rm)?;
317319
let sum = fail_if_missing(ctx.add(&rn, &rm, 64))?;
318320
check(&sum, ty)
319321
}
320322
&AMode::RegScaled { rn, rm, ty } => {
321-
let rn = get_fact(vcode, rn)?;
322-
let rm = get_fact(vcode, rm)?;
323+
let rn = get_fact_or_default(vcode, rn)?;
324+
let rm = get_fact_or_default(vcode, rm)?;
323325
let rm_scaled = fail_if_missing(ctx.scale(&rm, 64, ty.bytes()))?;
324326
let sum = fail_if_missing(ctx.add(&rn, &rm_scaled, 64))?;
325327
check(&sum, ty)
@@ -330,16 +332,16 @@ fn check_addr<'a>(
330332
ty,
331333
extendop,
332334
} => {
333-
let rn = get_fact(vcode, rn)?;
334-
let rm = get_fact(vcode, rm)?;
335+
let rn = get_fact_or_default(vcode, rn)?;
336+
let rm = get_fact_or_default(vcode, rm)?;
335337
let rm_extended = fail_if_missing(extend_fact(ctx, rm, extendop))?;
336338
let rm_scaled = fail_if_missing(ctx.scale(&rm_extended, 64, ty.bytes()))?;
337339
let sum = fail_if_missing(ctx.add(&rn, &rm_scaled, 64))?;
338340
check(&sum, ty)
339341
}
340342
&AMode::RegExtended { rn, rm, extendop } => {
341-
let rn = get_fact(vcode, rn)?;
342-
let rm = get_fact(vcode, rm)?;
343+
let rn = get_fact_or_default(vcode, rn)?;
344+
let rm = get_fact_or_default(vcode, rm)?;
343345
let rm_extended = fail_if_missing(extend_fact(ctx, rm, extendop))?;
344346
let sum = fail_if_missing(ctx.add(&rn, &rm_extended, 64))?;
345347
trace!("rn = {rn:?} rm = {rm:?} rm_extended = {rm_extended:?} sum = {sum:?}");
@@ -348,12 +350,12 @@ fn check_addr<'a>(
348350
Ok(())
349351
}
350352
&AMode::Unscaled { rn, simm9 } => {
351-
let rn = get_fact(vcode, rn)?;
353+
let rn = get_fact_or_default(vcode, rn)?;
352354
let sum = fail_if_missing(ctx.offset(&rn, 64, simm9.value.into()))?;
353355
check(&sum, ty)
354356
}
355357
&AMode::UnsignedOffset { rn, uimm12 } => {
356-
let rn = get_fact(vcode, rn)?;
358+
let rn = get_fact_or_default(vcode, rn)?;
357359
// Safety: this will not overflow: `size` should be at
358360
// most 32 or 64 for large vector ops, and the `uimm12`'s
359361
// value is at most 4095.
@@ -371,7 +373,7 @@ fn check_addr<'a>(
371373
Ok(())
372374
}
373375
&AMode::RegOffset { rn, off, .. } => {
374-
let rn = get_fact(vcode, rn)?;
376+
let rn = get_fact_or_default(vcode, rn)?;
375377
let sum = fail_if_missing(ctx.offset(&rn, 64, off))?;
376378
check(&sum, ty)
377379
}
@@ -417,7 +419,7 @@ fn check_load_addr(
417419
if !flags.checked() {
418420
return Ok(());
419421
}
420-
let fact = get_fact(vcode, reg)?;
422+
let fact = get_fact_or_default(vcode, reg)?;
421423
let _output_fact = ctx.load(fact, ty)?;
422424
Ok(())
423425
}
@@ -432,7 +434,7 @@ fn check_store_addr(
432434
if !flags.checked() {
433435
return Ok(());
434436
}
435-
let fact = get_fact(vcode, reg)?;
437+
let fact = get_fact_or_default(vcode, reg)?;
436438
let _output_fact = ctx.store(fact, ty, None)?;
437439
Ok(())
438440
}

0 commit comments

Comments
 (0)