LLVM 24.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"
24
25namespace llvm {
26class Triple;
27namespace omp {
28
29/// OpenMP Context related IDs and helpers
30///
31///{
32
33/// IDs for all OpenMP context selector trait sets (construct/device/...).
34enum class TraitSet {
35#define OMP_TRAIT_SET(Enum, ...) Enum,
36#include "llvm/Frontend/OpenMP/OMPKinds.def"
37};
38
39/// IDs for all OpenMP context selector trait (device={kind/isa...}/...).
40enum class TraitSelector {
41#define OMP_TRAIT_SELECTOR(Enum, ...) Enum,
42#include "llvm/Frontend/OpenMP/OMPKinds.def"
43};
44
45/// IDs for all OpenMP context trait properties (host/gpu/bsc/llvm/...)
46enum class TraitProperty {
47#define OMP_TRAIT_PROPERTY(Enum, ...) Enum,
48#define OMP_LAST_TRAIT_PROPERTY(Enum) Last = Enum
49#include "llvm/Frontend/OpenMP/OMPKinds.def"
50};
51
52/// Parse \p Str and return the trait set it matches or TraitSet::invalid.
54
55/// Return the trait set for which \p Selector is a selector.
57
58/// Return the trait set for which \p Property is a property.
60
61/// Return a textual representation of the trait set \p Kind.
63
64/// Parse \p Str and return the trait set it matches or
65/// TraitSelector::invalid.
67 TraitSet Set);
68
69/// Return the trait selector for which \p Property is a property.
72
73/// Return a textual representation of the trait selector \p Kind.
75
76/// Parse \p Str and return the trait property it matches in the set \p Set and
77/// selector \p Selector or TraitProperty::invalid.
79 TraitSelector Selector,
80 StringRef Str);
81
82/// Return the trait property for a singleton selector \p Selector.
85
86/// Return a textual representation of the trait property \p Kind, which might
87/// be the raw string we parsed (\p RawString) if we do not translate the
88/// property into a (distinct) enum.
90 StringRef RawString);
91
92/// Return a textual representation of the trait property \p Kind with selector
93/// and set name included.
95
96/// Return a string listing all trait sets.
98
99/// Return a string listing all trait selectors for \p Set.
101
102/// Return a string listing all trait properties for \p Set and \p Selector.
104 TraitSelector Selector);
105///}
106
107/// Return true if \p Selector can be nested in \p Set. Also sets
108/// \p AllowsTraitScore and \p RequiresProperty to true/false if the user can
109/// specify a score for properties in \p Selector and if the \p Selector
110/// requires at least one property.
112 TraitSet Set,
113 bool &AllowsTraitScore,
114 bool &RequiresProperty);
115
116/// Return true if \p Property can be nested in \p Selector and \p Set.
118 TraitSelector Selector,
119 TraitSet Set);
120
121/// Variant match information describes the required traits and how they are
122/// scored (via the ScoresMap). In addition, the required consturct nesting is
123/// decribed as well.
125 /// A device or target_device isa property and the ISA name it requires.
126 struct ISATrait {
129 bool operator==(const ISATrait &Other) const {
130 return Property == Other.Property && Name == Other.Name;
131 }
132 };
133
134 /// Add the trait \p Property to the required trait set. \p RawString is the
135 /// string we parsed and derived \p Property from. If \p Score is not null, it
136 /// recorded as well. If \p Property is in the `construct` set it is recorded
137 /// in-order in the ConstructTraits as well.
139 APInt *Score = nullptr) {
141 Score);
142 }
143 /// Add the trait \p Property which is in set \p Set to the required trait
144 /// set. \p RawString is the string we parsed and derived \p Property from. If
145 /// \p Score is not null, it recorded as well. If \p Set is the `construct`
146 /// set it is recorded in-order in the ConstructTraits as well.
148 APInt *Score = nullptr) {
149 if (Score)
150 ScoreMap[Property] = *Score;
151
152 // Special handling for `device={isa(...)}` as we do not match the enum but
153 // the raw string.
154 if (Property == TraitProperty::device_isa___ANY ||
155 Property == TraitProperty::target_device_isa___ANY)
156 ISATraits.push_back({Property, RawString});
157
158 RequiredTraits.set(unsigned(Property));
159 if (Set == TraitSet::construct)
160 ConstructTraits.push_back(Property);
161 }
162
163 BitVector RequiredTraits = BitVector(unsigned(TraitProperty::Last) + 1);
167};
168
169/// The context for a source location is made up of active property traits,
170/// e.g., device={kind(host)}, and constructs traits which describe the nesting
171/// in OpenMP constructs at the location.
173 LLVM_ABI OMPContext(bool IsDeviceCompilation, Triple TargetTriple,
174 Triple TargetOffloadTriple, int DeviceNum);
175 virtual ~OMPContext() = default;
176
181 // The construct context starts at the innermost enclosing target construct.
182 if (Property == TraitProperty::construct_target_target) {
183 for (TraitProperty Construct : ConstructTraits)
184 ActiveTraits.reset(unsigned(Construct));
185 ConstructTraits.clear();
186 }
187 ActiveTraits.set(unsigned(Property));
188 if (Set == TraitSet::construct)
189 ConstructTraits.push_back(Property);
190 }
191
192 /// Hook for users to check if an ISA trait matches. The trait is described as
193 /// the string that got parsed and it depends on the target and context if
194 /// this matches or not.
195 virtual bool matchesISATrait(StringRef) const { return false; }
196
197 BitVector ActiveTraits = BitVector(unsigned(TraitProperty::Last) + 1);
199};
200
201/// Return true if \p VMI is applicable in \p Ctx, that is, all traits required
202/// by \p VMI are available in the OpenMP context \p Ctx. If
203/// \p DeviceOrImplementationSetOnly is true, only the device and implementation
204/// selector set, if present, are checked. Note that we still honor extension
205/// traits provided by the user.
206LLVM_ABI bool
208 bool DeviceOrImplementationSetOnly = false);
209
210/// Return the index (into \p VMIs) of the variant with the highest score
211/// from the ones applicable in \p Ctx. See llvm::isVariantApplicableInContext.
212LLVM_ABI int
214 const OMPContext &Ctx);
215
216} // namespace omp
217
218template <> struct DenseMapInfo<omp::TraitProperty> {
219 static unsigned getHashValue(omp::TraitProperty val) {
220 return std::hash<unsigned>{}(unsigned(val));
221 }
223 return LHS == RHS;
224 }
225};
226
227} // end namespace llvm
228#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.
#define LLVM_ABI
Definition Compiler.h:211
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
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
LLVM_ABI std::string listOpenMPContextTraitSets()
Return a string listing all trait sets.
LLVM_ABI StringRef getOpenMPContextTraitPropertyFullName(TraitProperty Kind)
Return a textual representation of the trait property Kind with selector and set name included.
LLVM_ABI bool isValidTraitSelectorForTraitSet(TraitSelector Selector, TraitSet Set, bool &AllowsTraitScore, bool &RequiresProperty)
}
LLVM_ABI TraitSet getOpenMPContextTraitSetForSelector(TraitSelector Selector)
Return the trait set for which Selector is a selector.
LLVM_ABI TraitSelector getOpenMPContextTraitSelectorKind(StringRef Str, TraitSet Set)
Parse Str and return the trait set it matches or TraitSelector::invalid.
LLVM_ABI TraitSet getOpenMPContextTraitSetForProperty(TraitProperty Property)
Return the trait set for which Property is a property.
LLVM_ABI int getBestVariantMatchForContext(const SmallVectorImpl< VariantMatchInfo > &VMIs, const OMPContext &Ctx)
Return the index (into VMIs) of the variant with the highest score from the ones applicable in Ctx.
LLVM_ABI StringRef getOpenMPContextTraitSetName(TraitSet Kind)
Return a textual representation of the trait set Kind.
LLVM_ABI StringRef getOpenMPContextTraitPropertyName(TraitProperty Kind, StringRef RawString)
Return a textual representation of the trait property Kind, which might be the raw string we parsed (...
LLVM_ABI 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...
LLVM_ABI StringRef getOpenMPContextTraitSelectorName(TraitSelector Kind)
Return a textual representation of the trait selector Kind.
LLVM_ABI std::string listOpenMPContextTraitSelectors(TraitSet Set)
Return a string listing all trait selectors for Set.
TraitSet
OpenMP Context related IDs and helpers.
Definition OMPContext.h:34
LLVM_ABI TraitSelector getOpenMPContextTraitSelectorForProperty(TraitProperty Property)
Return the trait selector for which Property is a property.
LLVM_ABI TraitProperty getOpenMPContextTraitPropertyForSelector(TraitSelector Selector)
Return the trait property for a singleton selector Selector.
TraitSelector
IDs for all OpenMP context selector trait (device={kind/isa...}/...).
Definition OMPContext.h:40
LLVM_ABI bool isVariantApplicableInContext(const VariantMatchInfo &VMI, const OMPContext &Ctx, bool DeviceOrImplementationSetOnly=false)
Return true if VMI is applicable in Ctx, that is, all traits required by VMI are available in the Ope...
LLVM_ABI TraitSet getOpenMPContextTraitSetKind(StringRef Str)
Parse Str and return the trait set it matches or TraitSet::invalid.
TraitProperty
IDs for all OpenMP context trait properties (host/gpu/bsc/llvm/...)
Definition OMPContext.h:46
LLVM_ABI bool isValidTraitPropertyForTraitSetAndSelector(TraitProperty Property, TraitSelector Selector, TraitSet Set)
Return true if Property can be nested in Selector and Set.
LLVM_ABI std::string listOpenMPContextTraitProperties(TraitSet Set, TraitSelector Selector)
Return a string listing all trait properties for Set and Selector.
This is an optimization pass for GlobalISel generic memory operations.
@ Other
Any other memory.
Definition ModRef.h:68
static unsigned getHashValue(omp::TraitProperty val)
Definition OMPContext.h:219
static bool isEqual(omp::TraitProperty LHS, omp::TraitProperty RHS)
Definition OMPContext.h:222
An information struct used to provide DenseMap with the various necessary components for a given valu...
The context for a source location is made up of active property traits, e.g., device={kind(host)}...
Definition OMPContext.h:172
LLVM_ABI OMPContext(bool IsDeviceCompilation, Triple TargetTriple, Triple TargetOffloadTriple, int DeviceNum)
virtual bool matchesISATrait(StringRef) const
Hook for users to check if an ISA trait matches.
Definition OMPContext.h:195
virtual ~OMPContext()=default
void addTrait(TraitProperty Property)
Definition OMPContext.h:177
SmallVector< TraitProperty, 8 > ConstructTraits
Definition OMPContext.h:198
void addTrait(TraitSet Set, TraitProperty Property)
Definition OMPContext.h:180
A device or target_device isa property and the ISA name it requires.
Definition OMPContext.h:126
bool operator==(const ISATrait &Other) const
Definition OMPContext.h:129
Variant match information describes the required traits and how they are scored (via the ScoresMap).
Definition OMPContext.h:124
void addTrait(TraitProperty Property, StringRef RawString, APInt *Score=nullptr)
Add the trait Property to the required trait set.
Definition OMPContext.h:138
SmallVector< TraitProperty, 8 > ConstructTraits
Definition OMPContext.h:165
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:147
SmallVector< ISATrait, 8 > ISATraits
Definition OMPContext.h:164
SmallDenseMap< TraitProperty, APInt > ScoreMap
Definition OMPContext.h:166