Fix some kill info update bugs; add hidden option -disable-rematerialization to turn...
authorEvan Cheng <evan.cheng@apple.com>
Thu, 16 Aug 2007 07:24:22 +0000 (07:24 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 16 Aug 2007 07:24:22 +0000 (07:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41118 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveIntervalAnalysis.cpp
lib/CodeGen/SimpleRegisterCoalescing.cpp

index bd8137730b299cdc5a168767972384f6c4636583..b2121c937d75a9961a9a613aab8dca5bf401c1f1 100644 (file)
 #include <cmath>
 using namespace llvm;
 
+namespace {
+  // Hidden options for help debugging.
+  cl::opt<bool> DisableReMat("disable-rematerialization", 
+                              cl::init(false), cl::Hidden);
+}
+
 STATISTIC(numIntervals, "Number of original intervals");
 STATISTIC(numIntervalsAfter, "Number of intervals after coalescing");
 STATISTIC(numFolded   , "Number of loads/stores folded into instructions");
@@ -201,6 +207,9 @@ static bool isReDefinedByTwoAddr(MachineInstr *MI, unsigned Reg,
 /// val# of the specified interval is re-materializable.
 bool LiveIntervals::isReMaterializable(const LiveInterval &li, unsigned ValNum,
                                        MachineInstr *MI) {
+  if (DisableReMat)
+    return false;
+
   if (tii_->isTriviallyReMaterializable(MI))
     return true;
 
@@ -610,7 +619,7 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
         DOUT << " Removing [" << Start << "," << End << "] from: ";
         interval.print(DOUT, mri_); DOUT << "\n";
         interval.removeRange(Start, End);
-        interval.addKillForValNum(0, Start-1); // odd # means phi node
+        interval.addKillForValNum(0, Start+1); // odd # means phi node
         DOUT << " RESULT: "; interval.print(DOUT, mri_);
 
         // Replace the interval with one of a NEW value number.  Note that this
index 93fb350e84d553a8cb96c5a9bc0f426817407420..276a5092f628c09962c1b75d8a2c8ebb7042a857 100644 (file)
@@ -683,6 +683,8 @@ bool SimpleRegisterCoalescing::JoinIntervals(LiveInterval &LHS, LiveInterval &RH
     RHSValNoAssignments[0] = RHSValID;
     if (RHSVal0DefinedFromLHS != -1) {
       int LHSValId = LHSValNoAssignments[RHSVal0DefinedFromLHS];
+      unsigned DefIdx = RHS.getDefForValNum(0);
+      LiveInterval::removeKill(ValueNumberInfo[LHSValId], DefIdx);
       LHS.addKills(ValueNumberInfo[LHSValId], RHS.getKillsForValNum(0));
     }
   } else {
@@ -797,6 +799,8 @@ bool SimpleRegisterCoalescing::JoinIntervals(LiveInterval &LHS, LiveInterval &RH
     if (LHSValId == -1)
       continue;
     unsigned RHSValId = RHSValNoAssignments[i];
+    unsigned DefIdx = RHS.getDefForValNum(i);
+    LiveInterval::removeKill(ValueNumberInfo[RHSValId], DefIdx);
     LHS.addKills(ValueNumberInfo[RHSValId], RHS.getKillsForValNum(i));
   }
   for (unsigned i = 0, e = LHSValsDefinedFromRHS.size(); i != e; ++i) {
@@ -804,6 +808,8 @@ bool SimpleRegisterCoalescing::JoinIntervals(LiveInterval &LHS, LiveInterval &RH
     if (RHSValId == -1)
       continue;
     unsigned LHSValId = LHSValNoAssignments[i];
+    unsigned DefIdx = LHS.getDefForValNum(i);
+    LiveInterval::removeKill(ValueNumberInfo[LHSValId], DefIdx);
     RHS.addKills(ValueNumberInfo[LHSValId], LHS.getKillsForValNum(i));
   }