[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