]> granicus.if.org Git - llvm/commitdiff
AMDGPU: Enable function calls by default
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 28 Feb 2019 00:40:32 +0000 (00:40 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 28 Feb 2019 00:40:32 +0000 (00:40 +0000)
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
test/CodeGen/AMDGPU/amdgpu-function-calls-option.ll [new file with mode: 0644]
test/CodeGen/AMDGPU/amdgpu-inline.ll
test/CodeGen/AMDGPU/call-graph-register-usage.ll
test/CodeGen/AMDGPU/force-alwaysinline-lds-global-address.ll
test/CodeGen/AMDGPU/inline-calls.ll

index fdca43107ca4201546b4eeb7285a8ee82af8132e..92b47ef39368a94878af0b414b459647fedd1b35 100644 (file)
@@ -122,11 +122,11 @@ static cl::opt<bool, true> LateCFGStructurize(
   cl::location(AMDGPUTargetMachine::EnableLateStructurizeCFG),
   cl::Hidden);
 
-static cl::opt<bool, true> EnableAMDGPUFunctionCalls(
+static cl::opt<bool, true> 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 (file)
index 0000000..df1b401
--- /dev/null
@@ -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
+}
index 9d81cd54f833c386b0ceca8ae248b7d58754bc84..75c16d006ae4c4774e54a57a1b3ea7f6486a39ea 100644 (file)
@@ -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:
index c4c30a6675518d1eadcde687a562238ef13d931e..384d9dd457663ec1f113715d3497d73804d07b12 100644 (file)
@@ -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 }
index 84e880675804073a572a9743686918fd257d96f8..f525ca5f8036b2bc5347154a043fbcd5574354d8 100644 (file)
@@ -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"
 
index 924cd1f11c50c07c7a1fd5069f5d55257d992292..233485a2020572611f80c85584cf1462284922da 100644 (file)
@@ -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)