LLVM 24.0.0git
MipsISelLowering.h
Go to the documentation of this file.
1//===- MipsISelLowering.h - Mips DAG Lowering Interface ---------*- 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 file defines the interfaces that Mips uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_MIPS_MIPSISELLOWERING_H
15#define LLVM_LIB_TARGET_MIPS_MIPSISELLOWERING_H
16
20#include "Mips.h"
30#include "llvm/IR/CallingConv.h"
31#include "llvm/IR/InlineAsm.h"
32#include "llvm/IR/Type.h"
34#include <algorithm>
35#include <deque>
36#include <utility>
37#include <vector>
38
39namespace llvm {
40
41class Argument;
42class FastISel;
46class MachineInstr;
47class MipsCCState;
49class MipsSubtarget;
52class MCRegisterClass;
54
55 //===--------------------------------------------------------------------===//
56 // TargetLowering Implementation
57 //===--------------------------------------------------------------------===//
58
60 bool isMicroMips;
61
62 public:
63 explicit MipsTargetLowering(const MipsTargetMachine &TM,
64 const MipsSubtarget &STI);
65
66 static const MipsTargetLowering *create(const MipsTargetMachine &TM,
67 const MipsSubtarget &STI);
68
69 /// createFastISel - This method returns a target specific FastISel object,
70 /// or null if the target does not support "fast" ISel.
71 FastISel *
73 const TargetLibraryInfo *libInfo,
74 const LibcallLoweringInfo *libcallLowering) const override;
75
76 MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
77 return MVT::i32;
78 }
79
81 ISD::NodeType) const override;
82
83 bool isCheapToSpeculateCttz(Type *Ty) const override;
84 bool isCheapToSpeculateCtlz(Type *Ty) const override;
85 bool hasBitTest(SDValue X, SDValue Y) const override;
86 bool shouldFoldConstantShiftPairToMask(const SDNode *N) const override;
87
88 /// Return the register type for a given MVT, ensuring vectors are treated
89 /// as a series of gpr sized integers.
91 EVT VT) const override;
92
93 /// Return the number of registers for a given MVT, ensuring vectors are
94 /// treated as a series of gpr sized integers.
97 EVT VT) const override;
98
99 /// Break down vectors to the correct number of gpr sized integers.
101 LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
102 unsigned &NumIntermediates, MVT &RegisterVT) const override;
103
104 /// Return the correct alignment for the current calling convention.
106 const DataLayout &DL) const override {
107 const Align ABIAlign = DL.getABITypeAlign(ArgTy);
108 if (ArgTy->isVectorTy())
109 return std::min(ABIAlign, Align(8));
110 return ABIAlign;
111 }
112
114 return ISD::SIGN_EXTEND;
115 }
116
117 /// LowerOperation - Provide custom lowering hooks for some operations.
118 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
119
120 /// ReplaceNodeResults - Replace the results of node with an illegal result
121 /// type with new values built out of custom code.
122 ///
124 SelectionDAG &DAG) const override;
125
126 /// getSetCCResultType - get the ISD::SETCC result ValueType
128 EVT VT) const override;
129
130 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
131
134 MachineBasicBlock *MBB) const override;
135
137 SDNode *Node) const override;
138
139 void HandleByVal(CCState *, unsigned &, Align) const override;
140
141 Register getRegisterByName(const char* RegName, LLT VT,
142 const MachineFunction &MF) const override;
143
144 /// If a physical register, this returns the register that receives the
145 /// exception address on entry to an EH pad.
148 const Constant *PersonalityFn) const override {
149 return ABI.IsN64() ? Mips::A0_64 : Mips::A0;
150 }
151
152 /// If a physical register, this returns the register that receives the
153 /// exception typeid on entry to a landing pad.
156 const Constant *PersonalityFn) const override {
157 return ABI.IsN64() ? Mips::A1_64 : Mips::A1;
158 }
159
160 bool isJumpTableRelative() const override {
162 }
163
165
167
168 protected:
169 SDValue getGlobalReg(SelectionDAG &DAG, EVT Ty) const;
170
171 // This method creates the following nodes, which are necessary for
172 // computing a local symbol's address:
173 //
174 // (add (load (wrapper $gp, %got(sym)), %lo(sym))
175 template <class NodeTy>
176 SDValue getAddrLocal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG,
177 bool IsN32OrN64) const {
178 unsigned GOTFlag = IsN32OrN64 ? MipsII::MO_GOT_PAGE : MipsII::MO_GOT;
179 SDValue GOT = DAG.getNode(MipsISD::Wrapper, DL, Ty, getGlobalReg(DAG, Ty),
180 getTargetNode(N, Ty, DAG, GOTFlag));
181 SDValue Load =
182 DAG.getLoad(Ty, DL, DAG.getEntryNode(), GOT,
184 unsigned LoFlag = IsN32OrN64 ? MipsII::MO_GOT_OFST : MipsII::MO_ABS_LO;
185 SDValue Lo = DAG.getNode(MipsISD::Lo, DL, Ty,
186 getTargetNode(N, Ty, DAG, LoFlag));
187 return DAG.getNode(ISD::ADD, DL, Ty, Load, Lo);
188 }
189
190 // This method creates the following nodes, which are necessary for
191 // computing a global symbol's address:
192 //
193 // (load (wrapper $gp, %got(sym)))
194 template <class NodeTy>
195 SDValue getAddrGlobal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG,
196 unsigned Flag, SDValue Chain,
197 const MachinePointerInfo &PtrInfo) const {
198 SDValue Tgt = DAG.getNode(MipsISD::Wrapper, DL, Ty, getGlobalReg(DAG, Ty),
199 getTargetNode(N, Ty, DAG, Flag));
200 return DAG.getLoad(Ty, DL, Chain, Tgt, PtrInfo);
201 }
202
203 // This method creates the following nodes, which are necessary for
204 // computing a global symbol's address in large-GOT mode:
205 //
206 // (load (wrapper (add %hi(sym), $gp), %lo(sym)))
207 template <class NodeTy>
209 SelectionDAG &DAG, unsigned HiFlag,
210 unsigned LoFlag, SDValue Chain,
211 const MachinePointerInfo &PtrInfo) const {
212 SDValue Hi = DAG.getNode(MipsISD::GotHi, DL, Ty,
213 getTargetNode(N, Ty, DAG, HiFlag));
214 Hi = DAG.getNode(ISD::ADD, DL, Ty, Hi, getGlobalReg(DAG, Ty));
215 SDValue Wrapper = DAG.getNode(MipsISD::Wrapper, DL, Ty, Hi,
216 getTargetNode(N, Ty, DAG, LoFlag));
217 return DAG.getLoad(Ty, DL, Chain, Wrapper, PtrInfo);
218 }
219
220 // This method creates the following nodes, which are necessary for
221 // computing a symbol's address in non-PIC mode:
222 //
223 // (add %hi(sym), %lo(sym))
224 //
225 // This method covers O32, N32 and N64 in sym32 mode.
226 template <class NodeTy>
227 SDValue getAddrNonPIC(NodeTy *N, const SDLoc &DL, EVT Ty,
228 SelectionDAG &DAG) const {
229 SDValue Hi = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI);
230 SDValue Lo = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO);
231 return DAG.getNode(ISD::ADD, DL, Ty,
232 DAG.getNode(MipsISD::Hi, DL, Ty, Hi),
233 DAG.getNode(MipsISD::Lo, DL, Ty, Lo));
234 }
235
236 // This method creates the following nodes, which are necessary for
237 // computing a symbol's address in non-PIC mode for N64.
238 //
239 // (add (shl (add (shl (add %highest(sym), %higher(sim)), 16), %high(sym)),
240 // 16), %lo(%sym))
241 //
242 // FIXME: This method is not efficent for (micro)MIPS64R6.
243 template <class NodeTy>
244 SDValue getAddrNonPICSym64(NodeTy *N, const SDLoc &DL, EVT Ty,
245 SelectionDAG &DAG) const {
246 SDValue Hi = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI);
247 SDValue Lo = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO);
248
249 SDValue Highest =
250 DAG.getNode(MipsISD::Highest, DL, Ty,
251 getTargetNode(N, Ty, DAG, MipsII::MO_HIGHEST));
252 SDValue Higher = getTargetNode(N, Ty, DAG, MipsII::MO_HIGHER);
253 SDValue HigherPart =
254 DAG.getNode(ISD::ADD, DL, Ty, Highest,
255 DAG.getNode(MipsISD::Higher, DL, Ty, Higher));
256 SDValue Cst = DAG.getConstant(16, DL, MVT::i32);
257 SDValue Shift = DAG.getNode(ISD::SHL, DL, Ty, HigherPart, Cst);
258 SDValue Add = DAG.getNode(ISD::ADD, DL, Ty, Shift,
259 DAG.getNode(MipsISD::Hi, DL, Ty, Hi));
260 SDValue Shift2 = DAG.getNode(ISD::SHL, DL, Ty, Add, Cst);
261
262 return DAG.getNode(ISD::ADD, DL, Ty, Shift2,
263 DAG.getNode(MipsISD::Lo, DL, Ty, Lo));
264 }
265
266 // This method creates the following nodes, which are necessary for
267 // computing a symbol's address using gp-relative addressing:
268 //
269 // (add $gp, %gp_rel(sym))
270 template <class NodeTy>
271 SDValue getAddrGPRel(NodeTy *N, const SDLoc &DL, EVT Ty,
272 SelectionDAG &DAG, bool IsN64) const {
273 SDValue GPRel = getTargetNode(N, Ty, DAG, MipsII::MO_GPREL);
274 return DAG.getNode(
275 ISD::ADD, DL, Ty,
276 DAG.getRegister(IsN64 ? Mips::GP_64 : Mips::GP, Ty),
277 DAG.getNode(MipsISD::GPRel, DL, DAG.getVTList(Ty), GPRel));
278 }
279
280 // This method creates the following nodes, which are necessary for
281 // loading a dllimported symbol:
282 //
283 // (lw (add (shl(%high(sym), 16), %low(sym)))
284 template <class NodeTy>
285 SDValue getDllimportSymbol(NodeTy *N, const SDLoc &DL, EVT Ty,
286 SelectionDAG &DAG) const {
287 SDValue Hi =
288 getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI | MipsII::MO_DLLIMPORT);
289 SDValue Lo =
290 getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO | MipsII::MO_DLLIMPORT);
291 return DAG.getNode(ISD::ADD, DL, Ty, DAG.getNode(MipsISD::Lo, DL, Ty, Lo),
292 DAG.getNode(MipsISD::Hi, DL, Ty, Hi));
293 }
294
295 // This method creates the following nodes, which are necessary for
296 // loading a dllimported global variable:
297 //
298 // (lw (lw (add (shl(%high(sym), 16), %low(sym))))
299 template <class NodeTy>
301 SelectionDAG &DAG, SDValue Chain,
302 const MachinePointerInfo &PtrInfo) const {
303 return DAG.getLoad(Ty, DL, Chain, getDllimportSymbol(N, DL, Ty, DAG),
304 PtrInfo);
305 }
306
307 /// This function fills Ops, which is the list of operands that will later
308 /// be used when a function call node is created. It also generates
309 /// copyToReg nodes to set up argument registers.
310 virtual void
312 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
313 bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
314 bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
315 SDValue Chain) const;
316
317 protected:
320
321 // Subtarget Info
323 // Cache the ABI from the TargetMachine, we use it everywhere.
325
326 private:
327 // Create a TargetGlobalAddress node.
328 SDValue getTargetNode(GlobalAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
329 unsigned Flag) const;
330
331 // Create a TargetExternalSymbol node.
332 SDValue getTargetNode(ExternalSymbolSDNode *N, EVT Ty, SelectionDAG &DAG,
333 unsigned Flag) const;
334
335 // Create a TargetBlockAddress node.
336 SDValue getTargetNode(BlockAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
337 unsigned Flag) const;
338
339 // Create a TargetJumpTable node.
340 SDValue getTargetNode(JumpTableSDNode *N, EVT Ty, SelectionDAG &DAG,
341 unsigned Flag) const;
342
343 // Create a TargetConstantPool node.
344 SDValue getTargetNode(ConstantPoolSDNode *N, EVT Ty, SelectionDAG &DAG,
345 unsigned Flag) const;
346
347 // Lower Operand helpers
348 SDValue LowerCallResult(SDValue Chain, SDValue InGlue,
349 CallingConv::ID CallConv, bool isVarArg,
351 const SDLoc &dl, SelectionDAG &DAG,
354
355 // Lower Operand specifics
356 SDValue lowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
357 SDValue lowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
358 SDValue lowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
359 SDValue lowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
360 SDValue lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
361 SDValue lowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
362 SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
363 SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
364 SDValue lowerFSETCC(SDValue Op, SelectionDAG &DAG) const;
365 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
366 SDValue lowerVAARG(SDValue Op, SelectionDAG &DAG) const;
367 SDValue lowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
368 SDValue lowerFABS(SDValue Op, SelectionDAG &DAG) const;
369 SDValue lowerFABS32(SDValue Op, SelectionDAG &DAG,
370 bool HasExtractInsert) const;
371 SDValue lowerFABS64(SDValue Op, SelectionDAG &DAG,
372 bool HasExtractInsert) const;
373 SDValue lowerFCANONICALIZE(SDValue Op, SelectionDAG &DAG) const;
374 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
375 SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
376 SDValue lowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
377 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
378 SDValue lowerShiftLeftParts(SDValue Op, SelectionDAG& DAG) const;
379 SDValue lowerShiftRightParts(SDValue Op, SelectionDAG& DAG,
380 bool IsSRA) const;
381 SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
382 SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
383 SDValue lowerSTRICT_FP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
384 SDValue lowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
385
386 /// isEligibleForTailCallOptimization - Check whether the call is eligible
387 /// for tail call optimization.
388 virtual bool
389 isEligibleForTailCallOptimization(const CCState &CCInfo,
390 unsigned NextStackOffset,
391 const MipsFunctionInfo &FI) const = 0;
392
393 /// copyByValArg - Copy argument registers which were used to pass a byval
394 /// argument to the stack. Create a stack frame object for the byval
395 /// argument.
396 void copyByValRegs(SDValue Chain, const SDLoc &DL,
397 std::vector<SDValue> &OutChains, SelectionDAG &DAG,
398 const ISD::ArgFlagsTy &Flags,
400 const Argument *FuncArg, unsigned FirstReg,
401 unsigned LastReg, const CCValAssign &VA,
402 MipsCCState &State) const;
403
404 /// passByValArg - Pass a byval argument in registers or on stack.
405 void passByValArg(SDValue Chain, const SDLoc &DL,
406 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
407 SmallVectorImpl<SDValue> &MemOpChains, SDValue StackPtr,
408 MachineFrameInfo &MFI, SelectionDAG &DAG, SDValue Arg,
409 unsigned FirstReg, unsigned LastReg,
410 const ISD::ArgFlagsTy &Flags, bool isLittle,
411 const CCValAssign &VA) const;
412
413 /// writeVarArgRegs - Write variable function arguments passed in registers
414 /// to the stack. Also create a stack frame object for the first variable
415 /// argument.
416 void writeVarArgRegs(std::vector<SDValue> &OutChains, SDValue Chain,
417 const SDLoc &DL, SelectionDAG &DAG,
418 CCState &State) const;
419
420 SDValue
421 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
423 const SDLoc &dl, SelectionDAG &DAG,
424 SmallVectorImpl<SDValue> &InVals) const override;
425
426 SDValue passArgOnStack(SDValue StackPtr, unsigned Offset, SDValue Chain,
427 SDValue Arg, const SDLoc &DL, bool IsTailCall,
428 SelectionDAG &DAG) const;
429
431 SmallVectorImpl<SDValue> &InVals) const override;
432
433 bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
434 bool isVarArg,
436 LLVMContext &Context, const Type *RetTy) const override;
437
438 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
440 const SmallVectorImpl<SDValue> &OutVals,
441 const SDLoc &dl, SelectionDAG &DAG) const override;
442
443 SDValue LowerInterruptReturn(SmallVectorImpl<SDValue> &RetOps,
444 const SDLoc &DL, SelectionDAG &DAG) const;
445
446 bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const override;
447
448 // Inline asm support
449 ConstraintType getConstraintType(StringRef Constraint) const override;
450
451 /// Examine constraint string and operand type and determine a weight value.
452 /// The operand object must already have been set up with the operand type.
453 ConstraintWeight getSingleConstraintMatchWeight(
454 AsmOperandInfo &info, const char *constraint) const override;
455
456 /// This function parses registers that appear in inline-asm constraints.
457 /// It returns pair (0, 0) on failure.
458 std::pair<unsigned, const TargetRegisterClass *>
459 parseRegForInlineAsmConstraint(StringRef C, MVT VT) const;
460
461 std::pair<unsigned, const TargetRegisterClass *>
462 getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
463 StringRef Constraint, MVT VT) const override;
464
465 /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
466 /// vector. If it is invalid, don't add anything to Ops. If hasMemory is
467 /// true it means one of the asm constraint of the inline asm instruction
468 /// being processed is 'm'.
469 void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint,
470 std::vector<SDValue> &Ops,
471 SelectionDAG &DAG) const override;
472
474 getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
475 if (ConstraintCode == "o")
477 if (ConstraintCode == "R")
479 if (ConstraintCode == "ZC")
481 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
482 }
483
484 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
485 Type *Ty, unsigned AS,
486 Instruction *I = nullptr) const override;
487
488 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
489
490 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
491 const AttributeList &FuncAttributes) const override;
492
493 /// isFPImmLegal - Returns true if the target can instruction select the
494 /// specified FP immediate natively. If false, the legalizer will
495 /// materialize the FP immediate as a load from a constant pool.
496 bool isFPImmLegal(const APFloat &Imm, EVT VT,
497 bool ForCodeSize) const override;
498
499 bool isLegalICmpImmediate(int64_t Imm) const override;
500 bool isLegalAddImmediate(int64_t Imm) const override;
501
502 unsigned getJumpTableEncoding() const override;
503 SDValue getPICJumpTableRelocBase(SDValue Table,
504 SelectionDAG &DAG) const override;
505 bool useSoftFloat() const override;
506
507 bool shouldInsertFencesForAtomic(const Instruction *I) const override {
508 return true;
509 }
510
511 int getCPURegisterIndex(StringRef Name) const;
512
514
515 /// Emit a sign-extension using sll/sra, seb, or seh appropriately.
516 MachineBasicBlock *emitSignExtendToI32InReg(MachineInstr &MI,
517 MachineBasicBlock *BB,
518 unsigned Size, unsigned DstReg,
519 unsigned SrcRec) const;
520
521 MachineBasicBlock *emitAtomicBinary(MachineInstr &MI,
522 MachineBasicBlock *BB) const;
523 MachineBasicBlock *emitAtomicBinaryPartword(MachineInstr &MI,
524 MachineBasicBlock *BB,
525 unsigned Size) const;
526 MachineBasicBlock *emitAtomicCmpSwap(MachineInstr &MI,
527 MachineBasicBlock *BB) const;
528 MachineBasicBlock *emitAtomicCmpSwapPartword(MachineInstr &MI,
529 MachineBasicBlock *BB,
530 unsigned Size) const;
531 MachineBasicBlock *emitSEL_D(MachineInstr &MI, MachineBasicBlock *BB) const;
532 MachineBasicBlock *emitPseudoSELECT(MachineInstr &MI, MachineBasicBlock *BB,
533 bool isFPCmp, unsigned Opc) const;
534 MachineBasicBlock *emitPseudoD_SELECT(MachineInstr &MI,
535 MachineBasicBlock *BB) const;
536 MachineBasicBlock *emitLDR_W(MachineInstr &MI, MachineBasicBlock *BB) const;
537 MachineBasicBlock *emitLDR_D(MachineInstr &MI, MachineBasicBlock *BB) const;
538 MachineBasicBlock *emitSTR_W(MachineInstr &MI, MachineBasicBlock *BB) const;
539 MachineBasicBlock *emitSTR_D(MachineInstr &MI, MachineBasicBlock *BB) const;
540 };
541
542 /// Create MipsTargetLowering objects.
543 const MipsTargetLowering *
545 const MipsSubtarget &STI);
546 const MipsTargetLowering *
548 const MipsSubtarget &STI);
549
550namespace Mips {
551
552FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
553 const TargetLibraryInfo *libInfo,
554 const LibcallLoweringInfo *libcallLowering);
555
556} // end namespace Mips
557
558} // end namespace llvm
559
560#endif // LLVM_LIB_TARGET_MIPS_MIPSISELLOWERING_H
amdgpu aa AMDGPU Address space based Alias Analysis Wrapper
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
static bool isLegalAddImmediate(const TargetTransformInfo &TTI, Immediate Offset)
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
This file describes how to lower LLVM code to machine code.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
CCState - This class holds information needed while lowering arguments and return values.
CCValAssign - Represent assignment of one arg/retval to a location.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:67
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
MCRegisterClass - Base class of TargetRegisterClass.
Machine Value Type.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
Representation of each machine instruction.
MipsFunctionInfo - This class is derived from MachineFunction private Mips target-specific informatio...
MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Return the register type for a given MVT, ensuring vectors are treated as a series of gpr sized integ...
bool hasBitTest(SDValue X, SDValue Y) const override
Return true if the target has a bit-test instruction: (X & (1 << Y)) ==/!= 0 This knowledge can be us...
static const MipsTargetLowering * create(const MipsTargetMachine &TM, const MipsSubtarget &STI)
SDValue getAddrGPRel(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, bool IsN64) const
unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const override
Break down vectors to the correct number of gpr sized integers.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
Register getExceptionPointerRegister(ExceptionHandling EH, const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
SDValue getAddrNonPICSym64(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG) const
Register getExceptionSelectorRegister(ExceptionHandling EH, const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception typeid on entry to a la...
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
getSetCCResultType - get the ISD::SETCC result ValueType
SDValue getAddrGlobal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, unsigned Flag, SDValue Chain, const MachinePointerInfo &PtrInfo) const
MipsTargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
const MipsABIInfo & ABI
SDValue getAddrGlobalLargeGOT(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, unsigned HiFlag, unsigned LoFlag, SDValue Chain, const MachinePointerInfo &PtrInfo) const
SDValue getDllimportVariable(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, SDValue Chain, const MachinePointerInfo &PtrInfo) const
bool shouldFoldConstantShiftPairToMask(const SDNode *N) const override
Return true if it is profitable to fold a pair of shifts into a mask.
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
CCAssignFn * CCAssignFnForReturn() const
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
ReplaceNodeResults - Replace the results of node with an illegal result type with new values built ou...
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
SDValue getDllimportSymbol(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG) const
CCAssignFn * CCAssignFnForCall() const
unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Return the number of registers for a given MVT, ensuring vectors are treated as a series of gpr sized...
SDValue getAddrNonPIC(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG) const
SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering) const override
createFastISel - This method returns a target specific FastISel object, or null if the target does no...
void AdjustInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const override
This method should be implemented by targets that mark instructions with the 'hasPostISelHook' flag.
virtual void getOpndList(SmallVectorImpl< SDValue > &Ops, std::deque< std::pair< unsigned, SDValue > > &RegsToPass, bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage, bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const
This function fills Ops, which is the list of operands that will later be used when a function call n...
EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const override
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
bool isCheapToSpeculateCtlz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
LowerOperation - Provide custom lowering hooks for some operations.
bool isCheapToSpeculateCttz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
SDValue getAddrLocal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG, bool IsN32OrN64) const
SDValue getGlobalReg(SelectionDAG &DAG, EVT Ty) const
const MipsSubtarget & Subtarget
ISD::NodeType getExtendForAtomicOps() const override
Returns how the platform's atomic operations are extended (ZERO_EXTEND, SIGN_EXTEND,...
void HandleByVal(CCState *, unsigned &, Align) const override
Target-specific cleanup for formal ByVal parameters.
bool isJumpTableRelative() const override
SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const
Align getABIAlignmentForCallingConv(Type *ArgTy, const DataLayout &DL) const override
Return the correct alignment for the current calling convention.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
MachineFunction & getMachineFunction() const
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Provides information about what library functions are available for the current target.
const TargetMachine & getTargetMachine() const
virtual bool useSoftFloat() const
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
TargetLowering(const TargetLowering &)=delete
virtual ArrayRef< MCPhysReg > getRoundingControlRegisters() const
Returns a 0 terminated array of rounding control registers that can be attached into strict FP call.
virtual unsigned getJumpTableEncoding() const
Return the entry encoding for a jump table in the current function.
bool isPositionIndependent() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
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:264
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering)
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
bool CCAssignFn(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
CCAssignFn - This function assigns a location for Val, updating State to reflect the change.
@ Load
The value being inserted comes from a load (InsertElement only).
const MipsTargetLowering * createMips16TargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
Create MipsTargetLowering objects.
@ Add
Sum of integers.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
ExceptionHandling
Definition CodeGen.h:54
const MipsTargetLowering * createMipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Extended Value Type.
Definition ValueTypes.h:35
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getGOT(MachineFunction &MF)
Return a MachinePointerInfo record that refers to a GOT entry.
This contains information for each constraint that we are lowering.
This structure contains all information that is necessary for lowering calls.