LLVM 24.0.0git
InstrEmitter.cpp
Go to the documentation of this file.
1//==--- InstrEmitter.cpp - Emit MachineInstrs for the SelectionDAG class ---==//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the Emit routines for the SelectionDAG class, which creates
10// MachineInstrs based on the decisions of the SelectionDAG instruction
11// selection.
12//
13//===----------------------------------------------------------------------===//
14
15#include "InstrEmitter.h"
16#include "SDNodeDbgValue.h"
29#include "llvm/IR/PseudoProbe.h"
32using namespace llvm;
33
34#define DEBUG_TYPE "instr-emitter"
35
36/// MinRCSize - Smallest register class we allow when constraining virtual
37/// registers. If satisfying all register class constraints would require
38/// using a smaller register class, emit a COPY to a new virtual register
39/// instead.
40const unsigned MinRCSize = 4;
41
42/// CountResults - The results of target nodes have register or immediate
43/// operands first, then an optional chain, and optional glue operands (which do
44/// not go into the resulting MachineInstr).
46 unsigned N = Node->getNumValues();
47 while (N && Node->getValueType(N - 1) == MVT::Glue)
48 --N;
49 if (N && Node->getValueType(N - 1) == MVT::Other)
50 --N; // Skip over chain result.
51 return N;
52}
53
54/// countOperands - The inputs to target nodes have any actual inputs first,
55/// followed by an optional chain operand, then an optional glue operand.
56/// Compute the number of actual operands that will go into the resulting
57/// MachineInstr.
58///
59/// Also count physreg RegisterSDNode and RegisterMaskSDNode operands preceding
60/// the chain and glue. These operands may be implicit on the machine instr.
61static unsigned countOperands(SDNode *Node, unsigned NumExpUses,
62 unsigned &NumImpUses) {
63 unsigned N = Node->getNumOperands();
64 while (N && Node->getOperand(N - 1).getValueType() == MVT::Glue)
65 --N;
66 if (N && Node->getOperand(N - 1).getOpcode() == ISD::DEACTIVATION_SYMBOL)
67 --N; // Ignore deactivation symbol if it exists.
68 if (N && Node->getOperand(N - 1).getValueType() == MVT::Other)
69 --N; // Ignore chain if it exists.
70
71 // Count RegisterSDNode and RegisterMaskSDNode operands for NumImpUses.
72 NumImpUses = N - NumExpUses;
73 for (unsigned I = N; I > NumExpUses; --I) {
74 if (isa<RegisterMaskSDNode>(Node->getOperand(I - 1)))
75 continue;
76 if (RegisterSDNode *RN = dyn_cast<RegisterSDNode>(Node->getOperand(I - 1)))
77 if (RN->getReg().isPhysical())
78 continue;
79 NumImpUses = N - I;
80 break;
81 }
82
83 return N;
84}
85
86/// EmitCopyFromReg - Generate machine code for an CopyFromReg node or an
87/// implicit physical register output.
88void InstrEmitter::EmitCopyFromReg(SDValue Op, bool IsClone, Register SrcReg,
89 VRBaseMapType &VRBaseMap) {
90 Register VRBase;
91 if (SrcReg.isVirtual()) {
92 // Just use the input register directly!
93 if (IsClone)
94 VRBaseMap.erase(Op);
95 bool isNew = VRBaseMap.insert(std::make_pair(Op, SrcReg)).second;
96 (void)isNew; // Silence compiler warning.
97 assert(isNew && "Node emitted out of order - early");
98 return;
99 }
100
101 // If the node is only used by a CopyToReg and the dest reg is a vreg, use
102 // the CopyToReg'd destination register instead of creating a new vreg.
103 bool MatchReg = true;
104
105 MVT VT = Op.getSimpleValueType();
106
107 // FIXME: The Untyped check is a workaround for SystemZ i128 inline assembly
108 // using i128, when it should probably be using v2i64.
109 const TargetRegisterClass *UseRC =
110 VT == MVT::Untyped ? nullptr : TLI->getRegClassFor(VT, Op->isDivergent());
111
112 for (SDNode *User : Op->users()) {
113 bool Match = true;
114 if (User->getOpcode() == ISD::CopyToReg && User->getOperand(2) == Op) {
115 Register DestReg = cast<RegisterSDNode>(User->getOperand(1))->getReg();
116 if (DestReg.isVirtual()) {
117 VRBase = DestReg;
118 Match = false;
119 } else if (DestReg != SrcReg)
120 Match = false;
121 } else {
122 for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i) {
123 if (User->getOperand(i) != Op)
124 continue;
125 if (VT == MVT::Other || VT == MVT::Glue)
126 continue;
127 Match = false;
128 if (User->isMachineOpcode()) {
129 const MCInstrDesc &II = TII->get(User->getMachineOpcode());
130 const TargetRegisterClass *RC = nullptr;
131 if (i + II.getNumDefs() < II.getNumOperands()) {
132 RC = TRI->getAllocatableClass(
133 TII->getRegClass(II, i + II.getNumDefs()));
134 }
135 if (!UseRC)
136 UseRC = RC;
137 else if (RC) {
138 const TargetRegisterClass *ComRC =
139 TRI->getCommonSubClass(UseRC, RC);
140 // If multiple uses expect disjoint register classes, we emit
141 // copies in AddRegisterOperand.
142 if (ComRC)
143 UseRC = ComRC;
144 }
145 }
146 }
147 }
148 MatchReg &= Match;
149 if (VRBase)
150 break;
151 }
152
153 const TargetRegisterClass *SrcRC = nullptr, *DstRC = nullptr;
154 SrcRC = TRI->getMinimalPhysRegClass(SrcReg);
155
156 // Figure out the register class to create for the destreg.
157 if (VRBase) {
158 DstRC = MRI->getRegClass(VRBase);
159 } else if (UseRC) {
160 assert(TRI->isTypeLegalForClass(*UseRC, VT) &&
161 "Incompatible phys register def and uses!");
162 DstRC = UseRC;
163 } else
164 DstRC = SrcRC;
165
166 // If all uses are reading from the src physical register and copying the
167 // register is either impossible or very expensive, then don't create a copy.
168 if (MatchReg && SrcRC->expensiveOrImpossibleToCopy()) {
169 VRBase = SrcReg;
170 } else {
171 // Create the reg, emit the copy.
172 VRBase = MRI->createVirtualRegister(DstRC);
173 BuildMI(*MBB, InsertPos, Op.getDebugLoc(), TII->get(TargetOpcode::COPY),
174 VRBase)
175 .addReg(SrcReg);
176 }
177
178 if (IsClone)
179 VRBaseMap.erase(Op);
180 bool isNew = VRBaseMap.insert(std::make_pair(Op, VRBase)).second;
181 (void)isNew; // Silence compiler warning.
182 assert(isNew && "Node emitted out of order - early");
183}
184
185void InstrEmitter::CreateVirtualRegisters(SDNode *Node,
187 const MCInstrDesc &II,
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!");
192
193 unsigned NumResults = CountResults(Node);
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) {
200 // If the specific node value is only used by a CopyToReg and the dest reg
201 // is a vreg in the same register class, use the CopyToReg'd destination
202 // register instead of creating a new vreg.
203 Register VRBase;
204 const TargetRegisterClass *RC =
205 TRI->getAllocatableClass(TII->getRegClass(II, i));
206 // Always let the value type influence the used register class. The
207 // constraints on the instruction may be too lax to represent the value
208 // type correctly. For example, a 64-bit float (X86::FR64) can't live in
209 // the 32-bit float super-class (X86::FR32).
210 if (i < NumResults && TLI->isTypeLegal(Node->getSimpleValueType(i))) {
211 const TargetRegisterClass *VTRC = TLI->getRegClassFor(
212 Node->getSimpleValueType(i),
213 (Node->isDivergent() || (RC && TRI->isDivergentRegClass(RC))));
214 if (RC)
215 VTRC = TRI->getCommonSubClass(RC, VTRC);
216 if (VTRC)
217 RC = VTRC;
218 }
219
220 if (!II.operands().empty() && II.operands()[i].isOptionalDef()) {
221 // Optional def must be a physical register.
222 VRBase = cast<RegisterSDNode>(Node->getOperand(i-NumResults))->getReg();
223 assert(VRBase.isPhysical());
224 MIB.addReg(VRBase, RegState::Define);
225 }
226
227 if (!VRBase && !IsClone && !IsCloned)
228 for (SDNode *User : Node->users()) {
229 if (User->getOpcode() == ISD::CopyToReg &&
230 User->getOperand(2).getNode() == Node &&
231 User->getOperand(2).getResNo() == i) {
232 Register Reg = cast<RegisterSDNode>(User->getOperand(1))->getReg();
233 if (Reg.isVirtual()) {
234 const TargetRegisterClass *RegRC = MRI->getRegClass(Reg);
235 if (RegRC == RC) {
236 VRBase = Reg;
237 MIB.addReg(VRBase, RegState::Define);
238 break;
239 }
240 }
241 }
242 }
243
244 // Create the result registers for this node and add the result regs to
245 // the machine instruction.
246 if (!VRBase) {
247 assert(RC && "Isn't a register operand!");
248 VRBase = MRI->createVirtualRegister(RC);
249 MIB.addReg(VRBase, RegState::Define);
250 }
251
252 // If this def corresponds to a result of the SDNode insert the VRBase into
253 // the lookup map.
254 if (i < NumResults) {
255 SDValue Op(Node, i);
256 if (IsClone)
257 VRBaseMap.erase(Op);
258 bool isNew = VRBaseMap.insert(std::make_pair(Op, VRBase)).second;
259 (void)isNew; // Silence compiler warning.
260 assert(isNew && "Node emitted out of order - early");
261 }
262 }
263}
264
265/// getVR - Return the virtual register corresponding to the specified result
266/// of the specified node.
267Register InstrEmitter::getVR(SDValue Op, VRBaseMapType &VRBaseMap) {
268 if (Op.isMachineOpcode() &&
269 Op.getMachineOpcode() == TargetOpcode::IMPLICIT_DEF) {
270 // Add an IMPLICIT_DEF instruction before every use.
271 // IMPLICIT_DEF can produce any type of result so its MCInstrDesc
272 // does not include operand register class info.
273 const TargetRegisterClass *RC = TLI->getRegClassFor(
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);
278 return VReg;
279 }
280
281 VRBaseMapType::iterator I = VRBaseMap.find(Op);
282 assert(I != VRBaseMap.end() && "Node emitted out of order - late");
283 return I->second;
284}
285
286/// AddRegisterOperand - Add the specified register as an operand to the
287/// specified machine instr. Insert register copies if the register is
288/// not in the required register class.
289void InstrEmitter::AddRegisterOperand(MachineInstrBuilder &MIB, SDValue Op,
290 unsigned IIOpNum, const MCInstrDesc *II,
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!");
295 // Get/emit the operand.
296 Register VReg = getVR(Op, VRBaseMap);
297
298 const MCInstrDesc &MCID = MIB->getDesc();
299 bool isOptDef = IIOpNum < MCID.getNumOperands() &&
300 MCID.operands()[IIOpNum].isOptionalDef();
301
302 // If the instruction requires a register in a different class, create
303 // a new virtual register and copy the value into it, but first attempt to
304 // shrink VReg's register class within reason. For example, if VReg == GR32
305 // and II requires a GR32_NOSP, just constrain VReg to GR32_NOSP.
306 if (II) {
307 const TargetRegisterClass *OpRC = nullptr;
308 if (IIOpNum < II->getNumOperands())
309 OpRC = TII->getRegClass(*II, IIOpNum);
310
311 if (OpRC) {
312 unsigned MinNumRegs = MinRCSize;
313 // Don't apply any RC size limit for IMPLICIT_DEF. Each use has a unique
314 // virtual register.
315 if (Op.isMachineOpcode() &&
316 Op.getMachineOpcode() == TargetOpcode::IMPLICIT_DEF)
317 MinNumRegs = 0;
318
319 const TargetRegisterClass *ConstrainedRC
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);
325 BuildMI(*MBB, InsertPos, MIB->getDebugLoc(),
326 TII->get(TargetOpcode::COPY), NewVReg)
327 .addReg(VReg);
328 VReg = NewVReg;
329 } else {
330 assert(ConstrainedRC->isAllocatable() &&
331 "Constraining an allocatable VReg produced an unallocatable class?");
332 }
333 }
334 }
335
336 MIB.addReg(VReg, getDefRegState(isOptDef) | getDebugRegState(IsDebug));
337}
338
339/// AddOperand - Add the specified operand to the specified machine instr. II
340/// specifies the instruction information for the node, and IIOpNum is the
341/// operand number (in the II) that we are adding.
342void InstrEmitter::AddOperand(MachineInstrBuilder &MIB, SDValue Op,
343 unsigned IIOpNum, const MCInstrDesc *II,
344 VRBaseMapType &VRBaseMap, bool IsDebug,
345 bool IsClone, bool IsCloned) {
346 if (Op.isMachineOpcode()) {
347 AddRegisterOperand(MIB, Op, IIOpNum, II, VRBaseMap, IsDebug);
348 } else if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
349 if (C->getAPIntValue().getSignificantBits() <= 64) {
350 MIB.addImm(C->getSExtValue());
351 } else {
352 MIB.addCImm(
353 ConstantInt::get(MF->getFunction().getContext(), C->getAPIntValue()));
354 }
355 } else if (ConstantFPSDNode *F = dyn_cast<ConstantFPSDNode>(Op)) {
356 MIB.addFPImm(F->getConstantFPValue());
357 } else if (RegisterSDNode *R = dyn_cast<RegisterSDNode>(Op)) {
358 Register VReg = R->getReg();
359 MVT OpVT = Op.getSimpleValueType();
360 const TargetRegisterClass *IIRC =
361 II ? TRI->getAllocatableClass(TII->getRegClass(*II, IIOpNum)) : nullptr;
362 const TargetRegisterClass *OpRC =
363 TLI->isTypeLegal(OpVT)
364 ? TLI->getRegClassFor(OpVT,
365 Op.getNode()->isDivergent() ||
366 (IIRC && TRI->isDivergentRegClass(IIRC)))
367 : nullptr;
368
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);
373 VReg = NewVReg;
374 }
375 // Turn additional physreg operands into implicit uses on non-variadic
376 // instructions. This is used by call and return instructions passing
377 // arguments in registers.
378 bool Imp = II && (IIOpNum >= II->getNumOperands() && !II->isVariadic());
379 MIB.addReg(VReg, getImplRegState(Imp));
380 } else if (RegisterMaskSDNode *RM = dyn_cast<RegisterMaskSDNode>(Op)) {
381 MIB.addRegMask(RM->getRegMask());
382 } else if (GlobalAddressSDNode *TGA = dyn_cast<GlobalAddressSDNode>(Op)) {
383 MIB.addGlobalAddress(TGA->getGlobal(), TGA->getOffset(),
384 TGA->getTargetFlags());
385 } else if (BasicBlockSDNode *BBNode = dyn_cast<BasicBlockSDNode>(Op)) {
386 MIB.addMBB(BBNode->getBasicBlock());
387 } else if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Op)) {
388 MIB.addFrameIndex(FI->getIndex());
389 } else if (JumpTableSDNode *JT = dyn_cast<JumpTableSDNode>(Op)) {
390 MIB.addJumpTableIndex(JT->getIndex(), JT->getTargetFlags());
391 } else if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(Op)) {
392 int Offset = CP->getOffset();
393 Align Alignment = CP->getAlign();
394
395 unsigned Idx;
396 MachineConstantPool *MCP = MF->getConstantPool();
397 if (CP->isMachineConstantPoolEntry())
398 Idx = MCP->getConstantPoolIndex(CP->getMachineCPVal(), Alignment);
399 else
400 Idx = MCP->getConstantPoolIndex(CP->getConstVal(), Alignment);
401 MIB.addConstantPoolIndex(Idx, Offset, CP->getTargetFlags());
402 } else if (ExternalSymbolSDNode *ES = dyn_cast<ExternalSymbolSDNode>(Op)) {
403 MIB.addExternalSymbol(ES->getSymbol(), ES->getTargetFlags());
404 } else if (auto *SymNode = dyn_cast<MCSymbolSDNode>(Op)) {
405 MIB.addSym(SymNode->getMCSymbol());
406 } else if (BlockAddressSDNode *BA = dyn_cast<BlockAddressSDNode>(Op)) {
407 MIB.addBlockAddress(BA->getBlockAddress(),
408 BA->getOffset(),
409 BA->getTargetFlags());
410 } else if (TargetIndexSDNode *TI = dyn_cast<TargetIndexSDNode>(Op)) {
411 MIB.addTargetIndex(TI->getIndex(), TI->getOffset(), TI->getTargetFlags());
412 } else {
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);
417 }
418}
419
420Register InstrEmitter::ConstrainForSubReg(Register VReg, unsigned SubIdx,
421 MVT VT, bool isDivergent, const DebugLoc &DL) {
422 const TargetRegisterClass *VRC = MRI->getRegClass(VReg);
423 const TargetRegisterClass *RC = TRI->getSubClassWithSubReg(VRC, SubIdx);
424
425 // RC is a sub-class of VRC that supports SubIdx. Try to constrain VReg
426 // within reason.
427 if (RC && RC != VRC)
428 RC = MRI->constrainRegClass(VReg, RC, MinRCSize);
429
430 // VReg has been adjusted. It can be used with SubIdx operands now.
431 if (RC)
432 return VReg;
433
434 // VReg couldn't be reasonably constrained. Emit a COPY to a new virtual
435 // register instead.
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)
440 .addReg(VReg);
441 return NewReg;
442}
443
444/// EmitSubregNode - Generate machine code for subreg nodes.
445///
446void InstrEmitter::EmitSubregNode(SDNode *Node, VRBaseMapType &VRBaseMap,
447 bool IsClone, bool IsCloned) {
448 Register VRBase;
449 unsigned Opc = Node->getMachineOpcode();
450
451 // If the node is only used by a CopyToReg and the dest reg is a vreg, use
452 // the CopyToReg'd destination register instead of creating a new vreg.
453 for (SDNode *User : Node->users()) {
454 if (User->getOpcode() == ISD::CopyToReg &&
455 User->getOperand(2).getNode() == Node) {
456 Register DestReg = cast<RegisterSDNode>(User->getOperand(1))->getReg();
457 if (DestReg.isVirtual()) {
458 VRBase = DestReg;
459 break;
460 }
461 }
462 }
463
464 if (Opc == TargetOpcode::EXTRACT_SUBREG) {
465 // EXTRACT_SUBREG is lowered as %dst = COPY %src:sub. There are no
466 // constraints on the %dst register, COPY can target all legal register
467 // classes.
468 unsigned SubIdx = Node->getConstantOperandVal(1);
469 const TargetRegisterClass *TRC =
470 TLI->getRegClassFor(Node->getSimpleValueType(0), Node->isDivergent());
471
473 MachineInstr *DefMI;
474 RegisterSDNode *R = dyn_cast<RegisterSDNode>(Node->getOperand(0));
475 if (R && R->getReg().isPhysical()) {
476 Reg = R->getReg();
477 DefMI = nullptr;
478 } else {
479 Reg = R ? R->getReg() : getVR(Node->getOperand(0), VRBaseMap);
480 DefMI = MRI->getVRegDef(Reg);
481 }
482
483 Register SrcReg, DstReg;
484 unsigned DefSubIdx;
485 if (DefMI &&
486 TII->isCoalescableExtInstr(*DefMI, SrcReg, DstReg, DefSubIdx) &&
487 SubIdx == DefSubIdx &&
488 TRC == MRI->getRegClass(SrcReg)) {
489 // Optimize these:
490 // r1025 = s/zext r1024, 4
491 // r1026 = extract_subreg r1025, 4
492 // to a copy
493 // r1026 = copy r1024
494 VRBase = MRI->createVirtualRegister(TRC);
495 BuildMI(*MBB, InsertPos, Node->getDebugLoc(),
496 TII->get(TargetOpcode::COPY), VRBase)
497 .addReg(SrcReg);
498 } else {
499 // Reg may not support a SubIdx sub-register, and we may need to
500 // constrain its register class or issue a COPY to a compatible register
501 // class.
502 if (Reg.isVirtual())
503 Reg = ConstrainForSubReg(Reg, SubIdx,
504 Node->getOperand(0).getSimpleValueType(),
505 Node->isDivergent(), Node->getDebugLoc());
506 // Create the destreg if it is missing.
507 if (!VRBase)
508 VRBase = MRI->createVirtualRegister(TRC);
509
510 // Create the extract_subreg machine instruction.
511 MachineInstrBuilder CopyMI =
512 BuildMI(*MBB, InsertPos, Node->getDebugLoc(),
513 TII->get(TargetOpcode::COPY), VRBase);
514 if (Reg.isVirtual())
515 CopyMI.addReg(Reg, {}, SubIdx);
516 else
517 CopyMI.addReg(TRI->getSubReg(Reg, SubIdx));
518 }
519 } else if (Opc == TargetOpcode::INSERT_SUBREG ||
520 Opc == TargetOpcode::SUBREG_TO_REG) {
521 SDValue Reg;
522 SDValue SubReg;
523 unsigned SubIdx;
524 if (Opc == TargetOpcode::INSERT_SUBREG) {
525 Reg = Node->getOperand(0);
526 SubReg = Node->getOperand(1);
527 SubIdx = Node->getOperand(2)->getAsZExtVal();
528 } else {
529 SubReg = Node->getOperand(0);
530 SubIdx = Node->getOperand(1)->getAsZExtVal();
531 }
532
533 // Figure out the register class to create for the destreg. It should be
534 // the largest legal register class supporting SubIdx sub-registers.
535 // RegisterCoalescer will constrain it further if it decides to eliminate
536 // the INSERT_SUBREG instruction.
537 //
538 // %dst = INSERT_SUBREG %src, %sub, SubIdx
539 //
540 // is lowered by TwoAddressInstructionPass to:
541 //
542 // %dst = COPY %src
543 // %dst:SubIdx = COPY %sub
544 //
545 // There is no constraint on the %src register class.
546 //
547 const TargetRegisterClass *SRC =
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");
551
552 if (VRBase == 0 || !SRC->hasSubClassEq(MRI->getRegClass(VRBase)))
553 VRBase = MRI->createVirtualRegister(SRC);
554
555 // Create the insert_subreg or subreg_to_reg machine instruction.
556 MachineInstrBuilder MIB =
557 BuildMI(*MF, Node->getDebugLoc(), TII->get(Opc), VRBase);
558
559 // If creating an insert_subreg, then the first input operand
560 // is a register
561 if (Reg) {
562 AddOperand(MIB, Reg, 0, nullptr, VRBaseMap, /*IsDebug=*/false, IsClone,
563 IsCloned);
564 }
565 // Add the subregister being inserted
566 AddOperand(MIB, SubReg, 0, nullptr, VRBaseMap, /*IsDebug=*/false, IsClone,
567 IsCloned);
568 MIB.addImm(SubIdx);
569 MBB->insert(InsertPos, MIB);
570 } else
571 llvm_unreachable("Node is not insert_subreg, extract_subreg, or subreg_to_reg");
572
573 SDValue Op(Node, 0);
574 bool isNew = VRBaseMap.insert(std::make_pair(Op, VRBase)).second;
575 (void)isNew; // Silence compiler warning.
576 assert(isNew && "Node emitted out of order - early");
577}
578
579/// EmitCopyToRegClassNode - Generate machine code for COPY_TO_REGCLASS nodes.
580/// COPY_TO_REGCLASS is just a normal copy, except that the destination
581/// register is constrained to be in a particular register class.
582///
583void
584InstrEmitter::EmitCopyToRegClassNode(SDNode *Node,
585 VRBaseMapType &VRBaseMap) {
586 // Create the new VReg in the destination class and emit a copy.
587 unsigned DstRCIdx = Node->getConstantOperandVal(1);
588 const TargetRegisterClass *DstRC =
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, /*IsDebug=*/false,
594 /*IsClone=*/false, /*IsCloned*/ false);
595
596 MBB->insert(InsertPos, MIB);
597 SDValue Op(Node, 0);
598 bool isNew = VRBaseMap.insert(std::make_pair(Op, NewVReg)).second;
599 (void)isNew; // Silence compiler warning.
600 assert(isNew && "Node emitted out of order - early");
601}
602
603/// EmitRegSequence - Generate machine code for REG_SEQUENCE nodes.
604///
605void InstrEmitter::EmitRegSequence(SDNode *Node, VRBaseMapType &VRBaseMap,
606 bool IsClone, bool IsCloned) {
607 unsigned DstRCIdx = Node->getConstantOperandVal(0);
608 const TargetRegisterClass *RC = TRI->getRegClass(DstRCIdx);
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);
612 unsigned NumOps = Node->getNumOperands();
613 // If the input pattern has a chain, then the root of the corresponding
614 // output pattern will get a chain as well. This can happen to be a
615 // REG_SEQUENCE (which is not "guarded" by countOperands/CountResults).
616 if (NumOps && Node->getOperand(NumOps-1).getValueType() == MVT::Other)
617 --NumOps; // Ignore chain if it exists.
618
619 assert((NumOps & 1) == 1 &&
620 "REG_SEQUENCE must have an odd number of operands!");
621 for (unsigned i = 1; i != NumOps; ++i) {
622 SDValue Op = Node->getOperand(i);
623 if ((i & 1) == 0) {
624 RegisterSDNode *R = dyn_cast<RegisterSDNode>(Node->getOperand(i-1));
625 // Skip physical registers as they don't have a vreg to get and we'll
626 // insert copies for them in TwoAddressInstructionPass anyway.
627 if (!R || !R->getReg().isPhysical()) {
628 unsigned SubIdx = Op->getAsZExtVal();
629 Register SubReg = getVR(Node->getOperand(i - 1), VRBaseMap);
630 const TargetRegisterClass *TRC = MRI->getRegClass(SubReg);
631 const TargetRegisterClass *SRC =
632 TRI->getMatchingSuperRegClass(RC, TRC, SubIdx);
633 if (SRC && SRC != RC) {
634 MRI->setRegClass(NewVReg, SRC);
635 RC = SRC;
636 }
637 }
638 }
639 AddOperand(MIB, Op, i+1, &II, VRBaseMap, /*IsDebug=*/false,
640 IsClone, IsCloned);
641 }
642
643 MBB->insert(InsertPos, MIB);
644 SDValue Op(Node, 0);
645 bool isNew = VRBaseMap.insert(std::make_pair(Op, NewVReg)).second;
646 (void)isNew; // Silence compiler warning.
647 assert(isNew && "Node emitted out of order - early");
648}
649
650/// EmitDbgValue - Generate machine instruction for a dbg_value node.
651///
653 VRBaseMapType &VRBaseMap) {
655 ->isValidLocationForIntrinsic(SD->getDebugLoc()) &&
656 "Expected inlined-at fields to agree");
657
658 SD->setIsEmitted();
659
660 assert(!SD->getLocationOps().empty() &&
661 "dbg_value with no location operands?");
662
663 if (SD->isInvalidated())
664 return EmitDbgNoLocation(SD);
665
666 // Attempt to produce a DBG_INSTR_REF if we've been asked to.
667 if (EmitDebugInstrRefs)
668 if (auto *InstrRef = EmitDbgInstrRef(SD, VRBaseMap))
669 return InstrRef;
670
671 // Emit variadic dbg_value nodes as DBG_VALUE_LIST if they have not been
672 // emitted as instruction references.
673 if (SD->isVariadic())
674 return EmitDbgValueList(SD, VRBaseMap);
675
676 // Emit single-location dbg_value nodes as DBG_VALUE if they have not been
677 // emitted as instruction references.
678 return EmitDbgValueFromSingleOp(SD, VRBaseMap);
679}
680
682 const Value *V = Op.getConst();
683 if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
684 if (CI->getBitWidth() > 64)
686 if (CI->getBitWidth() == 1)
687 return MachineOperand::CreateImm(CI->getZExtValue());
688 return MachineOperand::CreateImm(CI->getSExtValue());
689 }
690 if (const ConstantFP *CF = dyn_cast<ConstantFP>(V))
692 // Note: This assumes that all nullptr constants are zero-valued.
695 // Undef or unhandled value type, so return an undef operand.
697 /* Reg */ 0U, /* isDef */ false, /* isImp */ false,
698 /* isKill */ false, /* isDead */ false,
699 /* isUndef */ false, /* isEarlyClobber */ false,
700 /* SubReg */ 0, /* isDebug */ true);
701}
702
704 MachineInstrBuilder &MIB, const MCInstrDesc &DbgValDesc,
705 ArrayRef<SDDbgOperand> LocationOps,
706 VRBaseMapType &VRBaseMap) {
707 for (const SDDbgOperand &Op : LocationOps) {
708 switch (Op.getKind()) {
710 MIB.addFrameIndex(Op.getFrameIx());
711 break;
713 MIB.addReg(Op.getVReg());
714 break;
716 SDValue V = SDValue(Op.getSDNode(), Op.getResNo());
717 // It's possible we replaced this SDNode with other(s) and therefore
718 // didn't generate code for it. It's better to catch these cases where
719 // they happen and transfer the debug info, but trying to guarantee that
720 // in all cases would be very fragile; this is a safeguard for any
721 // that were missed.
722 if (VRBaseMap.count(V) == 0)
723 MIB.addReg(0U); // undef
724 else
725 AddOperand(MIB, V, (*MIB).getNumOperands(), &DbgValDesc, VRBaseMap,
726 /*IsDebug=*/true, /*IsClone=*/false, /*IsCloned=*/false);
727 } break;
730 break;
732 MIB.addGlobalAddress(Op.getGlobal());
733 break;
734 }
735 }
736}
737
740 VRBaseMapType &VRBaseMap) {
741 MDNode *Var = SD->getVariable();
742 const DIExpression *Expr = SD->getExpression();
743 DebugLoc DL = SD->getDebugLoc();
744 const MCInstrDesc &RefII = TII->get(TargetOpcode::DBG_INSTR_REF);
745
746 // Returns true if the given operand is not a legal debug operand for a
747 // DBG_INSTR_REF.
748 auto IsInvalidOp = [](SDDbgOperand DbgOp) {
749 return DbgOp.getKind() == SDDbgOperand::FRAMEIX;
750 };
751 // Returns true if the given operand is not itself an instruction reference
752 // but is a legal debug operand for a DBG_INSTR_REF.
753 auto IsNonInstrRefOp = [](SDDbgOperand DbgOp) {
754 return DbgOp.getKind() == SDDbgOperand::CONST ||
755 DbgOp.getKind() == SDDbgOperand::GLOBALADDR;
756 };
757
758 // If this variable location does not depend on any instructions or contains
759 // any stack locations, produce it as a standard debug value instead.
760 if (any_of(SD->getLocationOps(), IsInvalidOp) ||
761 all_of(SD->getLocationOps(), IsNonInstrRefOp)) {
762 if (SD->isVariadic())
763 return EmitDbgValueList(SD, VRBaseMap);
764 return EmitDbgValueFromSingleOp(SD, VRBaseMap);
765 }
766
767 // Immediately fold any indirectness from the LLVM-IR intrinsic into the
768 // expression:
769 if (SD->isIndirect())
770 Expr = DIExpression::append(Expr, dwarf::DW_OP_deref);
771 // If this is not already a variadic expression, it must be modified to become
772 // one.
773 if (!SD->isVariadic())
775
777
778 // It may not be immediately possible to identify the MachineInstr that
779 // defines a VReg, it can depend for example on the order blocks are
780 // emitted in. When this happens, or when further analysis is needed later,
781 // produce an instruction like this:
782 //
783 // DBG_INSTR_REF !123, !456, %0:gr64
784 //
785 // i.e., point the instruction at the vreg, and patch it up later in
786 // MachineFunction::finalizeDebugInstrRefs.
787 auto AddVRegOp = [&](Register VReg) {
789 /* Reg */ VReg, /* isDef */ false, /* isImp */ false,
790 /* isKill */ false, /* isDead */ false,
791 /* isUndef */ false, /* isEarlyClobber */ false,
792 /* SubReg */ 0, /* isDebug */ true));
793 };
794 unsigned OpCount = SD->getLocationOps().size();
795 for (unsigned OpIdx = 0; OpIdx < OpCount; ++OpIdx) {
796 SDDbgOperand DbgOperand = SD->getLocationOps()[OpIdx];
797
798 // Try to find both the defined register and the instruction defining it.
799 MachineInstr *DefMI = nullptr;
800 Register VReg;
801
802 if (DbgOperand.getKind() == SDDbgOperand::VREG) {
803 VReg = DbgOperand.getVReg();
804
805 // No definition means that block hasn't been emitted yet. Leave a vreg
806 // reference to be fixed later.
807 if (!MRI->hasOneDef(VReg)) {
808 AddVRegOp(VReg);
809 continue;
810 }
811
812 DefMI = &*MRI->def_instr_begin(VReg);
813 } else if (DbgOperand.getKind() == SDDbgOperand::SDNODE) {
814 // Look up the corresponding VReg for the given SDNode, if any.
815 SDNode *Node = DbgOperand.getSDNode();
816 SDValue Op = SDValue(Node, DbgOperand.getResNo());
817 VRBaseMapType::iterator I = VRBaseMap.find(Op);
818 // No VReg -> produce a DBG_VALUE $noreg instead.
819 if (I == VRBaseMap.end())
820 break;
821
822 // Try to pick out a defining instruction at this point.
823 VReg = getVR(Op, VRBaseMap);
824
825 // Again, if there's no instruction defining the VReg right now, fix it up
826 // later.
827 if (!MRI->hasOneDef(VReg)) {
828 AddVRegOp(VReg);
829 continue;
830 }
831
832 DefMI = &*MRI->def_instr_begin(VReg);
833 } else if (DbgOperand.getKind() == SDDbgOperand::GLOBALADDR) {
835 /*Offset=*/0));
836 continue;
837 } else {
838 assert(DbgOperand.getKind() == SDDbgOperand::CONST);
839 MOs.push_back(GetMOForConstDbgOp(DbgOperand));
840 continue;
841 }
842
843 // Avoid copy like instructions: they don't define values, only move them.
844 // Leave a virtual-register reference until it can be fixed up later, to
845 // find the underlying value definition.
846 if (DefMI->isCopyLike() || TII->isCopyInstr(*DefMI)) {
847 AddVRegOp(VReg);
848 continue;
849 }
850
851 // Find the operand number which defines the specified VReg.
852 unsigned OperandIdx = 0;
853 for (const auto &MO : DefMI->operands()) {
854 if (MO.isReg() && MO.isDef() && MO.getReg() == VReg)
855 break;
856 ++OperandIdx;
857 }
858 assert(OperandIdx < DefMI->getNumOperands());
859
860 // Make the DBG_INSTR_REF refer to that instruction, and that operand.
861 unsigned InstrNum = DefMI->getDebugInstrNum();
862 MOs.push_back(MachineOperand::CreateDbgInstrRef(InstrNum, OperandIdx));
863 }
864
865 // If we haven't created a valid MachineOperand for every DbgOp, abort and
866 // produce an undef DBG_VALUE.
867 if (MOs.size() != OpCount)
868 return EmitDbgNoLocation(SD);
869
870 return BuildMI(*MF, DL, RefII, false, MOs, Var, Expr);
871}
872
874 // An invalidated SDNode must generate an undef DBG_VALUE: although the
875 // original value is no longer computed, earlier DBG_VALUEs live ranges
876 // must not leak into later code.
877 DIVariable *Var = SD->getVariable();
878 const DIExpression *Expr =
880 DebugLoc DL = SD->getDebugLoc();
881 const MCInstrDesc &Desc = TII->get(TargetOpcode::DBG_VALUE);
882 return BuildMI(*MF, DL, Desc, false, 0U, Var, Expr);
883}
884
887 VRBaseMapType &VRBaseMap) {
888 MDNode *Var = SD->getVariable();
889 DIExpression *Expr = SD->getExpression();
890 DebugLoc DL = SD->getDebugLoc();
891 // DBG_VALUE_LIST := "DBG_VALUE_LIST" var, expression, loc (, loc)*
892 const MCInstrDesc &DbgValDesc = TII->get(TargetOpcode::DBG_VALUE_LIST);
893 // Build the DBG_VALUE_LIST instruction base.
894 auto MIB = BuildMI(*MF, DL, DbgValDesc);
895 MIB.addMetadata(Var);
896 MIB.addMetadata(Expr);
897 AddDbgValueLocationOps(MIB, DbgValDesc, SD->getLocationOps(), VRBaseMap);
898 return &*MIB;
899}
900
903 VRBaseMapType &VRBaseMap) {
904 MDNode *Var = SD->getVariable();
905 DIExpression *Expr = SD->getExpression();
906 DebugLoc DL = SD->getDebugLoc();
907 const MCInstrDesc &II = TII->get(TargetOpcode::DBG_VALUE);
908
909 assert(SD->getLocationOps().size() == 1 &&
910 "Non variadic dbg_value should have only one location op");
911
912 // See about constant-folding the expression.
913 // Copy the location operand in case we replace it.
914 SmallVector<SDDbgOperand, 1> LocationOps(1, SD->getLocationOps()[0]);
915 if (Expr && LocationOps[0].getKind() == SDDbgOperand::CONST) {
916 const Value *V = LocationOps[0].getConst();
917 if (auto *C = dyn_cast<ConstantInt>(V)) {
918 std::tie(Expr, C) = Expr->constantFold(C);
919 LocationOps[0] = SDDbgOperand::fromConst(C);
920 }
921 }
922
923 // Emit non-variadic dbg_value nodes as DBG_VALUE.
924 // DBG_VALUE := "DBG_VALUE" loc, isIndirect, var, expr
925 auto MIB = BuildMI(*MF, DL, II);
926 AddDbgValueLocationOps(MIB, II, LocationOps, VRBaseMap);
927
928 if (SD->isIndirect())
929 MIB.addImm(0U);
930 else
931 MIB.addReg(0U);
932
933 return MIB.addMetadata(Var).addMetadata(Expr);
934}
935
938 MDNode *Label = SD->getLabel();
939 DebugLoc DL = SD->getDebugLoc();
940 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
941 "Expected inlined-at fields to agree");
942
943 const MCInstrDesc &II = TII->get(TargetOpcode::DBG_LABEL);
944 MachineInstrBuilder MIB = BuildMI(*MF, DL, II);
945 MIB.addMetadata(Label);
946
947 return &*MIB;
948}
949
950/// EmitMachineNode - Generate machine code for a target-specific node and
951/// needed dependencies.
952///
953void InstrEmitter::
954EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
955 VRBaseMapType &VRBaseMap) {
956 unsigned Opc = Node->getMachineOpcode();
957
958 // Handle subreg insert/extract specially
959 if (Opc == TargetOpcode::EXTRACT_SUBREG ||
960 Opc == TargetOpcode::INSERT_SUBREG ||
961 Opc == TargetOpcode::SUBREG_TO_REG) {
962 EmitSubregNode(Node, VRBaseMap, IsClone, IsCloned);
963 return;
964 }
965
966 // Handle COPY_TO_REGCLASS specially.
967 if (Opc == TargetOpcode::COPY_TO_REGCLASS) {
968 EmitCopyToRegClassNode(Node, VRBaseMap);
969 return;
970 }
971
972 // Handle REG_SEQUENCE specially.
973 if (Opc == TargetOpcode::REG_SEQUENCE) {
974 EmitRegSequence(Node, VRBaseMap, IsClone, IsCloned);
975 return;
976 }
977
978 if (Opc == TargetOpcode::IMPLICIT_DEF)
979 // We want a unique VR for each IMPLICIT_DEF use.
980 return;
981
982 const MCInstrDesc &II = TII->get(Opc);
983 unsigned NumResults = CountResults(Node);
984 unsigned NumDefs = II.getNumDefs();
985 const MCPhysReg *ScratchRegs = nullptr;
986
987 // Handle STACKMAP and PATCHPOINT specially and then use the generic code.
988 if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) {
989 // Stackmaps do not have arguments and do not preserve their calling
990 // convention. However, to simplify runtime support, they clobber the same
991 // scratch registers as AnyRegCC.
992 unsigned CC = CallingConv::AnyReg;
993 if (Opc == TargetOpcode::PATCHPOINT) {
994 CC = Node->getConstantOperandVal(PatchPointOpers::CCPos);
995 NumDefs = NumResults;
996 }
997 ScratchRegs = TLI->getScratchRegisters((CallingConv::ID) CC);
998 } else if (Opc == TargetOpcode::STATEPOINT) {
999 NumDefs = NumResults;
1000 }
1001
1002 unsigned NumImpUses = 0;
1003 unsigned NodeOperands =
1004 countOperands(Node, II.getNumOperands() - NumDefs, NumImpUses);
1005 bool HasVRegVariadicDefs = !MF->getTarget().usesPhysRegsForValues() &&
1006 II.isVariadic() && II.variadicOpsAreDefs();
1007 bool HasPhysRegOuts = NumResults > NumDefs && !II.implicit_defs().empty() &&
1008 !HasVRegVariadicDefs;
1009#ifndef NDEBUG
1010 unsigned NumMIOperands = NodeOperands + NumResults;
1011 if (II.isVariadic())
1012 assert(NumMIOperands >= II.getNumOperands() &&
1013 "Too few operands for a variadic node!");
1014 else
1015 assert(NumMIOperands >= II.getNumOperands() &&
1016 NumMIOperands <=
1017 II.getNumOperands() + II.implicit_defs().size() + NumImpUses &&
1018 "#operands for dag node doesn't match .td file!");
1019#endif
1020
1021 // Create the new machine instruction.
1022 MachineInstrBuilder MIB = BuildMI(*MF, Node->getDebugLoc(), II);
1023
1024 // Transfer IR flags from the SDNode to the MachineInstr
1025 MachineInstr *MI = MIB.getInstr();
1026 const SDNodeFlags Flags = Node->getFlags();
1027 if (Flags.hasUnpredictable())
1029
1030 // Add result register values for things that are defined by this
1031 // instruction.
1032 if (NumResults) {
1033 CreateVirtualRegisters(Node, MIB, II, IsClone, IsCloned, VRBaseMap);
1034
1035 if (Flags.hasNoSignedZeros())
1037
1038 if (Flags.hasAllowReciprocal())
1040
1041 if (Flags.hasNoNaNs())
1043
1044 if (Flags.hasNoInfs())
1046
1047 if (Flags.hasAllowContract())
1049
1050 if (Flags.hasApproximateFuncs())
1052
1053 if (Flags.hasAllowReassociation())
1055
1056 if (Flags.hasNoUnsignedWrap())
1058
1059 if (Flags.hasNoSignedWrap())
1061
1062 if (Flags.hasExact())
1064
1065 if (Flags.hasNoFPExcept())
1067
1068 if (Flags.hasDisjoint())
1070
1071 if (Flags.hasSameSign())
1073
1074 if (Flags.hasNoConvergent())
1076 }
1077
1078 // Emit all of the actual operands of this instruction, adding them to the
1079 // instruction as appropriate.
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, /*IsDebug=*/false, IsClone, IsCloned);
1087
1088 // Add scratch registers as implicit def and early clobber
1089 if (ScratchRegs)
1090 for (unsigned i = 0; ScratchRegs[i]; ++i)
1091 MIB.addReg(ScratchRegs[i], RegState::ImplicitDefine |
1093
1094 // Set the memory reference descriptions of this instruction now that it is
1095 // part of the function.
1096 MIB.setMemRefs(cast<MachineSDNode>(Node)->memoperands());
1097
1098 // Set the CFI type.
1099 MIB->setCFIType(*MF, Node->getCFIType());
1100
1101 // Insert the instruction into position in the block. This needs to
1102 // happen before any custom inserter hook is called so that the
1103 // hook knows where in the block to insert the replacement code.
1104 MBB->insert(InsertPos, MIB);
1105
1106 // The MachineInstr may also define physregs instead of virtregs. These
1107 // physreg values can reach other instructions in different ways:
1108 //
1109 // 1. When there is a use of a Node value beyond the explicitly defined
1110 // virtual registers, we emit a CopyFromReg for one of the implicitly
1111 // defined physregs. This only happens when HasPhysRegOuts is true.
1112 //
1113 // 2. A CopyFromReg reading a physreg may be glued to this instruction.
1114 //
1115 // 3. A glued instruction may implicitly use a physreg.
1116 //
1117 // 4. A glued instruction may use a RegisterSDNode operand.
1118 //
1119 // Collect all the used physreg defs, and make sure that any unused physreg
1120 // defs are marked as dead.
1121 SmallVector<Register, 8> UsedRegs;
1122
1123 // Additional results must be physical register defs.
1124 if (HasPhysRegOuts) {
1125 for (unsigned i = NumDefs; i < NumResults; ++i) {
1126 Register Reg = II.implicit_defs()[i - NumDefs];
1127 if (!Node->hasAnyUseOfValue(i))
1128 continue;
1129 // This implicitly defined physreg has a use.
1130 UsedRegs.push_back(Reg);
1131 EmitCopyFromReg(SDValue(Node, i), IsClone, Reg, VRBaseMap);
1132 }
1133 }
1134
1135 // Scan the glue chain for any used physregs.
1136 if (Node->getValueType(Node->getNumValues()-1) == MVT::Glue) {
1137 for (SDNode *F = Node->getGluedUser(); F; F = F->getGluedUser()) {
1138 if (F->getOpcode() == ISD::CopyFromReg) {
1139 Register Reg = cast<RegisterSDNode>(F->getOperand(1))->getReg();
1140 if (Reg.isPhysical())
1141 UsedRegs.push_back(Reg);
1142 continue;
1143 } else if (F->getOpcode() == ISD::CopyToReg) {
1144 // Skip CopyToReg nodes that are internal to the glue chain.
1145 continue;
1146 }
1147 // Collect declared implicit uses.
1148 const MCInstrDesc &MCID = TII->get(F->getMachineOpcode());
1149 append_range(UsedRegs, MCID.implicit_uses());
1150 // In addition to declared implicit uses, we must also check for
1151 // direct RegisterSDNode operands.
1152 for (const SDValue &Op : F->op_values())
1153 if (RegisterSDNode *R = dyn_cast<RegisterSDNode>(Op)) {
1154 Register Reg = R->getReg();
1155 if (Reg.isPhysical())
1156 UsedRegs.push_back(Reg);
1157 }
1158 }
1159 }
1160
1161 // Add rounding control registers as implicit def for function call.
1162 if (II.isCall() && MF->getFunction().hasFnAttribute(Attribute::StrictFP)) {
1163 ArrayRef<MCPhysReg> RCRegs = TLI->getRoundingControlRegisters();
1164 llvm::append_range(UsedRegs, RCRegs);
1165 }
1166
1167 // Finally mark unused registers as dead.
1168 if (!UsedRegs.empty() || !II.implicit_defs().empty() || II.hasOptionalDef())
1169 MIB->setPhysRegsDeadExcept(UsedRegs, *TRI);
1170
1171 // STATEPOINT is too 'dynamic' to have meaningful machine description.
1172 // We have to manually tie operands.
1173 if (Opc == TargetOpcode::STATEPOINT && NumDefs > 0) {
1174 assert(!HasPhysRegOuts && "STATEPOINT mishandled");
1175 MachineInstr *MI = MIB;
1176 unsigned Def = 0;
1177 int First = StatepointOpers(MI).getFirstGCPtrIdx();
1178 assert(First > 0 && "Statepoint has Defs but no GC ptr list");
1179 unsigned Use = (unsigned)First;
1180 while (Def < NumDefs) {
1181 if (MI->getOperand(Use).isReg())
1182 MI->tieOperands(Def++, Use);
1184 }
1185 }
1186
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);
1191 MachineOperand MO = MachineOperand::CreateReg(VReg, /*isDef=*/false,
1192 /*isImp=*/true);
1193 MIB->addOperand(MO);
1194 Op--;
1195 }
1196
1197 if (Op != 0 &&
1198 Node->getOperand(Op - 1)->getOpcode() == ISD::DEACTIVATION_SYMBOL) {
1199 MI->setDeactivationSymbol(
1200 *MF, const_cast<GlobalValue *>(
1201 cast<DeactivationSymbolSDNode>(Node->getOperand(Op - 1))
1202 ->getGlobal()));
1203 Op--;
1204 }
1205
1206 // Run post-isel target hook to adjust this instruction if needed.
1207 if (II.hasPostISelHook())
1208 TLI->AdjustInstrPostInstrSelection(*MIB, Node);
1209}
1210
1211/// EmitSpecialNode - Generate machine code for a target-independent node and
1212/// needed dependencies.
1213void InstrEmitter::
1214EmitSpecialNode(SDNode *Node, bool IsClone, bool IsCloned,
1215 VRBaseMapType &VRBaseMap) {
1216 switch (Node->getOpcode()) {
1217 default:
1218#ifndef NDEBUG
1219 Node->dump();
1220#endif
1221 llvm_unreachable("This target-independent node should have been selected!");
1222 case ISD::EntryToken:
1223 case ISD::MERGE_VALUES:
1224 case ISD::TokenFactor:
1226 break;
1227 case ISD::CopyToReg: {
1228 Register DestReg = cast<RegisterSDNode>(Node->getOperand(1))->getReg();
1229 SDValue SrcVal = Node->getOperand(2);
1230 if (DestReg.isVirtual() && SrcVal.isMachineOpcode() &&
1231 SrcVal.getMachineOpcode() == TargetOpcode::IMPLICIT_DEF) {
1232 // Instead building a COPY to that vreg destination, build an
1233 // IMPLICIT_DEF instruction instead.
1234 BuildMI(*MBB, InsertPos, Node->getDebugLoc(),
1235 TII->get(TargetOpcode::IMPLICIT_DEF), DestReg);
1236 break;
1237 }
1238 Register SrcReg;
1239 if (RegisterSDNode *R = dyn_cast<RegisterSDNode>(SrcVal))
1240 SrcReg = R->getReg();
1241 else
1242 SrcReg = getVR(SrcVal, VRBaseMap);
1243
1244 if (SrcReg == DestReg) // Coalesced away the copy? Ignore.
1245 break;
1246
1247 BuildMI(*MBB, InsertPos, Node->getDebugLoc(), TII->get(TargetOpcode::COPY),
1248 DestReg).addReg(SrcReg);
1249 break;
1250 }
1251 case ISD::CopyFromReg: {
1252 Register SrcReg = cast<RegisterSDNode>(Node->getOperand(1))->getReg();
1253 EmitCopyFromReg(SDValue(Node, 0), IsClone, SrcReg, VRBaseMap);
1254 break;
1255 }
1256 case ISD::EH_LABEL:
1257 case ISD::ANNOTATION_LABEL: {
1258 unsigned Opc = (Node->getOpcode() == ISD::EH_LABEL)
1259 ? TargetOpcode::EH_LABEL
1260 : TargetOpcode::ANNOTATION_LABEL;
1261 MCSymbol *S = cast<LabelSDNode>(Node)->getLabel();
1262 BuildMI(*MBB, InsertPos, Node->getDebugLoc(),
1263 TII->get(Opc)).addSym(S);
1264 break;
1265 }
1266
1268 case ISD::LIFETIME_END: {
1269 unsigned TarOp = (Node->getOpcode() == ISD::LIFETIME_START)
1270 ? TargetOpcode::LIFETIME_START
1271 : TargetOpcode::LIFETIME_END;
1272 auto *FI = cast<FrameIndexSDNode>(Node->getOperand(1));
1273 BuildMI(*MBB, InsertPos, Node->getDebugLoc(), TII->get(TarOp))
1274 .addFrameIndex(FI->getIndex());
1275 break;
1276 }
1277
1278 case ISD::PSEUDO_PROBE: {
1279 unsigned TarOp = TargetOpcode::PSEUDO_PROBE;
1280 auto Guid = cast<PseudoProbeSDNode>(Node)->getGuid();
1281 auto Index = cast<PseudoProbeSDNode>(Node)->getIndex();
1282 auto Attr = cast<PseudoProbeSDNode>(Node)->getAttributes();
1283
1284 BuildMI(*MBB, InsertPos, Node->getDebugLoc(), TII->get(TarOp))
1285 .addImm(Guid)
1286 .addImm(Index)
1288 .addImm(Attr);
1289 break;
1290 }
1291
1292 case ISD::INLINEASM:
1293 case ISD::INLINEASM_BR: {
1294 unsigned NumOps = Node->getNumOperands();
1295 if (Node->getOperand(NumOps-1).getValueType() == MVT::Glue)
1296 --NumOps; // Ignore the glue operand.
1297
1298 // Create the inline asm machine instruction.
1299 unsigned TgtOpc = Node->getOpcode() == ISD::INLINEASM_BR
1300 ? TargetOpcode::INLINEASM_BR
1301 : TargetOpcode::INLINEASM;
1302 MachineInstrBuilder MIB =
1303 BuildMI(*MF, Node->getDebugLoc(), TII->get(TgtOpc));
1304
1305 // Add the asm string as an external symbol operand.
1306 SDValue AsmStrV = Node->getOperand(InlineAsm::Op_AsmString);
1307 const char *AsmStr = cast<ExternalSymbolSDNode>(AsmStrV)->getSymbol();
1308 MIB.addExternalSymbol(AsmStr);
1309
1310 // Add the HasSideEffect, isAlignStack, AsmDialect, MayLoad and MayStore
1311 // bits.
1312 int64_t ExtraInfo =
1314 getZExtValue();
1315 MIB.addImm(ExtraInfo);
1316
1317 // Remember to operand index of the group flags.
1318 SmallVector<unsigned, 8> GroupIdx;
1319
1320 // Remember registers that are part of early-clobber defs.
1322
1323 // A glued CopyFromReg may read a clobbered register, e.g. a flag output
1324 // like X86 "={@ccz}" reads EFLAGS defined only by "~{flags}".
1325 SmallVector<Register, 2> GluedUses;
1326 if (Node->getValueType(Node->getNumValues() - 1) == MVT::Glue) {
1327 for (SDNode *G = Node->getGluedUser(); G; G = G->getGluedUser()) {
1328 if (G->getOpcode() != ISD::CopyFromReg)
1329 continue;
1330 Register Reg = cast<RegisterSDNode>(G->getOperand(1))->getReg();
1331 if (Reg.isPhysical())
1332 GluedUses.push_back(Reg);
1333 }
1334 }
1335
1336 // Add all of the operand registers to the instruction.
1337 for (unsigned i = InlineAsm::Op_FirstOperand; i != NumOps;) {
1338 unsigned Flags = Node->getConstantOperandVal(i);
1339 const InlineAsm::Flag F(Flags);
1340 const unsigned NumVals = F.getNumOperandRegisters();
1341
1342 GroupIdx.push_back(MIB->getNumOperands());
1343 MIB.addImm(Flags);
1344 ++i; // Skip the ID value.
1345
1346 switch (F.getKind()) {
1348 for (unsigned j = 0; j != NumVals; ++j, ++i) {
1349 Register Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
1350 // FIXME: Add dead flags for physical and virtual registers defined.
1351 // For now, mark physical register defs as implicit to help fast
1352 // regalloc. This makes inline asm look a lot like calls.
1354 }
1355 break;
1358 for (unsigned j = 0; j != NumVals; ++j, ++i) {
1359 Register Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
1360 bool IsDead =
1361 F.isClobberKind() && none_of(GluedUses, [&](Register U) {
1362 return TRI->regsOverlap(U, Reg);
1363 });
1367 ECRegs.push_back(Reg);
1368 }
1369 break;
1370 case InlineAsm::Kind::RegUse: // Use of register.
1371 case InlineAsm::Kind::Imm: // Immediate.
1372 case InlineAsm::Kind::Mem: // Non-function addressing mode.
1373 // The addressing mode has been selected, just add all of the
1374 // operands to the machine instruction.
1375 for (unsigned j = 0; j != NumVals; ++j, ++i)
1376 AddOperand(MIB, Node->getOperand(i), 0, nullptr, VRBaseMap,
1377 /*IsDebug=*/false, IsClone, IsCloned);
1378
1379 // Manually set isTied bits.
1380 if (F.isRegUseKind()) {
1381 unsigned DefGroup;
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)
1386 MIB->tieOperands(DefIdx + j, UseIdx + j);
1387 }
1388 }
1389 break;
1390 case InlineAsm::Kind::Func: // Function addressing mode.
1391 for (unsigned j = 0; j != NumVals; ++j, ++i) {
1392 SDValue Op = Node->getOperand(i);
1393 AddOperand(MIB, Op, 0, nullptr, VRBaseMap,
1394 /*IsDebug=*/false, IsClone, IsCloned);
1395
1396 // Adjust Target Flags for function reference.
1397 if (auto *TGA = dyn_cast<GlobalAddressSDNode>(Op)) {
1398 unsigned NewFlags =
1399 MF->getSubtarget().classifyGlobalFunctionReference(
1400 TGA->getGlobal());
1401 unsigned LastIdx = MIB.getInstr()->getNumOperands() - 1;
1402 MIB.getInstr()->getOperand(LastIdx).setTargetFlags(NewFlags);
1403 }
1404 }
1405 }
1406 }
1407
1408 // GCC inline assembly allows input operands to also be early-clobber
1409 // output operands (so long as the operand is written only after it's
1410 // used), but this does not match the semantics of our early-clobber flag.
1411 // If an early-clobber operand register is also an input operand register,
1412 // then remove the early-clobber flag.
1413 for (Register Reg : ECRegs) {
1414 if (MIB->readsRegister(Reg, TRI)) {
1415 MachineOperand *MO =
1416 MIB->findRegisterDefOperand(Reg, TRI, false, false);
1417 assert(MO && "No def operand for clobbered register?");
1418 MO->setIsEarlyClobber(false);
1419 }
1420 }
1421
1422 // Get the mdnode from the asm if it exists and add it to the instruction.
1423 SDValue MDV = Node->getOperand(InlineAsm::Op_MDNode);
1424 const MDNode *MD = cast<MDNodeSDNode>(MDV)->getMD();
1425 if (MD)
1426 MIB.addMetadata(MD);
1427
1428 // Add rounding control registers as implicit def for inline asm.
1429 if (MF->getFunction().hasFnAttribute(Attribute::StrictFP)) {
1430 ArrayRef<MCPhysReg> RCRegs = TLI->getRoundingControlRegisters();
1431 for (MCPhysReg Reg : RCRegs)
1433 }
1434
1435 MBB->insert(InsertPos, MIB);
1436 break;
1437 }
1438 }
1439}
1440
1441/// InstrEmitter - Construct an InstrEmitter and set it to start inserting
1442/// at the given position in the given block.
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();
1451}
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.
IRTranslator LLVM IR MI
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
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register Reg
Promote Memory to Register
Definition Mem2Reg.cpp:110
uint64_t IntrinsicInst * II
bool IsDead
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),...
Definition ArrayRef.h:40
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
This is the shared class of boolean and integer constants.
Definition Constants.h:87
DWARF expression.
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.
A debug info location.
Definition DebugLoc.h:126
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition DenseMap.h:763
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:767
iterator end()
Definition DenseMap.h:687
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:679
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.
Metadata node.
Definition Metadata.h:1081
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1579
Machine Value Type.
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.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
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.
Kind getKind() const
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...
bool isVariadic() const
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.
Definition Value.h:75
#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.
Definition CallingConv.h:24
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:263
@ 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...
Definition ISDOpcodes.h:232
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:50
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:226
@ 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.
Definition ISDOpcodes.h:55
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ User
could "use" a pointer
NodeAddr< DefNode * > Def
Definition RDFGraph.h:384
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
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.
Definition Casting.h:643
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
constexpr RegState getDeadRegState(bool B)
Op::Description Desc
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1769
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...
Definition Casting.h:547
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
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.
Definition Casting.h:559
constexpr RegState getDebugRegState(bool B)
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
#define N
TODO: Might pack better if we changed this to a Struct of Arrays, since MachineOperand is width 32,...