52#define DEBUG_TYPE "ppc-mi-peepholes"
54STATISTIC(RemoveTOCSave,
"Number of TOC saves removed");
56 "Number of functions with multiple TOC saves that must be kept");
57STATISTIC(NumTOCSavesInPrologue,
"Number of TOC saves placed in the prologue");
58STATISTIC(NumEliminatedSExt,
"Number of eliminated sign-extensions");
59STATISTIC(NumEliminatedZExt,
"Number of eliminated zero-extensions");
60STATISTIC(NumOptADDLIs,
"Number of optimized ADD instruction fed by LI");
62 "Number of instructions converted to their immediate form");
64 "Number of functions entered in PPC MI Peepholes");
66 "Number of fixed-point iterations converting reg-reg instructions "
69 "Number of pairs of rotate left, clear left/right collapsed");
71 "Number of pairs of EXTSW and SLDI combined as EXTSWSLI");
73 "Number of LI(8) reg, 0 that are folded to r0 and removed");
77 cl::desc(
"Iterate to a fixed point when attempting to "
78 "convert reg-reg instructions to reg-imm"));
82 cl::desc(
"Convert eligible reg+reg instructions to reg+imm"));
86 cl::desc(
"enable elimination of sign-extensions"),
91 cl::desc(
"enable elimination of zero-extensions"),
96 cl::desc(
"enable optimization of conditional traps"),
100 PeepholeXToICounter,
"ppc-xtoi-peephole",
101 "Controls whether PPC reg+reg to reg+imm peephole is performed on a MI");
104 "Controls whether PPC per opcode peephole is performed on a MI");
118 MachineDominatorTree *MDT;
119 MachinePostDominatorTree *MPDT;
120 MachineBlockFrequencyInfo *MBFI;
121 BlockFrequency EntryFreq;
122 SmallSet<Register, 16> RegsToUpdate;
131 bool eliminateRedundantCompare();
132 bool eliminateRedundantTOCSaves(std::map<MachineInstr *, bool> &TOCSaves);
133 bool combineSEXTAndSHL(MachineInstr &
MI, MachineInstr *&ToErase);
134 bool emitRLDICWhenLoweringJumpTables(MachineInstr &
MI,
135 MachineInstr *&ToErase);
136 void UpdateTOCSaves(std::map<MachineInstr *, bool> &TOCSaves,
144 void addDummyDef(MachineBasicBlock &
MBB, MachineInstr *At,
Register Reg) {
147 void addRegToUpdateWithLine(
Register Reg,
int Line);
148 void convertUnprimedAccPHIs(
const PPCInstrInfo *TII, MachineRegisterInfo *MRI,
149 SmallVectorImpl<MachineInstr *> &PHIs,
153 void getAnalysisUsage(AnalysisUsage &AU)
const override {
155 AU.
addRequired<MachinePostDominatorTreeWrapperPass>();
156 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
159 AU.
addPreserved<MachineBlockFrequencyInfoWrapperPass>();
169 assert((MF.getRegInfo().use_empty(PPC::X2) ||
170 !MF.getSubtarget<PPCSubtarget>().isUsingPCRelativeCalls()) &&
171 "TOC pointer used in a function using PC-Relative addressing!");
172 if (skipFunction(MF.getFunction()))
174 return simplifyCode();
178#define addRegToUpdate(R) addRegToUpdateWithLine(R, __LINE__)
179void PPCMIPeephole::addRegToUpdateWithLine(
Register Reg,
int Line) {
180 if (!
Reg.isVirtual())
184 << Line <<
" for re-computation of kill flags\n");
191 MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
192 MPDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
193 MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI();
196 RegsToUpdate.
clear();
201static MachineInstr *getVRegDefOrNull(MachineOperand *
Op,
202 MachineRegisterInfo *MRI) {
216static unsigned getKnownLeadingZeroCount(
const unsigned Reg,
217 const PPCInstrInfo *
TII,
218 const MachineRegisterInfo *MRI) {
220 unsigned Opcode =
MI->getOpcode();
221 if (Opcode == PPC::RLDICL || Opcode == PPC::RLDICL_rec ||
222 Opcode == PPC::RLDCL || Opcode == PPC::RLDCL_rec)
223 return MI->getOperand(3).getImm();
225 if ((Opcode == PPC::RLDIC || Opcode == PPC::RLDIC_rec) &&
226 MI->getOperand(3).getImm() <= 63 -
MI->getOperand(2).getImm())
227 return MI->getOperand(3).getImm();
229 if ((Opcode == PPC::RLWINM || Opcode == PPC::RLWINM_rec ||
230 Opcode == PPC::RLWNM || Opcode == PPC::RLWNM_rec ||
231 Opcode == PPC::RLWINM8 || Opcode == PPC::RLWNM8) &&
232 MI->getOperand(3).getImm() <=
MI->getOperand(4).getImm())
233 return 32 +
MI->getOperand(3).getImm();
235 if (Opcode == PPC::ANDI_rec) {
236 uint16_t
Imm =
MI->getOperand(2).getImm();
240 if (Opcode == PPC::CNTLZW || Opcode == PPC::CNTLZW_rec ||
241 Opcode == PPC::CNTTZW || Opcode == PPC::CNTTZW_rec ||
242 Opcode == PPC::CNTLZW8 || Opcode == PPC::CNTTZW8)
246 if (Opcode == PPC::CNTLZD || Opcode == PPC::CNTLZD_rec ||
247 Opcode == PPC::CNTTZD || Opcode == PPC::CNTTZD_rec)
251 if (Opcode == PPC::LHZ || Opcode == PPC::LHZX ||
252 Opcode == PPC::LHZ8 || Opcode == PPC::LHZX8 ||
253 Opcode == PPC::LHZU || Opcode == PPC::LHZUX ||
254 Opcode == PPC::LHZU8 || Opcode == PPC::LHZUX8)
257 if (Opcode == PPC::LBZ || Opcode == PPC::LBZX ||
258 Opcode == PPC::LBZ8 || Opcode == PPC::LBZX8 ||
259 Opcode == PPC::LBZU || Opcode == PPC::LBZUX ||
260 Opcode == PPC::LBZU8 || Opcode == PPC::LBZUX8)
263 if (Opcode == PPC::AND || Opcode == PPC::AND8 || Opcode == PPC::AND_rec ||
264 Opcode == PPC::AND8_rec)
266 getKnownLeadingZeroCount(
MI->getOperand(1).getReg(),
TII, MRI),
267 getKnownLeadingZeroCount(
MI->getOperand(2).getReg(),
TII, MRI));
269 if (Opcode == PPC::OR || Opcode == PPC::OR8 || Opcode == PPC::XOR ||
270 Opcode == PPC::XOR8 || Opcode == PPC::OR_rec ||
271 Opcode == PPC::OR8_rec || Opcode == PPC::XOR_rec ||
272 Opcode == PPC::XOR8_rec)
274 getKnownLeadingZeroCount(
MI->getOperand(1).getReg(),
TII, MRI),
275 getKnownLeadingZeroCount(
MI->getOperand(2).getReg(),
TII, MRI));
277 if (
TII->isZeroExtended(
Reg, MRI))
289void PPCMIPeephole::UpdateTOCSaves(
290 std::map<MachineInstr *, bool> &TOCSaves, MachineInstr *
MI) {
291 assert(
TII->isTOCSaveMI(*
MI) &&
"Expecting a TOC save instruction here");
295 PPCFunctionInfo *FI = MF->
getInfo<PPCFunctionInfo>();
298 BlockFrequency CurrBlockFreq = MBFI->
getBlockFreq(
MI->getParent());
304 if (CurrBlockFreq > EntryFreq || MPDT->
dominates(
MI->getParent(), Entry))
310 for (
auto &TOCSave : TOCSaves)
311 TOCSave.second =
false;
313 TOCSaves[
MI] =
false;
319 for (
auto &
I : TOCSaves) {
320 MachineInstr *CurrInst =
I.first;
341static bool collectUnprimedAccPHIs(MachineRegisterInfo *MRI,
342 MachineInstr *RootPHI,
343 SmallVectorImpl<MachineInstr *> &PHIs) {
345 unsigned VisitedIndex = 0;
346 while (VisitedIndex < PHIs.
size()) {
347 MachineInstr *VisitedPHI = PHIs[VisitedIndex];
349 PHIOp !=
NumOps; PHIOp += 2) {
356 unsigned Opcode =
Instr->getOpcode();
357 if (Opcode == PPC::COPY) {
361 }
else if (Opcode != PPC::IMPLICIT_DEF && Opcode != PPC::PHI)
367 if (Opcode != PPC::PHI)
382void PPCMIPeephole::convertUnprimedAccPHIs(
383 const PPCInstrInfo *
TII, MachineRegisterInfo *MRI,
384 SmallVectorImpl<MachineInstr *> &PHIs,
Register Dst) {
385 DenseMap<MachineInstr *, MachineInstr *> ChangedPHIMap;
392 for (
unsigned PHIOp = 1,
NumOps =
PHI->getNumOperands(); PHIOp !=
NumOps;
395 MachineInstr *PHIInput = MRI->
getVRegDef(RegOp);
397 assert((Opcode == PPC::COPY || Opcode == PPC::IMPLICIT_DEF ||
398 Opcode == PPC::PHI) &&
399 "Unexpected instruction");
400 if (Opcode == PPC::COPY) {
402 &PPC::ACCRCRegClass &&
403 "Unexpected register class");
405 }
else if (Opcode == PPC::IMPLICIT_DEF) {
408 TII->get(PPC::IMPLICIT_DEF), AccReg);
410 PHI->getOperand(PHIOp + 1)});
411 }
else if (Opcode == PPC::PHI) {
416 "This PHI node should have already been changed.");
417 MachineInstr *PrimedAccPHI = ChangedPHIMap.
lookup(PHIInput);
420 PHI->getOperand(PHIOp + 1)});
431 MachineInstrBuilder NewPHI =
BuildMI(
432 *
PHI->getParent(),
PHI,
PHI->getDebugLoc(),
TII->get(PPC::PHI), AccReg);
433 for (
auto RegMBB : PHIOps) {
434 NewPHI.
add(RegMBB.first).
add(RegMBB.second);
450bool PPCMIPeephole::simplifyCode() {
452 bool TrapOpt =
false;
453 MachineInstr* ToErase =
nullptr;
454 std::map<MachineInstr *, bool> TOCSaves;
456 NumFunctionsEnteredInMIPeephole++;
461 bool SomethingChanged =
false;
463 NumFixedPointIterations++;
464 SomethingChanged =
false;
465 for (MachineBasicBlock &
MBB : *MF) {
466 for (MachineInstr &
MI :
MBB) {
467 if (
MI.isDebugInstr())
473 SmallSet<Register, 4> RRToRIRegsToUpdate;
474 if (!
TII->convertToImmediateForm(
MI, RRToRIRegsToUpdate))
476 for (
Register R : RRToRIRegsToUpdate)
480 for (
const MachineOperand &MO :
MI.operands())
487 NumConvertedToImmediateForm++;
488 SomethingChanged =
true;
499 auto clearKillsForDyingInstr = [&]() {
500 if (RegsToUpdate.
empty())
502 for (MachineOperand &MO : ToErase->
operands()) {
503 if (!MO.isReg() || !MO.isDef() || !RegsToUpdate.
count(MO.getReg()))
506 RegsToUpdate.
erase(RegToUpdate);
511 MO.setReg(PPC::NoRegister);
513 for (MachineOperand &Def : MRI->
def_operands(RegToUpdate))
514 Def.setIsDead(
false);
518 for (MachineBasicBlock &
MBB : *MF) {
519 for (MachineInstr &
MI :
MBB) {
526 clearKillsForDyingInstr();
539 if (
MI.isDebugInstr())
546 switch (
MI.getOpcode()) {
553 if (!Src.isVirtual() || !Dst.isVirtual())
555 if (MRI->
getRegClass(Src) != &PPC::UACCRCRegClass ||
572 SmallVector<MachineInstr *, 4> PHIs;
573 if (!collectUnprimedAccPHIs(MRI, RootPHI, PHIs))
576 convertUnprimedAccPHIs(
TII, MRI, PHIs, Dst);
586 if (!
MI.getOperand(1).isImm() ||
MI.getOperand(1).getImm() != 0)
588 Register MIDestReg =
MI.getOperand(0).getReg();
591 Folded |=
TII->onlyFoldImmediate(
UseMI,
MI, MIDestReg);
593 ++NumLoadImmZeroFoldedAndRemoved;
603 MachineFrameInfo &MFI = MF->getFrameInfo();
605 (!MF->getSubtarget<PPCSubtarget>().isELFv2ABI() &&
606 !MF->getSubtarget<PPCSubtarget>().isAIXABI()))
611 if (
TII->isTOCSaveMI(
MI))
612 UpdateTOCSaves(TOCSaves, &
MI);
615 case PPC::XXPERMDI: {
619 int Immed =
MI.getOperand(3).getImm();
631 TRI->lookThruCopyLike(
MI.getOperand(1).getReg(), MRI);
633 TRI->lookThruCopyLike(
MI.getOperand(2).getReg(), MRI);
635 if (!(TrueReg1 == TrueReg2 && TrueReg1.
isVirtual()))
649 auto isConversionOfLoadAndSplat = [=]() ->
bool {
650 if (DefOpc != PPC::XVCVDPSXDS && DefOpc != PPC::XVCVDPUXDS)
655 MachineInstr *LoadMI = MRI->
getVRegDef(FeedReg1);
656 if (LoadMI && LoadMI->
getOpcode() == PPC::LXVDSX)
661 if ((Immed == 0 || Immed == 3) &&
662 (DefOpc == PPC::LXVDSX || isConversionOfLoadAndSplat())) {
664 "to load-and-splat/copy: ");
667 MI.getOperand(0).getReg())
668 .
add(
MI.getOperand(1));
676 if (DefOpc == PPC::XXPERMDI) {
684 if (DefReg1 != DefReg2) {
685 Register FeedReg1 =
TRI->lookThruCopyLike(DefReg1, MRI);
686 Register FeedReg2 =
TRI->lookThruCopyLike(DefReg2, MRI);
688 if (!(FeedReg1 == FeedReg2 && FeedReg1.
isVirtual()))
692 if (DefImmed == 0 || DefImmed == 3) {
697 MI.getOperand(0).getReg())
698 .
add(
MI.getOperand(1));
707 else if ((Immed == 0 || Immed == 3) && DefImmed == 2) {
712 MI.getOperand(1).setReg(DefReg1);
713 MI.getOperand(2).setReg(DefReg2);
714 MI.getOperand(3).setImm(3 - Immed);
722 else if (Immed == 2 && DefImmed == 2) {
728 MI.getOperand(0).getReg())
735 }
else if ((Immed == 0 || Immed == 3 || Immed == 2) &&
736 DefOpc == PPC::XXPERMDIs &&
748 MI.getOperand(0).getReg())
749 .
add(
MI.getOperand(1));
760 }
else if (Immed == 2 &&
761 (DefOpc == PPC::VSPLTB || DefOpc == PPC::VSPLTH ||
762 DefOpc == PPC::VSPLTW || DefOpc == PPC::XXSPLTW ||
763 DefOpc == PPC::VSPLTISB || DefOpc == PPC::VSPLTISH ||
764 DefOpc == PPC::VSPLTISW)) {
768 LLVM_DEBUG(
dbgs() <<
"Optimizing swap(vsplt(is)?[b|h|w]|xxspltw) => "
769 "copy(vsplt(is)?[b|h|w]|xxspltw): ");
772 MI.getOperand(0).getReg())
773 .
add(
MI.getOperand(1));
775 }
else if ((Immed == 0 || Immed == 3 || Immed == 2) &&
776 TII->isLoadFromConstantPool(
DefMI)) {
778 if (
C &&
C->getType()->isVectorTy() &&
C->getSplatValue()) {
782 <<
"Optimizing swap(splat pattern from constant-pool) "
783 "=> copy(splat pattern from constant-pool): ");
786 MI.getOperand(0).getReg())
787 .
add(
MI.getOperand(1));
796 unsigned MyOpcode =
MI.getOpcode();
798 unsigned OpNo = MyOpcode == PPC::XXSPLTW ? 1 : 2;
800 TRI->lookThruCopyLike(
MI.getOperand(OpNo).getReg(), MRI);
807 auto isConvertOfSplat = [=]() ->
bool {
808 if (DefOpcode != PPC::XVCVSPSXWS && DefOpcode != PPC::XVCVSPUXWS)
813 MachineInstr *Splt = MRI->
getVRegDef(ConvReg);
814 return Splt && (Splt->
getOpcode() == PPC::LXVWSX ||
817 bool AlreadySplat = (MyOpcode == DefOpcode) ||
818 (MyOpcode == PPC::VSPLTB && DefOpcode == PPC::VSPLTBs) ||
819 (MyOpcode == PPC::VSPLTH && DefOpcode == PPC::VSPLTHs) ||
820 (MyOpcode == PPC::XXSPLTW && DefOpcode == PPC::XXSPLTWs) ||
821 (MyOpcode == PPC::XXSPLTW && DefOpcode == PPC::LXVWSX) ||
822 (MyOpcode == PPC::XXSPLTW && DefOpcode == PPC::MTVSRWS)||
823 (MyOpcode == PPC::XXSPLTW && isConvertOfSplat());
831 MI.getOperand(0).getReg())
832 .
add(
MI.getOperand(OpNo));
840 if (DefOpcode == PPC::XXSLDWI) {
862 unsigned SplatImmNo = MyOpcode == PPC::XXSPLTW ? 2 : 1;
863 unsigned SplatImm =
MI.getOperand(SplatImmNo).getImm();
869 auto CalculateNewElementIdx = [&](
unsigned Opcode) {
870 if (Opcode == PPC::VSPLTB)
871 return (SplatImm + ShiftImm * 4) & 0xF;
872 else if (Opcode == PPC::VSPLTH)
873 return (SplatImm + ShiftImm * 2) & 0x7;
875 return (SplatImm + ShiftImm) & 0x3;
878 unsigned NewElem = CalculateNewElementIdx(MyOpcode);
881 <<
" to " << NewElem <<
" in instruction: ");
887 MI.getOperand(OpNo).setReg(ShiftOp1);
888 MI.getOperand(SplatImmNo).setImm(NewElem);
893 case PPC::XVCVDPSP: {
896 TRI->lookThruCopyLike(
MI.getOperand(1).getReg(), MRI);
919 auto removeFRSPIfPossible = [&](MachineInstr *RoundInstr) {
920 unsigned Opc = RoundInstr->getOpcode();
921 if ((
Opc == PPC::FRSP ||
Opc == PPC::XSRSP) &&
924 Register ConvReg1 = RoundInstr->getOperand(1).getReg();
925 Register FRSPDefines = RoundInstr->getOperand(0).getReg();
927 for (
int i = 0, e =
Use.getNumOperands(); i < e; ++i)
928 if (
Use.getOperand(i).isReg() &&
929 Use.getOperand(i).getReg() == FRSPDefines)
930 Use.getOperand(i).setReg(ConvReg1);
939 ToErase = RoundInstr;
947 removeFRSPIfPossible(P1);
948 removeFRSPIfPossible(P2);
951 removeFRSPIfPossible(P1);
957 case PPC::EXTSH8_32_64: {
959 Register NarrowReg =
MI.getOperand(1).getReg();
963 MachineInstr *SrcMI = MRI->
getVRegDef(NarrowReg);
967 if (SrcOpcode == PPC::LHZ || SrcOpcode == PPC::LHZX) {
974 unsigned Opc = PPC::LHA;
975 bool SourceIsXForm = SrcOpcode == PPC::LHZX;
976 bool MIIs64Bit =
MI.getOpcode() == PPC::EXTSH8 ||
977 MI.getOpcode() == PPC::EXTSH8_32_64;
979 if (SourceIsXForm && MIIs64Bit)
981 else if (SourceIsXForm && !MIIs64Bit)
992 addDummyDef(
MBB, &
MI, NarrowReg);
1002 NumEliminatedSExt++;
1008 case PPC::EXTSW_32_64: {
1010 Register NarrowReg =
MI.getOperand(1).getReg();
1014 MachineInstr *SrcMI = MRI->
getVRegDef(NarrowReg);
1015 unsigned SrcOpcode = SrcMI->
getOpcode();
1020 bool SrcIsGPRCWordZextLoad =
1021 SrcOpcode == PPC::LWZ || SrcOpcode == PPC::LWZX;
1022 bool SrcIsG8RCWordZextLoad =
1023 SrcOpcode == PPC::LWZ8 || SrcOpcode == PPC::LWZX8;
1024 unsigned NarrowSubReg =
MI.getOperand(1).getSubReg();
1026 if ((!NarrowSubReg && SrcIsGPRCWordZextLoad) ||
1027 (NarrowSubReg == PPC::sub_32 && SrcIsG8RCWordZextLoad)) {
1035 bool IsWordAligned =
false;
1037 const GlobalVariable *GV =
1041 IsWordAligned =
true;
1045 IsWordAligned =
true;
1052 unsigned Opc = PPC::LWA_32;
1053 bool SourceIsXForm =
1054 SrcOpcode == PPC::LWZX || SrcOpcode == PPC::LWZX8;
1055 bool MIIs64Bit =
MI.getOpcode() == PPC::EXTSW ||
1056 MI.getOpcode() == PPC::EXTSW_32_64;
1058 if (SourceIsXForm && MIIs64Bit)
1060 else if (SourceIsXForm && !MIIs64Bit)
1065 if (!IsWordAligned && (
Opc == PPC::LWA ||
Opc == PPC::LWA_32))
1074 addDummyDef(
MBB, &
MI, NarrowReg);
1084 NumEliminatedSExt++;
1085 }
else if (
MI.getOpcode() == PPC::EXTSW_32_64 &&
1086 TII->isSignExtended(NarrowReg, MRI)) {
1096 TII->promoteInstr32To64ForElimEXTSW(NarrowReg, MRI, 0);
1100 unsigned NarrowSubReg =
MI.getOperand(1).getSubReg();
1104 assert(NarrowSubReg == PPC::sub_32 &&
1105 "EXTSW_32_64 input must read the sub_32 subregister");
1107 MI.getOperand(0).getReg())
1111 MF->getRegInfo().createVirtualRegister(&PPC::G8RCRegClass);
1115 MI.getOperand(0).getReg())
1123 NumEliminatedSExt++;
1136 if (
MI.getOperand(2).getImm() != 0)
1143 MachineInstr *SrcMI = MRI->
getVRegDef(SrcReg);
1144 if (!(SrcMI && SrcMI->
getOpcode() == PPC::INSERT_SUBREG &&
1148 MachineInstr *ImpDefMI, *SubRegMI;
1151 if (ImpDefMI->
getOpcode() != PPC::IMPLICIT_DEF)
break;
1154 if (SubRegMI->
getOpcode() == PPC::COPY) {
1162 unsigned KnownZeroCount =
1164 if (
MI.getOperand(3).getImm() <= KnownZeroCount) {
1167 MI.getOperand(0).getReg())
1172 NumEliminatedZExt++;
1183 auto isSingleUsePHI = [&](MachineOperand *PhiOp) {
1184 assert(PhiOp &&
"Invalid Operand!");
1185 MachineInstr *DefPhiMI = getVRegDefOrNull(PhiOp, MRI);
1187 return DefPhiMI && (DefPhiMI->
getOpcode() == PPC::PHI) &&
1191 auto dominatesAllSingleUseLIs = [&](MachineOperand *DominatorOp,
1192 MachineOperand *PhiOp) {
1193 assert(PhiOp &&
"Invalid Operand!");
1194 assert(DominatorOp &&
"Invalid Operand!");
1195 MachineInstr *DefPhiMI = getVRegDefOrNull(PhiOp, MRI);
1196 MachineInstr *DefDomMI = getVRegDefOrNull(DominatorOp, MRI);
1201 MachineInstr *LiMI =
1202 getVRegDefOrNull(&DefPhiMI->
getOperand(i), MRI);
1213 MachineOperand Op1 =
MI.getOperand(1);
1214 MachineOperand Op2 =
MI.getOperand(2);
1215 if (isSingleUsePHI(&Op2) && dominatesAllSingleUseLIs(&Op1, &Op2))
1217 else if (!isSingleUsePHI(&Op1) || !dominatesAllSingleUseLIs(&Op2, &Op1))
1224 ? &PPC::G8RC_and_G8RC_NOX0RegClass
1225 : &PPC::GPRC_and_GPRC_NOR0RegClass;
1229 MachineInstr *DefPhiMI = getVRegDefOrNull(&Op1, MRI);
1231 MachineInstr *LiMI = getVRegDefOrNull(&DefPhiMI->
getOperand(i), MRI);
1249 .addReg(DominatorReg)
1258 MI.getOperand(0).getReg())
1268 Simplified |= emitRLDICWhenLoweringJumpTables(
MI, ToErase) ||
1269 combineSEXTAndSHL(
MI, ToErase);
1273 case PPC::ANDI8_rec:
1274 case PPC::ANDIS_rec:
1275 case PPC::ANDIS8_rec: {
1277 TRI->lookThruCopyLike(
MI.getOperand(1).getReg(), MRI);
1281 MachineInstr *SrcMI = MRI->
getVRegDef(TrueReg);
1285 unsigned SrcOpCode = SrcMI->
getOpcode();
1286 if (SrcOpCode != PPC::RLDICL && SrcOpCode != PPC::RLDICR)
1291 DstReg =
MI.getOperand(1).getReg();
1298 if (
MI.getOpcode() == PPC::ANDIS_rec ||
1299 MI.getOpcode() == PPC::ANDIS8_rec)
1307 bool PatternResultZero =
1308 (SrcOpCode == PPC::RLDICL && (RZeroAndImm + ImmSrc > 63)) ||
1309 (SrcOpCode == PPC::RLDICR && LZeroAndImm > ImmSrc);
1313 bool PatternRemoveRotate =
1315 ((SrcOpCode == PPC::RLDICL && LZeroAndImm >= ImmSrc) ||
1316 (SrcOpCode == PPC::RLDICR && (RZeroAndImm + ImmSrc > 63)));
1318 if (!PatternResultZero && !PatternRemoveRotate)
1324 if (PatternResultZero)
1325 MI.getOperand(2).setImm(0);
1335 case PPC::RLWINM_rec:
1337 case PPC::RLWINM8_rec: {
1340 Register OrigOp1Reg =
MI.getOperand(1).isReg()
1341 ?
MI.getOperand(1).getReg()
1346 if (
MI.getOperand(1).isReg())
1352 ++NumRotatesCollapsed;
1363 MachineInstr *LiMI1 = getVRegDefOrNull(&
MI.getOperand(1), MRI);
1364 MachineInstr *LiMI2 = getVRegDefOrNull(&
MI.getOperand(2), MRI);
1365 bool IsOperand2Immediate =
MI.getOperand(2).isImm();
1368 if (!(LiMI1 && (LiMI1->
getOpcode() == PPC::LI ||
1371 if (!IsOperand2Immediate &&
1372 !(LiMI2 && (LiMI2->
getOpcode() == PPC::LI ||
1376 auto ImmOperand0 =
MI.getOperand(0).getImm();
1378 auto ImmOperand2 = IsOperand2Immediate ?
MI.getOperand(2).getImm()
1383 if ((ImmOperand0 == 31) ||
1384 ((ImmOperand0 & 0x10) &&
1385 ((int64_t)ImmOperand1 < (int64_t)ImmOperand2)) ||
1386 ((ImmOperand0 & 0x8) &&
1387 ((int64_t)ImmOperand1 > (int64_t)ImmOperand2)) ||
1388 ((ImmOperand0 & 0x2) &&
1390 ((ImmOperand0 & 0x1) &&
1392 ((ImmOperand0 & 0x4) && (ImmOperand1 == ImmOperand2))) {
1407 clearKillsForDyingInstr();
1417 Simplified |= eliminateRedundantTOCSaves(TOCSaves);
1418 PPCFunctionInfo *FI = MF->getInfo<PPCFunctionInfo>();
1420 NumTOCSavesInPrologue++;
1435 Def.setIsDead(
false);
1441static bool isEqOrNe(MachineInstr *BI) {
1447static bool isSupportedCmpOp(
unsigned opCode) {
1448 return (opCode == PPC::CMPLD || opCode == PPC::CMPD ||
1449 opCode == PPC::CMPLW || opCode == PPC::CMPW ||
1450 opCode == PPC::CMPLDI || opCode == PPC::CMPDI ||
1451 opCode == PPC::CMPLWI || opCode == PPC::CMPWI);
1454static bool is64bitCmpOp(
unsigned opCode) {
1455 return (opCode == PPC::CMPLD || opCode == PPC::CMPD ||
1456 opCode == PPC::CMPLDI || opCode == PPC::CMPDI);
1459static bool isSignedCmpOp(
unsigned opCode) {
1460 return (opCode == PPC::CMPD || opCode == PPC::CMPW ||
1461 opCode == PPC::CMPDI || opCode == PPC::CMPWI);
1464static unsigned getSignedCmpOpCode(
unsigned opCode) {
1465 if (opCode == PPC::CMPLD)
return PPC::CMPD;
1466 if (opCode == PPC::CMPLW)
return PPC::CMPW;
1467 if (opCode == PPC::CMPLDI)
return PPC::CMPDI;
1468 if (opCode == PPC::CMPLWI)
return PPC::CMPWI;
1474static unsigned getPredicateToDecImm(MachineInstr *BI, MachineInstr *CMPI) {
1476 bool SignedCmp = isSignedCmpOp(CMPI->
getOpcode());
1477 if ((!SignedCmp &&
Imm == 0) || (SignedCmp &&
Imm == 0x8000))
1493static unsigned getPredicateToIncImm(MachineInstr *BI, MachineInstr *CMPI) {
1495 bool SignedCmp = isSignedCmpOp(CMPI->
getOpcode());
1496 if ((!SignedCmp &&
Imm == 0xFFFF) || (SignedCmp &&
Imm == 0x7FFF))
1511static unsigned getIncomingRegForBlock(MachineInstr *Phi,
1512 MachineBasicBlock *
MBB) {
1513 for (
unsigned I = 2,
E =
Phi->getNumOperands() + 1;
I !=
E;
I += 2) {
1514 MachineOperand &MO =
Phi->getOperand(
I);
1516 return Phi->getOperand(
I-1).getReg();
1525static unsigned getSrcVReg(
unsigned Reg, MachineBasicBlock *BB1,
1526 MachineBasicBlock *BB2, MachineRegisterInfo *MRI) {
1527 unsigned SrcReg =
Reg;
1529 unsigned NextReg = SrcReg;
1530 MachineInstr *Inst = MRI->
getVRegDef(SrcReg);
1532 NextReg = getIncomingRegForBlock(Inst, BB1);
1538 if (NextReg == SrcReg || !Register::isVirtualRegister(NextReg))
1545static bool eligibleForCompareElimination(MachineBasicBlock &
MBB,
1546 MachineBasicBlock *&PredMBB,
1547 MachineBasicBlock *&MBBtoMoveCmp,
1548 MachineRegisterInfo *MRI) {
1550 auto isEligibleBB = [&](MachineBasicBlock &BB) {
1551 auto BII = BB.getFirstInstrTerminator();
1555 if (BB.succ_size() == 2 &&
1556 BII != BB.instr_end() &&
1557 (*BII).getOpcode() == PPC::BCC &&
1558 (*BII).getOperand(1).isReg()) {
1560 Register CndReg = (*BII).getOperand(1).getReg();
1564 MachineInstr *CMPI = MRI->
getVRegDef(CndReg);
1570 for (MachineOperand &MO : CMPI->
operands())
1583 auto isEligibleForMoveCmp = [](MachineBasicBlock &BB) {
1584 return BB.succ_size() == 1;
1587 if (!isEligibleBB(
MBB))
1591 if (NumPredBBs == 1) {
1593 if (isEligibleBB(*TmpMBB)) {
1595 MBBtoMoveCmp =
nullptr;
1599 else if (NumPredBBs == 2) {
1604 MachineBasicBlock *Pred1MBB = *PI;
1605 MachineBasicBlock *Pred2MBB = *(PI+1);
1607 if (isEligibleBB(*Pred1MBB) && isEligibleForMoveCmp(*Pred2MBB)) {
1612 else if (isEligibleBB(*Pred2MBB) && isEligibleForMoveCmp(*Pred1MBB)) {
1618 if (Pred1MBB == &
MBB)
1626 for (
int I = 1;
I <= 2;
I++)
1634 MBBtoMoveCmp = Pred2MBB;
1645bool PPCMIPeephole::eliminateRedundantTOCSaves(
1646 std::map<MachineInstr *, bool> &TOCSaves) {
1649 for (
auto TOCSave : TOCSaves) {
1650 if (!TOCSave.second) {
1651 TOCSave.first->eraseFromParent();
1687bool PPCMIPeephole::eliminateRedundantCompare() {
1690 for (MachineBasicBlock &MBB2 : *MF) {
1691 MachineBasicBlock *MBB1 =
nullptr, *MBBtoMoveCmp =
nullptr;
1720 if (!eligibleForCompareElimination(MBB2, MBB1, MBBtoMoveCmp, MRI))
1726 MachineInstr *BI2 = &*MBB2.getFirstInstrTerminator();
1728 bool IsPartiallyRedundant = (MBBtoMoveCmp !=
nullptr);
1732 if (!isSupportedCmpOp(CMPI1->
getOpcode()) ||
1733 !isSupportedCmpOp(CMPI2->
getOpcode()) ||
1737 unsigned NewOpCode = 0;
1738 unsigned NewPredicate1 = 0, NewPredicate2 = 0;
1740 bool SwapOperands =
false;
1751 auto CmpAgainstImmWithSignBit = [](MachineInstr *
I) {
1752 if (!
I->getOperand(2).isImm())
1754 int16_t
Imm = (int16_t)
I->getOperand(2).getImm();
1758 if (isEqOrNe(BI2) && !CmpAgainstImmWithSignBit(CMPI2) &&
1761 else if (isEqOrNe(BI1) && !CmpAgainstImmWithSignBit(CMPI1) &&
1771 nullptr,
nullptr, MRI);
1773 nullptr,
nullptr, MRI);
1779 if (Cmp1Operand1 == Cmp2Operand1 && Cmp1Operand2 == Cmp2Operand2) {
1782 else if (Cmp1Operand1 == Cmp2Operand2 && Cmp1Operand2 == Cmp2Operand1) {
1789 SwapOperands =
true;
1797 nullptr,
nullptr, MRI);
1800 if (Cmp1Operand1 != Cmp2Operand1)
1808 if (Imm1 != Imm2 && (!isEqOrNe(BI2) || !isEqOrNe(BI1))) {
1809 int Diff = Imm1 - Imm2;
1810 if (Diff < -2 || Diff > 2)
1813 unsigned PredToInc1 = getPredicateToIncImm(BI1, CMPI1);
1814 unsigned PredToDec1 = getPredicateToDecImm(BI1, CMPI1);
1815 unsigned PredToInc2 = getPredicateToIncImm(BI2, CMPI2);
1816 unsigned PredToDec2 = getPredicateToDecImm(BI2, CMPI2);
1818 if (PredToInc2 && PredToDec1) {
1819 NewPredicate2 = PredToInc2;
1820 NewPredicate1 = PredToDec1;
1825 else if (Diff == 1) {
1828 NewPredicate2 = PredToInc2;
1830 else if (PredToDec1) {
1832 NewPredicate1 = PredToDec1;
1835 else if (Diff == -1) {
1838 NewPredicate2 = PredToDec2;
1840 else if (PredToInc1) {
1842 NewPredicate1 = PredToInc1;
1845 else if (Diff == -2) {
1846 if (PredToDec2 && PredToInc1) {
1847 NewPredicate2 = PredToDec2;
1848 NewPredicate1 = PredToInc1;
1860 LLVM_DEBUG(
dbgs() <<
"Optimize two pairs of compare and branch:\n");
1865 for (
const MachineOperand &MO : CMPI1->
operands())
1868 for (
const MachineOperand &MO : CMPI2->
operands())
1873 if (NewOpCode != 0 && NewOpCode != CMPI1->
getOpcode()) {
1876 if (NewPredicate1) {
1879 if (NewPredicate2) {
1886 if (IsPartiallyRedundant) {
1898 for (
int I = 1;
I <= 2;
I++) {
1905 "We cannot support if an operand comes from this BB.");
1906 unsigned SrcReg = getIncomingRegForBlock(Inst, MBBtoMoveCmp);
1917 TII->get(PPC::PHI), NewVReg)
1940 if (IsPartiallyRedundant) {
1943 <<
" to handle partial redundancy.\n");
1955bool PPCMIPeephole::emitRLDICWhenLoweringJumpTables(MachineInstr &
MI,
1956 MachineInstr *&ToErase) {
1957 if (
MI.getOpcode() != PPC::RLDICR)
1964 MachineInstr *SrcMI = MRI->
getVRegDef(SrcReg);
1968 MachineOperand MOpSHSrc = SrcMI->
getOperand(2);
1969 MachineOperand MOpMBSrc = SrcMI->
getOperand(3);
1970 MachineOperand MOpSHMI =
MI.getOperand(2);
1971 MachineOperand MOpMEMI =
MI.getOperand(3);
1982 if (NewMB > 63 || NewSH > 63)
1991 if ((63 - NewSH) != MEMI)
1998 MI.setDesc(
TII->get(PPC::RLDIC));
2000 MI.getOperand(2).setImm(NewSH);
2001 MI.getOperand(3).setImm(NewMB);
2007 NumRotatesCollapsed++;
2011 "Not expecting an implicit def with this instr.");
2028bool PPCMIPeephole::combineSEXTAndSHL(MachineInstr &
MI,
2029 MachineInstr *&ToErase) {
2030 if (
MI.getOpcode() != PPC::RLDICR)
2033 if (!MF->getSubtarget<PPCSubtarget>().isISA3_0())
2036 assert(
MI.getNumOperands() == 4 &&
"RLDICR should have 4 operands");
2038 MachineOperand MOpSHMI =
MI.getOperand(2);
2039 MachineOperand MOpMEMI =
MI.getOperand(3);
2045 if (SHMI + MEMI != 63)
2052 MachineInstr *SrcMI = MRI->
getVRegDef(SrcReg);
2064 "EXTSW's second operand should be a register");
2072 MachineInstr *NewInstr =
2074 SrcMI->
getOpcode() == PPC::EXTSW ?
TII->get(PPC::EXTSWSLI)
2075 :
TII->get(PPC::EXTSWSLI_32_64),
2076 MI.getOperand(0).getReg())
2083 ++NumEXTSWAndSLDICombined;
2096 "PowerPC MI Peephole Optimization",
false,
false)
2103char PPCMIPeephole::ID = 0;
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file provides an implementation of debug counters.
#define DEBUG_COUNTER(VARNAME, COUNTERNAME, DESC)
static Register UseReg(const MachineOperand &MO)
const HexagonInstrInfo * TII
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
Register const TargetRegisterInfo * TRI
Promote Memory to Register
#define addRegToUpdate(R)
static cl::opt< bool > EnableZExtElimination("ppc-eliminate-zeroext", cl::desc("enable elimination of zero-extensions"), cl::init(true), cl::Hidden)
static cl::opt< bool > FixedPointRegToImm("ppc-reg-to-imm-fixed-point", cl::Hidden, cl::init(true), cl::desc("Iterate to a fixed point when attempting to " "convert reg-reg instructions to reg-imm"))
static cl::opt< bool > EnableTrapOptimization("ppc-opt-conditional-trap", cl::desc("enable optimization of conditional traps"), cl::init(false), cl::Hidden)
static cl::opt< bool > ConvertRegReg("ppc-convert-rr-to-ri", cl::Hidden, cl::init(true), cl::desc("Convert eligible reg+reg instructions to reg+imm"))
static cl::opt< bool > EnableSExtElimination("ppc-eliminate-signext", cl::desc("enable elimination of sign-extensions"), cl::init(true), cl::Hidden)
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, const llvm::StringTable &StandardNames, VectorLibrary VecLib)
Initialize the set of available library functions based on the specified target triple.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
static bool shouldExecute(CounterInfo &Counter)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
bool dominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
dominates - Returns true iff A dominates B.
FunctionPass class - This class is used to implement most global optimizations.
MaybeAlign getAlign() const
Returns the alignment of the given variable.
const HexagonRegisterInfo & getRegisterInfo() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned pred_size() const
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
SmallVectorImpl< MachineBasicBlock * >::iterator pred_iterator
pred_iterator pred_begin()
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI instr_iterator getFirstInstrTerminator()
Same getFirstTerminator but it ignores bundles and return an instr_iterator instead.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
LLVM_ABI BlockFrequency getEntryFreq() const
Divide a block's BlockFrequency::getFrequency() value by this value to obtain the entry block - relat...
Analysis pass which computes a MachineDominatorTree.
bool dominates(const MachineInstr *A, const MachineInstr *B) const
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
void dump() const
dump - Print the current MachineFunction to cerr, useful for debugger use.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineBasicBlock & front() const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
unsigned getNumOperands() const
Retuns the total number of operands.
bool hasImplicitDef() const
Returns true if the instruction has implicit definition.
mop_range explicit_uses()
LLVM_ABI void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_ABI void removeOperand(unsigned OpNo)
Erase an operand from an instruction, leaving it with one fewer operand than it started with.
LLVM_ABI void dump() const
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI MachineInstrBundleIterator< MachineInstr > eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
const GlobalValue * getGlobal() const
void setImm(int64_t immVal)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
Register getReg() const
getReg - Returns the register number.
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
int64_t getOffset() const
Return the offset from the symbol in this operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI bool hasOneNonDBGUse(Register RegNo) const
hasOneNonDBGUse - Return true if there is exactly one non-Debug use of the specified register.
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI void clearKillFlags(Register Reg) const
clearKillFlags - Iterate over all the uses of the given register and clear the kill flag from the Mac...
LLVM_ABI LLVM_READONLY MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
bool use_nodbg_empty(Register RegNo) const
use_nodbg_empty - Return true if there are no non-Debug instructions using the specified register.
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
use_instr_nodbg_iterator use_instr_nodbg_begin(Register RegNo) const
LLVM_ABI bool hasOneNonDBGUser(Register RegNo) const
hasOneNonDBGUse - Return true if there is exactly one non-Debug instruction using the specified regis...
iterator_range< def_iterator > def_operands(Register Reg) const
LLVM_ABI void setRegClass(Register Reg, const TargetRegisterClass *RC)
setRegClass - Set the register class of the specified virtual register.
const TargetRegisterClass * getRegClassOrNull(Register Reg) const
Return the register class of Reg, or null if Reg has not been assigned a register class yet.
iterator_range< use_instr_iterator > use_instructions(Register Reg) const
LLVM_ABI const TargetRegisterClass * constrainRegClass(Register Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
bool reg_empty(Register RegNo) const
reg_empty - Return true if there are no instructions using or defining the specified register (it may...
LLVM_ABI LLVM_READONLY MachineInstr * getUniqueVRegDef(Register Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
void setMustSaveTOC(bool U)
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
void push_back(const T &Elt)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Predicate getSwappedPredicate(Predicate Opcode)
Assume the condition register is set by MI(a,b), return the predicate if we modify the instructions s...
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
unsigned getPredicateCondition(Predicate Opcode)
Return the condition without hint bits.
Predicate getPredicate(unsigned Condition, unsigned Hint)
Return predicate consisting of specified condition and hint bits.
unsigned getPredicateHint(Predicate Opcode)
Return the hint bits of the predicate.
initializer< Ty > init(const Ty &Val)
NodeAddr< DefNode * > Def
NodeAddr< InstrNode * > Instr
NodeAddr< PhiNode * > Phi
NodeAddr< UseNode * > Use
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
int countl_zero(T Val)
Count number of 0's from the most significant bit to the least stopping at the first 1.
auto reverse(ContainerTy &&C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
DWARFExpression::Operation Op
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
@ Keep
No function return thunk.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
FunctionPass * createPPCMIPeepholePass()
MCRegisterClass TargetRegisterClass
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.