16#include "llvm/IR/IntrinsicsPowerPC.h"
25#define DEBUG_TYPE "ppctti"
28 cl::desc(
"Allow EVL type vp.load/vp.store"),
32 cl::desc(
"Allow vp.load and vp.store for pwr9"),
40 cl::desc(
"enable constant hoisting on PPC"),
45 cl::desc(
"Enable using coldcc calling conv for cold "
46 "internal functions"));
50 cl::desc(
"Do not add instruction count to lsr cost model"));
56 cl::desc(
"Loops with a constant trip count smaller than "
57 "this value will not use the count register."));
74std::optional<Instruction *>
80 case Intrinsic::ppc_altivec_lvx:
81 case Intrinsic::ppc_altivec_lvxl:
86 Value *Ptr =
II.getArgOperand(0);
90 case Intrinsic::ppc_vsx_lxvw4x:
91 case Intrinsic::ppc_vsx_lxvd2x: {
93 Value *Ptr =
II.getArgOperand(0);
96 case Intrinsic::ppc_altivec_stvx:
97 case Intrinsic::ppc_altivec_stvxl:
102 Value *Ptr =
II.getArgOperand(1);
106 case Intrinsic::ppc_vsx_stxvw4x:
107 case Intrinsic::ppc_vsx_stxvd2x: {
109 Value *Ptr =
II.getArgOperand(1);
112 case Intrinsic::ppc_altivec_vperm:
121 "Bad type for intrinsic!");
124 bool AllEltsOk =
true;
125 for (
unsigned I = 0;
I != 16; ++
I) {
126 Constant *Elt = Mask->getAggregateElement(
I);
142 Value *ExtractedElts[32];
143 memset(ExtractedElts, 0,
sizeof(ExtractedElts));
145 for (
unsigned I = 0;
I != 16; ++
I) {
151 if (
DL.isLittleEndian())
154 if (!ExtractedElts[Idx]) {
155 Value *Op0ToUse = (
DL.isLittleEndian()) ? Op1 : Op0;
156 Value *Op1ToUse = (
DL.isLittleEndian()) ? Op0 : Op1;
158 Idx < 16 ? Op0ToUse : Op1ToUse, Idx & 15);
178 assert(Ty->isIntegerTy());
180 unsigned BitSize = Ty->getPrimitiveSizeInBits();
187 if (
Imm.getBitWidth() <= 64) {
193 if ((
Imm.getZExtValue() & 0xFFFF) == 0)
210 assert(Ty->isIntegerTy());
212 unsigned BitSize = Ty->getPrimitiveSizeInBits();
219 case Intrinsic::sadd_with_overflow:
220 case Intrinsic::uadd_with_overflow:
221 case Intrinsic::ssub_with_overflow:
222 case Intrinsic::usub_with_overflow:
223 if ((Idx == 1) &&
Imm.getBitWidth() <= 64 &&
isInt<16>(
Imm.getSExtValue()))
226 case Intrinsic::experimental_stackmap:
227 if ((Idx < 2) || (
Imm.getBitWidth() <= 64 &&
isInt<64>(
Imm.getSExtValue())))
230 case Intrinsic::experimental_patchpoint_void:
231 case Intrinsic::experimental_patchpoint:
232 if ((Idx < 4) || (
Imm.getBitWidth() <= 64 &&
isInt<64>(
Imm.getSExtValue())))
246 assert(Ty->isIntegerTy());
248 unsigned BitSize = Ty->getPrimitiveSizeInBits();
252 unsigned ImmIdx = ~0U;
253 bool ShiftedFree =
false, RunFree =
false, UnsignedFree =
false,
258 case Instruction::GetElementPtr:
265 case Instruction::And:
268 case Instruction::Add:
269 case Instruction::Or:
270 case Instruction::Xor:
273 case Instruction::Sub:
274 case Instruction::Mul:
275 case Instruction::Shl:
276 case Instruction::LShr:
277 case Instruction::AShr:
280 case Instruction::ICmp:
285 case Instruction::Select:
288 case Instruction::PHI:
289 case Instruction::Call:
290 case Instruction::Ret:
291 case Instruction::Load:
292 case Instruction::Store:
296 if (ZeroFree &&
Imm == 0)
299 if (Idx == ImmIdx &&
Imm.getBitWidth() <= 64) {
304 if (
Imm.getBitWidth() <= 32 &&
318 if (ShiftedFree && (
Imm.getZExtValue() & 0xFFFF) == 0)
328 return Ty->isVectorTy() && (Ty->getScalarSizeInBits() == 1) &&
329 (Ty->getPrimitiveSizeInBits() > 128);
340 if (U->getType()->isVectorTy()) {
377 for (
auto *BB : L->getBlocks())
380 if (
Call->getIntrinsicID() == Intrinsic::set_loop_iterations ||
381 Call->getIntrinsicID() == Intrinsic::loop_decrement)
385 L->getExitingBlocks(ExitingBlocks);
389 for (
auto &BB : ExitingBlocks) {
394 uint64_t TrueWeight = 0, FalseWeight = 0;
400 bool TrueIsExit = !L->contains(BI->getSuccessor(0));
401 if (( TrueIsExit && FalseWeight < TrueWeight) ||
402 (!TrueIsExit && FalseWeight > TrueWeight))
447 return LoopHasReductions;
453 if (getST()->hasAltivec())
454 Options.LoadSizes = {16, 8, 4, 2, 1};
456 Options.LoadSizes = {8, 4, 2, 1};
458 Options.MaxNumLoads = TLI->getMaxExpandSizeMemcmp(OptSize);
469 return ClassID ==
VSXRC ? 64 : 32;
479 (Ty->getScalarType()->isFloatTy() || Ty->getScalarType()->isDoubleTy()))
481 if (Ty && (Ty->getScalarType()->isFP128Ty() ||
482 Ty->getScalarType()->isPPC_FP128Ty()))
484 if (Ty && Ty->getScalarType()->isHalfTy())
494 return "PPC::unknown register class";
495 case GPRRC:
return "PPC::GPRRC";
496 case FPRRC:
return "PPC::FPRRC";
497 case VRRC:
return "PPC::VRRC";
498 case VSXRC:
return "PPC::VSXRC";
518 unsigned Directive = ST->getCPUDirective();
534 bool HasUnorderedReductions)
const {
535 unsigned Directive = ST->getCPUDirective();
579 if (!ST->vectorsUseTwoUnits() || !Ty1->
isVectorTy())
585 if (LT1.first != 1 || !LT1.second.isVector())
588 int ISD = TLI->InstructionOpcodeToISD(Opcode);
589 if (TLI->isOperationExpand(
ISD, LT1.second))
594 if (LT2.first != 1 || !LT2.second.isVector())
605 assert(TLI->InstructionOpcodeToISD(Opcode) &&
"Invalid opcode");
614 Op2Info, Args, CtxI);
618 Opcode, Ty,
CostKind, Op1Info, Op2Info);
619 return Cost * CostFactor;
641 return LT.first * CostFactor;
648 return Opcode == Instruction::PHI ? 0 : 1;
658 assert(TLI->InstructionOpcodeToISD(Opcode) &&
"Invalid opcode");
669 return Cost == 0 ? 0 : 1;
683 Opcode, ValTy, CondTy, VecPred,
CostKind, Op1Info, Op2Info,
I);
687 return Cost * CostFactor;
695 int ISD = TLI->InstructionOpcodeToISD(Opcode);
709 Index == (ST->isLittleEndian() ? 1 : 0))
717 unsigned MaskCostForOneBitSize = (
VecMaskCost && EltSize == 1) ? 1 : 0;
719 unsigned MaskCostForIdx = (Index != -1U) ? 0 : 1;
720 if (ST->hasP9Altivec()) {
726 if (ST->hasP10Vector())
727 return CostFactor + MaskCostForIdx;
729 return 2 * CostFactor;
734 if (EltSize == 64 && Index != -1U)
737 unsigned MfvsrwzIndex = ST->isLittleEndian() ? 2 : 1;
738 if (Index == MfvsrwzIndex)
743 return CostFactor + MaskCostForIdx;
749 return CostFactor + MaskCostForOneBitSize + MaskCostForIdx;
751 }
else if (ST->hasDirectMove() && Index != -1U) {
756 return 3 + MaskCostForOneBitSize;
764 unsigned LHSPenalty = 2;
774 return LHSPenalty +
Cost;
789 if (TLI->getValueType(
DL, Src,
true) == MVT::Other)
794 assert((Opcode == Instruction::Load || Opcode == Instruction::Store) &&
805 bool IsAltivecType = ST->hasAltivec() &&
806 (LT.second == MVT::v16i8 || LT.second == MVT::v8i16 ||
807 LT.second == MVT::v4i32 || LT.second == MVT::v4f32);
808 bool IsVSXType = ST->hasVSX() &&
809 (LT.second == MVT::v2f64 || LT.second == MVT::v2i64);
816 unsigned MemBits = Src->getPrimitiveSizeInBits();
817 unsigned SrcBytes = LT.second.getStoreSize();
818 if (ST->hasVSX() && IsAltivecType) {
819 if (MemBits == 64 || (ST->hasP8Vector() && MemBits == 32))
823 if (Opcode == Instruction::Load && MemBits == 32 && Alignment < SrcBytes)
828 if (!SrcBytes || Alignment >= SrcBytes)
838 if (Opcode == Instruction::Load && (!ST->hasP8Vector() && IsAltivecType) &&
839 Alignment >= LT.second.getScalarType().getStoreSize())
840 return Cost + LT.first;
846 if (IsVSXType || (ST->hasVSX() && IsAltivecType))
850 if (TLI->allowsMisalignedMemoryAccesses(LT.second, 0))
857 Cost += LT.first * ((SrcBytes / Alignment.value()) - 1);
862 if (Src->isVectorTy() && Opcode == Instruction::Store)
875 bool UseMaskForCond,
bool UseMaskForGaps)
const {
881 if (UseMaskForCond || UseMaskForGaps)
884 UseMaskForCond, UseMaskForGaps);
887 "Expect a vector type for interleaved memory op");
901 Cost += Factor*(LT.first-1);
913 if (ICA.
getID() == Intrinsic::vp_load) {
919 if (ICA.
getID() == Intrinsic::vp_store) {
942 return Ty->isIntOrIntVectorTy(1) && Ty->getPrimitiveSizeInBits() > 128;
987 if (!ST->isELFv2ABI())
995 case Intrinsic::ppc_altivec_lvx:
996 case Intrinsic::ppc_altivec_lvxl:
997 case Intrinsic::ppc_altivec_lvebx:
998 case Intrinsic::ppc_altivec_lvehx:
999 case Intrinsic::ppc_altivec_lvewx:
1000 case Intrinsic::ppc_vsx_lxvd2x:
1001 case Intrinsic::ppc_vsx_lxvw4x:
1002 case Intrinsic::ppc_vsx_lxvd2x_be:
1003 case Intrinsic::ppc_vsx_lxvw4x_be:
1004 case Intrinsic::ppc_vsx_lxvl:
1005 case Intrinsic::ppc_vsx_lxvll:
1006 case Intrinsic::ppc_vsx_lxvp: {
1008 Info.ReadMem =
true;
1009 Info.WriteMem =
false;
1012 case Intrinsic::ppc_altivec_stvx:
1013 case Intrinsic::ppc_altivec_stvxl:
1014 case Intrinsic::ppc_altivec_stvebx:
1015 case Intrinsic::ppc_altivec_stvehx:
1016 case Intrinsic::ppc_altivec_stvewx:
1017 case Intrinsic::ppc_vsx_stxvd2x:
1018 case Intrinsic::ppc_vsx_stxvw4x:
1019 case Intrinsic::ppc_vsx_stxvd2x_be:
1020 case Intrinsic::ppc_vsx_stxvw4x_be:
1021 case Intrinsic::ppc_vsx_stxvl:
1022 case Intrinsic::ppc_vsx_stxvll:
1023 case Intrinsic::ppc_vsx_stxvp: {
1025 Info.ReadMem =
false;
1026 Info.WriteMem =
true;
1029 case Intrinsic::ppc_stbcx:
1030 case Intrinsic::ppc_sthcx:
1031 case Intrinsic::ppc_stdcx:
1032 case Intrinsic::ppc_stwcx: {
1034 Info.ReadMem =
false;
1035 Info.WriteMem =
true;
1046 return TLI->supportsTailCallFor(CB);
1055 unsigned Directive = ST->getCPUDirective();
1059 return DefaultLegalization;
1062 return DefaultLegalization;
1065 if (IID != Intrinsic::vp_load && IID != Intrinsic::vp_store)
1066 return DefaultLegalization;
1068 bool IsLoad = IID == Intrinsic::vp_load;
1070 EVT VT = TLI->getValueType(
DL, VecTy,
true);
1071 if (VT != MVT::v2i64 && VT != MVT::v4i32 && VT != MVT::v8i16 &&
1073 return DefaultLegalization;
1075 auto IsAllTrueMask = [](
Value *MaskVal) {
1078 return ConstValue->isAllOnesValue();
1081 unsigned MaskIx = IsLoad ? 1 : 2;
1083 return DefaultLegalization;
1089 if (!
PPCEVL || !ST->isPPC64())
1091 unsigned CPU = ST->getCPUDirective();
1102 auto IsLegalLoadWithLengthType = [](
EVT VT) {
1103 if (VT != MVT::i64 && VT != MVT::i32 && VT != MVT::i16 && VT != MVT::i8)
1108 return IsLegalLoadWithLengthType(TLI->getValueType(
DL, DataType,
true));
1124 switch (MICA.
getID()) {
1125 case Intrinsic::masked_load:
1126 Opcode = Instruction::Load;
1128 case Intrinsic::masked_store:
1129 Opcode = Instruction::Store;
1142 if (Opcode == Instruction::Load) {
1149 if (VecTy->getPrimitiveSizeInBits() > 128)
1158 VecTy->getScalarSizeInBits() != 8)
1164 unsigned Opcode,
Type *InputTypeA,
Type *InputTypeB,
Type *AccumType,
1170 if (!getST()->hasAltivec())
1172 if (Opcode != Instruction::Add)
1175 EVT AccVT = TLI->getValueType(
DL, AccumType,
true);
1176 if (AccVT != MVT::i32)
1180 EVT AVT = TLI->getValueType(
DL, ATy,
true);
1187 if (AVT != MVT::v16i8 && AVT != MVT::v8i16)
1193 if (BinOp.value() != Instruction::Mul)
1195 if (InputTypeA != InputTypeB)
1200 if (AVT == MVT::v16i8) {
1204 }
else if (AVT == MVT::v8i16) {
1206 if (OpAExtend != OpBExtend)
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 GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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.
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
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
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
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 *CtxI=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 getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const override
InstructionCost getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA, 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
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.
Conditional Branch instruction.
This is an important base class in LLVM.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Value * CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, const Twine &Name="")
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
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()
const SmallVectorImpl< Type * > & getArgTypes() const
Type * getReturnType() const
Intrinsic::ID getID() const
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.
Information for memory intrinsic cost model.
Align getAlignment() const
unsigned getAddressSpace() const
Type * getDataType() const
Intrinsic::ID getID() const
bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1, const TargetTransformInfo::LSRCost &C2) const override
InstructionCost vectorCostAdjustmentFactor(unsigned Opcode, Type *Ty1, Type *Ty2) const
unsigned getMaxInterleaveFactor(ElementCount VF, bool HasUnorderedReductions) const override
InstructionCost getPartialReductionCost(unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType, ElementCount VF, TTI::PartialReductionExtendKind OpAExtend, TTI::PartialReductionExtendKind OpBExtend, std::optional< unsigned > BinOp, TTI::TargetCostKind CostKind, std::optional< FastMathFlags > FMF) 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
bool isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned AddressSpace, TTI::MaskKind MaskKind=TTI::MaskKind::VariableOrConstantMask) 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
TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override
unsigned getCacheLineSize() const override
bool hasActiveVectorLength() const override
InstructionCost getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const override
Get memory intrinsic cost based on arguments.
bool useColdCCForColdCall(Function &F) const override
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 *CtxI=nullptr) 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 isLegalMaskedStore(Type *DataType, Align Alignment, unsigned AddressSpace, TTI::MaskKind MaskKind=TTI::MaskKind::VariableOrConstantMask) const override
bool isNumRegsMajorCostOfLSR() const override
unsigned getPrefetchDistance() const override
TargetTransformInfo::VPLegalization getVPLegalizationStrategy(const VPIntrinsic &PI) const override
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) 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 getShuffleCost(TTI::ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, TTI::TargetCostKind CostKind, ArrayRef< int > Mask, int Index, VectorType *SubTp, ArrayRef< const Value * > Args={}, const Instruction *CtxI=nullptr, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) 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
bool shouldBuildRelLookupTables() const override
bool supportsTailCallFor(const CallBase *CB) const override
bool canSaveCmp(Loop *L, CondBrInst **BI, ScalarEvolution *SE, LoopInfo *LI, DominatorTree *DT, AssumptionCache *AC, TargetLibraryInfo *LibInfo) 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 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.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
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.
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.
static LLVM_ABI bool isVPIntrinsic(Intrinsic::ID)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
Base class of all SIMD vector types.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
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.
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
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.
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.
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.