34#define DEBUG_TYPE "instr-emitter"
46 unsigned N =
Node->getNumValues();
47 while (
N &&
Node->getValueType(
N - 1) == MVT::Glue)
49 if (
N &&
Node->getValueType(
N - 1) == MVT::Other)
62 unsigned &NumImpUses) {
63 unsigned N =
Node->getNumOperands();
64 while (
N &&
Node->getOperand(
N - 1).getValueType() == MVT::Glue)
68 if (
N &&
Node->getOperand(
N - 1).getValueType() == MVT::Other)
72 NumImpUses =
N - NumExpUses;
73 for (
unsigned I =
N;
I > NumExpUses; --
I) {
77 if (RN->getReg().isPhysical())
89 VRBaseMapType &VRBaseMap) {
95 bool isNew = VRBaseMap.insert(std::make_pair(
Op, SrcReg)).second;
97 assert(isNew &&
"Node emitted out of order - early");
103 bool MatchReg =
true;
105 MVT VT =
Op.getSimpleValueType();
110 VT == MVT::Untyped ? nullptr : TLI->getRegClassFor(VT,
Op->isDivergent());
112 for (SDNode *User :
Op->users()) {
119 }
else if (DestReg != SrcReg)
122 for (
unsigned i = 0, e =
User->getNumOperands(); i != e; ++i) {
123 if (
User->getOperand(i) !=
Op)
125 if (VT == MVT::Other || VT == MVT::Glue)
128 if (
User->isMachineOpcode()) {
129 const MCInstrDesc &
II = TII->get(
User->getMachineOpcode());
131 if (i +
II.getNumDefs() <
II.getNumOperands()) {
132 RC = TRI->getAllocatableClass(
133 TII->getRegClass(
II, i +
II.getNumDefs()));
139 TRI->getCommonSubClass(UseRC, RC);
154 SrcRC = TRI->getMinimalPhysRegClass(SrcReg);
158 DstRC = MRI->getRegClass(VRBase);
160 assert(TRI->isTypeLegalForClass(*UseRC, VT) &&
161 "Incompatible phys register def and uses!");
172 VRBase = MRI->createVirtualRegister(DstRC);
173 BuildMI(*MBB, InsertPos,
Op.getDebugLoc(), TII->get(TargetOpcode::COPY),
180 bool isNew = VRBaseMap.insert(std::make_pair(
Op, VRBase)).second;
182 assert(isNew &&
"Node emitted out of order - early");
185void InstrEmitter::CreateVirtualRegisters(
SDNode *Node,
188 bool IsClone,
bool IsCloned,
189 VRBaseMapType &VRBaseMap) {
190 assert(
Node->getMachineOpcode() != TargetOpcode::IMPLICIT_DEF &&
191 "IMPLICIT_DEF should have been handled as a special case elsewhere!");
194 bool HasVRegVariadicDefs = !MF->getTarget().usesPhysRegsForValues() &&
195 II.isVariadic() &&
II.variadicOpsAreDefs();
196 unsigned NumVRegs = HasVRegVariadicDefs ? NumResults :
II.getNumDefs();
197 if (
Node->getMachineOpcode() == TargetOpcode::STATEPOINT)
198 NumVRegs = NumResults;
199 for (
unsigned i = 0; i < NumVRegs; ++i) {
205 TRI->getAllocatableClass(TII->getRegClass(
II, i));
210 if (i < NumResults && TLI->isTypeLegal(
Node->getSimpleValueType(i))) {
212 Node->getSimpleValueType(i),
213 (
Node->isDivergent() || (RC && TRI->isDivergentRegClass(RC))));
215 VTRC = TRI->getCommonSubClass(RC, VTRC);
220 if (!
II.operands().empty() &&
II.operands()[i].isOptionalDef()) {
227 if (!VRBase && !IsClone && !IsCloned)
228 for (SDNode *User :
Node->users()) {
230 User->getOperand(2).getNode() == Node &&
231 User->getOperand(2).getResNo() == i) {
247 assert(RC &&
"Isn't a register operand!");
248 VRBase = MRI->createVirtualRegister(RC);
254 if (i < NumResults) {
258 bool isNew = VRBaseMap.insert(std::make_pair(
Op, VRBase)).second;
260 assert(isNew &&
"Node emitted out of order - early");
268 if (
Op.isMachineOpcode() &&
269 Op.getMachineOpcode() == TargetOpcode::IMPLICIT_DEF) {
274 Op.getSimpleValueType(),
Op.getNode()->isDivergent());
275 Register VReg = MRI->createVirtualRegister(RC);
276 BuildMI(*MBB, InsertPos,
Op.getDebugLoc(),
277 TII->get(TargetOpcode::IMPLICIT_DEF), VReg);
282 assert(
I != VRBaseMap.end() &&
"Node emitted out of order - late");
291 VRBaseMapType &VRBaseMap,
bool IsDebug) {
292 assert(
Op.getValueType() != MVT::Other &&
293 Op.getValueType() != MVT::Glue &&
294 "Chain and glue operands should occur at end of operand list!");
298 const MCInstrDesc &MCID = MIB->
getDesc();
300 MCID.
operands()[IIOpNum].isOptionalDef();
308 if (IIOpNum < II->getNumOperands())
309 OpRC = TII->getRegClass(*
II, IIOpNum);
315 if (
Op.isMachineOpcode() &&
316 Op.getMachineOpcode() == TargetOpcode::IMPLICIT_DEF)
320 = MRI->constrainRegClass(VReg, OpRC, MinNumRegs);
321 if (!ConstrainedRC) {
322 OpRC = TRI->getAllocatableClass(OpRC);
323 assert(OpRC &&
"Constraints cannot be fulfilled for allocation");
324 Register NewVReg = MRI->createVirtualRegister(OpRC);
326 TII->
get(TargetOpcode::COPY), NewVReg)
331 "Constraining an allocatable VReg produced an unallocatable class?");
344 VRBaseMapType &VRBaseMap,
bool IsDebug,
345 bool IsClone,
bool IsCloned) {
346 if (
Op.isMachineOpcode()) {
347 AddRegisterOperand(MIB,
Op, IIOpNum,
II, VRBaseMap, IsDebug);
349 if (
C->getAPIntValue().getSignificantBits() <= 64) {
353 ConstantInt::get(MF->getFunction().getContext(),
C->getAPIntValue()));
359 MVT OpVT =
Op.getSimpleValueType();
361 II ? TRI->getAllocatableClass(TII->getRegClass(*
II, IIOpNum)) :
nullptr;
363 TLI->isTypeLegal(OpVT)
364 ? TLI->getRegClassFor(OpVT,
365 Op.getNode()->isDivergent() ||
366 (IIRC && TRI->isDivergentRegClass(IIRC)))
369 if (OpRC && IIRC && OpRC != IIRC && VReg.
isVirtual()) {
370 Register NewVReg = MRI->createVirtualRegister(IIRC);
371 BuildMI(*MBB, InsertPos,
Op.getNode()->getDebugLoc(),
372 TII->get(TargetOpcode::COPY), NewVReg).
addReg(VReg);
378 bool Imp =
II && (IIOpNum >=
II->getNumOperands() && !
II->isVariadic());
384 TGA->getTargetFlags());
386 MIB.
addMBB(BBNode->getBasicBlock());
392 int Offset = CP->getOffset();
396 MachineConstantPool *MCP = MF->getConstantPool();
397 if (CP->isMachineConstantPoolEntry())
405 MIB.
addSym(SymNode->getMCSymbol());
409 BA->getTargetFlags());
411 MIB.
addTargetIndex(TI->getIndex(), TI->getOffset(), TI->getTargetFlags());
413 assert(
Op.getValueType() != MVT::Other &&
414 Op.getValueType() != MVT::Glue &&
415 "Chain and glue operands should occur at end of operand list!");
416 AddRegisterOperand(MIB,
Op, IIOpNum,
II, VRBaseMap, IsDebug);
428 RC = MRI->constrainRegClass(VReg, RC,
MinRCSize);
436 RC = TRI->getSubClassWithSubReg(TLI->getRegClassFor(VT, isDivergent), SubIdx);
437 assert(RC &&
"No legal register class for VT supports that SubIdx");
438 Register NewReg = MRI->createVirtualRegister(RC);
439 BuildMI(*MBB, InsertPos,
DL, TII->get(TargetOpcode::COPY), NewReg)
446void InstrEmitter::EmitSubregNode(
SDNode *Node, VRBaseMapType &VRBaseMap,
447 bool IsClone,
bool IsCloned) {
449 unsigned Opc =
Node->getMachineOpcode();
453 for (SDNode *User :
Node->users()) {
455 User->getOperand(2).getNode() == Node) {
464 if (
Opc == TargetOpcode::EXTRACT_SUBREG) {
468 unsigned SubIdx =
Node->getConstantOperandVal(1);
470 TLI->getRegClassFor(
Node->getSimpleValueType(0),
Node->isDivergent());
475 if (R &&
R->getReg().isPhysical()) {
479 Reg =
R ?
R->getReg() : getVR(
Node->getOperand(0), VRBaseMap);
486 TII->isCoalescableExtInstr(*
DefMI, SrcReg, DstReg, DefSubIdx) &&
487 SubIdx == DefSubIdx &&
488 TRC == MRI->getRegClass(SrcReg)) {
494 VRBase = MRI->createVirtualRegister(TRC);
496 TII->get(TargetOpcode::COPY), VRBase)
503 Reg = ConstrainForSubReg(
Reg, SubIdx,
504 Node->getOperand(0).getSimpleValueType(),
505 Node->isDivergent(),
Node->getDebugLoc());
508 VRBase = MRI->createVirtualRegister(TRC);
511 MachineInstrBuilder CopyMI =
513 TII->get(TargetOpcode::COPY), VRBase);
517 CopyMI.
addReg(TRI->getSubReg(
Reg, SubIdx));
519 }
else if (
Opc == TargetOpcode::INSERT_SUBREG ||
520 Opc == TargetOpcode::SUBREG_TO_REG) {
524 if (
Opc == TargetOpcode::INSERT_SUBREG) {
526 SubReg =
Node->getOperand(1);
527 SubIdx =
Node->getOperand(2)->getAsZExtVal();
529 SubReg =
Node->getOperand(0);
530 SubIdx =
Node->getOperand(1)->getAsZExtVal();
548 TLI->getRegClassFor(
Node->getSimpleValueType(0),
Node->isDivergent());
549 SRC = TRI->getSubClassWithSubReg(SRC, SubIdx);
550 assert(SRC &&
"No register class supports VT and SubIdx for INSERT_SUBREG");
552 if (VRBase == 0 || !SRC->
hasSubClassEq(MRI->getRegClass(VRBase)))
553 VRBase = MRI->createVirtualRegister(SRC);
556 MachineInstrBuilder MIB =
562 AddOperand(MIB,
Reg, 0,
nullptr, VRBaseMap,
false, IsClone,
566 AddOperand(MIB, SubReg, 0,
nullptr, VRBaseMap,
false, IsClone,
569 MBB->
insert(InsertPos, MIB);
571 llvm_unreachable(
"Node is not insert_subreg, extract_subreg, or subreg_to_reg");
574 bool isNew = VRBaseMap.insert(std::make_pair(
Op, VRBase)).second;
576 assert(isNew &&
"Node emitted out of order - early");
584InstrEmitter::EmitCopyToRegClassNode(
SDNode *Node,
585 VRBaseMapType &VRBaseMap) {
587 unsigned DstRCIdx =
Node->getConstantOperandVal(1);
589 TRI->getAllocatableClass(TRI->getRegClass(DstRCIdx));
590 Register NewVReg = MRI->createVirtualRegister(DstRC);
591 const MCInstrDesc &
II = TII->get(TargetOpcode::COPY);
592 MachineInstrBuilder MIB =
BuildMI(*MF,
Node->getDebugLoc(),
II, NewVReg);
593 AddOperand(MIB,
Node->getOperand(0), 1, &
II, VRBaseMap,
false,
596 MBB->insert(InsertPos, MIB);
598 bool isNew = VRBaseMap.insert(std::make_pair(
Op, NewVReg)).second;
600 assert(isNew &&
"Node emitted out of order - early");
605void InstrEmitter::EmitRegSequence(
SDNode *Node, VRBaseMapType &VRBaseMap,
606 bool IsClone,
bool IsCloned) {
607 unsigned DstRCIdx =
Node->getConstantOperandVal(0);
609 Register NewVReg = MRI->createVirtualRegister(TRI->getAllocatableClass(RC));
610 const MCInstrDesc &
II = TII->get(TargetOpcode::REG_SEQUENCE);
611 MachineInstrBuilder MIB =
BuildMI(*MF,
Node->getDebugLoc(),
II, NewVReg);
620 "REG_SEQUENCE must have an odd number of operands!");
621 for (
unsigned i = 1; i !=
NumOps; ++i) {
622 SDValue
Op =
Node->getOperand(i);
627 if (!R || !
R->getReg().isPhysical()) {
628 unsigned SubIdx =
Op->getAsZExtVal();
629 Register SubReg = getVR(
Node->getOperand(i - 1), VRBaseMap);
632 TRI->getMatchingSuperRegClass(RC, TRC, SubIdx);
633 if (SRC && SRC != RC) {
634 MRI->setRegClass(NewVReg, SRC);
639 AddOperand(MIB,
Op, i+1, &
II, VRBaseMap,
false,
643 MBB->insert(InsertPos, MIB);
645 bool isNew = VRBaseMap.insert(std::make_pair(
Op, NewVReg)).second;
647 assert(isNew &&
"Node emitted out of order - early");
655 ->isValidLocationForIntrinsic(SD->
getDebugLoc()) &&
656 "Expected inlined-at fields to agree");
661 "dbg_value with no location operands?");
667 if (EmitDebugInstrRefs)
682 const Value *V =
Op.getConst();
684 if (CI->getBitWidth() > 64)
686 if (CI->getBitWidth() == 1)
708 switch (
Op.getKind()) {
722 if (VRBaseMap.
count(V) == 0)
725 AddOperand(MIB, V, (*MIB).getNumOperands(), &DbgValDesc, VRBaseMap,
744 const MCInstrDesc &RefII = TII->get(TargetOpcode::DBG_INSTR_REF);
787 auto AddVRegOp = [&](
Register VReg) {
795 for (
unsigned OpIdx = 0; OpIdx < OpCount; ++OpIdx) {
807 if (!MRI->hasOneDef(VReg)) {
812 DefMI = &*MRI->def_instr_begin(VReg);
819 if (
I == VRBaseMap.
end())
823 VReg = getVR(
Op, VRBaseMap);
827 if (!MRI->hasOneDef(VReg)) {
832 DefMI = &*MRI->def_instr_begin(VReg);
846 if (
DefMI->isCopyLike() || TII->isCopyInstr(*
DefMI)) {
852 unsigned OperandIdx = 0;
853 for (
const auto &MO :
DefMI->operands()) {
854 if (MO.isReg() && MO.isDef() && MO.getReg() == VReg)
858 assert(OperandIdx < DefMI->getNumOperands());
861 unsigned InstrNum =
DefMI->getDebugInstrNum();
867 if (MOs.
size() != OpCount)
870 return BuildMI(*MF,
DL, RefII,
false, MOs, Var, Expr);
892 const MCInstrDesc &DbgValDesc = TII->get(TargetOpcode::DBG_VALUE_LIST);
910 "Non variadic dbg_value should have only one location op");
916 const Value *V = LocationOps[0].getConst();
941 "Expected inlined-at fields to agree");
954EmitMachineNode(
SDNode *
Node,
bool IsClone,
bool IsCloned,
955 VRBaseMapType &VRBaseMap) {
956 unsigned Opc =
Node->getMachineOpcode();
959 if (
Opc == TargetOpcode::EXTRACT_SUBREG ||
960 Opc == TargetOpcode::INSERT_SUBREG ||
961 Opc == TargetOpcode::SUBREG_TO_REG) {
962 EmitSubregNode(
Node, VRBaseMap, IsClone, IsCloned);
967 if (
Opc == TargetOpcode::COPY_TO_REGCLASS) {
968 EmitCopyToRegClassNode(
Node, VRBaseMap);
973 if (
Opc == TargetOpcode::REG_SEQUENCE) {
974 EmitRegSequence(Node, VRBaseMap, IsClone, IsCloned);
978 if (
Opc == TargetOpcode::IMPLICIT_DEF)
982 const MCInstrDesc &
II = TII->get(
Opc);
984 unsigned NumDefs =
II.getNumDefs();
988 if (
Opc == TargetOpcode::STACKMAP ||
Opc == TargetOpcode::PATCHPOINT) {
993 if (
Opc == TargetOpcode::PATCHPOINT) {
995 NumDefs = NumResults;
998 }
else if (
Opc == TargetOpcode::STATEPOINT) {
999 NumDefs = NumResults;
1002 unsigned NumImpUses = 0;
1003 unsigned NodeOperands =
1005 bool HasVRegVariadicDefs = !MF->getTarget().usesPhysRegsForValues() &&
1006 II.isVariadic() &&
II.variadicOpsAreDefs();
1007 bool HasPhysRegOuts = NumResults > NumDefs && !
II.implicit_defs().empty() &&
1008 !HasVRegVariadicDefs;
1010 unsigned NumMIOperands = NodeOperands + NumResults;
1011 if (
II.isVariadic())
1012 assert(NumMIOperands >=
II.getNumOperands() &&
1013 "Too few operands for a variadic node!");
1015 assert(NumMIOperands >=
II.getNumOperands() &&
1017 II.getNumOperands() +
II.implicit_defs().size() + NumImpUses &&
1018 "#operands for dag node doesn't match .td file!");
1022 MachineInstrBuilder MIB =
BuildMI(*MF,
Node->getDebugLoc(),
II);
1026 const SDNodeFlags
Flags =
Node->getFlags();
1027 if (
Flags.hasUnpredictable())
1033 CreateVirtualRegisters(Node, MIB,
II, IsClone, IsCloned, VRBaseMap);
1035 if (
Flags.hasNoSignedZeros())
1038 if (
Flags.hasAllowReciprocal())
1041 if (
Flags.hasNoNaNs())
1044 if (
Flags.hasNoInfs())
1047 if (
Flags.hasAllowContract())
1050 if (
Flags.hasApproximateFuncs())
1053 if (
Flags.hasAllowReassociation())
1056 if (
Flags.hasNoUnsignedWrap())
1059 if (
Flags.hasNoSignedWrap())
1062 if (
Flags.hasExact())
1065 if (
Flags.hasNoFPExcept())
1068 if (
Flags.hasDisjoint())
1071 if (
Flags.hasSameSign())
1074 if (
Flags.hasNoConvergent())
1080 bool HasOptPRefs = NumDefs > NumResults;
1081 assert((!HasOptPRefs || !HasPhysRegOuts) &&
1082 "Unable to cope with optional defs and phys regs defs!");
1083 unsigned NumSkip = HasOptPRefs ? NumDefs - NumResults : 0;
1084 for (
unsigned i = NumSkip; i != NodeOperands; ++i)
1085 AddOperand(MIB,
Node->getOperand(i), i-NumSkip+NumDefs, &
II,
1086 VRBaseMap,
false, IsClone, IsCloned);
1090 for (
unsigned i = 0; ScratchRegs[i]; ++i)
1104 MBB->insert(InsertPos, MIB);
1124 if (HasPhysRegOuts) {
1125 for (
unsigned i = NumDefs; i < NumResults; ++i) {
1127 if (!
Node->hasAnyUseOfValue(i))
1131 EmitCopyFromReg(SDValue(Node, i), IsClone,
Reg, VRBaseMap);
1136 if (
Node->getValueType(
Node->getNumValues()-1) == MVT::Glue) {
1137 for (SDNode *
F =
Node->getGluedUser();
F;
F =
F->getGluedUser()) {
1148 const MCInstrDesc &MCID = TII->get(
F->getMachineOpcode());
1152 for (
const SDValue &
Op :
F->op_values())
1162 if (
II.isCall() && MF->getFunction().hasFnAttribute(Attribute::StrictFP)) {
1168 if (!UsedRegs.
empty() || !
II.implicit_defs().empty() ||
II.hasOptionalDef())
1173 if (
Opc == TargetOpcode::STATEPOINT && NumDefs > 0) {
1174 assert(!HasPhysRegOuts &&
"STATEPOINT mishandled");
1175 MachineInstr *
MI = MIB;
1177 int First = StatepointOpers(
MI).getFirstGCPtrIdx();
1178 assert(
First > 0 &&
"Statepoint has Defs but no GC ptr list");
1180 while (Def < NumDefs) {
1181 if (
MI->getOperand(Use).isReg())
1182 MI->tieOperands(Def++, Use);
1187 unsigned Op =
Node->getNumOperands();
1188 if (
Op != 0 &&
Node->getOperand(
Op - 1)->getOpcode() ==
1189 ~(
unsigned)TargetOpcode::CONVERGENCECTRL_GLUE) {
1190 Register VReg = getVR(
Node->getOperand(
Op - 1)->getOperand(0), VRBaseMap);
1199 MI->setDeactivationSymbol(
1200 *MF,
const_cast<GlobalValue *
>(
1207 if (
II.hasPostISelHook())
1208 TLI->AdjustInstrPostInstrSelection(*MIB, Node);
1214EmitSpecialNode(
SDNode *Node,
bool IsClone,
bool IsCloned,
1215 VRBaseMapType &VRBaseMap) {
1216 switch (
Node->getOpcode()) {
1221 llvm_unreachable(
"This target-independent node should have been selected!");
1229 SDValue SrcVal =
Node->getOperand(2);
1235 TII->get(TargetOpcode::IMPLICIT_DEF), DestReg);
1240 SrcReg =
R->getReg();
1242 SrcReg = getVR(SrcVal, VRBaseMap);
1244 if (SrcReg == DestReg)
1247 BuildMI(*MBB, InsertPos,
Node->getDebugLoc(), TII->get(TargetOpcode::COPY),
1253 EmitCopyFromReg(SDValue(Node, 0), IsClone, SrcReg, VRBaseMap);
1259 ? TargetOpcode::EH_LABEL
1260 : TargetOpcode::ANNOTATION_LABEL;
1270 ? TargetOpcode::LIFETIME_START
1271 : TargetOpcode::LIFETIME_END;
1273 BuildMI(*MBB, InsertPos,
Node->getDebugLoc(), TII->get(TarOp))
1279 unsigned TarOp = TargetOpcode::PSEUDO_PROBE;
1284 BuildMI(*MBB, InsertPos,
Node->getDebugLoc(), TII->get(TarOp))
1295 if (
Node->getOperand(
NumOps-1).getValueType() == MVT::Glue)
1300 ? TargetOpcode::INLINEASM_BR
1301 : TargetOpcode::INLINEASM;
1302 MachineInstrBuilder MIB =
1303 BuildMI(*MF,
Node->getDebugLoc(), TII->get(TgtOpc));
1318 SmallVector<unsigned, 8> GroupIdx;
1326 if (
Node->getValueType(
Node->getNumValues() - 1) == MVT::Glue) {
1327 for (SDNode *
G =
Node->getGluedUser();
G;
G =
G->getGluedUser()) {
1338 unsigned Flags =
Node->getConstantOperandVal(i);
1339 const InlineAsm::Flag
F(Flags);
1340 const unsigned NumVals =
F.getNumOperandRegisters();
1346 switch (
F.getKind()) {
1348 for (
unsigned j = 0;
j != NumVals; ++
j, ++i) {
1358 for (
unsigned j = 0;
j != NumVals; ++
j, ++i) {
1362 return TRI->regsOverlap(U,
Reg);
1375 for (
unsigned j = 0;
j != NumVals; ++
j, ++i)
1376 AddOperand(MIB,
Node->getOperand(i), 0,
nullptr, VRBaseMap,
1377 false, IsClone, IsCloned);
1380 if (
F.isRegUseKind()) {
1382 if (
F.isUseOperandTiedToDef(DefGroup)) {
1383 unsigned DefIdx = GroupIdx[DefGroup] + 1;
1384 unsigned UseIdx = GroupIdx.
back() + 1;
1385 for (
unsigned j = 0;
j != NumVals; ++
j)
1391 for (
unsigned j = 0;
j != NumVals; ++
j, ++i) {
1392 SDValue
Op =
Node->getOperand(i);
1393 AddOperand(MIB,
Op, 0,
nullptr, VRBaseMap,
1394 false, IsClone, IsCloned);
1399 MF->getSubtarget().classifyGlobalFunctionReference(
1415 MachineOperand *MO =
1417 assert(MO &&
"No def operand for clobbered register?");
1429 if (MF->getFunction().hasFnAttribute(Attribute::StrictFP)) {
1435 MBB->
insert(InsertPos, MIB);
1445 : MF(mbb->
getParent()), MRI(&MF->getRegInfo()),
1446 TII(MF->getSubtarget().getInstrInfo()),
1447 TRI(MF->getSubtarget().getRegisterInfo()),
1448 TLI(MF->getSubtarget().getTargetLowering()), MBB(mbb),
1449 InsertPos(insertpos) {
1450 EmitDebugInstrRefs = mbb->
getParent()->useDebugInstrRef();
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static const Function * getParent(const Value *V)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains constants used for implementing Dwarf debug support.
MachineOperand GetMOForConstDbgOp(const SDDbgOperand &Op)
const unsigned MinRCSize
MinRCSize - Smallest register class we allow when constraining virtual registers.
static unsigned countOperands(SDNode *Node, unsigned NumExpUses, unsigned &NumImpUses)
countOperands - The inputs to target nodes have any actual inputs first, followed by an optional chai...
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Promote Memory to Register
uint64_t IntrinsicInst * II
This file describes how to lower LLVM code to machine code.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
ConstantFP - Floating Point Values [float, double].
This is the shared class of boolean and integer constants.
static LLVM_ABI DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
LLVM_ABI std::pair< DIExpression *, const ConstantInt * > constantFold(const ConstantInt *CI)
Try to shorten an expression with an initial constant operand.
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static LLVM_ABI const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
Base class for variables.
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
iterator find(const_arg_type_t< KeyT > Val)
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
MachineInstr * EmitDbgValue(SDDbgValue *SD, VRBaseMapType &VRBaseMap)
EmitDbgValue - Generate machine instruction for a dbg_value node.
MachineInstr * EmitDbgInstrRef(SDDbgValue *SD, VRBaseMapType &VRBaseMap)
Emit a dbg_value as a DBG_INSTR_REF.
SmallDenseMap< SDValue, Register, 16 > VRBaseMapType
MachineInstr * EmitDbgLabel(SDDbgLabel *SD)
Generate machine instruction for a dbg_label node.
MachineInstr * EmitDbgNoLocation(SDDbgValue *SD)
Emit a DBG_VALUE $noreg, indicating a variable has no location.
static unsigned CountResults(SDNode *Node)
CountResults - The results of target nodes have register or immediate operands first,...
MachineInstr * EmitDbgValueList(SDDbgValue *SD, VRBaseMapType &VRBaseMap)
Emit a DBG_VALUE_LIST from the operands to SDDbgValue.
InstrEmitter(const TargetMachine &TM, MachineBasicBlock *mbb, MachineBasicBlock::iterator insertpos)
InstrEmitter - Construct an InstrEmitter and set it to start inserting at the given position in the g...
void AddDbgValueLocationOps(MachineInstrBuilder &MIB, const MCInstrDesc &DbgValDesc, ArrayRef< SDDbgOperand > Locations, VRBaseMapType &VRBaseMap)
MachineInstr * EmitDbgValueFromSingleOp(SDDbgValue *SD, VRBaseMapType &VRBaseMap)
Emit a DBG_VALUE from the operands to SDDbgValue.
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
ArrayRef< MCPhysReg > implicit_uses() const
Return a list of registers that are potentially read by any instance of this machine instruction.
bool isAllocatable() const
isAllocatable - Return true if this register class may be used to create virtual registers.
bool expensiveOrImpossibleToCopy() const
bool hasSubClassEq(const MCRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
const MachineInstrBuilder & addTargetIndex(unsigned Idx, int64_t Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & setMemRefs(ArrayRef< MachineMemOperand * > MMOs) const
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned TargetFlags=0) const
const MachineInstrBuilder & addCImm(const ConstantInt *Val) const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addBlockAddress(const BlockAddress *BA, int64_t Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addMetadata(const MDNode *MD) const
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addConstantPoolIndex(unsigned Idx, int Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & addRegMask(const uint32_t *Mask) const
const MachineInstrBuilder & addGlobalAddress(const GlobalValue *GV, int64_t Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & addFPImm(const ConstantFP *Val) const
const MachineInstrBuilder & addJumpTableIndex(unsigned Idx, unsigned TargetFlags=0) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
Representation of each machine instruction.
LLVM_ABI void setCFIType(MachineFunction &MF, uint32_t Type)
Set the CFI type for the instruction.
bool readsRegister(Register Reg, const TargetRegisterInfo *TRI) const
Return true if the MachineInstr reads the specified register.
unsigned getNumOperands() const
Retuns the total number of operands.
LLVM_ABI void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
LLVM_ABI void insert(mop_iterator InsertBefore, ArrayRef< MachineOperand > Ops)
Inserts Ops BEFORE It. Can untie/retie tied operands.
LLVM_ABI void tieOperands(unsigned DefIdx, unsigned UseIdx)
Add a tie between the register operands at DefIdx and UseIdx.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_ABI void setPhysRegsDeadExcept(ArrayRef< Register > UsedRegs, const TargetRegisterInfo &TRI)
Mark every physreg used by this instruction as dead except those in the UsedRegs list.
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...
MachineOperand class - Representation of each machine instruction operand.
static MachineOperand CreateFPImm(const ConstantFP *CFP)
static MachineOperand CreateCImm(const ConstantInt *CI)
void setIsEarlyClobber(bool Val=true)
static MachineOperand CreateImm(int64_t Val)
static MachineOperand CreateDbgInstrRef(unsigned InstrIdx, unsigned OpIdx)
static MachineOperand CreateGA(const GlobalValue *GV, int64_t Offset, unsigned TargetFlags=0)
void setTargetFlags(unsigned F)
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Holds the information from a dbg_label node through SDISel.
MDNode * getLabel() const
Returns the MDNode pointer for the label.
const DebugLoc & getDebugLoc() const
Returns the DebugLoc.
Holds the information for a single machine location through SDISel; either an SDNode,...
const GlobalValue * getGlobal() const
Returns the GlobalValue whose address describes the variable.
Register getVReg() const
Returns the Virtual Register for a VReg.
unsigned getResNo() const
Returns the ResNo for a register ref.
static SDDbgOperand fromConst(const Value *Const)
SDNode * getSDNode() const
Returns the SDNode* for a register ref.
@ VREG
Value is a virtual register.
@ FRAMEIX
Value is contents of a stack location.
@ SDNODE
Value is the result of an expression.
@ CONST
Value is a constant.
@ GLOBALADDR
Value is the address of a global.
Holds the information from a dbg_value node through SDISel.
const DebugLoc & getDebugLoc() const
Returns the DebugLoc.
DIVariable * getVariable() const
Returns the DIVariable pointer for the variable.
bool isInvalidated() const
ArrayRef< SDDbgOperand > getLocationOps() const
DIExpression * getExpression() const
Returns the DIExpression pointer for the expression.
bool isIndirect() const
Returns whether this is an indirect value.
void setIsEmitted()
setIsEmitted / isEmitted - Getter/Setter for flag indicating that this SDDbgValue has been emitted to...
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isMachineOpcode() const
unsigned getMachineOpcode() const
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
static LLVM_ABI unsigned getNextMetaArgIdx(const MachineInstr *MI, unsigned CurIdx)
Get index of next meta operand.
Primary interface to the complete machine description for the target machine.
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ANNOTATION_LABEL
ANNOTATION_LABEL - Represents a mid basic block label used by annotations.
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ INLINEASM_BR
INLINEASM_BR - Branching version of inline asm. Used by asm-goto.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ User
could "use" a pointer
NodeAddr< DefNode * > Def
NodeAddr< UseNode * > Use
NodeAddr< NodeBase * > Node
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.
@ EarlyClobber
Register definition happens before uses.
@ Define
Register definition.
constexpr RegState getImplRegState(bool B)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
constexpr RegState getDeadRegState(bool B)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
constexpr RegState getDefRegState(bool B)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
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 >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
constexpr RegState getDebugRegState(bool B)
MCRegisterClass TargetRegisterClass
TODO: Might pack better if we changed this to a Struct of Arrays, since MachineOperand is width 32,...