35 #define GET_INSTRMAP_INFO
36 #define GET_INSTRINFO_CTOR_DTOR
37 #include "PPCGenInstrInfo.inc"
43 cl::desc(
"Disable analysis for CTR loops"));
49 void PPCInstrInfo::anchor() {}
53 TM(tm), RI(*
TM.getSubtargetImpl()) {}
90 unsigned &SrcReg,
unsigned &DstReg,
91 unsigned &SubIdx)
const {
93 default:
return false;
95 case PPC::EXTSW_32_64:
112 case PPC::RESTORE_CR:
114 case PPC::RESTORE_VRSAVE:
138 case PPC::SPILL_VRSAVE:
179 bool ChangeReg0 =
false;
185 "Expecting a two-address instruction!");
203 .addImm((MB-1) & 31);
222 BuildMI(MBB, MI, DL,
get(PPC::NOP));
232 bool AllowModify)
const {
237 if (I == MBB.
begin())
240 while (I->isDebugValue()) {
241 if (I == MBB.
begin())
258 }
else if (LastInst->
getOpcode() == PPC::BCC) {
266 }
else if (LastInst->
getOpcode() == PPC::BDNZ8 ||
277 }
else if (LastInst->
getOpcode() == PPC::BDZ8 ||
298 if (SecondLastInst && I != MBB.
begin() &&
303 if (SecondLastInst->
getOpcode() == PPC::BCC &&
313 }
else if ((SecondLastInst->
getOpcode() == PPC::BDNZ8 ||
327 }
else if ((SecondLastInst->
getOpcode() == PPC::BDZ8 ||
345 if (SecondLastInst->
getOpcode() == PPC::B &&
362 if (I == MBB.
begin())
return 0;
364 while (I->isDebugValue()) {
365 if (I == MBB.
begin())
369 if (I->getOpcode() != PPC::B && I->getOpcode() != PPC::BCC &&
370 I->getOpcode() != PPC::BDNZ8 && I->getOpcode() !=
PPC::BDNZ &&
371 I->getOpcode() != PPC::BDZ8 && I->getOpcode() !=
PPC::BDZ)
375 I->eraseFromParent();
379 if (I == MBB.
begin())
return 1;
381 if (I->getOpcode() != PPC::BCC &&
382 I->getOpcode() != PPC::BDNZ8 && I->getOpcode() !=
PPC::BDNZ &&
383 I->getOpcode() != PPC::BDZ8 && I->getOpcode() !=
PPC::BDZ)
387 I->eraseFromParent();
397 assert(TBB &&
"InsertBranch must not be told to insert a fallthrough");
398 assert((Cond.
size() == 2 || Cond.
size() == 0) &&
399 "PPC branch conditions have two components!");
406 BuildMI(&MBB, DL,
get(PPC::B)).addMBB(TBB);
407 else if (Cond[1].
getReg() == PPC::CTR || Cond[1].getReg() == PPC::CTR8)
408 BuildMI(&MBB, DL,
get(Cond[0].getImm() ?
410 (isPPC64 ? PPC::BDZ8 :
PPC::BDZ))).addMBB(TBB);
412 BuildMI(&MBB, DL,
get(PPC::BCC))
418 if (Cond[1].
getReg() == PPC::CTR || Cond[1].
getReg() == PPC::CTR8)
419 BuildMI(&MBB, DL,
get(Cond[0].getImm() ?
423 BuildMI(&MBB, DL,
get(PPC::BCC))
432 unsigned TrueReg,
unsigned FalseReg,
433 int &CondCycles,
int &TrueCycles,
int &FalseCycles)
const {
437 if (Cond.
size() != 2)
442 if (Cond[1].
getReg() == PPC::CTR || Cond[1].getReg() == PPC::CTR8)
453 if (!PPC::GPRCRegClass.hasSubClassEq(RC) &&
454 !PPC::GPRC_NOR0RegClass.hasSubClassEq(RC) &&
455 !PPC::G8RCRegClass.hasSubClassEq(RC) &&
456 !PPC::G8RC_NOX0RegClass.hasSubClassEq(RC))
474 unsigned TrueReg,
unsigned FalseReg)
const {
475 assert(Cond.
size() == 2 &&
476 "PPC branch conditions have two components!");
479 "Cannot insert select on target without ISEL support");
484 RI.getCommonSubClass(MRI.getRegClass(TrueReg), MRI.getRegClass(FalseReg));
485 assert(RC &&
"TrueReg and FalseReg must have overlapping register classes");
487 bool Is64Bit = PPC::G8RCRegClass.hasSubClassEq(RC) ||
488 PPC::G8RC_NOX0RegClass.hasSubClassEq(RC);
490 PPC::GPRCRegClass.hasSubClassEq(RC) ||
491 PPC::GPRC_NOR0RegClass.hasSubClassEq(RC)) &&
492 "isel is for regular integer GPRs only");
494 unsigned OpCode = Is64Bit ? PPC::ISEL8 : PPC::ISEL;
495 unsigned SelectPred = Cond[0].getImm();
499 switch (SelectPred) {
501 case PPC::PRED_EQ: SubIdx = PPC::sub_eq; SwapOps =
false;
break;
502 case PPC::PRED_NE: SubIdx = PPC::sub_eq; SwapOps =
true;
break;
503 case PPC::PRED_LT: SubIdx = PPC::sub_lt; SwapOps =
false;
break;
504 case PPC::PRED_GE: SubIdx = PPC::sub_lt; SwapOps =
true;
break;
505 case PPC::PRED_GT: SubIdx = PPC::sub_gt; SwapOps =
false;
break;
506 case PPC::PRED_LE: SubIdx = PPC::sub_gt; SwapOps =
true;
break;
507 case PPC::PRED_UN: SubIdx = PPC::sub_un; SwapOps =
false;
break;
508 case PPC::PRED_NU: SubIdx = PPC::sub_un; SwapOps =
true;
break;
511 unsigned FirstReg = SwapOps ? FalseReg : TrueReg,
512 SecondReg = SwapOps ? TrueReg : FalseReg;
517 if (MRI.getRegClass(FirstReg)->contains(PPC::R0) ||
518 MRI.getRegClass(FirstReg)->contains(PPC::X0)) {
520 MRI.getRegClass(FirstReg)->
contains(PPC::X0) ?
521 &PPC::G8RC_NOX0RegClass : &PPC::GPRC_NOR0RegClass;
522 unsigned OldFirstReg = FirstReg;
523 FirstReg = MRI.createVirtualRegister(FirstRC);
528 BuildMI(MBB, MI, dl,
get(OpCode), DestReg)
535 unsigned DestReg,
unsigned SrcReg,
536 bool KillSrc)
const {
538 if (PPC::GPRCRegClass.contains(DestReg, SrcReg))
540 else if (PPC::G8RCRegClass.contains(DestReg, SrcReg))
542 else if (PPC::F4RCRegClass.contains(DestReg, SrcReg))
544 else if (PPC::CRRCRegClass.contains(DestReg, SrcReg))
546 else if (PPC::VRRCRegClass.contains(DestReg, SrcReg))
548 else if (PPC::CRBITRCRegClass.contains(DestReg, SrcReg))
555 BuildMI(MBB, I, DL, MCID, DestReg)
564 unsigned SrcReg,
bool isKill,
568 bool &NonRI,
bool &SpillsVRS)
const{
573 if (PPC::GPRCRegClass.hasSubClassEq(RC)) {
578 }
else if (PPC::G8RCRegClass.hasSubClassEq(RC)) {
583 }
else if (PPC::F8RCRegClass.hasSubClassEq(RC)) {
588 }
else if (PPC::F4RCRegClass.hasSubClassEq(RC)) {
593 }
else if (PPC::CRRCRegClass.hasSubClassEq(RC)) {
599 }
else if (PPC::CRBITRCRegClass.hasSubClassEq(RC)) {
605 if (SrcReg == PPC::CR0LT || SrcReg == PPC::CR0GT ||
606 SrcReg == PPC::CR0EQ || SrcReg == PPC::CR0UN)
608 else if (SrcReg == PPC::CR1LT || SrcReg == PPC::CR1GT ||
609 SrcReg == PPC::CR1EQ || SrcReg == PPC::CR1UN)
611 else if (SrcReg == PPC::CR2LT || SrcReg == PPC::CR2GT ||
612 SrcReg == PPC::CR2EQ || SrcReg == PPC::CR2UN)
614 else if (SrcReg == PPC::CR3LT || SrcReg == PPC::CR3GT ||
615 SrcReg == PPC::CR3EQ || SrcReg == PPC::CR3UN)
617 else if (SrcReg == PPC::CR4LT || SrcReg == PPC::CR4GT ||
618 SrcReg == PPC::CR4EQ || SrcReg == PPC::CR4UN)
620 else if (SrcReg == PPC::CR5LT || SrcReg == PPC::CR5GT ||
621 SrcReg == PPC::CR5EQ || SrcReg == PPC::CR5UN)
623 else if (SrcReg == PPC::CR6LT || SrcReg == PPC::CR6GT ||
624 SrcReg == PPC::CR6EQ || SrcReg == PPC::CR6UN)
626 else if (SrcReg == PPC::CR7LT || SrcReg == PPC::CR7GT ||
627 SrcReg == PPC::CR7EQ || SrcReg == PPC::CR7UN)
630 return StoreRegToStackSlot(MF, Reg, isKill, FrameIdx,
631 &PPC::CRRCRegClass, NewMIs, NonRI, SpillsVRS);
633 }
else if (PPC::VRRCRegClass.hasSubClassEq(RC)) {
639 }
else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) {
641 "VRSAVE only needs spill/restore on Darwin");
657 unsigned SrcReg,
bool isKill,
int FrameIdx,
666 bool NonRI =
false, SpillsVRS =
false;
667 if (StoreRegToStackSlot(MF, SrcReg, isKill, FrameIdx, RC, NewMIs,
677 for (
unsigned i = 0, e = NewMIs.
size(); i != e; ++i)
678 MBB.
insert(MI, NewMIs[i]);
691 unsigned DestReg,
int FrameIdx,
694 bool &NonRI,
bool &SpillsVRS)
const{
698 if (PPC::GPRCRegClass.hasSubClassEq(RC)) {
700 DestReg), FrameIdx));
701 }
else if (PPC::G8RCRegClass.hasSubClassEq(RC)) {
704 }
else if (PPC::F8RCRegClass.hasSubClassEq(RC)) {
707 }
else if (PPC::F4RCRegClass.hasSubClassEq(RC)) {
710 }
else if (PPC::CRRCRegClass.hasSubClassEq(RC)) {
712 get(PPC::RESTORE_CR), DestReg),
715 }
else if (PPC::CRBITRCRegClass.hasSubClassEq(RC)) {
718 if (DestReg == PPC::CR0LT || DestReg == PPC::CR0GT ||
719 DestReg == PPC::CR0EQ || DestReg == PPC::CR0UN)
721 else if (DestReg == PPC::CR1LT || DestReg == PPC::CR1GT ||
722 DestReg == PPC::CR1EQ || DestReg == PPC::CR1UN)
724 else if (DestReg == PPC::CR2LT || DestReg == PPC::CR2GT ||
725 DestReg == PPC::CR2EQ || DestReg == PPC::CR2UN)
727 else if (DestReg == PPC::CR3LT || DestReg == PPC::CR3GT ||
728 DestReg == PPC::CR3EQ || DestReg == PPC::CR3UN)
730 else if (DestReg == PPC::CR4LT || DestReg == PPC::CR4GT ||
731 DestReg == PPC::CR4EQ || DestReg == PPC::CR4UN)
733 else if (DestReg == PPC::CR5LT || DestReg == PPC::CR5GT ||
734 DestReg == PPC::CR5EQ || DestReg == PPC::CR5UN)
736 else if (DestReg == PPC::CR6LT || DestReg == PPC::CR6GT ||
737 DestReg == PPC::CR6EQ || DestReg == PPC::CR6UN)
739 else if (DestReg == PPC::CR7LT || DestReg == PPC::CR7GT ||
740 DestReg == PPC::CR7EQ || DestReg == PPC::CR7UN)
743 return LoadRegFromStackSlot(MF, DL, Reg, FrameIdx,
744 &PPC::CRRCRegClass, NewMIs, NonRI, SpillsVRS);
746 }
else if (PPC::VRRCRegClass.hasSubClassEq(RC)) {
750 }
else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) {
752 "VRSAVE only needs spill/restore on Darwin");
754 get(PPC::RESTORE_VRSAVE),
768 unsigned DestReg,
int FrameIdx,
774 if (MI != MBB.
end()) DL = MI->getDebugLoc();
779 bool NonRI =
false, SpillsVRS =
false;
780 if (LoadRegFromStackSlot(MF, DL, DestReg, FrameIdx, RC, NewMIs,
790 for (
unsigned i = 0, e = NewMIs.
size(); i != e; ++i)
791 MBB.
insert(MI, NewMIs[i]);
804 assert(Cond.
size() == 2 &&
"Invalid PPC branch opcode!");
805 if (Cond[1].
getReg() == PPC::CTR8 || Cond[1].getReg() == PPC::CTR)
806 Cond[0].setImm(Cond[0].getImm() == 0 ? 1 : 0);
818 if (DefOpc !=
PPC::LI && DefOpc != PPC::LI8)
841 assert(UseIdx < UseMI->getNumOperands() &&
"Cannot find Reg in UseMI");
842 assert(UseIdx < UseMCID.
getNumOperands() &&
"No operand description for Reg");
848 if (UseInfo->isLookupPtrRegClass()) {
849 if (UseInfo->RegClass != 1)
852 if (UseInfo->RegClass != PPC::GPRC_NOR0RegClassID &&
853 UseInfo->RegClass != PPC::G8RC_NOX0RegClassID)
860 if (UseInfo->Constraints != 0)
864 if (UseInfo->isLookupPtrRegClass()) {
866 ZeroReg = isPPC64 ? PPC::ZERO8 : PPC::ZERO;
868 ZeroReg = UseInfo->RegClass == PPC::G8RC_NOX0RegClassID ?
869 PPC::ZERO8 : PPC::ZERO;
884 if (
I->definesRegister(PPC::CTR) ||
I->definesRegister(PPC::CTR8))
896 unsigned NumT,
unsigned ExtraT,
898 unsigned NumF,
unsigned ExtraF,
930 if (OpC == PPC::BLR) {
931 if (Pred[1].
getReg() == PPC::CTR8 || Pred[1].
getReg() == PPC::CTR) {
933 MI->
setDesc(
get(Pred[0].getImm() ?
934 (isPPC64 ? PPC::BDNZLR8 : PPC::BDNZLR) :
935 (isPPC64 ? PPC::BDZLR8 : PPC::BDZLR)));
939 .addImm(Pred[0].getImm())
940 .addReg(Pred[1].
getReg());
944 }
else if (OpC == PPC::B) {
945 if (Pred[1].
getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) {
947 MI->
setDesc(
get(Pred[0].getImm() ?
956 .addImm(Pred[0].getImm())
962 }
else if (OpC == PPC::BCTR || OpC == PPC::BCTR8 ||
964 if (Pred[1].
getReg() == PPC::CTR8 || Pred[1].
getReg() == PPC::CTR)
967 bool setLR = OpC ==
PPC::BCTRL || OpC == PPC::BCTRL8;
969 MI->
setDesc(
get(isPPC64 ? (setLR ? PPC::BCCTRL8 : PPC::BCCTR8) :
970 (setLR ? PPC::BCCTRL : PPC::BCCTR)));
972 .addImm(Pred[0].getImm())
973 .addReg(Pred[1].
getReg());
983 assert(Pred1.
size() == 2 &&
"Invalid PPC first predicate");
984 assert(Pred2.
size() == 2 &&
"Invalid PPC second predicate");
986 if (Pred1[1].
getReg() == PPC::CTR8 || Pred1[1].getReg() == PPC::CTR)
988 if (Pred2[1].
getReg() == PPC::CTR8 || Pred2[1].getReg() == PPC::CTR)
1009 std::vector<MachineOperand> &Pred)
const {
1017 { &PPC::CRRCRegClass, &PPC::CRBITRCRegClass,
1018 &PPC::CTRRCRegClass, &PPC::CTRRC8RegClass };
1060 unsigned &SrcReg,
unsigned &SrcReg2,
1061 int &Mask,
int &
Value)
const {
1065 default:
return false;
1088 unsigned SrcReg,
unsigned SrcReg2,
1089 int Mask,
int Value,
1099 if (OpC == PPC::FCMPUS || OpC == PPC::FCMPUD)
1111 bool is32BitSignedCompare = OpC == PPC::CMPWI || OpC == PPC::CMPW;
1112 bool is32BitUnsignedCompare = OpC == PPC::CMPLWI || OpC == PPC::CMPLW;
1113 bool is64BitUnsignedCompare = OpC == PPC::CMPLDI || OpC == PPC::CMPLD;
1117 if (!MI)
return false;
1120 bool equalityOnly =
false;
1123 if (is32BitSignedCompare) {
1125 if (MIOpC == PPC::SRAW || MIOpC == PPC::SRAWo ||
1126 MIOpC == PPC::SRAWI || MIOpC == PPC::SRAWIo ||
1127 MIOpC == PPC::EXTSB || MIOpC == PPC::EXTSBo ||
1128 MIOpC == PPC::EXTSH || MIOpC == PPC::EXTSHo ||
1129 MIOpC == PPC::EXTSW || MIOpC == PPC::EXTSWo) {
1133 }
else if (is32BitUnsignedCompare) {
1136 if (MIOpC == PPC::CNTLZW || MIOpC == PPC::CNTLZWo ||
1137 MIOpC == PPC::SLW || MIOpC == PPC::SLWo ||
1138 MIOpC == PPC::SRW || MIOpC == PPC::SRWo) {
1140 equalityOnly =
true;
1144 equalityOnly = is64BitUnsignedCompare;
1146 equalityOnly = is32BitUnsignedCompare;
1158 }
else if (UseMI->
getOpcode() == PPC::ISEL ||
1161 if (SubIdx != PPC::sub_eq)
1173 bool FoundUse =
false;
1175 JE = MRI->
use_end(); J != JE; ++J)
1209 for (; I != E && !noSub; --
I) {
1213 if (&*I != CmpInstr && (
1224 if ((OpC == PPC::CMPW || OpC == PPC::CMPLW ||
1225 OpC == PPC::CMPD || OpC == PPC::CMPLD) &&
1226 (IOpC == PPC::SUBF || IOpC == PPC::SUBF8) &&
1249 if (MIOpC == PPC::ANDIo || MIOpC == PPC::ANDIo8)
1252 NewOpC = PPC::getRecordFormOpcode(MIOpC);
1253 if (NewOpC == -1 && PPC::getNonRecordFormOpcode(MIOpC) != -1)
1273 bool ShouldSwap =
false;
1280 ShouldSwap = !ShouldSwap;
1289 assert((!equalityOnly ||
1291 "Invalid predicate for equality-only optimization");
1292 PredsToUpdate.
push_back(std::make_pair(&((*I).getOperand(0)),
1294 }
else if (UseMI->
getOpcode() == PPC::ISEL ||
1297 assert((!equalityOnly || NewSubReg == PPC::sub_eq) &&
1298 "Invalid CR bit for equality-only optimization");
1300 if (NewSubReg == PPC::sub_lt)
1301 NewSubReg = PPC::sub_gt;
1302 else if (NewSubReg == PPC::sub_gt)
1303 NewSubReg = PPC::sub_lt;
1305 SubRegsToUpdate.
push_back(std::make_pair(&((*I).getOperand(3)),
1321 if (MIOpC != NewOpC) {
1334 *ImpDefs; ++ImpDefs)
1340 *ImpUses; ++ImpUses)
1349 for (
unsigned i = 0, e = PredsToUpdate.
size(); i < e; i++)
1350 PredsToUpdate[i].first->setImm(PredsToUpdate[i].second);
1352 for (
unsigned i = 0, e = SubRegsToUpdate.
size(); i < e; i++)
1353 SubRegsToUpdate[i].first->setSubReg(SubRegsToUpdate[i].second);
1382 #define DEBUG_TYPE "ppc-early-ret"
1383 STATISTIC(NumBCLR,
"Number of early conditional returns");
1384 STATISTIC(NumBLR,
"Number of early returns");
1405 bool Changed =
false;
1411 if (I == ReturnMBB.
end() || I->getOpcode() != PPC::BLR ||
1417 PIE = ReturnMBB.
pred_end(); PI != PIE; ++PI) {
1418 bool OtherReference =
false, BlockChanged =
false;
1420 if (J->getOpcode() == PPC::B) {
1421 if (J->getOperand(0).getMBB() == &ReturnMBB) {
1424 BuildMI(**PI, J, J->getDebugLoc(),
TII->get(PPC::BLR));
1427 BlockChanged =
true;
1431 }
else if (J->getOpcode() == PPC::BCC) {
1432 if (J->getOperand(2).getMBB() == &ReturnMBB) {
1435 BuildMI(**PI, J, J->getDebugLoc(),
TII->get(PPC::BCLR))
1436 .addImm(J->getOperand(0).getImm())
1437 .addReg(J->getOperand(1).getReg());
1440 BlockChanged =
true;
1444 }
else if (J->isBranch()) {
1445 if (J->isIndirectBranch()) {
1447 OtherReference =
true;
1449 for (
unsigned i = 0; i < J->getNumOperands(); ++i)
1450 if (J->getOperand(i).isMBB() &&
1451 J->getOperand(i).getMBB() == &ReturnMBB)
1452 OtherReference =
true;
1453 }
else if (!J->isTerminator() && !J->isDebugValue())
1456 if (J == (*PI)->begin())
1462 if ((*PI)->canFallThrough() && (*PI)->isLayoutSuccessor(&ReturnMBB))
1463 OtherReference =
true;
1466 if (!OtherReference && BlockChanged) {
1474 for (
unsigned i = 0, ie = PredToRemove.
size(); i != ie; ++i)
1475 PredToRemove[i]->removeSuccessor(&ReturnMBB);
1481 (*ReturnMBB.
pred_begin())->isLayoutSuccessor(&ReturnMBB)) {
1484 PrevMBB.
splice(PrevMBB.
end(), &ReturnMBB,
I);
1498 TII =
TM->getInstrInfo();
1500 bool Changed =
false;
1509 if (processBlock(B))
1523 "PowerPC Early-Return Creation",
false,
false)
1525 char PPCEarlyReturn::
ID = 0;
unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
void push_back(const T &Elt)
The memory access reads data.
const MachineFunction * getParent() const
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
The memory access writes data.
const uint16_t * getImplicitDefs() const
static PassRegistry * getPassRegistry()
virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const
bool isBranch(QueryType Type=AnyInBundle) const
virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const
bool isPredicated(const MachineInstr *MI) const
MachineBasicBlock * getMBB() const
virtual MachineInstr * commuteInstruction(MachineInstr *MI, bool NewMI) const
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f, uint64_t s, unsigned base_alignment, const MDNode *TBAAInfo=0, const MDNode *Ranges=0)
const uint16_t * getImplicitUses() const
static cl::opt< bool > DisableCmpOpt("disable-ppc-cmp-opt", cl::desc("Disable compare instruction optimization"), cl::Hidden)
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
virtual bool optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, int Mask, int Value, const MachineRegisterInfo *MRI) const
const MCInstrDesc & getDesc() const
bool isCoalescableExtInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DstReg, unsigned &SubIdx) const
bool isDarwin() const
isDarwin - True if this is any darwin platform.
virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, const BranchProbability &Probability) const
const char * getSymbolName() const
const MCPhysReg * iterator
virtual void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
virtual bool isPredicable(MachineInstr *MI) const
bool isTerminator(QueryType Type=AnyInBundle) const
LoopInfoBase< BlockT, LoopT > * LI
static MachinePointerInfo getFixedStack(int FI, int64_t offset=0)
virtual bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
virtual bool analyzeCompare(const MachineInstr *MI, unsigned &SrcReg, unsigned &SrcReg2, int &Mask, int &Value) const
static use_iterator use_end()
const HexagonInstrInfo * TII
static MachineOperand CreateReg(unsigned 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)
const MCAsmInfo * getMCAsmInfo() const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
#define llvm_unreachable(msg)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
const TargetRegisterClass * getRegClass(unsigned Reg) const
const uint16_t * ImplicitUses
Abstract Stack Frame Information.
ID
LLVM Calling Convention Representation.
virtual const InstrItineraryData * getInstrItineraryData() const
const MachineInstrBuilder & addImm(int64_t Val) const
unsigned getNumOperands() const
void RemoveOperand(unsigned i)
bool definesRegister(unsigned Reg, const TargetRegisterInfo *TRI=NULL) const
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
size_t array_lengthof(T(&)[N])
Find the length of an array.
bool readsRegister(unsigned Reg, const TargetRegisterInfo *TRI=NULL) const
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
virtual MachineInstr * commuteInstruction(MachineInstr *MI, bool NewMI=false) const
virtual bool SubsumesPredicate(const SmallVectorImpl< MachineOperand > &Pred1, const SmallVectorImpl< MachineOperand > &Pred2) const
iterator getLastNonDebugInstr()
std::vector< MachineBasicBlock * >::iterator pred_iterator
void addMemOperand(MachineFunction &MF, MachineMemOperand *MO)
virtual const PPCInstrInfo * getInstrInfo() const
unsigned getKillRegState(bool B)
const MachineBasicBlock * getParent() const
unsigned getDeadRegState(bool B)
bundle_iterator< MachineInstr, instr_iterator > iterator
iterator SkipPHIsAndLabels(iterator I)
FunctionPass * createPPCEarlyReturnPass()
virtual bool canInsertSelect(const MachineBasicBlock &, const SmallVectorImpl< MachineOperand > &Cond, unsigned, unsigned, int &, int &, int &) const
virtual bool DefinesPredicate(MachineInstr *MI, std::vector< MachineOperand > &Pred) const
const MachineOperand & getOperand(unsigned i) const
virtual const PPCRegisterInfo & getRegisterInfo() const
ItTy next(ItTy it, Dist n)
void setImm(int64_t immVal)
virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
void removeSuccessor(MachineBasicBlock *succ)
unsigned getSubReg() const
virtual void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc DL, unsigned DstReg, const SmallVectorImpl< MachineOperand > &Cond, unsigned TrueReg, unsigned FalseReg) const
virtual const PPCSubtarget * getSubtargetImpl() const
pred_iterator pred_begin()
bool isPseudo() const
Return true if this is a pseudo instruction that doesn't correspond to a real machine instruction...
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
void initializePPCEarlyReturnPass(PassRegistry &)
int getOperandConstraint(unsigned OpNum, MCOI::OperandConstraint Constraint) const
Returns the value of the specific constraint if it is set. Returns -1 if it is not set...
STATISTIC(NumBCLR,"Number of early conditional returns")
unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const
void setIsKill(bool Val=true)
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset=0, bool mem=true)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
static bool MBBDefinesCTR(MachineBasicBlock &MBB)
void setDesc(const MCInstrDesc &tid)
const STC & getSubtarget() const
void addOperand(MachineFunction &MF, const MachineOperand &Op)
unsigned getObjectAlignment(int ObjectIdx) const
getObjectAlignment - Return the alignment of the specified stack object.
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
bool isMBB() const
isMBB - Tests if this is a MO_MachineBasicBlock operand.
MachineFrameInfo * getFrameInfo()
static bool clobbersPhysReg(const uint32_t *RegMask, unsigned PhysReg)
MachineInstr * getUniqueVRegDef(unsigned Reg) const
virtual ScheduleHazardRecognizer * CreateTargetHazardRecognizer(const TargetMachine *TM, const ScheduleDAG *DAG) const
PPCInstrInfo(PPCTargetMachine &TM)
Predicate InvertPredicate(Predicate Opcode)
Invert the specified predicate. != -> ==, < -> >=.
bool hasAddressTaken() const
virtual bool PredicateInstruction(MachineInstr *MI, const SmallVectorImpl< MachineOperand > &Pred) const
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
MachineRegisterInfo & getRegInfo()
ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II, const ScheduleDAG *DAG) const
virtual void getAnalysisUsage(AnalysisUsage &AU) const
use_iterator use_begin(unsigned RegNo) const
bool hasOneNonDBGUse(unsigned RegNo) const
void setReg(unsigned Reg)
DBG_VALUE - a mapping of the llvm.dbg.value intrinsic.
static MachineOperand CreateImm(int64_t Val)
static unsigned getReg(const void *D, unsigned RC, unsigned RegNo)
const TargetMachine & getTarget() const
instr_iterator insert(instr_iterator I, MachineInstr *M)
unsigned getReg() const
getReg - Returns the register number.
const uint16_t * ImplicitDefs
virtual unsigned GetInstSizeInBytes(const MachineInstr *MI) const
LLVM Value Representation.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned char TargetFlags=0) const
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction. Note that variadic (isVari...
const MCOperandInfo * OpInfo
BasicBlockListType::iterator iterator
const MCRegisterInfo & MRI
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
static cl::opt< bool > DisableCTRLoopAnal("disable-ppc-ctrloop-analysis", cl::Hidden, cl::desc("Disable analysis for CTR loops"))
unsigned pred_size() const
int64_t getObjectSize(int ObjectIdx) const
bool modifiesRegister(unsigned Reg, const TargetRegisterInfo *TRI) const
bool isBarrier(QueryType Type=AnyInBundle) const
ScheduleHazardRecognizer * CreateTargetHazardRecognizer(const TargetMachine *TM, const ScheduleDAG *DAG) const
DebugLoc getDebugLoc() const
virtual bool FoldImmediate(MachineInstr *UseMI, MachineInstr *DefMI, unsigned Reg, MachineRegisterInfo *MRI) const
bool contains(unsigned Reg) const
Predicate getSwappedPredicate(Predicate Opcode)