From d36d03bf2daec79a364f32aba4f4a672c814c1bd Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Mon, 21 Aug 2006 07:33:33 +0000 Subject: [PATCH] Added a check so that if we have two machine instructions in this form MOV R0, R1 MOV R1, R0 the second machine instruction is removed. Added a regression test. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29792 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/VirtRegMap.cpp | 40 +++++++++++++++------ test/CodeGen/X86/2006-08-21-ExtraMovInst.ll | 15 ++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 test/CodeGen/X86/2006-08-21-ExtraMovInst.ll diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp index bc56945bc83..7e6d09bc121 100644 --- a/lib/CodeGen/VirtRegMap.cpp +++ b/lib/CodeGen/VirtRegMap.cpp @@ -521,6 +521,7 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { // 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. @@ -790,16 +791,37 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { } 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; } @@ -861,8 +883,6 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { } } - - llvm::Spiller* llvm::createSpiller() { switch (SpillerOpt) { default: assert(0 && "Unreachable!"); diff --git a/test/CodeGen/X86/2006-08-21-ExtraMovInst.ll b/test/CodeGen/X86/2006-08-21-ExtraMovInst.ll new file mode 100644 index 00000000000..29c08611b08 --- /dev/null +++ b/test/CodeGen/X86/2006-08-21-ExtraMovInst.ll @@ -0,0 +1,15 @@ +; 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 ] ; [#uses=2] + %tmp7 = add int %t_addr.0.0, 1 ; [#uses=1] + %tmp = setgt int %C, 39 ; [#uses=1] + br bool %tmp, label %bb12, label %cond_true + +bb12: ; preds = %cond_true + ret int %t_addr.0.0 +} -- 2.34.1