66#define DEBUG_TYPE "hexagon-instrinfo"
68#define GET_INSTRINFO_CTOR_DTOR
69#define GET_INSTRMAP_INFO
71#include "HexagonGenDFAPacketizer.inc"
72#include "HexagonGenInstrInfo.inc"
76 "packetization boundary."));
83 cl::desc(
"Disable schedule adjustment for new value stores."));
87 cl::desc(
"Enable timing class latency"));
91 cl::desc(
"Enable vec alu forwarding"));
95 cl::desc(
"Enable vec acc forwarding"));
103 cl::desc(
"Use the DFA based hazard recognizer."));
118void HexagonInstrInfo::anchor() {}
132 return (
Reg >= Hexagon::R0 &&
Reg <= Hexagon::R7) ||
133 (
Reg >= Hexagon::R16 &&
Reg <= Hexagon::R23);
145 for (; MIB != MIE; ++MIB) {
146 if (!MIB->isDebugInstr())
157 if (!(
MI.getMF()->getFunction().hasOptSize()))
158 return MI.isAsCheapAsAMove();
160 if (
MI.getOpcode() == Hexagon::A2_tfrsi) {
161 auto Op =
MI.getOperand(1);
169 int64_t Imm =
Op.getImm();
174 return MI.isAsCheapAsAMove();
189 if (
isFloat(
MI) &&
MI.hasRegisterImplicitUseOperand(Hexagon::USR))
203 if (EndLoopOp == Hexagon::ENDLOOP0) {
204 LOOPi = Hexagon::J2_loop0i;
205 LOOPr = Hexagon::J2_loop0r;
207 LOOPi = Hexagon::J2_loop1i;
208 LOOPr = Hexagon::J2_loop1r;
219 unsigned Opc =
I.getOpcode();
220 if (
Opc == LOOPi ||
Opc == LOOPr)
224 if (
Opc == EndLoopOp &&
I.getOperand(0).getMBB() != TargetBB)
251 Uses.push_back(MO.getReg());
290 int &FrameIndex)
const {
291 switch (
MI.getOpcode()) {
294 case Hexagon::L2_loadri_io:
295 case Hexagon::L2_loadrd_io:
296 case Hexagon::V6_vL32b_ai:
297 case Hexagon::V6_vL32b_nt_ai:
298 case Hexagon::V6_vL32Ub_ai:
299 case Hexagon::LDriw_pred:
300 case Hexagon::LDriw_ctr:
301 case Hexagon::PS_vloadrq_ai:
302 case Hexagon::PS_vloadrw_ai:
303 case Hexagon::PS_vloadrw_nt_ai: {
311 return MI.getOperand(0).getReg();
314 case Hexagon::L2_ploadrit_io:
315 case Hexagon::L2_ploadrif_io:
316 case Hexagon::L2_ploadrdt_io:
317 case Hexagon::L2_ploadrdf_io: {
325 return MI.getOperand(0).getReg();
338 int &FrameIndex)
const {
339 switch (
MI.getOpcode()) {
342 case Hexagon::S2_storerb_io:
343 case Hexagon::S2_storerh_io:
344 case Hexagon::S2_storeri_io:
345 case Hexagon::S2_storerd_io:
346 case Hexagon::V6_vS32b_ai:
347 case Hexagon::V6_vS32Ub_ai:
348 case Hexagon::STriw_pred:
349 case Hexagon::STriw_ctr:
350 case Hexagon::PS_vstorerq_ai:
351 case Hexagon::PS_vstorerw_ai: {
359 return MI.getOperand(2).getReg();
362 case Hexagon::S2_pstorerbt_io:
363 case Hexagon::S2_pstorerbf_io:
364 case Hexagon::S2_pstorerht_io:
365 case Hexagon::S2_pstorerhf_io:
366 case Hexagon::S2_pstorerit_io:
367 case Hexagon::S2_pstorerif_io:
368 case Hexagon::S2_pstorerdt_io:
369 case Hexagon::S2_pstorerdf_io: {
377 return MI.getOperand(3).getReg();
393 for (++MII; MII !=
MBB->instr_end() && MII->isInsideBundle(); ++MII)
411 for (++MII; MII !=
MBB->instr_end() && MII->isInsideBundle(); ++MII)
439 bool AllowModify)
const {
446 if (
I ==
MBB.instr_begin())
466 }
while (
I !=
MBB.instr_begin());
471 while (
I->isDebugInstr()) {
472 if (
I ==
MBB.instr_begin())
477 bool JumpToBlock =
I->getOpcode() == Hexagon::J2_jump &&
478 I->getOperand(0).isMBB();
480 if (AllowModify && JumpToBlock &&
481 MBB.isLayoutSuccessor(
I->getOperand(0).getMBB())) {
483 I->eraseFromParent();
485 if (
I ==
MBB.instr_begin())
489 if (!isUnpredicatedTerminator(*
I))
497 if (&*
I != LastInst && !
I->isBundle() && isUnpredicatedTerminator(*
I)) {
499 SecondLastInst = &*
I;
504 if (
I ==
MBB.instr_begin())
510 int SecLastOpcode = SecondLastInst ? SecondLastInst->
getOpcode() : 0;
513 if (LastOpcode == Hexagon::J2_jump && !LastInst->
getOperand(0).
isMBB())
515 if (SecLastOpcode == Hexagon::J2_jump &&
526 if (LastInst && !SecondLastInst) {
527 if (LastOpcode == Hexagon::J2_jump) {
537 if (LastOpcodeHasJMP_c) {
552 <<
" with one jump\n";);
559 if (SecLastOpcodeHasJMP_c && (LastOpcode == Hexagon::J2_jump)) {
570 if (SecLastOpcodeHasNVJump &&
572 (LastOpcode == Hexagon::J2_jump)) {
583 if (SecLastOpcode == Hexagon::J2_jump && LastOpcode == Hexagon::J2_jump) {
587 I->eraseFromParent();
592 if (
isEndLoopN(SecLastOpcode) && LastOpcode == Hexagon::J2_jump) {
600 <<
" with two jumps";);
606 int *BytesRemoved)
const {
607 assert(!BytesRemoved &&
"code size not handled");
612 while (
I !=
MBB.begin()) {
614 if (
I->isDebugInstr())
619 if (
Count && (
I->getOpcode() == Hexagon::J2_jump))
633 int *BytesAdded)
const {
634 unsigned BOpc = Hexagon::J2_jump;
635 unsigned BccOpc = Hexagon::J2_jumpt;
637 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
638 assert(!BytesAdded &&
"code size not handled");
643 if (!
Cond.empty() &&
Cond[0].isImm())
644 BccOpc =
Cond[0].getImm();
654 auto Term =
MBB.getFirstTerminator();
664 int EndLoopOp =
Cond[0].getImm();
671 assert(
Loop !=
nullptr &&
"Inserting an ENDLOOP without a LOOP");
672 Loop->getOperand(0).setMBB(
TBB);
676 assert((
Cond.size() == 3) &&
"Only supporting rr/ri version of nvjump");
687 }
else if(
Cond[2].isImm()) {
693 assert((
Cond.size() == 2) &&
"Malformed cond vector");
701 "Cond. cannot be empty when multiple branchings are required");
703 "NV-jump cannot be inserted with another branch");
706 int EndLoopOp =
Cond[0].getImm();
713 assert(
Loop !=
nullptr &&
"Inserting an ENDLOOP without a LOOP");
714 Loop->getOperand(0).setMBB(
TBB);
743 TripCount =
Loop->getOpcode() == Hexagon::J2_loop0r
745 :
Loop->getOperand(1).getImm();
747 LoopCount =
Loop->getOperand(1).getReg();
750 bool shouldIgnoreForPipelining(
const MachineInstr *
MI)
const override {
752 return MI == EndLoop;
755 std::optional<bool> createTripCountGreaterCondition(
756 int TC, MachineBasicBlock &
MBB,
757 SmallVectorImpl<MachineOperand> &
Cond)
override {
758 if (TripCount == -1) {
762 TII->get(Hexagon::C2_cmpgtui),
Done)
770 return TripCount > TC;
773 void setPreheader(MachineBasicBlock *NewPreheader)
override {
778 void adjustTripCount(
int TripCountAdjust)
override {
781 if (Loop->
getOpcode() == Hexagon::J2_loop0i ||
782 Loop->
getOpcode() == Hexagon::J2_loop1i) {
784 assert(TripCount > 0 &&
"Can't create an empty or negative loop!");
794 TII->get(Hexagon::A2_addi), NewLoopCount)
800 void disposed(LiveIntervals *LIS)
override {
808std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo>
816 LoopBB,
I->getOpcode(),
I->getOperand(0).getMBB(), VisitedBBs);
818 return std::make_unique<HexagonPipelinerLoopInfo>(LoopInst, &*
I);
824 unsigned NumCycles,
unsigned ExtraPredCycles,
838 return NumInstrs <= 4;
846 for (
auto I =
B.begin();
I !=
E; ++
I) {
856 for (
auto I =
B.rbegin();
I !=
E; ++
I)
865 bool RenamableSrc)
const {
869 if (Hexagon::IntRegsRegClass.
contains(SrcReg, DestReg)) {
871 .
addReg(SrcReg, KillFlag);
874 if (Hexagon::DoubleRegsRegClass.
contains(SrcReg, DestReg)) {
876 .
addReg(SrcReg, KillFlag);
879 if (Hexagon::PredRegsRegClass.
contains(SrcReg, DestReg)) {
885 if (Hexagon::CtrRegsRegClass.
contains(DestReg) &&
886 Hexagon::IntRegsRegClass.
contains(SrcReg)) {
888 .
addReg(SrcReg, KillFlag);
891 if (Hexagon::IntRegsRegClass.
contains(DestReg) &&
892 Hexagon::CtrRegsRegClass.
contains(SrcReg)) {
894 .
addReg(SrcReg, KillFlag);
897 if (Hexagon::ModRegsRegClass.
contains(DestReg) &&
898 Hexagon::IntRegsRegClass.
contains(SrcReg)) {
900 .
addReg(SrcReg, KillFlag);
903 if (Hexagon::PredRegsRegClass.
contains(SrcReg) &&
904 Hexagon::IntRegsRegClass.
contains(DestReg)) {
906 .
addReg(SrcReg, KillFlag);
909 if (Hexagon::IntRegsRegClass.
contains(SrcReg) &&
910 Hexagon::PredRegsRegClass.
contains(DestReg)) {
912 .
addReg(SrcReg, KillFlag);
915 if (Hexagon::PredRegsRegClass.
contains(SrcReg) &&
916 Hexagon::IntRegsRegClass.
contains(DestReg)) {
918 .
addReg(SrcReg, KillFlag);
921 if (Hexagon::HvxVRRegClass.
contains(SrcReg, DestReg)) {
923 addReg(SrcReg, KillFlag);
926 if (Hexagon::HvxWRRegClass.
contains(SrcReg, DestReg)) {
929 Register SrcLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
930 Register SrcHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
934 .
addReg(SrcHi, KillFlag | UndefHi)
935 .
addReg(SrcLo, KillFlag | UndefLo);
938 if (Hexagon::HvxQRRegClass.
contains(SrcReg, DestReg)) {
941 .
addReg(SrcReg, KillFlag);
944 if (Hexagon::HvxQRRegClass.
contains(SrcReg) &&
945 Hexagon::HvxVRRegClass.
contains(DestReg)) {
949 if (Hexagon::HvxQRRegClass.
contains(DestReg) &&
950 Hexagon::HvxVRRegClass.
contains(SrcReg)) {
965 Register SrcReg,
bool isKill,
int FI,
979 if (Hexagon::IntRegsRegClass.hasSubClassEq(RC)) {
983 }
else if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC)) {
987 }
else if (Hexagon::PredRegsRegClass.hasSubClassEq(RC)) {
991 }
else if (Hexagon::ModRegsRegClass.hasSubClassEq(RC)) {
995 }
else if (Hexagon::HvxQRRegClass.hasSubClassEq(RC)) {
999 }
else if (Hexagon::HvxVRRegClass.hasSubClassEq(RC)) {
1003 }
else if (Hexagon::HvxWRRegClass.hasSubClassEq(RC)) {
1024 if (Hexagon::IntRegsRegClass.hasSubClassEq(RC)) {
1027 }
else if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC)) {
1030 }
else if (Hexagon::PredRegsRegClass.hasSubClassEq(RC)) {
1033 }
else if (Hexagon::ModRegsRegClass.hasSubClassEq(RC)) {
1036 }
else if (Hexagon::HvxQRRegClass.hasSubClassEq(RC)) {
1039 }
else if (Hexagon::HvxVRRegClass.hasSubClassEq(RC)) {
1042 }
else if (Hexagon::HvxWRRegClass.hasSubClassEq(RC)) {
1063 unsigned Opc =
MI.getOpcode();
1065 auto RealCirc = [&](
unsigned Opc,
bool HasImm,
unsigned MxOp) {
1067 Register CSx = (Mx == Hexagon::M0 ? Hexagon::CS0 : Hexagon::CS1);
1069 .
add(
MI.getOperand((HasImm ? 5 : 4)));
1073 MIB.
add(
MI.getOperand(4));
1080 if (
MI.memoperands().empty())
1083 return MMO->getAlign() >= NeedAlign;
1088 case Hexagon::PS_call_instrprof_custom: {
1089 auto Op0 =
MI.getOperand(0);
1091 "First operand must be a global containing handler name.");
1095 StringRef NameStr = Arr->isCString() ? Arr->getAsCString() : Arr->getAsString();
1121 MIB.addExternalSymbol(cstr);
1125 case TargetOpcode::COPY: {
1131 std::prev(
MBBI)->copyImplicitOps(*
MBB.getParent(),
MI);
1136 case Hexagon::PS_aligna:
1139 .
addImm(-
MI.getOperand(1).getImm());
1142 case Hexagon::V6_vassignp: {
1145 Register SrcLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
1146 Register SrcHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
1153 .
addReg(SrcLo, Kill | UndefLo);
1157 case Hexagon::V6_lo: {
1160 Register SrcSubLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
1163 MRI.clearKillFlags(SrcSubLo);
1166 case Hexagon::V6_hi: {
1169 Register SrcSubHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
1172 MRI.clearKillFlags(SrcSubHi);
1175 case Hexagon::PS_vloadrv_ai: {
1179 int Offset =
MI.getOperand(2).getImm();
1180 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1181 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vL32b_ai
1182 : Hexagon::V6_vL32Ub_ai;
1190 case Hexagon::PS_vloadrw_ai: {
1194 int Offset =
MI.getOperand(2).getImm();
1195 unsigned VecOffset = HRI.getSpillSize(Hexagon::HvxVRRegClass);
1196 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1197 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vL32b_ai
1198 : Hexagon::V6_vL32Ub_ai;
1200 HRI.getSubReg(DstReg, Hexagon::vsub_lo))
1205 HRI.getSubReg(DstReg, Hexagon::vsub_hi))
1212 case Hexagon::PS_vstorerv_ai: {
1217 int Offset =
MI.getOperand(1).getImm();
1218 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1219 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vS32b_ai
1220 : Hexagon::V6_vS32Ub_ai;
1229 case Hexagon::PS_vstorerw_ai: {
1233 int Offset =
MI.getOperand(1).getImm();
1234 unsigned VecOffset = HRI.getSpillSize(Hexagon::HvxVRRegClass);
1235 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1236 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vS32b_ai
1237 : Hexagon::V6_vS32Ub_ai;
1241 .
addReg(HRI.getSubReg(SrcReg, Hexagon::vsub_lo))
1246 .
addReg(HRI.getSubReg(SrcReg, Hexagon::vsub_hi))
1251 case Hexagon::PS_true: {
1259 case Hexagon::PS_false: {
1267 case Hexagon::PS_qtrue: {
1274 case Hexagon::PS_qfalse: {
1281 case Hexagon::PS_vdd0: {
1289 case Hexagon::PS_vmulw: {
1292 Register Src1Reg =
MI.getOperand(1).getReg();
1293 Register Src2Reg =
MI.getOperand(2).getReg();
1294 Register Src1SubHi = HRI.getSubReg(Src1Reg, Hexagon::isub_hi);
1295 Register Src1SubLo = HRI.getSubReg(Src1Reg, Hexagon::isub_lo);
1296 Register Src2SubHi = HRI.getSubReg(Src2Reg, Hexagon::isub_hi);
1297 Register Src2SubLo = HRI.getSubReg(Src2Reg, Hexagon::isub_lo);
1299 HRI.getSubReg(DstReg, Hexagon::isub_hi))
1303 HRI.getSubReg(DstReg, Hexagon::isub_lo))
1307 MRI.clearKillFlags(Src1SubHi);
1308 MRI.clearKillFlags(Src1SubLo);
1309 MRI.clearKillFlags(Src2SubHi);
1310 MRI.clearKillFlags(Src2SubLo);
1313 case Hexagon::PS_vmulw_acc: {
1316 Register Src1Reg =
MI.getOperand(1).getReg();
1317 Register Src2Reg =
MI.getOperand(2).getReg();
1318 Register Src3Reg =
MI.getOperand(3).getReg();
1319 Register Src1SubHi = HRI.getSubReg(Src1Reg, Hexagon::isub_hi);
1320 Register Src1SubLo = HRI.getSubReg(Src1Reg, Hexagon::isub_lo);
1321 Register Src2SubHi = HRI.getSubReg(Src2Reg, Hexagon::isub_hi);
1322 Register Src2SubLo = HRI.getSubReg(Src2Reg, Hexagon::isub_lo);
1323 Register Src3SubHi = HRI.getSubReg(Src3Reg, Hexagon::isub_hi);
1324 Register Src3SubLo = HRI.getSubReg(Src3Reg, Hexagon::isub_lo);
1326 HRI.getSubReg(DstReg, Hexagon::isub_hi))
1331 HRI.getSubReg(DstReg, Hexagon::isub_lo))
1336 MRI.clearKillFlags(Src1SubHi);
1337 MRI.clearKillFlags(Src1SubLo);
1338 MRI.clearKillFlags(Src2SubHi);
1339 MRI.clearKillFlags(Src2SubLo);
1340 MRI.clearKillFlags(Src3SubHi);
1341 MRI.clearKillFlags(Src3SubLo);
1344 case Hexagon::PS_pselect: {
1359 .
addReg(Pu, (Rd == Rt) ? K1 : 0)
1368 case Hexagon::PS_vselect: {
1401 case Hexagon::PS_wselect: {
1441 case Hexagon::PS_crash: {
1457 void printCustom(
raw_ostream &OS)
const override {
1458 OS <<
"MisalignedCrash";
1462 static const CrashPseudoSourceValue CrashPSV(MF.
getTarget());
1474 case Hexagon::PS_tailcall_i:
1475 MI.setDesc(
get(Hexagon::J2_jump));
1477 case Hexagon::PS_tailcall_r:
1478 case Hexagon::PS_jmpret:
1479 MI.setDesc(
get(Hexagon::J2_jumpr));
1481 case Hexagon::PS_jmprett:
1482 MI.setDesc(
get(Hexagon::J2_jumprt));
1484 case Hexagon::PS_jmpretf:
1485 MI.setDesc(
get(Hexagon::J2_jumprf));
1487 case Hexagon::PS_jmprettnewpt:
1488 MI.setDesc(
get(Hexagon::J2_jumprtnewpt));
1490 case Hexagon::PS_jmpretfnewpt:
1491 MI.setDesc(
get(Hexagon::J2_jumprfnewpt));
1493 case Hexagon::PS_jmprettnew:
1494 MI.setDesc(
get(Hexagon::J2_jumprtnew));
1496 case Hexagon::PS_jmpretfnew:
1497 MI.setDesc(
get(Hexagon::J2_jumprfnew));
1500 case Hexagon::PS_loadrub_pci:
1501 return RealCirc(Hexagon::L2_loadrub_pci,
true, 4);
1502 case Hexagon::PS_loadrb_pci:
1503 return RealCirc(Hexagon::L2_loadrb_pci,
true, 4);
1504 case Hexagon::PS_loadruh_pci:
1505 return RealCirc(Hexagon::L2_loadruh_pci,
true, 4);
1506 case Hexagon::PS_loadrh_pci:
1507 return RealCirc(Hexagon::L2_loadrh_pci,
true, 4);
1508 case Hexagon::PS_loadri_pci:
1509 return RealCirc(Hexagon::L2_loadri_pci,
true, 4);
1510 case Hexagon::PS_loadrd_pci:
1511 return RealCirc(Hexagon::L2_loadrd_pci,
true, 4);
1512 case Hexagon::PS_loadrub_pcr:
1513 return RealCirc(Hexagon::L2_loadrub_pcr,
false, 3);
1514 case Hexagon::PS_loadrb_pcr:
1515 return RealCirc(Hexagon::L2_loadrb_pcr,
false, 3);
1516 case Hexagon::PS_loadruh_pcr:
1517 return RealCirc(Hexagon::L2_loadruh_pcr,
false, 3);
1518 case Hexagon::PS_loadrh_pcr:
1519 return RealCirc(Hexagon::L2_loadrh_pcr,
false, 3);
1520 case Hexagon::PS_loadri_pcr:
1521 return RealCirc(Hexagon::L2_loadri_pcr,
false, 3);
1522 case Hexagon::PS_loadrd_pcr:
1523 return RealCirc(Hexagon::L2_loadrd_pcr,
false, 3);
1524 case Hexagon::PS_storerb_pci:
1525 return RealCirc(Hexagon::S2_storerb_pci,
true, 3);
1526 case Hexagon::PS_storerh_pci:
1527 return RealCirc(Hexagon::S2_storerh_pci,
true, 3);
1528 case Hexagon::PS_storerf_pci:
1529 return RealCirc(Hexagon::S2_storerf_pci,
true, 3);
1530 case Hexagon::PS_storeri_pci:
1531 return RealCirc(Hexagon::S2_storeri_pci,
true, 3);
1532 case Hexagon::PS_storerd_pci:
1533 return RealCirc(Hexagon::S2_storerd_pci,
true, 3);
1534 case Hexagon::PS_storerb_pcr:
1535 return RealCirc(Hexagon::S2_storerb_pcr,
false, 2);
1536 case Hexagon::PS_storerh_pcr:
1537 return RealCirc(Hexagon::S2_storerh_pcr,
false, 2);
1538 case Hexagon::PS_storerf_pcr:
1539 return RealCirc(Hexagon::S2_storerf_pcr,
false, 2);
1540 case Hexagon::PS_storeri_pcr:
1541 return RealCirc(Hexagon::S2_storeri_pcr,
false, 2);
1542 case Hexagon::PS_storerd_pcr:
1543 return RealCirc(Hexagon::S2_storerd_pcr,
false, 2);
1553 unsigned Opc =
MI.getOpcode();
1557 case Hexagon::V6_vgathermh_pseudo:
1559 .
add(
MI.getOperand(2))
1560 .
add(
MI.getOperand(3))
1561 .
add(
MI.getOperand(4));
1563 .
add(
MI.getOperand(0))
1567 return First.getInstrIterator();
1569 case Hexagon::V6_vgathermw_pseudo:
1571 .
add(
MI.getOperand(2))
1572 .
add(
MI.getOperand(3))
1573 .
add(
MI.getOperand(4));
1575 .
add(
MI.getOperand(0))
1579 return First.getInstrIterator();
1581 case Hexagon::V6_vgathermhw_pseudo:
1583 .
add(
MI.getOperand(2))
1584 .
add(
MI.getOperand(3))
1585 .
add(
MI.getOperand(4));
1587 .
add(
MI.getOperand(0))
1591 return First.getInstrIterator();
1593 case Hexagon::V6_vgathermhq_pseudo:
1595 .
add(
MI.getOperand(2))
1596 .
add(
MI.getOperand(3))
1597 .
add(
MI.getOperand(4))
1598 .
add(
MI.getOperand(5));
1600 .
add(
MI.getOperand(0))
1604 return First.getInstrIterator();
1606 case Hexagon::V6_vgathermwq_pseudo:
1608 .
add(
MI.getOperand(2))
1609 .
add(
MI.getOperand(3))
1610 .
add(
MI.getOperand(4))
1611 .
add(
MI.getOperand(5));
1613 .
add(
MI.getOperand(0))
1617 return First.getInstrIterator();
1619 case Hexagon::V6_vgathermhwq_pseudo:
1621 .
add(
MI.getOperand(2))
1622 .
add(
MI.getOperand(3))
1623 .
add(
MI.getOperand(4))
1624 .
add(
MI.getOperand(5));
1626 .
add(
MI.getOperand(0))
1630 return First.getInstrIterator();
1633 return MI.getIterator();
1642 assert(
Cond[0].isImm() &&
"First entry in the cond vector not imm-val");
1643 unsigned opcode =
Cond[0].getImm();
1649 Cond[0].setImm(NewOpcode);
1683 int Opc =
MI.getOpcode();
1696 unsigned NOp = 0,
NumOps =
MI.getNumOperands();
1699 if (!
Op.isReg() || !
Op.isDef() ||
Op.isImplicit())
1706 unsigned PredRegPos, PredRegFlags;
1707 bool GotPredReg =
getPredReg(
Cond, PredReg, PredRegPos, PredRegFlags);
1710 T.addReg(PredReg, PredRegFlags);
1712 T.add(
MI.getOperand(NOp++));
1714 MI.setDesc(
get(PredOpc));
1715 while (
unsigned n =
MI.getNumOperands())
1716 MI.removeOperand(n-1);
1717 for (
unsigned i = 0, n =
T->getNumOperands(); i < n; ++i)
1718 MI.addOperand(
T->getOperand(i));
1724 MRI.clearKillFlags(PredReg);
1735 std::vector<MachineOperand> &Pred,
1736 bool SkipDead)
const {
1744 if (RC == &Hexagon::PredRegsRegClass) {
1749 }
else if (MO.isRegMask()) {
1750 for (
Register PR : Hexagon::PredRegsRegClass) {
1751 if (!
MI.modifiesRegister(PR, &HRI))
1762 if (!
MI.getDesc().isPredicable())
1766 if (!Subtarget.usePredicatedCalls())
1771 if (!Subtarget.hasV62Ops()) {
1772 switch (
MI.getOpcode()) {
1773 case Hexagon::V6_vL32b_ai:
1774 case Hexagon::V6_vL32b_pi:
1775 case Hexagon::V6_vL32b_ppu:
1776 case Hexagon::V6_vL32b_cur_ai:
1777 case Hexagon::V6_vL32b_cur_pi:
1778 case Hexagon::V6_vL32b_cur_ppu:
1779 case Hexagon::V6_vL32b_nt_ai:
1780 case Hexagon::V6_vL32b_nt_pi:
1781 case Hexagon::V6_vL32b_nt_ppu:
1782 case Hexagon::V6_vL32b_tmp_ai:
1783 case Hexagon::V6_vL32b_tmp_pi:
1784 case Hexagon::V6_vL32b_tmp_ppu:
1785 case Hexagon::V6_vL32b_nt_cur_ai:
1786 case Hexagon::V6_vL32b_nt_cur_pi:
1787 case Hexagon::V6_vL32b_nt_cur_ppu:
1788 case Hexagon::V6_vL32b_nt_tmp_ai:
1789 case Hexagon::V6_vL32b_nt_tmp_pi:
1790 case Hexagon::V6_vL32b_nt_tmp_ppu:
1806 if (
MI.isDebugInstr())
1816 for (
auto *
I :
MBB->successors())
1822 if (
MI.getDesc().isTerminator() ||
MI.isPosition())
1826 if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR)
1850 bool atInsnStart =
true;
1853 for (; *Str; ++Str) {
1857 if (atInsnStart && !
isSpace(
static_cast<unsigned char>(*Str))) {
1859 atInsnStart =
false;
1863 atInsnStart =
false;
1886 int64_t &
Value)
const {
1887 unsigned Opc =
MI.getOpcode();
1891 case Hexagon::C2_cmpeq:
1892 case Hexagon::C2_cmpeqp:
1893 case Hexagon::C2_cmpgt:
1894 case Hexagon::C2_cmpgtp:
1895 case Hexagon::C2_cmpgtu:
1896 case Hexagon::C2_cmpgtup:
1897 case Hexagon::C4_cmpneq:
1898 case Hexagon::C4_cmplte:
1899 case Hexagon::C4_cmplteu:
1900 case Hexagon::C2_cmpeqi:
1901 case Hexagon::C2_cmpgti:
1902 case Hexagon::C2_cmpgtui:
1903 case Hexagon::C4_cmpneqi:
1904 case Hexagon::C4_cmplteui:
1905 case Hexagon::C4_cmpltei:
1906 SrcReg =
MI.getOperand(1).getReg();
1909 case Hexagon::A4_cmpbeq:
1910 case Hexagon::A4_cmpbgt:
1911 case Hexagon::A4_cmpbgtu:
1912 case Hexagon::A4_cmpbeqi:
1913 case Hexagon::A4_cmpbgti:
1914 case Hexagon::A4_cmpbgtui:
1915 SrcReg =
MI.getOperand(1).getReg();
1918 case Hexagon::A4_cmpheq:
1919 case Hexagon::A4_cmphgt:
1920 case Hexagon::A4_cmphgtu:
1921 case Hexagon::A4_cmpheqi:
1922 case Hexagon::A4_cmphgti:
1923 case Hexagon::A4_cmphgtui:
1924 SrcReg =
MI.getOperand(1).getReg();
1931 case Hexagon::C2_cmpeq:
1932 case Hexagon::C2_cmpeqp:
1933 case Hexagon::C2_cmpgt:
1934 case Hexagon::C2_cmpgtp:
1935 case Hexagon::C2_cmpgtu:
1936 case Hexagon::C2_cmpgtup:
1937 case Hexagon::A4_cmpbeq:
1938 case Hexagon::A4_cmpbgt:
1939 case Hexagon::A4_cmpbgtu:
1940 case Hexagon::A4_cmpheq:
1941 case Hexagon::A4_cmphgt:
1942 case Hexagon::A4_cmphgtu:
1943 case Hexagon::C4_cmpneq:
1944 case Hexagon::C4_cmplte:
1945 case Hexagon::C4_cmplteu:
1946 SrcReg2 =
MI.getOperand(2).getReg();
1950 case Hexagon::C2_cmpeqi:
1951 case Hexagon::C2_cmpgtui:
1952 case Hexagon::C2_cmpgti:
1953 case Hexagon::C4_cmpneqi:
1954 case Hexagon::C4_cmplteui:
1955 case Hexagon::C4_cmpltei:
1956 case Hexagon::A4_cmpbeqi:
1957 case Hexagon::A4_cmpbgti:
1958 case Hexagon::A4_cmpbgtui:
1959 case Hexagon::A4_cmpheqi:
1960 case Hexagon::A4_cmphgti:
1961 case Hexagon::A4_cmphgtui: {
1966 Value =
MI.getOperand(2).getImm();
1976 unsigned *PredCost)
const {
2002 unsigned BasePosA, OffsetPosA;
2010 unsigned BasePosB, OffsetPosB;
2017 if (BaseRegA != BaseRegB || BaseSubA != BaseSubB)
2035 if (OffsetA > OffsetB) {
2037 return SizeB <= OffDiff;
2039 if (OffsetA < OffsetB) {
2041 return SizeA <= OffDiff;
2051 unsigned BasePos = 0, OffsetPos = 0;
2059 }
else if (
MI.getOpcode() == Hexagon::A2_addi) {
2061 if (AddOp.isImm()) {
2062 Value = AddOp.getImm();
2070std::pair<unsigned, unsigned>
2080 static const std::pair<unsigned, const char*> Flags[] = {
2081 {MO_PCREL,
"hexagon-pcrel"},
2082 {MO_GOT,
"hexagon-got"},
2083 {MO_LO16,
"hexagon-lo16"},
2084 {MO_HI16,
"hexagon-hi16"},
2085 {MO_GPREL,
"hexagon-gprel"},
2086 {MO_GDGOT,
"hexagon-gdgot"},
2087 {MO_GDPLT,
"hexagon-gdplt"},
2088 {MO_IE,
"hexagon-ie"},
2089 {MO_IEGOT,
"hexagon-iegot"},
2090 {MO_TPREL,
"hexagon-tprel"}
2099 static const std::pair<unsigned, const char*> Flags[] = {
2100 {HMOTF_ConstExtended,
"hexagon-ext"}
2108 if (VT == MVT::i1) {
2109 TRC = &Hexagon::PredRegsRegClass;
2110 }
else if (VT == MVT::i32 || VT == MVT::f32) {
2111 TRC = &Hexagon::IntRegsRegClass;
2112 }
else if (VT == MVT::i64 || VT == MVT::f64) {
2113 TRC = &Hexagon::DoubleRegsRegClass;
2137 !
MI.getDesc().mayStore() &&
2138 MI.getDesc().getOpcode() != Hexagon::S2_allocframe &&
2139 MI.getDesc().getOpcode() != Hexagon::L2_deallocframe &&
2184 assert(MO.
isImm() &&
"Extendable operand must be Immediate type");
2188 int32_t SValue =
Value;
2191 return SValue < MinValue || SValue > MaxValue;
2196 return UValue < MinValue || UValue > MaxValue;
2200 switch (
MI.getOpcode()) {
2201 case Hexagon::L4_return:
2202 case Hexagon::L4_return_t:
2203 case Hexagon::L4_return_f:
2204 case Hexagon::L4_return_tnew_pnt:
2205 case Hexagon::L4_return_fnew_pnt:
2206 case Hexagon::L4_return_tnew_pt:
2207 case Hexagon::L4_return_fnew_pt:
2228 for (
auto &RegA : DefsA)
2229 for (
auto &RegB : UsesB) {
2246 switch (
MI.getOpcode()) {
2247 case Hexagon::V6_vL32b_cur_pi:
2248 case Hexagon::V6_vL32b_cur_ai:
2272 return (Opcode == Hexagon::ENDLOOP0 ||
2273 Opcode == Hexagon::ENDLOOP1);
2298 switch (
MI.getOpcode()) {
2300 case Hexagon::PS_fi:
2301 case Hexagon::PS_fia:
2326 unsigned Opcode =
MI.getOpcode();
2336 if (!
I.mayLoad() && !
I.mayStore())
2342 switch (
MI.getOpcode()) {
2343 case Hexagon::J2_callr:
2344 case Hexagon::J2_callrf:
2345 case Hexagon::J2_callrt:
2346 case Hexagon::PS_call_nr:
2353 switch (
MI.getOpcode()) {
2354 case Hexagon::L4_return:
2355 case Hexagon::L4_return_t:
2356 case Hexagon::L4_return_f:
2357 case Hexagon::L4_return_fnew_pnt:
2358 case Hexagon::L4_return_fnew_pt:
2359 case Hexagon::L4_return_tnew_pnt:
2360 case Hexagon::L4_return_tnew_pt:
2367 switch (
MI.getOpcode()) {
2368 case Hexagon::J2_jumpr:
2369 case Hexagon::J2_jumprt:
2370 case Hexagon::J2_jumprf:
2371 case Hexagon::J2_jumprtnewpt:
2372 case Hexagon::J2_jumprfnewpt:
2373 case Hexagon::J2_jumprtnew:
2374 case Hexagon::J2_jumprfnew:
2385 unsigned offset)
const {
2391 switch (
MI.getOpcode()) {
2395 case Hexagon::J2_jump:
2396 case Hexagon::J2_call:
2397 case Hexagon::PS_call_nr:
2399 case Hexagon::J2_jumpt:
2400 case Hexagon::J2_jumpf:
2401 case Hexagon::J2_jumptnew:
2402 case Hexagon::J2_jumptnewpt:
2403 case Hexagon::J2_jumpfnew:
2404 case Hexagon::J2_jumpfnewpt:
2405 case Hexagon::J2_callt:
2406 case Hexagon::J2_callf:
2408 case Hexagon::J2_loop0i:
2409 case Hexagon::J2_loop0iext:
2410 case Hexagon::J2_loop0r:
2411 case Hexagon::J2_loop0rext:
2412 case Hexagon::J2_loop1i:
2413 case Hexagon::J2_loop1iext:
2414 case Hexagon::J2_loop1r:
2415 case Hexagon::J2_loop1rext:
2418 case Hexagon::J4_cmpeqi_tp0_jump_nt:
2419 case Hexagon::J4_cmpeqi_tp1_jump_nt:
2420 case Hexagon::J4_cmpeqn1_tp0_jump_nt:
2421 case Hexagon::J4_cmpeqn1_tp1_jump_nt:
2433 unsigned Opcode =
MI.getOpcode();
2434 return Opcode == Hexagon::J2_loop0i ||
2435 Opcode == Hexagon::J2_loop0r ||
2436 Opcode == Hexagon::J2_loop0iext ||
2437 Opcode == Hexagon::J2_loop0rext ||
2438 Opcode == Hexagon::J2_loop1i ||
2439 Opcode == Hexagon::J2_loop1r ||
2440 Opcode == Hexagon::J2_loop1iext ||
2441 Opcode == Hexagon::J2_loop1rext;
2445 switch (
MI.getOpcode()) {
2446 default:
return false;
2447 case Hexagon::L4_iadd_memopw_io:
2448 case Hexagon::L4_isub_memopw_io:
2449 case Hexagon::L4_add_memopw_io:
2450 case Hexagon::L4_sub_memopw_io:
2451 case Hexagon::L4_and_memopw_io:
2452 case Hexagon::L4_or_memopw_io:
2453 case Hexagon::L4_iadd_memoph_io:
2454 case Hexagon::L4_isub_memoph_io:
2455 case Hexagon::L4_add_memoph_io:
2456 case Hexagon::L4_sub_memoph_io:
2457 case Hexagon::L4_and_memoph_io:
2458 case Hexagon::L4_or_memoph_io:
2459 case Hexagon::L4_iadd_memopb_io:
2460 case Hexagon::L4_isub_memopb_io:
2461 case Hexagon::L4_add_memopb_io:
2462 case Hexagon::L4_sub_memopb_io:
2463 case Hexagon::L4_and_memopb_io:
2464 case Hexagon::L4_or_memopb_io:
2465 case Hexagon::L4_ior_memopb_io:
2466 case Hexagon::L4_ior_memoph_io:
2467 case Hexagon::L4_ior_memopw_io:
2468 case Hexagon::L4_iand_memopb_io:
2469 case Hexagon::L4_iand_memoph_io:
2470 case Hexagon::L4_iand_memopw_io:
2510 unsigned OperandNum)
const {
2560 return MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4 ||
2561 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_EXT ||
2562 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_PIC ||
2563 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_EXT_PIC;
2567 switch (
MI.getOpcode()) {
2569 case Hexagon::L2_loadrb_io:
2570 case Hexagon::L4_loadrb_ur:
2571 case Hexagon::L4_loadrb_ap:
2572 case Hexagon::L2_loadrb_pr:
2573 case Hexagon::L2_loadrb_pbr:
2574 case Hexagon::L2_loadrb_pi:
2575 case Hexagon::L2_loadrb_pci:
2576 case Hexagon::L2_loadrb_pcr:
2577 case Hexagon::L2_loadbsw2_io:
2578 case Hexagon::L4_loadbsw2_ur:
2579 case Hexagon::L4_loadbsw2_ap:
2580 case Hexagon::L2_loadbsw2_pr:
2581 case Hexagon::L2_loadbsw2_pbr:
2582 case Hexagon::L2_loadbsw2_pi:
2583 case Hexagon::L2_loadbsw2_pci:
2584 case Hexagon::L2_loadbsw2_pcr:
2585 case Hexagon::L2_loadbsw4_io:
2586 case Hexagon::L4_loadbsw4_ur:
2587 case Hexagon::L4_loadbsw4_ap:
2588 case Hexagon::L2_loadbsw4_pr:
2589 case Hexagon::L2_loadbsw4_pbr:
2590 case Hexagon::L2_loadbsw4_pi:
2591 case Hexagon::L2_loadbsw4_pci:
2592 case Hexagon::L2_loadbsw4_pcr:
2593 case Hexagon::L4_loadrb_rr:
2594 case Hexagon::L2_ploadrbt_io:
2595 case Hexagon::L2_ploadrbt_pi:
2596 case Hexagon::L2_ploadrbf_io:
2597 case Hexagon::L2_ploadrbf_pi:
2598 case Hexagon::L2_ploadrbtnew_io:
2599 case Hexagon::L2_ploadrbfnew_io:
2600 case Hexagon::L4_ploadrbt_rr:
2601 case Hexagon::L4_ploadrbf_rr:
2602 case Hexagon::L4_ploadrbtnew_rr:
2603 case Hexagon::L4_ploadrbfnew_rr:
2604 case Hexagon::L2_ploadrbtnew_pi:
2605 case Hexagon::L2_ploadrbfnew_pi:
2606 case Hexagon::L4_ploadrbt_abs:
2607 case Hexagon::L4_ploadrbf_abs:
2608 case Hexagon::L4_ploadrbtnew_abs:
2609 case Hexagon::L4_ploadrbfnew_abs:
2610 case Hexagon::L2_loadrbgp:
2612 case Hexagon::L2_loadrh_io:
2613 case Hexagon::L4_loadrh_ur:
2614 case Hexagon::L4_loadrh_ap:
2615 case Hexagon::L2_loadrh_pr:
2616 case Hexagon::L2_loadrh_pbr:
2617 case Hexagon::L2_loadrh_pi:
2618 case Hexagon::L2_loadrh_pci:
2619 case Hexagon::L2_loadrh_pcr:
2620 case Hexagon::L4_loadrh_rr:
2621 case Hexagon::L2_ploadrht_io:
2622 case Hexagon::L2_ploadrht_pi:
2623 case Hexagon::L2_ploadrhf_io:
2624 case Hexagon::L2_ploadrhf_pi:
2625 case Hexagon::L2_ploadrhtnew_io:
2626 case Hexagon::L2_ploadrhfnew_io:
2627 case Hexagon::L4_ploadrht_rr:
2628 case Hexagon::L4_ploadrhf_rr:
2629 case Hexagon::L4_ploadrhtnew_rr:
2630 case Hexagon::L4_ploadrhfnew_rr:
2631 case Hexagon::L2_ploadrhtnew_pi:
2632 case Hexagon::L2_ploadrhfnew_pi:
2633 case Hexagon::L4_ploadrht_abs:
2634 case Hexagon::L4_ploadrhf_abs:
2635 case Hexagon::L4_ploadrhtnew_abs:
2636 case Hexagon::L4_ploadrhfnew_abs:
2637 case Hexagon::L2_loadrhgp:
2650 switch (
MI.getOpcode()) {
2651 case Hexagon::STriw_pred:
2652 case Hexagon::LDriw_pred:
2663 for (
auto &
Op :
MI.operands())
2664 if (
Op.isGlobal() ||
Op.isSymbol())
2671 unsigned SchedClass =
MI.getDesc().getSchedClass();
2672 return is_TC1(SchedClass);
2676 unsigned SchedClass =
MI.getDesc().getSchedClass();
2677 return is_TC2(SchedClass);
2681 unsigned SchedClass =
MI.getDesc().getSchedClass();
2686 unsigned SchedClass =
MI.getDesc().getSchedClass();
2697 for (
int I = 0;
I <
N;
I++)
2702 if (MI2.
getOpcode() == Hexagon::V6_vS32b_pi)
2763 case Hexagon::PS_vstorerq_ai:
2764 case Hexagon::PS_vstorerv_ai:
2765 case Hexagon::PS_vstorerw_ai:
2766 case Hexagon::PS_vstorerw_nt_ai:
2767 case Hexagon::PS_vloadrq_ai:
2768 case Hexagon::PS_vloadrv_ai:
2769 case Hexagon::PS_vloadrw_ai:
2770 case Hexagon::PS_vloadrw_nt_ai:
2771 case Hexagon::V6_vL32b_ai:
2772 case Hexagon::V6_vS32b_ai:
2773 case Hexagon::V6_vS32b_pred_ai:
2774 case Hexagon::V6_vS32b_npred_ai:
2775 case Hexagon::V6_vS32b_qpred_ai:
2776 case Hexagon::V6_vS32b_nqpred_ai:
2777 case Hexagon::V6_vS32b_new_ai:
2778 case Hexagon::V6_vS32b_new_pred_ai:
2779 case Hexagon::V6_vS32b_new_npred_ai:
2780 case Hexagon::V6_vS32b_nt_pred_ai:
2781 case Hexagon::V6_vS32b_nt_npred_ai:
2782 case Hexagon::V6_vS32b_nt_new_ai:
2783 case Hexagon::V6_vS32b_nt_new_pred_ai:
2784 case Hexagon::V6_vS32b_nt_new_npred_ai:
2785 case Hexagon::V6_vS32b_nt_qpred_ai:
2786 case Hexagon::V6_vS32b_nt_nqpred_ai:
2787 case Hexagon::V6_vL32b_nt_ai:
2788 case Hexagon::V6_vS32b_nt_ai:
2789 case Hexagon::V6_vL32Ub_ai:
2790 case Hexagon::V6_vS32Ub_ai:
2791 case Hexagon::V6_vL32b_cur_ai:
2792 case Hexagon::V6_vL32b_tmp_ai:
2793 case Hexagon::V6_vL32b_pred_ai:
2794 case Hexagon::V6_vL32b_npred_ai:
2795 case Hexagon::V6_vL32b_cur_pred_ai:
2796 case Hexagon::V6_vL32b_cur_npred_ai:
2797 case Hexagon::V6_vL32b_tmp_pred_ai:
2798 case Hexagon::V6_vL32b_tmp_npred_ai:
2799 case Hexagon::V6_vL32b_nt_cur_ai:
2800 case Hexagon::V6_vL32b_nt_tmp_ai:
2801 case Hexagon::V6_vL32b_nt_pred_ai:
2802 case Hexagon::V6_vL32b_nt_npred_ai:
2803 case Hexagon::V6_vL32b_nt_cur_pred_ai:
2804 case Hexagon::V6_vL32b_nt_cur_npred_ai:
2805 case Hexagon::V6_vL32b_nt_tmp_pred_ai:
2806 case Hexagon::V6_vL32b_nt_tmp_npred_ai:
2807 case Hexagon::V6_vgathermh_pseudo:
2808 case Hexagon::V6_vgathermw_pseudo:
2809 case Hexagon::V6_vgathermhw_pseudo:
2810 case Hexagon::V6_vgathermhq_pseudo:
2811 case Hexagon::V6_vgathermwq_pseudo:
2812 case Hexagon::V6_vgathermhwq_pseudo: {
2813 unsigned VectorSize =
TRI->getSpillSize(Hexagon::HvxVRRegClass);
2815 if (
Offset & (VectorSize-1))
2820 case Hexagon::J2_loop0i:
2821 case Hexagon::J2_loop1i:
2824 case Hexagon::S4_storeirb_io:
2825 case Hexagon::S4_storeirbt_io:
2826 case Hexagon::S4_storeirbf_io:
2829 case Hexagon::S4_storeirh_io:
2830 case Hexagon::S4_storeirht_io:
2831 case Hexagon::S4_storeirhf_io:
2834 case Hexagon::S4_storeiri_io:
2835 case Hexagon::S4_storeirit_io:
2836 case Hexagon::S4_storeirif_io:
2839 case Hexagon::A4_cmpbeqi:
2841 case Hexagon::A4_cmpbgti:
2849 case Hexagon::L2_loadri_io:
2850 case Hexagon::S2_storeri_io:
2854 case Hexagon::L2_loadrd_io:
2855 case Hexagon::S2_storerd_io:
2859 case Hexagon::L2_loadrh_io:
2860 case Hexagon::L2_loadruh_io:
2861 case Hexagon::S2_storerh_io:
2862 case Hexagon::S2_storerf_io:
2866 case Hexagon::L2_loadrb_io:
2867 case Hexagon::L2_loadrub_io:
2868 case Hexagon::S2_storerb_io:
2872 case Hexagon::A2_addi:
2876 case Hexagon::L4_iadd_memopw_io:
2877 case Hexagon::L4_isub_memopw_io:
2878 case Hexagon::L4_add_memopw_io:
2879 case Hexagon::L4_sub_memopw_io:
2880 case Hexagon::L4_iand_memopw_io:
2881 case Hexagon::L4_ior_memopw_io:
2882 case Hexagon::L4_and_memopw_io:
2883 case Hexagon::L4_or_memopw_io:
2886 case Hexagon::L4_iadd_memoph_io:
2887 case Hexagon::L4_isub_memoph_io:
2888 case Hexagon::L4_add_memoph_io:
2889 case Hexagon::L4_sub_memoph_io:
2890 case Hexagon::L4_iand_memoph_io:
2891 case Hexagon::L4_ior_memoph_io:
2892 case Hexagon::L4_and_memoph_io:
2893 case Hexagon::L4_or_memoph_io:
2896 case Hexagon::L4_iadd_memopb_io:
2897 case Hexagon::L4_isub_memopb_io:
2898 case Hexagon::L4_add_memopb_io:
2899 case Hexagon::L4_sub_memopb_io:
2900 case Hexagon::L4_iand_memopb_io:
2901 case Hexagon::L4_ior_memopb_io:
2902 case Hexagon::L4_and_memopb_io:
2903 case Hexagon::L4_or_memopb_io:
2908 case Hexagon::STriw_pred:
2909 case Hexagon::LDriw_pred:
2910 case Hexagon::STriw_ctr:
2911 case Hexagon::LDriw_ctr:
2914 case Hexagon::PS_fi:
2915 case Hexagon::PS_fia:
2916 case Hexagon::INLINEASM:
2919 case Hexagon::L2_ploadrbt_io:
2920 case Hexagon::L2_ploadrbf_io:
2921 case Hexagon::L2_ploadrubt_io:
2922 case Hexagon::L2_ploadrubf_io:
2923 case Hexagon::S2_pstorerbt_io:
2924 case Hexagon::S2_pstorerbf_io:
2927 case Hexagon::L2_ploadrht_io:
2928 case Hexagon::L2_ploadrhf_io:
2929 case Hexagon::L2_ploadruht_io:
2930 case Hexagon::L2_ploadruhf_io:
2931 case Hexagon::S2_pstorerht_io:
2932 case Hexagon::S2_pstorerhf_io:
2935 case Hexagon::L2_ploadrit_io:
2936 case Hexagon::L2_ploadrif_io:
2937 case Hexagon::S2_pstorerit_io:
2938 case Hexagon::S2_pstorerif_io:
2941 case Hexagon::L2_ploadrdt_io:
2942 case Hexagon::L2_ploadrdf_io:
2943 case Hexagon::S2_pstorerdt_io:
2944 case Hexagon::S2_pstorerdf_io:
2947 case Hexagon::L2_loadbsw2_io:
2948 case Hexagon::L2_loadbzw2_io:
2951 case Hexagon::L2_loadbsw4_io:
2952 case Hexagon::L2_loadbzw4_io:
2956 dbgs() <<
"Failed Opcode is : " << Opcode <<
" (" <<
getName(Opcode)
2959 "Please define it in the above switch statement!");
2989 switch (
MI.getOpcode()) {
2991 case Hexagon::L2_loadrub_io:
2992 case Hexagon::L4_loadrub_ur:
2993 case Hexagon::L4_loadrub_ap:
2994 case Hexagon::L2_loadrub_pr:
2995 case Hexagon::L2_loadrub_pbr:
2996 case Hexagon::L2_loadrub_pi:
2997 case Hexagon::L2_loadrub_pci:
2998 case Hexagon::L2_loadrub_pcr:
2999 case Hexagon::L2_loadbzw2_io:
3000 case Hexagon::L4_loadbzw2_ur:
3001 case Hexagon::L4_loadbzw2_ap:
3002 case Hexagon::L2_loadbzw2_pr:
3003 case Hexagon::L2_loadbzw2_pbr:
3004 case Hexagon::L2_loadbzw2_pi:
3005 case Hexagon::L2_loadbzw2_pci:
3006 case Hexagon::L2_loadbzw2_pcr:
3007 case Hexagon::L2_loadbzw4_io:
3008 case Hexagon::L4_loadbzw4_ur:
3009 case Hexagon::L4_loadbzw4_ap:
3010 case Hexagon::L2_loadbzw4_pr:
3011 case Hexagon::L2_loadbzw4_pbr:
3012 case Hexagon::L2_loadbzw4_pi:
3013 case Hexagon::L2_loadbzw4_pci:
3014 case Hexagon::L2_loadbzw4_pcr:
3015 case Hexagon::L4_loadrub_rr:
3016 case Hexagon::L2_ploadrubt_io:
3017 case Hexagon::L2_ploadrubt_pi:
3018 case Hexagon::L2_ploadrubf_io:
3019 case Hexagon::L2_ploadrubf_pi:
3020 case Hexagon::L2_ploadrubtnew_io:
3021 case Hexagon::L2_ploadrubfnew_io:
3022 case Hexagon::L4_ploadrubt_rr:
3023 case Hexagon::L4_ploadrubf_rr:
3024 case Hexagon::L4_ploadrubtnew_rr:
3025 case Hexagon::L4_ploadrubfnew_rr:
3026 case Hexagon::L2_ploadrubtnew_pi:
3027 case Hexagon::L2_ploadrubfnew_pi:
3028 case Hexagon::L4_ploadrubt_abs:
3029 case Hexagon::L4_ploadrubf_abs:
3030 case Hexagon::L4_ploadrubtnew_abs:
3031 case Hexagon::L4_ploadrubfnew_abs:
3032 case Hexagon::L2_loadrubgp:
3034 case Hexagon::L2_loadruh_io:
3035 case Hexagon::L4_loadruh_ur:
3036 case Hexagon::L4_loadruh_ap:
3037 case Hexagon::L2_loadruh_pr:
3038 case Hexagon::L2_loadruh_pbr:
3039 case Hexagon::L2_loadruh_pi:
3040 case Hexagon::L2_loadruh_pci:
3041 case Hexagon::L2_loadruh_pcr:
3042 case Hexagon::L4_loadruh_rr:
3043 case Hexagon::L2_ploadruht_io:
3044 case Hexagon::L2_ploadruht_pi:
3045 case Hexagon::L2_ploadruhf_io:
3046 case Hexagon::L2_ploadruhf_pi:
3047 case Hexagon::L2_ploadruhtnew_io:
3048 case Hexagon::L2_ploadruhfnew_io:
3049 case Hexagon::L4_ploadruht_rr:
3050 case Hexagon::L4_ploadruhf_rr:
3051 case Hexagon::L4_ploadruhtnew_rr:
3052 case Hexagon::L4_ploadruhfnew_rr:
3053 case Hexagon::L2_ploadruhtnew_pi:
3054 case Hexagon::L2_ploadruhfnew_pi:
3055 case Hexagon::L4_ploadruht_abs:
3056 case Hexagon::L4_ploadruhf_abs:
3057 case Hexagon::L4_ploadruhtnew_abs:
3058 case Hexagon::L4_ploadruhfnew_abs:
3059 case Hexagon::L2_loadruhgp:
3080 OffsetIsScalable =
false;
3082 if (!BaseOp || !BaseOp->
isReg())
3091 if (Second.
mayStore() &&
First.getOpcode() == Hexagon::S2_allocframe) {
3093 if (
Op.isReg() &&
Op.isUse() &&
Op.getReg() == Hexagon::R29)
3103 if (!Stored.
isReg())
3105 for (
unsigned i = 0, e =
First.getNumOperands(); i < e; ++i) {
3107 if (
Op.isReg() &&
Op.isDef() &&
Op.getReg() == Stored.
getReg())
3116 return Opc == Hexagon::PS_call_nr ||
Opc == Hexagon::PS_callr_nr;
3132 if (Hexagon::getRegForm(
MI.getOpcode()) >= 0)
3135 if (
MI.getDesc().mayLoad() ||
MI.getDesc().mayStore()) {
3142 NonExtOpcode = Hexagon::changeAddrMode_abs_io(
MI.getOpcode());
3148 NonExtOpcode = Hexagon::changeAddrMode_io_rr(
MI.getOpcode());
3151 NonExtOpcode = Hexagon::changeAddrMode_ur_rr(
MI.getOpcode());
3156 if (NonExtOpcode < 0)
3164 return Hexagon::getRealHWInstr(
MI.getOpcode(),
3165 Hexagon::InstrType_Pseudo) >= 0;
3183 Subtarget.hasV60Ops();
3188 if (
MI.mayStore() && !Subtarget.useNewValueStores())
3222 if (!MII->isBundle())
3225 for (++MII; MII != MIE && MII->isInsideBundle(); ++MII) {
3237 if (MO.isRegMask() && MO.clobbersPhysReg(PredReg))
3239 if (MO.isReg() && MO.isDef() && MO.isImplicit() && (MO.getReg() == PredReg))
3245 switch (
MI.getOpcode()) {
3246 case Hexagon::A4_addp_c:
3247 case Hexagon::A4_subp_c:
3248 case Hexagon::A4_tlbmatch:
3249 case Hexagon::A5_ACS:
3250 case Hexagon::F2_sfinvsqrta:
3251 case Hexagon::F2_sfrecipa:
3252 case Hexagon::J2_endloop0:
3253 case Hexagon::J2_endloop01:
3254 case Hexagon::J2_ploop1si:
3255 case Hexagon::J2_ploop1sr:
3256 case Hexagon::J2_ploop2si:
3257 case Hexagon::J2_ploop2sr:
3258 case Hexagon::J2_ploop3si:
3259 case Hexagon::J2_ploop3sr:
3260 case Hexagon::S2_cabacdecbin:
3261 case Hexagon::S2_storew_locked:
3262 case Hexagon::S4_stored_locked:
3269 return Opcode == Hexagon::J2_jumpt ||
3270 Opcode == Hexagon::J2_jumptpt ||
3271 Opcode == Hexagon::J2_jumpf ||
3272 Opcode == Hexagon::J2_jumpfpt ||
3273 Opcode == Hexagon::J2_jumptnew ||
3274 Opcode == Hexagon::J2_jumpfnew ||
3275 Opcode == Hexagon::J2_jumptnewpt ||
3276 Opcode == Hexagon::J2_jumpfnewpt;
3305 unsigned BasePos = 0, OffsetPos = 0;
3328 unsigned &BasePos,
unsigned &OffsetPos)
const {
3336 }
else if (
MI.mayStore()) {
3339 }
else if (
MI.mayLoad()) {
3354 if (!
MI.getOperand(BasePos).isReg() || !
MI.getOperand(OffsetPos).isImm())
3369 if (
I ==
MBB.instr_begin())
3388 }
while (
I !=
MBB.instr_begin());
3390 I =
MBB.instr_end();
3393 while (
I->isDebugInstr()) {
3394 if (
I ==
MBB.instr_begin())
3398 if (!isUnpredicatedTerminator(*
I))
3407 if (&*
I != LastInst && !
I->isBundle() && isUnpredicatedTerminator(*
I)) {
3408 if (!SecondLastInst) {
3409 SecondLastInst = &*
I;
3414 if (
I ==
MBB.instr_begin())
3431 Register DstReg, SrcReg, Src1Reg, Src2Reg;
3433 switch (
MI.getOpcode()) {
3442 case Hexagon::C2_cmpeq:
3443 case Hexagon::C2_cmpgt:
3444 case Hexagon::C2_cmpgtu:
3445 DstReg =
MI.getOperand(0).getReg();
3446 Src1Reg =
MI.getOperand(1).getReg();
3447 Src2Reg =
MI.getOperand(2).getReg();
3448 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3449 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3453 case Hexagon::C2_cmpeqi:
3454 case Hexagon::C2_cmpgti:
3455 case Hexagon::C2_cmpgtui:
3457 DstReg =
MI.getOperand(0).getReg();
3458 SrcReg =
MI.getOperand(1).getReg();
3459 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3460 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3463 (
MI.getOperand(2).getImm() == -1)))
3466 case Hexagon::A2_tfr:
3468 DstReg =
MI.getOperand(0).getReg();
3469 SrcReg =
MI.getOperand(1).getReg();
3473 case Hexagon::A2_tfrsi:
3477 DstReg =
MI.getOperand(0).getReg();
3481 case Hexagon::S2_tstbit_i:
3482 DstReg =
MI.getOperand(0).getReg();
3483 Src1Reg =
MI.getOperand(1).getReg();
3484 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3485 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3486 MI.getOperand(2).isImm() &&
3494 case Hexagon::J2_jumptnew:
3495 case Hexagon::J2_jumpfnew:
3496 case Hexagon::J2_jumptnewpt:
3497 case Hexagon::J2_jumpfnewpt:
3498 Src1Reg =
MI.getOperand(0).getReg();
3499 if (Hexagon::PredRegsRegClass.
contains(Src1Reg) &&
3500 (Hexagon::P0 == Src1Reg || Hexagon::P1 == Src1Reg))
3507 case Hexagon::J2_jump:
3508 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4:
3509 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4_PIC:
3521 if ((GA.
getOpcode() != Hexagon::C2_cmpeqi) ||
3522 (GB.
getOpcode() != Hexagon::J2_jumptnew))
3527 if (DestReg != Hexagon::P0 && DestReg != Hexagon::P1)
3535 return DestReg == Hexagon::P0 ? Hexagon::J4_cmpeqn1_tp0_jump_nt
3536 : Hexagon::J4_cmpeqn1_tp1_jump_nt;
3539 return DestReg == Hexagon::P0 ? Hexagon::J4_cmpeqi_tp0_jump_nt
3540 : Hexagon::J4_cmpeqi_tp1_jump_nt;
3545 bool ForBigCore)
const {
3553 static const std::map<unsigned, unsigned> DupMap = {
3554 {Hexagon::A2_add, Hexagon::dup_A2_add},
3555 {Hexagon::A2_addi, Hexagon::dup_A2_addi},
3556 {Hexagon::A2_andir, Hexagon::dup_A2_andir},
3557 {Hexagon::A2_combineii, Hexagon::dup_A2_combineii},
3558 {Hexagon::A2_sxtb, Hexagon::dup_A2_sxtb},
3559 {Hexagon::A2_sxth, Hexagon::dup_A2_sxth},
3560 {Hexagon::A2_tfr, Hexagon::dup_A2_tfr},
3561 {Hexagon::A2_tfrsi, Hexagon::dup_A2_tfrsi},
3562 {Hexagon::A2_zxtb, Hexagon::dup_A2_zxtb},
3563 {Hexagon::A2_zxth, Hexagon::dup_A2_zxth},
3564 {Hexagon::A4_combineii, Hexagon::dup_A4_combineii},
3565 {Hexagon::A4_combineir, Hexagon::dup_A4_combineir},
3566 {Hexagon::A4_combineri, Hexagon::dup_A4_combineri},
3567 {Hexagon::C2_cmoveif, Hexagon::dup_C2_cmoveif},
3568 {Hexagon::C2_cmoveit, Hexagon::dup_C2_cmoveit},
3569 {Hexagon::C2_cmovenewif, Hexagon::dup_C2_cmovenewif},
3570 {Hexagon::C2_cmovenewit, Hexagon::dup_C2_cmovenewit},
3571 {Hexagon::C2_cmpeqi, Hexagon::dup_C2_cmpeqi},
3572 {Hexagon::L2_deallocframe, Hexagon::dup_L2_deallocframe},
3573 {Hexagon::L2_loadrb_io, Hexagon::dup_L2_loadrb_io},
3574 {Hexagon::L2_loadrd_io, Hexagon::dup_L2_loadrd_io},
3575 {Hexagon::L2_loadrh_io, Hexagon::dup_L2_loadrh_io},
3576 {Hexagon::L2_loadri_io, Hexagon::dup_L2_loadri_io},
3577 {Hexagon::L2_loadrub_io, Hexagon::dup_L2_loadrub_io},
3578 {Hexagon::L2_loadruh_io, Hexagon::dup_L2_loadruh_io},
3579 {Hexagon::S2_allocframe, Hexagon::dup_S2_allocframe},
3580 {Hexagon::S2_storerb_io, Hexagon::dup_S2_storerb_io},
3581 {Hexagon::S2_storerd_io, Hexagon::dup_S2_storerd_io},
3582 {Hexagon::S2_storerh_io, Hexagon::dup_S2_storerh_io},
3583 {Hexagon::S2_storeri_io, Hexagon::dup_S2_storeri_io},
3584 {Hexagon::S4_storeirb_io, Hexagon::dup_S4_storeirb_io},
3585 {Hexagon::S4_storeiri_io, Hexagon::dup_S4_storeiri_io},
3587 unsigned OpNum =
MI.getOpcode();
3590 auto Iter = DupMap.find(OpNum);
3591 if (Iter != DupMap.end())
3592 return Iter->second;
3594 for (
const auto &Iter : DupMap)
3595 if (Iter.second == OpNum)
3602 enum Hexagon::PredSense inPredSense;
3603 inPredSense = invertPredicate ? Hexagon::PredSense_false :
3604 Hexagon::PredSense_true;
3605 int CondOpcode = Hexagon::getPredOpcode(
Opc, inPredSense);
3606 if (CondOpcode >= 0)
3614 switch (
MI.getOpcode()) {
3616 case Hexagon::V6_vL32b_pi:
3617 return Hexagon::V6_vL32b_cur_pi;
3618 case Hexagon::V6_vL32b_ai:
3619 return Hexagon::V6_vL32b_cur_ai;
3620 case Hexagon::V6_vL32b_nt_pi:
3621 return Hexagon::V6_vL32b_nt_cur_pi;
3622 case Hexagon::V6_vL32b_nt_ai:
3623 return Hexagon::V6_vL32b_nt_cur_ai;
3624 case Hexagon::V6_vL32b_ppu:
3625 return Hexagon::V6_vL32b_cur_ppu;
3626 case Hexagon::V6_vL32b_nt_ppu:
3627 return Hexagon::V6_vL32b_nt_cur_ppu;
3634 switch (
MI.getOpcode()) {
3636 case Hexagon::V6_vL32b_cur_pi:
3637 return Hexagon::V6_vL32b_pi;
3638 case Hexagon::V6_vL32b_cur_ai:
3639 return Hexagon::V6_vL32b_ai;
3640 case Hexagon::V6_vL32b_nt_cur_pi:
3641 return Hexagon::V6_vL32b_nt_pi;
3642 case Hexagon::V6_vL32b_nt_cur_ai:
3643 return Hexagon::V6_vL32b_nt_ai;
3644 case Hexagon::V6_vL32b_cur_ppu:
3645 return Hexagon::V6_vL32b_ppu;
3646 case Hexagon::V6_vL32b_nt_cur_ppu:
3647 return Hexagon::V6_vL32b_nt_ppu;
3735 int NVOpcode = Hexagon::getNewValueOpcode(
MI.getOpcode());
3739 switch (
MI.getOpcode()) {
3742 std::to_string(
MI.getOpcode()));
3743 case Hexagon::S4_storerb_ur:
3744 return Hexagon::S4_storerbnew_ur;
3746 case Hexagon::S2_storerb_pci:
3747 return Hexagon::S2_storerb_pci;
3749 case Hexagon::S2_storeri_pci:
3750 return Hexagon::S2_storeri_pci;
3752 case Hexagon::S2_storerh_pci:
3753 return Hexagon::S2_storerh_pci;
3755 case Hexagon::S2_storerd_pci:
3756 return Hexagon::S2_storerd_pci;
3758 case Hexagon::S2_storerf_pci:
3759 return Hexagon::S2_storerf_pci;
3761 case Hexagon::V6_vS32b_ai:
3762 return Hexagon::V6_vS32b_new_ai;
3764 case Hexagon::V6_vS32b_pi:
3765 return Hexagon::V6_vS32b_new_pi;
3790 if (BrTarget.
isMBB()) {
3792 Taken = getEdgeProbability(Src, Dst) >= OneHalf;
3805 bool SawCond =
false, Bad =
false;
3809 if (
I.isConditionalBranch()) {
3816 if (
I.isUnconditionalBranch() && !SawCond) {
3824 if (NextIt ==
B.instr_end()) {
3827 if (!
B.isLayoutSuccessor(SB))
3829 Taken = getEdgeProbability(Src, SB) < OneHalf;
3833 assert(NextIt->isUnconditionalBranch());
3842 Taken =
BT && getEdgeProbability(Src,
BT) < OneHalf;
3849 switch (
MI.getOpcode()) {
3850 case Hexagon::J2_jumpt:
3851 return Taken ? Hexagon::J2_jumptnewpt : Hexagon::J2_jumptnew;
3852 case Hexagon::J2_jumpf:
3853 return Taken ? Hexagon::J2_jumpfnewpt : Hexagon::J2_jumpfnew;
3863 switch (
MI.getOpcode()) {
3865 case Hexagon::J2_jumpt:
3866 case Hexagon::J2_jumpf:
3870 int NewOpcode = Hexagon::getPredNewOpcode(
MI.getOpcode());
3877 int NewOp =
MI.getOpcode();
3879 NewOp = Hexagon::getPredOldOpcode(NewOp);
3883 if (!Subtarget.hasFeature(Hexagon::ArchV60)) {
3885 case Hexagon::J2_jumptpt:
3886 NewOp = Hexagon::J2_jumpt;
3888 case Hexagon::J2_jumpfpt:
3889 NewOp = Hexagon::J2_jumpf;
3891 case Hexagon::J2_jumprtpt:
3892 NewOp = Hexagon::J2_jumprt;
3894 case Hexagon::J2_jumprfpt:
3895 NewOp = Hexagon::J2_jumprf;
3900 "Couldn't change predicate new instruction to its old form.");
3904 NewOp = Hexagon::getNonNVStore(NewOp);
3905 assert(NewOp >= 0 &&
"Couldn't change new-value store to its old form.");
3908 if (Subtarget.hasV60Ops())
3913 case Hexagon::J2_jumpfpt:
3914 return Hexagon::J2_jumpf;
3915 case Hexagon::J2_jumptpt:
3916 return Hexagon::J2_jumpt;
3917 case Hexagon::J2_jumprfpt:
3918 return Hexagon::J2_jumprf;
3919 case Hexagon::J2_jumprtpt:
3920 return Hexagon::J2_jumprt;
3929 Register DstReg, SrcReg, Src1Reg, Src2Reg;
3932 switch (
MI.getOpcode()) {
3940 case Hexagon::L2_loadri_io:
3941 case Hexagon::dup_L2_loadri_io:
3942 DstReg =
MI.getOperand(0).getReg();
3943 SrcReg =
MI.getOperand(1).getReg();
3947 if (Hexagon::IntRegsRegClass.
contains(SrcReg) &&
3949 MI.getOperand(2).isImm() &&
3954 (
MI.getOperand(2).isImm() &&
3959 case Hexagon::L2_loadrub_io:
3960 case Hexagon::dup_L2_loadrub_io:
3962 DstReg =
MI.getOperand(0).getReg();
3963 SrcReg =
MI.getOperand(1).getReg();
3965 MI.getOperand(2).isImm() &&
isUInt<4>(
MI.getOperand(2).getImm()))
3978 case Hexagon::L2_loadrh_io:
3979 case Hexagon::L2_loadruh_io:
3980 case Hexagon::dup_L2_loadrh_io:
3981 case Hexagon::dup_L2_loadruh_io:
3983 DstReg =
MI.getOperand(0).getReg();
3984 SrcReg =
MI.getOperand(1).getReg();
3986 MI.getOperand(2).isImm() &&
3990 case Hexagon::L2_loadrb_io:
3991 case Hexagon::dup_L2_loadrb_io:
3993 DstReg =
MI.getOperand(0).getReg();
3994 SrcReg =
MI.getOperand(1).getReg();
3996 MI.getOperand(2).isImm() &&
4000 case Hexagon::L2_loadrd_io:
4001 case Hexagon::dup_L2_loadrd_io:
4003 DstReg =
MI.getOperand(0).getReg();
4004 SrcReg =
MI.getOperand(1).getReg();
4006 Hexagon::IntRegsRegClass.
contains(SrcReg) &&
4008 MI.getOperand(2).isImm() &&
4014 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4:
4015 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4_PIC:
4016 case Hexagon::L4_return:
4017 case Hexagon::L2_deallocframe:
4018 case Hexagon::dup_L2_deallocframe:
4020 case Hexagon::EH_RETURN_JMPR:
4021 case Hexagon::PS_jmpret:
4022 case Hexagon::SL2_jumpr31:
4025 DstReg =
MI.getOperand(0).getReg();
4026 if (Hexagon::IntRegsRegClass.
contains(DstReg) && (Hexagon::R31 == DstReg))
4029 case Hexagon::PS_jmprett:
4030 case Hexagon::PS_jmpretf:
4031 case Hexagon::PS_jmprettnewpt:
4032 case Hexagon::PS_jmpretfnewpt:
4033 case Hexagon::PS_jmprettnew:
4034 case Hexagon::PS_jmpretfnew:
4035 case Hexagon::SL2_jumpr31_t:
4036 case Hexagon::SL2_jumpr31_f:
4037 case Hexagon::SL2_jumpr31_tnew:
4038 case Hexagon::SL2_jumpr31_fnew:
4039 DstReg =
MI.getOperand(1).getReg();
4040 SrcReg =
MI.getOperand(0).getReg();
4042 if ((Hexagon::PredRegsRegClass.
contains(SrcReg) &&
4043 (Hexagon::P0 == SrcReg)) &&
4044 (Hexagon::IntRegsRegClass.
contains(DstReg) && (Hexagon::R31 == DstReg)))
4047 case Hexagon::L4_return_t:
4048 case Hexagon::L4_return_f:
4049 case Hexagon::L4_return_tnew_pnt:
4050 case Hexagon::L4_return_fnew_pnt:
4051 case Hexagon::L4_return_tnew_pt:
4052 case Hexagon::L4_return_fnew_pt:
4054 SrcReg =
MI.getOperand(0).getReg();
4055 if (Hexagon::PredRegsRegClass.
contains(SrcReg) && (Hexagon::P0 == SrcReg))
4063 case Hexagon::S2_storeri_io:
4064 case Hexagon::dup_S2_storeri_io:
4067 Src1Reg =
MI.getOperand(0).getReg();
4068 Src2Reg =
MI.getOperand(2).getReg();
4069 if (Hexagon::IntRegsRegClass.
contains(Src1Reg) &&
4076 MI.getOperand(1).isImm() &&
4080 case Hexagon::S2_storerb_io:
4081 case Hexagon::dup_S2_storerb_io:
4083 Src1Reg =
MI.getOperand(0).getReg();
4084 Src2Reg =
MI.getOperand(2).getReg();
4086 MI.getOperand(1).isImm() &&
isUInt<4>(
MI.getOperand(1).getImm()))
4098 case Hexagon::S2_storerh_io:
4099 case Hexagon::dup_S2_storerh_io:
4101 Src1Reg =
MI.getOperand(0).getReg();
4102 Src2Reg =
MI.getOperand(2).getReg();
4104 MI.getOperand(1).isImm() &&
4108 case Hexagon::S2_storerd_io:
4109 case Hexagon::dup_S2_storerd_io:
4111 Src1Reg =
MI.getOperand(0).getReg();
4112 Src2Reg =
MI.getOperand(2).getReg();
4114 Hexagon::IntRegsRegClass.
contains(Src1Reg) &&
4119 case Hexagon::S4_storeiri_io:
4120 case Hexagon::dup_S4_storeiri_io:
4122 Src1Reg =
MI.getOperand(0).getReg();
4125 MI.getOperand(2).isImm() &&
isUInt<1>(
MI.getOperand(2).getImm()))
4128 case Hexagon::S4_storeirb_io:
4129 case Hexagon::dup_S4_storeirb_io:
4131 Src1Reg =
MI.getOperand(0).getReg();
4133 MI.getOperand(1).isImm() &&
isUInt<4>(
MI.getOperand(1).getImm()) &&
4134 MI.getOperand(2).isImm() &&
isUInt<1>(
MI.getOperand(2).getImm()))
4137 case Hexagon::S2_allocframe:
4138 case Hexagon::dup_S2_allocframe:
4139 if (
MI.getOperand(2).isImm() &&
4161 case Hexagon::A2_addi:
4162 case Hexagon::dup_A2_addi:
4163 DstReg =
MI.getOperand(0).getReg();
4164 SrcReg =
MI.getOperand(1).getReg();
4167 if (Hexagon::IntRegsRegClass.
contains(SrcReg) &&
4172 if ((DstReg == SrcReg) &&
MI.getOperand(2).isImm() &&
4178 ((
MI.getOperand(2).getImm() == 1) ||
4179 (
MI.getOperand(2).getImm() == -1)))
4183 case Hexagon::A2_add:
4184 case Hexagon::dup_A2_add:
4186 DstReg =
MI.getOperand(0).getReg();
4187 Src1Reg =
MI.getOperand(1).getReg();
4188 Src2Reg =
MI.getOperand(2).getReg();
4193 case Hexagon::A2_andir:
4194 case Hexagon::dup_A2_andir:
4198 DstReg =
MI.getOperand(0).getReg();
4199 SrcReg =
MI.getOperand(1).getReg();
4201 MI.getOperand(2).isImm() &&
4202 ((
MI.getOperand(2).getImm() == 1) ||
4203 (
MI.getOperand(2).getImm() == 255)))
4206 case Hexagon::A2_tfr:
4207 case Hexagon::dup_A2_tfr:
4209 DstReg =
MI.getOperand(0).getReg();
4210 SrcReg =
MI.getOperand(1).getReg();
4214 case Hexagon::A2_tfrsi:
4215 case Hexagon::dup_A2_tfrsi:
4220 DstReg =
MI.getOperand(0).getReg();
4224 case Hexagon::C2_cmoveit:
4225 case Hexagon::C2_cmovenewit:
4226 case Hexagon::C2_cmoveif:
4227 case Hexagon::C2_cmovenewif:
4228 case Hexagon::dup_C2_cmoveit:
4229 case Hexagon::dup_C2_cmovenewit:
4230 case Hexagon::dup_C2_cmoveif:
4231 case Hexagon::dup_C2_cmovenewif:
4235 DstReg =
MI.getOperand(0).getReg();
4236 SrcReg =
MI.getOperand(1).getReg();
4238 Hexagon::PredRegsRegClass.
contains(SrcReg) && Hexagon::P0 == SrcReg &&
4239 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0)
4242 case Hexagon::C2_cmpeqi:
4243 case Hexagon::dup_C2_cmpeqi:
4245 DstReg =
MI.getOperand(0).getReg();
4246 SrcReg =
MI.getOperand(1).getReg();
4247 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
4249 MI.getOperand(2).isImm() &&
isUInt<2>(
MI.getOperand(2).getImm()))
4252 case Hexagon::A2_combineii:
4253 case Hexagon::A4_combineii:
4254 case Hexagon::dup_A2_combineii:
4255 case Hexagon::dup_A4_combineii:
4257 DstReg =
MI.getOperand(0).getReg();
4259 ((
MI.getOperand(1).isImm() &&
isUInt<2>(
MI.getOperand(1).getImm())) ||
4260 (
MI.getOperand(1).isGlobal() &&
4262 ((
MI.getOperand(2).isImm() &&
isUInt<2>(
MI.getOperand(2).getImm())) ||
4263 (
MI.getOperand(2).isGlobal() &&
4267 case Hexagon::A4_combineri:
4268 case Hexagon::dup_A4_combineri:
4271 DstReg =
MI.getOperand(0).getReg();
4272 SrcReg =
MI.getOperand(1).getReg();
4274 ((
MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0) ||
4275 (
MI.getOperand(2).isGlobal() &&
MI.getOperand(2).getOffset() == 0)))
4278 case Hexagon::A4_combineir:
4279 case Hexagon::dup_A4_combineir:
4281 DstReg =
MI.getOperand(0).getReg();
4282 SrcReg =
MI.getOperand(2).getReg();
4284 ((
MI.getOperand(1).isImm() &&
MI.getOperand(1).getImm() == 0) ||
4285 (
MI.getOperand(1).isGlobal() &&
MI.getOperand(1).getOffset() == 0)))
4288 case Hexagon::A2_sxtb:
4289 case Hexagon::A2_sxth:
4290 case Hexagon::A2_zxtb:
4291 case Hexagon::A2_zxth:
4292 case Hexagon::dup_A2_sxtb:
4293 case Hexagon::dup_A2_sxth:
4294 case Hexagon::dup_A2_zxtb:
4295 case Hexagon::dup_A2_zxth:
4297 DstReg =
MI.getOperand(0).getReg();
4298 SrcReg =
MI.getOperand(1).getReg();
4308 return Hexagon::getRealHWInstr(
MI.getOpcode(), Hexagon::InstrType_Real);
4318 if (
MI.isTransient())
4342 int Idx =
DefMI.findRegisterDefOperandIdx(SR, &HRI,
false,
false);
4353 int Idx =
UseMI.findRegisterUseOperandIdx(SR, &HRI,
false);
4387 : Hexagon::getTruePredOpcode(
Opc);
4388 if (InvPredOpcode >= 0)
4389 return InvPredOpcode;
4403 return ~(-1U << (bits - 1));
4405 return ~(-1U << bits);
4410 switch (
MI.getOpcode()) {
4411 case Hexagon::L2_loadrbgp:
4412 case Hexagon::L2_loadrdgp:
4413 case Hexagon::L2_loadrhgp:
4414 case Hexagon::L2_loadrigp:
4415 case Hexagon::L2_loadrubgp:
4416 case Hexagon::L2_loadruhgp:
4417 case Hexagon::S2_storerbgp:
4418 case Hexagon::S2_storerbnewgp:
4419 case Hexagon::S2_storerhgp:
4420 case Hexagon::S2_storerhnewgp:
4421 case Hexagon::S2_storerigp:
4422 case Hexagon::S2_storerinewgp:
4423 case Hexagon::S2_storerdgp:
4424 case Hexagon::S2_storerfgp:
4442 if (
MI.getOpcode() == Hexagon::A4_ext)
4456 bool ToBigInstrs)
const {
4468 MII->setDesc(
get(Opcode));
4474 bool ToBigInstrs)
const {
4477 End = MB.instr_end();
4478 Instr != End; ++Instr)
4486 while ((MII !=
MBB->instr_end()) && MII->isInsideBundle()) {
4496 unsigned S = (
F >> MemAccessSizePos) & MemAccesSizeMask;
4497 unsigned Size = getMemAccessSizeInBytes(MemAccessSize(S));
4501 if (
MI.getOpcode() == Hexagon::Y2_dcfetchbo)
4508 return HRI.getSpillSize(Hexagon::HvxVRRegClass);
4523 return -1U << (bits - 1);
4532 short NonExtOpcode = Hexagon::getRegForm(
MI.getOpcode());
4533 if (NonExtOpcode >= 0)
4534 return NonExtOpcode;
4536 if (
MI.getDesc().mayLoad() ||
MI.getDesc().mayStore()) {
4540 return Hexagon::changeAddrMode_abs_io(
MI.getOpcode());
4542 return Hexagon::changeAddrMode_io_rr(
MI.getOpcode());
4544 return Hexagon::changeAddrMode_ur_rr(
MI.getOpcode());
4554 Register &PredReg,
unsigned &PredRegPos,
unsigned &PredRegFlags)
const {
4562 PredReg =
Cond[1].getReg();
4566 if (
Cond[1].isImplicit())
4574 return Hexagon::getRealHWInstr(
MI.getOpcode(), Hexagon::InstrType_Pseudo);
4578 return Hexagon::getRegForm(
MI.getOpcode());
4586 if (
MI.isDebugInstr() ||
MI.isPosition())
4589 unsigned Size =
MI.getDesc().getSize();
4605 unsigned NumDefs = 0;
4606 for (;
MI.getOperand(NumDefs).
isReg() &&
MI.getOperand(NumDefs).isDef();
4608 assert(NumDefs !=
MI.getNumOperands()-2 &&
"No asm string?");
4610 assert(
MI.getOperand(NumDefs).isSymbol() &&
"No asm string?");
4612 const char *AsmStr =
MI.getOperand(NumDefs).getSymbolName();
4626 const InstrStage &IS = *
II.beginStage(
MI.getDesc().getSchedClass());
4638 assert(BundleHead->isBundle() &&
"Not a bundle header");
4648 "Instruction must be extendable");
4654 "Branch with unknown extendable field type");
4666 int TargetPos =
MI.getNumOperands() - 1;
4669 while ((TargetPos > -1) && !
MI.getOperand(TargetPos).isMBB())
4671 assert((TargetPos >= 0) &&
MI.getOperand(TargetPos).isMBB());
4672 MI.getOperand(TargetPos).setMBB(NewTarget);
4676 MI.setDesc(
get(NewOpcode));
4688 for (
unsigned insn = TargetOpcode::GENERIC_OP_END+1;
4689 insn < Hexagon::INSTRUCTION_LIST_END; ++insn) {
4710 int PredRevOpcode = -1;
4712 PredRevOpcode = Hexagon::notTakenBranchPrediction(Opcode);
4714 PredRevOpcode = Hexagon::takenBranchPrediction(Opcode);
4715 assert(PredRevOpcode > 0);
4716 return PredRevOpcode;
4722 return Cond.empty() || (
Cond[0].isImm() && (
Cond.size() != 1));
4729 if (Operand.
isImm())
4730 Operand.
setImm(Operand.
getImm() | memShufDisabledMask);
4738 return (Operand.
isImm() && (Operand.
getImm() & memShufDisabledMask) != 0);
4743 return Opc >= 0 ? Hexagon::changeAddrMode_abs_io(
Opc) :
Opc;
4747 return Opc >= 0 ? Hexagon::changeAddrMode_io_abs(
Opc) :
Opc;
4751 return Opc >= 0 ? Hexagon::changeAddrMode_io_pi(
Opc) :
Opc;
4755 return Opc >= 0 ? Hexagon::changeAddrMode_io_rr(
Opc) :
Opc;
4759 return Opc >= 0 ? Hexagon::changeAddrMode_pi_io(
Opc) :
Opc;
4763 return Opc >= 0 ? Hexagon::changeAddrMode_rr_io(
Opc) :
Opc;
4767 return Opc >= 0 ? Hexagon::changeAddrMode_rr_ur(
Opc) :
Opc;
4771 return Opc >= 0 ? Hexagon::changeAddrMode_ur_rr(
Opc) :
Opc;
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
static bool mayAlias(MachineInstr &MIa, SmallVectorImpl< MachineInstr * > &MemInsns, AliasAnalysis *AA)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static const Function * getParent(const Value *V)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
DXIL Forward Handle Accesses
static bool isSigned(unsigned int Opcode)
const HexagonInstrInfo * TII
static cl::opt< bool > DisableNVSchedule("disable-hexagon-nv-schedule", cl::Hidden, cl::desc("Disable schedule adjustment for new value stores."))
const int Hexagon_MEMH_OFFSET_MAX
const int Hexagon_MEMB_OFFSET_MAX
const int Hexagon_MEMH_OFFSET_MIN
const int Hexagon_MEMD_OFFSET_MAX
static cl::opt< bool > EnableTimingClassLatency("enable-timing-class-latency", cl::Hidden, cl::init(false), cl::desc("Enable timing class latency"))
const int Hexagon_MEMD_OFFSET_MIN
const int Hexagon_ADDI_OFFSET_MAX
static cl::opt< bool > EnableACCForwarding("enable-acc-forwarding", cl::Hidden, cl::init(true), cl::desc("Enable vec acc forwarding"))
static void getLiveInRegsAt(LivePhysRegs &Regs, const MachineInstr &MI)
const int Hexagon_MEMW_OFFSET_MAX
Constants for Hexagon instructions.
const int Hexagon_MEMW_OFFSET_MIN
cl::opt< bool > ScheduleInlineAsm("hexagon-sched-inline-asm", cl::Hidden, cl::init(false), cl::desc("Do not consider inline-asm a scheduling/" "packetization boundary."))
const int Hexagon_ADDI_OFFSET_MIN
static cl::opt< bool > BranchRelaxAsmLarge("branch-relax-asm-large", cl::init(true), cl::Hidden, cl::desc("branch relax asm"))
static void parseOperands(const MachineInstr &MI, SmallVectorImpl< Register > &Defs, SmallVectorImpl< Register > &Uses)
Gather register def/uses from MI.
static cl::opt< bool > EnableALUForwarding("enable-alu-forwarding", cl::Hidden, cl::init(true), cl::desc("Enable vec alu forwarding"))
const int Hexagon_MEMB_OFFSET_MIN
static unsigned nonDbgMICount(MachineBasicBlock::const_instr_iterator MIB, MachineBasicBlock::const_instr_iterator MIE)
Calculate number of instructions excluding the debug instructions.
static cl::opt< bool > EnableBranchPrediction("hexagon-enable-branch-prediction", cl::Hidden, cl::init(true), cl::desc("Enable branch prediction"))
static bool isDblRegForSubInst(Register Reg, const HexagonRegisterInfo &HRI)
static void getLiveOutRegsAt(LivePhysRegs &Regs, const MachineInstr &MI)
static cl::opt< bool > UseDFAHazardRec("dfa-hazard-rec", cl::init(true), cl::Hidden, cl::desc("Use the DFA based hazard recognizer."))
static bool isIntRegForSubInst(Register Reg)
static bool isDuplexPairMatch(unsigned Ga, unsigned Gb)
#define HEXAGON_INSTR_SIZE
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first found DebugLoc that has a DILocation, given a range of instructions.
static bool isUndef(const MachineInstr &MI)
Register const TargetRegisterInfo * TRI
Promote Memory to Register
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static bool isReg(const MCInst &MI, unsigned OpNo)
uint64_t IntrinsicInst * II
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
static StringRef getName(Value *V)
static bool isBranch(unsigned Opcode)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
short getEquivalentHWInstr(const MachineInstr &MI) const
int getDuplexOpcode(const MachineInstr &MI, bool ForBigCore=true) const
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Remove the branching code at the end of the specific MBB.
bool isPredicated(const MachineInstr &MI) const override
Returns true if the instruction is already predicated.
bool isHVXMemWithAIndirect(const MachineInstr &I, const MachineInstr &J) const
short changeAddrMode_abs_io(short Opc) const
bool isRestrictNoSlot1Store(const MachineInstr &MI) const
short getRegForm(const MachineInstr &MI) const
bool isVecALU(const MachineInstr &MI) const
bool isCompoundBranchInstr(const MachineInstr &MI) const
bool isDuplexPair(const MachineInstr &MIa, const MachineInstr &MIb) const
Symmetrical. See if these two instructions are fit for duplex pair.
bool isJumpR(const MachineInstr &MI) const
ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II, const ScheduleDAG *DAG) const override
Allocate and return a hazard recognizer to use for this target when scheduling the machine instructio...
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
Decompose the machine operand's target flags into two values - the direct target flag value and any o...
bool producesStall(const MachineInstr &ProdMI, const MachineInstr &ConsMI) const
bool invertAndChangeJumpTarget(MachineInstr &MI, MachineBasicBlock *NewTarget) const
bool isPredictedTaken(unsigned Opcode) const
bool isSaveCalleeSavedRegsCall(const MachineInstr &MI) const
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
TargetInstrInfo overrides.
unsigned nonDbgBundleSize(MachineBasicBlock::const_iterator BundleHead) const
int getDotNewPredOp(const MachineInstr &MI, const MachineBranchProbabilityInfo *MBPI) const
bool ClobbersPredicate(MachineInstr &MI, std::vector< MachineOperand > &Pred, bool SkipDead) const override
If the specified instruction defines any predicate or condition code register(s) used for predication...
unsigned getInvertedPredicatedOpcode(const int Opc) const
bool isPureSlot0(const MachineInstr &MI) const
bool doesNotReturn(const MachineInstr &CallMI) const
HexagonII::SubInstructionGroup getDuplexCandidateGroup(const MachineInstr &MI) const
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
bool getPredReg(ArrayRef< MachineOperand > Cond, Register &PredReg, unsigned &PredRegPos, unsigned &PredRegFlags) const
bool isPredicatedNew(const MachineInstr &MI) const
bool isSignExtendingLoad(const MachineInstr &MI) const
bool isVecAcc(const MachineInstr &MI) const
bool reversePredSense(MachineInstr &MI) const
unsigned getAddrMode(const MachineInstr &MI) const
MCInst getNop() const override
bool isJumpWithinBranchRange(const MachineInstr &MI, unsigned offset) const
bool mayBeNewStore(const MachineInstr &MI) const
bool isOperandExtended(const MachineInstr &MI, unsigned OperandNum) const
bool canExecuteInBundle(const MachineInstr &First, const MachineInstr &Second) const
Can these instructions execute at the same time in a bundle.
std::optional< unsigned > getOperandLatency(const InstrItineraryData *ItinData, const MachineInstr &DefMI, unsigned DefIdx, const MachineInstr &UseMI, unsigned UseIdx) const override
getOperandLatency - Compute and return the use operand latency of a given pair of def and use.
bool isAddrModeWithOffset(const MachineInstr &MI) const
bool getMemOperandsWithOffsetWidth(const MachineInstr &LdSt, SmallVectorImpl< const MachineOperand * > &BaseOps, int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width, const TargetRegisterInfo *TRI) const override
Get the base register and byte offset of a load/store instr.
bool isValidOffset(unsigned Opcode, int Offset, const TargetRegisterInfo *TRI, bool Extend=true) const
bool isBaseImmOffset(const MachineInstr &MI) const
bool isAbsoluteSet(const MachineInstr &MI) const
short changeAddrMode_io_pi(short Opc) const
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
Emit instructions to copy a pair of physical registers.
short changeAddrMode_pi_io(short Opc) const
bool analyzeCompare(const MachineInstr &MI, Register &SrcReg, Register &SrcReg2, int64_t &Mask, int64_t &Value) const override
For a comparison instruction, return the source registers in SrcReg and SrcReg2 if having two registe...
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
Reverses the branch condition of the specified condition list, returning false on success and true if...
std::unique_ptr< PipelinerLoopInfo > analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const override
Analyze loop L, which must be a single-basic-block loop, and if the conditions can be understood enou...
bool isLoopN(const MachineInstr &MI) const
bool isSpillPredRegOp(const MachineInstr &MI) const
bool hasStoreToStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const override
Check if the instruction or the bundle of instructions has store to stack slots.
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
Return an array that contains the direct target flag values and their names.
bool isIndirectCall(const MachineInstr &MI) const
short changeAddrMode_ur_rr(short Opc) const
bool isValidAutoIncImm(const EVT VT, const int Offset) const
bool hasNonExtEquivalent(const MachineInstr &MI) const
bool isConstExtended(const MachineInstr &MI) const
bool getIncrementValue(const MachineInstr &MI, int &Value) const override
If the instruction is an increment of a constant value, return the amount.
int getCondOpcode(int Opc, bool sense) const
MachineInstr * findLoopInstr(MachineBasicBlock *BB, unsigned EndLoopOp, MachineBasicBlock *TargetBB, SmallPtrSet< MachineBasicBlock *, 8 > &Visited) const
Find the hardware loop instruction used to set-up the specified loop.
unsigned getInstrTimingClassLatency(const InstrItineraryData *ItinData, const MachineInstr &MI) const
bool isAccumulator(const MachineInstr &MI) const
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
Insert branch code into the end of the specified MachineBasicBlock.
unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr &MI, unsigned *PredCost=nullptr) const override
Compute the instruction latency of a given instruction.
bool PredOpcodeHasJMP_c(unsigned Opcode) const
bool isNewValue(const MachineInstr &MI) const
Register createVR(MachineFunction *MF, MVT VT) const
HexagonInstrInfo specifics.
bool isDotCurInst(const MachineInstr &MI) const
bool validateBranchCond(const ArrayRef< MachineOperand > &Cond) const
bool isExtended(const MachineInstr &MI) const
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const override
Return true if it's profitable to predicate instructions with accumulated instruction latency of "Num...
bool isAsCheapAsAMove(const MachineInstr &MI) const override
int getMaxValue(const MachineInstr &MI) const
bool isPredicateLate(unsigned Opcode) const
short changeAddrMode_rr_ur(short Opc) const
bool hasPseudoInstrPair(const MachineInstr &MI) const
bool isNewValueInst(const MachineInstr &MI) const
unsigned getInlineAsmLength(const char *Str, const MCAsmInfo &MAI, const TargetSubtargetInfo *STI=nullptr) const override
Measure the specified inline asm to determine an approximation of its length.
bool areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const override
int getNonDotCurOp(const MachineInstr &MI) const
bool isIndirectL4Return(const MachineInstr &MI) const
unsigned reversePrediction(unsigned Opcode) const
ArrayRef< std::pair< unsigned, const char * > > getSerializableBitmaskMachineOperandTargetFlags() const override
Return an array that contains the bitmask target flag values and their names.
InstrStage::FuncUnits getUnits(const MachineInstr &MI) const
unsigned getMemAccessSize(const MachineInstr &MI) const
bool predOpcodeHasNot(ArrayRef< MachineOperand > Cond) const
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Store the specified register of the given register class to the specified stack frame index.
bool isComplex(const MachineInstr &MI) const
bool isPostIncrement(const MachineInstr &MI) const override
Return true for post-incremented instructions.
void setBundleNoShuf(MachineBasicBlock::instr_iterator MIB) const
MachineBasicBlock::instr_iterator expandVGatherPseudo(MachineInstr &MI) const
int getDotNewOp(const MachineInstr &MI) const
void changeDuplexOpcode(MachineBasicBlock::instr_iterator MII, bool ToBigInstrs) const
bool isMemOp(const MachineInstr &MI) const
int getDotOldOp(const MachineInstr &MI) const
short getPseudoInstrPair(const MachineInstr &MI) const
bool hasUncondBranch(const MachineBasicBlock *B) const
short getNonExtOpcode(const MachineInstr &MI) const
bool isTailCall(const MachineInstr &MI) const override
void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const override
Insert a noop into the instruction stream at the specified point.
bool isDeallocRet(const MachineInstr &MI) const
HexagonInstrInfo(const HexagonSubtarget &ST)
unsigned getCExtOpNum(const MachineInstr &MI) const
bool isSolo(const MachineInstr &MI) const
DFAPacketizer * CreateTargetScheduleState(const TargetSubtargetInfo &STI) const override
Create machine specific model for scheduling.
bool isLateSourceInstr(const MachineInstr &MI) const
bool isDotNewInst(const MachineInstr &MI) const
void translateInstrsForDup(MachineFunction &MF, bool ToBigInstrs=true) const
bool isTC1(const MachineInstr &MI) const
bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const override
Test if the given instruction should be considered a scheduling boundary.
bool predCanBeUsedAsDotNew(const MachineInstr &MI, Register PredReg) const
unsigned getSize(const MachineInstr &MI) const
bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, BranchProbability Probability) const override
Return true if it's profitable for if-converter to duplicate instructions of specified accumulated in...
short changeAddrMode_io_abs(short Opc) const
int getDotCurOp(const MachineInstr &MI) const
bool expandPostRAPseudo(MachineInstr &MI) const override
This function is called for all pseudo instructions that remain after register allocation.
bool isExpr(unsigned OpType) const
void genAllInsnTimingClasses(MachineFunction &MF) const
bool isTC2Early(const MachineInstr &MI) const
bool hasEHLabel(const MachineBasicBlock *B) const
bool shouldSink(const MachineInstr &MI) const override
bool isZeroExtendingLoad(const MachineInstr &MI) const
short changeAddrMode_rr_io(short Opc) const
bool isHVXVec(const MachineInstr &MI) const
bool isDependent(const MachineInstr &ProdMI, const MachineInstr &ConsMI) const
short changeAddrMode_io_rr(short Opc) const
bool SubsumesPredicate(ArrayRef< MachineOperand > Pred1, ArrayRef< MachineOperand > Pred2) const override
Returns true if the first specified predicate subsumes the second, e.g.
bool mayBeCurLoad(const MachineInstr &MI) const
bool getBundleNoShuf(const MachineInstr &MIB) const
bool isNewValueJump(const MachineInstr &MI) const
bool isTC4x(const MachineInstr &MI) const
bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Cond) const override
Convert the instruction into a predicated instruction.
bool isFloat(const MachineInstr &MI) const
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Load the specified register of the given register class from the specified stack frame index.
bool isToBeScheduledASAP(const MachineInstr &MI1, const MachineInstr &MI2) const
MachineOperand * getBaseAndOffset(const MachineInstr &MI, int64_t &Offset, LocationSize &AccessSize) const
bool getInvertedPredSense(SmallVectorImpl< MachineOperand > &Cond) const
unsigned nonDbgBBSize(const MachineBasicBlock *BB) const
getInstrTimingClassLatency - Compute the instruction latency of a given instruction using Timing Clas...
uint64_t getType(const MachineInstr &MI) const
bool isEndLoopN(unsigned Opcode) const
bool getBaseAndOffsetPosition(const MachineInstr &MI, unsigned &BasePos, unsigned &OffsetPos) const override
For instructions with a base and offset, return the position of the base register and offset operands...
bool isPredicable(const MachineInstr &MI) const override
Return true if the specified instruction can be predicated.
bool isExtendable(const MachineInstr &MI) const
void immediateExtend(MachineInstr &MI) const
immediateExtend - Changes the instruction in place to one using an immediate extender.
HexagonII::CompoundGroup getCompoundCandidateGroup(const MachineInstr &MI) const
bool hasLoadFromStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const override
Check if the instruction or the bundle of instructions has load from stack slots.
SmallVector< MachineInstr *, 2 > getBranchingInstrs(MachineBasicBlock &MBB) const
bool isPredicatedTrue(const MachineInstr &MI) const
bool isNewValueStore(const MachineInstr &MI) const
int getMinValue(const MachineInstr &MI) const
bool isVecUsableNextPacket(const MachineInstr &ProdMI, const MachineInstr &ConsMI) const
unsigned getCompoundOpcode(const MachineInstr &GA, const MachineInstr &GB) const
bool addLatencyToSchedule(const MachineInstr &MI1, const MachineInstr &MI2) const
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
If the specified machine instruction is a direct store to a stack slot, return the virtual or physica...
int getDotNewPredJumpOp(const MachineInstr &MI, const MachineBranchProbabilityInfo *MBPI) const
bool isTC2(const MachineInstr &MI) const
Register getStackRegister() const
Register getFrameRegister(const MachineFunction &MF) const override
Itinerary data supplied by a subtarget to be used by a target.
unsigned getStageLatency(unsigned ItinClassIndx) const
Return the total stage latency of the given class.
void RemoveMachineInstrFromMaps(MachineInstr &MI)
A set of physical registers with utility functions to track liveness when walking backward/forward th...
void stepForward(const MachineInstr &MI, SmallVectorImpl< std::pair< MCPhysReg, const MachineOperand * > > &Clobbers)
Simulates liveness when stepping forward over an instruction(bundle).
void stepBackward(const MachineInstr &MI)
Simulates liveness when stepping backwards over an instruction(bundle).
void addLiveIns(const MachineBasicBlock &MBB)
Adds all live-in registers of basic block MBB.
bool available(const MachineRegisterInfo &MRI, MCRegister Reg) const
Returns true if register Reg and no aliasing register is in the set.
void addLiveOuts(const MachineBasicBlock &MBB)
Adds all live-out registers of basic block MBB.
bool contains(MCRegister Reg) const
Returns true if register Reg is contained in the set.
static LocationSize precise(uint64_t Value)
Represents a single loop in the control flow graph.
This class is intended to be used as a base class for asm properties and features specific to the tar...
virtual unsigned getMaxInstLength(const MCSubtargetInfo *STI=nullptr) const
Returns the maximum possible encoded instruction size in bytes.
StringRef getCommentString() const
const char * getSeparatorString() const
MCInstBuilder & addInst(const MCInst *Val)
Add a new MCInst operand.
MCInstBuilder & addImm(int64_t Val)
Add a new integer immediate operand.
Instances of this class represent a single low-level machine instruction.
Describe properties that are true of each instruction in the target description file.
unsigned getSchedClass() const
Return the scheduling class for this instruction.
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
instr_iterator instr_begin()
MachineInstrBundleIterator< const MachineInstr > const_iterator
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
Instructions::iterator instr_iterator
instr_iterator instr_end()
Instructions::const_iterator const_instr_iterator
iterator_range< pred_iterator > predecessors()
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
BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
const char * createExternalSymbolName(StringRef Name)
Allocate a string and populate it with the given external symbol name.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
BasicBlockListType::iterator iterator
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & cloneMemRefs(const MachineInstr &OtherMI) const
const MachineInstrBuilder & addUse(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register use operand.
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
const MachineInstrBuilder & addDef(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register definition operand.
reverse_iterator getReverse() const
Get a reverse iterator to the same node.
instr_iterator getInstrIterator() const
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
bool readsRegister(Register Reg, const TargetRegisterInfo *TRI) const
Return true if the MachineInstr reads the specified register.
unsigned getNumOperands() const
Retuns the total number of operands.
LLVM_ABI unsigned getNumExplicitOperands() const
Returns the number of non-implicit operands.
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
LLVM_ABI bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by mayLoad / mayStore,...
LLVM_ABI bool hasOrderedMemoryRef() const
Return true if this instruction may have an ordered or volatile memory reference, or if the informati...
bool mayStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly modify memory.
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.
const MachineOperand & getOperand(unsigned i) const
bool isIndirectBranch(QueryType Type=AnyInBundle) const
Return true if this is an indirect branch, such as a branch through a register.
A description of a memory reference used in the backend.
@ MOVolatile
The memory access is volatile.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
void setImm(int64_t immVal)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
bool isCPI() const
isCPI - Tests if this is a MO_ConstantPoolIndex operand.
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 isSymbol() const
isSymbol - Tests if this is a MO_ExternalSymbol operand.
bool isJTI() const
isJTI - Tests if this is a MO_JumpTableIndex operand.
unsigned getTargetFlags() const
static MachineOperand CreateImm(int64_t Val)
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
bool isBlockAddress() const
isBlockAddress - Tests if this is a MO_BlockAddress operand.
Register getReg() const
getReg - Returns the register number.
void addTargetFlag(unsigned F)
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_GlobalAddress
Address of a global value.
@ MO_BlockAddress
Address of a basic block.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
bool isFPImm() const
isFPImm - Tests if this is a MO_FPImmediate operand.
bool isMBB() const
isMBB - Tests if this is a MO_MachineBasicBlock operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Special value supplied for machine level alias analysis.
Wrapper class representing virtual and physical registers.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
HazardRecognizer - This determines whether or not an instruction can be issued this cycle,...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
size_t count(char C) const
Return the number of occurrences of C in the string.
Object returned by analyzeLoopForPipelining.
virtual ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const InstrItineraryData *, const ScheduleDAG *DAG) const
Allocate and return a hazard recognizer to use for this target when scheduling the machine instructio...
virtual bool hasStoreToStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const
If the specified machine instruction has a store to a stack slot, return true along with the FrameInd...
virtual std::optional< unsigned > getOperandLatency(const InstrItineraryData *ItinData, SDNode *DefNode, unsigned DefIdx, SDNode *UseNode, unsigned UseIdx) const
virtual bool hasLoadFromStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const
If the specified machine instruction has a load from a stack slot, return true along with the FrameIn...
Primary interface to the complete machine description for the target machine.
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const InstrItineraryData * getInstrItineraryData() const
getInstrItineraryData - Returns instruction itinerary data for the target or specific subtarget.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool isSlot0Only(unsigned units)
HexagonII - This namespace holds all of the target specific flags that instruction info tracks.
unsigned const TypeCVI_LAST
@ RestrictNoSlot1StoreMask
@ RestrictNoSlot1StorePos
unsigned const TypeCVI_FIRST
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ InternalRead
Register reads a value that is defined inside the same instruction or bundle.
@ Kill
The last use of a register.
@ Undef
Value of the register doesn't matter.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
bool is_TC1(unsigned SchedClass)
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
auto reverse(ContainerTy &&C)
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
FunctionAddr VTableAddr Count
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
bool is_TC2(unsigned SchedClass)
unsigned getUndefRegState(bool B)
unsigned getRegState(const MachineOperand &RegOp)
Get all register state flags from machine operand RegOp.
bool is_TC2early(unsigned SchedClass)
unsigned getKillRegState(bool B)
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr bool isShiftedInt(int64_t x)
Checks if a signed integer is an N bit number shifted left by S.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
bool isSpace(char C)
Checks whether character C is whitespace in the "C" locale.
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.
constexpr bool isShiftedUInt(uint64_t x)
Checks if a unsigned integer is an N bit number shifted left by S.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
bool is_TC4x(unsigned SchedClass)
This struct is a compact representation of a valid (non-zero power of two) alignment.
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
These values represent a non-pipelined step in the execution of an instruction.
uint64_t FuncUnits
Bitmask representing a set of functional units.
FuncUnits getUnits() const
Returns the choice of FUs.
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.