mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-30 02:25:19 +00:00
* Cannot safely commute an instruction there are other defs which can reach its uses.
* Ignore copy instructions which have already been coalesced. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47056 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -237,7 +237,9 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(LiveInterval &IntA,
|
|||||||
// AValNo is the value number in A that defines the copy, A3 in the example.
|
// AValNo is the value number in A that defines the copy, A3 in the example.
|
||||||
LiveInterval::iterator ALR = IntA.FindLiveRangeContaining(CopyIdx-1);
|
LiveInterval::iterator ALR = IntA.FindLiveRangeContaining(CopyIdx-1);
|
||||||
VNInfo *AValNo = ALR->valno;
|
VNInfo *AValNo = ALR->valno;
|
||||||
if (AValNo->def == ~0U || AValNo->def == ~1U)
|
// If other defs can reach uses of this def, then it's not safe to perform
|
||||||
|
// the optimization.
|
||||||
|
if (AValNo->def == ~0U || AValNo->def == ~1U || AValNo->hasPHIKill)
|
||||||
return false;
|
return false;
|
||||||
MachineInstr *DefMI = li_->getInstructionFromIndex(AValNo->def);
|
MachineInstr *DefMI = li_->getInstructionFromIndex(AValNo->def);
|
||||||
const TargetInstrDesc &TID = DefMI->getDesc();
|
const TargetInstrDesc &TID = DefMI->getDesc();
|
||||||
@@ -312,6 +314,8 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(LiveInterval &IntA,
|
|||||||
MachineOperand &UseMO = UI.getOperand();
|
MachineOperand &UseMO = UI.getOperand();
|
||||||
++UI;
|
++UI;
|
||||||
MachineInstr *UseMI = UseMO.getParent();
|
MachineInstr *UseMI = UseMO.getParent();
|
||||||
|
if (JoinedCopies.count(UseMI))
|
||||||
|
continue;
|
||||||
unsigned UseIdx = li_->getInstructionIndex(UseMI);
|
unsigned UseIdx = li_->getInstructionIndex(UseMI);
|
||||||
LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
|
LiveInterval::iterator ULR = IntA.FindLiveRangeContaining(UseIdx);
|
||||||
if (ULR->valno != AValNo)
|
if (ULR->valno != AValNo)
|
||||||
|
Reference in New Issue
Block a user