22#define DEBUG_TYPE "openmp-ir-builder"
31 ? TraitProperty::device_kind_nohost
32 : TraitProperty::device_kind_host));
33 switch (TargetTriple.
getArch()) {
61#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
62 if (TraitSelector::TraitSelectorEnum == TraitSelector::device_arch) { \
63 if (TargetTriple.getArch() == TargetTriple.getArchTypeForLLVMName(Str)) \
64 ActiveTraits.set(unsigned(TraitProperty::Enum)); \
65 if (StringRef(Str) == StringRef("x86_64") && \
66 TargetTriple.getArch() == Triple::x86_64) \
67 ActiveTraits.set(unsigned(TraitProperty::Enum)); \
69#include "llvm/Frontend/OpenMP/OMPKinds.def"
87 <<
"] New OpenMP context with the following properties:\n";
99#ifdef EXPENSIVE_CHECKS
101 "Expected sorted arrays!");
105 auto It0 = C0.
begin(), End0 = C0.
end();
106 auto It1 = C1.
begin(), End1 = C1.
end();
107 while (It0 != End0) {
126 return isSubset<T>(C0, C1);
150 enum MatchKind { MK_ALL, MK_ANY, MK_NONE };
152 MatchKind MK = MK_ALL;
156 unsigned(TraitProperty::implementation_extension_match_any)))
159 unsigned(TraitProperty::implementation_extension_match_none)))
166 bool WasFound) -> std::optional<bool> {
177 if ((WasFound && MK == MK_ALL) || (!WasFound && MK == MK_NONE))
185 <<
" was not in the OpenMP context but match kind is all.\n";
189 <<
" was in the OpenMP context but match kind is none.\n";
203 TraitSelector::implementation_extension)
210 if (Property == TraitProperty::device_isa___ANY)
212 return Ctx.matchesISATrait(RawString);
215 if (std::optional<bool> Result = HandleTrait(Property, IsActiveTrait))
219 if (!DeviceSetOnly) {
225 TraitSet::construct &&
226 "Variant context is ill-formed!");
229 bool FoundInOrder =
false;
230 while (!FoundInOrder && ConstructIdx != NoConstructTraits)
232 if (ConstructMatches)
233 ConstructMatches->
push_back(ConstructIdx - 1);
235 if (std::optional<bool> Result = HandleTrait(Property, FoundInOrder))
241 <<
" was not nested properly.\n");
249 "Broken invariant!");
254 <<
"] None of the properties was in the OpenMP context "
255 "but match kind is any.\n");
264 bool DeviceSetOnly) {
266 VMI, Ctx,
nullptr, DeviceSetOnly);
280 assert(UserScore.
uge(0) &&
"Expect non-negative user scores!");
286 case TraitSet::construct:
290 case TraitSet::implementation:
296 case TraitSet::device:
299 case TraitSet::invalid:
304 if (Property == TraitProperty::device_kind_any)
308 case TraitSelector::device_kind:
309 Score += (1ULL << (NoConstructTraits + 0));
311 case TraitSelector::device_arch:
312 Score += (1ULL << (NoConstructTraits + 1));
314 case TraitSelector::device_isa:
315 Score += (1ULL << (NoConstructTraits + 2));
322 unsigned ConstructIdx = 0;
323 assert(NoConstructTraits == ConstructMatches.
size() &&
324 "Mismatch in the construct traits!");
327 TraitSet::construct &&
328 "Ill-formed variant match info!");
331 Score += (1ULL << ConstructMatches[ConstructIdx++]);
342 APInt BestScore(64, 0);
346 for (
unsigned u = 0, e = VMIs.
size(); u < e; ++u) {
356 if (Score.
ult(BestScore))
359 if (Score.
eq(BestScore)) {
378#define OMP_TRAIT_SET(Enum, Str) .Case(Str, TraitSet::Enum)
379#include "llvm/Frontend/OpenMP/OMPKinds.def"
386#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
387 case TraitSelector::Enum: \
388 return TraitSet::TraitSetEnum;
389#include "llvm/Frontend/OpenMP/OMPKinds.def"
396#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
397 case TraitProperty::Enum: \
398 return TraitSet::TraitSetEnum;
399#include "llvm/Frontend/OpenMP/OMPKinds.def"
405#define OMP_TRAIT_SET(Enum, Str) \
406 case TraitSet::Enum: \
408#include "llvm/Frontend/OpenMP/OMPKinds.def"
415#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
416 .Case(Str, TraitSelector::Enum)
417#include "llvm/Frontend/OpenMP/OMPKinds.def"
418 .
Default(TraitSelector::invalid);
423#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
424 case TraitProperty::Enum: \
425 return TraitSelector::TraitSelectorEnum;
426#include "llvm/Frontend/OpenMP/OMPKinds.def"
432#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
433 case TraitSelector::Enum: \
435#include "llvm/Frontend/OpenMP/OMPKinds.def"
444 if (Set == TraitSet::device && Selector == TraitSelector::device_isa)
445 return TraitProperty::device_isa___ANY;
446#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
447 if (Set == TraitSet::TraitSetEnum && Str == S) \
448 return TraitProperty::Enum;
449#include "llvm/Frontend/OpenMP/OMPKinds.def"
450 return TraitProperty::invalid;
456#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
457 .Case(Str, Selector == TraitSelector::TraitSelectorEnum \
458 ? TraitProperty::Enum \
459 : TraitProperty::invalid)
460#include "llvm/Frontend/OpenMP/OMPKinds.def"
461 .
Default(TraitProperty::invalid);
465 if (Kind == TraitProperty::device_isa___ANY)
468#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
469 case TraitProperty::Enum: \
471#include "llvm/Frontend/OpenMP/OMPKinds.def"
477#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
478 case TraitProperty::Enum: \
479 return "(" #TraitSetEnum "," #TraitSelectorEnum "," Str ")";
480#include "llvm/Frontend/OpenMP/OMPKinds.def"
487 bool &AllowsTraitScore,
488 bool &RequiresProperty) {
489 AllowsTraitScore = Set != TraitSet::construct && Set != TraitSet::device;
491#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
492 case TraitSelector::Enum: \
493 RequiresProperty = ReqProp; \
494 return Set == TraitSet::TraitSetEnum;
495#include "llvm/Frontend/OpenMP/OMPKinds.def"
503#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
504 case TraitProperty::Enum: \
505 return Set == TraitSet::TraitSetEnum && \
506 Selector == TraitSelector::TraitSelectorEnum;
507#include "llvm/Frontend/OpenMP/OMPKinds.def"
514#define OMP_TRAIT_SET(Enum, Str) \
515 if (StringRef(Str) != "invalid") \
516 S.append("'").append(Str).append("'").append(" ");
517#include "llvm/Frontend/OpenMP/OMPKinds.def"
524#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
525 if (TraitSet::TraitSetEnum == Set && StringRef(Str) != "Invalid") \
526 S.append("'").append(Str).append("'").append(" ");
527#include "llvm/Frontend/OpenMP/OMPKinds.def"
536#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
537 if (TraitSet::TraitSetEnum == Set && \
538 TraitSelector::TraitSelectorEnum == Selector && \
539 StringRef(Str) != "invalid") \
540 S.append("'").append(Str).append("'").append(" ");
541#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