|
@@ -110,6 +110,10 @@ class TwoAddressInstructionPass : public MachineFunctionPass {
|
|
|
// Set of already processed instructions in the current block.
|
|
|
SmallPtrSet<MachineInstr*, 8> Processed;
|
|
|
|
|
|
+ // Set of instructions converted to three-address by target and then sunk
|
|
|
+ // down current basic block.
|
|
|
+ SmallPtrSet<MachineInstr*, 8> SunkInstrs;
|
|
|
+
|
|
|
// A map from virtual registers to physical registers which are likely targets
|
|
|
// to be coalesced to due to copies from physical registers to virtual
|
|
|
// registers. e.g. v1024 = move r0.
|
|
@@ -756,6 +760,8 @@ TwoAddressInstructionPass::convertInstTo3Addr(MachineBasicBlock::iterator &mi,
|
|
|
mi = NewMI;
|
|
|
nmi = std::next(mi);
|
|
|
}
|
|
|
+ else
|
|
|
+ SunkInstrs.insert(NewMI);
|
|
|
|
|
|
// Update source and destination register maps.
|
|
|
SrcRegMap.erase(RegA);
|
|
@@ -1674,10 +1680,13 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &Func) {
|
|
|
SrcRegMap.clear();
|
|
|
DstRegMap.clear();
|
|
|
Processed.clear();
|
|
|
+ SunkInstrs.clear();
|
|
|
for (MachineBasicBlock::iterator mi = MBB->begin(), me = MBB->end();
|
|
|
mi != me; ) {
|
|
|
MachineBasicBlock::iterator nmi = std::next(mi);
|
|
|
- if (mi->isDebugValue()) {
|
|
|
+ // Don't revisit an instruction previously converted by target. It may
|
|
|
+ // contain undef register operands (%noreg), which are not handled.
|
|
|
+ if (mi->isDebugValue() || SunkInstrs.count(&*mi)) {
|
|
|
mi = nmi;
|
|
|
continue;
|
|
|
}
|