MoritzS added a comment.
Thanks for the patch! I just tried it out and I think this enables many
interesting use cases for WebAssembly when using C/C++.
Currently the lowering to wasm does not work when using externrefs when
compiling without optimizations. Is that intended behavior?
I have this example C++ program (similar to the `wasm-externref.c` test):
void extern_func(__externref_t ref);
void my_func(__externref_t ref) {
extern_func(ref);
}
If I compile this without optimizations (exact command: `clang++
--target=wasm32 -mreference-types -c ./test_externref.cpp`), I get the
following error:
fatal error: error in backend: Cannot select: 0x621000066bd0: externref,ch =
load<(dereferenceable load (s0) from %ir.2)> 0x621000066b58,
TargetFrameIndex:i32<0>, undef:i32
0x621000066a68: i32 = TargetFrameIndex<0>
0x621000066ae0: i32 = undef
The reason for that can be seen when we look at the generated IR for this
program:
; Function Attrs: mustprogress noinline optnone
define hidden void @_Z7my_func11externref_t(ptr addrspace(10) %0) #0 {
%2 = alloca ptr addrspace(10), align 1
store ptr addrspace(10) %0, ptr %2, align 1
%3 = load ptr addrspace(10), ptr %2, align 1
call void @_Z11extern_func11externref_t(ptr addrspace(10) %3)
ret void
}
declare void @_Z11extern_func11externref_t(ptr addrspace(10)) #1
Apparently when no optimizations are enabled, clang will write all function
arguments to an alloca'd variable. This obviously won't work if the value is an
externref. The test case in `wasm-externref.c` also has the alloca and store
with an externref value as expected output, which I think should never be
generated.
With -O3 this doesn't happen as the alloca'd variables are optimized out. But I
still think it should also work with -O0.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D122215/new/
https://reviews.llvm.org/D122215
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits