16#include "llvm/IR/IntrinsicsPowerPC.h"
25#define DEBUG_TYPE "ppctti"
28 cl::desc(
"Allow vp.load and vp.store for pwr9"),
39 cl::desc(
"Enable using coldcc calling conv for cold "
40 "internal functions"));
44 cl::desc(
"Do not add instruction count to lsr cost model"));
50 cl::desc(
"Loops with a constant trip count smaller than "
51 "this value will not use the count register."));
68std::optional<Instruction *>
74 case Intrinsic::ppc_altivec_lvx:
75 case Intrinsic::ppc_altivec_lvxl:
84 case Intrinsic::ppc_vsx_lxvw4x:
85 case Intrinsic::ppc_vsx_lxvd2x: {
90 case Intrinsic::ppc_altivec_stvx:
91 case Intrinsic::ppc_altivec_stvxl:
100 case Intrinsic::ppc_vsx_stxvw4x:
101 case Intrinsic::ppc_vsx_stxvd2x: {
106 case Intrinsic::ppc_altivec_vperm:
115 "Bad type for intrinsic!");
118 bool AllEltsOk =
true;
119 for (
unsigned I = 0;
I != 16; ++
I) {
120 Constant *Elt = Mask->getAggregateElement(
I);
136 Value *ExtractedElts[32];
137 memset(ExtractedElts, 0,
sizeof(ExtractedElts));
139 for (
unsigned I = 0;
I != 16; ++
I) {
145 if (
DL.isLittleEndian())
148 if (!ExtractedElts[Idx]) {
149 Value *Op0ToUse = (
DL.isLittleEndian()) ? Op1 : Op0;
150 Value *Op1ToUse = (
DL.isLittleEndian()) ? Op0 : Op1;
172 assert(Ty->isIntegerTy());
174 unsigned BitSize = Ty->getPrimitiveSizeInBits();
181 if (Imm.getBitWidth() <= 64) {
187 if ((Imm.getZExtValue() & 0xFFFF) == 0)
204 assert(Ty->isIntegerTy());
206 unsigned BitSize = Ty->getPrimitiveSizeInBits();
213 case Intrinsic::sadd_with_overflow:
214 case Intrinsic::uadd_with_overflow:
215 case Intrinsic::ssub_with_overflow:
216 case Intrinsic::usub_with_overflow:
217 if ((Idx == 1) && Imm.getBitWidth() <= 64 &&
isInt<16>(Imm.getSExtValue()))
220 case Intrinsic::experimental_stackmap:
221 if ((Idx < 2) || (Imm.getBitWidth() <= 64 &&
isInt<64>(Imm.getSExtValue())))
224 case Intrinsic::experimental_patchpoint_void:
225 case Intrinsic::experimental_patchpoint:
226 if ((Idx < 4) || (Imm.getBitWidth() <= 64 &&
isInt<64>(Imm.getSExtValue())))
240 assert(Ty->isIntegerTy());
242 unsigned BitSize = Ty->getPrimitiveSizeInBits();
246 unsigned ImmIdx = ~0U;
247 bool ShiftedFree =
false, RunFree =
false, UnsignedFree =
false,
252 case Instruction::GetElementPtr:
259 case Instruction::And:
262 case Instruction::Add:
263 case Instruction::Or:
264 case Instruction::Xor:
267 case Instruction::Sub:
268 case Instruction::Mul:
269 case Instruction::Shl:
270 case Instruction::LShr:
271 case Instruction::AShr:
274 case Instruction::ICmp:
279 case Instruction::Select:
282 case Instruction::PHI:
283 case Instruction::Call:
284 case Instruction::Ret:
285 case Instruction::Load:
286 case Instruction::Store:
290 if (ZeroFree && Imm == 0)
293 if (Idx == ImmIdx && Imm.getBitWidth() <= 64) {
298 if (Imm.getBitWidth() <= 32 &&
309 if (UnsignedFree &&
isUInt<16>(Imm.getZExtValue()))
312 if (ShiftedFree && (Imm.getZExtValue() & 0xFFFF) == 0)
322 return Ty->isVectorTy() && (Ty->getScalarSizeInBits() == 1) &&
323 (Ty->getPrimitiveSizeInBits() > 128);
334 if (U->getType()->isVectorTy()) {
353 TM.getTargetTransformInfo(*L->getHeader()->getParent());
362 Metrics.analyzeBasicBlock(BB, TTI, EphValues);
369 for (
auto *BB : L->getBlocks())
372 if (
Call->getIntrinsicID() == Intrinsic::set_loop_iterations ||
373 Call->getIntrinsicID() == Intrinsic::loop_decrement)
377 L->getExitingBlocks(ExitingBlocks);
381 for (
auto &BB : ExitingBlocks) {
386 uint64_t TrueWeight = 0, FalseWeight = 0;
387 if (!BI->isConditional() ||
393 bool TrueIsExit = !L->contains(BI->getSuccessor(0));
394 if (( TrueIsExit && FalseWeight < TrueWeight) ||
395 (!TrueIsExit && FalseWeight > TrueWeight))
440 return LoopHasReductions;
446 Options.LoadSizes = {8, 4, 2, 1};
447 Options.MaxNumLoads = TLI->getMaxExpandSizeMemcmp(OptSize);
458 return ClassID ==
VSXRC ? 64 : 32;
468 (Ty->getScalarType()->isFloatTy() || Ty->getScalarType()->isDoubleTy()))
470 if (Ty && (Ty->getScalarType()->isFP128Ty() ||
471 Ty->getScalarType()->isPPC_FP128Ty()))
473 if (Ty && Ty->getScalarType()->isHalfTy())
483 return "PPC::unknown register class";
484 case GPRRC:
return "PPC::GPRRC";
485 case FPRRC:
return "PPC::FPRRC";
486 case VRRC:
return "PPC::VRRC";
487 case VSXRC:
return "PPC::VSXRC";
507 unsigned Directive = ST->getCPUDirective();
523 unsigned Directive = ST->getCPUDirective();
567 if (!ST->vectorsUseTwoUnits() || !Ty1->
isVectorTy())
573 if (LT1.first != 1 || !LT1.second.isVector())
576 int ISD = TLI->InstructionOpcodeToISD(Opcode);
577 if (TLI->isOperationExpand(
ISD, LT1.second))
582 if (LT2.first != 1 || !LT2.second.isVector())
593 assert(TLI->InstructionOpcodeToISD(Opcode) &&
"Invalid opcode");
602 Op2Info, Args, CxtI);
606 Opcode, Ty,
CostKind, Op1Info, Op2Info);
607 return Cost * CostFactor;
631 return LT.first * CostFactor;
638 return Opcode == Instruction::PHI ? 0 : 1;
648 assert(TLI->InstructionOpcodeToISD(Opcode) &&
"Invalid opcode");
659 return Cost == 0 ? 0 : 1;
673 Opcode, ValTy, CondTy, VecPred,
CostKind, Op1Info, Op2Info,
I);
677 return Cost * CostFactor;
682 unsigned Index,
const Value *Op0,
683 const Value *Op1)
const {
686 int ISD = TLI->InstructionOpcodeToISD(Opcode);
700 Index == (ST->isLittleEndian() ? 1 : 0))
708 unsigned MaskCostForOneBitSize = (
VecMaskCost && EltSize == 1) ? 1 : 0;
710 unsigned MaskCostForIdx = (Index != -1U) ? 0 : 1;
711 if (ST->hasP9Altivec()) {
717 if (ST->hasP10Vector())
718 return CostFactor + MaskCostForIdx;
720 return 2 * CostFactor;
725 if (EltSize == 64 && Index != -1U)
728 unsigned MfvsrwzIndex = ST->isLittleEndian() ? 2 : 1;
729 if (Index == MfvsrwzIndex)
734 return CostFactor + MaskCostForIdx;
740 return CostFactor + MaskCostForOneBitSize + MaskCostForIdx;
742 }
else if (ST->hasDirectMove() && Index != -1U) {
747 return 3 + MaskCostForOneBitSize;
755 unsigned LHSPenalty = 2;
765 return LHSPenalty +
Cost;
781 if (TLI->getValueType(
DL, Src,
true) == MVT::Other)
786 assert((Opcode == Instruction::Load || Opcode == Instruction::Store) &&
797 bool IsAltivecType = ST->hasAltivec() &&
798 (LT.second == MVT::v16i8 || LT.second == MVT::v8i16 ||
799 LT.second == MVT::v4i32 || LT.second == MVT::v4f32);
800 bool IsVSXType = ST->hasVSX() &&
801 (LT.second == MVT::v2f64 || LT.second == MVT::v2i64);
808 unsigned MemBits = Src->getPrimitiveSizeInBits();
809 unsigned SrcBytes = LT.second.getStoreSize();
810 if (ST->hasVSX() && IsAltivecType) {
811 if (MemBits == 64 || (ST->hasP8Vector() && MemBits == 32))
815 if (Opcode == Instruction::Load && MemBits == 32 && Alignment < SrcBytes)
820 if (!SrcBytes || Alignment >= SrcBytes)
830 if (Opcode == Instruction::Load && (!ST->hasP8Vector() && IsAltivecType) &&
831 Alignment >= LT.second.getScalarType().getStoreSize())
832 return Cost + LT.first;
838 if (IsVSXType || (ST->hasVSX() && IsAltivecType))
842 if (TLI->allowsMisalignedMemoryAccesses(LT.second, 0))
849 Cost += LT.first * ((SrcBytes / Alignment.
value()) - 1);
854 if (Src->isVectorTy() && Opcode == Instruction::Store)
866 bool UseMaskForCond,
bool UseMaskForGaps)
const {
872 if (UseMaskForCond || UseMaskForGaps)
875 UseMaskForCond, UseMaskForGaps);
878 "Expect a vector type for interleaved memory op");
892 Cost += Factor*(LT.first-1);
908 TM.getSubtargetImpl(*Caller)->getFeatureBits();
910 TM.getSubtargetImpl(*Callee)->getFeatureBits();
914 return CallerBits == CalleeBits;
931 return Ty->isIntOrIntVectorTy(1) && Ty->getPrimitiveSizeInBits() > 128;
977 if (!TM.isELFv2ABI())
985 case Intrinsic::ppc_altivec_lvx:
986 case Intrinsic::ppc_altivec_lvxl:
987 case Intrinsic::ppc_altivec_lvebx:
988 case Intrinsic::ppc_altivec_lvehx:
989 case Intrinsic::ppc_altivec_lvewx:
990 case Intrinsic::ppc_vsx_lxvd2x:
991 case Intrinsic::ppc_vsx_lxvw4x:
992 case Intrinsic::ppc_vsx_lxvd2x_be:
993 case Intrinsic::ppc_vsx_lxvw4x_be:
994 case Intrinsic::ppc_vsx_lxvl:
995 case Intrinsic::ppc_vsx_lxvll:
996 case Intrinsic::ppc_vsx_lxvp: {
999 Info.WriteMem =
false;
1002 case Intrinsic::ppc_altivec_stvx:
1003 case Intrinsic::ppc_altivec_stvxl:
1004 case Intrinsic::ppc_altivec_stvebx:
1005 case Intrinsic::ppc_altivec_stvehx:
1006 case Intrinsic::ppc_altivec_stvewx:
1007 case Intrinsic::ppc_vsx_stxvd2x:
1008 case Intrinsic::ppc_vsx_stxvw4x:
1009 case Intrinsic::ppc_vsx_stxvd2x_be:
1010 case Intrinsic::ppc_vsx_stxvw4x_be:
1011 case Intrinsic::ppc_vsx_stxvl:
1012 case Intrinsic::ppc_vsx_stxvll:
1013 case Intrinsic::ppc_vsx_stxvp: {
1015 Info.ReadMem =
false;
1016 Info.WriteMem =
true;
1019 case Intrinsic::ppc_stbcx:
1020 case Intrinsic::ppc_sthcx:
1021 case Intrinsic::ppc_stdcx:
1022 case Intrinsic::ppc_stwcx: {
1024 Info.ReadMem =
false;
1025 Info.WriteMem =
true;
1036 return TLI->supportsTailCallFor(CB);
1045 unsigned Directive = ST->getCPUDirective();
1049 return DefaultLegalization;
1052 return DefaultLegalization;
1055 if (IID != Intrinsic::vp_load && IID != Intrinsic::vp_store)
1056 return DefaultLegalization;
1058 bool IsLoad = IID == Intrinsic::vp_load;
1060 EVT VT = TLI->getValueType(
DL, VecTy,
true);
1061 if (VT != MVT::v2i64 && VT != MVT::v4i32 && VT != MVT::v8i16 &&
1063 return DefaultLegalization;
1065 auto IsAllTrueMask = [](
Value *MaskVal) {
1068 return ConstValue->isAllOnesValue();
1071 unsigned MaskIx = IsLoad ? 1 : 2;
1073 return DefaultLegalization;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file provides a helper that implements much of the TTI interface in terms of the target-independ...
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
TargetTransformInfo::VPLegalization VPLegalization
This file provides the interface for the instcombine pass implementation.
uint64_t IntrinsicInst * II
This file contains the declarations for profiling metadata utility functions.
static unsigned getNumElements(Type *Ty)
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
InstructionCost getInterleavedMemoryOpCost(unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef< unsigned > Indices, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, bool UseMaskForCond=false, bool UseMaskForGaps=false) const override
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1) const override
InstructionCost getArithmeticInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Opd1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Opd2Info={TTI::OK_AnyValue, TTI::OP_None}, ArrayRef< const Value * > Args={}, const Instruction *CxtI=nullptr) const override
bool shouldBuildRelLookupTables() const override
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Op2Info={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE, TTI::UnrollingPreferences &UP, OptimizationRemarkEmitter *ORE) const override
void getPeelingPreferences(Loop *L, ScalarEvolution &SE, TTI::PeelingPreferences &PP) const override
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
std::pair< InstructionCost, MVT > getTypeLegalizationCost(Type *Ty) const
InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const override
InstructionCost getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, TTI::OperandValueInfo OpInfo={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
Conditional or Unconditional Branch instruction.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Value * getArgOperand(unsigned i) const
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
This is an important base class in LLVM.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Container class for subtarget features.
Value * CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, const Twine &Name="")
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
The core instruction combiner logic.
const DataLayout & getDataLayout() const
DominatorTree & getDominatorTree() const
AssumptionCache & getAssumptionCache() const
static InstructionCost getInvalid(CostType Val=0)
static InstructionCost getMax()
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
Represents a single loop in the control flow graph.
bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1, const TargetTransformInfo::LSRCost &C2) const override
InstructionCost vectorCostAdjustmentFactor(unsigned Opcode, Type *Ty1, Type *Ty2) const
InstructionCost getArithmeticInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Op2Info={TTI::OK_AnyValue, TTI::OP_None}, ArrayRef< const Value * > Args={}, const Instruction *CxtI=nullptr) const override
InstructionCost getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, TTI::OperandValueInfo OpInfo={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
InstructionCost getInterleavedMemoryOpCost(unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef< unsigned > Indices, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, bool UseMaskForCond=false, bool UseMaskForGaps=false) const override
bool enableInterleavedAccessVectorization() const override
unsigned getRegisterClassForType(bool Vector, Type *Ty=nullptr) const override
bool canSaveCmp(Loop *L, BranchInst **BI, ScalarEvolution *SE, LoopInfo *LI, DominatorTree *DT, AssumptionCache *AC, TargetLibraryInfo *LibInfo) const override
TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override
unsigned getCacheLineSize() const override
bool useColdCCForColdCall(Function &F) const override
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE, TTI::UnrollingPreferences &UP, OptimizationRemarkEmitter *ORE) const override
bool getTgtMemIntrinsic(IntrinsicInst *Inst, MemIntrinsicInfo &Info) const override
TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const override
bool isNumRegsMajorCostOfLSR() const override
unsigned getPrefetchDistance() const override
TargetTransformInfo::VPLegalization getVPLegalizationStrategy(const VPIntrinsic &PI) const override
bool areInlineCompatible(const Function *Caller, const Function *Callee) const override
unsigned getNumberOfRegisters(unsigned ClassID) const override
bool isHardwareLoopProfitable(Loop *L, ScalarEvolution &SE, AssumptionCache &AC, TargetLibraryInfo *LibInfo, HardwareLoopInfo &HWLoopInfo) const override
void getPeelingPreferences(Loop *L, ScalarEvolution &SE, TTI::PeelingPreferences &PP) const override
InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind, Instruction *Inst=nullptr) const override
InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const override
Get intrinsic cost based on arguments.
const char * getRegisterClassName(unsigned ClassID) const override
InstructionCost getInstructionCost(const User *U, ArrayRef< const Value * > Operands, TTI::TargetCostKind CostKind) const override
unsigned getMaxInterleaveFactor(ElementCount VF) const override
bool shouldBuildRelLookupTables() const override
bool supportsTailCallFor(const CallBase *CB) const override
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, ArrayRef< int > Mask, TTI::TargetCostKind CostKind, int Index, VectorType *SubTp, ArrayRef< const Value * > Args={}, const Instruction *CxtI=nullptr) const override
InstructionCost getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) const override
bool areTypesABICompatible(const Function *Caller, const Function *Callee, ArrayRef< Type * > Types) const override
TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Op2Info={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
bool enableAggressiveInterleaving(bool LoopHasReductions) const override
InstructionCost getIntImmCost(const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) const override
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1) const override
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
std::optional< Instruction * > instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const override
Common code between 32-bit and 64-bit PowerPC targets.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
The main scalar evolution driver.
LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Provides information about what library functions are available for the current target.
Primary interface to the complete machine description for the target machine.
Provide an instruction scheduling machine model to CodeGen passes.
unsigned getIssueWidth() const
Maximum number of micro-ops that may be scheduled per cycle.
LLVM_ABI void init(const TargetSubtargetInfo *TSInfo, bool EnableSModel=true, bool EnableSItins=true)
Initialize the machine model for instruction scheduling.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static constexpr TypeSize getFixed(ScalarTy ExactSize)
static constexpr TypeSize getScalable(ScalarTy MinimumSize)
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
bool isVectorTy() const
True if this is an instance of VectorType.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
Value * getOperand(unsigned i) const
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
Base class of all SIMD vector types.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
constexpr bool isShiftedMask_32(uint32_t Value)
Return true if the argument contains a non-empty sequence of ones with the remainder zero (32 bit ver...
constexpr bool isShiftedMask_64(uint64_t Value)
Return true if the argument contains a non-empty sequence of ones with the remainder zero (64 bit ver...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Utility to calculate the size and a few similar metrics for a set of basic blocks.
static LLVM_ABI void collectEphemeralValues(const Loop *L, AssumptionCache *AC, SmallPtrSetImpl< const Value * > &EphValues)
Collect a loop's ephemeral values (those used only by an assume or similar intrinsics in the loop).
Attributes of a target dependent hardware loop.
LLVM_ABI bool canAnalyze(LoopInfo &LI)
LLVM_ABI bool isHardwareLoopCandidate(ScalarEvolution &SE, LoopInfo &LI, DominatorTree &DT, bool ForceNestedLoop=false, bool ForceHardwareLoopPHI=false)
Information about a load/store intrinsic defined by the target.