[llvm-commits] CVS: llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp

Vikram Adve vadve at cs.uiuc.edu
Tue Aug 12 17:23:02 PDT 2003


Changes in directory llvm/lib/CodeGen/RegAlloc:

PhyRegAlloc.cpp updated: 1.103 -> 1.104

---
Log message:

For instructions in a delay slot of another instruction,
we no longer need to find the live-before set of the delayed
branch since that set is now included the live-before/after
set of the instructions in each delay slot.  Just assert that instead.


---
Diffs of the changes:

Index: llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp
diff -u llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp:1.103 llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp:1.104
--- llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp:1.103	Tue Aug  5 17:11:13 2003
+++ llvm/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp	Tue Aug 12 17:22:24 2003
@@ -24,6 +24,7 @@
 #include "llvm/Type.h"
 #include "llvm/iOther.h"
 #include "Support/STLExtras.h"
+#include "Support/SetOperations.h"
 #include "Support/CommandLine.h"
 #include <math.h>
 using std::cerr;
@@ -747,18 +748,21 @@
   RegClass *RC = LR->getRegClass();
 
   // Get the live-variable set to find registers free before this instr.
-  // If this instr. is in the delay slot of a branch or return, use the live
-  // var set before that branch or return -- we don't want to trample those!
+  const ValueSet &LVSetBef = LVI->getLiveVarSetBeforeMInst(MInst, BB);
+
+#ifndef NDEBUG
+  // If this instr. is in the delay slot of a branch or return, we need to
+  // include all live variables before that branch or return -- we don't want to
+  // trample those!  Verify that the set is included in the LV set before MInst.
   // 
-  MachineInstr *LiveBeforeThisMI = MInst;
   if (MII != MBB.begin()) {
     MachineInstr *PredMI = *(MII-1);
-    if (unsigned DS = TM.getInstrInfo().getNumDelaySlots(PredMI->getOpCode())) {
-      assert(DS == 1 && "Only checking immediate pred. for delay slots!");
-      LiveBeforeThisMI = PredMI;
-    }
+    if (unsigned DS = TM.getInstrInfo().getNumDelaySlots(PredMI->getOpCode()))
+      assert(set_difference(LVI->getLiveVarSetBeforeMInst(PredMI), LVSetBef)
+             .empty() && "Live-var set before branch should be included in "
+             "live-var set of each delay slot instruction!");
   }
-  const ValueSet &LVSetBef = LVI->getLiveVarSetBeforeMInst(LiveBeforeThisMI,BB);
+#endif
 
   MF.getInfo()->pushTempValue(MRI.getSpilledRegSize(RegType) );
   
@@ -1204,13 +1208,13 @@
 void PhyRegAlloc::move2DelayedInstr(const MachineInstr *OrigMI,
                                     const MachineInstr *DelayedMI)
 {
-  if (DEBUG_RA) {
+  // "added after" instructions of the original instr
+  std::vector<MachineInstr *> &OrigAft = AddedInstrMap[OrigMI].InstrnsAfter;
+
+  if (DEBUG_RA && OrigAft.size() > 0) {
     cerr << "\nRegAlloc: Moved InstrnsAfter for: " << *OrigMI;
     cerr << "         to last delay slot instrn: " << *DelayedMI;
   }
-
-  // "added after" instructions of the original instr
-  std::vector<MachineInstr *> &OrigAft = AddedInstrMap[OrigMI].InstrnsAfter;
 
   // "added after" instructions of the delayed instr
   std::vector<MachineInstr *> &DelayedAft=AddedInstrMap[DelayedMI].InstrnsAfter;





More information about the llvm-commits mailing list