29#define GEN_DIRECTIVES_IMPL
30#include "llvm/Frontend/OpenMP/OMP.inc"
53 auto firstLoopAssociated =
56 if (getDirectiveAssociation(*It) == Association::Loop)
64 auto Begin = firstLoopAssociated(Leafs);
65 if (Begin == Leafs.end())
70 if (
End == Leafs.end())
73 for (;
End != Leafs.end(); ++
End) {
74 if (getDirectiveAssociation(*
End) != Association::Loop)
85 llvm::enum_seq_inclusive<Clause>(Clause::First_, Clause::Last_)) {
90 for (
auto D : llvm::enum_seq_inclusive<Directive>(Directive::First_,
93 return isAllowedClauseForDirective(
D,
C, Version);
95 if (AllowsPrivatizing)
102 auto Idx =
static_cast<std::size_t
>(
D);
103 if (
Idx >= Directive_enumSize)
105 const auto *Row = LeafConstructTable[LeafConstructTableOrdering[
Idx]];
106 return ArrayRef(&Row[2],
static_cast<int>(Row[1]));
112 auto Idx =
static_cast<size_t>(
D);
113 assert(
Idx < Directive_enumSize &&
"Invalid directive");
114 const auto *Row = LeafConstructTable[LeafConstructTableOrdering[
Idx]];
116 return ArrayRef(&Row[0], &Row[0] + 1);
122 using IteratorTy = ArrayTy::iterator;
125 IteratorTy Iter = Leafs.
begin();
129 for (; Iter !=
Range.begin(); ++Iter)
131 if (!
Range.empty()) {
134 assert(Comp != OMPD_unknown);
140 assert(Iter == Leafs.
end() &&
"Malformed directive");
142 }
while (Iter != Leafs.
end());
170 if (GivenLeafs.size() == 1)
171 return GivenLeafs.front();
172 RawLeafs[1] =
static_cast<Directive>(GivenLeafs.size());
174 auto Iter = std::lower_bound(
175 LeafConstructTable, LeafConstructTableEndDirective,
176 static_cast<std::decay_t<decltype(*LeafConstructTable)
>>(RawLeafs.
data()),
177 [](
const llvm::omp::Directive *RowA,
const llvm::omp::Directive *RowB) {
178 const auto *BeginA = &RowA[2];
179 const auto *EndA = BeginA + static_cast<int>(RowA[1]);
180 const auto *BeginB = &RowB[2];
181 const auto *EndB = BeginB + static_cast<int>(RowB[1]);
182 if (BeginA == EndA && BeginB == EndB)
183 return static_cast<int>(RowA[0]) < static_cast<int>(RowB[0]);
184 return std::lexicographical_compare(BeginA, EndA, BeginB, EndB);
187 if (Iter == std::end(LeafConstructTable))
193 if (FoundLeafs == GivenLeafs)
202 if (Leafs.
size() <= 1)
215 static unsigned Versions[]{31, 40, 45, 50, 51, 52, 60, 61};
221 [[maybe_unused]]
static bool Init =
233 if (FunctionName.
ends_with(
".internalized"))
234 return FunctionName.
drop_back(
sizeof(
"internalized")).
str() +
239 return FunctionName.
str();
240 return (
"omp target in " + ParentName +
" @ " + std::to_string(LineNo) +
241 " (" + FunctionName +
")")
255 for (
int I = 0;
I < 3; ++
I) {
256 PrettyName = PrettyName.
drop_while([](
char c) {
return c !=
'_'; });
261 size_t LineIdx = PrettyName.
rfind(
"_l");
264 if (PrettyName.drop_front(LineIdx + 2).consumeInteger(10, LineNo))
266 return demangle(PrettyName.take_front(LineIdx));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
static iterator_range< ArrayRef< Directive >::iterator > getFirstCompositeRange(iterator_range< ArrayRef< Directive >::iterator > Leafs)
static void collectPrivatizingConstructs(llvm::SmallSet< Directive, 16 > &Constructs, unsigned Version)
Provides some synthesis utilities to produce sequences of values.
This file defines the SmallSet class.
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
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.
std::string str() const
str - Get the contents as an std::string.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
size_t rfind(char C, size_t From=npos) const
Search for the last character C in the string.
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
static constexpr size_t npos
StringRef drop_while(function_ref< bool(char)> F) const
Return a StringRef equal to 'this', but with all characters satisfying the given predicate dropped fr...
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
A range adaptor for a pair of iterators.
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI ArrayRef< unsigned > getOpenMPVersions()
LLVM_ABI bool isCombinedConstruct(Directive D)
LLVM_ABI std::string deconstructOpenMPKernelName(StringRef KernelName, unsigned &LineNo)
Deconstruct an OpenMP kernel name into the parent function name and the line number.
LLVM_ABI ArrayRef< Directive > getLeafOrCompositeConstructs(Directive D, SmallVectorImpl< Directive > &Output)
bool isPrivatizingConstruct(Directive D, unsigned Version)
Can directive D, under some circumstances, create a private copy of a variable in given OpenMP versio...
LLVM_ABI bool isCompositeConstruct(Directive D)
static constexpr bool isPrivatizingClause(Clause C)
LLVM_ABI Directive getCompoundConstruct(ArrayRef< Directive > Parts)
LLVM_ABI bool isLeafConstruct(Directive D)
LLVM_ABI ArrayRef< Directive > getLeafConstructsOrSelf(Directive D)
LLVM_ABI std::string prettifyFunctionName(StringRef FunctionName)
Create a nicer version of a function name for humans to look at.
LLVM_ABI ArrayRef< Directive > getLeafConstructs(Directive D)
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
DEMANGLE_ABI std::string demangle(std::string_view MangledName)
Attempt to demangle a string using different demangling schemes.
static constexpr const char * KernelNamePrefix
The prefix used for kernel names.