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.
40 lines
1.4 KiB
TOML
40 lines
1.4 KiB
TOML
[package]
|
|
name = "cranelift-wasm"
|
|
version = "0.67.0"
|
|
authors = ["The Cranelift Project Developers"]
|
|
description = "Translator from WebAssembly to Cranelift IR"
|
|
documentation = "https://docs.rs/cranelift-wasm"
|
|
repository = "https://github.com/bytecodealliance/wasmtime"
|
|
license = "Apache-2.0 WITH LLVM-exception"
|
|
categories = ["no-std", "wasm"]
|
|
readme = "README.md"
|
|
keywords = ["webassembly", "wasm"]
|
|
edition = "2018"
|
|
|
|
[dependencies]
|
|
wasmparser = { version = "0.63.0", default-features = false }
|
|
cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false }
|
|
cranelift-entity = { path = "../entity", version = "0.67.0" }
|
|
cranelift-frontend = { path = "../frontend", version = "0.67.0", default-features = false }
|
|
hashbrown = { version = "0.7", optional = true }
|
|
itertools = "0.9.0"
|
|
log = { version = "0.4.6", default-features = false }
|
|
serde = { version = "1.0.94", features = ["derive"], optional = true }
|
|
smallvec = "1.0.0"
|
|
thiserror = "1.0.4"
|
|
|
|
[dev-dependencies]
|
|
wat = "1.0.23"
|
|
target-lexicon = "0.11"
|
|
# Enable the riscv feature for cranelift-codegen, as some tests require it
|
|
cranelift-codegen = { path = "../codegen", version = "0.67.0", default-features = false, features = ["riscv"] }
|
|
|
|
[features]
|
|
default = ["std"]
|
|
std = ["cranelift-codegen/std", "cranelift-frontend/std"]
|
|
core = ["hashbrown", "cranelift-codegen/core", "cranelift-frontend/core"]
|
|
enable-serde = ["serde"]
|
|
|
|
[badges]
|
|
maintenance = { status = "experimental" }
|