LLVM 22.0.0git
SelectionDAGBuilder.h
Go to the documentation of this file.
1//===- SelectionDAGBuilder.h - Selection-DAG building -----------*- C++ -*-===//
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 routines for translating from LLVM IR into SelectionDAG IR.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H
14#define LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H
15
16#include "StatepointLowering.h"
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/MapVector.h"
29#include "llvm/IR/DebugLoc.h"
30#include "llvm/IR/Instruction.h"
34#include <algorithm>
35#include <cassert>
36#include <cstdint>
37#include <optional>
38#include <utility>
39#include <vector>
40
41namespace llvm {
42
43class AAResults;
44class AllocaInst;
45class AtomicCmpXchgInst;
46class AtomicRMWInst;
47class AssumptionCache;
48class BasicBlock;
49class BranchInst;
50class CallInst;
51class CallBrInst;
52class CatchPadInst;
53class CatchReturnInst;
54class CatchSwitchInst;
55class CleanupPadInst;
56class CleanupReturnInst;
57class Constant;
58class ConstrainedFPIntrinsic;
59class DataLayout;
60class DIExpression;
61class DILocalVariable;
62class DILocation;
63class FenceInst;
64class FunctionLoweringInfo;
65class GCFunctionInfo;
66class GCRelocateInst;
67class GCResultInst;
68class GCStatepointInst;
69class IndirectBrInst;
70class InvokeInst;
71class LandingPadInst;
72class LLVMContext;
73class LoadInst;
74class MachineBasicBlock;
75class PHINode;
76class ResumeInst;
77class ReturnInst;
78class SDDbgValue;
79class SelectionDAG;
80class StoreInst;
81class SwiftErrorValueTracking;
82class SwitchInst;
83class TargetLibraryInfo;
84class TargetMachine;
85class Type;
86class VAArgInst;
87class UnreachableInst;
88class Use;
89class User;
90class Value;
91
92//===----------------------------------------------------------------------===//
93/// SelectionDAGBuilder - This is the common target-independent lowering
94/// implementation that is parameterized by a TargetLowering object.
95///
97 /// The current instruction being visited.
98 const Instruction *CurInst = nullptr;
99
101
102 /// Maps argument value for unused arguments. This is used
103 /// to preserve debug information for incoming arguments.
104 DenseMap<const Value*, SDValue> UnusedArgNodeMap;
105
106 /// Helper type for DanglingDebugInfoMap.
107 class DanglingDebugInfo {
108 unsigned SDNodeOrder = 0;
109
110 public:
111 DILocalVariable *Variable;
113 DebugLoc dl;
114 DanglingDebugInfo() = default;
115 DanglingDebugInfo(DILocalVariable *Var, DIExpression *Expr, DebugLoc DL,
116 unsigned SDNO)
117 : SDNodeOrder(SDNO), Variable(Var), Expression(Expr),
118 dl(std::move(DL)) {}
119
120 DILocalVariable *getVariable() const { return Variable; }
121 DIExpression *getExpression() const { return Expression; }
122 DebugLoc getDebugLoc() const { return dl; }
123 unsigned getSDNodeOrder() const { return SDNodeOrder; }
124
125 /// Helper for printing DanglingDebugInfo. This hoop-jumping is to
126 /// store a Value pointer, so that we can print a whole DDI as one object.
127 /// Call SelectionDAGBuilder::printDDI instead of using directly.
128 struct Print {
129 Print(const Value *V, const DanglingDebugInfo &DDI) : V(V), DDI(DDI) {}
130 const Value *V;
131 const DanglingDebugInfo &DDI;
134 OS << "DDI(var=" << *P.DDI.getVariable();
135 if (P.V)
136 OS << ", val=" << *P.V;
137 else
138 OS << ", val=nullptr";
139
140 OS << ", expr=" << *P.DDI.getExpression()
141 << ", order=" << P.DDI.getSDNodeOrder()
142 << ", loc=" << P.DDI.getDebugLoc() << ")";
143 return OS;
144 }
145 };
146 };
147
148 /// Returns an object that defines `raw_ostream &operator<<` for printing.
149 /// Usage example:
150 //// errs() << printDDI(MyDanglingInfo) << " is dangling\n";
151 DanglingDebugInfo::Print printDDI(const Value *V,
152 const DanglingDebugInfo &DDI) {
153 return DanglingDebugInfo::Print(V, DDI);
154 }
155
156 /// Helper type for DanglingDebugInfoMap.
157 typedef std::vector<DanglingDebugInfo> DanglingDebugInfoVector;
158
159 /// Keeps track of dbg_values for which we have not yet seen the referent.
160 /// We defer handling these until we do see it.
161 MapVector<const Value*, DanglingDebugInfoVector> DanglingDebugInfoMap;
162
163 /// Cache the module flag for whether we should use debug-info assignment
164 /// tracking.
165 bool AssignmentTrackingEnabled = false;
166
167public:
168 /// Loads are not emitted to the program immediately. We bunch them up and
169 /// then emit token factor nodes when possible. This allows us to get simple
170 /// disambiguation between loads without worrying about alias analysis.
172
173 /// State used while lowering a statepoint sequence (gc_statepoint,
174 /// gc_relocate, and gc_result). See StatepointLowering.hpp/cpp for details.
176
177private:
178 /// CopyToReg nodes that copy values to virtual registers for export to other
179 /// blocks need to be emitted before any terminator instruction, but they have
180 /// no other ordering requirements. We bunch them up and the emit a single
181 /// tokenfactor for them just before terminator instructions.
182 SmallVector<SDValue, 8> PendingExports;
183
184 /// Similar to loads, nodes corresponding to constrained FP intrinsics are
185 /// bunched up and emitted when necessary. These can be moved across each
186 /// other and any (normal) memory operation (load or store), but not across
187 /// calls or instructions having unspecified side effects. As a special
188 /// case, constrained FP intrinsics using fpexcept.strict may not be deleted
189 /// even if otherwise unused, so they need to be chained before any
190 /// terminator instruction (like PendingExports). We track the latter
191 /// set of nodes in a separate list.
192 SmallVector<SDValue, 8> PendingConstrainedFP;
193 SmallVector<SDValue, 8> PendingConstrainedFPStrict;
194
195 /// Update root to include all chains from the Pending list.
196 SDValue updateRoot(SmallVectorImpl<SDValue> &Pending);
197
198 /// A unique monotonically increasing number used to order the SDNodes we
199 /// create.
200 unsigned SDNodeOrder;
201
202 /// Emit comparison and split W into two subtrees.
203 void splitWorkItem(SwitchCG::SwitchWorkList &WorkList,
205 MachineBasicBlock *SwitchMBB);
206
207 /// Lower W.
208 void lowerWorkItem(SwitchCG::SwitchWorkListItem W, Value *Cond,
209 MachineBasicBlock *SwitchMBB,
210 MachineBasicBlock *DefaultMBB);
211
212 /// Peel the top probability case if it exceeds the threshold
214 peelDominantCaseCluster(const SwitchInst &SI,
216 BranchProbability &PeeledCaseProb);
217
218private:
219 const TargetMachine &TM;
220
221public:
222 /// Lowest valid SDNodeOrder. The special case 0 is reserved for scheduling
223 /// nodes without a corresponding SDNode.
224 static const unsigned LowestSDNodeOrder = 1;
225
228 AssumptionCache *AC = nullptr;
229 const TargetLibraryInfo *LibInfo = nullptr;
230
232 public:
234 : SwitchCG::SwitchLowering(funcinfo), SDB(sdb) {}
235
239 SDB->addSuccessorWithProb(Src, Dst, Prob);
240 }
241
242 private:
243 SelectionDAGBuilder *SDB = nullptr;
244 };
245
246 // Data related to deferred switch lowerings. Used to construct additional
247 // Basic Blocks in SelectionDAGISel::FinishBasicBlock.
248 std::unique_ptr<SDAGSwitchLowering> SL;
249
250 /// A StackProtectorDescriptor structure used to communicate stack protector
251 /// information in between SelectBasicBlock and FinishBasicBlock.
253
254 // Emit PHI-node-operand constants only once even if used by multiple
255 // PHI nodes.
257
258 /// Information about the function as a whole.
260
261 /// Information about the swifterror values used throughout the function.
263
264 /// Garbage collection metadata for the function.
265 GCFunctionInfo *GFI = nullptr;
266
267 /// Map a landing pad to the call site indexes.
269
270 /// This is set to true if a call in the current block has been translated as
271 /// a tail call. In this case, no subsequent DAG nodes should be created.
272 bool HasTailCall = false;
273
275
278 : SDNodeOrder(LowestSDNodeOrder), TM(dag.getTarget()), DAG(dag),
279 SL(std::make_unique<SDAGSwitchLowering>(this, funcinfo)),
280 FuncInfo(funcinfo), SwiftError(swifterror) {}
281
283 const TargetLibraryInfo *li);
284
285 /// Clear out the current SelectionDAG and the associated state and prepare
286 /// this SelectionDAGBuilder object to be used for a new block. This doesn't
287 /// clear out information about additional blocks that are needed to complete
288 /// switch lowering or PHI node updating; that information is cleared out as
289 /// it is consumed.
290 void clear();
291
292 /// Clear the dangling debug information map. This function is separated from
293 /// the clear so that debug information that is dangling in a basic block can
294 /// be properly resolved in a different basic block. This allows the
295 /// SelectionDAG to resolve dangling debug information attached to PHI nodes.
297
298 /// Return the current virtual root of the Selection DAG, flushing any
299 /// PendingLoad items. This must be done before emitting a store or any other
300 /// memory node that may need to be ordered after any prior load instructions.
302
303 /// Similar to getMemoryRoot, but also flushes PendingConstrainedFP(Strict)
304 /// items. This must be done before emitting any call other any other node
305 /// that may need to be ordered after FP instructions due to other side
306 /// effects.
308
309 /// Similar to getRoot, but instead of flushing all the PendingLoad items,
310 /// flush all the PendingExports (and PendingConstrainedFPStrict) items.
311 /// It is necessary to do this before emitting a terminator instruction.
313
315 return SDLoc(CurInst, SDNodeOrder);
316 }
317
319 return CurInst ? CurInst->getDebugLoc() : DebugLoc();
320 }
321
323 ISD::NodeType ExtendType = ISD::ANY_EXTEND);
324
325 void visit(const Instruction &I);
326 void visitDbgInfo(const Instruction &I);
327
328 void visit(unsigned Opcode, const User &I);
329
330 /// If there was virtual register allocated for the value V emit CopyFromReg
331 /// of the specified type Ty. Return empty SDValue() otherwise.
332 SDValue getCopyFromRegs(const Value *V, Type *Ty);
333
334 /// Register a dbg_value which relies on a Value which we have not yet seen.
336 DILocalVariable *Var, DIExpression *Expr,
337 bool IsVariadic, DebugLoc DL, unsigned Order);
338
339 /// If we have dangling debug info that describes \p Variable, or an
340 /// overlapping part of variable considering the \p Expr, then this method
341 /// will drop that debug info as it isn't valid any longer.
342 void dropDanglingDebugInfo(const DILocalVariable *Variable,
343 const DIExpression *Expr);
344
345 /// If we saw an earlier dbg_value referring to V, generate the debug data
346 /// structures now that we've seen its definition.
347 void resolveDanglingDebugInfo(const Value *V, SDValue Val);
348
349 /// For the given dangling debuginfo record, perform last-ditch efforts to
350 /// resolve the debuginfo to something that is represented in this DAG. If
351 /// this cannot be done, produce an Undef debug value record.
352 void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI);
353
354 /// For a given list of Values, attempt to create and record a SDDbgValue in
355 /// the SelectionDAG.
357 DIExpression *Expr, DebugLoc DbgLoc, unsigned Order,
358 bool IsVariadic);
359
360 /// Create a record for a kill location debug intrinsic.
362 DebugLoc DbgLoc, unsigned Order);
363
366
367 /// Evict any dangling debug information, attempting to salvage it first.
369
370 SDValue getValue(const Value *V);
371
373 SDValue getValueImpl(const Value *V);
374
375 void setValue(const Value *V, SDValue NewN) {
376 SDValue &N = NodeMap[V];
377 assert(!N.getNode() && "Already set a value for this node!");
378 N = NewN;
379 }
380
381 void setUnusedArgValue(const Value *V, SDValue NewN) {
382 SDValue &N = UnusedArgNodeMap[V];
383 assert(!N.getNode() && "Already set a value for this node!");
384 N = NewN;
385 }
386
389 Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs,
391
394 MachineBasicBlock *SwitchBB,
396 BranchProbability FProb, bool InvertCond);
399 MachineBasicBlock *CurBB,
400 MachineBasicBlock *SwitchBB,
402 bool InvertCond);
403 bool ShouldEmitAsBranches(const std::vector<SwitchCG::CaseBlock> &Cases);
404 bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB);
405 void CopyToExportRegsIfNeeded(const Value *V);
406 void ExportFromCurrentBlock(const Value *V);
407 void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall,
408 bool IsMustTailCall, const BasicBlock *EHPadBB = nullptr,
409 const TargetLowering::PtrAuthInfo *PAI = nullptr);
410
411 // Lower range metadata from 0 to N to assert zext to an integer of nearest
412 // floor power of two.
414 SDValue Op);
415
417 const CallBase *Call, unsigned ArgIdx,
418 unsigned NumArgs, SDValue Callee,
419 Type *ReturnTy, AttributeSet RetAttrs,
420 bool IsPatchPoint);
421
422 std::pair<SDValue, SDValue>
424 const BasicBlock *EHPadBB = nullptr);
425
426 /// When an MBB was split during scheduling, update the
427 /// references that need to refer to the last resulting block.
429
430 /// Describes a gc.statepoint or a gc.statepoint like thing for the purposes
431 /// of lowering into a STATEPOINT node.
433 /// Bases[i] is the base pointer for Ptrs[i]. Together they denote the set
434 /// of gc pointers this STATEPOINT has to relocate.
437
438 /// The set of gc.relocate calls associated with this gc.statepoint.
440
441 /// The full list of gc-live arguments to the gc.statepoint being lowered.
443
444 /// The gc.statepoint instruction.
445 const Instruction *StatepointInstr = nullptr;
446
447 /// The list of gc transition arguments present in the gc.statepoint being
448 /// lowered.
450
451 /// The ID that the resulting STATEPOINT instruction has to report.
453
454 /// Information regarding the underlying call instruction.
456
457 /// The deoptimization state associated with this gc.statepoint call, if
458 /// any.
460
461 /// Flags associated with the meta arguments being lowered.
463
464 /// The number of patchable bytes the call needs to get lowered into.
465 unsigned NumPatchBytes = -1;
466
467 /// The exception handling unwind destination, in case this represents an
468 /// invoke of gc.statepoint.
469 const BasicBlock *EHPadBB = nullptr;
470
472 };
473
474 /// Lower \p SLI into a STATEPOINT instruction.
475 SDValue LowerAsSTATEPOINT(StatepointLoweringInfo &SI);
476
477 // This function is responsible for the whole statepoint lowering process.
478 // It uniformly handles invoke and call statepoints.
480 const BasicBlock *EHPadBB = nullptr);
481
482 void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee,
483 const BasicBlock *EHPadBB);
484
485 void LowerDeoptimizeCall(const CallInst *CI);
487
488 void LowerCallSiteWithDeoptBundleImpl(const CallBase *Call, SDValue Callee,
489 const BasicBlock *EHPadBB,
490 bool VarArgDisallowed,
491 bool ForceVoidReturnTy);
492
494 const BasicBlock *EHPadBB);
495
496 /// Returns the type of FrameIndex and TargetFrameIndex nodes.
499 }
500
501private:
502 // Terminator instructions.
503 void visitRet(const ReturnInst &I);
504 void visitBr(const BranchInst &I);
505 void visitSwitch(const SwitchInst &I);
506 void visitIndirectBr(const IndirectBrInst &I);
507 void visitUnreachable(const UnreachableInst &I);
508 void visitCleanupRet(const CleanupReturnInst &I);
509 void visitCatchSwitch(const CatchSwitchInst &I);
510 void visitCatchRet(const CatchReturnInst &I);
511 void visitCatchPad(const CatchPadInst &I);
512 void visitCleanupPad(const CleanupPadInst &CPI);
513
514 BranchProbability getEdgeProbability(const MachineBasicBlock *Src,
515 const MachineBasicBlock *Dst) const;
516 void addSuccessorWithProb(
519
520public:
523 MachineBasicBlock *ParentBB);
526 MachineBasicBlock *SwitchBB);
528 BranchProbability BranchProbToNext, Register Reg,
533 MachineBasicBlock *SwitchBB);
534
535private:
536 // These all get lowered before this pass.
537 void visitInvoke(const InvokeInst &I);
538 void visitCallBr(const CallBrInst &I);
539 void visitCallBrLandingPad(const CallInst &I);
540 void visitResume(const ResumeInst &I);
541
542 void visitUnary(const User &I, unsigned Opcode);
543 void visitFNeg(const User &I) { visitUnary(I, ISD::FNEG); }
544
545 void visitBinary(const User &I, unsigned Opcode);
546 void visitShift(const User &I, unsigned Opcode);
547 void visitAdd(const User &I) { visitBinary(I, ISD::ADD); }
548 void visitFAdd(const User &I) { visitBinary(I, ISD::FADD); }
549 void visitSub(const User &I) { visitBinary(I, ISD::SUB); }
550 void visitFSub(const User &I) { visitBinary(I, ISD::FSUB); }
551 void visitMul(const User &I) { visitBinary(I, ISD::MUL); }
552 void visitFMul(const User &I) { visitBinary(I, ISD::FMUL); }
553 void visitURem(const User &I) { visitBinary(I, ISD::UREM); }
554 void visitSRem(const User &I) { visitBinary(I, ISD::SREM); }
555 void visitFRem(const User &I) { visitBinary(I, ISD::FREM); }
556 void visitUDiv(const User &I) { visitBinary(I, ISD::UDIV); }
557 void visitSDiv(const User &I);
558 void visitFDiv(const User &I) { visitBinary(I, ISD::FDIV); }
559 void visitAnd (const User &I) { visitBinary(I, ISD::AND); }
560 void visitOr (const User &I) { visitBinary(I, ISD::OR); }
561 void visitXor (const User &I) { visitBinary(I, ISD::XOR); }
562 void visitShl (const User &I) { visitShift(I, ISD::SHL); }
563 void visitLShr(const User &I) { visitShift(I, ISD::SRL); }
564 void visitAShr(const User &I) { visitShift(I, ISD::SRA); }
565 void visitICmp(const ICmpInst &I);
566 void visitFCmp(const FCmpInst &I);
567 // Visit the conversion instructions
568 void visitTrunc(const User &I);
569 void visitZExt(const User &I);
570 void visitSExt(const User &I);
571 void visitFPTrunc(const User &I);
572 void visitFPExt(const User &I);
573 void visitFPToUI(const User &I);
574 void visitFPToSI(const User &I);
575 void visitUIToFP(const User &I);
576 void visitSIToFP(const User &I);
577 void visitPtrToAddr(const User &I);
578 void visitPtrToInt(const User &I);
579 void visitIntToPtr(const User &I);
580 void visitBitCast(const User &I);
581 void visitAddrSpaceCast(const User &I);
582
583 void visitExtractElement(const User &I);
584 void visitInsertElement(const User &I);
585 void visitShuffleVector(const User &I);
586
587 void visitExtractValue(const ExtractValueInst &I);
588 void visitInsertValue(const InsertValueInst &I);
589 void visitLandingPad(const LandingPadInst &LP);
590
591 void visitGetElementPtr(const User &I);
592 void visitSelect(const User &I);
593
594 void visitAlloca(const AllocaInst &I);
595 void visitLoad(const LoadInst &I);
596 void visitStore(const StoreInst &I);
597 void visitMaskedLoad(const CallInst &I, bool IsExpanding = false);
598 void visitMaskedStore(const CallInst &I, bool IsCompressing = false);
599 void visitMaskedGather(const CallInst &I);
600 void visitMaskedScatter(const CallInst &I);
601 void visitAtomicCmpXchg(const AtomicCmpXchgInst &I);
602 void visitAtomicRMW(const AtomicRMWInst &I);
603 void visitFence(const FenceInst &I);
604 void visitPHI(const PHINode &I);
605 void visitCall(const CallInst &I);
606 bool visitMemCmpBCmpCall(const CallInst &I);
607 bool visitMemPCpyCall(const CallInst &I);
608 bool visitMemChrCall(const CallInst &I);
609 bool visitStrCpyCall(const CallInst &I, bool isStpcpy);
610 bool visitStrCmpCall(const CallInst &I);
611 bool visitStrLenCall(const CallInst &I);
612 bool visitStrNLenCall(const CallInst &I);
613 bool visitUnaryFloatCall(const CallInst &I, unsigned Opcode);
614 bool visitBinaryFloatCall(const CallInst &I, unsigned Opcode);
615 void visitAtomicLoad(const LoadInst &I);
616 void visitAtomicStore(const StoreInst &I);
617 void visitLoadFromSwiftError(const LoadInst &I);
618 void visitStoreToSwiftError(const StoreInst &I);
619 void visitFreeze(const FreezeInst &I);
620
621 void visitInlineAsm(const CallBase &Call,
622 const BasicBlock *EHPadBB = nullptr);
623
624 bool visitEntryValueDbgValue(ArrayRef<const Value *> Values,
625 DILocalVariable *Variable, DIExpression *Expr,
626 DebugLoc DbgLoc);
627 void visitIntrinsicCall(const CallInst &I, unsigned Intrinsic);
628 void visitTargetIntrinsic(const CallInst &I, unsigned Intrinsic);
629 void visitConstrainedFPIntrinsic(const ConstrainedFPIntrinsic &FPI);
630 void visitConvergenceControl(const CallInst &I, unsigned Intrinsic);
631 void visitVectorHistogram(const CallInst &I, unsigned IntrinsicID);
632 void visitVectorExtractLastActive(const CallInst &I, unsigned Intrinsic);
633 void visitVPLoad(const VPIntrinsic &VPIntrin, EVT VT,
634 const SmallVectorImpl<SDValue> &OpValues);
635 void visitVPLoadFF(const VPIntrinsic &VPIntrin, EVT VT, EVT EVLVT,
636 const SmallVectorImpl<SDValue> &OpValues);
637 void visitVPStore(const VPIntrinsic &VPIntrin,
638 const SmallVectorImpl<SDValue> &OpValues);
639 void visitVPGather(const VPIntrinsic &VPIntrin, EVT VT,
640 const SmallVectorImpl<SDValue> &OpValues);
641 void visitVPScatter(const VPIntrinsic &VPIntrin,
642 const SmallVectorImpl<SDValue> &OpValues);
643 void visitVPStridedLoad(const VPIntrinsic &VPIntrin, EVT VT,
644 const SmallVectorImpl<SDValue> &OpValues);
645 void visitVPStridedStore(const VPIntrinsic &VPIntrin,
646 const SmallVectorImpl<SDValue> &OpValues);
647 void visitVPCmp(const VPCmpIntrinsic &VPIntrin);
648 void visitVectorPredicationIntrinsic(const VPIntrinsic &VPIntrin);
649
650 void visitVAStart(const CallInst &I);
651 void visitVAArg(const VAArgInst &I);
652 void visitVAEnd(const CallInst &I);
653 void visitVACopy(const CallInst &I);
654 void visitStackmap(const CallInst &I);
655 void visitPatchpoint(const CallBase &CB, const BasicBlock *EHPadBB = nullptr);
656
657 // These two are implemented in StatepointLowering.cpp
658 void visitGCRelocate(const GCRelocateInst &Relocate);
659 void visitGCResult(const GCResultInst &I);
660
661 void visitVectorReduce(const CallInst &I, unsigned Intrinsic);
662 void visitVectorReverse(const CallInst &I);
663 void visitVectorSplice(const CallInst &I);
664 void visitVectorInterleave(const CallInst &I, unsigned Factor);
665 void visitVectorDeinterleave(const CallInst &I, unsigned Factor);
666 void visitStepVector(const CallInst &I);
667
668 void visitUserOp1(const Instruction &I) {
669 llvm_unreachable("UserOp1 should not exist at instruction selection time!");
670 }
671 void visitUserOp2(const Instruction &I) {
672 llvm_unreachable("UserOp2 should not exist at instruction selection time!");
673 }
674
675 void processIntegerCallValue(const Instruction &I,
676 SDValue Value, bool IsSigned);
677
678 void HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
679
680 void emitInlineAsmError(const CallBase &Call, const Twine &Message);
681
682 /// An enum that states to emit func argument dbg value the kind of intrinsic
683 /// it originally had. This controls the internal behavior of
684 /// EmitFuncArgumentDbgValue.
685 enum class FuncArgumentDbgValueKind {
686 Value, // This was originally a llvm.dbg.value.
687 Declare, // This was originally a llvm.dbg.declare.
688 };
689
690 /// If V is an function argument then create corresponding DBG_VALUE machine
691 /// instruction for it now. At the end of instruction selection, they will be
692 /// inserted to the entry BB.
693 bool EmitFuncArgumentDbgValue(const Value *V, DILocalVariable *Variable,
694 DIExpression *Expr, DILocation *DL,
695 FuncArgumentDbgValueKind Kind,
696 const SDValue &N);
697
698 /// Return the next block after MBB, or nullptr if there is none.
699 MachineBasicBlock *NextBlock(MachineBasicBlock *MBB);
700
701 /// Update the DAG and DAG builder with the relevant information after
702 /// a new root node has been created which could be a tail call.
703 void updateDAGForMaybeTailCall(SDValue MaybeTC);
704
705 /// Return the appropriate SDDbgValue based on N.
706 SDDbgValue *getDbgValue(SDValue N, DILocalVariable *Variable,
707 DIExpression *Expr, const DebugLoc &dl,
708 unsigned DbgSDNodeOrder);
709
710 SDValue lowerStartEH(SDValue Chain, const BasicBlock *EHPadBB,
711 MCSymbol *&BeginLabel);
712 SDValue lowerEndEH(SDValue Chain, const InvokeInst *II,
713 const BasicBlock *EHPadBB, MCSymbol *BeginLabel);
714};
715
716/// This struct represents the registers (physical or virtual)
717/// that a particular set of values is assigned, and the type information about
718/// the value. The most common situation is to represent one value at a time,
719/// but struct or array values are handled element-wise as multiple values. The
720/// splitting of aggregates is performed recursively, so that we never have
721/// aggregate-typed registers. The values at this point do not necessarily have
722/// legal types, so each value may require one or more registers of some legal
723/// type.
724///
726 /// The value types of the values, which may not be legal, and
727 /// may need be promoted or synthesized from one or more registers.
729
730 /// The value types of the registers. This is the same size as ValueVTs and it
731 /// records, for each value, what the type of the assigned register or
732 /// registers are. (Individual values are never synthesized from more than one
733 /// type of register.)
734 ///
735 /// With virtual registers, the contents of RegVTs is redundant with TLI's
736 /// getRegisterType member function, however when with physical registers
737 /// it is necessary to have a separate record of the types.
739
740 /// This list holds the registers assigned to the values.
741 /// Each legal or promoted value requires one register, and each
742 /// expanded value requires multiple registers.
744
745 /// This list holds the number of registers for each value.
747
748 /// Records if this value needs to be treated in an ABI dependant manner,
749 /// different to normal type legalization.
750 std::optional<CallingConv::ID> CallConv;
751
752 RegsForValue() = default;
753 RegsForValue(const SmallVector<Register, 4> &regs, MVT regvt, EVT valuevt,
754 std::optional<CallingConv::ID> CC = std::nullopt);
755 RegsForValue(LLVMContext &Context, const TargetLowering &TLI,
756 const DataLayout &DL, Register Reg, Type *Ty,
757 std::optional<CallingConv::ID> CC);
758
759 bool isABIMangled() const { return CallConv.has_value(); }
760
761 /// Add the specified values to this one.
762 void append(const RegsForValue &RHS) {
763 ValueVTs.append(RHS.ValueVTs.begin(), RHS.ValueVTs.end());
764 RegVTs.append(RHS.RegVTs.begin(), RHS.RegVTs.end());
765 Regs.append(RHS.Regs.begin(), RHS.Regs.end());
766 RegCount.push_back(RHS.Regs.size());
767 }
768
769 /// Emit a series of CopyFromReg nodes that copies from this value and returns
770 /// the result as a ValueVTs value. This uses Chain/Flag as the input and
771 /// updates them for the output Chain/Flag. If the Flag pointer is NULL, no
772 /// flag is used.
774 const SDLoc &dl, SDValue &Chain, SDValue *Glue,
775 const Value *V = nullptr) const;
776
777 /// Emit a series of CopyToReg nodes that copies the specified value into the
778 /// registers specified by this object. This uses Chain/Flag as the input and
779 /// updates them for the output Chain/Flag. If the Flag pointer is nullptr, no
780 /// flag is used. If V is not nullptr, then it is used in printing better
781 /// diagnostic messages on error.
782 void getCopyToRegs(SDValue Val, SelectionDAG &DAG, const SDLoc &dl,
783 SDValue &Chain, SDValue *Glue, const Value *V = nullptr,
784 ISD::NodeType PreferredExtendType = ISD::ANY_EXTEND) const;
785
786 /// Add this value to the specified inlineasm node operand list. This adds the
787 /// code marker, matching input operand index (if applicable), and includes
788 /// the number of values added into it.
789 void AddInlineAsmOperands(InlineAsm::Kind Code, bool HasMatching,
790 unsigned MatchingIdx, const SDLoc &dl,
791 SelectionDAG &DAG, std::vector<SDValue> &Ops) const;
792
793 /// Check if the total RegCount is greater than one.
794 bool occupiesMultipleRegs() const {
795 return std::accumulate(RegCount.begin(), RegCount.end(), 0) > 1;
796 }
797
798 /// Return a list of registers and their sizes.
800};
801
802} // end namespace llvm
803
804#endif // LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
RelocType Type
Definition: COFFYAML.cpp:410
This file defines the DenseMap class.
#define I(x, y, z)
Definition: MD5.cpp:58
Register Reg
This file implements a map that provides insertion order iteration.
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
raw_pwrite_stream & OS
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
Value * RHS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
Conditional or Unconditional Branch instruction.
static BranchProbability getUnknown()
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
DWARF expression.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
A debug info location.
Definition: DebugLoc.h:124
Class representing an expression and its matching format.
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Garbage collection metadata for a single function.
Definition: GCMetadata.h:80
Represents a gc.statepoint intrinsic call.
Definition: Statepoint.h:61
Indirect Branch Instruction.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
Definition: Instruction.h:513
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:68
Machine Value Type.
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
Resume the propagation of an exception.
Return a value (possibly void), from a function.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDAGSwitchLowering(SelectionDAGBuilder *sdb, FunctionLoweringInfo &funcinfo)
void addSuccessorWithProb(MachineBasicBlock *Src, MachineBasicBlock *Dst, BranchProbability Prob=BranchProbability::getUnknown()) override
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.
DenseMap< const Constant *, Register > ConstantsOut
void addDanglingDebugInfo(SmallVectorImpl< Value * > &Values, DILocalVariable *Var, DIExpression *Expr, bool IsVariadic, DebugLoc DL, unsigned Order)
Register a dbg_value which relies on a Value which we have not yet seen.
void visitDbgInfo(const Instruction &I)
void clearDanglingDebugInfo()
Clear the dangling debug information map.
StackProtectorDescriptor SPDescriptor
A StackProtectorDescriptor structure used to communicate stack protector information in between Selec...
void LowerCallTo(const CallBase &CB, SDValue Callee, bool IsTailCall, bool IsMustTailCall, const BasicBlock *EHPadBB=nullptr, const TargetLowering::PtrAuthInfo *PAI=nullptr)
void clear()
Clear out the current SelectionDAG and the associated state and prepare this SelectionDAGBuilder obje...
MVT getFrameIndexTy()
Returns the type of FrameIndex and TargetFrameIndex nodes.
void visitBitTestHeader(SwitchCG::BitTestBlock &B, MachineBasicBlock *SwitchBB)
visitBitTestHeader - This function emits necessary code to produce value suitable for "bit tests"
void LowerStatepoint(const GCStatepointInst &I, const BasicBlock *EHPadBB=nullptr)
std::unique_ptr< SDAGSwitchLowering > SL
SDValue lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op)
bool HasTailCall
This is set to true if a call in the current block has been translated as a tail call.
bool ShouldEmitAsBranches(const std::vector< SwitchCG::CaseBlock > &Cases)
If the set of cases should be emitted as a series of branches, return true.
void EmitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
EmitBranchForMergedCondition - Helper method for FindMergedConditions.
void LowerDeoptimizeCall(const CallInst *CI)
void LowerCallSiteWithDeoptBundle(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB)
SwiftErrorValueTracking & SwiftError
Information about the swifterror values used throughout the function.
SDValue getNonRegisterValue(const Value *V)
getNonRegisterValue - Return an SDValue for the given Value, but don't look in FuncInfo....
DenseMap< MachineBasicBlock *, SmallVector< unsigned, 4 > > LPadToCallSiteMap
Map a landing pad to the call site indexes.
void LowerCallSiteWithDeoptBundleImpl(const CallBase *Call, SDValue Callee, const BasicBlock *EHPadBB, bool VarArgDisallowed, bool ForceVoidReturnTy)
void handleDebugDeclare(Value *Address, DILocalVariable *Variable, DIExpression *Expression, DebugLoc DL)
void setUnusedArgValue(const Value *V, SDValue NewN)
bool shouldKeepJumpConditionsTogether(const FunctionLoweringInfo &FuncInfo, const BranchInst &I, Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, TargetLoweringBase::CondMergingParams Params) const
StatepointLoweringState StatepointLowering
State used while lowering a statepoint sequence (gc_statepoint, gc_relocate, and gc_result).
void visitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB, BranchProbability BranchProbToNext, Register Reg, SwitchCG::BitTestCase &B, MachineBasicBlock *SwitchBB)
visitBitTestCase - this function produces one "bit test"
SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo, SwiftErrorValueTracking &swifterror, CodeGenOptLevel ol)
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.
void CopyValueToVirtualRegister(const Value *V, Register Reg, ISD::NodeType ExtendType=ISD::ANY_EXTEND)
void salvageUnresolvedDbgValue(const Value *V, DanglingDebugInfo &DDI)
For the given dangling debuginfo record, perform last-ditch efforts to resolve the debuginfo to somet...
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,...
void init(GCFunctionInfo *gfi, BatchAAResults *BatchAA, AssumptionCache *AC, const TargetLibraryInfo *li)
void resolveOrClearDbgInfo()
Evict any dangling debug information, attempting to salvage it first.
std::pair< SDValue, SDValue > lowerInvokable(TargetLowering::CallLoweringInfo &CLI, const BasicBlock *EHPadBB=nullptr)
SDValue getMemoryRoot()
Return the current virtual root of the Selection DAG, flushing any PendingLoad items.
void resolveDanglingDebugInfo(const Value *V, SDValue Val)
If we saw an earlier dbg_value referring to V, generate the debug data structures now that we've seen...
void visit(const Instruction &I)
void dropDanglingDebugInfo(const DILocalVariable *Variable, const DIExpression *Expr)
If we have dangling debug info that describes Variable, or an overlapping part of variable considerin...
SDValue getCopyFromRegs(const Value *V, Type *Ty)
If there was virtual register allocated for the value V emit CopyFromReg of the specified type Ty.
void CopyToExportRegsIfNeeded(const Value *V)
CopyToExportRegsIfNeeded - If the given value has virtual registers created for it,...
void handleKillDebugValue(DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order)
Create a record for a kill location debug intrinsic.
void visitJumpTable(SwitchCG::JumpTable &JT)
visitJumpTable - Emit JumpTable node in the current MBB
void visitJumpTableHeader(SwitchCG::JumpTable &JT, SwitchCG::JumpTableHeader &JTH, MachineBasicBlock *SwitchBB)
visitJumpTableHeader - This function emits necessary code to produce index in the JumpTable from swit...
void LowerCallSiteWithPtrAuthBundle(const CallBase &CB, const BasicBlock *EHPadBB)
static const unsigned LowestSDNodeOrder
Lowest valid SDNodeOrder.
FunctionLoweringInfo & FuncInfo
Information about the function as a whole.
void setValue(const Value *V, SDValue NewN)
void FindMergedConditions(const Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB, Instruction::BinaryOps Opc, BranchProbability TProb, BranchProbability FProb, bool InvertCond)
const TargetLibraryInfo * LibInfo
bool isExportableFromCurrentBlock(const Value *V, const BasicBlock *FromBB)
void visitSPDescriptorParent(StackProtectorDescriptor &SPD, MachineBasicBlock *ParentBB)
Codegen a new tail for a stack protector check ParentMBB which has had its tail spliced into a stack ...
bool handleDebugValue(ArrayRef< const Value * > Values, DILocalVariable *Var, DIExpression *Expr, DebugLoc DbgLoc, unsigned Order, bool IsVariadic)
For a given list of Values, attempt to create and record a SDDbgValue in the SelectionDAG.
SDValue getControlRoot()
Similar to getRoot, but instead of flushing all the PendingLoad items, flush all the PendingExports (...
void UpdateSplitBlock(MachineBasicBlock *First, MachineBasicBlock *Last)
When an MBB was split during scheduling, update the references that need to refer to the last resulti...
SDValue getValueImpl(const Value *V)
getValueImpl - Helper function for getValue and getNonRegisterValue.
void visitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB)
visitSwitchCase - Emits the necessary code to represent a single node in the binary search tree resul...
SDValue LowerAsSTATEPOINT(StatepointLoweringInfo &SI)
Lower SLI into a STATEPOINT instruction.
void visitSPDescriptorFailure(StackProtectorDescriptor &SPD)
Codegen the failure basic block for a stack protector check.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:229
const TargetLowering & getTargetLoweringInfo() const
Definition: SelectionDAG.h:504
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:498
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
This class tracks both per-statepoint and per-selectiondag information.
SwitchLowering(FunctionLoweringInfo &funcinfo)
Multiway switch.
Provides information about what library functions are available for the current target.
MVT getFrameIndexTy(const DataLayout &DL) const
Return the type for frame index, which is determined by the alloca address space specified through th...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:83
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
This function has undefined behavior.
LLVM Value Representation.
Definition: Value.h:75
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition: ISDOpcodes.h:41
@ ADD
Simple integer binary arithmetic operators.
Definition: ISDOpcodes.h:259
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition: ISDOpcodes.h:835
@ FADD
Simple binary floating point operators.
Definition: ISDOpcodes.h:410
@ FNEG
Perform various unary floating-point operations inspired by libm.
Definition: ISDOpcodes.h:1002
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:81
@ SHL
Shift and rotation operations.
Definition: ISDOpcodes.h:756
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition: ISDOpcodes.h:730
std::vector< CaseCluster > CaseClusterVector
@ User
could "use" a pointer
NodeAddr< UseNode * > Use
Definition: RDFGraph.h:385
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:82
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
StatepointFlags
The statepoint intrinsic accepts a set of flags as its third argument.
Definition: Statepoint.h:39
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:856
#define N
Extended Value Type.
Definition: ValueTypes.h:35
This struct represents the registers (physical or virtual) that a particular set of values is assigne...
SmallVector< std::pair< Register, TypeSize >, 4 > getRegsAndSizes() const
Return a list of registers and their sizes.
RegsForValue()=default
SmallVector< unsigned, 4 > RegCount
This list holds the number of registers for each value.
SmallVector< EVT, 4 > ValueVTs
The value types of the values, which may not be legal, and may need be promoted or synthesized from o...
void append(const RegsForValue &RHS)
Add the specified values to this one.
SmallVector< Register, 4 > Regs
This list holds the registers assigned to the values.
void AddInlineAsmOperands(InlineAsm::Kind Code, bool HasMatching, unsigned MatchingIdx, const SDLoc &dl, SelectionDAG &DAG, std::vector< SDValue > &Ops) const
Add this value to the specified inlineasm node operand list.
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo, const SDLoc &dl, SDValue &Chain, SDValue *Glue, const Value *V=nullptr) const
Emit a series of CopyFromReg nodes that copies from this value and returns the result as a ValueVTs v...
SmallVector< MVT, 4 > RegVTs
The value types of the registers.
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...
std::optional< CallingConv::ID > CallConv
Records if this value needs to be treated in an ABI dependant manner, different to normal type legali...
bool occupiesMultipleRegs() const
Check if the total RegCount is greater than one.
Print(const Value *V, const DanglingDebugInfo &DDI)
friend raw_ostream & operator<<(raw_ostream &OS, const DanglingDebugInfo::Print &P)
Describes a gc.statepoint or a gc.statepoint like thing for the purposes of lowering into a STATEPOIN...
unsigned NumPatchBytes
The number of patchable bytes the call needs to get lowered into.
ArrayRef< const Use > GCTransitionArgs
The list of gc transition arguments present in the gc.statepoint being lowered.
ArrayRef< const Use > GCLives
The full list of gc-live arguments to the gc.statepoint being lowered.
const BasicBlock * EHPadBB
The exception handling unwind destination, in case this represents an invoke of gc....
ArrayRef< const Use > DeoptState
The deoptimization state associated with this gc.statepoint call, if any.
TargetLowering::CallLoweringInfo CLI
Information regarding the underlying call instruction.
SmallVector< const GCRelocateInst *, 16 > GCRelocates
The set of gc.relocate calls associated with this gc.statepoint.
const Instruction * StatepointInstr
The gc.statepoint instruction.
SmallVector< const Value *, 16 > Bases
Bases[i] is the base pointer for Ptrs[i].
This structure is used to communicate between SelectionDAGBuilder and SDISel for the code generation ...
This structure contains all information that is necessary for lowering calls.
This structure contains the information necessary for lowering pointer-authenticating indirect calls.