From 0d23e8b50415ea0841a4d0185b51c1bae69d2c49 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Wed, 26 Jun 2019 01:34:37 +0000 Subject: [PATCH] [PowerPC][NFC] Move peephole optimization of RLDICR into a method. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364372 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCMIPeephole.cpp | 104 +++++++++++++++------------ 1 file changed, 57 insertions(+), 47 deletions(-) diff --git a/lib/Target/PowerPC/PPCMIPeephole.cpp b/lib/Target/PowerPC/PPCMIPeephole.cpp index 9a566eddfdd..6e693bd1db2 100644 --- a/lib/Target/PowerPC/PPCMIPeephole.cpp +++ b/lib/Target/PowerPC/PPCMIPeephole.cpp @@ -94,6 +94,7 @@ private: // Perform peepholes. bool eliminateRedundantCompare(void); bool eliminateRedundantTOCSaves(std::map &TOCSaves); + void emitRLDICWhenLoweringJumpTables(MachineInstr &MI); void UpdateTOCSaves(std::map &TOCSaves, MachineInstr *MI); @@ -760,53 +761,7 @@ bool PPCMIPeephole::simplifyCode(void) { break; } case PPC::RLDICR: { - // We miss the opportunity to emit an RLDIC when lowering jump tables - // since ISEL sees only a single basic block. When selecting, the clear - // and shift left will be in different blocks. - unsigned SrcReg = MI.getOperand(1).getReg(); - if (!TargetRegisterInfo::isVirtualRegister(SrcReg)) - break; - - MachineInstr *SrcMI = MRI->getVRegDef(SrcReg); - if (SrcMI->getOpcode() != PPC::RLDICL) - break; - MachineOperand MOpSHSrc = SrcMI->getOperand(2); - MachineOperand MOpMBSrc = SrcMI->getOperand(3); - MachineOperand MOpSHMI = MI.getOperand(2); - MachineOperand MOpMEMI = MI.getOperand(3); - if (!(MOpSHSrc.isImm() && MOpMBSrc.isImm() && - MOpSHMI.isImm() && MOpMEMI.isImm())) - break; - uint64_t SHSrc = MOpSHSrc.getImm(); - uint64_t MBSrc = MOpMBSrc.getImm(); - uint64_t SHMI = MOpSHMI.getImm(); - uint64_t MEMI = MOpMEMI.getImm(); - uint64_t NewSH = SHSrc + SHMI; - uint64_t NewMB = MBSrc - SHMI; - if (NewMB > 63 || NewSH > 63) - break; - - // The bits cleared with RLDICL are [0, MBSrc). - // The bits cleared with RLDICR are (MEMI, 63]. - // After the sequence, the bits cleared are: - // [0, MBSrc-SHMI) and (MEMI, 63). - // - // The bits cleared with RLDIC are [0, NewMB) and (63-NewSH, 63]. - if ((63 - NewSH) != MEMI) - break; - - LLVM_DEBUG(dbgs() << "Converting pair: "); - LLVM_DEBUG(SrcMI->dump()); - LLVM_DEBUG(MI.dump()); - - MI.setDesc(TII->get(PPC::RLDIC)); - MI.getOperand(1).setReg(SrcMI->getOperand(1).getReg()); - MI.getOperand(2).setImm(NewSH); - MI.getOperand(3).setImm(NewMB); - - LLVM_DEBUG(dbgs() << "To: "); - LLVM_DEBUG(MI.dump()); - NumRotatesCollapsed++; + emitRLDICWhenLoweringJumpTables(MI); break; } } @@ -1326,6 +1281,61 @@ bool PPCMIPeephole::eliminateRedundantCompare(void) { return Simplified; } +// We miss the opportunity to emit an RLDIC when lowering jump tables +// since ISEL sees only a single basic block. When selecting, the clear +// and shift left will be in different blocks. +void PPCMIPeephole::emitRLDICWhenLoweringJumpTables(MachineInstr &MI) { + if (MI.getOpcode() != PPC::RLDICR) + return; + + unsigned SrcReg = MI.getOperand(1).getReg(); + if (!TargetRegisterInfo::isVirtualRegister(SrcReg)) + return; + + MachineInstr *SrcMI = MRI->getVRegDef(SrcReg); + if (SrcMI->getOpcode() != PPC::RLDICL) + return; + + MachineOperand MOpSHSrc = SrcMI->getOperand(2); + MachineOperand MOpMBSrc = SrcMI->getOperand(3); + MachineOperand MOpSHMI = MI.getOperand(2); + MachineOperand MOpMEMI = MI.getOperand(3); + if (!(MOpSHSrc.isImm() && MOpMBSrc.isImm() && MOpSHMI.isImm() && + MOpMEMI.isImm())) + return; + + uint64_t SHSrc = MOpSHSrc.getImm(); + uint64_t MBSrc = MOpMBSrc.getImm(); + uint64_t SHMI = MOpSHMI.getImm(); + uint64_t MEMI = MOpMEMI.getImm(); + uint64_t NewSH = SHSrc + SHMI; + uint64_t NewMB = MBSrc - SHMI; + if (NewMB > 63 || NewSH > 63) + return; + + // The bits cleared with RLDICL are [0, MBSrc). + // The bits cleared with RLDICR are (MEMI, 63]. + // After the sequence, the bits cleared are: + // [0, MBSrc-SHMI) and (MEMI, 63). + // + // The bits cleared with RLDIC are [0, NewMB) and (63-NewSH, 63]. + if ((63 - NewSH) != MEMI) + return; + + LLVM_DEBUG(dbgs() << "Converting pair: "); + LLVM_DEBUG(SrcMI->dump()); + LLVM_DEBUG(MI.dump()); + + MI.setDesc(TII->get(PPC::RLDIC)); + MI.getOperand(1).setReg(SrcMI->getOperand(1).getReg()); + MI.getOperand(2).setImm(NewSH); + MI.getOperand(3).setImm(NewMB); + + LLVM_DEBUG(dbgs() << "To: "); + LLVM_DEBUG(MI.dump()); + NumRotatesCollapsed++; +} + } // end default namespace INITIALIZE_PASS_BEGIN(PPCMIPeephole, DEBUG_TYPE, -- 2.40.0