[llvm] 0c74958 - [WebAssembly] Fix call_indirect on funcrefs
Paulo Matos via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 6 01:25:46 PDT 2021
Author: Paulo Matos
Date: 2021-10-06T10:11:53+02:00
New Revision: 0c7495848a02e1bcc68527c77c2a060ffae408c1
URL: https://github.com/llvm/llvm-project/commit/0c7495848a02e1bcc68527c77c2a060ffae408c1
DIFF: https://github.com/llvm/llvm-project/commit/0c7495848a02e1bcc68527c77c2a060ffae408c1.diff
LOG: [WebAssembly] Fix call_indirect on funcrefs
The currently implementation of funcrefs is broken since it is putting
the funcref itself on the stack before the call_indirect. Instead what
should be on the stack is the constant 0, which is the index at which
we store the funcref in __funcref_call_table.
Reviewed By: tlively
Differential Revision: https://reviews.llvm.org/D111152
Added:
Modified:
llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
llvm/test/CodeGen/WebAssembly/funcref-call.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
index 7dd1f48584fbb..6284a3c39b505 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
@@ -567,7 +567,21 @@ LowerCallResults(MachineInstr &CallResults, DebugLoc DL, MachineBasicBlock *BB,
if (IsIndirect) {
auto FnPtr = CallParams.getOperand(0);
CallParams.RemoveOperand(0);
- CallParams.addOperand(FnPtr);
+
+ // For funcrefs, call_indirect is done through __funcref_call_table and the
+ // funcref is always installed in slot 0 of the table, therefore instead of having
+ // the function pointer added at the end of the params list, a zero (the index in
+ // __funcref_call_table is added).
+ if (IsFuncrefCall) {
+ Register RegZero =
+ MF.getRegInfo().createVirtualRegister(&WebAssembly::I32RegClass);
+ MachineInstrBuilder MIBC0 =
+ BuildMI(MF, DL, TII.get(WebAssembly::CONST_I32), RegZero).addImm(0);
+
+ BB->insert(CallResults.getIterator(), MIBC0);
+ MachineInstrBuilder(MF, CallParams).addReg(RegZero);
+ } else
+ CallParams.addOperand(FnPtr);
}
for (auto Def : CallResults.defs())
diff --git a/llvm/test/CodeGen/WebAssembly/funcref-call.ll b/llvm/test/CodeGen/WebAssembly/funcref-call.ll
index bd8d6c3eacef2..abe6b7b80b90c 100644
--- a/llvm/test/CodeGen/WebAssembly/funcref-call.ll
+++ b/llvm/test/CodeGen/WebAssembly/funcref-call.ll
@@ -15,7 +15,7 @@ define void @call_funcref(%funcref %ref) {
; CHECK-NEXT: i32.const 0
; CHECK-NEXT: local.get 0
; CHECK-NEXT: table.set __funcref_call_table
-; CHECK-NEXT: local.get 0
+; CHECK-NEXT: i32.const 0
; CHECK-NEXT: call_indirect __funcref_call_table, () -> ()
; CHECK-NEXT: i32.const 0
; CHECK-NEXT: ref.null func
More information about the llvm-commits
mailing list