wasm->CLIF translation: consistently bitcast V128 values that are block formal parameters.

In the current translation of wasm (128-bit) SIMD into CLIF, we work around differences in the
type system models of wasm vs CLIF by inserting `bitcast` (a no-op cast) CLIF instructions before
more or less every use of a SIMD value.  Unfortunately this was not being done consistently and
even small examples with a single if-then-else diamond that produces a SIMD value, could cause a
verification failure downstream.  In this case, the jump out of the "else" block needed a
bitcast, but didn't have one.

This patch wraps creation of CLIF jumps and conditional branches up into three functions,
`canonicalise_then_jump` and `canonicalise_then_br{z,nz}`, and uses them consistently.  They
first cast the relevant block formal parameters, then generate the relevant kind of branch/jump.
Hence, provided they are also used consistently in future to generate branches/jumps in this
file, we are protected against such failures.

The patch also adds a large(ish) comment at the top explaining this in more detail.
This commit is contained in:
Julian Seward
2020-10-20 15:58:20 +02:00
committed by julian-seward1
parent 76998f0404
commit ab65d8f10c
4 changed files with 165 additions and 45 deletions

1
Cargo.lock generated
View File

@@ -590,6 +590,7 @@ dependencies = [
"itertools 0.9.0",
"log",
"serde",
"smallvec",
"target-lexicon",
"thiserror",
"wasmparser 0.63.0",