Don't use a densemap for keeping track of which vregs are already loaded, just
authorChris Lattner <sabre@nondot.org>
Thu, 30 Sep 2004 02:33:48 +0000 (02:33 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 30 Sep 2004 02:33:48 +0000 (02:33 +0000)
use a simple vector.  This speeds up -spiller=simple from taking 22s to taking
.1s on povray (debug build).  This change does not modify the generated code.

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

lib/CodeGen/VirtRegMap.cpp

index f6434989a19be640faf310c1efd9f8ff6385e5ee..c8847bde892fe8ad7f143267b88524173366a113 100644 (file)
@@ -133,25 +133,29 @@ bool SimpleSpiller::runOnMachineFunction(MachineFunction& MF,
   const TargetMachine& TM = MF.getTarget();
   const MRegisterInfo& MRI = *TM.getRegisterInfo();
 
-  DenseMap<bool, VirtReg2IndexFunctor> Loaded;
+  // LoadedRegs - Keep track of which vregs are loaded, so that we only load
+  // each vreg once (in the case where a spilled vreg is used by multiple
+  // operands).  This is always smaller than the number of operands to the
+  // current machine instr, so it should be small.
+  std::vector<unsigned> LoadedRegs;
 
   for (MachineFunction::iterator mbbi = MF.begin(), E = MF.end();
        mbbi != E; ++mbbi) {
     DEBUG(std::cerr << mbbi->getBasicBlock()->getName() << ":\n");
     for (MachineBasicBlock::iterator mii = mbbi->begin(),
            mie = mbbi->end(); mii != mie; ++mii) {
-      Loaded.grow(MF.getSSARegMap()->getLastVirtReg());
-      for (unsigned i = 0,e = mii->getNumOperands(); i != e; ++i){
+      for (unsigned i = 0, e = mii->getNumOperands(); i != e; ++i) {
         MachineOperand& mop = mii->getOperand(i);
         if (mop.isRegister() && mop.getReg() &&
             MRegisterInfo::isVirtualRegister(mop.getReg())) {
           unsigned virtReg = mop.getReg();
           unsigned physReg = VRM.getPhys(virtReg);
           if (mop.isUse() && VRM.hasStackSlot(mop.getReg()) &&
-              !Loaded[virtReg]) {
+              std::find(LoadedRegs.begin(), LoadedRegs.end(),
+                        virtReg) == LoadedRegs.end()) {
             MRI.loadRegFromStackSlot(*mbbi, mii, physReg,
                                      VRM.getStackSlot(virtReg));
-            Loaded[virtReg] = true;
+            LoadedRegs.push_back(virtReg);
             DEBUG(std::cerr << '\t';
                   prior(mii)->print(std::cerr, &TM));
             ++NumLoads;
@@ -166,7 +170,7 @@ bool SimpleSpiller::runOnMachineFunction(MachineFunction& MF,
         }
       }
       DEBUG(std::cerr << '\t'; mii->print(std::cerr, &TM));
-      Loaded.clear();
+      LoadedRegs.clear();
     }
   }
   return true;