[PATCH] D27702: AMDGPU: Fix asserting on returned tail calls

Matt Arsenault via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 13 01:27:15 PST 2016


arsenm created this revision.
arsenm added a subscriber: llvm-commits.
Herald added a reviewer: tstellarAMD.
Herald added subscribers: tony-tye, yaxunl, nhaehnle, wdng, kzhuravl.

https://reviews.llvm.org/D27702

Files:
  lib/Target/AMDGPU/AMDGPUISelLowering.cpp
  test/CodeGen/AMDGPU/call.ll


Index: test/CodeGen/AMDGPU/call.ll
===================================================================
--- test/CodeGen/AMDGPU/call.ll
+++ test/CodeGen/AMDGPU/call.ll
@@ -5,6 +5,7 @@
 ; CHECK: in function test_call_external{{.*}}: unsupported call to function external_function
 ; CHECK: in function test_call{{.*}}: unsupported call to function defined_function
 ; CHECK: in function test_tail_call{{.*}}: unsupported call to function defined_function
+; CHECK: in function test_tail_call_bitcast_extern_variadic{{.*}}: unsupported call to function extern_variadic
 
 
 declare i32 @external_function(i32) nounwind
@@ -43,3 +44,16 @@
   store i32 %result, i32 addrspace(1)* %out
   ret void
 }
+
+define i32 @test_tail_call_ret() {
+  %call = call i32 @external_function(i32 10)
+  ret i32 %call
+}
+
+declare i32 @extern_variadic(...)
+
+define i32 @test_tail_call_bitcast_extern_variadic(<4 x float> %arg0, <4 x float> %arg1, i32 %arg2) {
+  %add = fadd <4 x float> %arg0, %arg1
+  %call = tail call i32 bitcast (i32 (...)* @extern_variadic to i32 (<4 x float>)*)(<4 x float> %add) #7
+  ret i32 %call
+}
Index: lib/Target/AMDGPU/AMDGPUISelLowering.cpp
===================================================================
--- lib/Target/AMDGPU/AMDGPUISelLowering.cpp
+++ lib/Target/AMDGPU/AMDGPUISelLowering.cpp
@@ -789,8 +789,10 @@
       Fn, "unsupported call to function " + FuncName, CLI.DL.getDebugLoc());
   DAG.getContext()->diagnose(NoCalls);
 
-  for (unsigned I = 0, E = CLI.Ins.size(); I != E; ++I)
-    InVals.push_back(DAG.getUNDEF(CLI.Ins[I].VT));
+  if (!CLI.IsTailCall) {
+    for (unsigned I = 0, E = CLI.Ins.size(); I != E; ++I)
+      InVals.push_back(DAG.getUNDEF(CLI.Ins[I].VT));
+  }
 
   return DAG.getEntryNode();
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27702.81194.patch
Type: text/x-patch
Size: 1743 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161213/04d0b9d0/attachment.bin>


More information about the llvm-commits mailing list