summaryrefslogtreecommitdiff
path: root/lib/CodeGen/VirtRegMap.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-09-30 02:33:48 +0000
committerChris Lattner <sabre@nondot.org>2004-09-30 02:33:48 +0000
commit4ea1b828ebc5d2e8711acf13c2a3fdd7c14fe339 (patch)
tree4d73d363dfba510c39fd59bec8eb74a71b9f2d42 /lib/CodeGen/VirtRegMap.cpp
parent7f690e625807b9320bf4ae437b8f35258acc99de (diff)
downloadllvm-4ea1b828ebc5d2e8711acf13c2a3fdd7c14fe339.tar.gz
llvm-4ea1b828ebc5d2e8711acf13c2a3fdd7c14fe339.tar.bz2
llvm-4ea1b828ebc5d2e8711acf13c2a3fdd7c14fe339.tar.xz
Don't use a densemap for keeping track of which vregs are already loaded, just
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
Diffstat (limited to 'lib/CodeGen/VirtRegMap.cpp')
-rw-r--r--lib/CodeGen/VirtRegMap.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp
index f6434989a1..c8847bde89 100644
--- a/lib/CodeGen/VirtRegMap.cpp
+++ b/lib/CodeGen/VirtRegMap.cpp
@@ -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;