LLVM 22.0.0git
LoongArchISelLowering.h
Go to the documentation of this file.
1//=- LoongArchISelLowering.h - LoongArch 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 LoongArch uses to lower LLVM code into
10// a selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELLOWERING_H
15#define LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELLOWERING_H
16
17#include "LoongArch.h"
21
22namespace llvm {
24namespace LoongArchISD {
25enum NodeType : unsigned {
27
28 // TODO: add more LoongArchISDs
36
37 // Select
39
40 // Branch
43
44 // 32-bit shifts, directly matching the semantics of the named LoongArch
45 // instructions.
49
52
53 // unsigned 32-bit integer division
58
59 // FPR<->GPR transfer operations
67
69
70 // Build and split F64 pair
73
74 // Bit counting operations
77
80
81 // Byte-swapping and bit-reversal
87
88 // Intrinsic operations start ============================================
95
96 // CRC check operations
105
107
108 // Write new value to CSR and return old value.
109 // Operand 0: A chain pointer.
110 // Operand 1: The new value to write.
111 // Operand 2: The address of the required CSR.
112 // Result 0: The old value of the CSR.
113 // Result 1: The new chain pointer.
115
116 // Similar to CSRWR but with a write mask.
117 // Operand 0: A chain pointer.
118 // Operand 1: The new value to write.
119 // Operand 2: The write mask.
120 // Operand 3: The address of the required CSR.
121 // Result 0: The old value of the CSR.
122 // Result 1: The new chain pointer.
124
125 // IOCSR access operations
134
135 // Read CPU configuration information operation
137
138 // Vector Shuffle
154
155 // Extended vector element extraction
158
159 // Vector comparisons
164
165 // Floating point approximate reciprocal operation
168
169 // Vector logicial left / right shift by immediate
172
173 // Vector byte logicial left / right shift
176
177 // Scalar load broadcast to vector
179
180 // Vector mask set by condition
189
190 // Vector Horizontal Addition with Widening‌
192
193 // Intrinsic operations end =============================================
194};
195} // end namespace LoongArchISD
196
198 const LoongArchSubtarget &Subtarget;
199
200public:
201 explicit LoongArchTargetLowering(const TargetMachine &TM,
202 const LoongArchSubtarget &STI);
203
204 const LoongArchSubtarget &getSubtarget() const { return Subtarget; }
205
206 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
207
208 // Provide custom lowering hooks for some operations.
209 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
211 SelectionDAG &DAG) const override;
212
213 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
214
215 // This method returns the name of a target specific DAG node.
216 const char *getTargetNodeName(unsigned Opcode) const override;
217
218 // Lower incoming arguments, copy physregs into vregs.
220 bool IsVarArg,
222 const SDLoc &DL, SelectionDAG &DAG,
223 SmallVectorImpl<SDValue> &InVals) const override;
225 bool IsVarArg,
227 LLVMContext &Context, const Type *RetTy) const override;
228 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
230 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
231 SelectionDAG &DAG) const override;
233 SmallVectorImpl<SDValue> &InVals) const override;
234 bool isCheapToSpeculateCttz(Type *Ty) const override;
235 bool isCheapToSpeculateCtlz(Type *Ty) const override;
236 bool hasAndNot(SDValue Y) const override;
238 shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
239 void emitExpandAtomicRMW(AtomicRMWInst *AI) const override;
240
242 Value *AlignedAddr, Value *Incr,
243 Value *Mask, Value *ShiftAmt,
244 AtomicOrdering Ord) const override;
245
247 EVT VT) const override;
252 Value *AlignedAddr, Value *CmpVal,
253 Value *NewVal, Value *Mask,
254 AtomicOrdering Ord) const override;
255
256 bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
257 MachineFunction &MF,
258 unsigned Intrinsic) const override;
259
261 EVT VT) const override;
262
264 getExceptionPointerRegister(const Constant *PersonalityFn) const override;
265
267 getExceptionSelectorRegister(const Constant *PersonalityFn) const override;
268
269 bool isFsqrtCheap(SDValue Operand, SelectionDAG &DAG) const override {
270 return true;
271 }
272
274 int &RefinementSteps, bool &UseOneConstNR,
275 bool Reciprocal) const override;
276
278 int &RefinementSteps) const override;
279
281 return ISD::SIGN_EXTEND;
282 }
283
285
286 Register getRegisterByName(const char *RegName, LLT VT,
287 const MachineFunction &MF) const override;
288 bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
289
290 bool decomposeMulByConstant(LLVMContext &Context, EVT VT,
291 SDValue C) const override;
292
293 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
294
295 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
296 unsigned AS,
297 Instruction *I = nullptr) const override;
298
299 bool isLegalICmpImmediate(int64_t Imm) const override;
300 bool isLegalAddImmediate(int64_t Imm) const override;
301 bool isZExtFree(SDValue Val, EVT VT2) const override;
302 bool isSExtCheaperThanZExt(EVT SrcVT, EVT DstVT) const override;
303 bool signExtendConstant(const ConstantInt *CI) const override;
304
305 bool hasAndNotCompare(SDValue Y) const override;
306
307 bool convertSelectOfConstantsToMath(EVT VT) const override { return true; }
308
310 EVT VT, unsigned AddrSpace = 0, Align Alignment = Align(1),
312 unsigned *Fast = nullptr) const override;
313
314 bool isShuffleMaskLegal(ArrayRef<int> Mask, EVT VT) const override {
315 if (!VT.isSimple())
316 return false;
317
318 // Not for i1 vectors
319 if (VT.getSimpleVT().getScalarType() == MVT::i1)
320 return false;
321
322 return isTypeLegal(VT.getSimpleVT());
323 }
324 bool shouldConsiderGEPOffsetSplit() const override { return true; }
325 bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const override;
326 bool shouldExtendTypeInLibCall(EVT Type) const override;
327
328 bool shouldAlignPointerArgs(CallInst *CI, unsigned &MinSize,
329 Align &PrefAlign) const override;
330
331 bool isFPImmVLDILegal(const APFloat &Imm, EVT VT) const;
332 LegalizeTypeAction getPreferredVectorAction(MVT VT) const override;
333
335 const APInt &DemandedElts,
336 KnownBits &Known,
337 TargetLoweringOpt &TLO,
338 unsigned Depth) const override;
339
340 bool shouldScalarizeBinop(SDValue VecOp) const override;
341 bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
342 unsigned Index) const override;
343 bool isExtractVecEltCheap(EVT VT, unsigned Index) const override;
344
345 /// Check if a constant splat can be generated using [x]vldi, where imm[12]
346 /// is 1.
347 std::pair<bool, uint64_t>
348 isImmVLDILegalForMode1(const APInt &SplatValue,
349 const unsigned SplatBitSize) const;
350
351private:
352 /// Target-specific function used to lower LoongArch calling conventions.
353 typedef bool LoongArchCCAssignFn(const DataLayout &DL, LoongArchABI::ABI ABI,
354 unsigned ValNo, MVT ValVT,
355 CCValAssign::LocInfo LocInfo,
356 ISD::ArgFlagsTy ArgFlags, CCState &State,
357 bool IsRet, Type *OrigTy);
358
359 void analyzeInputArgs(MachineFunction &MF, CCState &CCInfo,
360 const SmallVectorImpl<ISD::InputArg> &Ins, bool IsRet,
361 LoongArchCCAssignFn Fn) const;
362 void analyzeOutputArgs(MachineFunction &MF, CCState &CCInfo,
364 bool IsRet, CallLoweringInfo *CLI,
365 LoongArchCCAssignFn Fn) const;
366
367 template <class NodeTy>
368 SDValue getAddr(NodeTy *N, SelectionDAG &DAG, CodeModel::Model M,
369 bool IsLocal = true) const;
370 SDValue getStaticTLSAddr(GlobalAddressSDNode *N, SelectionDAG &DAG,
371 unsigned Opc, bool UseGOT, bool Large = false) const;
372 SDValue getDynamicTLSAddr(GlobalAddressSDNode *N, SelectionDAG &DAG,
373 unsigned Opc, bool Large = false) const;
374 SDValue getTLSDescAddr(GlobalAddressSDNode *N, SelectionDAG &DAG,
375 unsigned Opc, bool Large = false) const;
376 SDValue lowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
377 SDValue lowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
378 SDValue lowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
379 SDValue lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
380 SDValue lowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
381 SDValue lowerShiftRightParts(SDValue Op, SelectionDAG &DAG, bool IsSRA) const;
382
384 EmitInstrWithCustomInserter(MachineInstr &MI,
385 MachineBasicBlock *BB) const override;
386 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
387 SDValue lowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
388 SDValue lowerEH_DWARF_CFA(SDValue Op, SelectionDAG &DAG) const;
389 SDValue lowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
390 SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
391 SDValue lowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
392 SDValue lowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
393 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
394 SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
395 SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
396 SDValue lowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
399 SDValue lowerWRITE_REGISTER(SDValue Op, SelectionDAG &DAG) const;
400 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
401 SDValue lowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
403 SDValue lowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
405 SDValue lowerBITREVERSE(SDValue Op, SelectionDAG &DAG) const;
406 SDValue lowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
407 SDValue lowerPREFETCH(SDValue Op, SelectionDAG &DAG) const;
409 SDValue lowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
410 SDValue lowerFP_TO_FP16(SDValue Op, SelectionDAG &DAG) const;
411 SDValue lowerFP16_TO_FP(SDValue Op, SelectionDAG &DAG) const;
412 SDValue lowerFP_TO_BF16(SDValue Op, SelectionDAG &DAG) const;
413 SDValue lowerBF16_TO_FP(SDValue Op, SelectionDAG &DAG) const;
414 SDValue lowerVECREDUCE_ADD(SDValue Op, SelectionDAG &DAG) const;
415 SDValue lowerVECREDUCE(SDValue Op, SelectionDAG &DAG) const;
416 SDValue lowerConstantFP(SDValue Op, SelectionDAG &DAG) const;
417
418 bool isFPImmLegal(const APFloat &Imm, EVT VT,
419 bool ForCodeSize) const override;
420
421 bool shouldInsertFencesForAtomic(const Instruction *I) const override;
422
423 ConstraintType getConstraintType(StringRef Constraint) const override;
424
426 getInlineAsmMemConstraint(StringRef ConstraintCode) const override;
427
428 std::pair<unsigned, const TargetRegisterClass *>
429 getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
430 StringRef Constraint, MVT VT) const override;
431
432 void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint,
433 std::vector<SDValue> &Ops,
434 SelectionDAG &DAG) const override;
435
436 bool isEligibleForTailCallOptimization(
437 CCState &CCInfo, CallLoweringInfo &CLI, MachineFunction &MF,
438 const SmallVectorImpl<CCValAssign> &ArgLocs) const;
439
440 bool softPromoteHalfType() const override { return true; }
441
442 bool
443 splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val,
444 SDValue *Parts, unsigned NumParts, MVT PartVT,
445 std::optional<CallingConv::ID> CC) const override;
446
447 SDValue
448 joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL,
449 const SDValue *Parts, unsigned NumParts,
450 MVT PartVT, EVT ValueVT,
451 std::optional<CallingConv::ID> CC) const override;
452
453 /// Return the register type for a given MVT, ensuring vectors are treated
454 /// as a series of gpr sized integers.
455 MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC,
456 EVT VT) const override;
457
458 /// Return the number of registers for a given MVT, ensuring vectors are
459 /// treated as a series of gpr sized integers.
460 unsigned getNumRegistersForCallingConv(LLVMContext &Context,
462 EVT VT) const override;
463};
464
465} // end namespace llvm
466
467#endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELLOWERING_H
return SDValue()
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
Analysis containing CSE Info
Definition CSEInfo.cpp:27
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
#define I(x, y, z)
Definition MD5.cpp:58
Register const TargetRegisterInfo * TRI
static SDValue lowerSELECT(SDValue Op, SelectionDAG &DAG)
static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG, const RISCVSubtarget &Subtarget)
static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG, const RISCVSubtarget &Subtarget)
static bool Enabled
Definition Statistic.cpp:46
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
This file describes how to lower LLVM code to machine code.
static SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG, const VETargetLowering &TLI, const VESubtarget *Subtarget)
static SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG, const VETargetLowering &TLI, const VESubtarget *Subtarget)
Class for arbitrary precision integers.
Definition APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
CCState - This class holds information needed while lowering arguments and return values.
This class represents a function call, abstracting a target machine's calling convention.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
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
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
bool isShuffleMaskLegal(ArrayRef< int > Mask, EVT VT) const override
Targets can use this to indicate that they only support some VECTOR_SHUFFLE operations,...
bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override
Return true if result of the specified node is used by a return node only.
bool convertSelectOfConstantsToMath(EVT VT) const override
Return true if a select of constants (select Cond, C1, C2) should be transformed into simple math ops...
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...
const LoongArchSubtarget & getSubtarget() const
SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled, int &RefinementSteps, bool &UseOneConstNR, bool Reciprocal) const override
Hooks for building estimates in place of slower divisions and square roots.
bool isLegalICmpImmediate(int64_t Imm) const override
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
TargetLowering::AtomicExpansionKind shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *CI) const override
Returns how the given atomic cmpxchg should be expanded by the IR-level AtomicExpand pass.
Value * emitMaskedAtomicCmpXchgIntrinsic(IRBuilderBase &Builder, AtomicCmpXchgInst *CI, Value *AlignedAddr, Value *CmpVal, Value *NewVal, Value *Mask, AtomicOrdering Ord) const override
Perform a masked cmpxchg using a target-specific intrinsic.
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
Return the ValueType of the result of SETCC operations.
std::pair< bool, uint64_t > isImmVLDILegalForMode1(const APInt &SplatValue, const unsigned SplatBitSize) const
Check if a constant splat can be generated using [x]vldi, where imm[12] is 1.
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT VT) const override
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower calls into the specified DAG.
bool decomposeMulByConstant(LLVMContext &Context, EVT VT, SDValue C) const override
Return true if it is profitable to transform an integer multiplication-by-constant into simpler opera...
bool isExtractVecEltCheap(EVT VT, unsigned Index) const override
Return true if extraction of a scalar element from the given vector type at the given index is cheap.
LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
bool isSExtCheaperThanZExt(EVT SrcVT, EVT DstVT) const override
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
TargetLowering::AtomicExpansionKind shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const override
Determine if the target supports unaligned memory accesses.
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
This callback is invoked for operations that are unsupported by the target, which are registered to u...
bool shouldAlignPointerArgs(CallInst *CI, unsigned &MinSize, Align &PrefAlign) const override
Return true if the pointer arguments to CI should be aligned by aligning the object whose address is ...
Value * emitMaskedAtomicRMWIntrinsic(IRBuilderBase &Builder, AtomicRMWInst *AI, Value *AlignedAddr, Value *Incr, Value *Mask, Value *ShiftAmt, AtomicOrdering Ord) const override
Perform a masked atomicrmw using a target-specific intrinsic.
bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT, unsigned Index) const override
Return true if EXTRACT_SUBVECTOR is cheap for extracting this result type from this source type with ...
bool isZExtFree(SDValue Val, EVT VT2) const override
Return true if zero-extending the specific node Val to type VT2 is free (either because it's implicit...
Register getExceptionPointerRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
bool signExtendConstant(const ConstantInt *CI) const override
Return true if this constant should be sign extended when promoting to a larger type.
ISD::NodeType getExtendForAtomicOps() const override
Returns how the platform's atomic operations are extended (ZERO_EXTEND, SIGN_EXTEND,...
const char * getTargetNodeName(unsigned Opcode) const override
This method returns the name of a target specific DAG node.
bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I, MachineFunction &MF, unsigned Intrinsic) const override
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
bool isLegalAddImmediate(int64_t Imm) const override
Return true if the specified immediate is legal add immediate, that is the target has add instruction...
bool isCheapToSpeculateCttz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AS, Instruction *I=nullptr) const override
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const override
Returns true if arguments should be sign-extended in lib calls.
bool shouldScalarizeBinop(SDValue VecOp) const override
Try to convert an extract element of a vector binary operation into an extract element followed by a ...
bool isFPImmVLDILegal(const APFloat &Imm, EVT VT) const
bool shouldExtendTypeInLibCall(EVT Type) const override
Returns true if arguments should be extended in lib calls.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
bool hasAndNot(SDValue Y) const override
Return true if the target has a bitwise and-not operation: X = ~A & B This can be used to simplify se...
bool shouldConsiderGEPOffsetSplit() const override
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override
Return true if folding a constant offset with the given GlobalAddress is legal.
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...
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
This callback is invoked when a node result type is illegal for the target, and the operation was reg...
bool SimplifyDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth) const override
Attempt to simplify any target nodes based on the demanded bits/elts, returning true on success.
void emitExpandAtomicRMW(AtomicRMWInst *AI) const override
Perform a atomicrmw expansion using a target-specific way.
ISD::NodeType getExtendForAtomicCmpSwapArg() const override
Returns how the platform's atomic compare and swap expects its comparison value to be extended (ZERO_...
bool isFsqrtCheap(SDValue Operand, SelectionDAG &DAG) const override
Return true if SQRT(X) shouldn't be replaced with X*RSQRT(X).
LoongArchTargetLowering(const TargetMachine &TM, const LoongArchSubtarget &STI)
SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &DL, SelectionDAG &DAG) const override
This hook must be implemented to lower outgoing return values, described by the Outs array,...
bool hasAndNotCompare(SDValue Y) const override
Return true if the target should transform: (X & Y) == Y ---> (~X & Y) == 0 (X & Y) !...
SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled, int &RefinementSteps) const override
Return a reciprocal estimate value for the input operand.
bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, bool IsVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, LLVMContext &Context, const Type *RetTy) const override
This hook should be implemented to check whether the return values described by the Outs array can fi...
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &DL, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower the incoming (formal) arguments, described by the Ins array,...
bool mayBeEmittedAsTailCall(const CallInst *CI) const override
Return true if the target may be able emit the call instruction as a tail call.
Machine Value Type.
MVT getScalarType() const
If this is a vector, return the element type, otherwise return this.
Representation of each machine instruction.
Flags
Flags values. These may be or'd together.
Wrapper class representing virtual and physical registers.
Definition Register.h:19
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
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...
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
virtual bool softPromoteHalfType() const
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
TargetLowering(const TargetLowering &)=delete
Primary interface to the complete machine description for the target machine.
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
LLVM Value Representation.
Definition Value.h:75
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ 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
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:826
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
This is an optimization pass for GlobalISel generic memory operations.
AtomicOrdering
Atomic ordering for LLVM's memory model.
DWARFExpression::Operation Op
#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
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:137
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:316
This structure contains all information that is necessary for lowering calls.