diff options
Diffstat (limited to 'lib/CodeGen/Spiller.h')
-rw-r--r-- | lib/CodeGen/Spiller.h | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/CodeGen/Spiller.h b/lib/CodeGen/Spiller.h index e85922ec39..5a42a8279d 100644 --- a/lib/CodeGen/Spiller.h +++ b/lib/CodeGen/Spiller.h @@ -127,15 +127,31 @@ namespace llvm { DOUT << " in physreg " << TRI->getName(Reg) << "\n"; } - /// canClobberPhysReg - Return true if the spiller is allowed to change the - /// value of the specified stackslot register if it desires. The specified - /// stack slot must be available in a physreg for this query to make sense. - bool canClobberPhysReg(int SlotOrReMat) const { + /// canClobberPhysRegForSS - Return true if the spiller is allowed to change + /// the value of the specified stackslot register if it desires. The + /// specified stack slot must be available in a physreg for this query to + /// make sense. + bool canClobberPhysRegForSS(int SlotOrReMat) const { assert(SpillSlotsOrReMatsAvailable.count(SlotOrReMat) && "Value not available!"); return SpillSlotsOrReMatsAvailable.find(SlotOrReMat)->second & 1; } + /// canClobberPhysReg - Return true if the spiller is allowed to clobber the + /// physical register where values for some stack slot(s) might be + /// available. + bool canClobberPhysReg(unsigned PhysReg) const { + std::multimap<unsigned, int>::const_iterator I = + PhysRegsAvailable.lower_bound(PhysReg); + while (I != PhysRegsAvailable.end() && I->first == PhysReg) { + int SlotOrReMat = I->second; + I++; + if (!canClobberPhysRegForSS(SlotOrReMat)) + return false; + } + return true; + } + /// disallowClobberPhysReg - Unset the CanClobber bit of the specified /// stackslot register. The register is still available but is no longer /// allowed to be modifed. @@ -305,4 +321,4 @@ namespace llvm { }; } -#endif
\ No newline at end of file +#endif |