[llvm] r358793 - [WebAssembly] FastISel: Don't fallback to SelectionDAG after BuildMI in selectCall
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 19 15:43:32 PDT 2019
Author: sbc
Date: Fri Apr 19 15:43:32 2019
New Revision: 358793
URL: http://llvm.org/viewvc/llvm-project?rev=358793&view=rev
Log:
[WebAssembly] FastISel: Don't fallback to SelectionDAG after BuildMI in selectCall
My understanding is that once BuildMI has been called we can't fallback
to SelectionDAG.
This change moves the fallback for when getRegForValue() fails for
that target of an indirect call. This was failing in -fPIC mode when
the callee is GlobalValue.
Add a test case that tickles this.
Differential Revision: https://reviews.llvm.org/D60908
Modified:
llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
llvm/trunk/test/CodeGen/WebAssembly/call-pic.ll
Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp?rev=358793&r1=358792&r2=358793&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyFastISel.cpp Fri Apr 19 15:43:32 2019
@@ -851,6 +851,13 @@ bool WebAssemblyFastISel::selectCall(con
Args.push_back(Reg);
}
+ unsigned CalleeReg = 0;
+ if (!IsDirect) {
+ CalleeReg = getRegForValue(Call->getCalledValue());
+ if (!CalleeReg)
+ return false;
+ }
+
auto MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(Opc));
if (!IsVoid)
@@ -858,12 +865,8 @@ bool WebAssemblyFastISel::selectCall(con
if (IsDirect)
MIB.addGlobalAddress(Func);
- else {
- unsigned Reg = getRegForValue(Call->getCalledValue());
- if (Reg == 0)
- return false;
- MIB.addReg(Reg);
- }
+ else
+ MIB.addReg(CalleeReg);
for (unsigned ArgReg : Args)
MIB.addReg(ArgReg);
Modified: llvm/trunk/test/CodeGen/WebAssembly/call-pic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/call-pic.ll?rev=358793&r1=358792&r2=358793&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WebAssembly/call-pic.ll (original)
+++ llvm/trunk/test/CodeGen/WebAssembly/call-pic.ll Fri Apr 19 15:43:32 2019
@@ -8,6 +8,11 @@ declare i32 @bar()
declare hidden i32 @hidden_function()
@indirect_func = global i32 ()* @foo
+ at alias_func = hidden alias i32 (), i32 ()* @local_function
+
+define i32 @local_function() {
+ ret i32 1
+}
define void @call_indirect_func() {
; CHECK-LABEL: call_indirect_func:
@@ -31,6 +36,16 @@ define void @call_direct() {
ret void
}
+define void @call_alias_func() {
+; CHECK-LABEL: call_alias_func:
+; CHECK: .functype call_alias_func () -> ()
+; CHECK-NEXT: i32.call $push0=, alias_func
+; CHECK-NEXT: drop $pop0{{$}}
+; CHECK-NEXT: return{{$}}
+ %call = call i32 @alias_func()
+ ret void
+}
+
define i8* @get_function_address() {
; CHECK-LABEL: get_function_address:
; CHECK: global.get $push[[L0:[0-9]+]]=, bar at GOT{{$}}
More information about the llvm-commits
mailing list