Index: lib/Target/AMDGPU/SIISelLowering.cpp =================================================================== --- lib/Target/AMDGPU/SIISelLowering.cpp +++ lib/Target/AMDGPU/SIISelLowering.cpp @@ -2688,6 +2688,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 "); 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: 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: :0:0: in function test_call_absolute void (): unsupported indirect call to function +; R600: error: :0:0: in function test_call_absolute void (): unsupported call to function +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 +}