LLVM 20.0.0git
AssumeBundleQueries.h
Go to the documentation of this file.
1//===- AssumeBundleQueries.h - utilis to query assume bundles ---*- 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//
9// This file contain tools to query into assume bundles. assume bundles can be
10// built using utilities from Transform/Utils/AssumeBundleBuilder.h
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_ANALYSIS_ASSUMEBUNDLEQUERIES_H
15#define LLVM_ANALYSIS_ASSUMEBUNDLEQUERIES_H
16
17#include "llvm/ADT/DenseMap.h"
19
20namespace llvm {
21class AssumptionCache;
22class DominatorTree;
23class Instruction;
24
25/// Index of elements in the operand bundle.
26/// If the element exist it is guaranteed to be what is specified in this enum
27/// but it may not exist.
31};
32
33/// Query the operand bundle of an llvm.assume to find a single attribute of
34/// the specified kind applied on a specified Value.
35///
36/// This has a non-constant complexity. It should only be used when a single
37/// attribute is going to be queried.
38///
39/// Return true iff the queried attribute was found.
40/// If ArgVal is set. the argument will be stored to ArgVal.
41bool hasAttributeInAssume(AssumeInst &Assume, Value *IsOn, StringRef AttrName,
42 uint64_t *ArgVal = nullptr);
43inline bool hasAttributeInAssume(AssumeInst &Assume, Value *IsOn,
45 uint64_t *ArgVal = nullptr) {
46 return hasAttributeInAssume(Assume, IsOn,
47 Attribute::getNameFromAttrKind(Kind), ArgVal);
48}
49
50template<> struct DenseMapInfo<Attribute::AttrKind> {
53 }
56 }
57 static unsigned getHashValue(Attribute::AttrKind AK) {
58 return hash_combine(AK);
59 }
61 return LHS == RHS;
62 }
63};
64
65/// The map Key contains the Value on for which the attribute is valid and
66/// the Attribute that is valid for that value.
67/// If the Attribute is not on any value, the Value is nullptr.
68using RetainedKnowledgeKey = std::pair<Value *, Attribute::AttrKind>;
69
70struct MinMax {
73};
74
75/// A mapping from intrinsics (=`llvm.assume` calls) to a value range
76/// (=knowledge) that is encoded in them. How the value range is interpreted
77/// depends on the RetainedKnowledgeKey that was used to get this out of the
78/// RetainedKnowledgeMap.
80
83
84/// Insert into the map all the informations contained in the operand bundles of
85/// the llvm.assume. This should be used instead of hasAttributeInAssume when
86/// many queries are going to be made on the same llvm.assume.
87/// String attributes are not inserted in the map.
88/// If the IR changes the map will be outdated.
90
91/// Represent one information held inside an operand bundle of an llvm.assume.
92/// AttrKind is the property that holds.
93/// WasOn if not null is that Value for which AttrKind holds.
94/// ArgValue is optionally an argument of the attribute.
95/// For example if we know that %P has an alignment of at least four:
96/// - AttrKind will be Attribute::Alignment.
97/// - WasOn will be %P.
98/// - ArgValue will be 4.
102 Value *WasOn = nullptr;
104 return AttrKind == Other.AttrKind && WasOn == Other.WasOn &&
105 ArgValue == Other.ArgValue;
106 }
107 bool operator!=(RetainedKnowledge Other) const { return !(*this == Other); }
108 /// This is only intended for use in std::min/std::max between attribute that
109 /// only differ in ArgValue.
111 assert(((AttrKind == Other.AttrKind && WasOn == Other.WasOn) ||
112 AttrKind == Attribute::None || Other.AttrKind == Attribute::None) &&
113 "This is only intend for use in min/max to select the best for "
114 "RetainedKnowledge that is otherwise equal");
115 return ArgValue < Other.ArgValue;
116 }
117 operator bool() const { return AttrKind != Attribute::None; }
119};
120
121/// Retreive the information help by Assume on the operand at index Idx.
122/// Assume should be an llvm.assume and Idx should be in the operand bundle.
123RetainedKnowledge getKnowledgeFromOperandInAssume(AssumeInst &Assume,
124 unsigned Idx);
125
126/// Retreive the information help by the Use U of an llvm.assume. the use should
127/// be in the operand bundle.
129 return getKnowledgeFromOperandInAssume(*cast<AssumeInst>(U->getUser()),
130 U->getOperandNo());
131}
132
133/// Tag in operand bundle indicating that this bundle should be ignored.
134constexpr StringRef IgnoreBundleTag = "ignore";
135
136/// Return true iff the operand bundles of the provided llvm.assume doesn't
137/// contain any valuable information. This is true when:
138/// - The operand bundle is empty
139/// - The operand bundle only contains information about dropped values or
140/// constant folded values.
141///
142/// the argument to the call of llvm.assume may still be useful even if the
143/// function returned true.
144bool isAssumeWithEmptyBundle(const AssumeInst &Assume);
145
146/// Return a valid Knowledge associated to the Use U if its Attribute kind is
147/// in AttrKinds.
150
151/// Return a valid Knowledge associated to the Value V if its Attribute kind is
152/// in AttrKinds and it matches the Filter.
154 const Value *V, ArrayRef<Attribute::AttrKind> AttrKinds,
155 AssumptionCache *AC = nullptr,
157 const CallBase::BundleOpInfo *)>
158 Filter = [](auto...) { return true; });
159
160/// Return a valid Knowledge associated to the Value V if its Attribute kind is
161/// in AttrKinds and the knowledge is suitable to be used in the context of
162/// CtxI.
163RetainedKnowledge getKnowledgeValidInContext(
164 const Value *V, ArrayRef<Attribute::AttrKind> AttrKinds,
165 const Instruction *CtxI, const DominatorTree *DT = nullptr,
166 AssumptionCache *AC = nullptr);
167
168/// This extracts the Knowledge from an element of an operand bundle.
169/// This is mostly for use in the assume builder.
170RetainedKnowledge getKnowledgeFromBundle(AssumeInst &Assume,
171 const CallBase::BundleOpInfo &BOI);
172
173} // namespace llvm
174
175#endif
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Value * RHS
Value * LHS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
This represents the llvm.assume intrinsic.
A cache of @llvm.assume calls within a function.
static StringRef getNameFromAttrKind(Attribute::AttrKind AttrKind)
Definition: Attributes.cpp:313
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition: Attributes.h:86
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
Definition: Attributes.h:93
@ None
No attributes have been set.
Definition: Attributes.h:88
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
Definition: Attributes.h:92
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
LLVM Value Representation.
Definition: Value.h:74
An efficient, type-erasing, non-owning reference to a callable.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
RetainedKnowledge getKnowledgeFromOperandInAssume(AssumeInst &Assume, unsigned Idx)
Retreive the information help by Assume on the operand at index Idx.
constexpr StringRef IgnoreBundleTag
Tag in operand bundle indicating that this bundle should be ignored.
bool isAssumeWithEmptyBundle(const AssumeInst &Assume)
Return true iff the operand bundles of the provided llvm.assume doesn't contain any valuable informat...
RetainedKnowledge getKnowledgeValidInContext(const Value *V, ArrayRef< Attribute::AttrKind > AttrKinds, const Instruction *CtxI, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr)
Return a valid Knowledge associated to the Value V if its Attribute kind is in AttrKinds and the know...
RetainedKnowledge getKnowledgeForValue(const Value *V, ArrayRef< Attribute::AttrKind > AttrKinds, AssumptionCache *AC=nullptr, function_ref< bool(RetainedKnowledge, Instruction *, const CallBase::BundleOpInfo *)> Filter=[](auto...) { return true;})
Return a valid Knowledge associated to the Value V if its Attribute kind is in AttrKinds and it match...
RetainedKnowledge getKnowledgeFromBundle(AssumeInst &Assume, const CallBase::BundleOpInfo &BOI)
This extracts the Knowledge from an element of an operand bundle.
RetainedKnowledge getKnowledgeFromUse(const Use *U, ArrayRef< Attribute::AttrKind > AttrKinds)
Return a valid Knowledge associated to the Use U if its Attribute kind is in AttrKinds.
@ Other
Any other memory.
std::pair< Value *, Attribute::AttrKind > RetainedKnowledgeKey
The map Key contains the Value on for which the attribute is valid and the Attribute that is valid fo...
bool hasAttributeInAssume(AssumeInst &Assume, Value *IsOn, StringRef AttrName, uint64_t *ArgVal=nullptr)
Query the operand bundle of an llvm.assume to find a single attribute of the specified kind applied o...
void fillMapFromAssume(AssumeInst &Assume, RetainedKnowledgeMap &Result)
Insert into the map all the informations contained in the operand bundles of the llvm....
RetainedKnowledge getKnowledgeFromUseInAssume(const Use *U)
Retreive the information help by the Use U of an llvm.assume.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition: Hashing.h:593
AssumeBundleArg
Index of elements in the operand bundle.
Used to keep track of an operand bundle.
Definition: InstrTypes.h:2228
static Attribute::AttrKind getEmptyKey()
static unsigned getHashValue(Attribute::AttrKind AK)
static bool isEqual(Attribute::AttrKind LHS, Attribute::AttrKind RHS)
static Attribute::AttrKind getTombstoneKey()
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:52
Represent one information held inside an operand bundle of an llvm.assume.
Attribute::AttrKind AttrKind
static RetainedKnowledge none()
bool operator!=(RetainedKnowledge Other) const
bool operator==(RetainedKnowledge Other) const
bool operator<(RetainedKnowledge Other) const
This is only intended for use in std::min/stdmax between attribute that only differ in ArgValue.