68 "jump-is-expensive",
cl::init(
false),
69 cl::desc(
"Do not create extra branches to split comparison logic."),
74 cl::desc(
"Set minimum number of entries to use a jump table."));
78 cl::desc(
"Set maximum size of jump tables; zero for no limit."));
83 cl::desc(
"Minimum density for building a jump table in " 84 "a normal function"));
89 cl::desc(
"Minimum density for building a jump table in " 90 "an optsize function"));
113 "min-predictable-branch",
cl::init(99),
114 cl::desc(
"Minimum percentage (0-100) that a condition must be either true " 115 "or false to assume that the condition is predictable"),
118 void TargetLoweringBase::InitLibcalls(
const Triple &TT) {
119 #define HANDLE_LIBCALL(code, name) \ 120 setLibcallName(RTLIB::code, name); 121 #include "llvm/IR/RuntimeLibcalls.def" 122 #undef HANDLE_LIBCALL 124 for (
int LC = 0; LC < RTLIB::UNKNOWN_LIBCALL; ++LC)
183 return FPEXT_F16_F32;
186 return FPEXT_F32_F64;
188 return FPEXT_F32_F128;
190 return FPEXT_F32_PPCF128;
193 return FPEXT_F64_F128;
195 return FPEXT_F64_PPCF128;
198 return FPEXT_F80_F128;
201 return UNKNOWN_LIBCALL;
209 return FPROUND_F32_F16;
211 return FPROUND_F64_F16;
213 return FPROUND_F80_F16;
215 return FPROUND_F128_F16;
217 return FPROUND_PPCF128_F16;
220 return FPROUND_F64_F32;
222 return FPROUND_F80_F32;
224 return FPROUND_F128_F32;
226 return FPROUND_PPCF128_F32;
229 return FPROUND_F80_F64;
231 return FPROUND_F128_F64;
233 return FPROUND_PPCF128_F64;
236 return FPROUND_F128_F80;
239 return UNKNOWN_LIBCALL;
247 return FPTOSINT_F32_I32;
249 return FPTOSINT_F32_I64;
251 return FPTOSINT_F32_I128;
254 return FPTOSINT_F64_I32;
256 return FPTOSINT_F64_I64;
258 return FPTOSINT_F64_I128;
261 return FPTOSINT_F80_I32;
263 return FPTOSINT_F80_I64;
265 return FPTOSINT_F80_I128;
268 return FPTOSINT_F128_I32;
270 return FPTOSINT_F128_I64;
272 return FPTOSINT_F128_I128;
275 return FPTOSINT_PPCF128_I32;
277 return FPTOSINT_PPCF128_I64;
279 return FPTOSINT_PPCF128_I128;
281 return UNKNOWN_LIBCALL;
289 return FPTOUINT_F32_I32;
291 return FPTOUINT_F32_I64;
293 return FPTOUINT_F32_I128;
296 return FPTOUINT_F64_I32;
298 return FPTOUINT_F64_I64;
300 return FPTOUINT_F64_I128;
303 return FPTOUINT_F80_I32;
305 return FPTOUINT_F80_I64;
307 return FPTOUINT_F80_I128;
310 return FPTOUINT_F128_I32;
312 return FPTOUINT_F128_I64;
314 return FPTOUINT_F128_I128;
317 return FPTOUINT_PPCF128_I32;
319 return FPTOUINT_PPCF128_I64;
321 return FPTOUINT_PPCF128_I128;
323 return UNKNOWN_LIBCALL;
331 return SINTTOFP_I32_F32;
333 return SINTTOFP_I32_F64;
335 return SINTTOFP_I32_F80;
337 return SINTTOFP_I32_F128;
339 return SINTTOFP_I32_PPCF128;
342 return SINTTOFP_I64_F32;
344 return SINTTOFP_I64_F64;
346 return SINTTOFP_I64_F80;
348 return SINTTOFP_I64_F128;
350 return SINTTOFP_I64_PPCF128;
353 return SINTTOFP_I128_F32;
355 return SINTTOFP_I128_F64;
357 return SINTTOFP_I128_F80;
359 return SINTTOFP_I128_F128;
361 return SINTTOFP_I128_PPCF128;
363 return UNKNOWN_LIBCALL;
371 return UINTTOFP_I32_F32;
373 return UINTTOFP_I32_F64;
375 return UINTTOFP_I32_F80;
377 return UINTTOFP_I32_F128;
379 return UINTTOFP_I32_PPCF128;
382 return UINTTOFP_I64_F32;
384 return UINTTOFP_I64_F64;
386 return UINTTOFP_I64_F80;
388 return UINTTOFP_I64_F128;
390 return UINTTOFP_I64_PPCF128;
393 return UINTTOFP_I128_F32;
395 return UINTTOFP_I128_F64;
397 return UINTTOFP_I128_F80;
399 return UINTTOFP_I128_F128;
401 return UINTTOFP_I128_PPCF128;
403 return UNKNOWN_LIBCALL;
407 #define OP_TO_LIBCALL(Name, Enum) \ 409 switch (VT.SimpleTy) { \ 411 return UNKNOWN_LIBCALL; \ 441 return UNKNOWN_LIBCALL;
445 switch (ElementSize) {
447 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_1;
449 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_2;
451 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_4;
453 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_8;
455 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_16;
457 return UNKNOWN_LIBCALL;
462 switch (ElementSize) {
464 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1;
466 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2;
468 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4;
470 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8;
472 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16;
474 return UNKNOWN_LIBCALL;
479 switch (ElementSize) {
481 return MEMSET_ELEMENT_UNORDERED_ATOMIC_1;
483 return MEMSET_ELEMENT_UNORDERED_ATOMIC_2;
485 return MEMSET_ELEMENT_UNORDERED_ATOMIC_4;
487 return MEMSET_ELEMENT_UNORDERED_ATOMIC_8;
489 return MEMSET_ELEMENT_UNORDERED_ATOMIC_16;
491 return UNKNOWN_LIBCALL;
542 UseUnderscoreSetJmp =
false;
543 UseUnderscoreLongJmp =
false;
544 HasMultipleConditionRegisters =
false;
545 HasExtractBitsInsn =
false;
549 HasFloatingPointExceptions =
true;
550 StackPointerRegisterToSaveRestore = 0;
556 JumpBufAlignment = 0;
557 MinFunctionAlignment = 0;
558 PrefFunctionAlignment = 0;
559 PrefLoopAlignment = 0;
561 MinStackArgumentAlignment = 1;
564 MaxAtomicSizeInBitsSupported = 1024;
566 MinCmpXchgSizeInBits = 0;
567 SupportsUnalignedAtomics =
false;
577 memset(OpActions, 0,
sizeof(OpActions));
578 memset(LoadExtActions, 0,
sizeof(LoadExtActions));
579 memset(TruncStoreActions, 0,
sizeof(TruncStoreActions));
580 memset(IndexedModeActions, 0,
sizeof(IndexedModeActions));
581 memset(CondCodeActions, 0,
sizeof(CondCodeActions));
584 std::end(TargetDAGCombineArray), 0);
707 bool LegalTypes)
const {
731 JumpIsExpensive = isExpensive;
745 "Promote may not follow Expand or Promote");
763 assert(NVT != VT &&
"Unable to round integer VT");
764 LegalizeKind NextStep = getTypeConversion(Context, NVT);
809 EVT OldEltVT = EltVT;
814 .getRoundIntegerType(Context);
848 if (LargerVector ==
MVT())
868 unsigned &NumIntermediates,
875 unsigned NumVectorRegs = 1;
880 NumVectorRegs = NumElts;
891 NumIntermediates = NumVectorRegs;
896 IntermediateVT = NewVT;
906 if (
EVT(DestVT).bitsLT(NewVT))
911 return NumVectorRegs;
946 for(
unsigned OperIdx = 0; OperIdx != MI->
getNumOperands(); ++OperIdx) {
957 for (
unsigned i = 0; i < OperIdx; ++i)
966 MIB.
addImm(StackMaps::IndirectMemRefOp);
973 MIB.
addImm(StackMaps::DirectMemRefOp);
983 assert(MIB->
mayLoad() &&
"Folded a stackmap use to a non-load!");
989 if (MI->
getOpcode() == TargetOpcode::STATEPOINT) {
1011 "Called emitXRayCustomEvent on the wrong MI!");
1012 auto &MF = *MI.
getMF();
1026 "Called emitXRayTypedEvent on the wrong MI!");
1027 auto &MF = *MI.
getMF();
1043 std::pair<const TargetRegisterClass *, uint8_t>
1048 return std::make_pair(RC, 0);
1057 for (
unsigned i : SuperRegRC.set_bits()) {
1066 return std::make_pair(BestRC, 1);
1074 "Too many value types for ValueTypeActions to hold!");
1078 NumRegistersForVT[i] = 1;
1086 for (; RegClassForVT[LargestIntReg] ==
nullptr; --LargestIntReg)
1087 assert(LargestIntReg !=
MVT::i1 &&
"No integer registers defined!");
1091 for (
unsigned ExpandedReg = LargestIntReg + 1;
1093 NumRegistersForVT[ExpandedReg] = 2*NumRegistersForVT[ExpandedReg-1];
1102 unsigned LegalIntReg = LargestIntReg;
1103 for (
unsigned IntReg = LargestIntReg - 1;
1107 LegalIntReg = IntReg;
1109 RegisterTypeForVT[IntReg] = TransformToType[IntReg] =
1176 bool IsLegalWiderType =
false;
1178 switch (PreferredAction) {
1188 TransformToType[i] = SVT;
1189 RegisterTypeForVT[i] = SVT;
1190 NumRegistersForVT[i] = 1;
1192 IsLegalWiderType =
true;
1196 if (IsLegalWiderType)
1206 TransformToType[i] = SVT;
1207 RegisterTypeForVT[i] = SVT;
1208 NumRegistersForVT[i] = 1;
1210 IsLegalWiderType =
true;
1214 if (IsLegalWiderType)
1222 unsigned NumIntermediates;
1224 NumIntermediates, RegisterVT,
this);
1225 RegisterTypeForVT[i] = RegisterVT;
1240 TransformToType[i] = NVT;
1259 RepRegClassForVT[i] =
RRC;
1260 RepRegClassCostForVT[i] = Cost;
1283 EVT &IntermediateVT,
1284 unsigned &NumIntermediates,
1285 MVT &RegisterVT)
const {
1297 IntermediateVT = RegisterEVT;
1299 NumIntermediates = 1;
1307 unsigned NumVectorRegs = 1;
1312 NumVectorRegs = NumElts;
1321 NumVectorRegs <<= 1;
1324 NumIntermediates = NumVectorRegs;
1329 IntermediateVT = NewVT;
1332 RegisterVT = DestVT;
1339 if (
EVT(DestVT).bitsLT(NewVT))
1344 return NumVectorRegs;
1357 unsigned NumValues = ValueVTs.
size();
1358 if (NumValues == 0)
return;
1360 for (
unsigned j = 0, f = NumValues; j != f; ++j) {
1361 EVT VT = ValueVTs[j];
1395 for (
unsigned i = 0; i < NumParts; ++i)
1421 if (Fast !=
nullptr)
1439 enum InstructionOpcodes {
1440 #define HANDLE_INST(NUM, OPCODE, CLASS) OPCODE = NUM, 1441 #define LAST_OTHER_INST(NUM) InstructionOpcodesCount = NUM 1442 #include "llvm/IR/Instruction.def" 1444 switch (static_cast<InstructionOpcodes>(Opcode)) {
1447 case Switch:
return 0;
1448 case IndirectBr:
return 0;
1449 case Invoke:
return 0;
1450 case Resume:
return 0;
1451 case Unreachable:
return 0;
1452 case CleanupRet:
return 0;
1453 case CatchRet:
return 0;
1454 case CatchPad:
return 0;
1455 case CatchSwitch:
return 0;
1456 case CleanupPad:
return 0;
1476 case Alloca:
return 0;
1479 case GetElementPtr:
return 0;
1480 case Fence:
return 0;
1481 case AtomicCmpXchg:
return 0;
1482 case AtomicRMW:
return 0;
1499 case Call:
return 0;
1501 case UserOp1:
return 0;
1502 case UserOp2:
return 0;
1503 case VAArg:
return 0;
1509 case LandingPad:
return 0;
1535 if (MTy == LK.second)
1544 bool UseTLS)
const {
1548 const char *UnsafeStackPtrVar =
"__safestack_unsafe_stack_ptr";
1549 auto UnsafeStackPtr =
1550 dyn_cast_or_null<GlobalVariable>(M->
getNamedValue(UnsafeStackPtrVar));
1554 if (!UnsafeStackPtr) {
1555 auto TLSModel = UseTLS ?
1563 UnsafeStackPtrVar,
nullptr, TLSModel);
1566 if (UnsafeStackPtr->getValueType() != StackPtrTy)
1568 if (UseTLS != UnsafeStackPtr->isThreadLocal())
1570 (UseTLS ?
"" :
"not ") +
"be thread-local");
1572 return UnsafeStackPtr;
1650 nullptr,
"__stack_chk_guard");
1701 Name += IsSqrt ?
"sqrt" :
"div";
1708 "Unexpected FP type for reciprocal estimate");
1720 const char RefStepToken =
':';
1721 Position = In.
find(RefStepToken);
1728 if (RefStepString.
size() == 1) {
1729 char RefStepChar = RefStepString[0];
1730 if (RefStepChar >=
'0' && RefStepChar <=
'9') {
1731 Value = RefStepChar -
'0';
1742 if (Override.
empty())
1743 return TargetLoweringBase::ReciprocalEstimate::Unspecified;
1746 Override.
split(OverrideVector,
',');
1747 unsigned NumArgs = OverrideVector.
size();
1757 Override = Override.
substr(0, RefPos);
1761 if (Override ==
"all")
1765 if (Override ==
"none")
1766 return TargetLoweringBase::ReciprocalEstimate::Disabled;
1769 if (Override ==
"default")
1770 return TargetLoweringBase::ReciprocalEstimate::Unspecified;
1775 std::string VTNameNoSize = VTName;
1776 VTNameNoSize.pop_back();
1777 static const char DisabledPrefix =
'!';
1779 for (
StringRef RecipType : OverrideVector) {
1783 RecipType = RecipType.substr(0, RefPos);
1786 bool IsDisabled = RecipType[0] == DisabledPrefix;
1788 RecipType = RecipType.substr(1);
1790 if (RecipType.equals(VTName) || RecipType.equals(VTNameNoSize))
1791 return IsDisabled ? TargetLoweringBase::ReciprocalEstimate::Disabled
1795 return TargetLoweringBase::ReciprocalEstimate::Unspecified;
1802 if (Override.
empty())
1803 return TargetLoweringBase::ReciprocalEstimate::Unspecified;
1806 Override.
split(OverrideVector,
',');
1807 unsigned NumArgs = OverrideVector.
size();
1816 return TargetLoweringBase::ReciprocalEstimate::Unspecified;
1819 Override = Override.
substr(0, RefPos);
1820 assert(Override !=
"none" &&
1821 "Disabled reciprocals, but specifed refinement steps?");
1824 if (Override ==
"all" || Override ==
"default")
1830 std::string VTNameNoSize = VTName;
1831 VTNameNoSize.pop_back();
1833 for (
StringRef RecipType : OverrideVector) {
1839 RecipType = RecipType.substr(0, RefPos);
1840 if (RecipType.equals(VTName) || RecipType.equals(VTNameNoSize))
1844 return TargetLoweringBase::ReciprocalEstimate::Unspecified;
virtual std::pair< const TargetRegisterClass *, uint8_t > findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) const
Return the largest legal super-reg register class of the register class for the specified type and it...
static bool darwinHasSinCos(const Triple &TT)
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
bool isOSDarwin() const
isOSDarwin - Is this a "Darwin" OS (OS X, iOS, or watchOS).
static MVT getIntegerVT(unsigned BitWidth)
const MachineInstrBuilder & add(const MachineOperand &MO) const
A parsed version of the target data layout string in and methods for querying it. ...
const_iterator end(StringRef path)
Get end iterator over path.
FMINNUM/FMAXNUM - Perform floating-point minimum or maximum on two values.
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg If BaseGV is null...
C - The default llvm calling convention, compatible with C.
unsigned MaxLoadsPerMemcmpOptSize
bool isPow2VectorType() const
Returns true if the given vector is a power of 2.
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
void setMinimumJumpTableEntries(unsigned Val)
Indicate the minimum number of blocks to generate jump tables.
const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
This class represents lattice values for constants.
bool isMacOSX() const
isMacOSX - Is this a Mac OS X triple.
static MVT getVectorVT(MVT VT, unsigned NumElements)
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0...
Constant * getOrInsertFunction(StringRef Name, FunctionType *T, AttributeList AttributeList)
Look up the specified function in the module symbol table.
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
virtual MVT::SimpleValueType getCmpLibcallReturnType() const
Return the ValueType for comparison libcalls.
A Module instance is used to store all the information related to an LLVM module. ...
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Libcall getSYNC(unsigned Opc, MVT VT)
Return the SYNC_FETCH_AND_* value for the given opcode and type, or UNKNOWN_LIBCALL if there is none...
Carry-setting nodes for multiple precision addition and subtraction.
void push_back(const T &Elt)
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE size_t size() const
size - Get the string size.
Y = RRC X, rotate right via carry.
static cl::opt< bool > JumpIsExpensiveOverride("jump-is-expensive", cl::init(false), cl::desc("Do not create extra branches to split comparison logic."), cl::Hidden)
static cl::opt< unsigned > MinimumJumpTableEntries("min-jump-table-entries", cl::init(4), cl::Hidden, cl::desc("Set minimum number of entries to use a jump table."))
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Libcall
RTLIB::Libcall enum - This enum defines all of the runtime library calls the backend can emit...
MVT getPow2VectorType() const
Widens the length of the given vector MVT up to the nearest power of 2 and returns that type...
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
static cl::opt< int > MinPercentageForPredictableBranch("min-predictable-branch", cl::init(99), cl::desc("Minimum percentage (0-100) that a condition must be either true " "or false to assume that the condition is predictable"), cl::Hidden)
static int getOpEnabled(bool IsSqrt, EVT VT, StringRef Override)
For the input attribute string, return one of the ReciprocalEstimate enum status values (enabled...
unsigned getVectorNumElements() const
Externally visible function.
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
unsigned const TargetRegisterInfo * TRI
bool isInteger() const
Return true if this is an integer or a vector integer type.
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
[US]{MIN/MAX} - Binary minimum or maximum or signed or unsigned integers.
std::pair< LegalizeTypeAction, EVT > LegalizeKind
LegalizeKind holds the legalization kind that needs to happen to EVT in order to type-legalize it...
virtual unsigned getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Return the desired alignment for ByVal or InAlloca aggregate function arguments in the caller paramet...
unsigned getSpillSize(const TargetRegisterClass &RC) const
Return the size in bytes of the stack slot allocated to hold a spilled copy of a register from class ...
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
bool hasAttribute(unsigned Index, Attribute::AttrKind Kind) const
Return true if the attribute exists at the given index.
Libcall getFPROUND(EVT OpVT, EVT RetVT)
getFPROUND - Return the FPROUND_*_* value for the given types, or UNKNOWN_LIBCALL if there is none...
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
EVT getPow2VectorType(LLVMContext &Context) const
Widens the length of the given vector EVT up to the nearest power of 2 and returns that type...
const TargetRegisterClass * getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
int getRecipEstimateSqrtEnabled(EVT VT, MachineFunction &MF) const
Return a ReciprocalEstimate enum value for a square root of the given type based on the function's at...
Libcall getUINTTOFP(EVT OpVT, EVT RetVT)
getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none...
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
A description of a memory reference used in the backend.
amdgpu Simplify well known AMD library false Value Value const Twine & Name
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Shift and rotation operations.
unsigned getNumOperands() const
Retuns the total number of operands.
Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
LLVMContext & getContext() const
Get the global data context.
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth...
PointerType * getPointerTo(unsigned AddrSpace=0) const
Return a pointer to the current type.
RESULT = SMULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same wi...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
void freezeReservedRegs(const MachineFunction &)
freezeReservedRegs - Called by the register allocator to freeze the set of reserved registers before ...
This file contains the simple types necessary to represent the attributes associated with functions a...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted...
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN, ptr, amt) For double-word atomic operations: ValLo, ValHi, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amtLo, amtHi) ValLo, ValHi, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN, ptr, amtLo, amtHi) These correspond to the atomicrmw instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
Indicate that the specified operation does not work with the specified type and indicate what to do a...
void setJumpIsExpensive(bool isExpensive=true)
Tells the code generator not to expand logic operations on comparison predicates into separate sequen...
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, uint64_t s, unsigned base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
Position
Position to insert a new instruction relative to an existing instruction.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
OutputArg - This struct carries flags and a value for a single outgoing (actual) argument or outgoing...
unsigned getNumRegClasses() const
unsigned getSizeInBits() const
Fast - This calling convention attempts to make calls as fast as possible (e.g.
unsigned getSizeInBits() const
Return the size of the specified value type in bits.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
void computeRegisterProperties(const TargetRegisterInfo *TRI)
Once all of the register classes are added, this allows us to compute derived properties we expose...
unsigned MaxLoadsPerMemcmp
ArchType getArch() const
getArch - Get the parsed architecture type of this triple.
BasicBlock * GetInsertBlock() const
Simple integer binary arithmetic operators.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type. ...
bool isiOS() const
Is this an iOS triple.
static StringRef getRecipEstimateForFunc(MachineFunction &MF)
Get the reciprocal estimate attribute string for a function that will override the target defaults...
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out...
virtual bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AddrSpace, Instruction *I=nullptr) const
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
void addMemOperand(MachineFunction &MF, MachineMemOperand *MO)
Add a MachineMemOperand to the machine instruction.
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< uint64_t > *Offsets=nullptr, uint64_t StartingOffset=0)
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
MVT getVectorElementType() const
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
int getRecipEstimateDivEnabled(EVT VT, MachineFunction &MF) const
Return a ReciprocalEstimate enum value for a division of the given type based on the function's attri...
Class to represent pointers.
ARM_AAPCS_VFP - Same as ARM_AAPCS, but uses hard floating point ABI.
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
static cl::opt< unsigned > JumpTableDensity("jump-table-density", cl::init(10), cl::Hidden, cl::desc("Minimum density for building a jump table in " "a normal function"))
Minimum jump table density for normal functions.
The memory access is volatile.
virtual Value * getIRStackGuard(IRBuilder<> &IRB) const
If the target has a standard location for the stack protector guard, returns the address of that loca...
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
static std::string getReciprocalOpName(bool IsSqrt, EVT VT)
Construct a string for the given reciprocal operation of the given type.
unsigned getObjectAlignment(int ObjectIdx) const
Return the alignment of the specified stack object.
static void InitCmpLibcallCCs(ISD::CondCode *CCs)
InitCmpLibcallCCs - Set default comparison libcall CC.
initializer< Ty > init(const Ty &Val)
MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
The instances of the Type class are immutable: once they are created, they are never changed...
This is an important class for using LLVM in a threaded context.
Simple binary floating point operators.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
unsigned getScalarSizeInBits() const
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size FIXME: The defaults need to be removed once all of the backends/clients are updat...
Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL...
TargetLoweringBase(const TargetMachine &TM)
NOTE: The TargetMachine owns TLOF.
Carry-using nodes for multiple precision addition and subtraction.
Libcall getFPTOSINT(EVT OpVT, EVT RetVT)
getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none...
bool isAndroidVersionLT(unsigned Major) const
TRAP - Trapping instruction.
const Triple & getTargetTriple() const
DEBUGTRAP - Trap intended to get the attention of a debugger.
static cl::opt< unsigned > MaximumJumpTableSize("max-jump-table-size", cl::init(0), cl::Hidden, cl::desc("Set maximum size of jump tables; zero for no limit."))
unsigned MaxStoresPerMemmove
Specify maximum bytes of store instructions per memmove call.
Bit counting operators with an undefined result for zero inputs.
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo...
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
virtual Value * getSafeStackPointerLocation(IRBuilder<> &IRB) const
Returns the target-specific address of the unsafe stack pointer.
uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
static unsigned getVectorTypeBreakdownMVT(MVT VT, MVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT, TargetLoweringBase *TLI)
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
static PointerType * getInt8PtrTy(LLVMContext &C, unsigned AS=0)
int getDivRefinementSteps(EVT VT, MachineFunction &MF) const
Return the refinement step count for a division of the given type based on the function's attributes...
const TargetMachine & getTargetMachine() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
void setLibcallCallingConv(RTLIB::Libcall Call, CallingConv::ID CC)
Set the CallingConv that should be used for the specified libcall.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
Value * getDefaultSafeStackPointerLocation(IRBuilder<> &IRB, bool UseTLS) const
unsigned GatherAllAliasesMaxDepth
Depth that GatherAllAliases should should continue looking for chain dependencies when trying to find...
Triple - Helper class for working with autoconf configuration names.
This base class for TargetLowering contains the SelectionDAG-independent parts that can be used from ...
The memory access writes data.
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags...
Libcall getFPEXT(EVT OpVT, EVT RetVT)
getFPEXT - Return the FPEXT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none...
void initActions()
Initialize all of the actions to default values.
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
bool isLegalRC(const TargetRegisterInfo &TRI, const TargetRegisterClass &RC) const
Return true if the value types that can be represented by the specified register class are all legal...
EVT getRoundIntegerType(LLVMContext &Context) const
Rounds the bit-width of the given integer EVT up to the nearest power of two (and at least to eight)...
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual bool canOpTrap(unsigned Op, EVT VT) const
Returns true if the operation can trap for the value type.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, unsigned Align=1, bool *=nullptr) const
Determine if the target supports unaligned memory accesses.
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
ADDRSPACECAST - This operator converts between pointers of different address spaces.
MachineOperand class - Representation of each machine instruction operand.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Module.h This file contains the declarations for the Module class.
unsigned getMaximumJumpTableSize() const
Return upper limit for number of entries in a jump table.
LLVM_NODISCARD std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
static cl::opt< unsigned > OptsizeJumpTableDensity("optsize-jump-table-density", cl::init(40), cl::Hidden, cl::desc("Minimum density for building a jump table in " "an optsize function"))
Minimum jump table density for -Os or -Oz functions.
constexpr size_t array_lengthof(T(&)[N])
Find the length of an array.
virtual MVT getScalarShiftAmountTy(const DataLayout &, EVT) const
EVT is not used in-tree, but is used by out-of-tree target.
unsigned getABITypeAlignment(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimum or maximum on two values, following the IEEE-754 2008 definition.
const Function & getFunction() const
Return the LLVM function that this machine code represents.
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT...
void setIndexedLoadAction(unsigned IdxMode, MVT VT, LegalizeAction Action)
Indicate that the specified indexed load does or does not work with the specified type and indicate w...
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
bool isStatepointSpillSlotObjectIndex(int ObjectIdx) const
Select(COND, TRUEVAL, FALSEVAL).
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
unsigned getMinimumJumpTableDensity(bool OptForSize) const
Return lower limit of the density in a jump table.
void setMaximumJumpTableSize(unsigned)
Indicate the maximum number of entries in jump tables.
ZERO_EXTEND - Used for integer types, zeroing the new bits.
ANY_EXTEND - Used for integer types. The high bits are undefined.
ValueTypeActionImpl ValueTypeActions
#define OP_TO_LIBCALL(Name, Enum)
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
int InstructionOpcodeToISD(unsigned Opcode) const
Get the ISD node that corresponds to the Instruction class opcode.
virtual Value * getSSPStackGuardCheck(const Module &M) const
If the target has a standard stack protection check function that performs validation and error handl...
int getSqrtRefinementSteps(EVT VT, MachineFunction &MF) const
Return the refinement step count for a square root of the given type based on the function's attribut...
The memory access reads data.
static bool parseRefinementStep(StringRef In, size_t &Position, uint8_t &Value)
Return the character position and value (a single numeric character) of a customized refinement opera...
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca...
static MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
static mvt_range all_valuetypes()
SimpleValueType Iteration.
Representation of each machine instruction.
Libcall getFPTOUINT(EVT OpVT, EVT RetVT)
getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none...
bool isVector() const
Return true if this is a vector value type.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Constant * getOrInsertGlobal(StringRef Name, Type *Ty, function_ref< GlobalVariable *()> CreateGlobalCallback)
Look up the specified global in the module symbol table.
Bitwise operators - logical and, logical or, logical xor.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
MachineBasicBlock * emitXRayCustomEvent(MachineInstr &MI, MachineBasicBlock *MBB) const
Replace/modify the XRay custom event operands with target-dependent details.
StringRef getValueAsString() const
Return the attribute's value as a string.
bool isArch64Bit() const
Test whether the architecture is 64-bit.
void setTypeAction(MVT VT, LegalizeTypeAction Action)
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
const Function * getParent() const
Return the enclosing method, or null if none.
MachineBasicBlock * emitXRayTypedEvent(MachineInstr &MI, MachineBasicBlock *MBB) const
Replace/modify the XRay typed event operands with target-dependent details.
unsigned MaxGluedStoresPerMemcpy
Specify max number of store instructions to glue in inlined memcpy.
const MachineInstrBuilder & cloneMemRefs(const MachineInstr &OtherMI) const
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
unsigned MaxStoresPerMemmoveOptSize
Maximum number of store instructions that may be substituted for a call to memmove, used for functions with OptSize attribute.
bool isGNUEnvironment() const
unsigned MaxStoresPerMemcpyOptSize
Maximum number of store operations that may be substituted for a call to memcpy, used for functions w...
void setLibcallName(RTLIB::Libcall Call, const char *Name)
Rename the default libcall routine name for the specified libcall.
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
static const int LAST_INDEXED_MODE
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value *> Args=None, const Twine &Name="", MDNode *FPMathTag=nullptr)
virtual Value * getSDagStackGuard(const Module &M) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
unsigned MaxStoresPerMemcpy
Specify maximum bytes of store instructions per memcpy call.
bool isMacOSXVersionLT(unsigned Major, unsigned Minor=0, unsigned Micro=0) const
isMacOSXVersionLT - Comparison function for checking OS X version compatibility, which handles suppor...
Libcall getSINTTOFP(EVT OpVT, EVT RetVT)
getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none...
virtual unsigned getMinimumJumpTableEntries() const
Return lower limit for number of blocks in a jump table.
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
bool EnableExtLdPromotion
bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace=0, unsigned Alignment=1, bool *Fast=nullptr) const
Return true if the target supports a memory access of this type for the given address space and align...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
Module * getParent()
Get the module that this global value is contained inside of...
LLVM Value Representation.
virtual void finalizeLowering(MachineFunction &MF) const
Execute target specific actions to finalize target lowering.
virtual void insertSSPDeclarations(Module &M) const
Inserts necessary declarations for SSP (stack protection) purpose.
PREFETCH - This corresponds to a prefetch intrinsic.
bool isAndroid() const
Tests whether the target is Android.
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Primary interface to the complete machine description for the target machine.
StringRef - Represent a constant reference to a string, i.e.
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations...
SetCC operator - This evaluates to a true value iff the condition is true.
bool isOSVersionLT(unsigned Major, unsigned Minor=0, unsigned Micro=0) const
isOSVersionLT - Helper function for doing comparisons against version numbers included in the target ...
unsigned MaxStoresPerMemset
Specify maximum number of store instructions per memset call.
unsigned MaxStoresPerMemsetOptSize
Maximum number of stores operations that may be substituted for the call to memset, used for functions with OptSize attribute.
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
static int getOpRefinementSteps(bool IsSqrt, EVT VT, StringRef Override)
For the input attribute string, return the customized refinement step count for this operation on the...
TRUNCATE - Completely drop the high bits.
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE size_t find(char C, size_t From=0) const
Search for the first character C in the string.
virtual BranchProbability getPredictableBranchThreshold() const
If a branch or a select condition is skewed in one direction by more than this factor, it is very likely to be predicted correctly.
Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
const MachineOperand & getOperand(unsigned i) const
Perform various unary floating-point operations inspired by libm.
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
virtual TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const
Return the preferred vector type legalization action.
EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
void setBitsInMask(const uint32_t *Mask, unsigned MaskWords=~0u)
setBitsInMask - Add '1' bits from Mask to this vector.
std::pair< int, MVT > getTypeLegalizationCost(const DataLayout &DL, Type *Ty) const
Estimate the cost of type-legalization and the legalized type.
bool isValid() const
Returns true if this iterator is still pointing at a valid entry.
bool PredictableSelectIsExpensive
Tells the code generator that select is more expensive than a branch if the branch is usually predict...
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL, bool LegalTypes=true) const
Carry-using nodes for multiple precision addition and subtraction.
LegalizeTypeAction getTypeAction(MVT VT) const
This file describes how to lower LLVM code to machine code.
vt_iterator legalclasstypes_begin(const TargetRegisterClass &RC) const
Loop over all of the value types that can be represented by values in the given register class...
void setIndexedStoreAction(unsigned IdxMode, MVT VT, LegalizeAction Action)
Indicate that the specified indexed store does or does not work with the specified type and indicate ...
MachineBasicBlock * emitPatchPoint(MachineInstr &MI, MachineBasicBlock *MBB) const
Replace/modify any TargetFrameIndex operands with a targte-dependent sequence of memory operands that...