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");
119 MachineDominatorTree *MDT;
120 MachinePostDominatorTree *MPDT;
121 MachineBlockFrequencyInfo *MBFI;
122 BlockFrequency EntryFreq;
123 SmallSet<Register, 16> RegsToUpdate;
132 bool eliminateRedundantCompare();
133 bool eliminateRedundantTOCSaves(std::map<MachineInstr *, bool> &TOCSaves);
134 bool combineSEXTAndSHL(MachineInstr &
MI, MachineInstr *&ToErase);
135 bool emitRLDICWhenLoweringJumpTables(MachineInstr &
MI,
136 MachineInstr *&ToErase);
137 void UpdateTOCSaves(std::map<MachineInstr *, bool> &TOCSaves,
145 void addDummyDef(MachineBasicBlock &
MBB, MachineInstr *At,
Register Reg) {
148 void addRegToUpdateWithLine(
Register Reg,
int Line);
149 void convertUnprimedAccPHIs(
const PPCInstrInfo *TII, MachineRegisterInfo *MRI,
150 SmallVectorImpl<MachineInstr *> &PHIs,
155 void getAnalysisUsage(AnalysisUsage &AU)
const override {
158 AU.
addRequired<MachinePostDominatorTreeWrapperPass>();
159 AU.
addRequired<MachineBlockFrequencyInfoWrapperPass>();
163 AU.
addPreserved<MachineBlockFrequencyInfoWrapperPass>();
168 bool runOnMachineFunction(MachineFunction &MF)
override {
172 assert((MF.getRegInfo().use_empty(PPC::X2) ||
173 !MF.getSubtarget<PPCSubtarget>().isUsingPCRelativeCalls()) &&
174 "TOC pointer used in a function using PC-Relative addressing!");
175 if (skipFunction(MF.getFunction()))
180 MF.verify(
this,
"Error in PowerPC MI Peephole optimization, compile with "
181 "-mllvm -disable-ppc-peephole");
187#define addRegToUpdate(R) addRegToUpdateWithLine(R, __LINE__)
188void PPCMIPeephole::addRegToUpdateWithLine(
Register Reg,
int Line) {
189 if (!
Reg.isVirtual())
193 << Line <<
" for re-computation of kill flags\n");
197void PPCMIPeephole::initialize(MachineFunction &MFParm) {
200 MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
201 MPDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
202 MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI();
203 LV = &getAnalysis<LiveVariablesWrapperPass>().getLV();
206 RegsToUpdate.
clear();
211static MachineInstr *getVRegDefOrNull(MachineOperand *
Op,
212 MachineRegisterInfo *
MRI) {
221 return MRI->getVRegDef(
Reg);
226static unsigned getKnownLeadingZeroCount(
const unsigned Reg,
227 const PPCInstrInfo *
TII,
228 const MachineRegisterInfo *
MRI) {
229 MachineInstr *
MI =
MRI->getVRegDef(
Reg);
230 unsigned Opcode =
MI->getOpcode();
231 if (Opcode == PPC::RLDICL || Opcode == PPC::RLDICL_rec ||
232 Opcode == PPC::RLDCL || Opcode == PPC::RLDCL_rec)
233 return MI->getOperand(3).getImm();
235 if ((Opcode == PPC::RLDIC || Opcode == PPC::RLDIC_rec) &&
236 MI->getOperand(3).getImm() <= 63 -
MI->getOperand(2).getImm())
237 return MI->getOperand(3).getImm();
239 if ((Opcode == PPC::RLWINM || Opcode == PPC::RLWINM_rec ||
240 Opcode == PPC::RLWNM || Opcode == PPC::RLWNM_rec ||
241 Opcode == PPC::RLWINM8 || Opcode == PPC::RLWNM8) &&
242 MI->getOperand(3).getImm() <=
MI->getOperand(4).getImm())
243 return 32 +
MI->getOperand(3).getImm();
245 if (Opcode == PPC::ANDI_rec) {
246 uint16_t
Imm =
MI->getOperand(2).getImm();
250 if (Opcode == PPC::CNTLZW || Opcode == PPC::CNTLZW_rec ||
251 Opcode == PPC::CNTTZW || Opcode == PPC::CNTTZW_rec ||
252 Opcode == PPC::CNTLZW8 || Opcode == PPC::CNTTZW8)
256 if (Opcode == PPC::CNTLZD || Opcode == PPC::CNTLZD_rec ||
257 Opcode == PPC::CNTTZD || Opcode == PPC::CNTTZD_rec)
261 if (Opcode == PPC::LHZ || Opcode == PPC::LHZX ||
262 Opcode == PPC::LHZ8 || Opcode == PPC::LHZX8 ||
263 Opcode == PPC::LHZU || Opcode == PPC::LHZUX ||
264 Opcode == PPC::LHZU8 || Opcode == PPC::LHZUX8)
267 if (Opcode == PPC::LBZ || Opcode == PPC::LBZX ||
268 Opcode == PPC::LBZ8 || Opcode == PPC::LBZX8 ||
269 Opcode == PPC::LBZU || Opcode == PPC::LBZUX ||
270 Opcode == PPC::LBZU8 || Opcode == PPC::LBZUX8)
273 if (Opcode == PPC::AND || Opcode == PPC::AND8 || Opcode == PPC::AND_rec ||
274 Opcode == PPC::AND8_rec)
276 getKnownLeadingZeroCount(
MI->getOperand(1).getReg(),
TII,
MRI),
277 getKnownLeadingZeroCount(
MI->getOperand(2).getReg(),
TII,
MRI));
279 if (Opcode == PPC::OR || Opcode == PPC::OR8 || Opcode == PPC::XOR ||
280 Opcode == PPC::XOR8 || Opcode == PPC::OR_rec ||
281 Opcode == PPC::OR8_rec || Opcode == PPC::XOR_rec ||
282 Opcode == PPC::XOR8_rec)
284 getKnownLeadingZeroCount(
MI->getOperand(1).getReg(),
TII,
MRI),
285 getKnownLeadingZeroCount(
MI->getOperand(2).getReg(),
TII,
MRI));
299void PPCMIPeephole::UpdateTOCSaves(
300 std::map<MachineInstr *, bool> &TOCSaves, MachineInstr *
MI) {
301 assert(
TII->isTOCSaveMI(*
MI) &&
"Expecting a TOC save instruction here");
305 PPCFunctionInfo *FI = MF->
getInfo<PPCFunctionInfo>();
308 BlockFrequency CurrBlockFreq = MBFI->
getBlockFreq(
MI->getParent());
314 if (CurrBlockFreq > EntryFreq || MPDT->
dominates(
MI->getParent(), Entry))
320 for (
auto &TOCSave : TOCSaves)
321 TOCSave.second =
false;
323 TOCSaves[
MI] =
false;
329 for (
auto &
I : TOCSaves) {
330 MachineInstr *CurrInst =
I.first;
351static bool collectUnprimedAccPHIs(MachineRegisterInfo *
MRI,
352 MachineInstr *RootPHI,
353 SmallVectorImpl<MachineInstr *> &PHIs) {
355 unsigned VisitedIndex = 0;
356 while (VisitedIndex < PHIs.
size()) {
357 MachineInstr *VisitedPHI = PHIs[VisitedIndex];
359 PHIOp !=
NumOps; PHIOp += 2) {
363 MachineInstr *
Instr =
MRI->getVRegDef(RegOp);
366 unsigned Opcode =
Instr->getOpcode();
367 if (Opcode == PPC::COPY) {
371 }
else if (Opcode != PPC::IMPLICIT_DEF && Opcode != PPC::PHI)
377 if (Opcode != PPC::PHI)
392void PPCMIPeephole::convertUnprimedAccPHIs(
393 const PPCInstrInfo *
TII, MachineRegisterInfo *
MRI,
394 SmallVectorImpl<MachineInstr *> &PHIs,
Register Dst) {
395 DenseMap<MachineInstr *, MachineInstr *> ChangedPHIMap;
402 for (
unsigned PHIOp = 1,
NumOps =
PHI->getNumOperands(); PHIOp !=
NumOps;
405 MachineInstr *PHIInput =
MRI->getVRegDef(RegOp);
407 assert((Opcode == PPC::COPY || Opcode == PPC::IMPLICIT_DEF ||
408 Opcode == PPC::PHI) &&
409 "Unexpected instruction");
410 if (Opcode == PPC::COPY) {
412 &PPC::ACCRCRegClass &&
413 "Unexpected register class");
415 }
else if (Opcode == PPC::IMPLICIT_DEF) {
416 Register AccReg =
MRI->createVirtualRegister(&PPC::ACCRCRegClass);
418 TII->get(PPC::IMPLICIT_DEF), AccReg);
420 PHI->getOperand(PHIOp + 1)});
421 }
else if (Opcode == PPC::PHI) {
426 "This PHI node should have already been changed.");
427 MachineInstr *PrimedAccPHI = ChangedPHIMap.
lookup(PHIInput);
430 PHI->getOperand(PHIOp + 1)});
440 AccReg =
MRI->createVirtualRegister(&PPC::ACCRCRegClass);
441 MachineInstrBuilder NewPHI =
BuildMI(
442 *
PHI->getParent(),
PHI,
PHI->getDebugLoc(),
TII->get(PPC::PHI), AccReg);
443 for (
auto RegMBB : PHIOps) {
444 NewPHI.
add(RegMBB.first).
add(RegMBB.second);
460bool PPCMIPeephole::simplifyCode() {
462 bool TrapOpt =
false;
463 MachineInstr* ToErase =
nullptr;
464 std::map<MachineInstr *, bool> TOCSaves;
466 NumFunctionsEnteredInMIPeephole++;
471 bool SomethingChanged =
false;
473 NumFixedPointIterations++;
474 SomethingChanged =
false;
475 for (MachineBasicBlock &
MBB : *MF) {
476 for (MachineInstr &
MI :
MBB) {
477 if (
MI.isDebugInstr())
483 SmallSet<Register, 4> RRToRIRegsToUpdate;
484 if (!
TII->convertToImmediateForm(
MI, RRToRIRegsToUpdate))
486 for (
Register R : RRToRIRegsToUpdate)
490 for (
const MachineOperand &MO :
MI.operands())
497 NumConvertedToImmediateForm++;
498 SomethingChanged =
true;
510 auto recomputeLVForDyingInstr = [&]() {
511 if (RegsToUpdate.
empty())
513 for (MachineOperand &MO : ToErase->
operands()) {
514 if (!MO.isReg() || !MO.isDef() || !RegsToUpdate.
count(MO.getReg()))
517 RegsToUpdate.
erase(RegToUpdate);
521 if (!
MRI->getUniqueVRegDef(RegToUpdate))
522 MO.setReg(PPC::NoRegister);
527 for (MachineBasicBlock &
MBB : *MF) {
528 for (MachineInstr &
MI :
MBB) {
535 recomputeLVForDyingInstr();
548 if (
MI.isDebugInstr())
555 switch (
MI.getOpcode()) {
562 if (!Src.isVirtual() || !Dst.isVirtual())
564 if (
MRI->getRegClass(Src) != &PPC::UACCRCRegClass ||
565 MRI->getRegClass(Dst) != &PPC::ACCRCRegClass)
577 MachineInstr *RootPHI =
MRI->getVRegDef(Src);
581 SmallVector<MachineInstr *, 4> PHIs;
582 if (!collectUnprimedAccPHIs(
MRI, RootPHI, PHIs))
585 convertUnprimedAccPHIs(
TII,
MRI, PHIs, Dst);
595 if (!
MI.getOperand(1).isImm() ||
MI.getOperand(1).getImm() != 0)
597 Register MIDestReg =
MI.getOperand(0).getReg();
599 for (MachineInstr&
UseMI :
MRI->use_instructions(MIDestReg))
600 Folded |=
TII->onlyFoldImmediate(
UseMI,
MI, MIDestReg);
601 if (
MRI->use_nodbg_empty(MIDestReg)) {
602 ++NumLoadImmZeroFoldedAndRemoved;
612 MachineFrameInfo &MFI = MF->getFrameInfo();
614 (!MF->getSubtarget<PPCSubtarget>().isELFv2ABI() &&
615 !MF->getSubtarget<PPCSubtarget>().isAIXABI()))
620 if (
TII->isTOCSaveMI(
MI))
621 UpdateTOCSaves(TOCSaves, &
MI);
624 case PPC::XXPERMDI: {
628 int Immed =
MI.getOperand(3).getImm();
640 TRI->lookThruCopyLike(
MI.getOperand(1).getReg(),
MRI);
642 TRI->lookThruCopyLike(
MI.getOperand(2).getReg(),
MRI);
644 if (!(TrueReg1 == TrueReg2 && TrueReg1.
isVirtual()))
647 MachineInstr *
DefMI =
MRI->getVRegDef(TrueReg1);
658 auto isConversionOfLoadAndSplat = [=]() ->
bool {
659 if (DefOpc != PPC::XVCVDPSXDS && DefOpc != PPC::XVCVDPUXDS)
664 MachineInstr *LoadMI =
MRI->getVRegDef(FeedReg1);
665 if (LoadMI && LoadMI->
getOpcode() == PPC::LXVDSX)
670 if ((Immed == 0 || Immed == 3) &&
671 (DefOpc == PPC::LXVDSX || isConversionOfLoadAndSplat())) {
673 "to load-and-splat/copy: ");
676 MI.getOperand(0).getReg())
677 .
add(
MI.getOperand(1));
685 if (DefOpc == PPC::XXPERMDI) {
693 if (DefReg1 != DefReg2) {
697 if (!(FeedReg1 == FeedReg2 && FeedReg1.
isVirtual()))
701 if (DefImmed == 0 || DefImmed == 3) {
706 MI.getOperand(0).getReg())
707 .
add(
MI.getOperand(1));
716 else if ((Immed == 0 || Immed == 3) && DefImmed == 2) {
721 MI.getOperand(1).setReg(DefReg1);
722 MI.getOperand(2).setReg(DefReg2);
723 MI.getOperand(3).setImm(3 - Immed);
731 else if (Immed == 2 && DefImmed == 2) {
737 MI.getOperand(0).getReg())
744 }
else if ((Immed == 0 || Immed == 3 || Immed == 2) &&
745 DefOpc == PPC::XXPERMDIs &&
757 MI.getOperand(0).getReg())
758 .
add(
MI.getOperand(1));
769 }
else if (Immed == 2 &&
770 (DefOpc == PPC::VSPLTB || DefOpc == PPC::VSPLTH ||
771 DefOpc == PPC::VSPLTW || DefOpc == PPC::XXSPLTW ||
772 DefOpc == PPC::VSPLTISB || DefOpc == PPC::VSPLTISH ||
773 DefOpc == PPC::VSPLTISW)) {
777 LLVM_DEBUG(
dbgs() <<
"Optimizing swap(vsplt(is)?[b|h|w]|xxspltw) => "
778 "copy(vsplt(is)?[b|h|w]|xxspltw): ");
781 MI.getOperand(0).getReg())
782 .
add(
MI.getOperand(1));
784 }
else if ((Immed == 0 || Immed == 3 || Immed == 2) &&
785 TII->isLoadFromConstantPool(
DefMI)) {
787 if (
C &&
C->getType()->isVectorTy() &&
C->getSplatValue()) {
791 <<
"Optimizing swap(splat pattern from constant-pool) "
792 "=> copy(splat pattern from constant-pool): ");
795 MI.getOperand(0).getReg())
796 .
add(
MI.getOperand(1));
805 unsigned MyOpcode =
MI.getOpcode();
807 unsigned OpNo = MyOpcode == PPC::XXSPLTW ? 1 : 2;
809 TRI->lookThruCopyLike(
MI.getOperand(OpNo).getReg(),
MRI);
812 MachineInstr *
DefMI =
MRI->getVRegDef(TrueReg);
816 auto isConvertOfSplat = [=]() ->
bool {
817 if (DefOpcode != PPC::XVCVSPSXWS && DefOpcode != PPC::XVCVSPUXWS)
822 MachineInstr *Splt =
MRI->getVRegDef(ConvReg);
823 return Splt && (Splt->
getOpcode() == PPC::LXVWSX ||
826 bool AlreadySplat = (MyOpcode == DefOpcode) ||
827 (MyOpcode == PPC::VSPLTB && DefOpcode == PPC::VSPLTBs) ||
828 (MyOpcode == PPC::VSPLTH && DefOpcode == PPC::VSPLTHs) ||
829 (MyOpcode == PPC::XXSPLTW && DefOpcode == PPC::XXSPLTWs) ||
830 (MyOpcode == PPC::XXSPLTW && DefOpcode == PPC::LXVWSX) ||
831 (MyOpcode == PPC::XXSPLTW && DefOpcode == PPC::MTVSRWS)||
832 (MyOpcode == PPC::XXSPLTW && isConvertOfSplat());
840 MI.getOperand(0).getReg())
841 .
add(
MI.getOperand(OpNo));
849 if (DefOpcode == PPC::XXSLDWI) {
871 unsigned SplatImmNo = MyOpcode == PPC::XXSPLTW ? 2 : 1;
872 unsigned SplatImm =
MI.getOperand(SplatImmNo).getImm();
878 auto CalculateNewElementIdx = [&](
unsigned Opcode) {
879 if (Opcode == PPC::VSPLTB)
880 return (SplatImm + ShiftImm * 4) & 0xF;
881 else if (Opcode == PPC::VSPLTH)
882 return (SplatImm + ShiftImm * 2) & 0x7;
884 return (SplatImm + ShiftImm) & 0x3;
887 unsigned NewElem = CalculateNewElementIdx(MyOpcode);
890 <<
" to " << NewElem <<
" in instruction: ");
894 MI.getOperand(OpNo).setReg(ShiftOp1);
895 MI.getOperand(SplatImmNo).setImm(NewElem);
900 case PPC::XVCVDPSP: {
903 TRI->lookThruCopyLike(
MI.getOperand(1).getReg(),
MRI);
906 MachineInstr *
DefMI =
MRI->getVRegDef(TrueReg);
917 MachineInstr *
P1 =
MRI->getVRegDef(DefsReg1);
918 MachineInstr *
P2 =
MRI->getVRegDef(DefsReg2);
926 auto removeFRSPIfPossible = [&](MachineInstr *RoundInstr) {
927 unsigned Opc = RoundInstr->getOpcode();
928 if ((
Opc == PPC::FRSP ||
Opc == PPC::XSRSP) &&
929 MRI->hasOneNonDBGUse(RoundInstr->getOperand(0).getReg())) {
931 Register ConvReg1 = RoundInstr->getOperand(1).getReg();
932 Register FRSPDefines = RoundInstr->getOperand(0).getReg();
933 MachineInstr &
Use = *(
MRI->use_instr_nodbg_begin(FRSPDefines));
934 for (
int i = 0, e =
Use.getNumOperands(); i < e; ++i)
935 if (
Use.getOperand(i).isReg() &&
936 Use.getOperand(i).getReg() == FRSPDefines)
937 Use.getOperand(i).setReg(ConvReg1);
946 ToErase = RoundInstr;
954 removeFRSPIfPossible(P1);
955 removeFRSPIfPossible(P2);
958 removeFRSPIfPossible(P1);
964 case PPC::EXTSH8_32_64: {
966 Register NarrowReg =
MI.getOperand(1).getReg();
970 MachineInstr *SrcMI =
MRI->getVRegDef(NarrowReg);
974 if (SrcOpcode == PPC::LHZ || SrcOpcode == PPC::LHZX) {
981 unsigned Opc = PPC::LHA;
982 bool SourceIsXForm = SrcOpcode == PPC::LHZX;
983 bool MIIs64Bit =
MI.getOpcode() == PPC::EXTSH8 ||
984 MI.getOpcode() == PPC::EXTSH8_32_64;
986 if (SourceIsXForm && MIIs64Bit)
988 else if (SourceIsXForm && !MIIs64Bit)
999 addDummyDef(
MBB, &
MI, NarrowReg);
1009 NumEliminatedSExt++;
1015 case PPC::EXTSW_32_64: {
1017 Register NarrowReg =
MI.getOperand(1).getReg();
1021 MachineInstr *SrcMI =
MRI->getVRegDef(NarrowReg);
1022 unsigned SrcOpcode = SrcMI->
getOpcode();
1025 if (SrcOpcode == PPC::LWZ || SrcOpcode == PPC::LWZX) {
1033 bool IsWordAligned =
false;
1035 const GlobalVariable *GV =
1039 IsWordAligned =
true;
1043 IsWordAligned =
true;
1050 unsigned Opc = PPC::LWA_32;
1051 bool SourceIsXForm = SrcOpcode == PPC::LWZX;
1052 bool MIIs64Bit =
MI.getOpcode() == PPC::EXTSW ||
1053 MI.getOpcode() == PPC::EXTSW_32_64;
1055 if (SourceIsXForm && MIIs64Bit)
1057 else if (SourceIsXForm && !MIIs64Bit)
1062 if (!IsWordAligned && (
Opc == PPC::LWA ||
Opc == PPC::LWA_32))
1071 addDummyDef(
MBB, &
MI, NarrowReg);
1081 NumEliminatedSExt++;
1082 }
else if (
MI.getOpcode() == PPC::EXTSW_32_64 &&
1083 TII->isSignExtended(NarrowReg,
MRI)) {
1093 TII->promoteInstr32To64ForElimEXTSW(NarrowReg,
MRI, 0, LV);
1097 MF->getRegInfo().createVirtualRegister(&PPC::G8RCRegClass);
1101 MI.getOperand(0).getReg())
1107 NumEliminatedSExt++;
1120 if (
MI.getOperand(2).getImm() != 0)
1127 MachineInstr *SrcMI =
MRI->getVRegDef(SrcReg);
1128 if (!(SrcMI && SrcMI->
getOpcode() == PPC::INSERT_SUBREG &&
1132 MachineInstr *ImpDefMI, *SubRegMI;
1135 if (ImpDefMI->
getOpcode() != PPC::IMPLICIT_DEF)
break;
1138 if (SubRegMI->
getOpcode() == PPC::COPY) {
1141 SrcMI =
MRI->getVRegDef(CopyReg);
1146 unsigned KnownZeroCount =
1148 if (
MI.getOperand(3).getImm() <= KnownZeroCount) {
1151 MI.getOperand(0).getReg())
1156 NumEliminatedZExt++;
1167 auto isSingleUsePHI = [&](MachineOperand *PhiOp) {
1168 assert(PhiOp &&
"Invalid Operand!");
1169 MachineInstr *DefPhiMI = getVRegDefOrNull(PhiOp,
MRI);
1171 return DefPhiMI && (DefPhiMI->
getOpcode() == PPC::PHI) &&
1175 auto dominatesAllSingleUseLIs = [&](MachineOperand *DominatorOp,
1176 MachineOperand *PhiOp) {
1177 assert(PhiOp &&
"Invalid Operand!");
1178 assert(DominatorOp &&
"Invalid Operand!");
1179 MachineInstr *DefPhiMI = getVRegDefOrNull(PhiOp,
MRI);
1180 MachineInstr *DefDomMI = getVRegDefOrNull(DominatorOp,
MRI);
1185 MachineInstr *LiMI =
1197 MachineOperand Op1 =
MI.getOperand(1);
1198 MachineOperand Op2 =
MI.getOperand(2);
1199 if (isSingleUsePHI(&Op2) && dominatesAllSingleUseLIs(&Op1, &Op2))
1201 else if (!isSingleUsePHI(&Op1) || !dominatesAllSingleUseLIs(&Op2, &Op1))
1207 const TargetRegisterClass *TRC =
MI.getOpcode() == PPC::ADD8
1208 ? &PPC::G8RC_and_G8RC_NOX0RegClass
1209 : &PPC::GPRC_and_GPRC_NOR0RegClass;
1210 MRI->setRegClass(DominatorReg, TRC);
1213 MachineInstr *DefPhiMI = getVRegDefOrNull(&Op1,
MRI);
1215 MachineInstr *LiMI = getVRegDefOrNull(&DefPhiMI->
getOperand(i),
MRI);
1233 .addReg(DominatorReg)
1242 MI.getOperand(0).getReg())
1252 Simplified |= emitRLDICWhenLoweringJumpTables(
MI, ToErase) ||
1253 combineSEXTAndSHL(
MI, ToErase);
1257 case PPC::ANDI8_rec:
1258 case PPC::ANDIS_rec:
1259 case PPC::ANDIS8_rec: {
1261 TRI->lookThruCopyLike(
MI.getOperand(1).getReg(),
MRI);
1262 if (!TrueReg.
isVirtual() || !
MRI->hasOneNonDBGUse(TrueReg))
1265 MachineInstr *SrcMI =
MRI->getVRegDef(TrueReg);
1269 unsigned SrcOpCode = SrcMI->
getOpcode();
1270 if (SrcOpCode != PPC::RLDICL && SrcOpCode != PPC::RLDICR)
1275 DstReg =
MI.getOperand(1).getReg();
1276 const TargetRegisterClass *SrcRC =
MRI->getRegClassOrNull(SrcReg);
1277 const TargetRegisterClass *DstRC =
MRI->getRegClassOrNull(DstReg);
1281 uint64_t AndImm =
MI.getOperand(2).getImm();
1282 if (
MI.getOpcode() == PPC::ANDIS_rec ||
1283 MI.getOpcode() == PPC::ANDIS8_rec)
1291 bool PatternResultZero =
1292 (SrcOpCode == PPC::RLDICL && (RZeroAndImm + ImmSrc > 63)) ||
1293 (SrcOpCode == PPC::RLDICR && LZeroAndImm > ImmSrc);
1297 bool PatternRemoveRotate =
1299 ((SrcOpCode == PPC::RLDICL && LZeroAndImm >= ImmSrc) ||
1300 (SrcOpCode == PPC::RLDICR && (RZeroAndImm + ImmSrc > 63)));
1302 if (!PatternResultZero && !PatternRemoveRotate)
1308 if (PatternResultZero)
1309 MI.getOperand(2).setImm(0);
1319 case PPC::RLWINM_rec:
1321 case PPC::RLWINM8_rec: {
1324 Register OrigOp1Reg =
MI.getOperand(1).isReg()
1325 ?
MI.getOperand(1).getReg()
1330 if (
MI.getOperand(1).isReg())
1336 ++NumRotatesCollapsed;
1347 MachineInstr *LiMI1 = getVRegDefOrNull(&
MI.getOperand(1),
MRI);
1348 MachineInstr *LiMI2 = getVRegDefOrNull(&
MI.getOperand(2),
MRI);
1349 bool IsOperand2Immediate =
MI.getOperand(2).isImm();
1352 if (!(LiMI1 && (LiMI1->
getOpcode() == PPC::LI ||
1355 if (!IsOperand2Immediate &&
1356 !(LiMI2 && (LiMI2->
getOpcode() == PPC::LI ||
1360 auto ImmOperand0 =
MI.getOperand(0).getImm();
1362 auto ImmOperand2 = IsOperand2Immediate ?
MI.getOperand(2).getImm()
1367 if ((ImmOperand0 == 31) ||
1368 ((ImmOperand0 & 0x10) &&
1369 ((int64_t)ImmOperand1 < (int64_t)ImmOperand2)) ||
1370 ((ImmOperand0 & 0x8) &&
1371 ((int64_t)ImmOperand1 > (int64_t)ImmOperand2)) ||
1372 ((ImmOperand0 & 0x2) &&
1373 ((uint64_t)ImmOperand1 < (uint64_t)ImmOperand2)) ||
1374 ((ImmOperand0 & 0x1) &&
1375 ((uint64_t)ImmOperand1 > (uint64_t)ImmOperand2)) ||
1376 ((ImmOperand0 & 0x4) && (ImmOperand1 == ImmOperand2))) {
1391 recomputeLVForDyingInstr();
1401 Simplified |= eliminateRedundantTOCSaves(TOCSaves);
1402 PPCFunctionInfo *FI = MF->getInfo<PPCFunctionInfo>();
1404 NumTOCSavesInPrologue++;
1413 if (!
MRI->reg_empty(
Reg))
1420static bool isEqOrNe(MachineInstr *BI) {
1426static bool isSupportedCmpOp(
unsigned opCode) {
1427 return (opCode == PPC::CMPLD || opCode == PPC::CMPD ||
1428 opCode == PPC::CMPLW || opCode == PPC::CMPW ||
1429 opCode == PPC::CMPLDI || opCode == PPC::CMPDI ||
1430 opCode == PPC::CMPLWI || opCode == PPC::CMPWI);
1433static bool is64bitCmpOp(
unsigned opCode) {
1434 return (opCode == PPC::CMPLD || opCode == PPC::CMPD ||
1435 opCode == PPC::CMPLDI || opCode == PPC::CMPDI);
1438static bool isSignedCmpOp(
unsigned opCode) {
1439 return (opCode == PPC::CMPD || opCode == PPC::CMPW ||
1440 opCode == PPC::CMPDI || opCode == PPC::CMPWI);
1443static unsigned getSignedCmpOpCode(
unsigned opCode) {
1444 if (opCode == PPC::CMPLD)
return PPC::CMPD;
1445 if (opCode == PPC::CMPLW)
return PPC::CMPW;
1446 if (opCode == PPC::CMPLDI)
return PPC::CMPDI;
1447 if (opCode == PPC::CMPLWI)
return PPC::CMPWI;
1453static unsigned getPredicateToDecImm(MachineInstr *BI, MachineInstr *CMPI) {
1455 bool SignedCmp = isSignedCmpOp(CMPI->
getOpcode());
1456 if ((!SignedCmp && Imm == 0) || (SignedCmp && Imm == 0x8000))
1472static unsigned getPredicateToIncImm(MachineInstr *BI, MachineInstr *CMPI) {
1474 bool SignedCmp = isSignedCmpOp(CMPI->
getOpcode());
1475 if ((!SignedCmp && Imm == 0xFFFF) || (SignedCmp && Imm == 0x7FFF))
1490static unsigned getIncomingRegForBlock(MachineInstr *Phi,
1491 MachineBasicBlock *
MBB) {
1492 for (
unsigned I = 2,
E =
Phi->getNumOperands() + 1;
I !=
E;
I += 2) {
1493 MachineOperand &MO =
Phi->getOperand(
I);
1495 return Phi->getOperand(
I-1).getReg();
1504static unsigned getSrcVReg(
unsigned Reg, MachineBasicBlock *BB1,
1505 MachineBasicBlock *BB2, MachineRegisterInfo *
MRI) {
1506 unsigned SrcReg =
Reg;
1508 unsigned NextReg = SrcReg;
1509 MachineInstr *Inst =
MRI->getVRegDef(SrcReg);
1511 NextReg = getIncomingRegForBlock(Inst, BB1);
1517 if (NextReg == SrcReg || !Register::isVirtualRegister(NextReg))
1524static bool eligibleForCompareElimination(MachineBasicBlock &
MBB,
1525 MachineBasicBlock *&PredMBB,
1526 MachineBasicBlock *&MBBtoMoveCmp,
1527 MachineRegisterInfo *
MRI) {
1529 auto isEligibleBB = [&](MachineBasicBlock &BB) {
1530 auto BII = BB.getFirstInstrTerminator();
1534 if (BB.succ_size() == 2 &&
1535 BII != BB.instr_end() &&
1536 (*BII).getOpcode() == PPC::BCC &&
1537 (*BII).getOperand(1).isReg()) {
1539 Register CndReg = (*BII).getOperand(1).getReg();
1540 if (!CndReg.
isVirtual() || !
MRI->hasOneNonDBGUse(CndReg))
1543 MachineInstr *CMPI =
MRI->getVRegDef(CndReg);
1549 for (MachineOperand &MO : CMPI->
operands())
1562 auto isEligibleForMoveCmp = [](MachineBasicBlock &BB) {
1563 return BB.succ_size() == 1;
1566 if (!isEligibleBB(
MBB))
1570 if (NumPredBBs == 1) {
1572 if (isEligibleBB(*TmpMBB)) {
1574 MBBtoMoveCmp =
nullptr;
1578 else if (NumPredBBs == 2) {
1583 MachineBasicBlock *Pred1MBB = *PI;
1584 MachineBasicBlock *Pred2MBB = *(PI+1);
1586 if (isEligibleBB(*Pred1MBB) && isEligibleForMoveCmp(*Pred2MBB)) {
1591 else if (isEligibleBB(*Pred2MBB) && isEligibleForMoveCmp(*Pred1MBB)) {
1597 if (Pred1MBB == &
MBB)
1605 for (
int I = 1;
I <= 2;
I++)
1613 MBBtoMoveCmp = Pred2MBB;
1624bool PPCMIPeephole::eliminateRedundantTOCSaves(
1625 std::map<MachineInstr *, bool> &TOCSaves) {
1628 for (
auto TOCSave : TOCSaves) {
1629 if (!TOCSave.second) {
1630 TOCSave.first->eraseFromParent();
1666bool PPCMIPeephole::eliminateRedundantCompare() {
1669 for (MachineBasicBlock &MBB2 : *MF) {
1670 MachineBasicBlock *MBB1 =
nullptr, *MBBtoMoveCmp =
nullptr;
1699 if (!eligibleForCompareElimination(MBB2, MBB1, MBBtoMoveCmp,
MRI))
1705 MachineInstr *BI2 = &*MBB2.getFirstInstrTerminator();
1707 bool IsPartiallyRedundant = (MBBtoMoveCmp !=
nullptr);
1711 if (!isSupportedCmpOp(CMPI1->
getOpcode()) ||
1712 !isSupportedCmpOp(CMPI2->
getOpcode()) ||
1716 unsigned NewOpCode = 0;
1717 unsigned NewPredicate1 = 0, NewPredicate2 = 0;
1719 bool SwapOperands =
false;
1730 auto CmpAgainstImmWithSignBit = [](MachineInstr *
I) {
1731 if (!
I->getOperand(2).isImm())
1733 int16_t
Imm = (int16_t)
I->getOperand(2).getImm();
1737 if (isEqOrNe(BI2) && !CmpAgainstImmWithSignBit(CMPI2) &&
1740 else if (isEqOrNe(BI1) && !CmpAgainstImmWithSignBit(CMPI1) &&
1750 nullptr,
nullptr,
MRI);
1752 nullptr,
nullptr,
MRI);
1758 if (Cmp1Operand1 == Cmp2Operand1 && Cmp1Operand2 == Cmp2Operand2) {
1761 else if (Cmp1Operand1 == Cmp2Operand2 && Cmp1Operand2 == Cmp2Operand1) {
1768 SwapOperands =
true;
1776 nullptr,
nullptr,
MRI);
1779 if (Cmp1Operand1 != Cmp2Operand1)
1787 if (Imm1 != Imm2 && (!isEqOrNe(BI2) || !isEqOrNe(BI1))) {
1788 int Diff = Imm1 - Imm2;
1789 if (Diff < -2 || Diff > 2)
1792 unsigned PredToInc1 = getPredicateToIncImm(BI1, CMPI1);
1793 unsigned PredToDec1 = getPredicateToDecImm(BI1, CMPI1);
1794 unsigned PredToInc2 = getPredicateToIncImm(BI2, CMPI2);
1795 unsigned PredToDec2 = getPredicateToDecImm(BI2, CMPI2);
1797 if (PredToInc2 && PredToDec1) {
1798 NewPredicate2 = PredToInc2;
1799 NewPredicate1 = PredToDec1;
1804 else if (Diff == 1) {
1807 NewPredicate2 = PredToInc2;
1809 else if (PredToDec1) {
1811 NewPredicate1 = PredToDec1;
1814 else if (Diff == -1) {
1817 NewPredicate2 = PredToDec2;
1819 else if (PredToInc1) {
1821 NewPredicate1 = PredToInc1;
1824 else if (Diff == -2) {
1825 if (PredToDec2 && PredToInc1) {
1826 NewPredicate2 = PredToDec2;
1827 NewPredicate1 = PredToInc1;
1839 LLVM_DEBUG(
dbgs() <<
"Optimize two pairs of compare and branch:\n");
1844 for (
const MachineOperand &MO : CMPI1->
operands())
1847 for (
const MachineOperand &MO : CMPI2->
operands())
1852 if (NewOpCode != 0 && NewOpCode != CMPI1->
getOpcode()) {
1855 if (NewPredicate1) {
1858 if (NewPredicate2) {
1865 if (IsPartiallyRedundant) {
1877 for (
int I = 1;
I <= 2;
I++) {
1884 "We cannot support if an operand comes from this BB.");
1885 unsigned SrcReg = getIncomingRegForBlock(Inst, MBBtoMoveCmp);
1894 Register NewVReg =
MRI->createVirtualRegister(&PPC::CRRCRegClass);
1896 TII->get(PPC::PHI), NewVReg)
1919 if (IsPartiallyRedundant) {
1922 <<
" to handle partial redundancy.\n");
1934bool PPCMIPeephole::emitRLDICWhenLoweringJumpTables(MachineInstr &
MI,
1935 MachineInstr *&ToErase) {
1936 if (
MI.getOpcode() != PPC::RLDICR)
1943 MachineInstr *SrcMI =
MRI->getVRegDef(SrcReg);
1947 MachineOperand MOpSHSrc = SrcMI->
getOperand(2);
1948 MachineOperand MOpMBSrc = SrcMI->
getOperand(3);
1949 MachineOperand MOpSHMI =
MI.getOperand(2);
1950 MachineOperand MOpMEMI =
MI.getOperand(3);
1955 uint64_t SHSrc = MOpSHSrc.
getImm();
1956 uint64_t MBSrc = MOpMBSrc.
getImm();
1957 uint64_t SHMI = MOpSHMI.
getImm();
1958 uint64_t MEMI = MOpMEMI.
getImm();
1959 uint64_t NewSH = SHSrc + SHMI;
1960 uint64_t NewMB = MBSrc - SHMI;
1961 if (NewMB > 63 || NewSH > 63)
1970 if ((63 - NewSH) != MEMI)
1977 MI.setDesc(
TII->get(PPC::RLDIC));
1979 MI.getOperand(2).setImm(NewSH);
1980 MI.getOperand(3).setImm(NewMB);
1986 NumRotatesCollapsed++;
1988 if (
MRI->use_nodbg_empty(SrcReg)) {
1990 "Not expecting an implicit def with this instr.");
2007bool PPCMIPeephole::combineSEXTAndSHL(MachineInstr &
MI,
2008 MachineInstr *&ToErase) {
2009 if (
MI.getOpcode() != PPC::RLDICR)
2012 if (!MF->getSubtarget<PPCSubtarget>().isISA3_0())
2015 assert(
MI.getNumOperands() == 4 &&
"RLDICR should have 4 operands");
2017 MachineOperand MOpSHMI =
MI.getOperand(2);
2018 MachineOperand MOpMEMI =
MI.getOperand(3);
2022 uint64_t SHMI = MOpSHMI.
getImm();
2023 uint64_t MEMI = MOpMEMI.
getImm();
2024 if (SHMI + MEMI != 63)
2031 MachineInstr *SrcMI =
MRI->getVRegDef(SrcReg);
2038 if (!
MRI->hasOneNonDBGUse(SrcReg))
2043 "EXTSW's second operand should be a register");
2051 MachineInstr *NewInstr =
2053 SrcMI->
getOpcode() == PPC::EXTSW ?
TII->get(PPC::EXTSWSLI)
2054 :
TII->get(PPC::EXTSWSLI_32_64),
2055 MI.getOperand(0).getReg())
2062 ++NumEXTSWAndSLDICombined;
2075 "PowerPC MI Peephole Optimization",
false,
false)
2083char PPCMIPeephole::
ID = 0;
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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)
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
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
LLVM_ABI void recomputeForSingleDefVirtReg(Register Reg)
Recompute liveness from scratch for a virtual register Reg that is known to have a single def that do...
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 eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
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
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,...
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
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< InstrNode * > Instr
NodeAddr< PhiNode * > Phi
NodeAddr< UseNode * > Use
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
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.
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()
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.