// Process all of the spilled uses and all non spilled reg references.
for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
MachineOperand &MO = MI.getOperand(i);
+
if (!MO.isRegister() || MO.getReg() == 0)
continue; // Ignore non-register operands.
}
if (!OpTakenCareOf) {
- // Check to see if this is a noop copy. If so, eliminate the
- // instruction before considering the dest reg to be changed.
unsigned Src, Dst;
- if (TII->isMoveInstr(MI, Src, Dst) && Src == Dst) {
- ++NumDCE;
- DEBUG(std::cerr << "Removing now-noop copy: " << MI);
- MBB.erase(&MI);
- VRM.RemoveFromFoldedVirtMap(&MI);
- goto ProcessNextInst;
+ if (TII->isMoveInstr(MI, Src, Dst)) {
+ if (Src == Dst) {
+ // Check to see if this is a noop copy. If so, eliminate
+ // the instruction before considering the dest reg to be
+ // changed.
+ ++NumDCE;
+ DEBUG(std::cerr << "Removing now-noop copy: " << MI);
+ MBB.erase(&MI);
+ VRM.RemoveFromFoldedVirtMap(&MI);
+ goto ProcessNextInst;
+ } else if (MII != MBB.begin()) {
+ // Check to see if this is a sequence of the form:
+ // mov R0, R1
+ // mov R1, R0
+ // Eliminate the second move if so.
+ MachineBasicBlock::iterator PrevMII = MII; --PrevMII;
+ MachineInstr& PrevMI = *PrevMII;
+ unsigned PrevSrc, PrevDst;
+
+ if (TII->isMoveInstr(PrevMI, PrevSrc, PrevDst))
+ if (PrevSrc == Dst && PrevDst == Src) {
+ ++NumDCE;
+ DEBUG(std::cerr << "Removing now-noop copy: " << MI);
+ MBB.erase(&MI);
+ VRM.RemoveFromFoldedVirtMap(&MI);
+ goto ProcessNextInst;
+ }
+ }
}
+
Spills.ClobberPhysReg(VirtReg);
continue;
}
}
}
-
-
llvm::Spiller* llvm::createSpiller() {
switch (SpillerOpt) {
default: assert(0 && "Unreachable!");
--- /dev/null
+; RUN: llvm-as < %s | llc -fast -march=x86 -mcpu=i386 | not grep 'movl %eax, %edx'
+
+int %foo(int %t, int %C) {
+entry:
+ br label %cond_true
+
+cond_true: ; preds = %cond_true, %entry
+ %t_addr.0.0 = phi int [ %t, %entry ], [ %tmp7, %cond_true ] ; <int> [#uses=2]
+ %tmp7 = add int %t_addr.0.0, 1 ; <int> [#uses=1]
+ %tmp = setgt int %C, 39 ; <bool> [#uses=1]
+ br bool %tmp, label %bb12, label %cond_true
+
+bb12: ; preds = %cond_true
+ ret int %t_addr.0.0
+}