R600: Schedule copy from phys register at beginning of block
authorVincent Lejeune <vljn@ovi.com>
Wed, 5 Jun 2013 20:27:35 +0000 (20:27 +0000)
committerVincent Lejeune <vljn@ovi.com>
Wed, 5 Jun 2013 20:27:35 +0000 (20:27 +0000)
It allows regalloc pass to remove them by trivially assigning associated reg

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

12 files changed:
lib/Target/R600/R600MachineScheduler.cpp
lib/Target/R600/R600MachineScheduler.h
test/CodeGen/R600/fabs.ll
test/CodeGen/R600/fadd.ll
test/CodeGen/R600/floor.ll
test/CodeGen/R600/fmad.ll
test/CodeGen/R600/fmax.ll
test/CodeGen/R600/fmin.ll
test/CodeGen/R600/fmul.ll
test/CodeGen/R600/fsub.ll
test/CodeGen/R600/llvm.AMDGPU.mul.ll
test/CodeGen/R600/llvm.pow.ll

index 9469e0fc6b338d85f1667a3ba51f8c5346888d5d..8524fe3c250913a725fc72acbb75ac8002e969ff 100644 (file)
@@ -71,6 +71,10 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) {
       (!AllowSwitchFromAlu && CurInstKind == IDAlu))) {
     // try to pick ALU
     SU = pickAlu();
+    if (!SU && !PhysicalRegCopy.empty()) {
+      SU = PhysicalRegCopy.front();
+      PhysicalRegCopy.erase(PhysicalRegCopy.begin());
+    }
     if (SU) {
       if (CurEmitted >= InstKindLimit[IDAlu])
         CurEmitted = 0;
@@ -118,7 +122,22 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) {
   return SU;
 }
 
+bool IsUnScheduled(const SUnit *SU) {
+  return SU->isScheduled;
+}
+
+static
+void Filter(std::vector<SUnit *> &List) {
+  List.erase(std::remove_if(List.begin(), List.end(), IsUnScheduled), List.end());
+}
+
 void R600SchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
+  if (IsTopNode) {
+    for (unsigned i = 0; i < AluLast; i++) {
+      Filter(Available[i]);
+      Filter(Pending[i]);
+    }
+  }
 
   if (NextInstKind != CurInstKind) {
     DEBUG(dbgs() << "Instruction Type Switch\n");
@@ -157,13 +176,24 @@ void R600SchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
   }
 }
 
+static bool
+isPhysicalRegCopy(MachineInstr *MI) {
+  if (MI->getOpcode() != AMDGPU::COPY)
+    return false;
+
+  return !TargetRegisterInfo::isVirtualRegister(MI->getOperand(1).getReg());
+}
+
 void R600SchedStrategy::releaseTopNode(SUnit *SU) {
   DEBUG(dbgs() << "Top Releasing ";SU->dump(DAG););
-
 }
 
 void R600SchedStrategy::releaseBottomNode(SUnit *SU) {
   DEBUG(dbgs() << "Bottom Releasing ";SU->dump(DAG););
+  if (isPhysicalRegCopy(SU->getInstr())) {
+    PhysicalRegCopy.push_back(SU);
+    return;
+  }
 
   int IK = getInstKind(SU);
 
index 4dedf70d5f75764000c4770d7b105cd9360b27a4..c5024d249200da3195dd71f8e34a1422f7bbbbc1 100644 (file)
@@ -54,6 +54,7 @@ class R600SchedStrategy : public MachineSchedStrategy {
   std::vector<SUnit *> AvailableAlus[AluLast];
   std::vector<SUnit *> UnscheduledARDefs;
   std::vector<SUnit *> UnscheduledARUses;
+  std::vector<SUnit *> PhysicalRegCopy;
 
   InstKind CurInstKind;
   int CurEmitted;
index b876c0e8d5e266a9c2496e7698b56ab17ecbbe6e..85f2882289fa5d76667501a7c924222cf1975d1e 100644 (file)
@@ -1,6 +1,6 @@
 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
-;CHECK: MOV * T{{[0-9]+\.[XYZW], \|PV\.[XYZW]\|}}
+;CHECK: MOV * T{{[0-9]+\.[XYZW], \|T[0-9]+\.[XYZW]\|}}
 
 define void @test() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index bec5043168d6e24c1dc3b9b578508f58604bc99b..9a672329e75ce33e557864152539726958998c90 100644 (file)
@@ -1,7 +1,7 @@
 ; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
 ; CHECK: @fadd_f32
-; CHECK: ADD * T{{[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
+; CHECK: ADD * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 
 define void @fadd_f32() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index 7b8aa0af2bfff86b25f54d57b3335209981c812a..877d69a65b43405caa9dfd5788ed511d048ce864 100644 (file)
@@ -1,6 +1,6 @@
 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
-;CHECK: FLOOR * T{{[0-9]+\.[XYZW], PV\.[XYZW]}}
+;CHECK: FLOOR * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 
 define void @test() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index eb82b44a1d214a69a611cc31a9551bd28ccbe0d4..75e65d8133a96251ba8c7dede013838431e484cb 100644 (file)
@@ -1,6 +1,6 @@
 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
-;CHECK: MULADD_IEEE * {{T[0-9]+\.[XYZW], PV\.[XYZW], PV.[XYZW], PV\.[XYZW]}}
+;CHECK: MULADD_IEEE * {{T[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 
 define void @test() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index 9357287b743e499e897b7247a44aca2778db2fb4..8b704e56484b1c942cf92c1e32b644c96619c3ae 100644 (file)
@@ -1,6 +1,6 @@
 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
-;CHECK: MAX * T{{[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
+;CHECK: MAX * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 
 define void @test() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index e38269c3a457b419840f00dacd1867e6e2185095..5e34b7c8902eb42cc26fa380bbbce11f8a9f6949 100644 (file)
@@ -1,6 +1,6 @@
 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
-;CHECK: MIN * T{{[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
+;CHECK: MIN * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 
 define void @test() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index fee5eadfdd241da32ac1155c3b9f5c0b53ee6431..a40e818c12ce502fe4d469c3ef1239abbb8d28a4 100644 (file)
@@ -1,7 +1,7 @@
 ; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
 ; CHECK: @fmul_f32
-; CHECK: MUL_IEEE * {{T[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
+; CHECK: MUL_IEEE * {{T[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 
 define void @fmul_f32() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index 2c88cbc1aa8b20910fe098e2a05d03e23d5ed358..f784cde46cd249657a8ef7060390c4a87061abb4 100644 (file)
@@ -1,7 +1,7 @@
 ; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
 ; CHECK: @fsub_f32
-; CHECK: ADD * T{{[0-9]+\.[XYZW], PV\.[XYZW], -PV\.[XYZW]}}
+; CHECK: ADD * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], -T[0-9]+\.[XYZW]}}
 
 define void @fsub_f32() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index be14e6f712d4b01c82fd26bbe6dc7faca312fc77..cc0732b3fffd3a8d2906bacc111999699eb5a267 100644 (file)
@@ -1,6 +1,6 @@
 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
-;CHECK: MUL NON-IEEE * T{{[0-9]+\.[XYZW], PV\.[XYZW], PV\.[XYZW]}}
+;CHECK: MUL NON-IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 
 define void @test() {
    %r0 = call float @llvm.R600.load.input(i32 0)
index 532983f8265bd12883fab66ce4510f0146d90c9f..142208370483e64acf1a61faaeaadb68245c1ad0 100644 (file)
@@ -1,7 +1,7 @@
 ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
 
 ;CHECK: LOG_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
-;CHECK: MUL NON-IEEE * T{{[0-9]+\.[XYZW], PV\.[XYZW], T[0-9]+\.[XYZW]}}
+;CHECK: MUL NON-IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 ;CHECK-NEXT: EXP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
 
 define void @test() {