22#define DEBUG_TYPE "openmp-ir-builder"
28 Triple TargetOffloadTriple,
int DeviceNum) {
30 if (!TargetOffloadTriple.
getTriple().empty() && DeviceNum > -1) {
33 switch (TargetOffloadTriple.
getArch()) {
62#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
63 if (TraitSelector::TraitSelectorEnum == TraitSelector::target_device_arch) { \
64 if (TargetOffloadTriple.getArch() == \
65 TargetOffloadTriple.getArchTypeForLLVMName(Str)) \
66 ActiveTraits.set(unsigned(TraitProperty::Enum)); \
67 if (StringRef(Str) == "x86_64" && \
68 TargetOffloadTriple.getArch() == Triple::x86_64) \
69 ActiveTraits.set(unsigned(TraitProperty::Enum)); \
71#include "llvm/Frontend/OpenMP/OMPKinds.def"
76 ? TraitProperty::device_kind_nohost
77 : TraitProperty::device_kind_host));
79 switch (TargetTriple.
getArch()) {
111#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
112 if (TraitSelector::TraitSelectorEnum == TraitSelector::device_arch || \
113 TraitSelector::TraitSelectorEnum == TraitSelector::target_device_arch) { \
114 if (TargetTriple.getArch() == TargetTriple.getArchTypeForLLVMName(Str)) \
115 ActiveTraits.set(unsigned(TraitProperty::Enum)); \
116 if (StringRef(Str) == "x86_64" && \
117 TargetTriple.getArch() == Triple::x86_64) \
118 ActiveTraits.set(unsigned(TraitProperty::Enum)); \
120#include "llvm/Frontend/OpenMP/OMPKinds.def"
138 <<
"] New OpenMP context with the following properties:\n";
151#ifdef EXPENSIVE_CHECKS
153 "Expected sorted arrays!");
157 auto It0 = C0.
begin(), End0 = C0.
end();
158 auto It1 = C1.
begin(), End1 = C1.
end();
159 while (It0 != End0) {
178 return isSubset<T>(C0, C1);
202 enum MatchKind { MK_ALL, MK_ANY, MK_NONE };
204 MatchKind MK = MK_ALL;
208 unsigned(TraitProperty::implementation_extension_match_any)))
211 unsigned(TraitProperty::implementation_extension_match_none)))
218 bool WasFound) -> std::optional<bool> {
229 if ((WasFound && MK == MK_ALL) || (!WasFound && MK == MK_NONE))
237 <<
" was not in the OpenMP context but match kind is all.\n";
241 <<
" was in the OpenMP context but match kind is none.\n";
255 TraitSelector::implementation_extension)
262 if (Property == TraitProperty::device_isa___ANY)
264 return Ctx.matchesISATrait(RawString);
266 if (Property == TraitProperty::target_device_isa___ANY)
268 return Ctx.matchesISATrait(RawString);
271 if (std::optional<bool> Result = HandleTrait(Property, IsActiveTrait))
275 if (!DeviceSetOnly) {
281 TraitSet::construct &&
282 "Variant context is ill-formed!");
285 bool FoundInOrder =
false;
286 while (!FoundInOrder && ConstructIdx != NoConstructTraits)
288 if (ConstructMatches)
289 ConstructMatches->
push_back(ConstructIdx - 1);
291 if (std::optional<bool> Result = HandleTrait(Property, FoundInOrder))
297 <<
" was not nested properly.\n");
305 "Broken invariant!");
310 <<
"] None of the properties was in the OpenMP context "
311 "but match kind is any.\n");
320 bool DeviceSetOnly) {
322 VMI, Ctx,
nullptr, DeviceSetOnly);
336 assert(UserScore.
uge(0) &&
"Expect non-negative user scores!");
342 case TraitSet::construct:
346 case TraitSet::implementation:
352 case TraitSet::device:
355 case TraitSet::target_device:
358 case TraitSet::invalid:
363 if (Property == TraitProperty::device_kind_any)
365 if (Property == TraitProperty::target_device_kind_any)
369 case TraitSelector::device_kind:
370 Score += (1ULL << (NoConstructTraits + 0));
372 case TraitSelector::device_arch:
373 Score += (1ULL << (NoConstructTraits + 1));
375 case TraitSelector::device_isa:
376 Score += (1ULL << (NoConstructTraits + 2));
378 case TraitSelector::target_device_kind:
379 Score += (1ULL << (NoConstructTraits + 0));
381 case TraitSelector::target_device_arch:
382 Score += (1ULL << (NoConstructTraits + 1));
384 case TraitSelector::target_device_isa:
385 Score += (1ULL << (NoConstructTraits + 2));
392 unsigned ConstructIdx = 0;
393 assert(NoConstructTraits == ConstructMatches.
size() &&
394 "Mismatch in the construct traits!");
397 TraitSet::construct &&
398 "Ill-formed variant match info!");
401 Score += (1ULL << ConstructMatches[ConstructIdx++]);
412 APInt BestScore(64, 0);
416 for (
unsigned u = 0, e = VMIs.
size(); u < e; ++u) {
426 if (Score.
ult(BestScore))
429 if (Score.
eq(BestScore)) {
448#define OMP_TRAIT_SET(Enum, Str) .Case(Str, TraitSet::Enum)
449#include "llvm/Frontend/OpenMP/OMPKinds.def"
456#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
457 case TraitSelector::Enum: \
458 return TraitSet::TraitSetEnum;
459#include "llvm/Frontend/OpenMP/OMPKinds.def"
466#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
467 case TraitProperty::Enum: \
468 return TraitSet::TraitSetEnum;
469#include "llvm/Frontend/OpenMP/OMPKinds.def"
475#define OMP_TRAIT_SET(Enum, Str) \
476 case TraitSet::Enum: \
478#include "llvm/Frontend/OpenMP/OMPKinds.def"
485 if (Set == TraitSet::target_device && S ==
"kind")
486 return TraitSelector::target_device_kind;
487 if (Set == TraitSet::target_device && S ==
"arch")
488 return TraitSelector::target_device_arch;
489 if (Set == TraitSet::target_device && S ==
"isa")
490 return TraitSelector::target_device_isa;
492#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
493 .Case(Str, TraitSelector::Enum)
494#include "llvm/Frontend/OpenMP/OMPKinds.def"
495 .
Default(TraitSelector::invalid);
500#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
501 case TraitProperty::Enum: \
502 return TraitSelector::TraitSelectorEnum;
503#include "llvm/Frontend/OpenMP/OMPKinds.def"
509#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
510 case TraitSelector::Enum: \
512#include "llvm/Frontend/OpenMP/OMPKinds.def"
521 if (Set == TraitSet::device && Selector == TraitSelector::device_isa)
522 return TraitProperty::device_isa___ANY;
523 if (Set == TraitSet::target_device &&
524 Selector == TraitSelector::target_device_isa)
525 return TraitProperty::target_device_isa___ANY;
526#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
527 if (Set == TraitSet::TraitSetEnum && Str == S) \
528 return TraitProperty::Enum;
529#include "llvm/Frontend/OpenMP/OMPKinds.def"
530 return TraitProperty::invalid;
536#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
537 .Case(Str, Selector == TraitSelector::TraitSelectorEnum \
538 ? TraitProperty::Enum \
539 : TraitProperty::invalid)
540#include "llvm/Frontend/OpenMP/OMPKinds.def"
541 .
Default(TraitProperty::invalid);
545 if (Kind == TraitProperty::device_isa___ANY)
547 if (Kind == TraitProperty::target_device_isa___ANY)
550#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
551 case TraitProperty::Enum: \
553#include "llvm/Frontend/OpenMP/OMPKinds.def"
559#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
560 case TraitProperty::Enum: \
561 return "(" #TraitSetEnum "," #TraitSelectorEnum "," Str ")";
562#include "llvm/Frontend/OpenMP/OMPKinds.def"
569 bool &AllowsTraitScore,
570 bool &RequiresProperty) {
571 AllowsTraitScore = Set != TraitSet::construct && Set != TraitSet::device &&
572 Set != TraitSet::target_device;
574#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
575 case TraitSelector::Enum: \
576 RequiresProperty = ReqProp; \
577 return Set == TraitSet::TraitSetEnum;
578#include "llvm/Frontend/OpenMP/OMPKinds.def"
586#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
587 case TraitProperty::Enum: \
588 return Set == TraitSet::TraitSetEnum && \
589 Selector == TraitSelector::TraitSelectorEnum;
590#include "llvm/Frontend/OpenMP/OMPKinds.def"
597#define OMP_TRAIT_SET(Enum, Str) \
598 if (StringRef(Str) != "invalid") \
599 S.append("'").append(Str).append("'").append(" ");
600#include "llvm/Frontend/OpenMP/OMPKinds.def"
607#define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, ReqProp) \
608 if (TraitSet::TraitSetEnum == Set && StringRef(Str) != "Invalid") \
609 S.append("'").append(Str).append("'").append(" ");
610#include "llvm/Frontend/OpenMP/OMPKinds.def"
619#define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) \
620 if (TraitSet::TraitSetEnum == Set && \
621 TraitSelector::TraitSelectorEnum == Selector && \
622 StringRef(Str) != "invalid") \
623 S.append("'").append(Str).append("'").append(" ");
624#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.
const std::string & getTriple() const
#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.
TraitSelector getOpenMPContextTraitSelectorKind(StringRef Str, TraitSet Set)
Parse Str and return the trait set it matches or TraitSelector::invalid.
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.
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, Triple TargetOffloadTriple, int DeviceNum)
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