LLVM 21.0.0git
OMPContext.h
Go to the documentation of this file.
1//===- OpenMP/OMPContext.h ----- OpenMP context helper functions - 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///
10/// This file provides helper functions and classes to deal with OpenMP
11/// contexts as used by `[begin/end] declare variant` and `metadirective`.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_FRONTEND_OPENMP_OMPCONTEXT_H
16#define LLVM_FRONTEND_OPENMP_OMPCONTEXT_H
17
18#include "llvm/ADT/APInt.h"
19#include "llvm/ADT/BitVector.h"
20#include "llvm/ADT/DenseMap.h"
23
24namespace llvm {
25class Triple;
26namespace omp {
27
28/// OpenMP Context related IDs and helpers
29///
30///{
31
32/// IDs for all OpenMP context selector trait sets (construct/device/...).
33enum class TraitSet {
34#define OMP_TRAIT_SET(Enum, ...) Enum,
35#include "llvm/Frontend/OpenMP/OMPKinds.def"
36};
37
38/// IDs for all OpenMP context selector trait (device={kind/isa...}/...).
39enum class TraitSelector {
40#define OMP_TRAIT_SELECTOR(Enum, ...) Enum,
41#include "llvm/Frontend/OpenMP/OMPKinds.def"
42};
43
44/// IDs for all OpenMP context trait properties (host/gpu/bsc/llvm/...)
45enum class TraitProperty {
46#define OMP_TRAIT_PROPERTY(Enum, ...) Enum,
47#define OMP_LAST_TRAIT_PROPERTY(Enum) Last = Enum
48#include "llvm/Frontend/OpenMP/OMPKinds.def"
49};
50
51/// Parse \p Str and return the trait set it matches or TraitSet::invalid.
53
54/// Return the trait set for which \p Selector is a selector.
56
57/// Return the trait set for which \p Property is a property.
59
60/// Return a textual representation of the trait set \p Kind.
62
63/// Parse \p Str and return the trait set it matches or
64/// TraitSelector::invalid.
66
67/// Return the trait selector for which \p Property is a property.
69
70/// Return a textual representation of the trait selector \p Kind.
72
73/// Parse \p Str and return the trait property it matches in the set \p Set and
74/// selector \p Selector or TraitProperty::invalid.
76 TraitSelector Selector,
77 StringRef Str);
78
79/// Return the trait property for a singleton selector \p Selector.
81
82/// Return a textual representation of the trait property \p Kind, which might
83/// be the raw string we parsed (\p RawString) if we do not translate the
84/// property into a (distinct) enum.
86 StringRef RawString);
87
88/// Return a textual representation of the trait property \p Kind with selector
89/// and set name included.
91
92/// Return a string listing all trait sets.
93std::string listOpenMPContextTraitSets();
94
95/// Return a string listing all trait selectors for \p Set.
97
98/// Return a string listing all trait properties for \p Set and \p Selector.
100 TraitSelector Selector);
101///}
102
103/// Return true if \p Selector can be nested in \p Set. Also sets
104/// \p AllowsTraitScore and \p RequiresProperty to true/false if the user can
105/// specify a score for properties in \p Selector and if the \p Selector
106/// requires at least one property.
108 bool &AllowsTraitScore,
109 bool &RequiresProperty);
110
111/// Return true if \p Property can be nested in \p Selector and \p Set.
113 TraitSelector Selector,
114 TraitSet Set);
115
116/// Variant match information describes the required traits and how they are
117/// scored (via the ScoresMap). In addition, the required consturct nesting is
118/// decribed as well.
120 /// Add the trait \p Property to the required trait set. \p RawString is the
121 /// string we parsed and derived \p Property from. If \p Score is not null, it
122 /// recorded as well. If \p Property is in the `construct` set it is recorded
123 /// in-order in the ConstructTraits as well.
124 void addTrait(TraitProperty Property, StringRef RawString,
125 APInt *Score = nullptr) {
126 addTrait(getOpenMPContextTraitSetForProperty(Property), Property, RawString,
127 Score);
128 }
129 /// Add the trait \p Property which is in set \p Set to the required trait
130 /// set. \p RawString is the string we parsed and derived \p Property from. If
131 /// \p Score is not null, it recorded as well. If \p Set is the `construct`
132 /// set it is recorded in-order in the ConstructTraits as well.
133 void addTrait(TraitSet Set, TraitProperty Property, StringRef RawString,
134 APInt *Score = nullptr) {
135 if (Score)
136 ScoreMap[Property] = *Score;
137
138 // Special handling for `device={isa(...)}` as we do not match the enum but
139 // the raw string.
140 if (Property == TraitProperty::device_isa___ANY)
141 ISATraits.push_back(RawString);
142 if (Property == TraitProperty::target_device_isa___ANY)
143 ISATraits.push_back(RawString);
144
145 RequiredTraits.set(unsigned(Property));
146 if (Set == TraitSet::construct)
147 ConstructTraits.push_back(Property);
148 }
149
150 BitVector RequiredTraits = BitVector(unsigned(TraitProperty::Last) + 1);
154};
155
156/// The context for a source location is made up of active property traits,
157/// e.g., device={kind(host)}, and constructs traits which describe the nesting
158/// in OpenMP constructs at the location.
160 OMPContext(bool IsDeviceCompilation, Triple TargetTriple,
161 Triple TargetOffloadTriple, int DeviceNum);
162 virtual ~OMPContext() = default;
163
164 void addTrait(TraitProperty Property) {
166 }
167 void addTrait(TraitSet Set, TraitProperty Property) {
168 ActiveTraits.set(unsigned(Property));
169 if (Set == TraitSet::construct)
170 ConstructTraits.push_back(Property);
171 }
172
173 /// Hook for users to check if an ISA trait matches. The trait is described as
174 /// the string that got parsed and it depends on the target and context if
175 /// this matches or not.
176 virtual bool matchesISATrait(StringRef) const { return false; }
177
178 BitVector ActiveTraits = BitVector(unsigned(TraitProperty::Last) + 1);
180};
181
182/// Return true if \p VMI is applicable in \p Ctx, that is, all traits required
183/// by \p VMI are available in the OpenMP context \p Ctx. If \p DeviceSetOnly is
184/// true, only the device selector set, if present, are checked. Note that we
185/// still honor extension traits provided by the user.
187 const OMPContext &Ctx,
188 bool DeviceSetOnly = false);
189
190/// Return the index (into \p VMIs) of the variant with the highest score
191/// from the ones applicble in \p Ctx. See llvm::isVariantApplicableInContext.
193 const OMPContext &Ctx);
194
195} // namespace omp
196
197template <> struct DenseMapInfo<omp::TraitProperty> {
199 return omp::TraitProperty(-1);
200 }
202 return omp::TraitProperty(-2);
203 }
204 static unsigned getHashValue(omp::TraitProperty val) {
205 return std::hash<unsigned>{}(unsigned(val));
206 }
208 return LHS == RHS;
209 }
210};
211
212} // end namespace llvm
213#endif // LLVM_FRONTEND_OPENMP_OMPCONTEXT_H
This file implements a class to represent arbitrary precision integral constant values and operations...
This file implements the BitVector class.
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
This file defines constans and helpers used when dealing with OpenMP.
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition: APInt.h:78
BitVector & set()
Definition: BitVector.h:351
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
std::string listOpenMPContextTraitSets()
Return a string listing all trait sets.
Definition: OMPContext.cpp:595
StringRef getOpenMPContextTraitPropertyFullName(TraitProperty Kind)
Return a textual representation of the trait property Kind with selector and set name included.
Definition: OMPContext.cpp:557
bool isValidTraitSelectorForTraitSet(TraitSelector Selector, TraitSet Set, bool &AllowsTraitScore, bool &RequiresProperty)
}
Definition: OMPContext.cpp:567
TraitSet getOpenMPContextTraitSetForSelector(TraitSelector Selector)
Return the trait set for which Selector is a selector.
Definition: OMPContext.cpp:454
TraitSelector getOpenMPContextTraitSelectorKind(StringRef Str, TraitSet Set)
Parse Str and return the trait set it matches or TraitSelector::invalid.
Definition: OMPContext.cpp:483
TraitSet getOpenMPContextTraitSetForProperty(TraitProperty Property)
Return the trait set for which Property is a property.
Definition: OMPContext.cpp:464
int getBestVariantMatchForContext(const SmallVectorImpl< VariantMatchInfo > &VMIs, const OMPContext &Ctx)
Return the index (into VMIs) of the variant with the highest score from the ones applicble in Ctx.
Definition: OMPContext.cpp:409
StringRef getOpenMPContextTraitSetName(TraitSet Kind)
Return a textual representation of the trait set Kind.
Definition: OMPContext.cpp:473
StringRef getOpenMPContextTraitPropertyName(TraitProperty Kind, StringRef RawString)
Return a textual representation of the trait property Kind, which might be the raw string we parsed (...
Definition: OMPContext.cpp:543
TraitProperty getOpenMPContextTraitPropertyKind(TraitSet Set, TraitSelector Selector, StringRef Str)
Parse Str and return the trait property it matches in the set Set and selector Selector or TraitPrope...
Definition: OMPContext.cpp:517
StringRef getOpenMPContextTraitSelectorName(TraitSelector Kind)
Return a textual representation of the trait selector Kind.
Definition: OMPContext.cpp:507
std::string listOpenMPContextTraitSelectors(TraitSet Set)
Return a string listing all trait selectors for Set.
Definition: OMPContext.cpp:605
TraitSet
OpenMP Context related IDs and helpers.
Definition: OMPContext.h:33
TraitSelector getOpenMPContextTraitSelectorForProperty(TraitProperty Property)
Return the trait selector for which Property is a property.
Definition: OMPContext.cpp:498
TraitProperty getOpenMPContextTraitPropertyForSelector(TraitSelector Selector)
Return the trait property for a singleton selector Selector.
Definition: OMPContext.cpp:533
TraitSelector
IDs for all OpenMP context selector trait (device={kind/isa...}/...).
Definition: OMPContext.h:39
TraitSet getOpenMPContextTraitSetKind(StringRef Str)
Parse Str and return the trait set it matches or TraitSet::invalid.
Definition: OMPContext.cpp:446
TraitProperty
IDs for all OpenMP context trait properties (host/gpu/bsc/llvm/...)
Definition: OMPContext.h:45
bool isVariantApplicableInContext(const VariantMatchInfo &VMI, const OMPContext &Ctx, bool DeviceSetOnly=false)
Return true if VMI is applicable in Ctx, that is, all traits required by VMI are available in the Ope...
Definition: OMPContext.cpp:318
bool isValidTraitPropertyForTraitSetAndSelector(TraitProperty Property, TraitSelector Selector, TraitSet Set)
Return true if Property can be nested in Selector and Set.
Definition: OMPContext.cpp:583
std::string listOpenMPContextTraitProperties(TraitSet Set, TraitSelector Selector)
Return a string listing all trait properties for Set and Selector.
Definition: OMPContext.cpp:616
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
static unsigned getHashValue(omp::TraitProperty val)
Definition: OMPContext.h:204
static omp::TraitProperty getTombstoneKey()
Definition: OMPContext.h:201
static bool isEqual(omp::TraitProperty LHS, omp::TraitProperty RHS)
Definition: OMPContext.h:207
static omp::TraitProperty getEmptyKey()
Definition: OMPContext.h:198
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:52
The context for a source location is made up of active property traits, e.g., device={kind(host)},...
Definition: OMPContext.h:159
BitVector ActiveTraits
Definition: OMPContext.h:178
virtual bool matchesISATrait(StringRef) const
Hook for users to check if an ISA trait matches.
Definition: OMPContext.h:176
virtual ~OMPContext()=default
void addTrait(TraitProperty Property)
Definition: OMPContext.h:164
SmallVector< TraitProperty, 8 > ConstructTraits
Definition: OMPContext.h:179
void addTrait(TraitSet Set, TraitProperty Property)
Definition: OMPContext.h:167
Variant match information describes the required traits and how they are scored (via the ScoresMap).
Definition: OMPContext.h:119
SmallVector< StringRef, 8 > ISATraits
Definition: OMPContext.h:151
void addTrait(TraitProperty Property, StringRef RawString, APInt *Score=nullptr)
Add the trait Property to the required trait set.
Definition: OMPContext.h:124
SmallVector< TraitProperty, 8 > ConstructTraits
Definition: OMPContext.h:152
void addTrait(TraitSet Set, TraitProperty Property, StringRef RawString, APInt *Score=nullptr)
Add the trait Property which is in set Set to the required trait set.
Definition: OMPContext.h:133
SmallDenseMap< TraitProperty, APInt > ScoreMap
Definition: OMPContext.h:153