]> granicus.if.org Git - llvm/commitdiff
[AMDGPU] Fix for SIMachineScheduler crash. SI Scheduler should track
authorAlexander Timofeev <Alexander.Timofeev@amd.com>
Tue, 7 Feb 2017 17:57:48 +0000 (17:57 +0000)
committerAlexander Timofeev <Alexander.Timofeev@amd.com>
Tue, 7 Feb 2017 17:57:48 +0000 (17:57 +0000)
         lane masks.

 Differential revision: https://reviews.llvm.org/D29442

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294324 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AMDGPU/AMDGPUSubtarget.cpp
lib/Target/AMDGPU/SIMachineScheduler.h
test/CodeGen/AMDGPU/si-shed-track-subregs.ll [new file with mode: 0644]

index c413f574cd4dc9a0cbd4336a5d038ed2ddcd50f2..53417fc6d764bbda7b3de637725f85ed076e3d26 100644 (file)
@@ -260,9 +260,7 @@ void SISubtarget::overrideSchedPolicy(MachineSchedPolicy &Policy,
   Policy.OnlyTopDown = false;
   Policy.OnlyBottomUp = false;
 
-  // Enabling ShouldTrackLaneMasks crashes the SI Machine Scheduler.
-  if (!enableSIScheduler())
-    Policy.ShouldTrackLaneMasks = true;
+  Policy.ShouldTrackLaneMasks = enableSubRegLiveness();
 }
 
 bool SISubtarget::isVGPRSpillingEnabled(const Function& F) const {
index 2dc4b346de7921ab8760f1c8cfa8fd67d8774842..02cfa509d3d1b980e9b1266bd9ef2d9927a3fc12 100644 (file)
@@ -440,7 +440,8 @@ public:
 
   // To init Block's RPTracker.
   void initRPTracker(RegPressureTracker &RPTracker) {
-    RPTracker.init(&MF, RegClassInfo, LIS, BB, RegionBegin, false, false);
+    RPTracker.init(&MF, RegClassInfo, LIS, BB, RegionBegin,
+     MF.getSubtarget().enableSubRegLiveness(), false);
   }
 
   MachineBasicBlock *getBB() { return BB; }
diff --git a/test/CodeGen/AMDGPU/si-shed-track-subregs.ll b/test/CodeGen/AMDGPU/si-shed-track-subregs.ll
new file mode 100644 (file)
index 0000000..0b65a0b
--- /dev/null
@@ -0,0 +1,49 @@
+; This test does not check anything. Just ensure no crash.
+; RUN: llc -O2 -mtriple amdgcn--amdhsa --misched=si -mattr=si-scheduler -mcpu=fiji -filetype=asm < %s
+
+declare i32 @llvm.amdgcn.workitem.id.x() #4
+
+declare i32 @llvm.amdgcn.workitem.id.y() #4
+
+define amdgpu_kernel void @"test"(float addrspace(1)* nocapture,
+ [4 x [4 x float]] addrspace(3) *,
+ [4 x [4 x float]] addrspace(3) *,
+ [4 x [4 x float]] addrspace(3) *,
+ [4 x [4 x float]] addrspace(3) *
+) {
+
+  %st_addr = getelementptr float, float addrspace(1)* %0, i64 10
+  %id_x = tail call i32 @llvm.amdgcn.workitem.id.x() #4
+  %id_y = tail call i32 @llvm.amdgcn.workitem.id.y() #4
+
+  %6  = getelementptr [4 x [4 x float]], [4 x [4 x float]] addrspace(3)* %1, i32 0, i32 %id_y, i32 1234
+  %7  = getelementptr [4 x [4 x float]], [4 x [4 x float]] addrspace(3)* %2, i32 0, i32 0, i32 %id_x
+  %8  = getelementptr [4 x [4 x float]], [4 x [4 x float]] addrspace(3)* %3, i32 0, i32 %id_y, i32 0
+  %9  = getelementptr [4 x [4 x float]], [4 x [4 x float]] addrspace(3)* %4, i32 0, i32 0, i32 %id_x
+  %10 = getelementptr [4 x [4 x float]], [4 x [4 x float]] addrspace(3)* %1, i32 0, i32 %id_y, i32 1294
+  %11 = getelementptr [4 x [4 x float]], [4 x [4 x float]] addrspace(3)* %2, i32 0, i32 1, i32 %id_x
+  %12 = getelementptr [4 x [4 x float]], [4 x [4 x float]] addrspace(3)* %3, i32 0, i32 %id_y, i32 1
+  %13 = getelementptr [4 x [4 x float]], [4 x [4 x float]] addrspace(3)* %4, i32 0, i32 1, i32 %id_x
+
+
+  %14 = load float, float addrspace(3)* %6
+  %15 = load float, float addrspace(3)* %7
+  %mul3 = fmul float %14, %15
+  %add1 = fadd float 2.0, %mul3
+  %16 = load float, float addrspace(3)* %8
+  %17 = load float, float addrspace(3)* %9
+  %mul4 = fmul float %16, %17
+  %sub2 = fsub float %add1, %mul4
+  %18 = load float, float addrspace(3)* %10
+  %19 = load float, float addrspace(3)* %11
+  %mul5 = fmul float %18, %19
+  %sub3 = fsub float %sub2, %mul5
+  %20 = load float, float addrspace(3)* %12
+  %21 = load float, float addrspace(3)* %13
+  %mul6 = fmul float %20, %21
+  %sub4 = fsub float %sub3, %mul6
+  store float %sub4, float addrspace(1)* %st_addr
+  ret void
+}
+
+attributes #4 = { nounwind readnone }