mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 23:48:56 +00:00
Fixed a test that ensures the LocalRewriter does not attempt to
avoid reloads by reusing clobbered registers. This was causing issues in 256.bzip2 when compiled with PIC for a while (starting at r78217), though the problem has since been masked. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80872 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
03a5f139fb
commit
3f2f3f5341
@ -386,9 +386,16 @@ public:
|
||||
return NumRegs;
|
||||
}
|
||||
|
||||
/// areAliases - Returns true if the two registers alias each other, false
|
||||
/// otherwise
|
||||
bool areAliases(unsigned regA, unsigned regB) const {
|
||||
/// regsOverlap - Returns true if the two registers are equal or alias each
|
||||
/// other. The registers may be virtual register.
|
||||
bool regsOverlap(unsigned regA, unsigned regB) const {
|
||||
if (regA == regB)
|
||||
return true;
|
||||
|
||||
if (isVirtualRegister(regA) || isVirtualRegister(regB))
|
||||
return false;
|
||||
|
||||
// regA and regB are distinct physical registers. Do they alias?
|
||||
size_t index = (regA + regB * 37) & (AliasesHashSize-1);
|
||||
unsigned ProbeAmt = 0;
|
||||
while (AliasesHash[index*2] != 0 &&
|
||||
@ -403,17 +410,6 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
/// regsOverlap - Returns true if the two registers are equal or alias each
|
||||
/// other. The registers may be virtual register.
|
||||
bool regsOverlap(unsigned regA, unsigned regB) const {
|
||||
if (regA == regB)
|
||||
return true;
|
||||
|
||||
if (isVirtualRegister(regA) || isVirtualRegister(regB))
|
||||
return false;
|
||||
return areAliases(regA, regB);
|
||||
}
|
||||
|
||||
/// isSubRegister - Returns true if regB is a sub-register of regA.
|
||||
///
|
||||
bool isSubRegister(unsigned regA, unsigned regB) const {
|
||||
|
@ -269,7 +269,7 @@ PBQP::Matrix* PBQPRegAlloc::buildInterferenceMatrix(
|
||||
unsigned reg2 = *a2Itr;
|
||||
|
||||
// If the row/column regs are identical or alias insert an infinity.
|
||||
if ((reg1 == reg2) || tri->areAliases(reg1, reg2)) {
|
||||
if (tri->regsOverlap(reg1, reg2)) {
|
||||
(*m)[ri][ci] = std::numeric_limits<PBQP::PBQPNum>::infinity();
|
||||
isZeroMatrix = false;
|
||||
}
|
||||
|
@ -797,7 +797,7 @@ unsigned ReuseInfo::GetRegForReload(const TargetRegisterClass *RC,
|
||||
// value aliases the new register. If so, codegen the previous reload
|
||||
// and use this one.
|
||||
unsigned PRRU = Op.PhysRegReused;
|
||||
if (TRI->areAliases(PRRU, PhysReg)) {
|
||||
if (TRI->regsOverlap(PRRU, PhysReg)) {
|
||||
// Okay, we found out that an alias of a reused register
|
||||
// was used. This isn't good because it means we have
|
||||
// to undo a previous reuse.
|
||||
|
Loading…
Reference in New Issue
Block a user