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() {}
123 RegInfo(ST.getHwMode()), Subtarget(ST) {}
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,
978 if (Hexagon::IntRegsRegClass.hasSubClassEq(RC)) {
982 }
else if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC)) {
986 }
else if (Hexagon::PredRegsRegClass.hasSubClassEq(RC)) {
990 }
else if (Hexagon::ModRegsRegClass.hasSubClassEq(RC)) {
994 }
else if (Hexagon::HvxQRRegClass.hasSubClassEq(RC)) {
998 }
else if (Hexagon::HvxVRRegClass.hasSubClassEq(RC)) {
1002 }
else if (Hexagon::HvxWRRegClass.hasSubClassEq(RC)) {
1025 if (Hexagon::IntRegsRegClass.hasSubClassEq(RC)) {
1028 }
else if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC)) {
1031 }
else if (Hexagon::PredRegsRegClass.hasSubClassEq(RC)) {
1034 }
else if (Hexagon::ModRegsRegClass.hasSubClassEq(RC)) {
1037 }
else if (Hexagon::HvxQRRegClass.hasSubClassEq(RC)) {
1040 }
else if (Hexagon::HvxVRRegClass.hasSubClassEq(RC)) {
1043 }
else if (Hexagon::HvxWRRegClass.hasSubClassEq(RC)) {
1064 unsigned Opc =
MI.getOpcode();
1066 auto RealCirc = [&](
unsigned Opc,
bool HasImm,
unsigned MxOp) {
1068 Register CSx = (Mx == Hexagon::M0 ? Hexagon::CS0 : Hexagon::CS1);
1070 .
add(
MI.getOperand((HasImm ? 5 : 4)));
1074 MIB.
add(
MI.getOperand(4));
1081 if (
MI.memoperands().empty())
1084 return MMO->getAlign() >= NeedAlign;
1089 case Hexagon::PS_call_instrprof_custom: {
1090 auto Op0 =
MI.getOperand(0);
1092 "First operand must be a global containing handler name.");
1096 StringRef NameStr = Arr->isCString() ? Arr->getAsCString() : Arr->getAsString();
1122 MIB.addExternalSymbol(cstr);
1126 case TargetOpcode::COPY: {
1132 std::prev(
MBBI)->copyImplicitOps(*
MBB.getParent(),
MI);
1137 case Hexagon::PS_aligna:
1140 .
addImm(-
MI.getOperand(1).getImm());
1143 case Hexagon::V6_vassignp: {
1146 Register SrcLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
1147 Register SrcHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
1154 .
addReg(SrcLo, Kill | UndefLo);
1158 case Hexagon::V6_lo: {
1161 Register SrcSubLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
1164 MRI.clearKillFlags(SrcSubLo);
1167 case Hexagon::V6_hi: {
1170 Register SrcSubHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
1173 MRI.clearKillFlags(SrcSubHi);
1176 case Hexagon::PS_vloadrv_ai: {
1180 int Offset =
MI.getOperand(2).getImm();
1181 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1182 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vL32b_ai
1183 : Hexagon::V6_vL32Ub_ai;
1191 case Hexagon::PS_vloadrw_ai: {
1195 int Offset =
MI.getOperand(2).getImm();
1196 unsigned VecOffset = HRI.getSpillSize(Hexagon::HvxVRRegClass);
1197 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1198 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vL32b_ai
1199 : Hexagon::V6_vL32Ub_ai;
1201 HRI.getSubReg(DstReg, Hexagon::vsub_lo))
1206 HRI.getSubReg(DstReg, Hexagon::vsub_hi))
1213 case Hexagon::PS_vstorerv_ai: {
1218 int Offset =
MI.getOperand(1).getImm();
1219 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1220 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vS32b_ai
1221 : Hexagon::V6_vS32Ub_ai;
1230 case Hexagon::PS_vstorerw_ai: {
1234 int Offset =
MI.getOperand(1).getImm();
1235 unsigned VecOffset = HRI.getSpillSize(Hexagon::HvxVRRegClass);
1236 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1237 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vS32b_ai
1238 : Hexagon::V6_vS32Ub_ai;
1242 .
addReg(HRI.getSubReg(SrcReg, Hexagon::vsub_lo))
1247 .
addReg(HRI.getSubReg(SrcReg, Hexagon::vsub_hi))
1252 case Hexagon::PS_true: {
1260 case Hexagon::PS_false: {
1268 case Hexagon::PS_qtrue: {
1275 case Hexagon::PS_qfalse: {
1282 case Hexagon::PS_vdd0: {
1290 case Hexagon::PS_vmulw: {
1293 Register Src1Reg =
MI.getOperand(1).getReg();
1294 Register Src2Reg =
MI.getOperand(2).getReg();
1295 Register Src1SubHi = HRI.getSubReg(Src1Reg, Hexagon::isub_hi);
1296 Register Src1SubLo = HRI.getSubReg(Src1Reg, Hexagon::isub_lo);
1297 Register Src2SubHi = HRI.getSubReg(Src2Reg, Hexagon::isub_hi);
1298 Register Src2SubLo = HRI.getSubReg(Src2Reg, Hexagon::isub_lo);
1300 HRI.getSubReg(DstReg, Hexagon::isub_hi))
1304 HRI.getSubReg(DstReg, Hexagon::isub_lo))
1308 MRI.clearKillFlags(Src1SubHi);
1309 MRI.clearKillFlags(Src1SubLo);
1310 MRI.clearKillFlags(Src2SubHi);
1311 MRI.clearKillFlags(Src2SubLo);
1314 case Hexagon::PS_vmulw_acc: {
1317 Register Src1Reg =
MI.getOperand(1).getReg();
1318 Register Src2Reg =
MI.getOperand(2).getReg();
1319 Register Src3Reg =
MI.getOperand(3).getReg();
1320 Register Src1SubHi = HRI.getSubReg(Src1Reg, Hexagon::isub_hi);
1321 Register Src1SubLo = HRI.getSubReg(Src1Reg, Hexagon::isub_lo);
1322 Register Src2SubHi = HRI.getSubReg(Src2Reg, Hexagon::isub_hi);
1323 Register Src2SubLo = HRI.getSubReg(Src2Reg, Hexagon::isub_lo);
1324 Register Src3SubHi = HRI.getSubReg(Src3Reg, Hexagon::isub_hi);
1325 Register Src3SubLo = HRI.getSubReg(Src3Reg, Hexagon::isub_lo);
1327 HRI.getSubReg(DstReg, Hexagon::isub_hi))
1332 HRI.getSubReg(DstReg, Hexagon::isub_lo))
1337 MRI.clearKillFlags(Src1SubHi);
1338 MRI.clearKillFlags(Src1SubLo);
1339 MRI.clearKillFlags(Src2SubHi);
1340 MRI.clearKillFlags(Src2SubLo);
1341 MRI.clearKillFlags(Src3SubHi);
1342 MRI.clearKillFlags(Src3SubLo);
1345 case Hexagon::PS_pselect: {
1360 .
addReg(Pu, (Rd == Rt) ? K1 : 0)
1369 case Hexagon::PS_vselect: {
1402 case Hexagon::PS_wselect: {
1442 case Hexagon::PS_crash: {
1458 void printCustom(
raw_ostream &OS)
const override {
1459 OS <<
"MisalignedCrash";
1463 static const CrashPseudoSourceValue CrashPSV(MF.
getTarget());
1475 case Hexagon::PS_tailcall_i:
1476 MI.setDesc(
get(Hexagon::J2_jump));
1478 case Hexagon::PS_tailcall_r:
1479 case Hexagon::PS_jmpret:
1480 MI.setDesc(
get(Hexagon::J2_jumpr));
1482 case Hexagon::PS_jmprett:
1483 MI.setDesc(
get(Hexagon::J2_jumprt));
1485 case Hexagon::PS_jmpretf:
1486 MI.setDesc(
get(Hexagon::J2_jumprf));
1488 case Hexagon::PS_jmprettnewpt:
1489 MI.setDesc(
get(Hexagon::J2_jumprtnewpt));
1491 case Hexagon::PS_jmpretfnewpt:
1492 MI.setDesc(
get(Hexagon::J2_jumprfnewpt));
1494 case Hexagon::PS_jmprettnew:
1495 MI.setDesc(
get(Hexagon::J2_jumprtnew));
1497 case Hexagon::PS_jmpretfnew:
1498 MI.setDesc(
get(Hexagon::J2_jumprfnew));
1501 case Hexagon::PS_loadrub_pci:
1502 return RealCirc(Hexagon::L2_loadrub_pci,
true, 4);
1503 case Hexagon::PS_loadrb_pci:
1504 return RealCirc(Hexagon::L2_loadrb_pci,
true, 4);
1505 case Hexagon::PS_loadruh_pci:
1506 return RealCirc(Hexagon::L2_loadruh_pci,
true, 4);
1507 case Hexagon::PS_loadrh_pci:
1508 return RealCirc(Hexagon::L2_loadrh_pci,
true, 4);
1509 case Hexagon::PS_loadri_pci:
1510 return RealCirc(Hexagon::L2_loadri_pci,
true, 4);
1511 case Hexagon::PS_loadrd_pci:
1512 return RealCirc(Hexagon::L2_loadrd_pci,
true, 4);
1513 case Hexagon::PS_loadrub_pcr:
1514 return RealCirc(Hexagon::L2_loadrub_pcr,
false, 3);
1515 case Hexagon::PS_loadrb_pcr:
1516 return RealCirc(Hexagon::L2_loadrb_pcr,
false, 3);
1517 case Hexagon::PS_loadruh_pcr:
1518 return RealCirc(Hexagon::L2_loadruh_pcr,
false, 3);
1519 case Hexagon::PS_loadrh_pcr:
1520 return RealCirc(Hexagon::L2_loadrh_pcr,
false, 3);
1521 case Hexagon::PS_loadri_pcr:
1522 return RealCirc(Hexagon::L2_loadri_pcr,
false, 3);
1523 case Hexagon::PS_loadrd_pcr:
1524 return RealCirc(Hexagon::L2_loadrd_pcr,
false, 3);
1525 case Hexagon::PS_storerb_pci:
1526 return RealCirc(Hexagon::S2_storerb_pci,
true, 3);
1527 case Hexagon::PS_storerh_pci:
1528 return RealCirc(Hexagon::S2_storerh_pci,
true, 3);
1529 case Hexagon::PS_storerf_pci:
1530 return RealCirc(Hexagon::S2_storerf_pci,
true, 3);
1531 case Hexagon::PS_storeri_pci:
1532 return RealCirc(Hexagon::S2_storeri_pci,
true, 3);
1533 case Hexagon::PS_storerd_pci:
1534 return RealCirc(Hexagon::S2_storerd_pci,
true, 3);
1535 case Hexagon::PS_storerb_pcr:
1536 return RealCirc(Hexagon::S2_storerb_pcr,
false, 2);
1537 case Hexagon::PS_storerh_pcr:
1538 return RealCirc(Hexagon::S2_storerh_pcr,
false, 2);
1539 case Hexagon::PS_storerf_pcr:
1540 return RealCirc(Hexagon::S2_storerf_pcr,
false, 2);
1541 case Hexagon::PS_storeri_pcr:
1542 return RealCirc(Hexagon::S2_storeri_pcr,
false, 2);
1543 case Hexagon::PS_storerd_pcr:
1544 return RealCirc(Hexagon::S2_storerd_pcr,
false, 2);
1554 unsigned Opc =
MI.getOpcode();
1558 case Hexagon::V6_vgather_vscatter_mh_pseudo:
1561 .
add(
MI.getOperand(2))
1562 .
add(
MI.getOperand(3))
1563 .
add(
MI.getOperand(4));
1565 .
add(
MI.getOperand(2))
1566 .
add(
MI.getOperand(3))
1567 .
add(
MI.getOperand(4))
1570 return First.getInstrIterator();
1571 case Hexagon::V6_vgathermh_pseudo:
1573 .
add(
MI.getOperand(2))
1574 .
add(
MI.getOperand(3))
1575 .
add(
MI.getOperand(4));
1577 .
add(
MI.getOperand(0))
1581 return First.getInstrIterator();
1583 case Hexagon::V6_vgathermw_pseudo:
1585 .
add(
MI.getOperand(2))
1586 .
add(
MI.getOperand(3))
1587 .
add(
MI.getOperand(4));
1589 .
add(
MI.getOperand(0))
1593 return First.getInstrIterator();
1595 case Hexagon::V6_vgathermhw_pseudo:
1597 .
add(
MI.getOperand(2))
1598 .
add(
MI.getOperand(3))
1599 .
add(
MI.getOperand(4));
1601 .
add(
MI.getOperand(0))
1605 return First.getInstrIterator();
1607 case Hexagon::V6_vgathermhq_pseudo:
1609 .
add(
MI.getOperand(2))
1610 .
add(
MI.getOperand(3))
1611 .
add(
MI.getOperand(4))
1612 .
add(
MI.getOperand(5));
1614 .
add(
MI.getOperand(0))
1618 return First.getInstrIterator();
1620 case Hexagon::V6_vgathermwq_pseudo:
1622 .
add(
MI.getOperand(2))
1623 .
add(
MI.getOperand(3))
1624 .
add(
MI.getOperand(4))
1625 .
add(
MI.getOperand(5));
1627 .
add(
MI.getOperand(0))
1631 return First.getInstrIterator();
1633 case Hexagon::V6_vgathermhwq_pseudo:
1635 .
add(
MI.getOperand(2))
1636 .
add(
MI.getOperand(3))
1637 .
add(
MI.getOperand(4))
1638 .
add(
MI.getOperand(5));
1640 .
add(
MI.getOperand(0))
1644 return First.getInstrIterator();
1647 return MI.getIterator();
1656 assert(
Cond[0].isImm() &&
"First entry in the cond vector not imm-val");
1657 unsigned opcode =
Cond[0].getImm();
1663 Cond[0].setImm(NewOpcode);
1697 int Opc =
MI.getOpcode();
1710 unsigned NOp = 0,
NumOps =
MI.getNumOperands();
1713 if (!
Op.isReg() || !
Op.isDef() ||
Op.isImplicit())
1720 unsigned PredRegPos, PredRegFlags;
1721 bool GotPredReg =
getPredReg(
Cond, PredReg, PredRegPos, PredRegFlags);
1724 T.addReg(PredReg, PredRegFlags);
1726 T.add(
MI.getOperand(NOp++));
1728 MI.setDesc(
get(PredOpc));
1729 while (
unsigned n =
MI.getNumOperands())
1730 MI.removeOperand(n-1);
1731 for (
unsigned i = 0, n =
T->getNumOperands(); i < n; ++i)
1732 MI.addOperand(
T->getOperand(i));
1738 MRI.clearKillFlags(PredReg);
1749 std::vector<MachineOperand> &Pred,
1750 bool SkipDead)
const {
1758 if (RC == &Hexagon::PredRegsRegClass) {
1763 }
else if (MO.isRegMask()) {
1764 for (
Register PR : Hexagon::PredRegsRegClass) {
1765 if (!
MI.modifiesRegister(PR, &HRI))
1776 if (!
MI.getDesc().isPredicable())
1780 if (!Subtarget.usePredicatedCalls())
1785 if (!Subtarget.hasV62Ops()) {
1786 switch (
MI.getOpcode()) {
1787 case Hexagon::V6_vL32b_ai:
1788 case Hexagon::V6_vL32b_pi:
1789 case Hexagon::V6_vL32b_ppu:
1790 case Hexagon::V6_vL32b_cur_ai:
1791 case Hexagon::V6_vL32b_cur_pi:
1792 case Hexagon::V6_vL32b_cur_ppu:
1793 case Hexagon::V6_vL32b_nt_ai:
1794 case Hexagon::V6_vL32b_nt_pi:
1795 case Hexagon::V6_vL32b_nt_ppu:
1796 case Hexagon::V6_vL32b_tmp_ai:
1797 case Hexagon::V6_vL32b_tmp_pi:
1798 case Hexagon::V6_vL32b_tmp_ppu:
1799 case Hexagon::V6_vL32b_nt_cur_ai:
1800 case Hexagon::V6_vL32b_nt_cur_pi:
1801 case Hexagon::V6_vL32b_nt_cur_ppu:
1802 case Hexagon::V6_vL32b_nt_tmp_ai:
1803 case Hexagon::V6_vL32b_nt_tmp_pi:
1804 case Hexagon::V6_vL32b_nt_tmp_ppu:
1812 bool Invert)
const {
1818 case Hexagon::F2_sfadd:
1834 if (
MI.isDebugInstr())
1844 for (
auto *
I :
MBB->successors())
1850 if (
MI.getDesc().isTerminator() ||
MI.isPosition())
1854 if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR)
1878 bool atInsnStart =
true;
1881 for (; *Str; ++Str) {
1885 if (atInsnStart && !
isSpace(
static_cast<unsigned char>(*Str))) {
1887 atInsnStart =
false;
1891 atInsnStart =
false;
1914 int64_t &
Value)
const {
1915 unsigned Opc =
MI.getOpcode();
1919 case Hexagon::C2_cmpeq:
1920 case Hexagon::C2_cmpeqp:
1921 case Hexagon::C2_cmpgt:
1922 case Hexagon::C2_cmpgtp:
1923 case Hexagon::C2_cmpgtu:
1924 case Hexagon::C2_cmpgtup:
1925 case Hexagon::C4_cmpneq:
1926 case Hexagon::C4_cmplte:
1927 case Hexagon::C4_cmplteu:
1928 case Hexagon::C2_cmpeqi:
1929 case Hexagon::C2_cmpgti:
1930 case Hexagon::C2_cmpgtui:
1931 case Hexagon::C4_cmpneqi:
1932 case Hexagon::C4_cmplteui:
1933 case Hexagon::C4_cmpltei:
1934 SrcReg =
MI.getOperand(1).getReg();
1937 case Hexagon::A4_cmpbeq:
1938 case Hexagon::A4_cmpbgt:
1939 case Hexagon::A4_cmpbgtu:
1940 case Hexagon::A4_cmpbeqi:
1941 case Hexagon::A4_cmpbgti:
1942 case Hexagon::A4_cmpbgtui:
1943 SrcReg =
MI.getOperand(1).getReg();
1946 case Hexagon::A4_cmpheq:
1947 case Hexagon::A4_cmphgt:
1948 case Hexagon::A4_cmphgtu:
1949 case Hexagon::A4_cmpheqi:
1950 case Hexagon::A4_cmphgti:
1951 case Hexagon::A4_cmphgtui:
1952 SrcReg =
MI.getOperand(1).getReg();
1959 case Hexagon::C2_cmpeq:
1960 case Hexagon::C2_cmpeqp:
1961 case Hexagon::C2_cmpgt:
1962 case Hexagon::C2_cmpgtp:
1963 case Hexagon::C2_cmpgtu:
1964 case Hexagon::C2_cmpgtup:
1965 case Hexagon::A4_cmpbeq:
1966 case Hexagon::A4_cmpbgt:
1967 case Hexagon::A4_cmpbgtu:
1968 case Hexagon::A4_cmpheq:
1969 case Hexagon::A4_cmphgt:
1970 case Hexagon::A4_cmphgtu:
1971 case Hexagon::C4_cmpneq:
1972 case Hexagon::C4_cmplte:
1973 case Hexagon::C4_cmplteu:
1974 SrcReg2 =
MI.getOperand(2).getReg();
1978 case Hexagon::C2_cmpeqi:
1979 case Hexagon::C2_cmpgtui:
1980 case Hexagon::C2_cmpgti:
1981 case Hexagon::C4_cmpneqi:
1982 case Hexagon::C4_cmplteui:
1983 case Hexagon::C4_cmpltei:
1984 case Hexagon::A4_cmpbeqi:
1985 case Hexagon::A4_cmpbgti:
1986 case Hexagon::A4_cmpbgtui:
1987 case Hexagon::A4_cmpheqi:
1988 case Hexagon::A4_cmphgti:
1989 case Hexagon::A4_cmphgtui: {
1994 Value =
MI.getOperand(2).getImm();
2004 unsigned *PredCost)
const {
2030 unsigned BasePosA, OffsetPosA;
2038 unsigned BasePosB, OffsetPosB;
2045 if (BaseRegA != BaseRegB || BaseSubA != BaseSubB)
2063 if (OffsetA > OffsetB) {
2065 return SizeB <= OffDiff;
2067 if (OffsetA < OffsetB) {
2069 return SizeA <= OffDiff;
2079 unsigned BasePos = 0, OffsetPos = 0;
2087 }
else if (
MI.getOpcode() == Hexagon::A2_addi) {
2089 if (AddOp.isImm()) {
2090 Value = AddOp.getImm();
2098std::pair<unsigned, unsigned>
2108 static const std::pair<unsigned, const char*> Flags[] = {
2109 {MO_PCREL,
"hexagon-pcrel"},
2110 {MO_GOT,
"hexagon-got"},
2111 {MO_LO16,
"hexagon-lo16"},
2112 {MO_HI16,
"hexagon-hi16"},
2113 {MO_GPREL,
"hexagon-gprel"},
2114 {MO_GDGOT,
"hexagon-gdgot"},
2115 {MO_GDPLT,
"hexagon-gdplt"},
2116 {MO_IE,
"hexagon-ie"},
2117 {MO_IEGOT,
"hexagon-iegot"},
2118 {MO_TPREL,
"hexagon-tprel"}
2127 static const std::pair<unsigned, const char*> Flags[] = {
2128 {HMOTF_ConstExtended,
"hexagon-ext"}
2136 if (VT == MVT::i1) {
2137 TRC = &Hexagon::PredRegsRegClass;
2138 }
else if (VT == MVT::i32 || VT == MVT::f32) {
2139 TRC = &Hexagon::IntRegsRegClass;
2140 }
else if (VT == MVT::i64 || VT == MVT::f64) {
2141 TRC = &Hexagon::DoubleRegsRegClass;
2165 !
MI.getDesc().mayStore() &&
2166 MI.getDesc().getOpcode() != Hexagon::S2_allocframe &&
2167 MI.getDesc().getOpcode() != Hexagon::L2_deallocframe &&
2212 assert(MO.
isImm() &&
"Extendable operand must be Immediate type");
2216 int32_t SValue =
Value;
2219 return SValue < MinValue || SValue > MaxValue;
2224 return UValue < MinValue || UValue > MaxValue;
2228 switch (
MI.getOpcode()) {
2229 case Hexagon::L4_return:
2230 case Hexagon::L4_return_t:
2231 case Hexagon::L4_return_f:
2232 case Hexagon::L4_return_tnew_pnt:
2233 case Hexagon::L4_return_fnew_pnt:
2234 case Hexagon::L4_return_tnew_pt:
2235 case Hexagon::L4_return_fnew_pt:
2256 for (
auto &RegA : DefsA)
2257 for (
auto &RegB : UsesB) {
2274 switch (
MI.getOpcode()) {
2275 case Hexagon::V6_vL32b_cur_pi:
2276 case Hexagon::V6_vL32b_cur_ai:
2300 return (Opcode == Hexagon::ENDLOOP0 ||
2301 Opcode == Hexagon::ENDLOOP1);
2326 switch (
MI.getOpcode()) {
2328 case Hexagon::PS_fi:
2329 case Hexagon::PS_fia:
2354 unsigned Opcode =
MI.getOpcode();
2364 if (!
I.mayLoad() && !
I.mayStore())
2370 switch (
MI.getOpcode()) {
2371 case Hexagon::J2_callr:
2372 case Hexagon::J2_callrf:
2373 case Hexagon::J2_callrt:
2374 case Hexagon::PS_call_nr:
2381 switch (
MI.getOpcode()) {
2382 case Hexagon::L4_return:
2383 case Hexagon::L4_return_t:
2384 case Hexagon::L4_return_f:
2385 case Hexagon::L4_return_fnew_pnt:
2386 case Hexagon::L4_return_fnew_pt:
2387 case Hexagon::L4_return_tnew_pnt:
2388 case Hexagon::L4_return_tnew_pt:
2395 switch (
MI.getOpcode()) {
2396 case Hexagon::J2_jumpr:
2397 case Hexagon::J2_jumprt:
2398 case Hexagon::J2_jumprf:
2399 case Hexagon::J2_jumprtnewpt:
2400 case Hexagon::J2_jumprfnewpt:
2401 case Hexagon::J2_jumprtnew:
2402 case Hexagon::J2_jumprfnew:
2413 unsigned offset)
const {
2419 switch (
MI.getOpcode()) {
2423 case Hexagon::J2_jump:
2424 case Hexagon::J2_call:
2425 case Hexagon::PS_call_nr:
2427 case Hexagon::J2_jumpt:
2428 case Hexagon::J2_jumpf:
2429 case Hexagon::J2_jumptnew:
2430 case Hexagon::J2_jumptnewpt:
2431 case Hexagon::J2_jumpfnew:
2432 case Hexagon::J2_jumpfnewpt:
2433 case Hexagon::J2_callt:
2434 case Hexagon::J2_callf:
2436 case Hexagon::J2_loop0i:
2437 case Hexagon::J2_loop0iext:
2438 case Hexagon::J2_loop0r:
2439 case Hexagon::J2_loop0rext:
2440 case Hexagon::J2_loop1i:
2441 case Hexagon::J2_loop1iext:
2442 case Hexagon::J2_loop1r:
2443 case Hexagon::J2_loop1rext:
2446 case Hexagon::J4_cmpeqi_tp0_jump_nt:
2447 case Hexagon::J4_cmpeqi_tp1_jump_nt:
2448 case Hexagon::J4_cmpeqn1_tp0_jump_nt:
2449 case Hexagon::J4_cmpeqn1_tp1_jump_nt:
2461 unsigned Opcode =
MI.getOpcode();
2462 return Opcode == Hexagon::J2_loop0i ||
2463 Opcode == Hexagon::J2_loop0r ||
2464 Opcode == Hexagon::J2_loop0iext ||
2465 Opcode == Hexagon::J2_loop0rext ||
2466 Opcode == Hexagon::J2_loop1i ||
2467 Opcode == Hexagon::J2_loop1r ||
2468 Opcode == Hexagon::J2_loop1iext ||
2469 Opcode == Hexagon::J2_loop1rext;
2473 switch (
MI.getOpcode()) {
2474 default:
return false;
2475 case Hexagon::L4_iadd_memopw_io:
2476 case Hexagon::L4_isub_memopw_io:
2477 case Hexagon::L4_add_memopw_io:
2478 case Hexagon::L4_sub_memopw_io:
2479 case Hexagon::L4_and_memopw_io:
2480 case Hexagon::L4_or_memopw_io:
2481 case Hexagon::L4_iadd_memoph_io:
2482 case Hexagon::L4_isub_memoph_io:
2483 case Hexagon::L4_add_memoph_io:
2484 case Hexagon::L4_sub_memoph_io:
2485 case Hexagon::L4_and_memoph_io:
2486 case Hexagon::L4_or_memoph_io:
2487 case Hexagon::L4_iadd_memopb_io:
2488 case Hexagon::L4_isub_memopb_io:
2489 case Hexagon::L4_add_memopb_io:
2490 case Hexagon::L4_sub_memopb_io:
2491 case Hexagon::L4_and_memopb_io:
2492 case Hexagon::L4_or_memopb_io:
2493 case Hexagon::L4_ior_memopb_io:
2494 case Hexagon::L4_ior_memoph_io:
2495 case Hexagon::L4_ior_memopw_io:
2496 case Hexagon::L4_iand_memopb_io:
2497 case Hexagon::L4_iand_memoph_io:
2498 case Hexagon::L4_iand_memopw_io:
2538 unsigned OperandNum)
const {
2588 return MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4 ||
2589 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_EXT ||
2590 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_PIC ||
2591 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_EXT_PIC;
2595 switch (
MI.getOpcode()) {
2597 case Hexagon::L2_loadrb_io:
2598 case Hexagon::L4_loadrb_ur:
2599 case Hexagon::L4_loadrb_ap:
2600 case Hexagon::L2_loadrb_pr:
2601 case Hexagon::L2_loadrb_pbr:
2602 case Hexagon::L2_loadrb_pi:
2603 case Hexagon::L2_loadrb_pci:
2604 case Hexagon::L2_loadrb_pcr:
2605 case Hexagon::L2_loadbsw2_io:
2606 case Hexagon::L4_loadbsw2_ur:
2607 case Hexagon::L4_loadbsw2_ap:
2608 case Hexagon::L2_loadbsw2_pr:
2609 case Hexagon::L2_loadbsw2_pbr:
2610 case Hexagon::L2_loadbsw2_pi:
2611 case Hexagon::L2_loadbsw2_pci:
2612 case Hexagon::L2_loadbsw2_pcr:
2613 case Hexagon::L2_loadbsw4_io:
2614 case Hexagon::L4_loadbsw4_ur:
2615 case Hexagon::L4_loadbsw4_ap:
2616 case Hexagon::L2_loadbsw4_pr:
2617 case Hexagon::L2_loadbsw4_pbr:
2618 case Hexagon::L2_loadbsw4_pi:
2619 case Hexagon::L2_loadbsw4_pci:
2620 case Hexagon::L2_loadbsw4_pcr:
2621 case Hexagon::L4_loadrb_rr:
2622 case Hexagon::L2_ploadrbt_io:
2623 case Hexagon::L2_ploadrbt_pi:
2624 case Hexagon::L2_ploadrbf_io:
2625 case Hexagon::L2_ploadrbf_pi:
2626 case Hexagon::L2_ploadrbtnew_io:
2627 case Hexagon::L2_ploadrbfnew_io:
2628 case Hexagon::L4_ploadrbt_rr:
2629 case Hexagon::L4_ploadrbf_rr:
2630 case Hexagon::L4_ploadrbtnew_rr:
2631 case Hexagon::L4_ploadrbfnew_rr:
2632 case Hexagon::L2_ploadrbtnew_pi:
2633 case Hexagon::L2_ploadrbfnew_pi:
2634 case Hexagon::L4_ploadrbt_abs:
2635 case Hexagon::L4_ploadrbf_abs:
2636 case Hexagon::L4_ploadrbtnew_abs:
2637 case Hexagon::L4_ploadrbfnew_abs:
2638 case Hexagon::L2_loadrbgp:
2640 case Hexagon::L2_loadrh_io:
2641 case Hexagon::L4_loadrh_ur:
2642 case Hexagon::L4_loadrh_ap:
2643 case Hexagon::L2_loadrh_pr:
2644 case Hexagon::L2_loadrh_pbr:
2645 case Hexagon::L2_loadrh_pi:
2646 case Hexagon::L2_loadrh_pci:
2647 case Hexagon::L2_loadrh_pcr:
2648 case Hexagon::L4_loadrh_rr:
2649 case Hexagon::L2_ploadrht_io:
2650 case Hexagon::L2_ploadrht_pi:
2651 case Hexagon::L2_ploadrhf_io:
2652 case Hexagon::L2_ploadrhf_pi:
2653 case Hexagon::L2_ploadrhtnew_io:
2654 case Hexagon::L2_ploadrhfnew_io:
2655 case Hexagon::L4_ploadrht_rr:
2656 case Hexagon::L4_ploadrhf_rr:
2657 case Hexagon::L4_ploadrhtnew_rr:
2658 case Hexagon::L4_ploadrhfnew_rr:
2659 case Hexagon::L2_ploadrhtnew_pi:
2660 case Hexagon::L2_ploadrhfnew_pi:
2661 case Hexagon::L4_ploadrht_abs:
2662 case Hexagon::L4_ploadrhf_abs:
2663 case Hexagon::L4_ploadrhtnew_abs:
2664 case Hexagon::L4_ploadrhfnew_abs:
2665 case Hexagon::L2_loadrhgp:
2678 switch (
MI.getOpcode()) {
2679 case Hexagon::STriw_pred:
2680 case Hexagon::LDriw_pred:
2691 for (
auto &
Op :
MI.operands())
2692 if (
Op.isGlobal() ||
Op.isSymbol())
2699 unsigned SchedClass =
MI.getDesc().getSchedClass();
2700 return is_TC1(SchedClass);
2704 unsigned SchedClass =
MI.getDesc().getSchedClass();
2705 return is_TC2(SchedClass);
2709 unsigned SchedClass =
MI.getDesc().getSchedClass();
2714 unsigned SchedClass =
MI.getDesc().getSchedClass();
2725 for (
int I = 0;
I <
N;
I++)
2730 if (MI2.
getOpcode() == Hexagon::V6_vS32b_pi)
2791 case Hexagon::PS_vstorerq_ai:
2792 case Hexagon::PS_vstorerv_ai:
2793 case Hexagon::PS_vstorerw_ai:
2794 case Hexagon::PS_vstorerw_nt_ai:
2795 case Hexagon::PS_vloadrq_ai:
2796 case Hexagon::PS_vloadrv_ai:
2797 case Hexagon::PS_vloadrw_ai:
2798 case Hexagon::PS_vloadrw_nt_ai:
2799 case Hexagon::V6_vL32b_ai:
2800 case Hexagon::V6_vS32b_ai:
2801 case Hexagon::V6_vS32b_pred_ai:
2802 case Hexagon::V6_vS32b_npred_ai:
2803 case Hexagon::V6_vS32b_qpred_ai:
2804 case Hexagon::V6_vS32b_nqpred_ai:
2805 case Hexagon::V6_vS32b_new_ai:
2806 case Hexagon::V6_vS32b_new_pred_ai:
2807 case Hexagon::V6_vS32b_new_npred_ai:
2808 case Hexagon::V6_vS32b_nt_pred_ai:
2809 case Hexagon::V6_vS32b_nt_npred_ai:
2810 case Hexagon::V6_vS32b_nt_new_ai:
2811 case Hexagon::V6_vS32b_nt_new_pred_ai:
2812 case Hexagon::V6_vS32b_nt_new_npred_ai:
2813 case Hexagon::V6_vS32b_nt_qpred_ai:
2814 case Hexagon::V6_vS32b_nt_nqpred_ai:
2815 case Hexagon::V6_vL32b_nt_ai:
2816 case Hexagon::V6_vS32b_nt_ai:
2817 case Hexagon::V6_vL32Ub_ai:
2818 case Hexagon::V6_vS32Ub_ai:
2819 case Hexagon::V6_vL32b_cur_ai:
2820 case Hexagon::V6_vL32b_tmp_ai:
2821 case Hexagon::V6_vL32b_pred_ai:
2822 case Hexagon::V6_vL32b_npred_ai:
2823 case Hexagon::V6_vL32b_cur_pred_ai:
2824 case Hexagon::V6_vL32b_cur_npred_ai:
2825 case Hexagon::V6_vL32b_tmp_pred_ai:
2826 case Hexagon::V6_vL32b_tmp_npred_ai:
2827 case Hexagon::V6_vL32b_nt_cur_ai:
2828 case Hexagon::V6_vL32b_nt_tmp_ai:
2829 case Hexagon::V6_vL32b_nt_pred_ai:
2830 case Hexagon::V6_vL32b_nt_npred_ai:
2831 case Hexagon::V6_vL32b_nt_cur_pred_ai:
2832 case Hexagon::V6_vL32b_nt_cur_npred_ai:
2833 case Hexagon::V6_vL32b_nt_tmp_pred_ai:
2834 case Hexagon::V6_vL32b_nt_tmp_npred_ai:
2835 case Hexagon::V6_vS32Ub_npred_ai:
2836 case Hexagon::V6_vgathermh_pseudo:
2837 case Hexagon::V6_vgather_vscatter_mh_pseudo:
2838 case Hexagon::V6_vgathermw_pseudo:
2839 case Hexagon::V6_vgathermhw_pseudo:
2840 case Hexagon::V6_vgathermhq_pseudo:
2841 case Hexagon::V6_vgathermwq_pseudo:
2842 case Hexagon::V6_vgathermhwq_pseudo: {
2843 unsigned VectorSize =
TRI->getSpillSize(Hexagon::HvxVRRegClass);
2845 if (
Offset & (VectorSize-1))
2850 case Hexagon::J2_loop0i:
2851 case Hexagon::J2_loop1i:
2854 case Hexagon::S4_storeirb_io:
2855 case Hexagon::S4_storeirbt_io:
2856 case Hexagon::S4_storeirbf_io:
2859 case Hexagon::S4_storeirh_io:
2860 case Hexagon::S4_storeirht_io:
2861 case Hexagon::S4_storeirhf_io:
2864 case Hexagon::S4_storeiri_io:
2865 case Hexagon::S4_storeirit_io:
2866 case Hexagon::S4_storeirif_io:
2869 case Hexagon::A4_cmpbeqi:
2871 case Hexagon::A4_cmpbgti:
2879 case Hexagon::L2_loadri_io:
2880 case Hexagon::S2_storeri_io:
2884 case Hexagon::L2_loadrd_io:
2885 case Hexagon::S2_storerd_io:
2889 case Hexagon::L2_loadrh_io:
2890 case Hexagon::L2_loadruh_io:
2891 case Hexagon::S2_storerh_io:
2892 case Hexagon::S2_storerf_io:
2896 case Hexagon::L2_loadrb_io:
2897 case Hexagon::L2_loadrub_io:
2898 case Hexagon::S2_storerb_io:
2902 case Hexagon::A2_addi:
2906 case Hexagon::L4_iadd_memopw_io:
2907 case Hexagon::L4_isub_memopw_io:
2908 case Hexagon::L4_add_memopw_io:
2909 case Hexagon::L4_sub_memopw_io:
2910 case Hexagon::L4_iand_memopw_io:
2911 case Hexagon::L4_ior_memopw_io:
2912 case Hexagon::L4_and_memopw_io:
2913 case Hexagon::L4_or_memopw_io:
2916 case Hexagon::L4_iadd_memoph_io:
2917 case Hexagon::L4_isub_memoph_io:
2918 case Hexagon::L4_add_memoph_io:
2919 case Hexagon::L4_sub_memoph_io:
2920 case Hexagon::L4_iand_memoph_io:
2921 case Hexagon::L4_ior_memoph_io:
2922 case Hexagon::L4_and_memoph_io:
2923 case Hexagon::L4_or_memoph_io:
2926 case Hexagon::L4_iadd_memopb_io:
2927 case Hexagon::L4_isub_memopb_io:
2928 case Hexagon::L4_add_memopb_io:
2929 case Hexagon::L4_sub_memopb_io:
2930 case Hexagon::L4_iand_memopb_io:
2931 case Hexagon::L4_ior_memopb_io:
2932 case Hexagon::L4_and_memopb_io:
2933 case Hexagon::L4_or_memopb_io:
2938 case Hexagon::STriw_pred:
2939 case Hexagon::LDriw_pred:
2940 case Hexagon::STriw_ctr:
2941 case Hexagon::LDriw_ctr:
2944 case Hexagon::PS_fi:
2945 case Hexagon::PS_fia:
2946 case Hexagon::INLINEASM:
2949 case Hexagon::L2_ploadrbt_io:
2950 case Hexagon::L2_ploadrbf_io:
2951 case Hexagon::L2_ploadrubt_io:
2952 case Hexagon::L2_ploadrubf_io:
2953 case Hexagon::S2_pstorerbt_io:
2954 case Hexagon::S2_pstorerbf_io:
2957 case Hexagon::L2_ploadrht_io:
2958 case Hexagon::L2_ploadrhf_io:
2959 case Hexagon::L2_ploadruht_io:
2960 case Hexagon::L2_ploadruhf_io:
2961 case Hexagon::S2_pstorerht_io:
2962 case Hexagon::S2_pstorerhf_io:
2965 case Hexagon::L2_ploadrit_io:
2966 case Hexagon::L2_ploadrif_io:
2967 case Hexagon::S2_pstorerit_io:
2968 case Hexagon::S2_pstorerif_io:
2971 case Hexagon::L2_ploadrdt_io:
2972 case Hexagon::L2_ploadrdf_io:
2973 case Hexagon::S2_pstorerdt_io:
2974 case Hexagon::S2_pstorerdf_io:
2977 case Hexagon::L2_loadbsw2_io:
2978 case Hexagon::L2_loadbzw2_io:
2981 case Hexagon::L2_loadbsw4_io:
2982 case Hexagon::L2_loadbzw4_io:
2986 dbgs() <<
"Failed Opcode is : " << Opcode <<
" (" <<
getName(Opcode)
2989 "Please define it in the above switch statement!");
3019 switch (
MI.getOpcode()) {
3021 case Hexagon::L2_loadrub_io:
3022 case Hexagon::L4_loadrub_ur:
3023 case Hexagon::L4_loadrub_ap:
3024 case Hexagon::L2_loadrub_pr:
3025 case Hexagon::L2_loadrub_pbr:
3026 case Hexagon::L2_loadrub_pi:
3027 case Hexagon::L2_loadrub_pci:
3028 case Hexagon::L2_loadrub_pcr:
3029 case Hexagon::L2_loadbzw2_io:
3030 case Hexagon::L4_loadbzw2_ur:
3031 case Hexagon::L4_loadbzw2_ap:
3032 case Hexagon::L2_loadbzw2_pr:
3033 case Hexagon::L2_loadbzw2_pbr:
3034 case Hexagon::L2_loadbzw2_pi:
3035 case Hexagon::L2_loadbzw2_pci:
3036 case Hexagon::L2_loadbzw2_pcr:
3037 case Hexagon::L2_loadbzw4_io:
3038 case Hexagon::L4_loadbzw4_ur:
3039 case Hexagon::L4_loadbzw4_ap:
3040 case Hexagon::L2_loadbzw4_pr:
3041 case Hexagon::L2_loadbzw4_pbr:
3042 case Hexagon::L2_loadbzw4_pi:
3043 case Hexagon::L2_loadbzw4_pci:
3044 case Hexagon::L2_loadbzw4_pcr:
3045 case Hexagon::L4_loadrub_rr:
3046 case Hexagon::L2_ploadrubt_io:
3047 case Hexagon::L2_ploadrubt_pi:
3048 case Hexagon::L2_ploadrubf_io:
3049 case Hexagon::L2_ploadrubf_pi:
3050 case Hexagon::L2_ploadrubtnew_io:
3051 case Hexagon::L2_ploadrubfnew_io:
3052 case Hexagon::L4_ploadrubt_rr:
3053 case Hexagon::L4_ploadrubf_rr:
3054 case Hexagon::L4_ploadrubtnew_rr:
3055 case Hexagon::L4_ploadrubfnew_rr:
3056 case Hexagon::L2_ploadrubtnew_pi:
3057 case Hexagon::L2_ploadrubfnew_pi:
3058 case Hexagon::L4_ploadrubt_abs:
3059 case Hexagon::L4_ploadrubf_abs:
3060 case Hexagon::L4_ploadrubtnew_abs:
3061 case Hexagon::L4_ploadrubfnew_abs:
3062 case Hexagon::L2_loadrubgp:
3064 case Hexagon::L2_loadruh_io:
3065 case Hexagon::L4_loadruh_ur:
3066 case Hexagon::L4_loadruh_ap:
3067 case Hexagon::L2_loadruh_pr:
3068 case Hexagon::L2_loadruh_pbr:
3069 case Hexagon::L2_loadruh_pi:
3070 case Hexagon::L2_loadruh_pci:
3071 case Hexagon::L2_loadruh_pcr:
3072 case Hexagon::L4_loadruh_rr:
3073 case Hexagon::L2_ploadruht_io:
3074 case Hexagon::L2_ploadruht_pi:
3075 case Hexagon::L2_ploadruhf_io:
3076 case Hexagon::L2_ploadruhf_pi:
3077 case Hexagon::L2_ploadruhtnew_io:
3078 case Hexagon::L2_ploadruhfnew_io:
3079 case Hexagon::L4_ploadruht_rr:
3080 case Hexagon::L4_ploadruhf_rr:
3081 case Hexagon::L4_ploadruhtnew_rr:
3082 case Hexagon::L4_ploadruhfnew_rr:
3083 case Hexagon::L2_ploadruhtnew_pi:
3084 case Hexagon::L2_ploadruhfnew_pi:
3085 case Hexagon::L4_ploadruht_abs:
3086 case Hexagon::L4_ploadruhf_abs:
3087 case Hexagon::L4_ploadruhtnew_abs:
3088 case Hexagon::L4_ploadruhfnew_abs:
3089 case Hexagon::L2_loadruhgp:
3110 OffsetIsScalable =
false;
3112 if (!BaseOp || !BaseOp->
isReg())
3121 if (Second.
mayStore() &&
First.getOpcode() == Hexagon::S2_allocframe) {
3123 if (
Op.isReg() &&
Op.isUse() &&
Op.getReg() == Hexagon::R29)
3133 if (!Stored.
isReg())
3135 for (
unsigned i = 0, e =
First.getNumOperands(); i < e; ++i) {
3137 if (
Op.isReg() &&
Op.isDef() &&
Op.getReg() == Stored.
getReg())
3146 return Opc == Hexagon::PS_call_nr ||
Opc == Hexagon::PS_callr_nr;
3162 if (Hexagon::getRegForm(
MI.getOpcode()) >= 0)
3165 if (
MI.getDesc().mayLoad() ||
MI.getDesc().mayStore()) {
3172 NonExtOpcode = Hexagon::changeAddrMode_abs_io(
MI.getOpcode());
3178 NonExtOpcode = Hexagon::changeAddrMode_io_rr(
MI.getOpcode());
3181 NonExtOpcode = Hexagon::changeAddrMode_ur_rr(
MI.getOpcode());
3186 if (NonExtOpcode < 0)
3194 return Hexagon::getRealHWInstr(
MI.getOpcode(),
3195 Hexagon::InstrType_Pseudo) >= 0;
3213 Subtarget.hasV60Ops();
3218 if (
MI.mayStore() && !Subtarget.useNewValueStores())
3252 if (!MII->isBundle())
3255 for (++MII; MII != MIE && MII->isInsideBundle(); ++MII) {
3267 if (MO.isRegMask() && MO.clobbersPhysReg(PredReg))
3269 if (MO.isReg() && MO.isDef() && MO.isImplicit() && (MO.getReg() == PredReg))
3275 switch (
MI.getOpcode()) {
3276 case Hexagon::A4_addp_c:
3277 case Hexagon::A4_subp_c:
3278 case Hexagon::A4_tlbmatch:
3279 case Hexagon::A5_ACS:
3280 case Hexagon::F2_sfinvsqrta:
3281 case Hexagon::F2_sfrecipa:
3282 case Hexagon::J2_endloop0:
3283 case Hexagon::J2_endloop01:
3284 case Hexagon::J2_ploop1si:
3285 case Hexagon::J2_ploop1sr:
3286 case Hexagon::J2_ploop2si:
3287 case Hexagon::J2_ploop2sr:
3288 case Hexagon::J2_ploop3si:
3289 case Hexagon::J2_ploop3sr:
3290 case Hexagon::S2_cabacdecbin:
3291 case Hexagon::S2_storew_locked:
3292 case Hexagon::S4_stored_locked:
3299 return Opcode == Hexagon::J2_jumpt ||
3300 Opcode == Hexagon::J2_jumptpt ||
3301 Opcode == Hexagon::J2_jumpf ||
3302 Opcode == Hexagon::J2_jumpfpt ||
3303 Opcode == Hexagon::J2_jumptnew ||
3304 Opcode == Hexagon::J2_jumpfnew ||
3305 Opcode == Hexagon::J2_jumptnewpt ||
3306 Opcode == Hexagon::J2_jumpfnewpt;
3335 unsigned BasePos = 0, OffsetPos = 0;
3358 unsigned &BasePos,
unsigned &OffsetPos)
const {
3366 }
else if (
MI.mayStore()) {
3369 }
else if (
MI.mayLoad()) {
3384 if (!
MI.getOperand(BasePos).isReg() || !
MI.getOperand(OffsetPos).isImm())
3399 if (
I ==
MBB.instr_begin())
3418 }
while (
I !=
MBB.instr_begin());
3420 I =
MBB.instr_end();
3423 while (
I->isDebugInstr()) {
3424 if (
I ==
MBB.instr_begin())
3428 if (!isUnpredicatedTerminator(*
I))
3437 if (&*
I != LastInst && !
I->isBundle() && isUnpredicatedTerminator(*
I)) {
3438 if (!SecondLastInst) {
3439 SecondLastInst = &*
I;
3444 if (
I ==
MBB.instr_begin())
3461 Register DstReg, SrcReg, Src1Reg, Src2Reg;
3463 switch (
MI.getOpcode()) {
3472 case Hexagon::C2_cmpeq:
3473 case Hexagon::C2_cmpgt:
3474 case Hexagon::C2_cmpgtu:
3475 DstReg =
MI.getOperand(0).getReg();
3476 Src1Reg =
MI.getOperand(1).getReg();
3477 Src2Reg =
MI.getOperand(2).getReg();
3478 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3479 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3483 case Hexagon::C2_cmpeqi:
3484 case Hexagon::C2_cmpgti:
3485 case Hexagon::C2_cmpgtui:
3487 DstReg =
MI.getOperand(0).getReg();
3488 SrcReg =
MI.getOperand(1).getReg();
3489 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3490 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3493 (
MI.getOperand(2).getImm() == -1)))
3496 case Hexagon::A2_tfr:
3498 DstReg =
MI.getOperand(0).getReg();
3499 SrcReg =
MI.getOperand(1).getReg();
3503 case Hexagon::A2_tfrsi:
3507 DstReg =
MI.getOperand(0).getReg();
3511 case Hexagon::S2_tstbit_i:
3512 DstReg =
MI.getOperand(0).getReg();
3513 Src1Reg =
MI.getOperand(1).getReg();
3514 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3515 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3516 MI.getOperand(2).isImm() &&
3524 case Hexagon::J2_jumptnew:
3525 case Hexagon::J2_jumpfnew:
3526 case Hexagon::J2_jumptnewpt:
3527 case Hexagon::J2_jumpfnewpt:
3528 Src1Reg =
MI.getOperand(0).getReg();
3529 if (Hexagon::PredRegsRegClass.
contains(Src1Reg) &&
3530 (Hexagon::P0 == Src1Reg || Hexagon::P1 == Src1Reg))
3537 case Hexagon::J2_jump:
3538 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4:
3539 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4_PIC:
3551 if ((GA.
getOpcode() != Hexagon::C2_cmpeqi) ||
3552 (GB.
getOpcode() != Hexagon::J2_jumptnew))
3557 if (DestReg != Hexagon::P0 && DestReg != Hexagon::P1)
3565 return DestReg == Hexagon::P0 ? Hexagon::J4_cmpeqn1_tp0_jump_nt
3566 : Hexagon::J4_cmpeqn1_tp1_jump_nt;
3569 return DestReg == Hexagon::P0 ? Hexagon::J4_cmpeqi_tp0_jump_nt
3570 : Hexagon::J4_cmpeqi_tp1_jump_nt;
3575 bool ForBigCore)
const {
3583 static const std::map<unsigned, unsigned> DupMap = {
3584 {Hexagon::A2_add, Hexagon::dup_A2_add},
3585 {Hexagon::A2_addi, Hexagon::dup_A2_addi},
3586 {Hexagon::A2_andir, Hexagon::dup_A2_andir},
3587 {Hexagon::A2_combineii, Hexagon::dup_A2_combineii},
3588 {Hexagon::A2_sxtb, Hexagon::dup_A2_sxtb},
3589 {Hexagon::A2_sxth, Hexagon::dup_A2_sxth},
3590 {Hexagon::A2_tfr, Hexagon::dup_A2_tfr},
3591 {Hexagon::A2_tfrsi, Hexagon::dup_A2_tfrsi},
3592 {Hexagon::A2_zxtb, Hexagon::dup_A2_zxtb},
3593 {Hexagon::A2_zxth, Hexagon::dup_A2_zxth},
3594 {Hexagon::A4_combineii, Hexagon::dup_A4_combineii},
3595 {Hexagon::A4_combineir, Hexagon::dup_A4_combineir},
3596 {Hexagon::A4_combineri, Hexagon::dup_A4_combineri},
3597 {Hexagon::C2_cmoveif, Hexagon::dup_C2_cmoveif},
3598 {Hexagon::C2_cmoveit, Hexagon::dup_C2_cmoveit},
3599 {Hexagon::C2_cmovenewif, Hexagon::dup_C2_cmovenewif},
3600 {Hexagon::C2_cmovenewit, Hexagon::dup_C2_cmovenewit},
3601 {Hexagon::C2_cmpeqi, Hexagon::dup_C2_cmpeqi},
3602 {Hexagon::L2_deallocframe, Hexagon::dup_L2_deallocframe},
3603 {Hexagon::L2_loadrb_io, Hexagon::dup_L2_loadrb_io},
3604 {Hexagon::L2_loadrd_io, Hexagon::dup_L2_loadrd_io},
3605 {Hexagon::L2_loadrh_io, Hexagon::dup_L2_loadrh_io},
3606 {Hexagon::L2_loadri_io, Hexagon::dup_L2_loadri_io},
3607 {Hexagon::L2_loadrub_io, Hexagon::dup_L2_loadrub_io},
3608 {Hexagon::L2_loadruh_io, Hexagon::dup_L2_loadruh_io},
3609 {Hexagon::S2_allocframe, Hexagon::dup_S2_allocframe},
3610 {Hexagon::S2_storerb_io, Hexagon::dup_S2_storerb_io},
3611 {Hexagon::S2_storerd_io, Hexagon::dup_S2_storerd_io},
3612 {Hexagon::S2_storerh_io, Hexagon::dup_S2_storerh_io},
3613 {Hexagon::S2_storeri_io, Hexagon::dup_S2_storeri_io},
3614 {Hexagon::S4_storeirb_io, Hexagon::dup_S4_storeirb_io},
3615 {Hexagon::S4_storeiri_io, Hexagon::dup_S4_storeiri_io},
3617 unsigned OpNum =
MI.getOpcode();
3620 auto Iter = DupMap.find(OpNum);
3621 if (Iter != DupMap.end())
3622 return Iter->second;
3624 for (
const auto &Iter : DupMap)
3625 if (Iter.second == OpNum)
3632 enum Hexagon::PredSense inPredSense;
3633 inPredSense = invertPredicate ? Hexagon::PredSense_false :
3634 Hexagon::PredSense_true;
3635 int CondOpcode = Hexagon::getPredOpcode(
Opc, inPredSense);
3636 if (CondOpcode >= 0)
3644 switch (
MI.getOpcode()) {
3646 case Hexagon::V6_vL32b_pi:
3647 return Hexagon::V6_vL32b_cur_pi;
3648 case Hexagon::V6_vL32b_ai:
3649 return Hexagon::V6_vL32b_cur_ai;
3650 case Hexagon::V6_vL32b_nt_pi:
3651 return Hexagon::V6_vL32b_nt_cur_pi;
3652 case Hexagon::V6_vL32b_nt_ai:
3653 return Hexagon::V6_vL32b_nt_cur_ai;
3654 case Hexagon::V6_vL32b_ppu:
3655 return Hexagon::V6_vL32b_cur_ppu;
3656 case Hexagon::V6_vL32b_nt_ppu:
3657 return Hexagon::V6_vL32b_nt_cur_ppu;
3664 switch (
MI.getOpcode()) {
3666 case Hexagon::V6_vL32b_cur_pi:
3667 return Hexagon::V6_vL32b_pi;
3668 case Hexagon::V6_vL32b_cur_ai:
3669 return Hexagon::V6_vL32b_ai;
3670 case Hexagon::V6_vL32b_nt_cur_pi:
3671 return Hexagon::V6_vL32b_nt_pi;
3672 case Hexagon::V6_vL32b_nt_cur_ai:
3673 return Hexagon::V6_vL32b_nt_ai;
3674 case Hexagon::V6_vL32b_cur_ppu:
3675 return Hexagon::V6_vL32b_ppu;
3676 case Hexagon::V6_vL32b_nt_cur_ppu:
3677 return Hexagon::V6_vL32b_nt_ppu;
3765 int NVOpcode = Hexagon::getNewValueOpcode(
MI.getOpcode());
3769 switch (
MI.getOpcode()) {
3772 std::to_string(
MI.getOpcode()));
3773 case Hexagon::S4_storerb_ur:
3774 return Hexagon::S4_storerbnew_ur;
3776 case Hexagon::S2_storerb_pci:
3777 return Hexagon::S2_storerb_pci;
3779 case Hexagon::S2_storeri_pci:
3780 return Hexagon::S2_storeri_pci;
3782 case Hexagon::S2_storerh_pci:
3783 return Hexagon::S2_storerh_pci;
3785 case Hexagon::S2_storerd_pci:
3786 return Hexagon::S2_storerd_pci;
3788 case Hexagon::S2_storerf_pci:
3789 return Hexagon::S2_storerf_pci;
3791 case Hexagon::V6_vS32b_ai:
3792 return Hexagon::V6_vS32b_new_ai;
3794 case Hexagon::V6_vS32b_pi:
3795 return Hexagon::V6_vS32b_new_pi;
3820 if (BrTarget.
isMBB()) {
3822 Taken = getEdgeProbability(Src, Dst) >= OneHalf;
3835 bool SawCond =
false, Bad =
false;
3839 if (
I.isConditionalBranch()) {
3846 if (
I.isUnconditionalBranch() && !SawCond) {
3854 if (NextIt ==
B.instr_end()) {
3857 if (!
B.isLayoutSuccessor(SB))
3859 Taken = getEdgeProbability(Src, SB) < OneHalf;
3863 assert(NextIt->isUnconditionalBranch());
3872 Taken =
BT && getEdgeProbability(Src,
BT) < OneHalf;
3879 switch (
MI.getOpcode()) {
3880 case Hexagon::J2_jumpt:
3881 return Taken ? Hexagon::J2_jumptnewpt : Hexagon::J2_jumptnew;
3882 case Hexagon::J2_jumpf:
3883 return Taken ? Hexagon::J2_jumpfnewpt : Hexagon::J2_jumpfnew;
3893 switch (
MI.getOpcode()) {
3895 case Hexagon::J2_jumpt:
3896 case Hexagon::J2_jumpf:
3900 int NewOpcode = Hexagon::getPredNewOpcode(
MI.getOpcode());
3907 int NewOp =
MI.getOpcode();
3909 NewOp = Hexagon::getPredOldOpcode(NewOp);
3913 if (!Subtarget.hasFeature(Hexagon::ArchV60)) {
3915 case Hexagon::J2_jumptpt:
3916 NewOp = Hexagon::J2_jumpt;
3918 case Hexagon::J2_jumpfpt:
3919 NewOp = Hexagon::J2_jumpf;
3921 case Hexagon::J2_jumprtpt:
3922 NewOp = Hexagon::J2_jumprt;
3924 case Hexagon::J2_jumprfpt:
3925 NewOp = Hexagon::J2_jumprf;
3930 "Couldn't change predicate new instruction to its old form.");
3934 NewOp = Hexagon::getNonNVStore(NewOp);
3935 assert(NewOp >= 0 &&
"Couldn't change new-value store to its old form.");
3938 if (Subtarget.hasV60Ops())
3943 case Hexagon::J2_jumpfpt:
3944 return Hexagon::J2_jumpf;
3945 case Hexagon::J2_jumptpt:
3946 return Hexagon::J2_jumpt;
3947 case Hexagon::J2_jumprfpt:
3948 return Hexagon::J2_jumprf;
3949 case Hexagon::J2_jumprtpt:
3950 return Hexagon::J2_jumprt;
3959 Register DstReg, SrcReg, Src1Reg, Src2Reg;
3962 switch (
MI.getOpcode()) {
3970 case Hexagon::L2_loadri_io:
3971 case Hexagon::dup_L2_loadri_io:
3972 DstReg =
MI.getOperand(0).getReg();
3973 SrcReg =
MI.getOperand(1).getReg();
3977 if (Hexagon::IntRegsRegClass.
contains(SrcReg) &&
3979 MI.getOperand(2).isImm() &&
3984 (
MI.getOperand(2).isImm() &&
3989 case Hexagon::L2_loadrub_io:
3990 case Hexagon::dup_L2_loadrub_io:
3992 DstReg =
MI.getOperand(0).getReg();
3993 SrcReg =
MI.getOperand(1).getReg();
3995 MI.getOperand(2).isImm() &&
isUInt<4>(
MI.getOperand(2).getImm()))
4008 case Hexagon::L2_loadrh_io:
4009 case Hexagon::L2_loadruh_io:
4010 case Hexagon::dup_L2_loadrh_io:
4011 case Hexagon::dup_L2_loadruh_io:
4013 DstReg =
MI.getOperand(0).getReg();
4014 SrcReg =
MI.getOperand(1).getReg();
4016 MI.getOperand(2).isImm() &&
4020 case Hexagon::L2_loadrb_io:
4021 case Hexagon::dup_L2_loadrb_io:
4023 DstReg =
MI.getOperand(0).getReg();
4024 SrcReg =
MI.getOperand(1).getReg();
4026 MI.getOperand(2).isImm() &&
4030 case Hexagon::L2_loadrd_io:
4031 case Hexagon::dup_L2_loadrd_io:
4033 DstReg =
MI.getOperand(0).getReg();
4034 SrcReg =
MI.getOperand(1).getReg();
4036 Hexagon::IntRegsRegClass.
contains(SrcReg) &&
4038 MI.getOperand(2).isImm() &&
4044 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4:
4045 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4_PIC:
4046 case Hexagon::L4_return:
4047 case Hexagon::L2_deallocframe:
4048 case Hexagon::dup_L2_deallocframe:
4050 case Hexagon::EH_RETURN_JMPR:
4051 case Hexagon::PS_jmpret:
4052 case Hexagon::SL2_jumpr31:
4055 DstReg =
MI.getOperand(0).getReg();
4056 if (Hexagon::IntRegsRegClass.
contains(DstReg) && (Hexagon::R31 == DstReg))
4059 case Hexagon::PS_jmprett:
4060 case Hexagon::PS_jmpretf:
4061 case Hexagon::PS_jmprettnewpt:
4062 case Hexagon::PS_jmpretfnewpt:
4063 case Hexagon::PS_jmprettnew:
4064 case Hexagon::PS_jmpretfnew:
4065 case Hexagon::SL2_jumpr31_t:
4066 case Hexagon::SL2_jumpr31_f:
4067 case Hexagon::SL2_jumpr31_tnew:
4068 case Hexagon::SL2_jumpr31_fnew:
4069 DstReg =
MI.getOperand(1).getReg();
4070 SrcReg =
MI.getOperand(0).getReg();
4072 if ((Hexagon::PredRegsRegClass.
contains(SrcReg) &&
4073 (Hexagon::P0 == SrcReg)) &&
4074 (Hexagon::IntRegsRegClass.
contains(DstReg) && (Hexagon::R31 == DstReg)))
4077 case Hexagon::L4_return_t:
4078 case Hexagon::L4_return_f:
4079 case Hexagon::L4_return_tnew_pnt:
4080 case Hexagon::L4_return_fnew_pnt:
4081 case Hexagon::L4_return_tnew_pt:
4082 case Hexagon::L4_return_fnew_pt:
4084 SrcReg =
MI.getOperand(0).getReg();
4085 if (Hexagon::PredRegsRegClass.
contains(SrcReg) && (Hexagon::P0 == SrcReg))
4093 case Hexagon::S2_storeri_io:
4094 case Hexagon::dup_S2_storeri_io:
4097 Src1Reg =
MI.getOperand(0).getReg();
4098 Src2Reg =
MI.getOperand(2).getReg();
4099 if (Hexagon::IntRegsRegClass.
contains(Src1Reg) &&
4106 MI.getOperand(1).isImm() &&
4110 case Hexagon::S2_storerb_io:
4111 case Hexagon::dup_S2_storerb_io:
4113 Src1Reg =
MI.getOperand(0).getReg();
4114 Src2Reg =
MI.getOperand(2).getReg();
4116 MI.getOperand(1).isImm() &&
isUInt<4>(
MI.getOperand(1).getImm()))
4128 case Hexagon::S2_storerh_io:
4129 case Hexagon::dup_S2_storerh_io:
4131 Src1Reg =
MI.getOperand(0).getReg();
4132 Src2Reg =
MI.getOperand(2).getReg();
4134 MI.getOperand(1).isImm() &&
4138 case Hexagon::S2_storerd_io:
4139 case Hexagon::dup_S2_storerd_io:
4141 Src1Reg =
MI.getOperand(0).getReg();
4142 Src2Reg =
MI.getOperand(2).getReg();
4144 Hexagon::IntRegsRegClass.
contains(Src1Reg) &&
4149 case Hexagon::S4_storeiri_io:
4150 case Hexagon::dup_S4_storeiri_io:
4152 Src1Reg =
MI.getOperand(0).getReg();
4155 MI.getOperand(2).isImm() &&
isUInt<1>(
MI.getOperand(2).getImm()))
4158 case Hexagon::S4_storeirb_io:
4159 case Hexagon::dup_S4_storeirb_io:
4161 Src1Reg =
MI.getOperand(0).getReg();
4163 MI.getOperand(1).isImm() &&
isUInt<4>(
MI.getOperand(1).getImm()) &&
4164 MI.getOperand(2).isImm() &&
isUInt<1>(
MI.getOperand(2).getImm()))
4167 case Hexagon::S2_allocframe:
4168 case Hexagon::dup_S2_allocframe:
4169 if (
MI.getOperand(2).isImm() &&
4191 case Hexagon::A2_addi:
4192 case Hexagon::dup_A2_addi:
4193 DstReg =
MI.getOperand(0).getReg();
4194 SrcReg =
MI.getOperand(1).getReg();
4197 if (Hexagon::IntRegsRegClass.
contains(SrcReg) &&
4202 if ((DstReg == SrcReg) &&
MI.getOperand(2).isImm() &&
4208 ((
MI.getOperand(2).getImm() == 1) ||
4209 (
MI.getOperand(2).getImm() == -1)))
4213 case Hexagon::A2_add:
4214 case Hexagon::dup_A2_add:
4216 DstReg =
MI.getOperand(0).getReg();
4217 Src1Reg =
MI.getOperand(1).getReg();
4218 Src2Reg =
MI.getOperand(2).getReg();
4223 case Hexagon::A2_andir:
4224 case Hexagon::dup_A2_andir:
4228 DstReg =
MI.getOperand(0).getReg();
4229 SrcReg =
MI.getOperand(1).getReg();
4231 MI.getOperand(2).isImm() &&
4232 ((
MI.getOperand(2).getImm() == 1) ||
4233 (
MI.getOperand(2).getImm() == 255)))
4236 case Hexagon::A2_tfr:
4237 case Hexagon::dup_A2_tfr:
4239 DstReg =
MI.getOperand(0).getReg();
4240 SrcReg =
MI.getOperand(1).getReg();
4244 case Hexagon::A2_tfrsi:
4245 case Hexagon::dup_A2_tfrsi:
4250 DstReg =
MI.getOperand(0).getReg();
4254 case Hexagon::C2_cmoveit:
4255 case Hexagon::C2_cmovenewit:
4256 case Hexagon::C2_cmoveif:
4257 case Hexagon::C2_cmovenewif:
4258 case Hexagon::dup_C2_cmoveit:
4259 case Hexagon::dup_C2_cmovenewit:
4260 case Hexagon::dup_C2_cmoveif:
4261 case Hexagon::dup_C2_cmovenewif:
4265 DstReg =
MI.getOperand(0).getReg();
4266 SrcReg =
MI.getOperand(1).getReg();
4268 Hexagon::PredRegsRegClass.
contains(SrcReg) && Hexagon::P0 == SrcReg &&
4269 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0)
4272 case Hexagon::C2_cmpeqi:
4273 case Hexagon::dup_C2_cmpeqi:
4275 DstReg =
MI.getOperand(0).getReg();
4276 SrcReg =
MI.getOperand(1).getReg();
4277 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
4279 MI.getOperand(2).isImm() &&
isUInt<2>(
MI.getOperand(2).getImm()))
4282 case Hexagon::A2_combineii:
4283 case Hexagon::A4_combineii:
4284 case Hexagon::dup_A2_combineii:
4285 case Hexagon::dup_A4_combineii:
4287 DstReg =
MI.getOperand(0).getReg();
4289 ((
MI.getOperand(1).isImm() &&
isUInt<2>(
MI.getOperand(1).getImm())) ||
4290 (
MI.getOperand(1).isGlobal() &&
4292 ((
MI.getOperand(2).isImm() &&
isUInt<2>(
MI.getOperand(2).getImm())) ||
4293 (
MI.getOperand(2).isGlobal() &&
4297 case Hexagon::A4_combineri:
4298 case Hexagon::dup_A4_combineri:
4301 DstReg =
MI.getOperand(0).getReg();
4302 SrcReg =
MI.getOperand(1).getReg();
4304 ((
MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0) ||
4305 (
MI.getOperand(2).isGlobal() &&
MI.getOperand(2).getOffset() == 0)))
4308 case Hexagon::A4_combineir:
4309 case Hexagon::dup_A4_combineir:
4311 DstReg =
MI.getOperand(0).getReg();
4312 SrcReg =
MI.getOperand(2).getReg();
4314 ((
MI.getOperand(1).isImm() &&
MI.getOperand(1).getImm() == 0) ||
4315 (
MI.getOperand(1).isGlobal() &&
MI.getOperand(1).getOffset() == 0)))
4318 case Hexagon::A2_sxtb:
4319 case Hexagon::A2_sxth:
4320 case Hexagon::A2_zxtb:
4321 case Hexagon::A2_zxth:
4322 case Hexagon::dup_A2_sxtb:
4323 case Hexagon::dup_A2_sxth:
4324 case Hexagon::dup_A2_zxtb:
4325 case Hexagon::dup_A2_zxth:
4327 DstReg =
MI.getOperand(0).getReg();
4328 SrcReg =
MI.getOperand(1).getReg();
4338 return Hexagon::getRealHWInstr(
MI.getOpcode(), Hexagon::InstrType_Real);
4348 if (
MI.isTransient())
4372 int Idx =
DefMI.findRegisterDefOperandIdx(SR, &HRI,
false,
false);
4383 int Idx =
UseMI.findRegisterUseOperandIdx(SR, &HRI,
false);
4417 : Hexagon::getTruePredOpcode(
Opc);
4418 if (InvPredOpcode >= 0)
4419 return InvPredOpcode;
4433 return ~(-1U << (bits - 1));
4435 return ~(-1U << bits);
4440 switch (
MI.getOpcode()) {
4441 case Hexagon::L2_loadrbgp:
4442 case Hexagon::L2_loadrdgp:
4443 case Hexagon::L2_loadrhgp:
4444 case Hexagon::L2_loadrigp:
4445 case Hexagon::L2_loadrubgp:
4446 case Hexagon::L2_loadruhgp:
4447 case Hexagon::S2_storerbgp:
4448 case Hexagon::S2_storerbnewgp:
4449 case Hexagon::S2_storerhgp:
4450 case Hexagon::S2_storerhnewgp:
4451 case Hexagon::S2_storerigp:
4452 case Hexagon::S2_storerinewgp:
4453 case Hexagon::S2_storerdgp:
4454 case Hexagon::S2_storerfgp:
4472 if (
MI.getOpcode() == Hexagon::A4_ext)
4486 bool ToBigInstrs)
const {
4498 MII->setDesc(
get(Opcode));
4504 bool ToBigInstrs)
const {
4507 End = MB.instr_end();
4508 Instr != End; ++Instr)
4516 while ((MII !=
MBB->instr_end()) && MII->isInsideBundle()) {
4526 unsigned S = (
F >> MemAccessSizePos) & MemAccesSizeMask;
4527 unsigned Size = getMemAccessSizeInBytes(MemAccessSize(S));
4531 if (
MI.getOpcode() == Hexagon::Y2_dcfetchbo)
4538 return HRI.getSpillSize(Hexagon::HvxVRRegClass);
4553 return -1U << (bits - 1);
4562 short NonExtOpcode = Hexagon::getRegForm(
MI.getOpcode());
4563 if (NonExtOpcode >= 0)
4564 return NonExtOpcode;
4566 if (
MI.getDesc().mayLoad() ||
MI.getDesc().mayStore()) {
4570 return Hexagon::changeAddrMode_abs_io(
MI.getOpcode());
4572 return Hexagon::changeAddrMode_io_rr(
MI.getOpcode());
4574 return Hexagon::changeAddrMode_ur_rr(
MI.getOpcode());
4584 Register &PredReg,
unsigned &PredRegPos,
unsigned &PredRegFlags)
const {
4592 PredReg =
Cond[1].getReg();
4596 if (
Cond[1].isImplicit())
4604 return Hexagon::getRealHWInstr(
MI.getOpcode(), Hexagon::InstrType_Pseudo);
4608 return Hexagon::getRegForm(
MI.getOpcode());
4616 if (
MI.isDebugInstr() ||
MI.isPosition())
4619 unsigned Size =
MI.getDesc().getSize();
4635 unsigned NumDefs = 0;
4636 for (;
MI.getOperand(NumDefs).
isReg() &&
MI.getOperand(NumDefs).isDef();
4638 assert(NumDefs !=
MI.getNumOperands()-2 &&
"No asm string?");
4640 assert(
MI.getOperand(NumDefs).isSymbol() &&
"No asm string?");
4642 const char *AsmStr =
MI.getOperand(NumDefs).getSymbolName();
4656 const InstrStage &IS = *
II.beginStage(
MI.getDesc().getSchedClass());
4668 assert(BundleHead->isBundle() &&
"Not a bundle header");
4678 "Instruction must be extendable");
4684 "Branch with unknown extendable field type");
4696 int TargetPos =
MI.getNumOperands() - 1;
4699 while ((TargetPos > -1) && !
MI.getOperand(TargetPos).isMBB())
4701 assert((TargetPos >= 0) &&
MI.getOperand(TargetPos).isMBB());
4702 MI.getOperand(TargetPos).setMBB(NewTarget);
4706 MI.setDesc(
get(NewOpcode));
4718 for (
unsigned insn = TargetOpcode::GENERIC_OP_END+1;
4719 insn < Hexagon::INSTRUCTION_LIST_END; ++insn) {
4740 int PredRevOpcode = -1;
4742 PredRevOpcode = Hexagon::notTakenBranchPrediction(Opcode);
4744 PredRevOpcode = Hexagon::takenBranchPrediction(Opcode);
4745 assert(PredRevOpcode > 0);
4746 return PredRevOpcode;
4752 return Cond.empty() || (
Cond[0].isImm() && (
Cond.size() != 1));
4759 if (Operand.
isImm())
4760 Operand.
setImm(Operand.
getImm() | memShufDisabledMask);
4768 return (Operand.
isImm() && (Operand.
getImm() & memShufDisabledMask) != 0);
4772 return (
MI->getOpcode() == Hexagon::V6_vmpy_qf16_hf ||
4773 MI->getOpcode() == Hexagon::V6_vmpy_qf16_mix_hf ||
4774 MI->getOpcode() == Hexagon::V6_vmpy_qf32_hf ||
4775 MI->getOpcode() == Hexagon::V6_vmpy_qf32_mix_hf ||
4776 MI->getOpcode() == Hexagon::V6_vmpy_qf32_sf ||
4777 MI->getOpcode() == Hexagon::V6_vmpy_qf16_mix_hf ||
4778 MI->getOpcode() == Hexagon::V6_vmpy_qf16 ||
4779 MI->getOpcode() == Hexagon::V6_vmpy_qf32_mix_hf ||
4780 MI->getOpcode() == Hexagon::V6_vmpy_qf32_qf16 ||
4781 MI->getOpcode() == Hexagon::V6_vmpy_qf32);
4786 return Opc >= 0 ? Hexagon::changeAddrMode_abs_io(
Opc) :
Opc;
4790 return Opc >= 0 ? Hexagon::changeAddrMode_io_abs(
Opc) :
Opc;
4794 return Opc >= 0 ? Hexagon::changeAddrMode_io_pi(
Opc) :
Opc;
4798 return Opc >= 0 ? Hexagon::changeAddrMode_io_rr(
Opc) :
Opc;
4802 return Opc >= 0 ? Hexagon::changeAddrMode_pi_io(
Opc) :
Opc;
4806 return Opc >= 0 ? Hexagon::changeAddrMode_rr_io(
Opc) :
Opc;
4810 return Opc >= 0 ? Hexagon::changeAddrMode_rr_ur(
Opc) :
Opc;
4814 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
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 DebugLoc that has line number information, given a range of instructions.
static bool isUndef(const MachineInstr &MI)
Register const TargetRegisterInfo * TRI
Promote Memory to Register
static MCRegister 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
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, 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 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
bool isQFPMul(const MachineInstr *MF) 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.
bool isAssociativeAndCommutative(const MachineInstr &Inst, bool Invert) const override
InstrStage::FuncUnits getUnits(const MachineInstr &MI) const
unsigned getMemAccessSize(const MachineInstr &MI) const
bool predOpcodeHasNot(ArrayRef< MachineOperand > Cond) const
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
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, Register VReg, unsigned SubReg=0, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Load the specified register of the given register class from the specified stack frame index.
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
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.
bool getFlag(MIFlag Flag) const
Return whether an MI flag is set.
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 unsigned getKillRegState(bool B)
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 getRegState(const MachineOperand &RegOp)
Get all register state flags from machine operand RegOp.
bool is_TC2early(unsigned SchedClass)
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.
constexpr unsigned getUndefRegState(bool B)
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.