mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +00:00
MachineCSE: Update the heuristics for isProfitableToCSE.
If the result of a common subexpression is used at all uses of the candidate expression, CSE should not increase the live range of the common subexpression. rdar://11393714 and rdar://11819721 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161396 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -324,6 +324,29 @@ bool MachineCSE::isProfitableToCSE(unsigned CSReg, unsigned Reg,
|
||||
MachineInstr *CSMI, MachineInstr *MI) {
|
||||
// FIXME: Heuristics that works around the lack the live range splitting.
|
||||
|
||||
// If CSReg is used at all uses of Reg, CSE should not increase register
|
||||
// pressure of CSReg.
|
||||
bool MayIncreasePressure = true;
|
||||
if (TargetRegisterInfo::isVirtualRegister(CSReg) &&
|
||||
TargetRegisterInfo::isVirtualRegister(Reg)) {
|
||||
MayIncreasePressure = false;
|
||||
SmallPtrSet<MachineInstr*, 8> CSUses;
|
||||
for (MachineRegisterInfo::use_nodbg_iterator I =MRI->use_nodbg_begin(CSReg),
|
||||
E = MRI->use_nodbg_end(); I != E; ++I) {
|
||||
MachineInstr *Use = &*I;
|
||||
CSUses.insert(Use);
|
||||
}
|
||||
for (MachineRegisterInfo::use_nodbg_iterator I = MRI->use_nodbg_begin(Reg),
|
||||
E = MRI->use_nodbg_end(); I != E; ++I) {
|
||||
MachineInstr *Use = &*I;
|
||||
if (!CSUses.count(Use)) {
|
||||
MayIncreasePressure = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!MayIncreasePressure) return true;
|
||||
|
||||
// Heuristics #1: Don't CSE "cheap" computation if the def is not local or in
|
||||
// an immediate predecessor. We don't want to increase register pressure and
|
||||
// end up causing other computation to be spilled.
|
||||
|
Reference in New Issue
Block a user