22#define DEBUG_TYPE "openmp-ir-builder"
31 ? TraitProperty::device_kind_nohost
32 : TraitProperty::device_kind_host));
33 switch (TargetTriple.
getArch()) {
63#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
64 if (TraitSelector::TraitSelectorEnum == TraitSelector::device_arch) { \
65 if (TargetTriple.getArch() == TargetTriple.getArchTypeForLLVMName(Str)) \
66 ActiveTraits.set(unsigned(TraitProperty::Enum)); \
67 if (StringRef(Str) == "x86_64" && \
68 TargetTriple.getArch() == Triple::x86_64) \
69 ActiveTraits.set(unsigned(TraitProperty::Enum)); \
71#include "llvm/Frontend/OpenMP/OMPKinds.def"
89 <<
"] New OpenMP context with the following properties:\n";
101#ifdef EXPENSIVE_CHECKS
103 "Expected sorted arrays!");
107 auto It0 = C0.
begin(), End0 = C0.
end();
108 auto It1 = C1.
begin(), End1 = C1.
end();
109 while (It0 != End0) {
128 return isSubset<T>(C0, C1);
152 enum MatchKind { MK_ALL, MK_ANY, MK_NONE };
154 MatchKind MK = MK_ALL;
158 unsigned(TraitProperty::implementation_extension_match_any)))
161 unsigned(TraitProperty::implementation_extension_match_none)))
168 bool WasFound) -> std::optional<bool> {
179 if ((WasFound && MK == MK_ALL) || (!WasFound && MK == MK_NONE))
187 <<
" was not in the OpenMP context but match kind is all.\n";
191 <<
" was in the OpenMP context but match kind is none.\n";
205 TraitSelector::implementation_extension)
212 if (Property == TraitProperty::device_isa___ANY)
214 return Ctx.matchesISATrait(RawString);
217 if (std::optional<bool> Result = HandleTrait(Property, IsActiveTrait))
221 if (!DeviceSetOnly) {
227 TraitSet::construct &&
228 "Variant context is ill-formed!");
231 bool FoundInOrder =
false;
232 while (!FoundInOrder && ConstructIdx != NoConstructTraits)
234 if (ConstructMatches)
235 ConstructMatches->
push_back(ConstructIdx - 1);
237 if (std::optional<bool> Result = HandleTrait(Property, FoundInOrder))
243 <<
" was not nested properly.\n");
251 "Broken invariant!");
256 <<
"] None of the properties was in the OpenMP context "
257 "but match kind is any.\n");
266 bool DeviceSetOnly) {
268 VMI, Ctx,
nullptr, DeviceSetOnly);
282 assert(UserScore.
uge(0) &&
"Expect non-negative user scores!");
288 case TraitSet::construct:
292 case TraitSet::implementation:
298 case TraitSet::device:
301 case TraitSet::invalid:
306 if (Property == TraitProperty::device_kind_any)
310 case TraitSelector::device_kind:
311 Score += (1ULL << (NoConstructTraits + 0));
313 case TraitSelector::device_arch:
314 Score += (1ULL << (NoConstructTraits + 1));
316 case TraitSelector::device_isa:
317 Score += (1ULL << (NoConstructTraits + 2));
324 unsigned ConstructIdx = 0;
325 assert(NoConstructTraits == ConstructMatches.
size() &&
326 "Mismatch in the construct traits!");
329 TraitSet::construct &&
330 "Ill-formed variant match info!");
333 Score += (1ULL << ConstructMatches[ConstructIdx++]);
344 APInt BestScore(64, 0);
348 for (
unsigned u = 0, e = VMIs.
size(); u < e; ++u) {
358 if (Score.
ult(BestScore))
361 if (Score.
eq(BestScore)) {
380#define OMP_TRAIT_SET(Enum, Str) .Case(Str, TraitSet::Enum)
381#include "llvm/Frontend/OpenMP/OMPKinds.def"
388#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
389 case TraitSelector::Enum: \
390 return TraitSet::TraitSetEnum;
391#include "llvm/Frontend/OpenMP/OMPKinds.def"
398#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
399 case TraitProperty::Enum: \
400 return TraitSet::TraitSetEnum;
401#include "llvm/Frontend/OpenMP/OMPKinds.def"
407#define OMP_TRAIT_SET(Enum, Str) \
408 case TraitSet::Enum: \
410#include "llvm/Frontend/OpenMP/OMPKinds.def"
417#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
418 .Case(Str, TraitSelector::Enum)
419#include "llvm/Frontend/OpenMP/OMPKinds.def"
420 .
Default(TraitSelector::invalid);
425#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
426 case TraitProperty::Enum: \
427 return TraitSelector::TraitSelectorEnum;
428#include "llvm/Frontend/OpenMP/OMPKinds.def"
434#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
435 case TraitSelector::Enum: \
437#include "llvm/Frontend/OpenMP/OMPKinds.def"
446 if (Set == TraitSet::device && Selector == TraitSelector::device_isa)
447 return TraitProperty::device_isa___ANY;
448#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
449 if (Set == TraitSet::TraitSetEnum && Str == S) \
450 return TraitProperty::Enum;
451#include "llvm/Frontend/OpenMP/OMPKinds.def"
452 return TraitProperty::invalid;
458#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
459 .Case(Str, Selector == TraitSelector::TraitSelectorEnum \
460 ? TraitProperty::Enum \
461 : TraitProperty::invalid)
462#include "llvm/Frontend/OpenMP/OMPKinds.def"
463 .
Default(TraitProperty::invalid);
467 if (Kind == TraitProperty::device_isa___ANY)
470#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
471 case TraitProperty::Enum: \
473#include "llvm/Frontend/OpenMP/OMPKinds.def"
479#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
480 case TraitProperty::Enum: \
481 return "(" #TraitSetEnum "," #TraitSelectorEnum "," Str ")";
482#include "llvm/Frontend/OpenMP/OMPKinds.def"
489 bool &AllowsTraitScore,
490 bool &RequiresProperty) {
491 AllowsTraitScore = Set != TraitSet::construct && Set != TraitSet::device;
493#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
494 case TraitSelector::Enum: \
495 RequiresProperty = ReqProp; \
496 return Set == TraitSet::TraitSetEnum;
497#include "llvm/Frontend/OpenMP/OMPKinds.def"
505#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
506 case TraitProperty::Enum: \
507 return Set == TraitSet::TraitSetEnum && \
508 Selector == TraitSelector::TraitSelectorEnum;
509#include "llvm/Frontend/OpenMP/OMPKinds.def"
516#define OMP_TRAIT_SET(Enum, Str) \
517 if (StringRef(Str) != "invalid") \
518 S.append("'").append(Str).append("'").append(" ");
519#include "llvm/Frontend/OpenMP/OMPKinds.def"
526#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
527 if (TraitSet::TraitSetEnum == Set && StringRef(Str) != "Invalid") \
528 S.append("'").append(Str).append("'").append(" ");
529#include "llvm/Frontend/OpenMP/OMPKinds.def"
538#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
539 if (TraitSet::TraitSetEnum == Set && \
540 TraitSelector::TraitSelectorEnum == Selector && \
541 StringRef(Str) != "invalid") \
542 S.append("'").append(Str).append("'").append(" ");
543#include "llvm/Frontend/OpenMP/OMPKinds.def"
static bool isStrictSubset(ArrayRef< T > C0, ArrayRef< T > C1)
Return true if C0 is a strict subset of C1.
static APInt getVariantMatchScore(const VariantMatchInfo &VMI, const OMPContext &Ctx, SmallVectorImpl< unsigned > &ConstructMatches)
static bool isSubset(ArrayRef< T > C0, ArrayRef< T > C1)
Return true if C0 is a subset of C1.
static int isVariantApplicableInContextHelper(const VariantMatchInfo &VMI, const OMPContext &Ctx, SmallVectorImpl< unsigned > *ConstructMatches, bool DeviceSetOnly)
This file provides helper functions and classes to deal with OpenMP contexts as used by [begin/end] d...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
bool eq(const APInt &RHS) const
Equality comparison.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool test(unsigned Idx) const
size_type count() const
count - Returns the number of bits which are set.
iterator_range< const_set_bits_iterator > set_bits() const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
A switch()-like statement whose cases are string literals.
Triple - Helper class for working with autoconf configuration names.
ArchType getArch() const
Get the parsed architecture type of this triple.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
std::string listOpenMPContextTraitSets()
Return a string listing all trait sets.
StringRef getOpenMPContextTraitPropertyFullName(TraitProperty Kind)
Return a textual representation of the trait property Kind with selector and set name included.
bool isValidTraitSelectorForTraitSet(TraitSelector Selector, TraitSet Set, bool &AllowsTraitScore, bool &RequiresProperty)
}
TraitSet getOpenMPContextTraitSetForSelector(TraitSelector Selector)
Return the trait set for which Selector is a selector.
TraitSet getOpenMPContextTraitSetForProperty(TraitProperty Property)
Return the trait set for which Property is a property.
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.
StringRef getOpenMPContextTraitSetName(TraitSet Kind)
Return a textual representation of the trait set Kind.
StringRef getOpenMPContextTraitPropertyName(TraitProperty Kind, StringRef RawString)
Return a textual representation of the trait property Kind, which might be the raw string we parsed (...
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...
StringRef getOpenMPContextTraitSelectorName(TraitSelector Kind)
Return a textual representation of the trait selector Kind.
TraitSelector getOpenMPContextTraitSelectorKind(StringRef Str)
Parse Str and return the trait set it matches or TraitSelector::invalid.
std::string listOpenMPContextTraitSelectors(TraitSet Set)
Return a string listing all trait selectors for Set.
TraitSet
OpenMP Context related IDs and helpers.
TraitSelector getOpenMPContextTraitSelectorForProperty(TraitProperty Property)
Return the trait selector for which Property is a property.
TraitProperty getOpenMPContextTraitPropertyForSelector(TraitSelector Selector)
Return the trait property for a singleton selector Selector.
TraitSelector
IDs for all OpenMP context selector trait (device={kind/isa...}/...).
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/...)
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...
bool isValidTraitPropertyForTraitSetAndSelector(TraitProperty Property, TraitSelector Selector, TraitSet Set)
Return true if Property can be nested in Selector and Set.
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.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
The context for a source location is made up of active property traits, e.g., device={kind(host)},...
OMPContext(bool IsDeviceCompilation, Triple TargetTriple)
SmallVector< TraitProperty, 8 > ConstructTraits
Variant match information describes the required traits and how they are scored (via the ScoresMap).
SmallVector< StringRef, 8 > ISATraits
SmallVector< TraitProperty, 8 > ConstructTraits
SmallDenseMap< TraitProperty, APInt > ScoreMap