From df3568d8a9367a51c0368d47392f1bbb1b667603 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 28 Feb 2019 00:40:32 +0000 Subject: [PATCH] AMDGPU: Enable function calls by default Fixes some crashes on illegal call situations which are unfortunately still valid IR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355051 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 13 ++++++--- .../AMDGPU/amdgpu-function-calls-option.ll | 27 +++++++++++++++++++ test/CodeGen/AMDGPU/amdgpu-inline.ll | 4 +-- .../AMDGPU/call-graph-register-usage.ll | 4 +-- .../force-alwaysinline-lds-global-address.ll | 4 +-- test/CodeGen/AMDGPU/inline-calls.ll | 11 ++++---- 6 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 test/CodeGen/AMDGPU/amdgpu-function-calls-option.ll diff --git a/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp index fdca43107ca..92b47ef3936 100644 --- a/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ b/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -122,11 +122,11 @@ static cl::opt LateCFGStructurize( cl::location(AMDGPUTargetMachine::EnableLateStructurizeCFG), cl::Hidden); -static cl::opt EnableAMDGPUFunctionCalls( +static cl::opt EnableAMDGPUFunctionCallsOpt( "amdgpu-function-calls", cl::desc("Enable AMDGPU function call support"), cl::location(AMDGPUTargetMachine::EnableFunctionCalls), - cl::init(false), + cl::init(true), cl::Hidden); // Enable lib calls simplifications @@ -361,11 +361,11 @@ void AMDGPUTargetMachine::adjustPassManager(PassManagerBuilder &Builder) { bool EnableOpt = getOptLevel() > CodeGenOpt::None; bool Internalize = InternalizeSymbols; - bool EarlyInline = EarlyInlineAll && EnableOpt && !EnableAMDGPUFunctionCalls; + bool EarlyInline = EarlyInlineAll && EnableOpt && !EnableFunctionCalls; bool AMDGPUAA = EnableAMDGPUAliasAnalysis && EnableOpt; bool LibCallSimplify = EnableLibCallSimplify && EnableOpt; - if (EnableAMDGPUFunctionCalls) { + if (EnableFunctionCalls) { delete Builder.Inliner; Builder.Inliner = createAMDGPUFunctionInliningPass(); } @@ -426,6 +426,11 @@ R600TargetMachine::R600TargetMachine(const Target &T, const Triple &TT, CodeGenOpt::Level OL, bool JIT) : AMDGPUTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) { setRequiresStructuredCFG(true); + + // Override the default since calls aren't ssupported for r600. + if (EnableFunctionCalls && + EnableAMDGPUFunctionCallsOpt.getNumOccurrences() == 0) + EnableFunctionCalls = false; } const R600Subtarget *R600TargetMachine::getSubtargetImpl( diff --git a/test/CodeGen/AMDGPU/amdgpu-function-calls-option.ll b/test/CodeGen/AMDGPU/amdgpu-function-calls-option.ll new file mode 100644 index 00000000000..df1b401e3ac --- /dev/null +++ b/test/CodeGen/AMDGPU/amdgpu-function-calls-option.ll @@ -0,0 +1,27 @@ +; RUN: llc -mtriple=amdgcn-amd-amdhsa -amdgpu-function-calls < %s | FileCheck -check-prefix=CALLS %s +; RUN: llc -mtriple=amdgcn-amd-amdhsa < %s | FileCheck -check-prefix=CALLS %s +; RUN: llc -mtriple=amdgcn-amd-amdhsa -amdgpu-function-calls=0 < %s | FileCheck -check-prefix=NOCALLS %s +; RUN: llc -mtriple=r600-mesa-mesa3d < %s | FileCheck -check-prefix=NOCALLS %s +; RUN: llc -mtriple=r600-mesa-mesa3d -amdgpu-function-calls=0 < %s | FileCheck -check-prefix=NOCALLS %s + +; CALLS-LABEL: callee: +; CALLS: ;;#ASMSTART +; CALLS: ;;#ASMEND + +; NOCALLS-NOT: callee +; R600-NOT: callee +define internal void @callee() { + call void asm sideeffect "", ""() + ret void +} + +; CALLS-LABEL: kernel: +; CALLS: s_swappc_b64 + +; NOCALLS-LABEL: kernel: +; NOCALLS: ;;#ASMSTART +; NOCALLS: ;;#ASMEND +define amdgpu_kernel void @kernel() { + call void @callee() + ret void +} diff --git a/test/CodeGen/AMDGPU/amdgpu-inline.ll b/test/CodeGen/AMDGPU/amdgpu-inline.ll index 9d81cd54f83..75c16d006ae 100644 --- a/test/CodeGen/AMDGPU/amdgpu-inline.ll +++ b/test/CodeGen/AMDGPU/amdgpu-inline.ll @@ -1,5 +1,5 @@ -; RUN: opt -mtriple=amdgcn--amdhsa -data-layout=A5 -O3 -S -amdgpu-function-calls -inline-threshold=1 < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-INL1 %s -; RUN: opt -mtriple=amdgcn--amdhsa -data-layout=A5 -O3 -S -amdgpu-function-calls < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-INLDEF %s +; RUN: opt -mtriple=amdgcn--amdhsa -data-layout=A5 -O3 -S -inline-threshold=1 < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-INL1 %s +; RUN: opt -mtriple=amdgcn--amdhsa -data-layout=A5 -O3 -S < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-INLDEF %s define coldcc float @foo(float %x, float %y) { entry: diff --git a/test/CodeGen/AMDGPU/call-graph-register-usage.ll b/test/CodeGen/AMDGPU/call-graph-register-usage.ll index c4c30a66755..384d9dd4576 100644 --- a/test/CodeGen/AMDGPU/call-graph-register-usage.ll +++ b/test/CodeGen/AMDGPU/call-graph-register-usage.ll @@ -84,7 +84,7 @@ define void @indirect_use_10_vgpr() #0 { ; GCN-LABEL: {{^}}indirect_2_level_use_10_vgpr: ; GCN: is_dynamic_callstack = 0 -; GCN: ; NumVgprs: 10 +; GCN: ; NumVgprs: 33 define amdgpu_kernel void @indirect_2_level_use_10_vgpr() #0 { call void @indirect_use_10_vgpr() ret void @@ -225,6 +225,6 @@ define amdgpu_kernel void @usage_direct_recursion(i32 %n) #0 { } -attributes #0 = { nounwind norecurse } +attributes #0 = { nounwind noinline norecurse } attributes #1 = { nounwind noinline norecurse } attributes #2 = { nounwind noinline } diff --git a/test/CodeGen/AMDGPU/force-alwaysinline-lds-global-address.ll b/test/CodeGen/AMDGPU/force-alwaysinline-lds-global-address.ll index 84e88067580..f525ca5f803 100644 --- a/test/CodeGen/AMDGPU/force-alwaysinline-lds-global-address.ll +++ b/test/CodeGen/AMDGPU/force-alwaysinline-lds-global-address.ll @@ -1,5 +1,5 @@ -; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -amdgpu-function-calls -amdgpu-always-inline %s | FileCheck -check-prefixes=CALLS-ENABLED,ALL %s -; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -amdgpu-function-calls -amdgpu-stress-function-calls -amdgpu-always-inline %s | FileCheck -check-prefixes=STRESS-CALLS,ALL %s +; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -amdgpu-always-inline %s | FileCheck -check-prefixes=CALLS-ENABLED,ALL %s +; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -amdgpu-stress-function-calls -amdgpu-always-inline %s | FileCheck -check-prefixes=STRESS-CALLS,ALL %s target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5" diff --git a/test/CodeGen/AMDGPU/inline-calls.ll b/test/CodeGen/AMDGPU/inline-calls.ll index 924cd1f11c5..233485a2020 100644 --- a/test/CodeGen/AMDGPU/inline-calls.ll +++ b/test/CodeGen/AMDGPU/inline-calls.ll @@ -2,15 +2,15 @@ ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -march=r600 -mcpu=redwood -verify-machineinstrs < %s | FileCheck %s -; CHECK-NOT: {{^}}func: +; ALL-NOT: {{^}}func: define internal i32 @func(i32 %a) { entry: %tmp0 = add i32 %a, 1 ret i32 %tmp0 } -; CHECK: {{^}}kernel: -; CHECK-NOT: call +; ALL: {{^}}kernel: +; GCN-NOT: s_swappc_b64 define amdgpu_kernel void @kernel(i32 addrspace(1)* %out) { entry: %tmp0 = call i32 @func(i32 1) @@ -19,10 +19,11 @@ entry: } ; CHECK-NOT: func_alias +; ALL-NOT: func_alias @func_alias = alias i32 (i32), i32 (i32)* @func -; CHECK: {{^}}kernel3: -; CHECK-NOT: call +; ALL: {{^}}kernel3: +; GCN-NOT: s_swappc_b64 define amdgpu_kernel void @kernel3(i32 addrspace(1)* %out) { entry: %tmp0 = call i32 @func_alias(i32 1) -- 2.40.0