LLVM 22.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;
53
54 //===--------------------------------------------------------------------===//
55 // TargetLowering Implementation
56 //===--------------------------------------------------------------------===//
57
59 bool isMicroMips;
60
61 public:
62 explicit MipsTargetLowering(const MipsTargetMachine &TM,
63 const MipsSubtarget &STI);
64
65 static const MipsTargetLowering *create(const MipsTargetMachine &TM,
66 const MipsSubtarget &STI);
67
68 /// createFastISel - This method returns a target specific FastISel object,
69 /// or null if the target does not support "fast" ISel.
71 const TargetLibraryInfo *libInfo) const override;
72
73 MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
74 return MVT::i32;
75 }
76
78 ISD::NodeType) const override;
79
80 bool isCheapToSpeculateCttz(Type *Ty) const override;
81 bool isCheapToSpeculateCtlz(Type *Ty) const override;
82 bool hasBitTest(SDValue X, SDValue Y) const override;
83 bool shouldFoldConstantShiftPairToMask(const SDNode *N) const override;
84
85 /// Return the register type for a given MVT, ensuring vectors are treated
86 /// as a series of gpr sized integers.
88 EVT VT) const override;
89
90 /// Return the number of registers for a given MVT, ensuring vectors are
91 /// treated as a series of gpr sized integers.
94 EVT VT) const override;
95
96 /// Break down vectors to the correct number of gpr sized integers.
98 LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
99 unsigned &NumIntermediates, MVT &RegisterVT) const override;
100
101 /// Return the correct alignment for the current calling convention.
103 const DataLayout &DL) const override {
104 const Align ABIAlign = DL.getABITypeAlign(ArgTy);
105 if (ArgTy->isVectorTy())
106 return std::min(ABIAlign, Align(8));
107 return ABIAlign;
108 }
109
111 return ISD::SIGN_EXTEND;
112 }
113
114 /// LowerOperation - Provide custom lowering hooks for some operations.
115 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
116
117 /// ReplaceNodeResults - Replace the results of node with an illegal result
118 /// type with new values built out of custom code.
119 ///
121 SelectionDAG &DAG) const override;
122
123 /// getSetCCResultType - get the ISD::SETCC result ValueType
125 EVT VT) const override;
126
127 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
128
131 MachineBasicBlock *MBB) const override;
132
134 SDNode *Node) const override;
135
136 void HandleByVal(CCState *, unsigned &, Align) const override;
137
138 Register getRegisterByName(const char* RegName, LLT VT,
139 const MachineFunction &MF) const override;
140
141 /// If a physical register, this returns the register that receives the
142 /// exception address on entry to an EH pad.
144 getExceptionPointerRegister(const Constant *PersonalityFn) const override {
145 return ABI.IsN64() ? Mips::A0_64 : Mips::A0;
146 }
147
148 /// If a physical register, this returns the register that receives the
149 /// exception typeid on entry to a landing pad.
151 getExceptionSelectorRegister(const Constant *PersonalityFn) const override {
152 return ABI.IsN64() ? Mips::A1_64 : Mips::A1;
153 }
154
155 bool softPromoteHalfType() const override { return true; }
156
157 bool isJumpTableRelative() const override {
159 }
160
162
164
165 protected:
166 SDValue getGlobalReg(SelectionDAG &DAG, EVT Ty) const;
167
168 // This method creates the following nodes, which are necessary for
169 // computing a local symbol's address:
170 //
171 // (add (load (wrapper $gp, %got(sym)), %lo(sym))
172 template <class NodeTy>
173 SDValue getAddrLocal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG,
174 bool IsN32OrN64) const {
175 unsigned GOTFlag = IsN32OrN64 ? MipsII::MO_GOT_PAGE : MipsII::MO_GOT;
176 SDValue GOT = DAG.getNode(MipsISD::Wrapper, DL, Ty, getGlobalReg(DAG, Ty),
177 getTargetNode(N, Ty, DAG, GOTFlag));
178 SDValue Load =
179 DAG.getLoad(Ty, DL, DAG.getEntryNode(), GOT,
181 unsigned LoFlag = IsN32OrN64 ? MipsII::MO_GOT_OFST : MipsII::MO_ABS_LO;
182 SDValue Lo = DAG.getNode(MipsISD::Lo, DL, Ty,
183 getTargetNode(N, Ty, DAG, LoFlag));
184 return DAG.getNode(ISD::ADD, DL, Ty, Load, Lo);
185 }
186
187 // This method creates the following nodes, which are necessary for
188 // computing a global symbol's address:
189 //
190 // (load (wrapper $gp, %got(sym)))
191 template <class NodeTy>
192 SDValue getAddrGlobal(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG,
193 unsigned Flag, SDValue Chain,
194 const MachinePointerInfo &PtrInfo) const {
195 SDValue Tgt = DAG.getNode(MipsISD::Wrapper, DL, Ty, getGlobalReg(DAG, Ty),
196 getTargetNode(N, Ty, DAG, Flag));
197 return DAG.getLoad(Ty, DL, Chain, Tgt, PtrInfo);
198 }
199
200 // This method creates the following nodes, which are necessary for
201 // computing a global symbol's address in large-GOT mode:
202 //
203 // (load (wrapper (add %hi(sym), $gp), %lo(sym)))
204 template <class NodeTy>
206 SelectionDAG &DAG, unsigned HiFlag,
207 unsigned LoFlag, SDValue Chain,
208 const MachinePointerInfo &PtrInfo) const {
209 SDValue Hi = DAG.getNode(MipsISD::GotHi, DL, Ty,
210 getTargetNode(N, Ty, DAG, HiFlag));
211 Hi = DAG.getNode(ISD::ADD, DL, Ty, Hi, getGlobalReg(DAG, Ty));
212 SDValue Wrapper = DAG.getNode(MipsISD::Wrapper, DL, Ty, Hi,
213 getTargetNode(N, Ty, DAG, LoFlag));
214 return DAG.getLoad(Ty, DL, Chain, Wrapper, PtrInfo);
215 }
216
217 // This method creates the following nodes, which are necessary for
218 // computing a symbol's address in non-PIC mode:
219 //
220 // (add %hi(sym), %lo(sym))
221 //
222 // This method covers O32, N32 and N64 in sym32 mode.
223 template <class NodeTy>
224 SDValue getAddrNonPIC(NodeTy *N, const SDLoc &DL, EVT Ty,
225 SelectionDAG &DAG) const {
226 SDValue Hi = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI);
227 SDValue Lo = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO);
228 return DAG.getNode(ISD::ADD, DL, Ty,
229 DAG.getNode(MipsISD::Hi, DL, Ty, Hi),
230 DAG.getNode(MipsISD::Lo, DL, Ty, Lo));
231 }
232
233 // This method creates the following nodes, which are necessary for
234 // computing a symbol's address in non-PIC mode for N64.
235 //
236 // (add (shl (add (shl (add %highest(sym), %higher(sim)), 16), %high(sym)),
237 // 16), %lo(%sym))
238 //
239 // FIXME: This method is not efficent for (micro)MIPS64R6.
240 template <class NodeTy>
241 SDValue getAddrNonPICSym64(NodeTy *N, const SDLoc &DL, EVT Ty,
242 SelectionDAG &DAG) const {
243 SDValue Hi = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI);
244 SDValue Lo = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO);
245
246 SDValue Highest =
247 DAG.getNode(MipsISD::Highest, DL, Ty,
248 getTargetNode(N, Ty, DAG, MipsII::MO_HIGHEST));
249 SDValue Higher = getTargetNode(N, Ty, DAG, MipsII::MO_HIGHER);
250 SDValue HigherPart =
251 DAG.getNode(ISD::ADD, DL, Ty, Highest,
252 DAG.getNode(MipsISD::Higher, DL, Ty, Higher));
253 SDValue Cst = DAG.getConstant(16, DL, MVT::i32);
254 SDValue Shift = DAG.getNode(ISD::SHL, DL, Ty, HigherPart, Cst);
255 SDValue Add = DAG.getNode(ISD::ADD, DL, Ty, Shift,
256 DAG.getNode(MipsISD::Hi, DL, Ty, Hi));
257 SDValue Shift2 = DAG.getNode(ISD::SHL, DL, Ty, Add, Cst);
258
259 return DAG.getNode(ISD::ADD, DL, Ty, Shift2,
260 DAG.getNode(MipsISD::Lo, DL, Ty, Lo));
261 }
262
263 // This method creates the following nodes, which are necessary for
264 // computing a symbol's address using gp-relative addressing:
265 //
266 // (add $gp, %gp_rel(sym))
267 template <class NodeTy>
268 SDValue getAddrGPRel(NodeTy *N, const SDLoc &DL, EVT Ty,
269 SelectionDAG &DAG, bool IsN64) const {
270 SDValue GPRel = getTargetNode(N, Ty, DAG, MipsII::MO_GPREL);
271 return DAG.getNode(
272 ISD::ADD, DL, Ty,
273 DAG.getRegister(IsN64 ? Mips::GP_64 : Mips::GP, Ty),
274 DAG.getNode(MipsISD::GPRel, DL, DAG.getVTList(Ty), GPRel));
275 }
276
277 // This method creates the following nodes, which are necessary for
278 // loading a dllimported symbol:
279 //
280 // (lw (add (shl(%high(sym), 16), %low(sym)))
281 template <class NodeTy>
282 SDValue getDllimportSymbol(NodeTy *N, const SDLoc &DL, EVT Ty,
283 SelectionDAG &DAG) const {
284 SDValue Hi =
285 getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI | MipsII::MO_DLLIMPORT);
286 SDValue Lo =
287 getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO | MipsII::MO_DLLIMPORT);
288 return DAG.getNode(ISD::ADD, DL, Ty, DAG.getNode(MipsISD::Lo, DL, Ty, Lo),
289 DAG.getNode(MipsISD::Hi, DL, Ty, Hi));
290 }
291
292 // This method creates the following nodes, which are necessary for
293 // loading a dllimported global variable:
294 //
295 // (lw (lw (add (shl(%high(sym), 16), %low(sym))))
296 template <class NodeTy>
298 SelectionDAG &DAG, SDValue Chain,
299 const MachinePointerInfo &PtrInfo) const {
300 return DAG.getLoad(Ty, DL, Chain, getDllimportSymbol(N, DL, Ty, DAG),
301 PtrInfo);
302 }
303
304 /// This function fills Ops, which is the list of operands that will later
305 /// be used when a function call node is created. It also generates
306 /// copyToReg nodes to set up argument registers.
307 virtual void
309 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
310 bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage,
311 bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee,
312 SDValue Chain) const;
313
314 protected:
317
318 // Subtarget Info
320 // Cache the ABI from the TargetMachine, we use it everywhere.
322
323 private:
324 // Create a TargetGlobalAddress node.
325 SDValue getTargetNode(GlobalAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
326 unsigned Flag) const;
327
328 // Create a TargetExternalSymbol node.
329 SDValue getTargetNode(ExternalSymbolSDNode *N, EVT Ty, SelectionDAG &DAG,
330 unsigned Flag) const;
331
332 // Create a TargetBlockAddress node.
333 SDValue getTargetNode(BlockAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
334 unsigned Flag) const;
335
336 // Create a TargetJumpTable node.
337 SDValue getTargetNode(JumpTableSDNode *N, EVT Ty, SelectionDAG &DAG,
338 unsigned Flag) const;
339
340 // Create a TargetConstantPool node.
341 SDValue getTargetNode(ConstantPoolSDNode *N, EVT Ty, SelectionDAG &DAG,
342 unsigned Flag) const;
343
344 // Lower Operand helpers
345 SDValue LowerCallResult(SDValue Chain, SDValue InGlue,
346 CallingConv::ID CallConv, bool isVarArg,
348 const SDLoc &dl, SelectionDAG &DAG,
351
352 // Lower Operand specifics
353 SDValue lowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
354 SDValue lowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
355 SDValue lowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
356 SDValue lowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
357 SDValue lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
358 SDValue lowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
359 SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG) const;
360 SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
361 SDValue lowerFSETCC(SDValue Op, SelectionDAG &DAG) const;
362 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
363 SDValue lowerVAARG(SDValue Op, SelectionDAG &DAG) const;
364 SDValue lowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
365 SDValue lowerFABS(SDValue Op, SelectionDAG &DAG) const;
366 SDValue lowerFABS32(SDValue Op, SelectionDAG &DAG,
367 bool HasExtractInsert) const;
368 SDValue lowerFABS64(SDValue Op, SelectionDAG &DAG,
369 bool HasExtractInsert) const;
370 SDValue lowerFCANONICALIZE(SDValue Op, SelectionDAG &DAG) const;
371 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
372 SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
373 SDValue lowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
374 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
375 SDValue lowerShiftLeftParts(SDValue Op, SelectionDAG& DAG) const;
376 SDValue lowerShiftRightParts(SDValue Op, SelectionDAG& DAG,
377 bool IsSRA) const;
378 SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
379 SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
380 SDValue lowerSTRICT_FP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
381 SDValue lowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
382
383 /// isEligibleForTailCallOptimization - Check whether the call is eligible
384 /// for tail call optimization.
385 virtual bool
386 isEligibleForTailCallOptimization(const CCState &CCInfo,
387 unsigned NextStackOffset,
388 const MipsFunctionInfo &FI) const = 0;
389
390 /// copyByValArg - Copy argument registers which were used to pass a byval
391 /// argument to the stack. Create a stack frame object for the byval
392 /// argument.
393 void copyByValRegs(SDValue Chain, const SDLoc &DL,
394 std::vector<SDValue> &OutChains, SelectionDAG &DAG,
395 const ISD::ArgFlagsTy &Flags,
397 const Argument *FuncArg, unsigned FirstReg,
398 unsigned LastReg, const CCValAssign &VA,
399 MipsCCState &State) const;
400
401 /// passByValArg - Pass a byval argument in registers or on stack.
402 void passByValArg(SDValue Chain, const SDLoc &DL,
403 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
404 SmallVectorImpl<SDValue> &MemOpChains, SDValue StackPtr,
405 MachineFrameInfo &MFI, SelectionDAG &DAG, SDValue Arg,
406 unsigned FirstReg, unsigned LastReg,
407 const ISD::ArgFlagsTy &Flags, bool isLittle,
408 const CCValAssign &VA) const;
409
410 /// writeVarArgRegs - Write variable function arguments passed in registers
411 /// to the stack. Also create a stack frame object for the first variable
412 /// argument.
413 void writeVarArgRegs(std::vector<SDValue> &OutChains, SDValue Chain,
414 const SDLoc &DL, SelectionDAG &DAG,
415 CCState &State) const;
416
417 SDValue
418 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
420 const SDLoc &dl, SelectionDAG &DAG,
421 SmallVectorImpl<SDValue> &InVals) const override;
422
423 SDValue passArgOnStack(SDValue StackPtr, unsigned Offset, SDValue Chain,
424 SDValue Arg, const SDLoc &DL, bool IsTailCall,
425 SelectionDAG &DAG) const;
426
428 SmallVectorImpl<SDValue> &InVals) const override;
429
430 bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
431 bool isVarArg,
433 LLVMContext &Context, const Type *RetTy) const override;
434
435 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
437 const SmallVectorImpl<SDValue> &OutVals,
438 const SDLoc &dl, SelectionDAG &DAG) const override;
439
440 SDValue LowerInterruptReturn(SmallVectorImpl<SDValue> &RetOps,
441 const SDLoc &DL, SelectionDAG &DAG) const;
442
443 bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const override;
444
445 // Inline asm support
446 ConstraintType getConstraintType(StringRef Constraint) const override;
447
448 /// Examine constraint string and operand type and determine a weight value.
449 /// The operand object must already have been set up with the operand type.
450 ConstraintWeight getSingleConstraintMatchWeight(
451 AsmOperandInfo &info, const char *constraint) const override;
452
453 /// This function parses registers that appear in inline-asm constraints.
454 /// It returns pair (0, 0) on failure.
455 std::pair<unsigned, const TargetRegisterClass *>
456 parseRegForInlineAsmConstraint(StringRef C, MVT VT) const;
457
458 std::pair<unsigned, const TargetRegisterClass *>
459 getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
460 StringRef Constraint, MVT VT) const override;
461
462 /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
463 /// vector. If it is invalid, don't add anything to Ops. If hasMemory is
464 /// true it means one of the asm constraint of the inline asm instruction
465 /// being processed is 'm'.
466 void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint,
467 std::vector<SDValue> &Ops,
468 SelectionDAG &DAG) const override;
469
471 getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
472 if (ConstraintCode == "o")
474 if (ConstraintCode == "R")
476 if (ConstraintCode == "ZC")
478 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
479 }
480
481 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
482 Type *Ty, unsigned AS,
483 Instruction *I = nullptr) const override;
484
485 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
486
487 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
488 const AttributeList &FuncAttributes) const override;
489
490 /// isFPImmLegal - Returns true if the target can instruction select the
491 /// specified FP immediate natively. If false, the legalizer will
492 /// materialize the FP immediate as a load from a constant pool.
493 bool isFPImmLegal(const APFloat &Imm, EVT VT,
494 bool ForCodeSize) const override;
495
496 bool isLegalICmpImmediate(int64_t Imm) const override;
497 bool isLegalAddImmediate(int64_t Imm) const override;
498
499 unsigned getJumpTableEncoding() const override;
500 SDValue getPICJumpTableRelocBase(SDValue Table,
501 SelectionDAG &DAG) const override;
502 bool useSoftFloat() const override;
503
504 bool shouldInsertFencesForAtomic(const Instruction *I) const override {
505 return true;
506 }
507
508 /// Emit a sign-extension using sll/sra, seb, or seh appropriately.
509 MachineBasicBlock *emitSignExtendToI32InReg(MachineInstr &MI,
510 MachineBasicBlock *BB,
511 unsigned Size, unsigned DstReg,
512 unsigned SrcRec) const;
513
514 MachineBasicBlock *emitAtomicBinary(MachineInstr &MI,
515 MachineBasicBlock *BB) const;
516 MachineBasicBlock *emitAtomicBinaryPartword(MachineInstr &MI,
517 MachineBasicBlock *BB,
518 unsigned Size) const;
519 MachineBasicBlock *emitAtomicCmpSwap(MachineInstr &MI,
520 MachineBasicBlock *BB) const;
521 MachineBasicBlock *emitAtomicCmpSwapPartword(MachineInstr &MI,
522 MachineBasicBlock *BB,
523 unsigned Size) const;
524 MachineBasicBlock *emitSEL_D(MachineInstr &MI, MachineBasicBlock *BB) const;
525 MachineBasicBlock *emitPseudoSELECT(MachineInstr &MI, MachineBasicBlock *BB,
526 bool isFPCmp, unsigned Opc) const;
527 MachineBasicBlock *emitPseudoD_SELECT(MachineInstr &MI,
528 MachineBasicBlock *BB) const;
529 MachineBasicBlock *emitLDR_W(MachineInstr &MI, MachineBasicBlock *BB) const;
530 MachineBasicBlock *emitLDR_D(MachineInstr &MI, MachineBasicBlock *BB) const;
531 MachineBasicBlock *emitSTR_W(MachineInstr &MI, MachineBasicBlock *BB) const;
532 MachineBasicBlock *emitSTR_D(MachineInstr &MI, MachineBasicBlock *BB) const;
533 };
534
535 /// Create MipsTargetLowering objects.
536 const MipsTargetLowering *
538 const MipsSubtarget &STI);
539 const MipsTargetLowering *
541 const MipsSubtarget &STI);
542
543namespace Mips {
544
545FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
546 const TargetLibraryInfo *libInfo);
547
548} // end namespace Mips
549
550} // end namespace llvm
551
552#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
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")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
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:63
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:66
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
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...
Register getExceptionSelectorRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception typeid on entry to a la...
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)
Register getExceptionPointerRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
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.
SDValue getAddrNonPICSym64(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG) const
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
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo) const override
createFastISel - This method returns a target specific FastISel object, or null if the target does no...
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
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
bool softPromoteHalfType() const override
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 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,...
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 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...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
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 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:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
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
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:832
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:762
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo)
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
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.
const MipsTargetLowering * createMips16TargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
Create MipsTargetLowering objects.
@ Add
Sum of integers.
DWARFExpression::Operation Op
const MipsTargetLowering * createMipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
#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.