[llvm] r375356 - AMDGPU: Don't error on calls to null or undef
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 20 00:46:04 PDT 2019
Author: arsenm
Date: Sun Oct 20 00:46:04 2019
New Revision: 375356
URL: http://llvm.org/viewvc/llvm-project?rev=375356&view=rev
Log:
AMDGPU: Don't error on calls to null or undef
Calls to constants should probably be generally handled.
Added:
llvm/trunk/test/CodeGen/AMDGPU/call-constant.ll
Modified:
llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp
llvm/trunk/test/CodeGen/AMDGPU/unsupported-calls.ll
Modified: llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp?rev=375356&r1=375355&r2=375356&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp Sun Oct 20 00:46:04 2019
@@ -2688,6 +2688,15 @@ SDValue SITargetLowering::LowerCall(Call
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 ");
Added: llvm/trunk/test/CodeGen/AMDGPU/call-constant.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/call-constant.ll?rev=375356&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/call-constant.ll (added)
+++ llvm/trunk/test/CodeGen/AMDGPU/call-constant.ll Sun Oct 20 00:46:04 2019
@@ -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
+}
Modified: llvm/trunk/test/CodeGen/AMDGPU/unsupported-calls.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/unsupported-calls.ll?rev=375356&r1=375355&r2=375356&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/unsupported-calls.ll (original)
+++ llvm/trunk/test/CodeGen/AMDGPU/unsupported-calls.ll Sun Oct 20 00:46:04 2019
@@ -74,3 +74,13 @@ define amdgpu_ps i32 @test_call_from_sha
%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
+}
More information about the llvm-commits
mailing list