LLVM 22.0.0git
SparcISelLowering.h
Go to the documentation of this file.
1//===-- SparcISelLowering.h - Sparc 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 Sparc uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_SPARC_SPARCISELLOWERING_H
15#define LLVM_LIB_TARGET_SPARC_SPARCISELLOWERING_H
16
17#include "Sparc.h"
19
20namespace llvm {
21 class SparcSubtarget;
22
24 const SparcSubtarget *Subtarget;
25 public:
27 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
28
29 bool useSoftFloat() const override;
30
31 bool softPromoteHalfType() const override { return true; }
32
33 /// computeKnownBitsForTargetNode - Determine which of the bits specified
34 /// in Mask are known to be either zero or one and return them in the
35 /// KnownZero/KnownOne bitsets.
37 KnownBits &Known,
38 const APInt &DemandedElts,
39 const SelectionDAG &DAG,
40 unsigned Depth = 0) const override;
41
44 MachineBasicBlock *MBB) const override;
45
46 ConstraintType getConstraintType(StringRef Constraint) const override;
49 const char *constraint) const override;
51 std::vector<SDValue> &Ops,
52 SelectionDAG &DAG) const override;
53
54 std::pair<unsigned, const TargetRegisterClass *>
56 StringRef Constraint, MVT VT) const override;
57
58 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
59 MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
60 return MVT::i32;
61 }
62
63 Register getRegisterByName(const char* RegName, LLT VT,
64 const MachineFunction &MF) const override;
65
66 /// If a physical register, this returns the register that receives the
67 /// exception address on entry to an EH pad.
69 getExceptionPointerRegister(const Constant *PersonalityFn) const override {
70 return SP::I0;
71 }
72
73 /// If a physical register, this returns the register that receives the
74 /// exception typeid on entry to a landing pad.
76 getExceptionSelectorRegister(const Constant *PersonalityFn) const override {
77 return SP::I1;
78 }
79
80 /// Override to support customized stack guard loading.
81 bool useLoadStackGuardNode(const Module &M) const override;
82
83 /// getSetCCResultType - Return the ISD::SETCC ValueType
85 EVT VT) const override;
86
88 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
90 const SDLoc &dl, SelectionDAG &DAG,
91 SmallVectorImpl<SDValue> &InVals) const override;
93 bool isVarArg,
95 const SDLoc &dl, SelectionDAG &DAG,
96 SmallVectorImpl<SDValue> &InVals) const;
98 bool isVarArg,
100 const SDLoc &dl, SelectionDAG &DAG,
101 SmallVectorImpl<SDValue> &InVals) const;
102
103 SDValue
105 SmallVectorImpl<SDValue> &InVals) const override;
107 SmallVectorImpl<SDValue> &InVals) const;
109 SmallVectorImpl<SDValue> &InVals) const;
110
112 bool isVarArg,
114 LLVMContext &Context, const Type *RetTy) const override;
115
116 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
118 const SmallVectorImpl<SDValue> &OutVals,
119 const SDLoc &dl, SelectionDAG &DAG) const override;
121 bool IsVarArg,
123 const SmallVectorImpl<SDValue> &OutVals,
124 const SDLoc &DL, SelectionDAG &DAG) const;
126 bool IsVarArg,
128 const SmallVectorImpl<SDValue> &OutVals,
129 const SDLoc &DL, SelectionDAG &DAG) const;
130
135
136 SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const;
137 SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF,
138 SelectionDAG &DAG) const;
140
142 const SDLoc &DL, SelectionDAG &DAG) const;
144 const char *LibFuncName,
145 unsigned numArgs) const;
147 const SDLoc &DL, SelectionDAG &DAG) const;
148
150
151 SDValue PerformBITCASTCombine(SDNode *N, DAGCombinerInfo &DCI) const;
152
154 SelectionDAG &DAG) const;
155
156 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
157
159 CallLoweringInfo &CLI,
160 MachineFunction &MF) const;
161
162 bool ShouldShrinkFPConstant(EVT VT) const override {
163 // Do not shrink FP constpool if VT == MVT::f128.
164 // (ldd, call _Q_fdtoq) is more expensive than two ldds.
165 return VT != MVT::f128;
166 }
167
168 bool isFNegFree(EVT VT) const override;
169
170 bool isFPImmLegal(const APFloat &Imm, EVT VT,
171 bool ForCodeSize) const override;
172
173 bool isCtlzFast() const override;
174
175 bool isCheapToSpeculateCtlz(Type *Ty) const override {
176 return isCtlzFast();
177 }
178
179 bool isCheapToSpeculateCttz(Type *Ty) const override;
180
181 bool enableAggressiveFMAFusion(EVT VT) const override { return true; };
182
184 EVT VT) const override;
185
186 bool shouldInsertFencesForAtomic(const Instruction *I) const override {
187 // FIXME: We insert fences for each atomics and generate
188 // sub-optimal code for PSO/TSO. (Approximately nobody uses any
189 // mode but TSO, which makes this even more silly)
190 return true;
191 }
192
194
197 SelectionDAG &DAG) const override;
198
200 unsigned BROpcode) const;
201
203 SDNode *Node) const override;
204 };
205} // end namespace llvm
206
207#endif // LLVM_LIB_TARGET_SPARC_SPARCISELLOWERING_H
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
return RetTy
IRTranslator LLVM IR MI
#define RegName(no)
lazy value info
#define I(x, y, z)
Definition: MD5.cpp:58
Register const TargetRegisterInfo * TRI
This file describes how to lower LLVM code to machine code.
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition: APInt.h:78
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:709
CCState - This class holds information needed while lowering arguments and return values.
This is an important base class in LLVM.
Definition: Constant.h:43
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
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:68
Machine Value Type.
Representation of each machine instruction.
Definition: MachineInstr.h:72
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
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...
Definition: SelectionDAG.h:229
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
bool shouldInsertFencesForAtomic(const Instruction *I) const override
Whether AtomicExpandPass should automatically insert fences and reduce ordering for this atomic.
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...
SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const
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...
bool useSoftFloat() const override
SDValue bitcastConstantFPToInt(ConstantFPSDNode *C, const SDLoc &DL, SelectionDAG &DAG) const
MachineBasicBlock * expandSelectCC(MachineInstr &MI, MachineBasicBlock *BB, unsigned BROpcode) const
bool isFPImmLegal(const APFloat &Imm, EVT VT, bool ForCodeSize) const override
Returns true if the target can instruction select the specified FP immediate natively.
ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const override
Examine constraint string and operand type and determine a weight value.
AtomicExpansionKind shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
bool isCtlzFast() const override
Return true if ctlz instruction is fast.
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,...
ConstraintType getConstraintType(StringRef Constraint) const override
getConstraintType - Given a constraint letter, return the type of constraint it is for this target.
SDValue LowerFormalArguments_32(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const
LowerFormalArguments32 - V8 uses a very simple ABI, where all values are passed in either one or two ...
bool isCheapToSpeculateCtlz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower calls into the specified DAG.
bool isCheapToSpeculateCttz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
bool IsEligibleForTailCallOptimization(CCState &CCInfo, CallLoweringInfo &CLI, MachineFunction &MF) const
IsEligibleForTailCallOptimization - Check whether the call is eligible for tail call optimization.
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override
Return true if folding a constant offset with the given GlobalAddress is legal.
bool isFNegFree(EVT VT) const override
Return true if an fneg operation is free to the point where it is never worthwhile to replace it with...
SDValue LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args, SDValue Arg, const SDLoc &DL, SelectionDAG &DAG) const
SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF, SelectionDAG &DAG) const
SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
Register getExceptionPointerRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
void AdjustInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const override
This method should be implemented by targets that mark instructions with the 'hasPostISelHook' flag.
void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const override
computeKnownBitsForTargetNode - Determine which of the bits specified in Mask are known to be either ...
SDValue LowerCall_64(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const
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 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,...
SDValue LowerF128Op(SDValue Op, SelectionDAG &DAG, const char *LibFuncName, unsigned numArgs) const
SDValue makeAddress(SDValue Op, SelectionDAG &DAG) const
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const
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...
SDValue LowerReturn_32(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &DL, SelectionDAG &DAG) const
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...
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
SDValue PerformBITCASTCombine(SDNode *N, DAGCombinerInfo &DCI) const
SDValue LowerReturn_64(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &DL, SelectionDAG &DAG) const
SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
getSetCCResultType - Return the ISD::SETCC ValueType
bool softPromoteHalfType() const override
SDValue LowerCall_32(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const
bool useLoadStackGuardNode(const Module &M) const override
Override to support customized stack guard loading.
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...
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const
SDValue LowerFormalArguments_64(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const
bool ShouldShrinkFPConstant(EVT VT) const override
If true, then instruction selection should seek to shrink the FP constant of the specified type to a ...
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const override
LowerAsmOperandForConstraint - Lower the specified operand into the Ops vector.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
SDValue LowerF128Compare(SDValue LHS, SDValue RHS, unsigned &SPCC, const SDLoc &DL, SelectionDAG &DAG) const
bool enableAggressiveFMAFusion(EVT VT) const override
Return true if target always benefits from combining into FMA for a given value type.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
std::vector< ArgListEntry > ArgListTy
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
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
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
#define N
Extended Value Type.
Definition: ValueTypes.h:35
This structure contains all information that is necessary for lowering calls.