Revert "RegisterPressure: allocatable physreg uses are always kills"
authorMatthias Braun <matze@braunis.de>
Mon, 19 Oct 2015 17:44:22 +0000 (17:44 +0000)
committerMatthias Braun <matze@braunis.de>
Mon, 19 Oct 2015 17:44:22 +0000 (17:44 +0000)
This reverts commit r250596.

Reverted for now as the commit triggers assert in the AMDGPU target
pending investigation.

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

include/llvm/CodeGen/RegisterPressure.h
lib/CodeGen/RegisterPressure.cpp

index 67ae00762b24422b94a04b09b394cd5c9f9122ab..166bd86868914db5c1a205cacc553eb138714e07 100644 (file)
@@ -444,8 +444,6 @@ public:
 protected:
   const LiveRange *getLiveRange(unsigned Reg) const;
 
-  bool isLastUse(unsigned VRegOrUnit, SlotIndex Pos) const;
-
   void increaseRegPressure(ArrayRef<unsigned> Regs);
   void decreaseRegPressure(ArrayRef<unsigned> Regs);
 
index 2ef23c7541dee591d5fb81ca28b15bd625b8dd0f..ba0a9158b46c192bfa56ae2d1a630cc7b709199d 100644 (file)
@@ -568,17 +568,6 @@ bool RegPressureTracker::recede(SmallVectorImpl<unsigned> *LiveUses,
   return true;
 }
 
-bool RegPressureTracker::isLastUse(unsigned VRegOrUnit, SlotIndex Pos) const {
-  // Allocatable physregs are always single-use before register rewriting.
-  if (!TargetRegisterInfo::isVirtualRegister(VRegOrUnit))
-    return true;
-  // Without liveness information we conservatively assume "no last use".
-  if (!RequireIntervals)
-    return false;
-  const LiveRange *LR = getLiveRange(VRegOrUnit);
-  return LR && LR->Query(Pos).isKill();
-}
-
 /// Advance across the current instruction.
 bool RegPressureTracker::advance() {
   assert(!TrackUntiedDefs && "unsupported mode");
@@ -613,15 +602,21 @@ bool RegPressureTracker::advance() {
     if (!isLive)
       discoverLiveIn(Reg);
     // Kill liveness at last uses.
-    if (isLastUse(Reg, SlotIdx)) {
-      if (isLive) {
-        LiveRegs.erase(Reg);
-        decreaseRegPressure(Reg);
-      }
-    } else if(!isLive) {
-      // We discovered a live which was not last used here, adjust pressure.
-      increaseRegPressure(Reg);
+    bool lastUse = false;
+    if (RequireIntervals) {
+      const LiveRange *LR = getLiveRange(Reg);
+      lastUse = LR && LR->Query(SlotIdx).isKill();
+    }
+    else {
+      // Allocatable physregs are always single-use before register rewriting.
+      lastUse = !TargetRegisterInfo::isVirtualRegister(Reg);
+    }
+    if (lastUse && isLive) {
+      LiveRegs.erase(Reg);
+      decreaseRegPressure(Reg);
     }
+    else if (!lastUse && !isLive)
+      increaseRegPressure(Reg);
   }
 
   // Generate liveness for defs.
@@ -936,18 +931,21 @@ void RegPressureTracker::bumpDownwardPressure(const MachineInstr *MI) {
 
   for (unsigned i = 0, e = RegOpers.Uses.size(); i < e; ++i) {
     unsigned Reg = RegOpers.Uses[i];
-    bool IsLastUse = isLastUse(Reg, SlotIdx);
-    // We had a last use at MIs position. To know the situation for the current
-    // position we have to check if there exist other uses in between.
-    if (IsLastUse && TargetRegisterInfo::isVirtualRegister(Reg)) {
-      SlotIndex CurrIdx = getCurrSlot();
+    if (RequireIntervals) {
       // FIXME: allow the caller to pass in the list of vreg uses that remain
       // to be bottom-scheduled to avoid searching uses at each query.
-      if (findUseBetween(Reg, CurrIdx, SlotIdx, *MRI, LIS))
-        IsLastUse = false;
+      SlotIndex CurrIdx = getCurrSlot();
+      const LiveRange *LR = getLiveRange(Reg);
+      if (LR) {
+        LiveQueryResult LRQ = LR->Query(SlotIdx);
+        if (LRQ.isKill() && !findUseBetween(Reg, CurrIdx, SlotIdx, *MRI, LIS))
+          decreaseRegPressure(Reg);
+      }
     }
-    if (IsLastUse)
+    else if (!TargetRegisterInfo::isVirtualRegister(Reg)) {
+      // Allocatable physregs are always single-use before register rewriting.
       decreaseRegPressure(Reg);
+    }
   }
 
   // Generate liveness for defs.