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
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to