diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCMIPeephole.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCMIPeephole.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp b/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp index 7eeff007b78..f42b4bcfc3c 100644 --- a/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp +++ b/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp @@ -382,13 +382,23 @@ bool PPCMIPeephole::simplifyCode(void) { // If this is a splat or a swap fed by another splat, we // can replace it with a copy. if (DefOpc == PPC::XXPERMDI) { - unsigned FeedImmed = DefMI->getOperand(3).getImm(); - unsigned FeedReg1 = - TRI->lookThruCopyLike(DefMI->getOperand(1).getReg(), MRI); - unsigned FeedReg2 = - TRI->lookThruCopyLike(DefMI->getOperand(2).getReg(), MRI); + unsigned DefReg1 = DefMI->getOperand(1).getReg(); + unsigned DefReg2 = DefMI->getOperand(2).getReg(); + unsigned DefImmed = DefMI->getOperand(3).getImm(); + + // If the two inputs are not the same register, check to see if + // they originate from the same virtual register after only + // copy-like instructions. + if (DefReg1 != DefReg2) { + unsigned FeedReg1 = TRI->lookThruCopyLike(DefReg1, MRI); + unsigned FeedReg2 = TRI->lookThruCopyLike(DefReg2, MRI); + + if (FeedReg1 != FeedReg2 || + Register::isPhysicalRegister(FeedReg1)) + break; + } - if ((FeedImmed == 0 || FeedImmed == 3) && FeedReg1 == FeedReg2) { + if (DefImmed == 0 || DefImmed == 3) { LLVM_DEBUG(dbgs() << "Optimizing splat/swap or splat/splat " "to splat/copy: "); LLVM_DEBUG(MI.dump()); @@ -402,19 +412,18 @@ bool PPCMIPeephole::simplifyCode(void) { // If this is a splat fed by a swap, we can simplify modify // the splat to splat the other value from the swap's input // parameter. - else if ((Immed == 0 || Immed == 3) - && FeedImmed == 2 && FeedReg1 == FeedReg2) { + else if ((Immed == 0 || Immed == 3) && DefImmed == 2) { LLVM_DEBUG(dbgs() << "Optimizing swap/splat => splat: "); LLVM_DEBUG(MI.dump()); - MI.getOperand(1).setReg(DefMI->getOperand(1).getReg()); - MI.getOperand(2).setReg(DefMI->getOperand(2).getReg()); + MI.getOperand(1).setReg(DefReg1); + MI.getOperand(2).setReg(DefReg2); MI.getOperand(3).setImm(3 - Immed); Simplified = true; } // If this is a swap fed by a swap, we can replace it // with a copy from the first swap's input. - else if (Immed == 2 && FeedImmed == 2 && FeedReg1 == FeedReg2) { + else if (Immed == 2 && DefImmed == 2) { LLVM_DEBUG(dbgs() << "Optimizing swap/swap => copy: "); LLVM_DEBUG(MI.dump()); BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(PPC::COPY), |