48#define GET_INSTRINFO_CTOR_DTOR
49#define GET_INSTRMAP_INFO
50#include "SystemZGenInstrInfo.inc"
52#define DEBUG_TYPE "systemz-II"
56 return Count == 0 ? 0 : (
uint64_t(1) << (Count - 1) << 1) - 1;
60void SystemZInstrInfo::anchor() {}
64 RI(sti.getSpecialRegisters()->getReturnFunctionAddressRegister()),
70 unsigned NewOpcode)
const {
86 HighRegOp.
setReg(RI.getSubReg(HighRegOp.
getReg(), SystemZ::subreg_h64));
87 LowRegOp.
setReg(RI.getSubReg(LowRegOp.
getReg(), SystemZ::subreg_l64));
98 assert(HighOpcode && LowOpcode &&
"Both offsets should be in range");
103 if (
MI->mayStore()) {
115 auto overlapsAddressReg = [&](
Register Reg) ->
bool {
116 return RI.regsOverlap(Reg,
MI->getOperand(1).getReg()) ||
117 RI.regsOverlap(Reg,
MI->getOperand(3).getReg());
119 if (overlapsAddressReg(HighRegOp.
getReg())) {
121 "Both loads clobber address!");
145 assert(NewOpcode &&
"No support for huge argument lists yet");
146 MI->setDesc(
get(NewOpcode));
156void SystemZInstrInfo::expandRIPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
158 bool ConvertHigh)
const {
161 MI.setDesc(
get(IsHigh ? HighOpcode : LowOpcode));
162 if (IsHigh && ConvertHigh)
163 MI.getOperand(1).setImm(
uint32_t(
MI.getOperand(1).getImm()));
170void SystemZInstrInfo::expandRIEPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
172 unsigned HighOpcode)
const {
177 if (!DestIsHigh && !SrcIsHigh)
178 MI.setDesc(
get(LowOpcodeK));
180 if (DestReg != SrcReg) {
181 emitGRX32Move(*
MI.getParent(),
MI,
MI.getDebugLoc(), DestReg, SrcReg,
182 SystemZ::LR, 32,
MI.getOperand(1).isKill(),
183 MI.getOperand(1).isUndef());
184 MI.getOperand(1).setReg(DestReg);
186 MI.setDesc(
get(DestIsHigh ? HighOpcode : LowOpcode));
187 MI.tieOperands(0, 1);
194void SystemZInstrInfo::expandRXYPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
195 unsigned HighOpcode)
const {
199 MI.getOperand(2).getImm());
200 MI.setDesc(
get(Opcode));
206void SystemZInstrInfo::expandLOCPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
207 unsigned HighOpcode)
const {
210 MI.setDesc(
get(Opcode));
216void SystemZInstrInfo::expandZExtPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
217 unsigned Size)
const {
219 emitGRX32Move(*
MI.getParent(),
MI,
MI.getDebugLoc(),
220 MI.getOperand(0).getReg(),
MI.getOperand(1).getReg(), LowOpcode,
221 Size,
MI.getOperand(1).isKill(),
MI.getOperand(1).isUndef());
227 MI.eraseFromParent();
230void SystemZInstrInfo::expandLoadStackGuard(
MachineInstr *
MI)
const {
233 const Register Reg64 =
MI->getOperand(0).getReg();
234 const Register Reg32 = RI.getSubReg(Reg64, SystemZ::subreg_l32);
255 MI->setDesc(
get(SystemZ::LG));
268 unsigned SrcReg,
unsigned LowLowOpcode,
269 unsigned Size,
bool KillSrc,
270 bool UndefSrc)
const {
274 if (DestIsHigh && SrcIsHigh)
275 Opcode = SystemZ::RISBHH;
276 else if (DestIsHigh && !SrcIsHigh)
277 Opcode = SystemZ::RISBHL;
278 else if (!DestIsHigh && SrcIsHigh)
279 Opcode = SystemZ::RISBLH;
284 unsigned Rotate = (DestIsHigh != SrcIsHigh ? 32 : 0);
294 unsigned OpIdx2)
const {
297 return *
MI.getParent()->getParent()->CloneMachineInstr(&
MI);
301 switch (
MI.getOpcode()) {
302 case SystemZ::SELRMux:
303 case SystemZ::SELFHR:
306 case SystemZ::LOCRMux:
307 case SystemZ::LOCFHR:
309 case SystemZ::LOCGR: {
310 auto &WorkingMI = cloneIfNew(
MI);
312 unsigned CCValid = WorkingMI.getOperand(3).getImm();
313 unsigned CCMask = WorkingMI.getOperand(4).getImm();
314 WorkingMI.getOperand(4).setImm(CCMask ^ CCValid);
331 if ((MCID.
TSFlags & Flag) &&
MI.getOperand(1).isFI() &&
332 MI.getOperand(2).getImm() == 0 &&
MI.getOperand(3).getReg() == 0) {
333 FrameIndex =
MI.getOperand(1).getIndex();
334 return MI.getOperand(0).getReg();
340 int &FrameIndex)
const {
345 int &FrameIndex)
const {
351 int &SrcFrameIndex)
const {
354 if (
MI.getOpcode() != SystemZ::MVC || !
MI.getOperand(0).isFI() ||
355 MI.getOperand(1).getImm() != 0 || !
MI.getOperand(3).isFI() ||
356 MI.getOperand(4).getImm() != 0)
360 int64_t
Length =
MI.getOperand(2).getImm();
361 unsigned FI1 =
MI.getOperand(0).getIndex();
362 unsigned FI2 =
MI.getOperand(3).getIndex();
367 DestFrameIndex = FI1;
376 bool AllowModify)
const {
384 if (
I->isDebugInstr())
389 if (!isUnpredicatedTerminator(*
I))
399 if (!Branch.hasMBBTarget())
409 TBB = Branch.getMBBTarget();
422 I->eraseFromParent();
428 TBB = Branch.getMBBTarget();
436 TBB = Branch.getMBBTarget();
443 assert(
Cond.size() == 2 &&
TBB &&
"Should have seen a conditional branch");
447 if (
TBB != Branch.getMBBTarget())
451 unsigned OldCCValid =
Cond[0].getImm();
452 unsigned OldCCMask =
Cond[1].getImm();
453 if (OldCCValid == Branch.CCValid && OldCCMask == Branch.CCMask)
464 int *BytesRemoved)
const {
465 assert(!BytesRemoved &&
"code size not handled");
473 if (
I->isDebugInstr())
480 I->eraseFromParent();
490 assert(
Cond.size() == 2 &&
"Invalid condition");
500 int *BytesAdded)
const {
506 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
508 "SystemZ branch conditions have one component!");
509 assert(!BytesAdded &&
"code size not handled");
513 assert(!FBB &&
"Unconditional branch with multiple successors!");
520 unsigned CCValid =
Cond[0].getImm();
521 unsigned CCMask =
Cond[1].getImm();
536 int64_t &
Value)
const {
537 assert(
MI.isCompare() &&
"Caller should have checked for a comparison");
539 if (
MI.getNumExplicitOperands() == 2 &&
MI.getOperand(0).isReg() &&
540 MI.getOperand(1).isImm()) {
541 SrcReg =
MI.getOperand(0).getReg();
543 Value =
MI.getOperand(1).getImm();
556 int &FalseCycles)
const {
558 if (!STI.hasLoadStoreOnCond())
560 if (Pred.
size() != 2)
566 RI.getCommonSubClass(
MRI.getRegClass(TrueReg),
MRI.getRegClass(FalseReg));
571 if ((STI.hasLoadStoreOnCond2() &&
572 SystemZ::GRX32BitRegClass.hasSubClassEq(RC)) ||
573 SystemZ::GR32BitRegClass.hasSubClassEq(RC) ||
574 SystemZ::GR64BitRegClass.hasSubClassEq(RC)) {
594 assert(Pred.
size() == 2 &&
"Invalid condition");
595 unsigned CCValid = Pred[0].getImm();
596 unsigned CCMask = Pred[1].getImm();
599 if (SystemZ::GRX32BitRegClass.hasSubClassEq(RC)) {
600 if (STI.hasMiscellaneousExtensions3())
601 Opc = SystemZ::SELRMux;
602 else if (STI.hasLoadStoreOnCond2())
603 Opc = SystemZ::LOCRMux;
606 MRI.constrainRegClass(DstReg, &SystemZ::GR32BitRegClass);
607 Register TReg =
MRI.createVirtualRegister(&SystemZ::GR32BitRegClass);
608 Register FReg =
MRI.createVirtualRegister(&SystemZ::GR32BitRegClass);
614 }
else if (SystemZ::GR64BitRegClass.hasSubClassEq(RC)) {
615 if (STI.hasMiscellaneousExtensions3())
616 Opc = SystemZ::SELGR;
618 Opc = SystemZ::LOCGR;
632 DefMI =
MRI->getVRegDef(FoldAsLoadDefReg);
634 bool SawStore =
false;
639 MI.findRegisterUseOperandIdx(FoldAsLoadDefReg,
nullptr);
640 assert(UseOpIdx != -1 &&
"Expected FoldAsLoadDefReg to be used by MI.");
645 FoldAsLoadDefReg = 0;
655 unsigned DefOpc =
DefMI.getOpcode();
657 if (DefOpc == SystemZ::VGBM) {
658 int64_t ImmVal =
DefMI.getOperand(1).getImm();
673 MRI->getRegClass(CopyDstReg) == &SystemZ::GR128BitRegClass &&
674 MRI->hasOneNonDBGUse(Reg)) {
678 Register TmpReg =
MRI->createVirtualRegister(&SystemZ::GR64BitRegClass);
683 UseMI.setDesc(
get(SystemZ::REG_SEQUENCE));
684 UseMI.getOperand(1).setReg(TmpReg);
686 .
addImm(SystemZ::subreg_h64)
688 .
addImm(SystemZ::subreg_l64);
690 if (
MRI->use_nodbg_empty(Reg))
691 DefMI.eraseFromParent();
698 if (DefOpc != SystemZ::LHIMux && DefOpc != SystemZ::LHI &&
699 DefOpc != SystemZ::LGHI)
703 int32_t ImmVal = (int32_t)
DefMI.getOperand(1).getImm();
705 unsigned UseOpc =
UseMI.getOpcode();
711 case SystemZ::SELRMux:
714 case SystemZ::LOCRMux:
715 if (!STI.hasLoadStoreOnCond2())
717 NewUseOpc = SystemZ::LOCHIMux;
721 UseIdx = 2, CommuteIdx = 1;
729 if (!STI.hasLoadStoreOnCond2())
731 NewUseOpc = SystemZ::LOCGHI;
735 UseIdx = 2, CommuteIdx = 1;
743 if (CommuteIdx != -1)
744 if (!commuteInstruction(
UseMI,
false, CommuteIdx, UseIdx))
747 bool DeleteDef =
MRI->hasOneNonDBGUse(Reg);
750 UseMI.tieOperands(0, 1);
751 UseMI.getOperand(UseIdx).ChangeToImmediate(ImmVal);
753 DefMI.eraseFromParent();
759 unsigned Opcode =
MI.getOpcode();
760 if (Opcode == SystemZ::Return ||
761 Opcode == SystemZ::Return_XPLINK ||
762 Opcode == SystemZ::Trap ||
763 Opcode == SystemZ::CallJG ||
764 Opcode == SystemZ::CallBR)
771 unsigned NumCycles,
unsigned ExtraPredCycles,
785 return NumCycles == 1;
790 unsigned NumCyclesT,
unsigned ExtraPredCyclesT,
792 unsigned NumCyclesF,
unsigned ExtraPredCyclesF,
802 return NumCycles == 1;
807 assert(Pred.
size() == 2 &&
"Invalid condition");
808 unsigned CCValid = Pred[0].getImm();
809 unsigned CCMask = Pred[1].getImm();
810 assert(CCMask > 0 && CCMask < 15 &&
"Invalid predicate");
811 unsigned Opcode =
MI.getOpcode();
812 if (Opcode == SystemZ::Trap) {
813 MI.setDesc(
get(SystemZ::CondTrap));
819 if (Opcode == SystemZ::Return || Opcode == SystemZ::Return_XPLINK) {
820 MI.setDesc(
get(Opcode == SystemZ::Return ? SystemZ::CondReturn
821 : SystemZ::CondReturn_XPLINK));
828 if (Opcode == SystemZ::CallJG) {
830 const uint32_t *RegMask =
MI.getOperand(1).getRegMask();
833 MI.setDesc(
get(SystemZ::CallBRCL));
842 if (Opcode == SystemZ::CallBR) {
844 const uint32_t *RegMask =
MI.getOperand(1).getRegMask();
847 MI.setDesc(
get(SystemZ::CallBCR));
863 bool RenamableSrc)
const {
867 if (SystemZ::GR128BitRegClass.
contains(DestReg, SrcReg)) {
869 RI.getSubReg(SrcReg, SystemZ::subreg_h64), KillSrc);
873 RI.getSubReg(SrcReg, SystemZ::subreg_l64), KillSrc);
879 if (SystemZ::GRX32BitRegClass.
contains(DestReg, SrcReg)) {
880 emitGRX32Move(
MBB,
MBBI,
DL, DestReg, SrcReg, SystemZ::LR, 32, KillSrc,
886 if (SystemZ::VR128BitRegClass.
contains(DestReg) &&
887 SystemZ::FP128BitRegClass.
contains(SrcReg)) {
889 RI.getMatchingSuperReg(RI.getSubReg(SrcReg, SystemZ::subreg_h64),
890 SystemZ::subreg_h64, &SystemZ::VR128BitRegClass);
892 RI.getMatchingSuperReg(RI.getSubReg(SrcReg, SystemZ::subreg_l64),
893 SystemZ::subreg_h64, &SystemZ::VR128BitRegClass);
900 if (SystemZ::FP128BitRegClass.
contains(DestReg) &&
901 SystemZ::VR128BitRegClass.
contains(SrcReg)) {
903 RI.getMatchingSuperReg(RI.getSubReg(DestReg, SystemZ::subreg_h64),
904 SystemZ::subreg_h64, &SystemZ::VR128BitRegClass);
906 RI.getMatchingSuperReg(RI.getSubReg(DestReg, SystemZ::subreg_l64),
907 SystemZ::subreg_h64, &SystemZ::VR128BitRegClass);
909 if (DestRegHi != SrcReg)
916 if (SystemZ::FP128BitRegClass.
contains(DestReg) &&
917 SystemZ::GR128BitRegClass.
contains(SrcReg)) {
918 MCRegister DestRegHi = RI.getSubReg(DestReg, SystemZ::subreg_h64);
919 MCRegister DestRegLo = RI.getSubReg(DestReg, SystemZ::subreg_l64);
920 MCRegister SrcRegHi = RI.getSubReg(SrcReg, SystemZ::subreg_h64);
921 MCRegister SrcRegLo = RI.getSubReg(SrcReg, SystemZ::subreg_l64);
933 if (DestReg == SystemZ::CC) {
935 SystemZ::GR32BitRegClass.contains(SrcReg) ? SystemZ::TMLH : SystemZ::TMHH;
942 if (SystemZ::GR128BitRegClass.
contains(DestReg) &&
943 SystemZ::VR128BitRegClass.
contains(SrcReg)) {
944 MCRegister DestH64 = RI.getSubReg(DestReg, SystemZ::subreg_h64);
945 MCRegister DestL64 = RI.getSubReg(DestReg, SystemZ::subreg_l64);
949 .
addReg(SystemZ::NoRegister)
954 .
addReg(SystemZ::NoRegister)
959 if (SystemZ::VR128BitRegClass.
contains(DestReg) &&
960 SystemZ::GR128BitRegClass.
contains(SrcReg)) {
962 .
addReg(RI.getSubReg(SrcReg, SystemZ::subreg_h64))
963 .
addReg(RI.getSubReg(SrcReg, SystemZ::subreg_l64));
969 if (SystemZ::GR64BitRegClass.
contains(DestReg, SrcReg))
970 Opcode = SystemZ::LGR;
971 else if (SystemZ::FP32BitRegClass.
contains(DestReg, SrcReg))
973 Opcode = STI.hasVector() ? SystemZ::LDR32 : SystemZ::LER;
974 else if (SystemZ::FP64BitRegClass.
contains(DestReg, SrcReg))
975 Opcode = SystemZ::LDR;
976 else if (SystemZ::FP128BitRegClass.
contains(DestReg, SrcReg))
977 Opcode = SystemZ::LXR;
978 else if (SystemZ::VR32BitRegClass.
contains(DestReg, SrcReg))
979 Opcode = SystemZ::VLR32;
980 else if (SystemZ::VR64BitRegClass.
contains(DestReg, SrcReg))
981 Opcode = SystemZ::VLR64;
982 else if (SystemZ::VR128BitRegClass.
contains(DestReg, SrcReg))
983 Opcode = SystemZ::VLR;
984 else if (SystemZ::AR32BitRegClass.
contains(DestReg, SrcReg))
985 Opcode = SystemZ::CPYA;
986 else if (SystemZ::GR64BitRegClass.
contains(DestReg) &&
987 SystemZ::FP64BitRegClass.
contains(SrcReg))
988 Opcode = SystemZ::LGDR;
989 else if (SystemZ::FP64BitRegClass.
contains(DestReg) &&
990 SystemZ::GR64BitRegClass.
contains(SrcReg))
991 Opcode = SystemZ::LDGR;
1008 unsigned LoadOpcode, StoreOpcode;
1023 unsigned LoadOpcode, StoreOpcode;
1033 return ((MCID.
TSFlags & Flag) &&
1034 isUInt<12>(
MI->getOperand(2).getImm()) &&
1035 MI->getOperand(3).getReg() == 0);
1041 LogicOp() =
default;
1042 LogicOp(
unsigned regSize,
unsigned immLSB,
unsigned immSize)
1043 :
RegSize(regSize), ImmLSB(immLSB), ImmSize(immSize) {}
1045 explicit operator bool()
const {
return RegSize; }
1048 unsigned ImmLSB = 0;
1049 unsigned ImmSize = 0;
1056 case SystemZ::NILMux:
return LogicOp(32, 0, 16);
1057 case SystemZ::NIHMux:
return LogicOp(32, 16, 16);
1058 case SystemZ::NILL64:
return LogicOp(64, 0, 16);
1059 case SystemZ::NILH64:
return LogicOp(64, 16, 16);
1060 case SystemZ::NIHL64:
return LogicOp(64, 32, 16);
1061 case SystemZ::NIHH64:
return LogicOp(64, 48, 16);
1062 case SystemZ::NIFMux:
return LogicOp(32, 0, 32);
1063 case SystemZ::NILF64:
return LogicOp(64, 0, 32);
1064 case SystemZ::NIHF64:
return LogicOp(64, 32, 32);
1065 default:
return LogicOp();
1073 if (CCDef !=
nullptr)
1095 unsigned Start,
End;
1098 if (
And.RegSize == 64) {
1099 NewOpcode = SystemZ::RISBG;
1101 if (STI.hasMiscellaneousExtensions())
1102 NewOpcode = SystemZ::RISBGN;
1104 NewOpcode = SystemZ::RISBMux;
1120 unsigned NumOps =
MI.getNumOperands();
1121 for (
unsigned I = 1;
I < NumOps; ++
I) {
1123 if (
Op.isReg() &&
Op.isKill())
1137 bool Invert)
const {
1143 Opc = *InverseOpcode;
1150 case SystemZ::WFADB:
1151 case SystemZ::WFASB:
1152 case SystemZ::WFAXB:
1153 case SystemZ::VFADB:
1154 case SystemZ::VFASB:
1155 case SystemZ::WFMDB:
1156 case SystemZ::WFMSB:
1157 case SystemZ::WFMXB:
1158 case SystemZ::VFMDB:
1159 case SystemZ::VFMSB:
1167std::optional<unsigned>
1171 case SystemZ::WFADB:
1172 return SystemZ::WFSDB;
1173 case SystemZ::WFASB:
1174 return SystemZ::WFSSB;
1175 case SystemZ::WFAXB:
1176 return SystemZ::WFSXB;
1177 case SystemZ::VFADB:
1178 return SystemZ::VFSDB;
1179 case SystemZ::VFASB:
1180 return SystemZ::VFSSB;
1182 case SystemZ::WFSDB:
1183 return SystemZ::WFADB;
1184 case SystemZ::WFSSB:
1185 return SystemZ::WFASB;
1186 case SystemZ::WFSXB:
1187 return SystemZ::WFAXB;
1188 case SystemZ::VFSDB:
1189 return SystemZ::VFADB;
1190 case SystemZ::VFSSB:
1191 return SystemZ::VFASB;
1193 return std::nullopt;
1205 unsigned Opcode =
MI.getOpcode();
1210 bool CCLiveAtMI =
true;
1215 CCLiveRange = &LIS->
getRegUnit(*CCUnits.begin());
1216 CCLiveAtMI = CCLiveRange->
liveAt(MISlot);
1219 if (Ops.
size() == 2 && Ops[0] == 0 && Ops[1] == 1) {
1220 if (!CCLiveAtMI && (Opcode == SystemZ::LA || Opcode == SystemZ::LAY) &&
1221 isInt<8>(
MI.getOperand(2).getImm()) && !
MI.getOperand(3).getReg()) {
1224 MI.getDebugLoc(),
get(SystemZ::AGSI))
1227 .
addImm(
MI.getOperand(2).getImm());
1237 if (Ops.
size() != 1)
1240 unsigned OpNum = Ops[0];
1244 "Invalid size combination");
1246 if ((Opcode == SystemZ::AHI || Opcode == SystemZ::AGHI) && OpNum == 0 &&
1247 isInt<8>(
MI.getOperand(2).getImm())) {
1249 Opcode = (Opcode == SystemZ::AHI ? SystemZ::ASI : SystemZ::AGSI);
1251 BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
get(Opcode))
1254 .
addImm(
MI.getOperand(2).getImm());
1260 if ((Opcode == SystemZ::ALFI && OpNum == 0 &&
1261 isInt<8>((int32_t)
MI.getOperand(2).getImm())) ||
1262 (Opcode == SystemZ::ALGFI && OpNum == 0 &&
1263 isInt<8>((int64_t)
MI.getOperand(2).getImm()))) {
1265 Opcode = (Opcode == SystemZ::ALFI ? SystemZ::ALSI : SystemZ::ALGSI);
1267 BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
get(Opcode))
1270 .
addImm((int8_t)
MI.getOperand(2).getImm());
1275 if ((Opcode == SystemZ::SLFI && OpNum == 0 &&
1276 isInt<8>((int32_t)-
MI.getOperand(2).getImm())) ||
1277 (Opcode == SystemZ::SLGFI && OpNum == 0 &&
1278 isInt<8>((int64_t)-
MI.getOperand(2).getImm()))) {
1280 Opcode = (Opcode == SystemZ::SLFI ? SystemZ::ALSI : SystemZ::ALGSI);
1282 BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
get(Opcode))
1285 .
addImm((int8_t)-
MI.getOperand(2).getImm());
1290 unsigned MemImmOpc = 0;
1292 case SystemZ::LHIMux:
1293 case SystemZ::LHI: MemImmOpc = SystemZ::MVHI;
break;
1294 case SystemZ::LGHI: MemImmOpc = SystemZ::MVGHI;
break;
1295 case SystemZ::CHIMux:
1296 case SystemZ::CHI: MemImmOpc = SystemZ::CHSI;
break;
1297 case SystemZ::CGHI: MemImmOpc = SystemZ::CGHSI;
break;
1298 case SystemZ::CLFIMux:
1300 if (isUInt<16>(
MI.getOperand(1).getImm()))
1301 MemImmOpc = SystemZ::CLFHSI;
1303 case SystemZ::CLGFI:
1304 if (isUInt<16>(
MI.getOperand(1).getImm()))
1305 MemImmOpc = SystemZ::CLGHSI;
1310 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1314 .
addImm(
MI.getOperand(1).getImm());
1316 if (Opcode == SystemZ::LGDR || Opcode == SystemZ::LDGR) {
1317 bool Op0IsGPR = (Opcode == SystemZ::LGDR);
1318 bool Op1IsGPR = (Opcode == SystemZ::LDGR);
1322 unsigned StoreOpcode = Op1IsGPR ? SystemZ::STG : SystemZ::STD;
1323 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1325 .
add(
MI.getOperand(1))
1333 unsigned LoadOpcode = Op0IsGPR ? SystemZ::LG : SystemZ::LD;
1334 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1336 .
add(
MI.getOperand(0))
1356 if (OpNum == 0 &&
MI.hasOneMemOperand()) {
1361 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1366 .
add(
MI.getOperand(1))
1372 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1374 .
add(
MI.getOperand(1))
1387 unsigned NumOps =
MI.getNumExplicitOperands();
1388 int MemOpcode = SystemZ::getMemOpcode(Opcode);
1389 if (MemOpcode == -1 ||
1390 (CCLiveAtMI && !
MI.definesRegister(SystemZ::CC,
nullptr) &&
1391 get(MemOpcode).hasImplicitDefOfPhysReg(SystemZ::CC)))
1402 if (RC == &SystemZ::VR32BitRegClass || RC == &SystemZ::VR64BitRegClass) {
1408 !(SystemZ::FP32BitRegClass.
contains(PhysReg) ||
1409 SystemZ::FP64BitRegClass.
contains(PhysReg) ||
1410 SystemZ::VF128BitRegClass.
contains(PhysReg)))
1415 bool FusedFPOp = (Opcode == SystemZ::WFMADB || Opcode == SystemZ::WFMASB ||
1416 Opcode == SystemZ::WFMSDB || Opcode == SystemZ::WFMSSB);
1420 if (OpNum == 0 || OpNum == 3 || DstReg != AccReg)
1425 bool NeedsCommute =
false;
1426 if ((
MI.getOpcode() == SystemZ::CR ||
MI.getOpcode() == SystemZ::CGR ||
1427 MI.getOpcode() == SystemZ::CLR ||
MI.getOpcode() == SystemZ::CLGR ||
1428 MI.getOpcode() == SystemZ::WFCDB ||
MI.getOpcode() == SystemZ::WFCSB ||
1429 MI.getOpcode() == SystemZ::WFKDB ||
MI.getOpcode() == SystemZ::WFKSB) &&
1431 NeedsCommute =
true;
1433 bool CCOperands =
false;
1434 if (
MI.getOpcode() == SystemZ::LOCRMux ||
MI.getOpcode() == SystemZ::LOCGR ||
1435 MI.getOpcode() == SystemZ::SELRMux ||
MI.getOpcode() == SystemZ::SELGR) {
1436 assert(
MI.getNumOperands() == 6 && NumOps == 5 &&
1437 "LOCR/SELR instruction operands corrupt?");
1452 Register SrcReg = (OpNum == 2 ?
MI.getOperand(1).getReg()
1453 : ((OpNum == 1 &&
MI.isCommutable())
1454 ?
MI.getOperand(2).getReg()
1456 if (DstPhys && !SystemZ::GRH32BitRegClass.
contains(DstPhys) && SrcReg &&
1458 NeedsCommute = (OpNum == 1);
1464 if ((OpNum == NumOps - 1) || NeedsCommute || FusedFPOp) {
1467 assert(AccessBytes != 0 &&
"Size of access should be known");
1468 assert(AccessBytes <=
Size &&
"Access outside the frame index");
1471 MI.getDebugLoc(),
get(MemOpcode));
1472 if (
MI.isCompare()) {
1473 assert(NumOps == 2 &&
"Expected 2 register operands for a compare.");
1474 MIB.
add(
MI.getOperand(NeedsCommute ? 1 : 0));
1476 else if (FusedFPOp) {
1477 MIB.
add(
MI.getOperand(0));
1478 MIB.
add(
MI.getOperand(3));
1479 MIB.
add(
MI.getOperand(OpNum == 1 ? 2 : 1));
1482 MIB.
add(
MI.getOperand(0));
1484 MIB.
add(
MI.getOperand(2));
1486 for (
unsigned I = 1;
I < OpNum; ++
I)
1487 MIB.
add(
MI.getOperand(
I));
1493 unsigned CCValid =
MI.getOperand(NumOps).getImm();
1494 unsigned CCMask =
MI.getOperand(NumOps + 1).getImm();
1496 MIB.
addImm(NeedsCommute ? CCMask ^ CCValid : CCMask);
1499 (!
MI.definesRegister(SystemZ::CC,
nullptr) ||
1500 MI.registerDefIsDead(SystemZ::CC,
nullptr))) {
1508 if (MO.isReg() && MO.getReg().isVirtual()) {
1510 if (
MRI.getRegClass(Reg) == &SystemZ::VR32BitRegClass)
1511 MRI.setRegClass(Reg, &SystemZ::FP32BitRegClass);
1512 else if (
MRI.getRegClass(Reg) == &SystemZ::VR64BitRegClass)
1513 MRI.setRegClass(Reg, &SystemZ::FP64BitRegClass);
1514 else if (
MRI.getRegClass(Reg) == &SystemZ::VR128BitRegClass)
1515 MRI.setRegClass(Reg, &SystemZ::VF128BitRegClass);
1540 unsigned LoadOpc = 0;
1541 unsigned RegMemOpcode = 0;
1543 RegMemOpcode =
MI.getOpcode() == SystemZ::WFADB ? SystemZ::ADB
1544 :
MI.getOpcode() == SystemZ::WFSDB ? SystemZ::SDB
1545 :
MI.getOpcode() == SystemZ::WFMDB ? SystemZ::MDB
1548 LoadOpc = SystemZ::VL64;
1549 FPRC = &SystemZ::FP64BitRegClass;
1551 RegMemOpcode =
MI.getOpcode() == SystemZ::WFASB ? SystemZ::AEB
1552 :
MI.getOpcode() == SystemZ::WFSSB ? SystemZ::SEB
1553 :
MI.getOpcode() == SystemZ::WFMSB ? SystemZ::MEEB
1556 LoadOpc = SystemZ::VL32;
1557 FPRC = &SystemZ::FP32BitRegClass;
1560 if (!RegMemOpcode || LoadMI.
getOpcode() != LoadOpc)
1564 if (
get(RegMemOpcode).hasImplicitDefOfPhysReg(SystemZ::CC)) {
1566 assert(LoadMI != InsertPt &&
"Assuming InsertPt not to be first in MBB.");
1569 if (MII->definesRegister(SystemZ::CC,
nullptr)) {
1570 if (!MII->registerDefIsDead(SystemZ::CC,
nullptr))
1583 if (Ops.
size() != 1 || FoldAsLoadDefReg !=
MI.getOperand(Ops[0]).getReg())
1589 if ((RegMemOpcode == SystemZ::SDB || RegMemOpcode == SystemZ::SEB) &&
1590 FoldAsLoadDefReg !=
RHS.getReg())
1597 BuildMI(*
MI.getParent(), InsertPt,
MI.getDebugLoc(),
get(RegMemOpcode), DstReg)
1603 MRI->setRegClass(DstReg, FPRC);
1611 switch (
MI.getOpcode()) {
1613 splitMove(
MI, SystemZ::LG);
1616 case SystemZ::ST128:
1617 splitMove(
MI, SystemZ::STG);
1621 splitMove(
MI, SystemZ::LD);
1625 splitMove(
MI, SystemZ::STD);
1628 case SystemZ::LBMux:
1629 expandRXYPseudo(
MI, SystemZ::LB, SystemZ::LBH);
1632 case SystemZ::LHMux:
1633 expandRXYPseudo(
MI, SystemZ::LH, SystemZ::LHH);
1636 case SystemZ::LLCRMux:
1637 expandZExtPseudo(
MI, SystemZ::LLCR, 8);
1640 case SystemZ::LLHRMux:
1641 expandZExtPseudo(
MI, SystemZ::LLHR, 16);
1644 case SystemZ::LLCMux:
1645 expandRXYPseudo(
MI, SystemZ::LLC, SystemZ::LLCH);
1648 case SystemZ::LLHMux:
1649 expandRXYPseudo(
MI, SystemZ::LLH, SystemZ::LLHH);
1653 expandRXYPseudo(
MI, SystemZ::L, SystemZ::LFH);
1656 case SystemZ::LOCMux:
1657 expandLOCPseudo(
MI, SystemZ::LOC, SystemZ::LOCFH);
1660 case SystemZ::LOCHIMux:
1661 expandLOCPseudo(
MI, SystemZ::LOCHI, SystemZ::LOCHHI);
1664 case SystemZ::STCMux:
1665 expandRXYPseudo(
MI, SystemZ::STC, SystemZ::STCH);
1668 case SystemZ::STHMux:
1669 expandRXYPseudo(
MI, SystemZ::STH, SystemZ::STHH);
1672 case SystemZ::STMux:
1673 expandRXYPseudo(
MI, SystemZ::ST, SystemZ::STFH);
1676 case SystemZ::STOCMux:
1677 expandLOCPseudo(
MI, SystemZ::STOC, SystemZ::STOCFH);
1680 case SystemZ::LHIMux:
1681 expandRIPseudo(
MI, SystemZ::LHI, SystemZ::IIHF,
true);
1684 case SystemZ::IIFMux:
1685 expandRIPseudo(
MI, SystemZ::IILF, SystemZ::IIHF,
false);
1688 case SystemZ::IILMux:
1689 expandRIPseudo(
MI, SystemZ::IILL, SystemZ::IIHL,
false);
1692 case SystemZ::IIHMux:
1693 expandRIPseudo(
MI, SystemZ::IILH, SystemZ::IIHH,
false);
1696 case SystemZ::NIFMux:
1697 expandRIPseudo(
MI, SystemZ::NILF, SystemZ::NIHF,
false);
1700 case SystemZ::NILMux:
1701 expandRIPseudo(
MI, SystemZ::NILL, SystemZ::NIHL,
false);
1704 case SystemZ::NIHMux:
1705 expandRIPseudo(
MI, SystemZ::NILH, SystemZ::NIHH,
false);
1708 case SystemZ::OIFMux:
1709 expandRIPseudo(
MI, SystemZ::OILF, SystemZ::OIHF,
false);
1712 case SystemZ::OILMux:
1713 expandRIPseudo(
MI, SystemZ::OILL, SystemZ::OIHL,
false);
1716 case SystemZ::OIHMux:
1717 expandRIPseudo(
MI, SystemZ::OILH, SystemZ::OIHH,
false);
1720 case SystemZ::XIFMux:
1721 expandRIPseudo(
MI, SystemZ::XILF, SystemZ::XIHF,
false);
1724 case SystemZ::TMLMux:
1725 expandRIPseudo(
MI, SystemZ::TMLL, SystemZ::TMHL,
false);
1728 case SystemZ::TMHMux:
1729 expandRIPseudo(
MI, SystemZ::TMLH, SystemZ::TMHH,
false);
1732 case SystemZ::AHIMux:
1733 expandRIPseudo(
MI, SystemZ::AHI, SystemZ::AIH,
false);
1736 case SystemZ::AHIMuxK:
1737 expandRIEPseudo(
MI, SystemZ::AHI, SystemZ::AHIK, SystemZ::AIH);
1740 case SystemZ::AFIMux:
1741 expandRIPseudo(
MI, SystemZ::AFI, SystemZ::AIH,
false);
1744 case SystemZ::CHIMux:
1745 expandRIPseudo(
MI, SystemZ::CHI, SystemZ::CIH,
false);
1748 case SystemZ::CFIMux:
1749 expandRIPseudo(
MI, SystemZ::CFI, SystemZ::CIH,
false);
1752 case SystemZ::CLFIMux:
1753 expandRIPseudo(
MI, SystemZ::CLFI, SystemZ::CLIH,
false);
1757 expandRXYPseudo(
MI, SystemZ::C, SystemZ::CHF);
1760 case SystemZ::CLMux:
1761 expandRXYPseudo(
MI, SystemZ::CL, SystemZ::CLHF);
1764 case SystemZ::RISBMux: {
1767 if (SrcIsHigh == DestIsHigh)
1768 MI.setDesc(
get(DestIsHigh ? SystemZ::RISBHH : SystemZ::RISBLL));
1770 MI.setDesc(
get(DestIsHigh ? SystemZ::RISBHL : SystemZ::RISBLH));
1771 MI.getOperand(5).setImm(
MI.getOperand(5).getImm() ^ 32);
1776 case SystemZ::ADJDYNALLOC:
1777 splitAdjDynAlloc(
MI);
1780 case TargetOpcode::LOAD_STACK_GUARD:
1781 expandLoadStackGuard(&
MI);
1790 if (
MI.isInlineAsm()) {
1792 const char *AsmStr =
MI.getOperand(0).getSymbolName();
1795 else if (
MI.getOpcode() == SystemZ::PATCHPOINT)
1797 else if (
MI.getOpcode() == SystemZ::STACKMAP)
1798 return MI.getOperand(1).getImm();
1799 else if (
MI.getOpcode() == SystemZ::FENTRY_CALL)
1801 if (
MI.getOpcode() == TargetOpcode::PATCHABLE_FUNCTION_ENTER)
1803 if (
MI.getOpcode() == TargetOpcode::PATCHABLE_RET)
1804 return 18 + (
MI.getOperand(0).getImm() == SystemZ::CondReturn ? 4 : 0);
1806 return MI.getDesc().getSize();
1811 switch (
MI.getOpcode()) {
1822 MI.getOperand(1).getImm(), &
MI.getOperand(2));
1825 case SystemZ::BRCTH:
1829 case SystemZ::BRCTG:
1836 MI.getOperand(2).getImm(), &
MI.getOperand(3));
1841 MI.getOperand(2).getImm(), &
MI.getOperand(3));
1846 MI.getOperand(2).getImm(), &
MI.getOperand(3));
1848 case SystemZ::CLGIJ:
1849 case SystemZ::CLGRJ:
1851 MI.getOperand(2).getImm(), &
MI.getOperand(3));
1853 case SystemZ::INLINEASM_BR:
1863 unsigned &LoadOpcode,
1864 unsigned &StoreOpcode)
const {
1865 if (RC == &SystemZ::GR32BitRegClass || RC == &SystemZ::ADDR32BitRegClass) {
1866 LoadOpcode = SystemZ::L;
1867 StoreOpcode = SystemZ::ST;
1868 }
else if (RC == &SystemZ::GRH32BitRegClass) {
1869 LoadOpcode = SystemZ::LFH;
1870 StoreOpcode = SystemZ::STFH;
1871 }
else if (RC == &SystemZ::GRX32BitRegClass) {
1872 LoadOpcode = SystemZ::LMux;
1873 StoreOpcode = SystemZ::STMux;
1874 }
else if (RC == &SystemZ::GR64BitRegClass ||
1875 RC == &SystemZ::ADDR64BitRegClass) {
1876 LoadOpcode = SystemZ::LG;
1877 StoreOpcode = SystemZ::STG;
1878 }
else if (RC == &SystemZ::GR128BitRegClass ||
1879 RC == &SystemZ::ADDR128BitRegClass) {
1880 LoadOpcode = SystemZ::L128;
1881 StoreOpcode = SystemZ::ST128;
1882 }
else if (RC == &SystemZ::FP32BitRegClass) {
1883 LoadOpcode = SystemZ::LE;
1884 StoreOpcode = SystemZ::STE;
1885 }
else if (RC == &SystemZ::FP64BitRegClass) {
1886 LoadOpcode = SystemZ::LD;
1887 StoreOpcode = SystemZ::STD;
1888 }
else if (RC == &SystemZ::FP128BitRegClass) {
1889 LoadOpcode = SystemZ::LX;
1890 StoreOpcode = SystemZ::STX;
1891 }
else if (RC == &SystemZ::VR32BitRegClass) {
1892 LoadOpcode = SystemZ::VL32;
1893 StoreOpcode = SystemZ::VST32;
1894 }
else if (RC == &SystemZ::VR64BitRegClass) {
1895 LoadOpcode = SystemZ::VL64;
1896 StoreOpcode = SystemZ::VST64;
1897 }
else if (RC == &SystemZ::VF128BitRegClass ||
1898 RC == &SystemZ::VR128BitRegClass) {
1899 LoadOpcode = SystemZ::VL;
1900 StoreOpcode = SystemZ::VST;
1910 if (isUInt<12>(
Offset) && isUInt<12>(Offset2)) {
1912 int Disp12Opcode = SystemZ::getDisp12Opcode(Opcode);
1913 if (Disp12Opcode >= 0)
1914 return Disp12Opcode;
1920 if (isInt<20>(
Offset) && isInt<20>(Offset2)) {
1922 int Disp20Opcode = SystemZ::getDisp20Opcode(Opcode);
1923 if (Disp20Opcode >= 0)
1924 return Disp20Opcode;
1931 if (
MI &&
MI->getOperand(0).isReg()) {
1936 return SystemZ::LEY;
1937 case SystemZ::VST32:
1938 return SystemZ::STEY;
1940 return SystemZ::LDY;
1941 case SystemZ::VST64:
1942 return SystemZ::STDY;
1954 return SystemZ::getDisp12Opcode(Opcode) >= 0;
1955 return SystemZ::getDisp20Opcode(Opcode) >= 0;
1960 case SystemZ::L:
return SystemZ::LT;
1961 case SystemZ::LY:
return SystemZ::LT;
1962 case SystemZ::LG:
return SystemZ::LTG;
1963 case SystemZ::LGF:
return SystemZ::LTGF;
1964 case SystemZ::LR:
return SystemZ::LTR;
1965 case SystemZ::LGFR:
return SystemZ::LTGFR;
1966 case SystemZ::LGR:
return SystemZ::LTGR;
1967 case SystemZ::LCDFR:
return SystemZ::LCDBR;
1968 case SystemZ::LPDFR:
return SystemZ::LPDBR;
1969 case SystemZ::LNDFR:
return SystemZ::LNDBR;
1970 case SystemZ::LCDFR_32:
return SystemZ::LCEBR;
1971 case SystemZ::LPDFR_32:
return SystemZ::LPEBR;
1972 case SystemZ::LNDFR_32:
return SystemZ::LNEBR;
1977 case SystemZ::RISBGN:
return SystemZ::RISBG;
1983 unsigned &Start,
unsigned &
End)
const {
1993 Start = 63 - (LSB +
Length - 1);
2001 assert(LSB > 0 &&
"Bottom bit must be set");
2002 assert(LSB +
Length < BitSize &&
"Top bit must be set");
2003 Start = 63 - (LSB - 1);
2017 if (!(
MI && isInt<8>(
MI->getOperand(1).getImm())))
2021 case SystemZ::CLGFI:
2022 if (!(
MI && isUInt<8>(
MI->getOperand(1).getImm())))
2027 if (!STI.hasMiscellaneousExtensions())
2029 if (!(
MI &&
MI->getOperand(3).getReg() == 0))
2037 return SystemZ::CRJ;
2039 return SystemZ::CGRJ;
2041 return SystemZ::CIJ;
2043 return SystemZ::CGIJ;
2045 return SystemZ::CLRJ;
2047 return SystemZ::CLGRJ;
2049 return SystemZ::CLIJ;
2050 case SystemZ::CLGFI:
2051 return SystemZ::CLGIJ;
2058 return SystemZ::CRBReturn;
2060 return SystemZ::CGRBReturn;
2062 return SystemZ::CIBReturn;
2064 return SystemZ::CGIBReturn;
2066 return SystemZ::CLRBReturn;
2068 return SystemZ::CLGRBReturn;
2070 return SystemZ::CLIBReturn;
2071 case SystemZ::CLGFI:
2072 return SystemZ::CLGIBReturn;
2079 return SystemZ::CRBCall;
2081 return SystemZ::CGRBCall;
2083 return SystemZ::CIBCall;
2085 return SystemZ::CGIBCall;
2087 return SystemZ::CLRBCall;
2089 return SystemZ::CLGRBCall;
2091 return SystemZ::CLIBCall;
2092 case SystemZ::CLGFI:
2093 return SystemZ::CLGIBCall;
2100 return SystemZ::CRT;
2102 return SystemZ::CGRT;
2104 return SystemZ::CIT;
2106 return SystemZ::CGIT;
2108 return SystemZ::CLRT;
2110 return SystemZ::CLGRT;
2112 return SystemZ::CLFIT;
2113 case SystemZ::CLGFI:
2114 return SystemZ::CLGIT;
2116 return SystemZ::CLT;
2118 return SystemZ::CLGT;
2129 MBBI->getOperand(1).isReg() && !
MBBI->mayLoad() &&
2130 "Not a compare reg/reg.");
2136 if (
MI.readsRegister(SystemZ::CC,
nullptr)) {
2137 unsigned Flags =
MI.getDesc().TSFlags;
2143 if (
MI.definesRegister(SystemZ::CC,
nullptr)) {
2157 unsigned Flags = CCUsers[
Idx]->getDesc().TSFlags;
2159 0 : CCUsers[
Idx]->getNumExplicitOperands() - 2);
2162 CCMaskMO.
setImm(NewCCMask);
2200 if (!STI.hasLoadAndTrap())
2205 return SystemZ::LAT;
2207 return SystemZ::LGAT;
2209 return SystemZ::LFHAT;
2211 return SystemZ::LLGFAT;
2213 return SystemZ::LLGTAT;
2222 unsigned Opcode = 0;
2223 if (isInt<16>(
Value))
2224 Opcode = SystemZ::LGHI;
2226 Opcode = SystemZ::LLILL;
2228 Opcode = SystemZ::LLILH;
2231 else if (isInt<32>(
Value))
2232 Opcode = SystemZ::LGFI;
2239 assert (
MRI.isSSA() &&
"Huge values only handled before reg-alloc .");
2240 Register Reg0 =
MRI.createVirtualRegister(&SystemZ::GR64BitRegClass);
2241 Register Reg1 =
MRI.createVirtualRegister(&SystemZ::GR64BitRegClass);
2252 for (
unsigned I = 0, E =
MI.getNumOperands();
I != E; ++
I) {
2263 ErrInfo =
"Addressing mode operands corrupt!";
2286 bool SameVal = (VALa && VALb && (VALa == VALb));
2290 if (PSVa && PSVb && (PSVa == PSVb))
2296 int LowOffset = OffsetA < OffsetB ? OffsetA : OffsetB;
2297 int HighOffset = OffsetA < OffsetB ? OffsetB : OffsetA;
2298 LocationSize LowWidth = (LowOffset == OffsetA) ? WidthA : WidthB;
2300 LowOffset + (int)LowWidth.
getValue() <= HighOffset)
2309 int64_t &ImmVal)
const {
2311 if (
MI.getOpcode() == SystemZ::VGBM && Reg ==
MI.getOperand(0).getReg()) {
2312 ImmVal =
MI.getOperand(1).getImm();
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
unsigned const TargetRegisterInfo * TRI
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
static bool isSimpleBD12Move(const MachineInstr *MI, unsigned Flag)
static void transferDeadCC(MachineInstr *OldMI, MachineInstr *NewMI)
static void transferMIFlag(MachineInstr *OldMI, MachineInstr *NewMI, MachineInstr::MIFlag Flag)
static int isSimpleMove(const MachineInstr &MI, int &FrameIndex, unsigned Flag)
static LogicOp interpretAndImmediate(unsigned Opcode)
static uint64_t allOnes(unsigned int Count)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
This class represents an Operation in the Expression.
SlotIndexes * getSlotIndexes() const
VNInfo::Allocator & getVNInfoAllocator()
LiveRange & getRegUnit(unsigned Unit)
Return the live range for register unit Unit.
SlotIndex ReplaceMachineInstrInMaps(MachineInstr &MI, MachineInstr &NewMI)
This class represents the liveness of a register, stack slot, etc.
bool liveAt(SlotIndex index) const
VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
A set of register units used to track register liveness.
bool available(MCPhysReg Reg) const
Returns true if no part of physical register Reg is live.
void addLiveOuts(const MachineBasicBlock &MBB)
Adds registers living out of block MBB.
void replaceKillInstruction(Register Reg, MachineInstr &OldMI, MachineInstr &NewMI)
replaceKillInstruction - Update register kill info by replacing a kill instruction with a new one.
TypeSize getValue() const
Describe properties that are true of each instruction in the target description file.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction.
ArrayRef< MCOperandInfo > operands() const
This holds information about one operand of a machine instruction, indicating the register class for ...
uint8_t OperandType
Information about the type of the operand.
int16_t RegClass
This specifies the register class enumeration of the operand if the operand is a register.
Wrapper class representing physical registers. Should be passed by value.
static MCRegister from(unsigned Val)
Check the provided unsigned value is a valid MCRegister.
void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
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 '...
bool isLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll()) const
Return true if the specified register is in the live in set.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
uint64_t getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
MachineInstr * CloneMachineInstr(const MachineInstr *Orig)
Create a new MachineInstr which is a copy of Orig, identical in all ways except the instruction has n...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Register getReg(unsigned Idx) const
Get the register for the operand index.
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 & addRegMask(const uint32_t *Mask) 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 & addMemOperand(MachineMemOperand *MMO) const
const MachineInstrBuilder & addDef(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register definition operand.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
bool getFlag(MIFlag Flag) const
Return whether an MI flag is set.
bool isSafeToMove(bool &SawStore) const
Return true if it is safe to move this instruction.
bool registerDefIsDead(Register Reg, const TargetRegisterInfo *TRI) const
Returns true if the register is dead in this machine instruction.
bool definesRegister(Register Reg, const TargetRegisterInfo *TRI) const
Return true if the MachineInstr fully defines the specified register.
void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
bool hasOneMemOperand() const
Return true if this instruction has exactly one MachineMemOperand.
iterator_range< mop_iterator > operands()
mmo_iterator memoperands_begin() const
Access to memory operands of the instruction.
void setFlag(MIFlag Flag)
Set a MI flag.
const MachineOperand & getOperand(unsigned i) const
MachineOperand * findRegisterDefOperand(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false)
Wrapper for findRegisterDefOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
bool addRegisterDead(Register Reg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI defined a register without a use.
A description of a memory reference used in the backend.
LocationSize getSize() const
Return the size in bytes of the memory reference.
const PseudoSourceValue * getPseudoValue() const
bool isAtomic() const
Returns true if this operation has an atomic ordering requirement of unordered or higher,...
const Value * getValue() const
Return the base address of the memory access.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
MachineOperand class - Representation of each machine instruction operand.
void setImm(int64_t immVal)
void setIsDead(bool Val=true)
void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
static MachineOperand CreateImm(int64_t Val)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
MI-level patchpoint operands.
uint32_t getNumPatchBytes() const
Return the number of patchable bytes the given patchpoint should emit.
Special value supplied for machine level alias analysis.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
SlotIndex - An opaque wrapper around machine indexes.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
SlotIndex getInstructionIndex(const MachineInstr &MI, bool IgnoreBundle=false) const
Returns the base index for the given instruction.
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.
A SystemZ-specific class detailing special use registers particular for calling conventions.
virtual int getStackPointerBias()=0
virtual int getCallFrameSize()=0
unsigned getLoadAndTrap(unsigned Opcode) const
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const override
unsigned getLoadAndTest(unsigned Opcode) const
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIdx, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool isPredicable(const MachineInstr &MI) const override
bool isStackSlotCopy(const MachineInstr &MI, int &DestFrameIndex, int &SrcFrameIndex) const override
MachineInstr * convertToThreeAddress(MachineInstr &MI, LiveVariables *LV, LiveIntervals *LIS) const override
unsigned getOpcodeForOffset(unsigned Opcode, int64_t Offset, const MachineInstr *MI=nullptr) const
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
bool getConstValDefinedInReg(const MachineInstr &MI, const Register Reg, int64_t &ImmVal) const override
bool isAssociativeAndCommutative(const MachineInstr &Inst, bool Invert) const override
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
MachineInstr * optimizeLoadInstr(MachineInstr &MI, const MachineRegisterInfo *MRI, Register &FoldAsLoadDefReg, MachineInstr *&DefMI) const override
SystemZInstrInfo(SystemZSubtarget &STI)
bool hasDisplacementPairInsn(unsigned Opcode) const
MachineInstr * commuteInstructionImpl(MachineInstr &MI, bool NewMI, unsigned CommuteOpIdx1, unsigned CommuteOpIdx2) const override
Commutes the operands in the given instruction by changing the operands order and/or changing the ins...
void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, Register DstReg, ArrayRef< MachineOperand > Cond, Register TrueReg, Register FalseReg) const override
std::optional< unsigned > getInverseOpcode(unsigned Opcode) const override
bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, BranchProbability Probability) const override
SystemZII::Branch getBranchInfo(const MachineInstr &MI) const
bool areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const override
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
unsigned getFusedCompare(unsigned Opcode, SystemZII::FusedCompareType Type, const MachineInstr *MI=nullptr) const
bool expandPostRAPseudo(MachineInstr &MBBI) const override
bool analyzeCompare(const MachineInstr &MI, Register &SrcReg, Register &SrcReg2, int64_t &Mask, int64_t &Value) const override
bool verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const override
void getLoadStoreOpcodes(const TargetRegisterClass *RC, unsigned &LoadOpcode, unsigned &StoreOpcode) const
bool isRxSBGMask(uint64_t Mask, unsigned BitSize, unsigned &Start, unsigned &End) const
bool foldImmediate(MachineInstr &UseMI, MachineInstr &DefMI, Register Reg, MachineRegisterInfo *MRI) const override
bool canInsertSelect(const MachineBasicBlock &, ArrayRef< MachineOperand > Cond, Register, Register, Register, int &, int &, int &) const override
bool prepareCompareSwapOperands(MachineBasicBlock::iterator MBBI) const
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, int FrameIndex, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
void loadImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned Reg, uint64_t Value) const
bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Pred) const override
SystemZCallingConventionRegisters * getSpecialRegisters() const
virtual MachineInstr * commuteInstructionImpl(MachineInstr &MI, bool NewMI, unsigned OpIdx1, unsigned OpIdx2) const
This method commutes the operands of the given machine instruction MI.
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Undef
Value of the register doesn't matter.
static unsigned getAccessSize(unsigned int Flags)
unsigned getFirstReg(unsigned Reg)
MachineBasicBlock * splitBlockBefore(MachineBasicBlock::iterator MI, MachineBasicBlock *MBB)
int getTargetMemOpcode(uint16_t Opcode)
const unsigned CCMASK_CMP_GT
const unsigned CCMASK_ANY
static bool isImmLL(uint64_t Val)
static bool isImmLH(uint64_t Val)
MachineBasicBlock * emitBlockAfter(MachineBasicBlock *MBB)
unsigned reverseCCMask(unsigned CCMask)
const unsigned CCMASK_CMP_EQ
const unsigned CCMASK_ICMP
MachineBasicBlock * splitBlockAfter(MachineBasicBlock::iterator MI, MachineBasicBlock *MBB)
const unsigned CCMASK_CMP_LT
const unsigned CCMASK_CMP_NE
bool isHighReg(unsigned int Reg)
const unsigned CCMASK_CMP_UO
Reg
All possible values of the reg field in the ModR/M byte.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset=0, bool mem=true)
addFrameReference - This function is used to add a reference to the base of an abstract object on the...
constexpr bool isShiftedMask_64(uint64_t Value)
Return true if the argument contains a non-empty sequence of ones with the remainder zero (64 bit ver...
constexpr size_t range_size(R &&Range)
Returns the size of the Range, i.e., the number of elements.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
unsigned getUndefRegState(bool B)
@ And
Bitwise or logical AND of integers.
unsigned getKillRegState(bool B)