[PATCH] D51794: AMDGPU: Don't error on calls to null or undef
Matt Arsenault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 7 08:29:03 PDT 2018
arsenm created this revision.
arsenm added a reviewer: rampitec.
Herald added subscribers: t-tye, tpr, dstuttard, yaxunl, nhaehnle, wdng, jvesely, kzhuravl.
Calls to constants should probably be generally handled.
https://reviews.llvm.org/D51794
Files:
lib/Target/AMDGPU/SIISelLowering.cpp
test/CodeGen/AMDGPU/call-constant.ll
test/CodeGen/AMDGPU/unsupported-calls.ll
Index: test/CodeGen/AMDGPU/unsupported-calls.ll
===================================================================
--- test/CodeGen/AMDGPU/unsupported-calls.ll
+++ test/CodeGen/AMDGPU/unsupported-calls.ll
@@ -74,3 +74,13 @@
%call = call i32 @defined_function(i32 0)
ret i32 %call
}
+
+; FIXME: Bad error message
+; GCN: error: <unknown>:0:0: in function test_call_absolute void (): unsupported indirect call to function <unknown>
+; R600: error: <unknown>:0:0: in function test_call_absolute void (): unsupported call to function <unknown>
+define amdgpu_kernel void @test_call_absolute() #0 {
+ %val = call i32 inttoptr (i64 1234 to i32(i32)*) (i32 1)
+ %op = add i32 %val, 1
+ store volatile i32 %op, i32 addrspace(1)* undef
+ ret void
+}
Index: test/CodeGen/AMDGPU/call-constant.ll
===================================================================
--- /dev/null
+++ test/CodeGen/AMDGPU/call-constant.ll
@@ -0,0 +1,45 @@
+; RUN: llc -mtriple=amdgcn-amd-amdhsa < %s | FileCheck -check-prefix=GCN %s
+
+; FIXME: Emitting unnecessary flat_scratch setup
+
+; GCN-LABEL: {{^}}test_call_undef:
+; GCN: s_mov_b32 s8, s7
+; GCN: s_mov_b32 flat_scratch_lo, s5
+; GCN: s_add_u32 s4, s4, s8
+; GCN: s_lshr_b32
+; GCN: s_endpgm
+define amdgpu_kernel void @test_call_undef() #0 {
+ %val = call i32 undef(i32 1)
+ %op = add i32 %val, 1
+ store volatile i32 %op, i32 addrspace(1)* undef
+ ret void
+}
+
+; GCN-LABEL: {{^}}test_tail_call_undef:
+; GCN: s_waitcnt
+; GCN-NEXT: .Lfunc_end
+define i32 @test_tail_call_undef() #0 {
+ %call = tail call i32 undef(i32 1)
+ ret i32 %call
+}
+
+; GCN-LABEL: {{^}}test_call_null:
+; GCN: s_mov_b32 s8, s7
+; GCN: s_mov_b32 flat_scratch_lo, s5
+; GCN: s_add_u32 s4, s4, s8
+; GCN: s_lshr_b32
+; GCN: s_endpgm
+define amdgpu_kernel void @test_call_null() #0 {
+ %val = call i32 null(i32 1)
+ %op = add i32 %val, 1
+ store volatile i32 %op, i32 addrspace(1)* null
+ ret void
+}
+
+; GCN-LABEL: {{^}}test_tail_call_null:
+; GCN: s_waitcnt
+; GCN-NEXT: .Lfunc_end
+define i32 @test_tail_call_null() #0 {
+ %call = tail call i32 null(i32 1)
+ ret i32 %call
+}
Index: lib/Target/AMDGPU/SIISelLowering.cpp
===================================================================
--- lib/Target/AMDGPU/SIISelLowering.cpp
+++ lib/Target/AMDGPU/SIISelLowering.cpp
@@ -2375,6 +2375,15 @@
bool IsThisReturn = false;
MachineFunction &MF = DAG.getMachineFunction();
+ if (Callee.isUndef() || isNullConstant(Callee)) {
+ if (!CLI.IsTailCall) {
+ for (unsigned I = 0, E = CLI.Ins.size(); I != E; ++I)
+ InVals.push_back(DAG.getUNDEF(CLI.Ins[I].VT));
+ }
+
+ return Chain;
+ }
+
if (IsVarArg) {
return lowerUnhandledCall(CLI, InVals,
"unsupported call to variadic function ");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51794.164433.patch
Type: text/x-patch
Size: 2777 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180907/5d18d289/attachment.bin>
More information about the llvm-commits
mailing list