diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-01-23 23:13:12 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-01-23 23:13:12 +0000 |
| commit | fb5614506e6799f7e0671c094ed85c2ced2005a3 (patch) | |
| tree | 480ba3738949045bb7a16e85ba4c65c689a2e30b /llvm/lib/CodeGen | |
| parent | 90b491f46adef39f2c1383d9a41cf1e7f601cc01 (diff) | |
| download | bcm5719-llvm-fb5614506e6799f7e0671c094ed85c2ced2005a3.tar.gz bcm5719-llvm-fb5614506e6799f7e0671c094ed85c2ced2005a3.zip | |
Simplify/speedup the PEI by not having to scan for uses of the callee saved
registers. This information is computed directly by the register allocator
now.
llvm-svn: 19795
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index 0585d23ee45..109724f9378 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -111,8 +111,6 @@ void PEI::calculateCallerSavedRegisters(MachineFunction &Fn) { FrameSetupOpcode == -1 && FrameDestroyOpcode == -1) return; - // This bitset contains an entry for each physical register for the target... - std::vector<char> ModifiedRegs(RegInfo->getNumRegs()); unsigned MaxCallFrameSize = 0; bool HasCalls = false; @@ -127,19 +125,6 @@ void PEI::calculateCallerSavedRegisters(MachineFunction &Fn) { HasCalls = true; RegInfo->eliminateCallFramePseudoInstr(Fn, *BB, I++); } else { - for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) { - MachineOperand &MO = I->getOperand(i); - if (MO.isRegister() && MO.isDef()) { - assert(MRegisterInfo::isPhysicalRegister(MO.getReg()) && - "Register allocation must be performed!"); - ModifiedRegs[MO.getReg()] = true; // Register is modified - } - - // Mark any implicitly defined registers as being modified. - for (const unsigned *ImpDefs = TII.getImplicitDefs(I->getOpcode()); - *ImpDefs; ++ImpDefs) - ModifiedRegs[*ImpDefs] = true; - } ++I; } @@ -150,14 +135,15 @@ void PEI::calculateCallerSavedRegisters(MachineFunction &Fn) { // Now figure out which *callee saved* registers are modified by the current // function, thus needing to be saved and restored in the prolog/epilog. // + const bool *PhysRegsUsed = Fn.getUsedPhysregs(); for (unsigned i = 0; CSRegs[i]; ++i) { unsigned Reg = CSRegs[i]; - if (ModifiedRegs[Reg]) { - RegsToSave.push_back(Reg); // If modified register... + if (PhysRegsUsed[Reg]) { + RegsToSave.push_back(Reg); // If the reg is modified, save it! } else { for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg); - *AliasSet; ++AliasSet) { // Check alias registers too... - if (ModifiedRegs[*AliasSet]) { + *AliasSet; ++AliasSet) { // Check alias registers too. + if (PhysRegsUsed[*AliasSet]) { RegsToSave.push_back(Reg); break; } |

