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 *CxtI = nullptr) const override;
75 InstructionCost getAltInstrCost(VectorType *VecTy, unsigned Opcode0,
76 unsigned Opcode1,
77 const SmallBitVector &OpcodeMask,
78 TTI::TargetCostKind CostKind) const override;
79
81 getShuffleCost(TTI::ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy,
82 TTI::TargetCostKind CostKind, ArrayRef<int> Mask, int Index,
83 VectorType *SubTp, ArrayRef<const Value *> Args = {},
84 const Instruction *CxtI = nullptr) const override;
86 getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
88 const Instruction *I = nullptr) const override;
90 unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
94 const Instruction *I = nullptr) const override;
98 unsigned Index, const Value *Op0, const Value *Op1,
100 TTI::VectorInstrContext::None) const override;
102 getScalarizationOverhead(VectorType *Ty, const APInt &DemandedElts,
103 bool Insert, bool Extract,
105 bool ForPoisonSrc = true, ArrayRef<Value *> VL = {},
107 TTI::VectorInstrContext::None) const override;
109 getReplicationShuffleCost(Type *EltTy, int ReplicationFactor, int VF,
110 const APInt &DemandedDstElts,
111 TTI::TargetCostKind CostKind) const override;
113 unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
116 const Instruction *I = nullptr) const override;
118 getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA,
119 TTI::TargetCostKind CostKind) const override;
120 InstructionCost getMaskedMemoryOpCost(const MemIntrinsicCostAttributes &MICA,
122 InstructionCost getGatherScatterOpCost(const MemIntrinsicCostAttributes &MICA,
126 const TTI::PointersChainInfo &Info, Type *AccessTy,
127 const TTI::TargetCostKind CostKind) const override;
129 getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr,
130 TTI::TargetCostKind CostKind) const override;
131
132 std::optional<Instruction *>
133 instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const override;
134 std::optional<Value *>
136 APInt DemandedMask, KnownBits &Known,
137 bool &KnownBitsComputed) const override;
138 std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
139 InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
140 APInt &UndefElts2, APInt &UndefElts3,
141 std::function<void(Instruction *, unsigned, APInt, APInt &)>
142 SimplifyAndSetOp) const override;
143
144 unsigned getAtomicMemIntrinsicMaxElementSize() const override;
145
147 getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
148 TTI::TargetCostKind CostKind) const override;
149
151 getArithmeticReductionCost(unsigned Opcode, VectorType *Ty,
152 std::optional<FastMathFlags> FMF,
153 TTI::TargetCostKind CostKind) const override;
154
156 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
157 ElementCount VF, TTI::PartialReductionExtendKind OpAExtend,
158 TTI::PartialReductionExtendKind OpBExtend, std::optional<unsigned> BinOp,
160 std::optional<FastMathFlags> FMF) const override;
161
164 FastMathFlags FMF) const;
165
167 getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF,
168 TTI::TargetCostKind CostKind) const override;
169
171 unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
172 Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
173 bool UseMaskForCond = false, bool UseMaskForGaps = false) const override;
175 unsigned Opcode, FixedVectorType *VecTy, unsigned Factor,
176 ArrayRef<unsigned> Indices, Align Alignment, unsigned AddressSpace,
177 TTI::TargetCostKind CostKind, bool UseMaskForCond = false,
178 bool UseMaskForGaps = false) const;
179
180 InstructionCost getIntImmCost(int64_t) const;
181
182 InstructionCost getIntImmCost(const APInt &Imm, Type *Ty,
183 TTI::TargetCostKind CostKind) const override;
184
186 const Instruction *I = nullptr) const override;
187
188 InstructionCost getIntImmCostInst(unsigned Opcode, unsigned Idx,
189 const APInt &Imm, Type *Ty,
191 Instruction *Inst = nullptr) const override;
193 getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx, const APInt &Imm,
194 Type *Ty, TTI::TargetCostKind CostKind) const override;
195 /// Return the cost of the scaling factor used in the addressing
196 /// mode represented by AM for this target, for a load/store
197 /// of the specified type.
198 /// If the AM is supported, the return value must be >= 0.
199 /// If the AM is not supported, it returns an invalid cost.
200 InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
201 StackOffset BaseOffset, bool HasBaseReg,
202 int64_t Scale,
203 unsigned AddrSpace) const override;
204
205 bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1,
206 const TargetTransformInfo::LSRCost &C2) const override;
207 bool canMacroFuseCmp() const override;
208 bool
209 isLegalMaskedLoad(Type *DataType, Align Alignment, unsigned AddressSpace,
210 TTI::MaskKind MaskKind =
212 bool
213 isLegalMaskedStore(Type *DataType, Align Alignment, unsigned AddressSpace,
214 TTI::MaskKind MaskKind =
216 bool isLegalNTLoad(Type *DataType, Align Alignment) const override;
217 bool isLegalNTStore(Type *DataType, Align Alignment) const override;
218 bool isLegalBroadcastLoad(Type *ElementTy,
219 ElementCount NumElements) const override;
220 bool forceScalarizeMaskedGather(VectorType *VTy,
221 Align Alignment) const override;
223 Align Alignment) const override {
224 return forceScalarizeMaskedGather(VTy, Alignment);
225 }
226 bool isLegalMaskedGatherScatter(Type *DataType, Align Alignment) const;
227 bool isLegalMaskedGather(Type *DataType, Align Alignment) const override;
228 bool isLegalMaskedScatter(Type *DataType, Align Alignment) const override;
229 bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment) const override;
230 bool isLegalMaskedCompressStore(Type *DataType,
231 Align Alignment) const override;
232 bool isLegalAltInstr(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1,
233 const SmallBitVector &OpcodeMask) const override;
234 bool hasDivRemOp(Type *DataType, bool IsSigned) const override;
235 bool isExpensiveToSpeculativelyExecute(const Instruction *I) const override;
236 bool isFCmpOrdCheaperThanFCmpZero(Type *Ty) const override;
237 bool areInlineCompatible(const Function *Caller,
238 const Function *Callee) const override;
239 bool areTypesABICompatible(const Function *Caller, const Function *Callee,
240 ArrayRef<Type *> Type) const override;
241
243 return ST->getMaxInlineSizeThreshold();
244 }
245
247 enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const override;
248 bool preferAlternateOpcodeVectorization() const override { return false; }
249 bool prefersVectorizedAddressing() const override;
250 bool supportsEfficientVectorElementLoadStore() const override;
251 bool enableInterleavedAccessVectorization() const override;
252
253 bool shouldExpandReduction(const IntrinsicInst *II) const override;
254
256
258 SmallVectorImpl<Use *> &Ops) const override;
259
260 bool isVectorShiftByScalarCheap(Type *Ty) const override;
261
262 unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy,
263 Align Alignment,
264 unsigned AddrSpace) const override;
265
266 bool useFastCCForInternalCall(Function &F) const override;
267
268private:
269 bool supportsGather() const;
270 InstructionCost getGSVectorCost(unsigned Opcode, TTI::TargetCostKind CostKind,
271 Type *DataTy, const Value *Ptr,
272 Align Alignment, unsigned AddressSpace) const;
273
274 int getGatherOverhead() const;
275 int getScatterOverhead() const;
276
277 /// @}
278};
279
280} // end namespace llvm
281
282#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.
@ None
The cast is not used with a load/store of any kind.
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
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
bool isLegalAltInstr(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1, const SmallBitVector &OpcodeMask) const override
TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const override
bool isVectorShiftByScalarCheap(Type *Ty) const override
bool isLegalMaskedGather(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 *CxtI=nullptr) 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
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
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
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
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
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
InstructionCost getAltInstrCost(VectorType *VecTy, unsigned Opcode0, unsigned Opcode1, const SmallBitVector &OpcodeMask, TTI::TargetCostKind CostKind) 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.