[all-commits] [llvm/llvm-project] 765f0d: [WebAssembly] Represent reference types as TargetE...

Hood Chatham via All-commits all-commits at lists.llvm.org
Wed Jun 24 22:07:54 PDT 2026


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 765f0d14fe14a8394abf23afbdc6d6d657f6459d
      https://github.com/llvm/llvm-project/commit/765f0d14fe14a8394abf23afbdc6d6d657f6459d
  Author: Hood Chatham <roberthoodchatham at gmail.com>
  Date:   2026-06-24 (Wed, 24 Jun 2026)

  Changed paths:
    M clang/docs/ReleaseNotes.rst
    M clang/lib/CodeGen/CGExpr.cpp
    M clang/lib/CodeGen/CGExprConstant.cpp
    M clang/lib/CodeGen/CGExprScalar.cpp
    M clang/lib/CodeGen/CodeGenTypes.cpp
    M clang/test/CodeGen/WebAssembly/builtins-table-externref.c
    M clang/test/CodeGen/WebAssembly/builtins-table-funcref.c
    M clang/test/CodeGen/WebAssembly/builtins-test-fp-sig.c
    M clang/test/CodeGen/WebAssembly/wasm-externref.c
    A clang/test/CodeGen/WebAssembly/wasm-funcref-to-ptr-error.c
    M clang/test/CodeGen/WebAssembly/wasm-funcref.c
    M clang/test/CodeGen/builtins-wasm.c
    M clang/test/CodeGenCXX/wasm-reftypes-mangle.cpp
    M llvm/docs/ReleaseNotes.md
    M llvm/include/llvm/IR/Intrinsics.h
    M llvm/include/llvm/IR/IntrinsicsWebAssembly.td
    M llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
    M llvm/lib/CodeGen/ValueTypes.cpp
    M llvm/lib/IR/Intrinsics.cpp
    M llvm/lib/IR/Type.cpp
    M llvm/lib/Target/WebAssembly/CMakeLists.txt
    M llvm/lib/Target/WebAssembly/GISel/WebAssemblyCallLowering.cpp
    M llvm/lib/Target/WebAssembly/Utils/WasmAddressSpaces.h
    M llvm/lib/Target/WebAssembly/Utils/WebAssemblyTypeUtilities.h
    M llvm/lib/Target/WebAssembly/WebAssembly.h
    M llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
    M llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp
    M llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
    M llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h
    R llvm/lib/Target/WebAssembly/WebAssemblyLowerRefTypesIntPtrConv.cpp
    M llvm/lib/Target/WebAssembly/WebAssemblyRefTypeMem2Local.cpp
    M llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
    M llvm/test/CodeGen/WebAssembly/GlobalISel/irtranslator/args.ll
    M llvm/test/CodeGen/WebAssembly/GlobalISel/irtranslator/call-basics.ll
    M llvm/test/CodeGen/WebAssembly/GlobalISel/irtranslator/ret-basics.ll
    A llvm/test/CodeGen/WebAssembly/GlobalISel/reference-types-fallback.ll
    M llvm/test/CodeGen/WebAssembly/externref-globalget.ll
    M llvm/test/CodeGen/WebAssembly/externref-globalset.ll
    M llvm/test/CodeGen/WebAssembly/externref-inttoptr.ll
    M llvm/test/CodeGen/WebAssembly/externref-ptrtoint.ll
    M llvm/test/CodeGen/WebAssembly/externref-tableget.ll
    M llvm/test/CodeGen/WebAssembly/externref-tableset.ll
    M llvm/test/CodeGen/WebAssembly/externref-unsized-load.ll
    M llvm/test/CodeGen/WebAssembly/externref-unsized-store.ll
    M llvm/test/CodeGen/WebAssembly/funcref-call.ll
    M llvm/test/CodeGen/WebAssembly/funcref-globalget.ll
    M llvm/test/CodeGen/WebAssembly/funcref-globalset.ll
    A llvm/test/CodeGen/WebAssembly/funcref-ptr-conversion.ll
    M llvm/test/CodeGen/WebAssembly/funcref-table_call.ll
    M llvm/test/CodeGen/WebAssembly/funcref-tableget.ll
    M llvm/test/CodeGen/WebAssembly/funcref-tableset.ll
    A llvm/test/CodeGen/WebAssembly/funcref-to-ptr-error.ll
    A llvm/test/CodeGen/WebAssembly/ref-null-zeroinitializer.ll
    M llvm/test/CodeGen/WebAssembly/ref-null.ll
    M llvm/test/CodeGen/WebAssembly/ref-test-func.ll
    M llvm/test/CodeGen/WebAssembly/ref-type-mem2local.ll
    M llvm/test/CodeGen/WebAssembly/select-reftype.ll
    M llvm/test/CodeGen/WebAssembly/table-copy.ll
    M llvm/test/CodeGen/WebAssembly/table-fill.ll
    M llvm/test/CodeGen/WebAssembly/table-grow.ll
    M llvm/test/CodeGen/WebAssembly/table-size.ll
    M llvm/test/CodeGen/WebAssembly/table-types.ll
    A llvm/test/Transforms/SLPVectorizer/WebAssembly/externref-no-vectorize.ll
    M llvm/utils/gn/secondary/llvm/lib/Target/WebAssembly/BUILD.gn

  Log Message:
  -----------
  [WebAssembly] Represent reference types as TargetExtType (#203165)

Originally #71540 by Paolo Matos, I picked it up and finished it.
Resolves https://github.com/llvm/llvm-project/issues/69894.

Model WebAssembly externref and funcref as target("wasm.externref") /
target("wasm.funcref") TargetExtTypes instead of pointers in
non-integral address spaces 10 and 20.

The entire WebAssemblyLowerRefTypesIntPtrConv can be removed.

This breaks the GlobalISel handling for reference types, I just disabled
GlobalISel handling for functions that use them.

I added intrinsics for `wasm.ptr.to_funcref` and `wasm.funcref.to_ptr`.
ptr.to_funcref does a table.get from the indirect function pointer
table. As a special case, 0 is converted to the null funcref rather than
doing table.get on 0. `wasm.funcref.to_ptr` is only handled when we call
it immediately, otherwise it will fail to lower. We could dynamically
put the funcref into the table to make it work but that would require a
stack of spilled funcrefs and isn't worth the effort.

In the process of looking into this, I noticed that clang used to allow
casting from funcref to function pointer but if the cast result escaped
it would hit `Cannot select: FUNCREF_TO_PTR` in the backend. I added a
diagnostic that says "a funcref can only be converted to a pointer to be
directly called" to make this a little cleaner.

cc @QuantumSegfault

---------

Co-authored-by: Paulo Matos <pmatos at igalia.com>



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list