LLVM 20.0.0git
StatepointLowering.cpp
Go to the documentation of this file.
1//===- StatepointLowering.cpp - SDAGBuilder's statepoint code -------------===//
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 file includes support code use by SelectionDAGBuilder when lowering a
10// statepoint sequence in SelectionDAG IR.
11//
12//===----------------------------------------------------------------------===//
13
14#include "StatepointLowering.h"
15#include "SelectionDAGBuilder.h"
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/STLExtras.h"
18#include "llvm/ADT/SetVector.h"
20#include "llvm/ADT/SmallSet.h"
22#include "llvm/ADT/Statistic.h"
35#include "llvm/IR/CallingConv.h"
37#include "llvm/IR/GCStrategy.h"
38#include "llvm/IR/Instruction.h"
40#include "llvm/IR/LLVMContext.h"
41#include "llvm/IR/Statepoint.h"
42#include "llvm/IR/Type.h"
47#include <cassert>
48#include <cstddef>
49#include <cstdint>
50#include <iterator>
51#include <tuple>
52#include <utility>
53
54using namespace llvm;
55
56#define DEBUG_TYPE "statepoint-lowering"
57
58STATISTIC(NumSlotsAllocatedForStatepoints,
59 "Number of stack slots allocated for statepoints");
60STATISTIC(NumOfStatepoints, "Number of statepoint nodes encountered");
61STATISTIC(StatepointMaxSlotsRequired,
62 "Maximum number of stack slots required for a singe statepoint");
63
65 "use-registers-for-deopt-values", cl::Hidden, cl::init(false),
66 cl::desc("Allow using registers for non pointer deopt args"));
67
69 "use-registers-for-gc-values-in-landing-pad", cl::Hidden, cl::init(false),
70 cl::desc("Allow using registers for gc pointer in landing pad"));
71
73 "max-registers-for-gc-values", cl::Hidden, cl::init(0),
74 cl::desc("Max number of VRegs allowed to pass GC pointer meta args in"));
75
77
80 SDLoc L = Builder.getCurSDLoc();
81 Ops.push_back(Builder.DAG.getTargetConstant(StackMaps::ConstantOp, L,
82 MVT::i64));
83 Ops.push_back(Builder.DAG.getTargetConstant(Value, L, MVT::i64));
84}
85
87 // Consistency check
88 assert(PendingGCRelocateCalls.empty() &&
89 "Trying to visit statepoint before finished processing previous one");
90 Locations.clear();
91 NextSlotToAllocate = 0;
92 // Need to resize this on each safepoint - we need the two to stay in sync and
93 // the clear patterns of a SelectionDAGBuilder have no relation to
94 // FunctionLoweringInfo. Also need to ensure used bits get cleared.
95 AllocatedStackSlots.clear();
96 AllocatedStackSlots.resize(Builder.FuncInfo.StatepointStackSlots.size());
97}
98
100 Locations.clear();
101 AllocatedStackSlots.clear();
102 assert(PendingGCRelocateCalls.empty() &&
103 "cleared before statepoint sequence completed");
104}
105
108 SelectionDAGBuilder &Builder) {
109 NumSlotsAllocatedForStatepoints++;
111
112 unsigned SpillSize = ValueType.getStoreSize();
113 assert((SpillSize * 8) ==
114 (-8u & (7 + ValueType.getSizeInBits())) && // Round up modulo 8.
115 "Size not in bytes?");
116
117 // First look for a previously created stack slot which is not in
118 // use (accounting for the fact arbitrary slots may already be
119 // reserved), or to create a new stack slot and use it.
120
121 const size_t NumSlots = AllocatedStackSlots.size();
122 assert(NextSlotToAllocate <= NumSlots && "Broken invariant");
123
124 assert(AllocatedStackSlots.size() ==
126 "Broken invariant");
127
128 for (; NextSlotToAllocate < NumSlots; NextSlotToAllocate++) {
129 if (!AllocatedStackSlots.test(NextSlotToAllocate)) {
130 const int FI = Builder.FuncInfo.StatepointStackSlots[NextSlotToAllocate];
131 if (MFI.getObjectSize(FI) == SpillSize) {
132 AllocatedStackSlots.set(NextSlotToAllocate);
133 // TODO: Is ValueType the right thing to use here?
134 return Builder.DAG.getFrameIndex(FI, ValueType);
135 }
136 }
137 }
138
139 // Couldn't find a free slot, so create a new one:
140
141 SDValue SpillSlot = Builder.DAG.CreateStackTemporary(ValueType);
142 const unsigned FI = cast<FrameIndexSDNode>(SpillSlot)->getIndex();
144
146 AllocatedStackSlots.resize(AllocatedStackSlots.size()+1, true);
147 assert(AllocatedStackSlots.size() ==
149 "Broken invariant");
150
151 StatepointMaxSlotsRequired.updateMax(
153
154 return SpillSlot;
155}
156
157/// Utility function for reservePreviousStackSlotForValue. Tries to find
158/// stack slot index to which we have spilled value for previous statepoints.
159/// LookUpDepth specifies maximum DFS depth this function is allowed to look.
160static std::optional<int> findPreviousSpillSlot(const Value *Val,
161 SelectionDAGBuilder &Builder,
162 int LookUpDepth) {
163 // Can not look any further - give up now
164 if (LookUpDepth <= 0)
165 return std::nullopt;
166
167 // Spill location is known for gc relocates
168 if (const auto *Relocate = dyn_cast<GCRelocateInst>(Val)) {
169 const Value *Statepoint = Relocate->getStatepoint();
170 assert((isa<GCStatepointInst>(Statepoint) || isa<UndefValue>(Statepoint)) &&
171 "GetStatepoint must return one of two types");
172 if (isa<UndefValue>(Statepoint))
173 return std::nullopt;
174
175 const auto &RelocationMap = Builder.FuncInfo.StatepointRelocationMaps
176 [cast<GCStatepointInst>(Statepoint)];
177
178 auto It = RelocationMap.find(Relocate);
179 if (It == RelocationMap.end())
180 return std::nullopt;
181
182 auto &Record = It->second;
183 if (Record.type != RecordType::Spill)
184 return std::nullopt;
185
186 return Record.payload.FI;
187 }
188
189 // Look through bitcast instructions.
190 if (const BitCastInst *Cast = dyn_cast<BitCastInst>(Val))
191 return findPreviousSpillSlot(Cast->getOperand(0), Builder, LookUpDepth - 1);
192
193 // Look through phi nodes
194 // All incoming values should have same known stack slot, otherwise result
195 // is unknown.
196 if (const PHINode *Phi = dyn_cast<PHINode>(Val)) {
197 std::optional<int> MergedResult;
198
199 for (const auto &IncomingValue : Phi->incoming_values()) {
200 std::optional<int> SpillSlot =
201 findPreviousSpillSlot(IncomingValue, Builder, LookUpDepth - 1);
202 if (!SpillSlot)
203 return std::nullopt;
204
205 if (MergedResult && *MergedResult != *SpillSlot)
206 return std::nullopt;
207
208 MergedResult = SpillSlot;
209 }
210 return MergedResult;
211 }
212
213 // TODO: We can do better for PHI nodes. In cases like this:
214 // ptr = phi(relocated_pointer, not_relocated_pointer)
215 // statepoint(ptr)
216 // We will return that stack slot for ptr is unknown. And later we might
217 // assign different stack slots for ptr and relocated_pointer. This limits
218 // llvm's ability to remove redundant stores.
219 // Unfortunately it's hard to accomplish in current infrastructure.
220 // We use this function to eliminate spill store completely, while
221 // in example we still need to emit store, but instead of any location
222 // we need to use special "preferred" location.
223
224 // TODO: handle simple updates. If a value is modified and the original
225 // value is no longer live, it would be nice to put the modified value in the
226 // same slot. This allows folding of the memory accesses for some
227 // instructions types (like an increment).
228 // statepoint (i)
229 // i1 = i+1
230 // statepoint (i1)
231 // However we need to be careful for cases like this:
232 // statepoint(i)
233 // i1 = i+1
234 // statepoint(i, i1)
235 // Here we want to reserve spill slot for 'i', but not for 'i+1'. If we just
236 // put handling of simple modifications in this function like it's done
237 // for bitcasts we might end up reserving i's slot for 'i+1' because order in
238 // which we visit values is unspecified.
239
240 // Don't know any information about this instruction
241 return std::nullopt;
242}
243
244/// Return true if-and-only-if the given SDValue can be lowered as either a
245/// constant argument or a stack reference. The key point is that the value
246/// doesn't need to be spilled or tracked as a vreg use.
248 // We are making an unchecked assumption that the frame size <= 2^16 as that
249 // is the largest offset which can be encoded in the stackmap format.
250 if (isa<FrameIndexSDNode>(Incoming))
251 return true;
252
253 // The largest constant describeable in the StackMap format is 64 bits.
254 // Potential Optimization: Constants values are sign extended by consumer,
255 // and thus there are many constants of static type > 64 bits whose value
256 // happens to be sext(Con64) and could thus be lowered directly.
257 if (Incoming.getValueType().getSizeInBits() > 64)
258 return false;
259
260 return isIntOrFPConstant(Incoming) || Incoming.isUndef();
261}
262
263/// Try to find existing copies of the incoming values in stack slots used for
264/// statepoint spilling. If we can find a spill slot for the incoming value,
265/// mark that slot as allocated, and reuse the same slot for this safepoint.
266/// This helps to avoid series of loads and stores that only serve to reshuffle
267/// values on the stack between calls.
268static void reservePreviousStackSlotForValue(const Value *IncomingValue,
269 SelectionDAGBuilder &Builder) {
270 SDValue Incoming = Builder.getValue(IncomingValue);
271
272 // If we won't spill this, we don't need to check for previously allocated
273 // stack slots.
275 return;
276
277 SDValue OldLocation = Builder.StatepointLowering.getLocation(Incoming);
278 if (OldLocation.getNode())
279 // Duplicates in input
280 return;
281
282 const int LookUpDepth = 6;
283 std::optional<int> Index =
284 findPreviousSpillSlot(IncomingValue, Builder, LookUpDepth);
285 if (!Index)
286 return;
287
288 const auto &StatepointSlots = Builder.FuncInfo.StatepointStackSlots;
289
290 auto SlotIt = find(StatepointSlots, *Index);
291 assert(SlotIt != StatepointSlots.end() &&
292 "Value spilled to the unknown stack slot");
293
294 // This is one of our dedicated lowering slots
295 const int Offset = std::distance(StatepointSlots.begin(), SlotIt);
297 // stack slot already assigned to someone else, can't use it!
298 // TODO: currently we reserve space for gc arguments after doing
299 // normal allocation for deopt arguments. We should reserve for
300 // _all_ deopt and gc arguments, then start allocating. This
301 // will prevent some moves being inserted when vm state changes,
302 // but gc state doesn't between two calls.
303 return;
304 }
305 // Reserve this stack slot
307
308 // Cache this slot so we find it when going through the normal
309 // assignment loop.
310 SDValue Loc =
311 Builder.DAG.getTargetFrameIndex(*Index, Builder.getFrameIndexTy());
313}
314
315/// Extract call from statepoint, lower it and return pointer to the
316/// call node. Also update NodeMap so that getValue(statepoint) will
317/// reference lowered call result
318static std::pair<SDValue, SDNode *> lowerCallFromStatepointLoweringInfo(
320 SelectionDAGBuilder &Builder) {
321 SDValue ReturnValue, CallEndVal;
322 std::tie(ReturnValue, CallEndVal) =
323 Builder.lowerInvokable(SI.CLI, SI.EHPadBB);
324 SDNode *CallEnd = CallEndVal.getNode();
325
326 // Get a call instruction from the call sequence chain. Tail calls are not
327 // allowed. The following code is essentially reverse engineering X86's
328 // LowerCallTo.
329 //
330 // We are expecting DAG to have the following form:
331 //
332 // ch = eh_label (only in case of invoke statepoint)
333 // ch, glue = callseq_start ch
334 // ch, glue = X86::Call ch, glue
335 // ch, glue = callseq_end ch, glue
336 // get_return_value ch, glue
337 //
338 // get_return_value can either be a sequence of CopyFromReg instructions
339 // to grab the return value from the return register(s), or it can be a LOAD
340 // to load a value returned by reference via a stack slot.
341
342 if (CallEnd->getOpcode() == ISD::EH_LABEL)
343 CallEnd = CallEnd->getOperand(0).getNode();
344
345 bool HasDef = !SI.CLI.RetTy->isVoidTy();
346 if (HasDef) {
347 if (CallEnd->getOpcode() == ISD::LOAD)
348 CallEnd = CallEnd->getOperand(0).getNode();
349 else
350 while (CallEnd->getOpcode() == ISD::CopyFromReg)
351 CallEnd = CallEnd->getOperand(0).getNode();
352 }
353
354 assert(CallEnd->getOpcode() == ISD::CALLSEQ_END && "expected!");
355 return std::make_pair(ReturnValue, CallEnd->getOperand(0).getNode());
356}
357
359 FrameIndexSDNode &FI) {
360 auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FI.getIndex());
361 auto MMOFlags = MachineMemOperand::MOStore |
363 auto &MFI = MF.getFrameInfo();
364 return MF.getMachineMemOperand(PtrInfo, MMOFlags,
365 MFI.getObjectSize(FI.getIndex()),
366 MFI.getObjectAlign(FI.getIndex()));
367}
368
369/// Spill a value incoming to the statepoint. It might be either part of
370/// vmstate
371/// or gcstate. In both cases unconditionally spill it on the stack unless it
372/// is a null constant. Return pair with first element being frame index
373/// containing saved value and second element with outgoing chain from the
374/// emitted store
375static std::tuple<SDValue, SDValue, MachineMemOperand*>
377 SelectionDAGBuilder &Builder) {
379 MachineMemOperand* MMO = nullptr;
380
381 // Emit new store if we didn't do it for this ptr before
382 if (!Loc.getNode()) {
383 Loc = Builder.StatepointLowering.allocateStackSlot(Incoming.getValueType(),
384 Builder);
385 int Index = cast<FrameIndexSDNode>(Loc)->getIndex();
386 // We use TargetFrameIndex so that isel will not select it into LEA
387 Loc = Builder.DAG.getTargetFrameIndex(Index, Builder.getFrameIndexTy());
388
389 // Right now we always allocate spill slots that are of the same
390 // size as the value we're about to spill (the size of spillee can
391 // vary since we spill vectors of pointers too). At some point we
392 // can consider allowing spills of smaller values to larger slots
393 // (i.e. change the '==' in the assert below to a '>=').
395 assert((MFI.getObjectSize(Index) * 8) ==
396 (-8 & (7 + // Round up modulo 8.
397 (int64_t)Incoming.getValueSizeInBits())) &&
398 "Bad spill: stack slot does not match!");
399
400 // Note: Using the alignment of the spill slot (rather than the abi or
401 // preferred alignment) is required for correctness when dealing with spill
402 // slots with preferred alignments larger than frame alignment..
403 auto &MF = Builder.DAG.getMachineFunction();
404 auto PtrInfo = MachinePointerInfo::getFixedStack(MF, Index);
405 auto *StoreMMO = MF.getMachineMemOperand(
406 PtrInfo, MachineMemOperand::MOStore, MFI.getObjectSize(Index),
407 MFI.getObjectAlign(Index));
408 Chain = Builder.DAG.getStore(Chain, Builder.getCurSDLoc(), Incoming, Loc,
409 StoreMMO);
410
411 MMO = getMachineMemOperand(MF, *cast<FrameIndexSDNode>(Loc));
412
414 }
415
416 assert(Loc.getNode());
417 return std::make_tuple(Loc, Chain, MMO);
418}
419
420/// Lower a single value incoming to a statepoint node. This value can be
421/// either a deopt value or a gc value, the handling is the same. We special
422/// case constants and allocas, then fall back to spilling if required.
423static void
427 SelectionDAGBuilder &Builder) {
428
430 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Incoming)) {
431 // This handles allocas as arguments to the statepoint (this is only
432 // really meaningful for a deopt value. For GC, we'd be trying to
433 // relocate the address of the alloca itself?)
434 assert(Incoming.getValueType() == Builder.getFrameIndexTy() &&
435 "Incoming value is a frame index!");
436 Ops.push_back(Builder.DAG.getTargetFrameIndex(FI->getIndex(),
437 Builder.getFrameIndexTy()));
438
439 auto &MF = Builder.DAG.getMachineFunction();
440 auto *MMO = getMachineMemOperand(MF, *FI);
441 MemRefs.push_back(MMO);
442 return;
443 }
444
445 assert(Incoming.getValueType().getSizeInBits() <= 64);
446
447 if (Incoming.isUndef()) {
448 // Put an easily recognized constant that's unlikely to be a valid
449 // value so that uses of undef by the consumer of the stackmap is
450 // easily recognized. This is legal since the compiler is always
451 // allowed to chose an arbitrary value for undef.
452 pushStackMapConstant(Ops, Builder, 0xFEFEFEFE);
453 return;
454 }
455
456 // If the original value was a constant, make sure it gets recorded as
457 // such in the stackmap. This is required so that the consumer can
458 // parse any internal format to the deopt state. It also handles null
459 // pointers and other constant pointers in GC states.
460 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Incoming)) {
461 pushStackMapConstant(Ops, Builder, C->getSExtValue());
462 return;
463 } else if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Incoming)) {
464 pushStackMapConstant(Ops, Builder,
465 C->getValueAPF().bitcastToAPInt().getZExtValue());
466 return;
467 }
468
469 llvm_unreachable("unhandled direct lowering case");
470 }
471
472
473
474 if (!RequireSpillSlot) {
475 // If this value is live in (not live-on-return, or live-through), we can
476 // treat it the same way patchpoint treats it's "live in" values. We'll
477 // end up folding some of these into stack references, but they'll be
478 // handled by the register allocator. Note that we do not have the notion
479 // of a late use so these values might be placed in registers which are
480 // clobbered by the call. This is fine for live-in. For live-through
481 // fix-up pass should be executed to force spilling of such registers.
482 Ops.push_back(Incoming);
483 } else {
484 // Otherwise, locate a spill slot and explicitly spill it so it can be
485 // found by the runtime later. Note: We know all of these spills are
486 // independent, but don't bother to exploit that chain wise. DAGCombine
487 // will happily do so as needed, so doing it here would be a small compile
488 // time win at most.
489 SDValue Chain = Builder.getRoot();
490 auto Res = spillIncomingStatepointValue(Incoming, Chain, Builder);
491 Ops.push_back(std::get<0>(Res));
492 if (auto *MMO = std::get<2>(Res))
493 MemRefs.push_back(MMO);
494 Chain = std::get<1>(Res);
495 Builder.DAG.setRoot(Chain);
496 }
497
498}
499
500/// Return true if value V represents the GC value. The behavior is conservative
501/// in case it is not sure that value is not GC the function returns true.
502static bool isGCValue(const Value *V, SelectionDAGBuilder &Builder) {
503 auto *Ty = V->getType();
504 if (!Ty->isPtrOrPtrVectorTy())
505 return false;
506 if (auto *GFI = Builder.GFI)
507 if (auto IsManaged = GFI->getStrategy().isGCManagedPointer(Ty))
508 return *IsManaged;
509 return true; // conservative
510}
511
512/// Lower deopt state and gc pointer arguments of the statepoint. The actual
513/// lowering is described in lowerIncomingStatepointValue. This function is
514/// responsible for lowering everything in the right position and playing some
515/// tricks to avoid redundant stack manipulation where possible. On
516/// completion, 'Ops' will contain ready to use operands for machine code
517/// statepoint. The chain nodes will have already been created and the DAG root
518/// will be set to the last value spilled (if any were).
519static void
523 DenseMap<SDValue, int> &LowerAsVReg,
525 SelectionDAGBuilder &Builder) {
526 // Lower the deopt and gc arguments for this statepoint. Layout will be:
527 // deopt argument length, deopt arguments.., gc arguments...
528
529 // Figure out what lowering strategy we're going to use for each part
530 // Note: It is conservatively correct to lower both "live-in" and "live-out"
531 // as "live-through". A "live-through" variable is one which is "live-in",
532 // "live-out", and live throughout the lifetime of the call (i.e. we can find
533 // it from any PC within the transitive callee of the statepoint). In
534 // particular, if the callee spills callee preserved registers we may not
535 // be able to find a value placed in that register during the call. This is
536 // fine for live-out, but not for live-through. If we were willing to make
537 // assumptions about the code generator producing the callee, we could
538 // potentially allow live-through values in callee saved registers.
539 const bool LiveInDeopt =
540 SI.StatepointFlags & (uint64_t)StatepointFlags::DeoptLiveIn;
541
542 // Decide which deriver pointers will go on VRegs
543 unsigned MaxVRegPtrs = MaxRegistersForGCPointers.getValue();
544
545 // Pointers used on exceptional path of invoke statepoint.
546 // We cannot assing them to VRegs.
547 SmallSet<SDValue, 8> LPadPointers;
549 if (const auto *StInvoke =
550 dyn_cast_or_null<InvokeInst>(SI.StatepointInstr)) {
551 LandingPadInst *LPI = StInvoke->getLandingPadInst();
552 for (const auto *Relocate : SI.GCRelocates)
553 if (Relocate->getOperand(0) == LPI) {
554 LPadPointers.insert(Builder.getValue(Relocate->getBasePtr()));
555 LPadPointers.insert(Builder.getValue(Relocate->getDerivedPtr()));
556 }
557 }
558
559 LLVM_DEBUG(dbgs() << "Deciding how to lower GC Pointers:\n");
560
561 // List of unique lowered GC Pointer values.
562 SmallSetVector<SDValue, 16> LoweredGCPtrs;
563 // Map lowered GC Pointer value to the index in above vector
564 DenseMap<SDValue, unsigned> GCPtrIndexMap;
565
566 unsigned CurNumVRegs = 0;
567
568 auto canPassGCPtrOnVReg = [&](SDValue SD) {
569 if (SD.getValueType().isVector())
570 return false;
571 if (LPadPointers.count(SD))
572 return false;
573 return !willLowerDirectly(SD);
574 };
575
576 auto processGCPtr = [&](const Value *V) {
577 SDValue PtrSD = Builder.getValue(V);
578 if (!LoweredGCPtrs.insert(PtrSD))
579 return; // skip duplicates
580 GCPtrIndexMap[PtrSD] = LoweredGCPtrs.size() - 1;
581
582 assert(!LowerAsVReg.count(PtrSD) && "must not have been seen");
583 if (LowerAsVReg.size() == MaxVRegPtrs)
584 return;
585 assert(V->getType()->isVectorTy() == PtrSD.getValueType().isVector() &&
586 "IR and SD types disagree");
587 if (!canPassGCPtrOnVReg(PtrSD)) {
588 LLVM_DEBUG(dbgs() << "direct/spill "; PtrSD.dump(&Builder.DAG));
589 return;
590 }
591 LLVM_DEBUG(dbgs() << "vreg "; PtrSD.dump(&Builder.DAG));
592 LowerAsVReg[PtrSD] = CurNumVRegs++;
593 };
594
595 // Process derived pointers first to give them more chance to go on VReg.
596 for (const Value *V : SI.Ptrs)
597 processGCPtr(V);
598 for (const Value *V : SI.Bases)
599 processGCPtr(V);
600
601 LLVM_DEBUG(dbgs() << LowerAsVReg.size() << " pointers will go in vregs\n");
602
603 auto requireSpillSlot = [&](const Value *V) {
605 Builder.getValue(V).getValueType()))
606 return true;
607 if (isGCValue(V, Builder))
608 return !LowerAsVReg.count(Builder.getValue(V));
609 return !(LiveInDeopt || UseRegistersForDeoptValues);
610 };
611
612 // Before we actually start lowering (and allocating spill slots for values),
613 // reserve any stack slots which we judge to be profitable to reuse for a
614 // particular value. This is purely an optimization over the code below and
615 // doesn't change semantics at all. It is important for performance that we
616 // reserve slots for both deopt and gc values before lowering either.
617 for (const Value *V : SI.DeoptState) {
618 if (requireSpillSlot(V))
620 }
621
622 for (const Value *V : SI.Ptrs) {
623 SDValue SDV = Builder.getValue(V);
624 if (!LowerAsVReg.count(SDV))
626 }
627
628 for (const Value *V : SI.Bases) {
629 SDValue SDV = Builder.getValue(V);
630 if (!LowerAsVReg.count(SDV))
632 }
633
634 // First, prefix the list with the number of unique values to be
635 // lowered. Note that this is the number of *Values* not the
636 // number of SDValues required to lower them.
637 const int NumVMSArgs = SI.DeoptState.size();
638 pushStackMapConstant(Ops, Builder, NumVMSArgs);
639
640 // The vm state arguments are lowered in an opaque manner. We do not know
641 // what type of values are contained within.
642 LLVM_DEBUG(dbgs() << "Lowering deopt state\n");
643 for (const Value *V : SI.DeoptState) {
645 // If this is a function argument at a static frame index, generate it as
646 // the frame index.
647 if (const Argument *Arg = dyn_cast<Argument>(V)) {
648 int FI = Builder.FuncInfo.getArgumentFrameIndex(Arg);
649 if (FI != INT_MAX)
650 Incoming = Builder.DAG.getFrameIndex(FI, Builder.getFrameIndexTy());
651 }
652 if (!Incoming.getNode())
653 Incoming = Builder.getValue(V);
654 LLVM_DEBUG(dbgs() << "Value " << *V
655 << " requireSpillSlot = " << requireSpillSlot(V) << "\n");
656 lowerIncomingStatepointValue(Incoming, requireSpillSlot(V), Ops, MemRefs,
657 Builder);
658 }
659
660 // Finally, go ahead and lower all the gc arguments.
661 pushStackMapConstant(Ops, Builder, LoweredGCPtrs.size());
662 for (SDValue SDV : LoweredGCPtrs)
663 lowerIncomingStatepointValue(SDV, !LowerAsVReg.count(SDV), Ops, MemRefs,
664 Builder);
665
666 // Copy to out vector. LoweredGCPtrs will be empty after this point.
667 GCPtrs = LoweredGCPtrs.takeVector();
668
669 // If there are any explicit spill slots passed to the statepoint, record
670 // them, but otherwise do not do anything special. These are user provided
671 // allocas and give control over placement to the consumer. In this case,
672 // it is the contents of the slot which may get updated, not the pointer to
673 // the alloca
675 for (Value *V : SI.GCLives) {
676 SDValue Incoming = Builder.getValue(V);
677 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Incoming)) {
678 // This handles allocas as arguments to the statepoint
679 assert(Incoming.getValueType() == Builder.getFrameIndexTy() &&
680 "Incoming value is a frame index!");
681 Allocas.push_back(Builder.DAG.getTargetFrameIndex(
682 FI->getIndex(), Builder.getFrameIndexTy()));
683
684 auto &MF = Builder.DAG.getMachineFunction();
685 auto *MMO = getMachineMemOperand(MF, *FI);
686 MemRefs.push_back(MMO);
687 }
688 }
689 pushStackMapConstant(Ops, Builder, Allocas.size());
690 Ops.append(Allocas.begin(), Allocas.end());
691
692 // Now construct GC base/derived map;
693 pushStackMapConstant(Ops, Builder, SI.Ptrs.size());
694 SDLoc L = Builder.getCurSDLoc();
695 for (unsigned i = 0; i < SI.Ptrs.size(); ++i) {
696 SDValue Base = Builder.getValue(SI.Bases[i]);
697 assert(GCPtrIndexMap.count(Base) && "base not found in index map");
698 Ops.push_back(
699 Builder.DAG.getTargetConstant(GCPtrIndexMap[Base], L, MVT::i64));
700 SDValue Derived = Builder.getValue(SI.Ptrs[i]);
701 assert(GCPtrIndexMap.count(Derived) && "derived not found in index map");
702 Ops.push_back(
703 Builder.DAG.getTargetConstant(GCPtrIndexMap[Derived], L, MVT::i64));
704 }
705}
706
709 // The basic scheme here is that information about both the original call and
710 // the safepoint is encoded in the CallInst. We create a temporary call and
711 // lower it, then reverse engineer the calling sequence.
712
713 NumOfStatepoints++;
714 // Clear state
716 assert(SI.Bases.size() == SI.Ptrs.size() && "Pointer without base!");
717 assert((GFI || SI.Bases.empty()) &&
718 "No gc specified, so cannot relocate pointers!");
719
720 LLVM_DEBUG(if (SI.StatepointInstr) dbgs()
721 << "Lowering statepoint " << *SI.StatepointInstr << "\n");
722#ifndef NDEBUG
723 for (const auto *Reloc : SI.GCRelocates)
724 if (Reloc->getParent() == SI.StatepointInstr->getParent())
726#endif
727
728 // Lower statepoint vmstate and gcstate arguments
729
730 // All lowered meta args.
731 SmallVector<SDValue, 10> LoweredMetaArgs;
732 // Lowered GC pointers (subset of above).
733 SmallVector<SDValue, 16> LoweredGCArgs;
735 // Maps derived pointer SDValue to statepoint result of relocated pointer.
736 DenseMap<SDValue, int> LowerAsVReg;
737 lowerStatepointMetaArgs(LoweredMetaArgs, MemRefs, LoweredGCArgs, LowerAsVReg,
738 SI, *this);
739
740 // Now that we've emitted the spills, we need to update the root so that the
741 // call sequence is ordered correctly.
742 SI.CLI.setChain(getRoot());
743
744 // Get call node, we will replace it later with statepoint
745 SDValue ReturnVal;
746 SDNode *CallNode;
747 std::tie(ReturnVal, CallNode) = lowerCallFromStatepointLoweringInfo(SI, *this);
748
749 // Construct the actual GC_TRANSITION_START, STATEPOINT, and GC_TRANSITION_END
750 // nodes with all the appropriate arguments and return values.
751
752 // Call Node: Chain, Target, {Args}, RegMask, [Glue]
753 SDValue Chain = CallNode->getOperand(0);
754
755 SDValue Glue;
756 bool CallHasIncomingGlue = CallNode->getGluedNode();
757 if (CallHasIncomingGlue) {
758 // Glue is always last operand
759 Glue = CallNode->getOperand(CallNode->getNumOperands() - 1);
760 }
761
762 // Build the GC_TRANSITION_START node if necessary.
763 //
764 // The operands to the GC_TRANSITION_{START,END} nodes are laid out in the
765 // order in which they appear in the call to the statepoint intrinsic. If
766 // any of the operands is a pointer-typed, that operand is immediately
767 // followed by a SRCVALUE for the pointer that may be used during lowering
768 // (e.g. to form MachinePointerInfo values for loads/stores).
769 const bool IsGCTransition =
770 (SI.StatepointFlags & (uint64_t)StatepointFlags::GCTransition) ==
772 if (IsGCTransition) {
774
775 // Add chain
776 TSOps.push_back(Chain);
777
778 // Add GC transition arguments
779 for (const Value *V : SI.GCTransitionArgs) {
780 TSOps.push_back(getValue(V));
781 if (V->getType()->isPointerTy())
782 TSOps.push_back(DAG.getSrcValue(V));
783 }
784
785 // Add glue if necessary
786 if (CallHasIncomingGlue)
787 TSOps.push_back(Glue);
788
789 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
790
791 SDValue GCTransitionStart =
793
794 Chain = GCTransitionStart.getValue(0);
795 Glue = GCTransitionStart.getValue(1);
796 }
797
798 // TODO: Currently, all of these operands are being marked as read/write in
799 // PrologEpilougeInserter.cpp, we should special case the VMState arguments
800 // and flags to be read-only.
802
803 // Add the <id> and <numBytes> constants.
804 Ops.push_back(DAG.getTargetConstant(SI.ID, getCurSDLoc(), MVT::i64));
805 Ops.push_back(
806 DAG.getTargetConstant(SI.NumPatchBytes, getCurSDLoc(), MVT::i32));
807
808 // Calculate and push starting position of vmstate arguments
809 // Get number of arguments incoming directly into call node
810 unsigned NumCallRegArgs =
811 CallNode->getNumOperands() - (CallHasIncomingGlue ? 4 : 3);
812 Ops.push_back(DAG.getTargetConstant(NumCallRegArgs, getCurSDLoc(), MVT::i32));
813
814 // Add call target
815 SDValue CallTarget = SDValue(CallNode->getOperand(1).getNode(), 0);
816 Ops.push_back(CallTarget);
817
818 // Add call arguments
819 // Get position of register mask in the call
820 SDNode::op_iterator RegMaskIt;
821 if (CallHasIncomingGlue)
822 RegMaskIt = CallNode->op_end() - 2;
823 else
824 RegMaskIt = CallNode->op_end() - 1;
825 Ops.insert(Ops.end(), CallNode->op_begin() + 2, RegMaskIt);
826
827 // Add a constant argument for the calling convention
828 pushStackMapConstant(Ops, *this, SI.CLI.CallConv);
829
830 // Add a constant argument for the flags
831 uint64_t Flags = SI.StatepointFlags;
832 assert(((Flags & ~(uint64_t)StatepointFlags::MaskAll) == 0) &&
833 "Unknown flag used");
834 pushStackMapConstant(Ops, *this, Flags);
835
836 // Insert all vmstate and gcstate arguments
837 llvm::append_range(Ops, LoweredMetaArgs);
838
839 // Add register mask from call node
840 Ops.push_back(*RegMaskIt);
841
842 // Add chain
843 Ops.push_back(Chain);
844
845 // Same for the glue, but we add it only if original call had it
846 if (Glue.getNode())
847 Ops.push_back(Glue);
848
849 // Compute return values. Provide a glue output since we consume one as
850 // input. This allows someone else to chain off us as needed.
851 SmallVector<EVT, 8> NodeTys;
852 for (auto SD : LoweredGCArgs) {
853 if (!LowerAsVReg.count(SD))
854 continue;
855 NodeTys.push_back(SD.getValueType());
856 }
857 LLVM_DEBUG(dbgs() << "Statepoint has " << NodeTys.size() << " results\n");
858 assert(NodeTys.size() == LowerAsVReg.size() && "Inconsistent GC Ptr lowering");
859 NodeTys.push_back(MVT::Other);
860 NodeTys.push_back(MVT::Glue);
861
862 unsigned NumResults = NodeTys.size();
863 MachineSDNode *StatepointMCNode =
864 DAG.getMachineNode(TargetOpcode::STATEPOINT, getCurSDLoc(), NodeTys, Ops);
865 DAG.setNodeMemRefs(StatepointMCNode, MemRefs);
866
867 // For values lowered to tied-defs, create the virtual registers if used
868 // in other blocks. For local gc.relocate record appropriate statepoint
869 // result in StatepointLoweringState.
871 for (const auto *Relocate : SI.GCRelocates) {
872 Value *Derived = Relocate->getDerivedPtr();
873 SDValue SD = getValue(Derived);
874 if (!LowerAsVReg.count(SD))
875 continue;
876
877 SDValue Relocated = SDValue(StatepointMCNode, LowerAsVReg[SD]);
878
879 // Handle local relocate. Note that different relocates might
880 // map to the same SDValue.
881 if (SI.StatepointInstr->getParent() == Relocate->getParent()) {
883 if (Res)
884 assert(Res == Relocated);
885 else
886 StatepointLowering.setLocation(SD, Relocated);
887 continue;
888 }
889
890 // Handle multiple gc.relocates of the same input efficiently.
891 if (VirtRegs.count(SD))
892 continue;
893
894 auto *RetTy = Relocate->getType();
897 DAG.getDataLayout(), Reg, RetTy, std::nullopt);
898 SDValue Chain = DAG.getRoot();
899 RFV.getCopyToRegs(Relocated, DAG, getCurSDLoc(), Chain, nullptr);
900 PendingExports.push_back(Chain);
901
902 VirtRegs[SD] = Reg;
903 }
904
905 // Record for later use how each relocation was lowered. This is needed to
906 // allow later gc.relocates to mirror the lowering chosen.
907 const Instruction *StatepointInstr = SI.StatepointInstr;
908 auto &RelocationMap = FuncInfo.StatepointRelocationMaps[StatepointInstr];
909 for (const GCRelocateInst *Relocate : SI.GCRelocates) {
910 const Value *V = Relocate->getDerivedPtr();
911 SDValue SDV = getValue(V);
913
914 bool IsLocal = (Relocate->getParent() == StatepointInstr->getParent());
915
917 if (IsLocal && LowerAsVReg.count(SDV)) {
918 // Result is already stored in StatepointLowering
920 } else if (LowerAsVReg.count(SDV)) {
922 assert(VirtRegs.count(SDV));
923 Record.payload.Reg = VirtRegs[SDV];
924 } else if (Loc.getNode()) {
926 Record.payload.FI = cast<FrameIndexSDNode>(Loc)->getIndex();
927 } else {
929 // If we didn't relocate a value, we'll essentialy end up inserting an
930 // additional use of the original value when lowering the gc.relocate.
931 // We need to make sure the value is available at the new use, which
932 // might be in another block.
933 if (Relocate->getParent() != StatepointInstr->getParent())
935 }
936 RelocationMap[Relocate] = Record;
937 }
938
939
940
941 SDNode *SinkNode = StatepointMCNode;
942
943 // Build the GC_TRANSITION_END node if necessary.
944 //
945 // See the comment above regarding GC_TRANSITION_START for the layout of
946 // the operands to the GC_TRANSITION_END node.
947 if (IsGCTransition) {
949
950 // Add chain
951 TEOps.push_back(SDValue(StatepointMCNode, NumResults - 2));
952
953 // Add GC transition arguments
954 for (const Value *V : SI.GCTransitionArgs) {
955 TEOps.push_back(getValue(V));
956 if (V->getType()->isPointerTy())
957 TEOps.push_back(DAG.getSrcValue(V));
958 }
959
960 // Add glue
961 TEOps.push_back(SDValue(StatepointMCNode, NumResults - 1));
962
963 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
964
965 SDValue GCTransitionStart =
966 DAG.getNode(ISD::GC_TRANSITION_END, getCurSDLoc(), NodeTys, TEOps);
967
968 SinkNode = GCTransitionStart.getNode();
969 }
970
971 // Replace original call
972 // Call: ch,glue = CALL ...
973 // Statepoint: [gc relocates],ch,glue = STATEPOINT ...
974 unsigned NumSinkValues = SinkNode->getNumValues();
975 SDValue StatepointValues[2] = {SDValue(SinkNode, NumSinkValues - 2),
976 SDValue(SinkNode, NumSinkValues - 1)};
977 DAG.ReplaceAllUsesWith(CallNode, StatepointValues);
978 // Remove original call node
979 DAG.DeleteNode(CallNode);
980
981 // Since we always emit CopyToRegs (even for local relocates), we must
982 // update root, so that they are emitted before any local uses.
983 (void)getControlRoot();
984
985 // TODO: A better future implementation would be to emit a single variable
986 // argument, variable return value STATEPOINT node here and then hookup the
987 // return value of each gc.relocate to the respective output of the
988 // previously emitted STATEPOINT value. Unfortunately, this doesn't appear
989 // to actually be possible today.
990
991 return ReturnVal;
992}
993
994/// Return two gc.results if present. First result is a block local
995/// gc.result, second result is a non-block local gc.result. Corresponding
996/// entry will be nullptr if not present.
997static std::pair<const GCResultInst*, const GCResultInst*>
999 std::pair<const GCResultInst *, const GCResultInst*> Res(nullptr, nullptr);
1000 for (const auto *U : S.users()) {
1001 auto *GRI = dyn_cast<GCResultInst>(U);
1002 if (!GRI)
1003 continue;
1004 if (GRI->getParent() == S.getParent())
1005 Res.first = GRI;
1006 else
1007 Res.second = GRI;
1008 }
1009 return Res;
1010}
1011
1012void
1014 const BasicBlock *EHPadBB /*= nullptr*/) {
1015 assert(I.getCallingConv() != CallingConv::AnyReg &&
1016 "anyregcc is not supported on statepoints!");
1017
1018#ifndef NDEBUG
1019 // Check that the associated GCStrategy expects to encounter statepoints.
1021 "GCStrategy does not expect to encounter statepoints");
1022#endif
1023
1024 SDValue ActualCallee;
1025 SDValue Callee = getValue(I.getActualCalledOperand());
1026
1027 if (I.getNumPatchBytes() > 0) {
1028 // If we've been asked to emit a nop sequence instead of a call instruction
1029 // for this statepoint then don't lower the call target, but use a constant
1030 // `undef` instead. Not lowering the call target lets statepoint clients
1031 // get away without providing a physical address for the symbolic call
1032 // target at link time.
1033 ActualCallee = DAG.getUNDEF(Callee.getValueType());
1034 } else {
1035 ActualCallee = Callee;
1036 }
1037
1038 const auto GCResultLocality = getGCResultLocality(I);
1039 AttributeSet retAttrs;
1040 if (GCResultLocality.first)
1041 retAttrs = GCResultLocality.first->getAttributes().getRetAttrs();
1042
1045 I.getNumCallArgs(), ActualCallee,
1046 I.getActualReturnType(), retAttrs,
1047 /*IsPatchPoint=*/false);
1048
1049 // There may be duplication in the gc.relocate list; such as two copies of
1050 // each relocation on normal and exceptional path for an invoke. We only
1051 // need to spill once and record one copy in the stackmap, but we need to
1052 // reload once per gc.relocate. (Dedupping gc.relocates is trickier and best
1053 // handled as a CSE problem elsewhere.)
1054 // TODO: There a couple of major stackmap size optimizations we could do
1055 // here if we wished.
1056 // 1) If we've encountered a derived pair {B, D}, we don't need to actually
1057 // record {B,B} if it's seen later.
1058 // 2) Due to rematerialization, actual derived pointers are somewhat rare;
1059 // given that, we could change the format to record base pointer relocations
1060 // separately with half the space. This would require a format rev and a
1061 // fairly major rework of the STATEPOINT node though.
1063 for (const GCRelocateInst *Relocate : I.getGCRelocates()) {
1064 SI.GCRelocates.push_back(Relocate);
1065
1066 SDValue DerivedSD = getValue(Relocate->getDerivedPtr());
1067 if (Seen.insert(DerivedSD).second) {
1068 SI.Bases.push_back(Relocate->getBasePtr());
1069 SI.Ptrs.push_back(Relocate->getDerivedPtr());
1070 }
1071 }
1072
1073 // If we find a deopt value which isn't explicitly added, we need to
1074 // ensure it gets lowered such that gc cycles occurring before the
1075 // deoptimization event during the lifetime of the call don't invalidate
1076 // the pointer we're deopting with. Note that we assume that all
1077 // pointers passed to deopt are base pointers; relaxing that assumption
1078 // would require relatively large changes to how we represent relocations.
1079 for (Value *V : I.deopt_operands()) {
1080 if (!isGCValue(V, *this))
1081 continue;
1082 if (Seen.insert(getValue(V)).second) {
1083 SI.Bases.push_back(V);
1084 SI.Ptrs.push_back(V);
1085 }
1086 }
1087
1088 SI.GCLives = ArrayRef<const Use>(I.gc_live_begin(), I.gc_live_end());
1089 SI.StatepointInstr = &I;
1090 SI.ID = I.getID();
1091
1092 SI.DeoptState = ArrayRef<const Use>(I.deopt_begin(), I.deopt_end());
1093 SI.GCTransitionArgs = ArrayRef<const Use>(I.gc_transition_args_begin(),
1094 I.gc_transition_args_end());
1095
1096 SI.StatepointFlags = I.getFlags();
1097 SI.NumPatchBytes = I.getNumPatchBytes();
1098 SI.EHPadBB = EHPadBB;
1099
1100 SDValue ReturnValue = LowerAsSTATEPOINT(SI);
1101
1102 // Export the result value if needed
1103 if (!GCResultLocality.first && !GCResultLocality.second) {
1104 // The return value is not needed, just generate a poison value.
1105 // Note: This covers the void return case.
1107 return;
1108 }
1109
1110 if (GCResultLocality.first) {
1111 // Result value will be used in a same basic block. Don't export it or
1112 // perform any explicit register copies. The gc_result will simply grab
1113 // this value.
1114 setValue(&I, ReturnValue);
1115 }
1116
1117 if (!GCResultLocality.second)
1118 return;
1119 // Result value will be used in a different basic block so we need to export
1120 // it now. Default exporting mechanism will not work here because statepoint
1121 // call has a different type than the actual call. It means that by default
1122 // llvm will create export register of the wrong type (always i32 in our
1123 // case). So instead we need to create export register with correct type
1124 // manually.
1125 // TODO: To eliminate this problem we can remove gc.result intrinsics
1126 // completely and make statepoint call to return a tuple.
1127 Type *RetTy = GCResultLocality.second->getType();
1130 DAG.getDataLayout(), Reg, RetTy,
1131 I.getCallingConv());
1132 SDValue Chain = DAG.getEntryNode();
1133
1134 RFV.getCopyToRegs(ReturnValue, DAG, getCurSDLoc(), Chain, nullptr);
1135 PendingExports.push_back(Chain);
1136 FuncInfo.ValueMap[&I] = Reg;
1137}
1138
1140 const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB,
1141 bool VarArgDisallowed, bool ForceVoidReturnTy) {
1143 unsigned ArgBeginIndex = Call->arg_begin() - Call->op_begin();
1145 SI.CLI, Call, ArgBeginIndex, Call->arg_size(), Callee,
1146 ForceVoidReturnTy ? Type::getVoidTy(*DAG.getContext()) : Call->getType(),
1147 Call->getAttributes().getRetAttrs(), /*IsPatchPoint=*/false);
1148 if (!VarArgDisallowed)
1149 SI.CLI.IsVarArg = Call->getFunctionType()->isVarArg();
1150
1151 auto DeoptBundle = *Call->getOperandBundle(LLVMContext::OB_deopt);
1152
1154
1155 auto SD = parseStatepointDirectivesFromAttrs(Call->getAttributes());
1156 SI.ID = SD.StatepointID.value_or(DefaultID);
1157 SI.NumPatchBytes = SD.NumPatchBytes.value_or(0);
1158
1159 SI.DeoptState =
1160 ArrayRef<const Use>(DeoptBundle.Inputs.begin(), DeoptBundle.Inputs.end());
1161 SI.StatepointFlags = static_cast<uint64_t>(StatepointFlags::None);
1162 SI.EHPadBB = EHPadBB;
1163
1164 // NB! The GC arguments are deliberately left empty.
1165
1166 LLVM_DEBUG(dbgs() << "Lowering call with deopt bundle " << *Call << "\n");
1167 if (SDValue ReturnVal = LowerAsSTATEPOINT(SI)) {
1168 ReturnVal = lowerRangeToAssertZExt(DAG, *Call, ReturnVal);
1169 setValue(Call, ReturnVal);
1170 }
1171}
1172
1174 const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB) {
1175 LowerCallSiteWithDeoptBundleImpl(Call, Callee, EHPadBB,
1176 /* VarArgDisallowed = */ false,
1177 /* ForceVoidReturnTy = */ false);
1178}
1179
1180void SelectionDAGBuilder::visitGCResult(const GCResultInst &CI) {
1181 // The result value of the gc_result is simply the result of the actual
1182 // call. We've already emitted this, so just grab the value.
1183 const Value *SI = CI.getStatepoint();
1184 assert((isa<GCStatepointInst>(SI) || isa<UndefValue>(SI)) &&
1185 "GetStatepoint must return one of two types");
1186 if (isa<UndefValue>(SI))
1187 return;
1188
1189 if (cast<GCStatepointInst>(SI)->getParent() == CI.getParent()) {
1190 setValue(&CI, getValue(SI));
1191 return;
1192 }
1193 // Statepoint is in different basic block so we should have stored call
1194 // result in a virtual register.
1195 // We can not use default getValue() functionality to copy value from this
1196 // register because statepoint and actual call return types can be
1197 // different, and getValue() will use CopyFromReg of the wrong type,
1198 // which is always i32 in our case.
1199 Type *RetTy = CI.getType();
1200 SDValue CopyFromReg = getCopyFromRegs(SI, RetTy);
1201
1202 assert(CopyFromReg.getNode());
1203 setValue(&CI, CopyFromReg);
1204}
1205
1206void SelectionDAGBuilder::visitGCRelocate(const GCRelocateInst &Relocate) {
1207 const Value *Statepoint = Relocate.getStatepoint();
1208#ifndef NDEBUG
1209 // Consistency check
1210 // We skip this check for relocates not in the same basic block as their
1211 // statepoint. It would be too expensive to preserve validation info through
1212 // different basic blocks.
1213 assert((isa<GCStatepointInst>(Statepoint) || isa<UndefValue>(Statepoint)) &&
1214 "GetStatepoint must return one of two types");
1215 if (isa<UndefValue>(Statepoint))
1216 return;
1217
1218 if (cast<GCStatepointInst>(Statepoint)->getParent() == Relocate.getParent())
1220#endif
1221
1222 const Value *DerivedPtr = Relocate.getDerivedPtr();
1223 auto &RelocationMap =
1224 FuncInfo.StatepointRelocationMaps[cast<GCStatepointInst>(Statepoint)];
1225 auto SlotIt = RelocationMap.find(&Relocate);
1226 assert(SlotIt != RelocationMap.end() && "Relocating not lowered gc value");
1227 const RecordType &Record = SlotIt->second;
1228
1229 // If relocation was done via virtual register..
1230 if (Record.type == RecordType::SDValueNode) {
1231 assert(cast<GCStatepointInst>(Statepoint)->getParent() ==
1232 Relocate.getParent() &&
1233 "Nonlocal gc.relocate mapped via SDValue");
1235 assert(SDV.getNode() && "empty SDValue");
1236 setValue(&Relocate, SDV);
1237 return;
1238 }
1239 if (Record.type == RecordType::VReg) {
1240 Register InReg = Record.payload.Reg;
1242 DAG.getDataLayout(), InReg, Relocate.getType(),
1243 std::nullopt); // This is not an ABI copy.
1244 // We generate copy to/from regs even for local uses, hence we must
1245 // chain with current root to ensure proper ordering of copies w.r.t.
1246 // statepoint.
1247 SDValue Chain = DAG.getRoot();
1248 SDValue Relocation = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(),
1249 Chain, nullptr, nullptr);
1250 setValue(&Relocate, Relocation);
1251 return;
1252 }
1253
1254 if (Record.type == RecordType::Spill) {
1255 unsigned Index = Record.payload.FI;
1256 SDValue SpillSlot = DAG.getTargetFrameIndex(Index, getFrameIndexTy());
1257
1258 // All the reloads are independent and are reading memory only modified by
1259 // statepoints (i.e. no other aliasing stores); informing SelectionDAG of
1260 // this lets CSE kick in for free and allows reordering of
1261 // instructions if possible. The lowering for statepoint sets the root,
1262 // so this is ordering all reloads with the either
1263 // a) the statepoint node itself, or
1264 // b) the entry of the current block for an invoke statepoint.
1265 const SDValue Chain = DAG.getRoot(); // != Builder.getRoot()
1266
1267 auto &MF = DAG.getMachineFunction();
1268 auto &MFI = MF.getFrameInfo();
1269 auto PtrInfo = MachinePointerInfo::getFixedStack(MF, Index);
1270 auto *LoadMMO = MF.getMachineMemOperand(PtrInfo, MachineMemOperand::MOLoad,
1271 MFI.getObjectSize(Index),
1272 MFI.getObjectAlign(Index));
1273
1275 Relocate.getType());
1276
1277 SDValue SpillLoad =
1278 DAG.getLoad(LoadVT, getCurSDLoc(), Chain, SpillSlot, LoadMMO);
1279 PendingLoads.push_back(SpillLoad.getValue(1));
1280
1281 assert(SpillLoad.getNode());
1282 setValue(&Relocate, SpillLoad);
1283 return;
1284 }
1285
1287 SDValue SD = getValue(DerivedPtr);
1288
1289 if (SD.isUndef() && SD.getValueType().getSizeInBits() <= 64) {
1290 // Lowering relocate(undef) as arbitrary constant. Current constant value
1291 // is chosen such that it's unlikely to be a valid pointer.
1292 setValue(&Relocate, DAG.getConstant(0xFEFEFEFE, SDLoc(SD), MVT::i64));
1293 return;
1294 }
1295
1296 // We didn't need to spill these special cases (constants and allocas).
1297 // See the handling in spillIncomingValueForStatepoint for detail.
1298 setValue(&Relocate, SD);
1299}
1300
1302 const auto &TLI = DAG.getTargetLoweringInfo();
1303 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(RTLIB::DEOPTIMIZE),
1304 TLI.getPointerTy(DAG.getDataLayout()));
1305
1306 // We don't lower calls to __llvm_deoptimize as varargs, but as a regular
1307 // call. We also do not lower the return value to any virtual register, and
1308 // change the immediately following return to a trap instruction.
1309 LowerCallSiteWithDeoptBundleImpl(CI, Callee, /* EHPadBB = */ nullptr,
1310 /* VarArgDisallowed = */ true,
1311 /* ForceVoidReturnTy = */ true);
1312}
1313
1315 // We do not lower the return value from llvm.deoptimize to any virtual
1316 // register, and change the immediately following return to a trap
1317 // instruction.
1319 DAG.setRoot(
1320 DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
1321}
static const Function * getParent(const Value *V)
return RetTy
#define LLVM_DEBUG(...)
Definition: Debug.h:106
#define I(x, y, z)
Definition: MD5.cpp:58
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file implements the SmallBitVector class.
This file defines the SmallSet class.
This file defines the SmallVector class.
static cl::opt< bool > UseRegistersForGCPointersInLandingPad("use-registers-for-gc-values-in-landing-pad", cl::Hidden, cl::init(false), cl::desc("Allow using registers for gc pointer in landing pad"))
static void lowerIncomingStatepointValue(SDValue Incoming, bool RequireSpillSlot, SmallVectorImpl< SDValue > &Ops, SmallVectorImpl< MachineMemOperand * > &MemRefs, SelectionDAGBuilder &Builder)
Lower a single value incoming to a statepoint node.
static std::optional< int > findPreviousSpillSlot(const Value *Val, SelectionDAGBuilder &Builder, int LookUpDepth)
Utility function for reservePreviousStackSlotForValue.
static void pushStackMapConstant(SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder, uint64_t Value)
static bool isGCValue(const Value *V, SelectionDAGBuilder &Builder)
Return true if value V represents the GC value.
static bool willLowerDirectly(SDValue Incoming)
Return true if-and-only-if the given SDValue can be lowered as either a constant argument or a stack ...
static void lowerStatepointMetaArgs(SmallVectorImpl< SDValue > &Ops, SmallVectorImpl< MachineMemOperand * > &MemRefs, SmallVectorImpl< SDValue > &GCPtrs, DenseMap< SDValue, int > &LowerAsVReg, SelectionDAGBuilder::StatepointLoweringInfo &SI, SelectionDAGBuilder &Builder)
Lower deopt state and gc pointer arguments of the statepoint.
static std::pair< const GCResultInst *, const GCResultInst * > getGCResultLocality(const GCStatepointInst &S)
Return two gc.results if present.
static cl::opt< bool > UseRegistersForDeoptValues("use-registers-for-deopt-values", cl::Hidden, cl::init(false), cl::desc("Allow using registers for non pointer deopt args"))
static cl::opt< unsigned > MaxRegistersForGCPointers("max-registers-for-gc-values", cl::Hidden, cl::init(0), cl::desc("Max number of VRegs allowed to pass GC pointer meta args in"))
static void reservePreviousStackSlotForValue(const Value *IncomingValue, SelectionDAGBuilder &Builder)
Try to find existing copies of the incoming values in stack slots used for statepoint spilling.
FunctionLoweringInfo::StatepointRelocationRecord RecordType
static MachineMemOperand * getMachineMemOperand(MachineFunction &MF, FrameIndexSDNode &FI)
static std::pair< SDValue, SDNode * > lowerCallFromStatepointLoweringInfo(SelectionDAGBuilder::StatepointLoweringInfo &SI, SelectionDAGBuilder &Builder)
Extract call from statepoint, lower it and return pointer to the call node.
static std::tuple< SDValue, SDValue, MachineMemOperand * > spillIncomingStatepointValue(SDValue Incoming, SDValue Chain, SelectionDAGBuilder &Builder)
Spill a value incoming to the statepoint.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:166
This file describes how to lower LLVM code to machine code.
This class represents an incoming formal argument to a Function.
Definition: Argument.h:31
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
This class represents a no-op cast from one type to another.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1120
This class represents a function call, abstracting a target machine's calling convention.
unsigned size() const
Definition: DenseMap.h:99
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:152
Register CreateRegs(const Value *V)
DenseMap< const Instruction *, StatepointSpillMapTy > StatepointRelocationMaps
int getArgumentFrameIndex(const Argument *A)
getArgumentFrameIndex - Get frame index for the byval argument.
DenseMap< const Value *, Register > ValueMap
ValueMap - Since we emit code for the function a basic block at a time, we must remember which virtua...
SmallVector< unsigned, 50 > StatepointStackSlots
StatepointStackSlots - A list of temporary stack slots (frame indices) used to spill values at a stat...
GCStrategy & getStrategy()
getStrategy - Return the GC strategy for the function.
Definition: GCMetadata.h:113
const Value * getStatepoint() const
The statepoint with which this gc.relocate is associated.
Represents calls to the gc.relocate intrinsic.
Value * getDerivedPtr() const
Represents calls to the gc.result intrinsic.
Represents a gc.statepoint intrinsic call.
Definition: Statepoint.h:61
bool useStatepoints() const
Returns true if this strategy is expecting the use of gc.statepoints, and false otherwise.
Definition: GCStrategy.h:92
The landingpad instruction holds all of the information necessary to generate correct exception handl...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void markAsStatepointSpillSlotObjectIndex(int ObjectIdx)
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
A description of a memory reference used in the backend.
@ MOVolatile
The memory access is volatile.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
An SDNode that represents everything that will be needed to construct a MachineInstr.
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
SDNode * getGluedNode() const
If this node has a glue operand, return the node to which the glue operand points.
op_iterator op_end() const
op_iterator op_begin() const
Represents a use of a SDNode.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
void dump() const
EVT getValueType() const
Return the ValueType of the referenced return value.
SelectionDAGBuilder - This is the common target-independent lowering implementation that is parameter...
SDValue getValue(const Value *V)
getValue - Return an SDValue for the given Value.
MVT getFrameIndexTy()
Returns the type of FrameIndex and TargetFrameIndex nodes.
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
void LowerCallSiteWithDeoptBundleImpl(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB, bool VarArgDisallowed, bool ForceVoidReturnTy)
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI, const CallBase *Call, unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy, AttributeSet RetAttrs, bool IsPatchPoint)
Populate a CallLowerinInfo (into CLI) based on the properties of the call being lowered.
SmallVector< SDValue, 8 > PendingLoads
Loads are not emitted to the program immediately.
GCFunctionInfo * GFI
Garbage collection metadata for the function.
SDValue getRoot()
Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict) items.
void ExportFromCurrentBlock(const Value *V)
ExportFromCurrentBlock - If this condition isn't known to be exported from the current basic block,...
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
SDValue LowerAsSTATEPOINT(StatepointLoweringInfo &SI)
Lower SLI into a STATEPOINT instruction.
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
Definition: SelectionDAG.h:575
SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
const TargetLowering & getTargetLoweringInfo() const
Definition: SelectionDAG.h:501
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
void DeleteNode(SDNode *N)
Remove the specified node from the system.
void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:495
SDValue getTargetFrameIndex(int FI, EVT VT)
Definition: SelectionDAG.h:753
SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
Definition: SelectionDAG.h:496
SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
Definition: SelectionDAG.h:698
MachineFunction & getMachineFunction() const
Definition: SelectionDAG.h:490
SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVMContext * getContext() const
Definition: SelectionDAG.h:508
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
Definition: SelectionDAG.h:584
SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
Definition: SelectionDAG.h:578
size_type size() const
Determine the number of elements in the SetVector.
Definition: SetVector.h:98
Vector takeVector()
Clear the SetVector and return the underlying vector.
Definition: SetVector.h:87
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:162
SmallBitVector & set()
bool test(unsigned Idx) const
void clear()
Clear all bits.
size_type size() const
Returns the number of bits in this bitvector.
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
A SetVector that performs no allocations if smaller than a certain size.
Definition: SetVector.h:370
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition: SmallSet.h:132
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
Definition: SmallSet.h:175
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition: SmallSet.h:181
size_t size() const
Definition: SmallVector.h:78
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:683
iterator insert(iterator I, T &&Elt)
Definition: SmallVector.h:805
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
void clear()
Clear the memory usage of this object.
SDValue getLocation(SDValue Val)
Returns the spill location of a value incoming to the current statepoint.
SDValue allocateStackSlot(EVT ValueType, SelectionDAGBuilder &Builder)
Get a stack slot we can use to store an value of type ValueType.
void scheduleRelocCall(const GCRelocateInst &RelocCall)
Record the fact that we expect to encounter a given gc_relocate before the next statepoint.
void setLocation(SDValue Val, SDValue Location)
void relocCallVisited(const GCRelocateInst &RelocCall)
Remove this gc_relocate from the list we're expecting to see before the next statepoint.
void startNewStatepoint(SelectionDAGBuilder &Builder)
Reset all state tracking for a newly encountered safepoint.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
TargetOptions Options
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
static Type * getVoidTy(LLVMContext &C)
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
iterator_range< user_iterator > users()
Definition: Value.h:421
const ParentTy * getParent() const
Definition: ilist_node.h:32
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition: CallingConv.h:60
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
Definition: ISDOpcodes.h:1102
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
Definition: ISDOpcodes.h:1173
@ GC_TRANSITION_START
GC_TRANSITION_START/GC_TRANSITION_END - These operators mark the beginning and end of GC transition s...
Definition: ISDOpcodes.h:1391
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition: ISDOpcodes.h:215
@ TRAP
TRAP - Trapping instruction.
Definition: ISDOpcodes.h:1279
@ GC_TRANSITION_END
Definition: ISDOpcodes.h:1392
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1759
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2115
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
StatepointDirectives parseStatepointDirectivesFromAttrs(AttributeList AS)
Parse out statepoint directives from the function attributes present in AS.
Definition: Statepoint.cpp:24
@ MaskAll
A bitmask that includes all valid flags.
@ DeoptLiveIn
Mark the deopt arguments associated with the statepoint as only being "live-in".
@ GCTransition
Indicates that this statepoint is a transition from GC-aware code to code that is not GC-aware.
Extended Value Type.
Definition: ValueTypes.h:35
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition: ValueTypes.h:368
bool isVector() const
Return true if this is a vector value type.
Definition: ValueTypes.h:168
Helper object to track which of three possible relocation mechanisms are used for a particular value ...
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
static MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr, ISD::NodeType PreferredExtendType=ISD::ANY_EXTEND) const
Emit a series of CopyToReg nodes that copies the specified value into the registers specified by this...
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
Describes a gc.statepoint or a gc.statepoint like thing for the purposes of lowering into a STATEPOIN...
static const uint64_t DeoptBundleStatepointID
Definition: Statepoint.h:240