Closed
Description
AsmTypeCheck
does not handle block/loop's concrete return values when their end is not reachable, for example,
block i32
i32.const 0
br 0
end
This is a valid wasm program but does not pass AsmTypeCheck
.
Currently Wasm backend does not generate block
/loop
return types, but one exception is, the ones generated by WebAssemblyCFGStackify::fixEndsAtEndOfFunction
:
llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
Lines 1460 to 1520 in 093b8bf
An example program that would generate this case is
;; test.ll
target triple = "wasm32-unknown-unknown"
define i32 @loop_i32() {
entry:
br label %header
header:
br label %header
}
which generates
loop i32
br 0
end
The reproducing commands:
$ llc test.ll
$ llvm-mc -triple=wasm32-unknown-unknown test.s
The error will be
...
loop i32 # label0:
br 0 # 0: up to label0
.LBB0_2:
b.s:15:2: error: end: insufficient values on the type stack
end_loop
^
end_function
...