LLVM 24.0.0git
X86TargetTransformInfo.h
Go to the documentation of this file.
1//===-- X86TargetTransformInfo.h - X86 specific TTI -------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8/// \file
9/// This file a TargetTransformInfoImplBase conforming object specific to the
10/// X86 target machine. It uses the target's detailed information to
11/// provide more precise answers to certain TTI queries, while letting the
12/// target independent and default TTI implementations handle the rest.
13///
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_LIB_TARGET_X86_X86TARGETTRANSFORMINFO_H
17#define LLVM_LIB_TARGET_X86_X86TARGETTRANSFORMINFO_H
18
19#include "X86TargetMachine.h"
22#include <optional>
23
24namespace llvm {
25
26class InstCombiner;
27
28class X86TTIImpl final : public BasicTTIImplBase<X86TTIImpl> {
29 typedef BasicTTIImplBase<X86TTIImpl> BaseT;
30 typedef TargetTransformInfo TTI;
31 friend BaseT;
32
33 const X86Subtarget *ST;
34 const X86TargetLowering *TLI;
35
36 const X86Subtarget *getST() const { return ST; }
37 const X86TargetLowering *getTLI() const { return TLI; }
38
39public:
40 explicit X86TTIImpl(const X86TargetMachine *TM, const Function &F)
41 : BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)),
42 TLI(ST->getTargetLowering()) {}
43
44 /// \name Scalar TTI Implementations
45 /// @{
46 TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override;
47
48 /// @}
49
50 /// \name Cache TTI Implementation
51 /// @{
52 std::optional<unsigned> getCacheSize(
53 TargetTransformInfo::CacheLevel Level) const override;
54 std::optional<unsigned> getCacheAssociativity(
55 TargetTransformInfo::CacheLevel Level) const override;
56 /// @}
57
58 /// \name Vector TTI Implementations
59 /// @{
60
61 unsigned getNumberOfRegisters(unsigned ClassID) const override;
62 unsigned getRegisterClassForType(bool Vector, Type *Ty) const override;
63 bool hasConditionalLoadStoreForType(Type *Ty, bool IsStore) const override;
66 unsigned getLoadStoreVecRegBitWidth(unsigned AS) const override;
68 bool HasUnorderedReductions) const override;
70 unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
74 const Instruction *CtxI = nullptr) const override;
76 getAltInstrCost(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1,
77 const SmallBitVector &OpcodeMask,
79 ArrayRef<const Value *> Scalars) const override;
80
82 getShuffleCost(TTI::ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy,
83 TTI::TargetCostKind CostKind, ArrayRef<int> Mask, int Index,
84 VectorType *SubTp, ArrayRef<const Value *> Args = {},
85 const Instruction *CtxI = nullptr,
87 TTI::VectorInstrContext::None) const override;
89 getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
91 const Instruction *I = nullptr) const override;
93 unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
97 const Instruction *I = nullptr) const override;
101 unsigned Index, const Value *Op0, const Value *Op1,
103 TTI::VectorInstrContext::None) const override;
105 getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts,
106 bool Insert, bool Extract,
108 bool ForPoisonSrc = true, ArrayRef<Value *> VL = {},
110 TTI::VectorInstrContext::None) const override;
112 getReplicationShuffleCost(Type *EltTy, int ReplicationFactor, int VF,
113 const APInt &DemandedDstElts,
114 TTI::TargetCostKind CostKind) const override;
116 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
119 const Instruction *I = nullptr) const override;
121 getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA,
122 TTI::TargetCostKind CostKind) const override;
123 InstructionCost getMaskedMemoryOpCost(const MemIntrinsicCostAttributes &MICA,
125 InstructionCost getGatherScatterOpCost(const MemIntrinsicCostAttributes &MICA,
129 const TTI::PointersChainInfo &Info, Type *AccessTy,
130 const TTI::TargetCostKind CostKind) const override;
132 getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr,
133 TTI::TargetCostKind CostKind) const override;
134
135 std::optional<Instruction *>
136 instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const override;
137 std::optional<Value *>
139 APInt DemandedMask, KnownBits &Known,
140 bool &KnownBitsComputed) const override;
141 std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
142 InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
143 APInt &UndefElts2, APInt &UndefElts3,
144 std::function<void(Instruction *, unsigned, APInt, APInt &)>
145 SimplifyAndSetOp) const override;
146
147 unsigned getAtomicMemIntrinsicMaxElementSize() const override;
148
150 getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
151 TTI::TargetCostKind CostKind) const override;
152
154 getArithmeticReductionCost(unsigned Opcode, VectorType *Ty,
155 std::optional<FastMathFlags> FMF,
156 TTI::TargetCostKind CostKind) const override;
157
159 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
160 ElementCount VF, TTI::PartialReductionExtendKind OpAExtend,
161 TTI::PartialReductionExtendKind OpBExtend, std::optional<unsigned> BinOp,
163 std::optional<FastMathFlags> FMF) const override;
164
167 FastMathFlags FMF) const;
168
170 getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF,
171 TTI::TargetCostKind CostKind) const override;
172
174 unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
175 Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
176 bool UseMaskForCond = false, bool UseMaskForGaps = false) const override;
178 unsigned Opcode, FixedVectorType *VecTy, unsigned Factor,
179 ArrayRef<unsigned> Indices, Align Alignment, unsigned AddressSpace,
180 TTI::TargetCostKind CostKind, bool UseMaskForCond = false,
181 bool UseMaskForGaps = false) const;
182
183 InstructionCost getIntImmCost(int64_t) const;
184
185 InstructionCost getIntImmCost(const APInt &Imm, Type *Ty,
186 TTI::TargetCostKind CostKind) const override;
187
189 const Instruction *I = nullptr) const override;
190
191 InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx,
192 const APInt &Imm, Type *Ty,
194 Instruction *Inst = nullptr) const override;
196 getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm,
197 Type *Ty, TTI::TargetCostKind CostKind) const override;
198 /// Return the cost of the scaling factor used in the addressing
199 /// mode represented by AM for this target, for a load/store
200 /// of the specified type.
201 /// If the AM is supported, the return value must be >= 0.
202 /// If the AM is not supported, it returns an invalid cost.
203 InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
204 StackOffset BaseOffset, bool HasBaseReg,
205 int64_t Scale,
206 unsigned AddrSpace) const override;
207
208 bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1,
209 const TargetTransformInfo::LSRCost &C2) const override;
210 bool canMacroFuseCmp() const override;
211 bool
212 isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned AddressSpace,
213 TTI::MaskKind MaskKind =
215 bool
216 isLegalMaskedStore(Type *DataType, Align Alignment, unsigned AddressSpace,
217 TTI::MaskKind MaskKind =
219 bool isLegalNTLoad(Type *DataType, Align Alignment) const override;
220 bool isLegalNTStore(Type *DataType, Align Alignment) const override;
221 bool isLegalBroadcastLoad(Type *ElementTy,
222 ElementCount NumElements) const override;
223 bool forceScalarizeMaskedGather(VectorType *VTy,
224 Align Alignment) const override;
226 Align Alignment) const override {
227 return forceScalarizeMaskedGather(VTy, Alignment);
228 }
229 bool isLegalMaskedGatherScatter(Type *DataType, Align Alignment) const;
230 bool isLegalMaskedGather(Type *DataType, Align Alignment) const override;
231 bool isLegalMaskedScatter(Type *DataType, Align Alignment) const override;
232 bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment) const override;
233 bool isLegalMaskedCompressStore(Type *DataType,
234 Align Alignment) const override;
235 bool isLegalAltInstr(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1,
236 const SmallBitVector &OpcodeMask,
237 ArrayRef<const Value *> Scalars) const override;
238 bool hasDivRemOp(Type *DataType, bool IsSigned) const override;
239 bool isExpensiveToSpeculativelyExecute(const Instruction *I) const override;
240 bool isFCmpOrdCheaperThanFCmpZero(Type *Ty) const override;
241 bool areInlineCompatible(const Function *Caller,
242 const Function *Callee) const override;
243 bool areTypesABICompatible(const Function *Caller, const Function *Callee,
244 ArrayRef<Type *> Type) const override;
245
247 return ST->getMaxInlineSizeThreshold();
248 }
249
251 enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override;
252 bool preferAlternateOpcodeVectorization() const override { return false; }
253 bool prefersVectorizedAddressing() const override;
254 bool supportsEfficientVectorElementLoadStore() const override;
255 bool enableInterleavedAccessVectorization() const override;
256
257 bool shouldExpandReduction(const IntrinsicInst *II) const override;
258
260
262 SmallVectorImpl<Use *> &Ops) const override;
263
264 bool isVectorShiftByScalarCheap(Type *Ty) const override;
265
266 unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy,
267 Align Alignment,
268 unsigned AddrSpace) const override;
269
270 bool useFastCCForInternalCall(Function &F) const override;
271
272private:
273 bool supportsGather() const;
274 InstructionCost getGSVectorCost(unsigned Opcode, TTI::TargetCostKind CostKind,
275 Type *DataTy, const Value *Ptr,
276 Align Alignment, unsigned AddressSpace) const;
277
278 int getGatherOverhead() const;
279 int getScatterOverhead() const;
280
281 /// @}
282};
283
284} // end namespace llvm
285
286#endif
unsigned Imm
unsigned uint64_t
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")))
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine InstCombiner
uint64_t IntrinsicInst * II
This pass exposes codegen information to IR-level passes.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
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
BasicTTIImplBase(const TargetMachine *TM, const DataLayout &DL)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
The core instruction combiner logic.
A wrapper class for inspecting calls to intrinsic functions.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
virtual const DataLayout & getDataLayout() const
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
MaskKind
Some targets only support masked load/store with a constant mask.
TargetCostKind
The kind of cost model.
PopcntSupportKind
Flags indicating the kind of support for population count.
llvm::VectorInstrContext VectorInstrContext
ShuffleKind
The various kinds of shuffle patterns for vector queries.
CastContextHint
Represents a hint about the context in which a cast is used.
CacheLevel
The possible cache levels.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
Base class of all SIMD vector types.
bool useFastCCForInternalCall(Function &F) const override
bool isLegalAltInstr(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1, const SmallBitVector &OpcodeMask, ArrayRef< const Value * > Scalars) const override
InstructionCost getReplicationShuffleCost(Type *EltTy, int ReplicationFactor, int VF, const APInt &DemandedDstElts, TTI::TargetCostKind CostKind) const override
bool isLegalNTLoad(Type *DataType, Align Alignment) const override
std::optional< unsigned > getCacheAssociativity(TargetTransformInfo::CacheLevel Level) const override
InstructionCost getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF, TTI::TargetCostKind CostKind) const override
Try to calculate op costs for min/max reduction operations.
bool isLegalBroadcastLoad(Type *ElementTy, ElementCount NumElements) const override
unsigned getRegisterClassForType(bool Vector, Type *Ty) const override
InstructionCost getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const override
Get memory intrinsic cost based on arguments.
unsigned getMaxInterleaveFactor(ElementCount VF, bool HasUnorderedReductions) const override
bool preferAlternateOpcodeVectorization() 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
X86TTIImpl(const X86TargetMachine *TM, const Function &F)
bool isLegalNTStore(Type *DataType, Align Alignment) const override
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
InstructionCost getInterleavedMemoryOpCostAVX512(unsigned Opcode, FixedVectorType *VecTy, unsigned Factor, ArrayRef< unsigned > Indices, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, bool UseMaskForCond=false, bool UseMaskForGaps=false) const
TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const override
bool isVectorShiftByScalarCheap(Type *Ty) const override
bool isLegalMaskedGather(Type *DataType, Align Alignment) const override
bool shouldExpandReduction(const IntrinsicInst *II) const override
InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, StackOffset BaseOffset, bool HasBaseReg, int64_t Scale, unsigned AddrSpace) const override
Return the cost of the scaling factor used in the addressing mode represented by AM for this target,...
unsigned getAtomicMemIntrinsicMaxElementSize() 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
bool forceScalarizeMaskedGather(VectorType *VTy, Align Alignment) const override
InstructionCost getBranchMispredictPenalty() const override
bool isExpensiveToSpeculativelyExecute(const Instruction *I) const override
bool hasConditionalLoadStoreForType(Type *Ty, bool IsStore) const override
InstructionCost getAltInstrCost(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1, const SmallBitVector &OpcodeMask, TTI::TargetCostKind CostKind, ArrayRef< const Value * > Scalars) const override
bool isLegalMaskedStore(Type *DataType, Align Alignment, unsigned AddressSpace, TTI::MaskKind MaskKind=TTI::MaskKind::VariableOrConstantMask) const override
std::optional< unsigned > getCacheSize(TargetTransformInfo::CacheLevel Level) const override
bool isLegalMaskedGatherScatter(Type *DataType, Align Alignment) const
bool isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned AddressSpace, TTI::MaskKind MaskKind=TTI::MaskKind::VariableOrConstantMask) const override
bool enableInterleavedAccessVectorization() const override
unsigned getLoadStoreVecRegBitWidth(unsigned AS) const override
unsigned getNumberOfRegisters(unsigned ClassID) const override
std::optional< Value * > simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) const override
uint64_t getMaxMemIntrinsicInlineSizeThreshold() 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
bool isLegalMaskedScatter(Type *DataType, Align Alignment) 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
unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy, Align Alignment, unsigned AddrSpace) const override
bool hasDivRemOp(Type *DataType, bool IsSigned) const override
bool isLegalMaskedCompressStore(Type *DataType, Align Alignment) const override
InstructionCost getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) const override
std::optional< Value * > simplifyDemandedVectorEltsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function< void(Instruction *, unsigned, APInt, APInt &)> SimplifyAndSetOp) const override
bool supportsEfficientVectorElementLoadStore() const override
InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx, const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind, Instruction *Inst=nullptr) const override
bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment) const override
TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override
bool isFCmpOrdCheaperThanFCmpZero(Type *Ty) const override
TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override
InstructionCost getPointersChainCost(ArrayRef< const Value * > Ptrs, const Value *Base, const TTI::PointersChainInfo &Info, Type *AccessTy, const TTI::TargetCostKind CostKind) const override
InstructionCost getIntImmCost(int64_t) const
Calculate the cost of materializing a 64-bit value.
InstructionCost getMinMaxCost(Intrinsic::ID IID, Type *Ty, TTI::TargetCostKind CostKind, FastMathFlags FMF) const
InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind, 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 canMacroFuseCmp() const override
bool areInlineCompatible(const Function *Caller, const Function *Callee) const override
InstructionCost getMaskedMemoryOpCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const
bool prefersVectorizedAddressing() const override
bool areTypesABICompatible(const Function *Caller, const Function *Callee, ArrayRef< Type * > Type) const override
bool forceScalarizeMaskedScatter(VectorType *VTy, Align Alignment) const override
InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const override
Get intrinsic cost based on arguments.
bool isProfitableToSinkOperands(Instruction *I, SmallVectorImpl< Use * > &Ops) const override
InstructionCost getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
Estimate the overhead of scalarizing an instruction.
InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const override
InstructionCost getGatherScatterOpCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const
Calculate the cost of Gather / Scatter operation.
std::optional< Instruction * > instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) 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 getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr, TTI::TargetCostKind CostKind) 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 isLSRCostLess(const TargetTransformInfo::LSRCost &C1, const TargetTransformInfo::LSRCost &C2) const override
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ Known
Known to have no common set bits.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
ArrayRef(const T &OneElt) -> ArrayRef< T >
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Returns options for expansion of memcmp. IsZeroCmp is.
Describe known properties for a set of pointers.