LLVM 22.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"
20
21namespace llvm {
22class AssumptionCache;
23class DominatorTree;
24class Instruction;
25
26/// Index of elements in the operand bundle.
27/// If the element exist it is guaranteed to be what is specified in this enum
28/// but it may not exist.
32};
33
34/// Query the operand bundle of an llvm.assume to find a single attribute of
35/// the specified kind applied on a specified Value.
36///
37/// This has a non-constant complexity. It should only be used when a single
38/// attribute is going to be queried.
39///
40/// Return true iff the queried attribute was found.
41/// If ArgVal is set. the argument will be stored to ArgVal.
42LLVM_ABI bool hasAttributeInAssume(AssumeInst &Assume, Value *IsOn,
43 StringRef AttrName,
44 uint64_t *ArgVal = nullptr);
45inline bool hasAttributeInAssume(AssumeInst &Assume, Value *IsOn,
47 uint64_t *ArgVal = nullptr) {
48 return hasAttributeInAssume(Assume, IsOn,
49 Attribute::getNameFromAttrKind(Kind), ArgVal);
50}
51
52template<> struct DenseMapInfo<Attribute::AttrKind> {
55 }
58 }
59 static unsigned getHashValue(Attribute::AttrKind AK) {
60 return hash_combine(AK);
61 }
63 return LHS == RHS;
64 }
65};
66
67/// The map Key contains the Value on for which the attribute is valid and
68/// the Attribute that is valid for that value.
69/// If the Attribute is not on any value, the Value is nullptr.
70using RetainedKnowledgeKey = std::pair<Value *, Attribute::AttrKind>;
71
72struct MinMax {
75};
76
77/// A mapping from intrinsics (=`llvm.assume` calls) to a value range
78/// (=knowledge) that is encoded in them. How the value range is interpreted
79/// depends on the RetainedKnowledgeKey that was used to get this out of the
80/// RetainedKnowledgeMap.
82
85
86/// Insert into the map all the informations contained in the operand bundles of
87/// the llvm.assume. This should be used instead of hasAttributeInAssume when
88/// many queries are going to be made on the same llvm.assume.
89/// String attributes are not inserted in the map.
90/// If the IR changes the map will be outdated.
92 RetainedKnowledgeMap &Result);
93
94/// Represent one information held inside an operand bundle of an llvm.assume.
95/// AttrKind is the property that holds.
96/// WasOn if not null is that Value for which AttrKind holds.
97/// ArgValue is optionally an argument of the attribute.
98/// For example if we know that %P has an alignment of at least four:
99/// - AttrKind will be Attribute::Alignment.
100/// - WasOn will be %P.
101/// - ArgValue will be 4.
105 Value *IRArgValue = nullptr;
106 Value *WasOn = nullptr;
108 uint64_t ArgValue = 0, Value *WasOn = nullptr)
111 return AttrKind == Other.AttrKind && WasOn == Other.WasOn &&
112 ArgValue == Other.ArgValue && IRArgValue == Other.IRArgValue;
113 }
114 bool operator!=(RetainedKnowledge Other) const { return !(*this == Other); }
115 /// This is only intended for use in std::min/std::max between attribute that
116 /// only differ in ArgValue.
118 assert(((AttrKind == Other.AttrKind && WasOn == Other.WasOn) ||
119 AttrKind == Attribute::None || Other.AttrKind == Attribute::None) &&
120 "This is only intend for use in min/max to select the best for "
121 "RetainedKnowledge that is otherwise equal");
122 return ArgValue < Other.ArgValue;
123 }
124 operator bool() const { return AttrKind != Attribute::None; }
126};
127
128/// Retreive the information help by Assume on the operand at index Idx.
129/// Assume should be an llvm.assume and Idx should be in the operand bundle.
130LLVM_ABI RetainedKnowledge getKnowledgeFromOperandInAssume(AssumeInst &Assume,
131 unsigned Idx);
132
133/// Retreive the information help by the Use U of an llvm.assume. the use should
134/// be in the operand bundle.
136 return getKnowledgeFromOperandInAssume(*cast<AssumeInst>(U->getUser()),
137 U->getOperandNo());
138}
139
140/// Tag in operand bundle indicating that this bundle should be ignored.
141constexpr StringRef IgnoreBundleTag = "ignore";
142
143/// Return true iff the operand bundles of the provided llvm.assume doesn't
144/// contain any valuable information. This is true when:
145/// - The operand bundle is empty
146/// - The operand bundle only contains information about dropped values or
147/// constant folded values.
148///
149/// the argument to the call of llvm.assume may still be useful even if the
150/// function returned true.
152
153/// Return a valid Knowledge associated to the Use U if its Attribute kind is
154/// in AttrKinds.
157
158/// Return a valid Knowledge associated to the Value V if its Attribute kind is
159/// in AttrKinds and it matches the Filter.
161 const Value *V, ArrayRef<Attribute::AttrKind> AttrKinds,
162 AssumptionCache &AC,
164 const CallBase::BundleOpInfo *)>
165 Filter = [](auto...) { return true; });
166
167/// Return a valid Knowledge associated to the Value V if its Attribute kind is
168/// in AttrKinds and the knowledge is suitable to be used in the context of
169/// CtxI.
170LLVM_ABI RetainedKnowledge getKnowledgeValidInContext(
171 const Value *V, ArrayRef<Attribute::AttrKind> AttrKinds,
172 AssumptionCache &AC, const Instruction *CtxI,
173 const DominatorTree *DT = nullptr);
174
175/// This extracts the Knowledge from an element of an operand bundle.
176/// This is mostly for use in the assume builder.
177LLVM_ABI RetainedKnowledge
178getKnowledgeFromBundle(AssumeInst &Assume, const CallBase::BundleOpInfo &BOI);
179
180} // namespace llvm
181
182#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ABI
Definition: Compiler.h:213
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.
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 LLVM_ABI StringRef getNameFromAttrKind(Attribute::AttrKind AttrKind)
Definition: Attributes.cpp:322
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition: Attributes.h:88
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
Definition: Attributes.h:95
@ None
No attributes have been set.
Definition: Attributes.h:90
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
Definition: Attributes.h:94
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
A Use represents the edge between a Value definition and its users.
Definition: Use.h:35
LLVM Value Representation.
Definition: Value.h:75
An efficient, type-erasing, non-owning reference to a callable.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
LLVM_ABI RetainedKnowledge getKnowledgeForValue(const Value *V, ArrayRef< Attribute::AttrKind > AttrKinds, AssumptionCache &AC, 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...
LLVM_ABI 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.
LLVM_ABI bool isAssumeWithEmptyBundle(const AssumeInst &Assume)
Return true iff the operand bundles of the provided llvm.assume doesn't contain any valuable informat...
LLVM_ABI RetainedKnowledge getKnowledgeFromBundle(AssumeInst &Assume, const CallBase::BundleOpInfo &BOI)
This extracts the Knowledge from an element of an operand bundle.
LLVM_ABI 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.
LLVM_ABI RetainedKnowledge getKnowledgeValidInContext(const Value *V, ArrayRef< Attribute::AttrKind > AttrKinds, AssumptionCache &AC, const Instruction *CtxI, const DominatorTree *DT=nullptr)
Return a valid Knowledge associated to the Value V if its Attribute kind is in AttrKinds and the know...
@ 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...
LLVM_ABI 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...
LLVM_ABI 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:595
AssumeBundleArg
Index of elements in the operand bundle.
Used to keep track of an operand bundle.
Definition: InstrTypes.h:2169
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:54
Represent one information held inside an operand bundle of an llvm.assume.
Attribute::AttrKind AttrKind
RetainedKnowledge(Attribute::AttrKind AttrKind=Attribute::None, uint64_t ArgValue=0, Value *WasOn=nullptr)
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.