Skip to content

Commit

Permalink
[OpenMP][NFC] Use OMPInteropInfo in the OMPDeclareVariantAttr attribute
Browse files Browse the repository at this point in the history
In preparation for allowing the prefer_type list in the append_args clause,
use the OMPInteropInfo in the attribute for 'declare variant'.

This requires adding a new Argument kind to the attribute code. This change
adds a specific attribute to pass an array of OMPInteropInfo. It implements
new tablegen needed to handle the interop-type part of the structure. When
prefer_type is added, more work will be needed to dump, instantiate, and
serialize the PreferTypes field in OMPInteropInfo.

Differential Revision: https://reviews.llvm.org/D132270
  • Loading branch information
mikerice1969 committed Aug 22, 2022
1 parent 2f2fce8 commit 129904d
Show file tree
Hide file tree
Showing 12 changed files with 88 additions and 45 deletions.
7 changes: 0 additions & 7 deletions clang/include/clang/AST/OpenMPClause.h
Expand Up @@ -7709,13 +7709,6 @@ class OMPOrderClause final : public OMPClause {
}
};

/// Contains 'interop' data for 'append_args' and 'init' clauses.
struct OMPInteropInfo final {
bool IsTarget = false;
bool IsTargetSync = false;
llvm::SmallVector<Expr *, 4> PreferTypes;
};

/// This represents the 'init' clause in '#pragma omp ...' directives.
///
/// \code
Expand Down
12 changes: 9 additions & 3 deletions clang/include/clang/Basic/Attr.td
Expand Up @@ -221,6 +221,7 @@ class DeclArgument<DeclNode kind, string name, bit opt = 0, bit fake = 0>
// OMPTraitProperty := {Kind}
//
class OMPTraitInfoArgument<string name> : Argument<name, 0>;
class VariadicOMPInteropInfoArgument<string name> : Argument<name, 0>;

class TypeArgument<string name, bit opt = 0> : Argument<name, opt>;
class UnsignedArgument<string name, bit opt = 0> : Argument<name, opt>;
Expand Down Expand Up @@ -3827,14 +3828,19 @@ def OMPDeclareVariant : InheritableAttr {
OMPTraitInfoArgument<"TraitInfos">,
VariadicExprArgument<"AdjustArgsNothing">,
VariadicExprArgument<"AdjustArgsNeedDevicePtr">,
VariadicEnumArgument<"AppendArgs", "InteropType",
["target", "targetsync", "target,targetsync"],
["Target", "TargetSync", "Target_TargetSync"]>
VariadicOMPInteropInfoArgument<"AppendArgs">,
];
let AdditionalMembers = [{
OMPTraitInfo &getTraitInfo() { return *traitInfos; }
void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
const;
static StringRef getInteropTypeString(const OMPInteropInfo *I) {
if (I->IsTarget && I->IsTargetSync)
return "target,targetsync";
if (I->IsTarget)
return "target";
return "targetsync";
}
}];
}

Expand Down
10 changes: 10 additions & 0 deletions clang/include/clang/Basic/OpenMPKinds.h
Expand Up @@ -181,6 +181,16 @@ enum OpenMPBindClauseKind {
OMPC_BIND_unknown
};

/// Contains 'interop' data for 'append_args' and 'init' clauses.
class Expr;
struct OMPInteropInfo final {
OMPInteropInfo(bool IsTarget = false, bool IsTargetSync = false)
: IsTarget(IsTarget), IsTargetSync(IsTargetSync) {}
bool IsTarget;
bool IsTargetSync;
llvm::SmallVector<Expr *, 4> PreferTypes;
};

unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str,
const LangOptions &LangOpts);
const char *getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type);
Expand Down
3 changes: 1 addition & 2 deletions clang/include/clang/Parse/Parser.h
Expand Up @@ -3180,8 +3180,7 @@ class Parser : public CodeCompletionHandler {
bool parseOMPContextSelectors(SourceLocation Loc, OMPTraitInfo &TI);

/// Parse an 'append_args' clause for '#pragma omp declare variant'.
bool parseOpenMPAppendArgs(
SmallVectorImpl<OMPDeclareVariantAttr::InteropType> &InterOpTypes);
bool parseOpenMPAppendArgs(SmallVectorImpl<OMPInteropInfo> &InteropInfos);

/// Parse a `match` clause for an '#pragma omp declare variant'. Return true
/// if there was an error.
Expand Down
5 changes: 2 additions & 3 deletions clang/include/clang/Sema/Sema.h
Expand Up @@ -11393,9 +11393,8 @@ class Sema final {
FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI,
ArrayRef<Expr *> AdjustArgsNothing,
ArrayRef<Expr *> AdjustArgsNeedDevicePtr,
ArrayRef<OMPDeclareVariantAttr::InteropType> AppendArgs,
SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc,
SourceRange SR);
ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc,
SourceLocation AppendArgsLoc, SourceRange SR);

OMPClause *ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind,
Expr *Expr,
Expand Down
8 changes: 4 additions & 4 deletions clang/lib/AST/AttrImpl.cpp
Expand Up @@ -222,18 +222,18 @@ void OMPDeclareVariantAttr::printPrettyPragma(
OS << ")";
}

auto PrintInteropTypes = [&OS](InteropType *Begin, InteropType *End) {
for (InteropType *I = Begin; I != End; ++I) {
auto PrintInteropInfo = [&OS](OMPInteropInfo *Begin, OMPInteropInfo *End) {
for (OMPInteropInfo *I = Begin; I != End; ++I) {
if (I != Begin)
OS << ", ";
OS << "interop(";
OS << ConvertInteropTypeToStr(*I);
OS << getInteropTypeString(I);
OS << ")";
}
};
if (appendArgs_size()) {
OS << " append_args(";
PrintInteropTypes(appendArgs_begin(), appendArgs_end());
PrintInteropInfo(appendArgs_begin(), appendArgs_end());
OS << ")";
}
}
Expand Down
22 changes: 6 additions & 16 deletions clang/lib/Parse/ParseOpenMP.cpp
Expand Up @@ -1419,7 +1419,7 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
OMPTraitInfo &TI = ASTCtx.getNewOMPTraitInfo();
SmallVector<Expr *, 6> AdjustNothing;
SmallVector<Expr *, 6> AdjustNeedDevicePtr;
SmallVector<OMPDeclareVariantAttr::InteropType, 3> AppendArgs;
SmallVector<OMPInteropInfo, 3> AppendArgs;
SourceLocation AdjustArgsLoc, AppendArgsLoc;

// At least one clause is required.
Expand Down Expand Up @@ -1503,7 +1503,7 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr,
}

bool Parser::parseOpenMPAppendArgs(
SmallVectorImpl<OMPDeclareVariantAttr::InteropType> &InterOpTypes) {
SmallVectorImpl<OMPInteropInfo> &InteropInfos) {
bool HasError = false;
// Parse '('.
BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
Expand All @@ -1521,26 +1521,16 @@ bool Parser::parseOpenMPAppendArgs(
return true;

OMPInteropInfo InteropInfo;
if (ParseOMPInteropInfo(InteropInfo, OMPC_append_args)) {
if (ParseOMPInteropInfo(InteropInfo, OMPC_append_args))
HasError = true;
} else {
OMPDeclareVariantAttr::InteropType IT;
// As of OpenMP 5.1, there are two interop-types, "target" and
// "targetsync". Either or both are allowed for a single interop.
if (InteropInfo.IsTarget && InteropInfo.IsTargetSync)
IT = OMPDeclareVariantAttr::Target_TargetSync;
else if (InteropInfo.IsTarget)
IT = OMPDeclareVariantAttr::Target;
else
IT = OMPDeclareVariantAttr::TargetSync;
InterOpTypes.push_back(IT);
}
else
InteropInfos.push_back(InteropInfo);

IT.consumeClose();
if (Tok.is(tok::comma))
ConsumeToken();
}
if (!HasError && InterOpTypes.empty()) {
if (!HasError && InteropInfos.empty()) {
HasError = true;
Diag(Tok.getLocation(), diag::err_omp_unexpected_append_op);
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
Expand Down
8 changes: 3 additions & 5 deletions clang/lib/Sema/SemaOpenMP.cpp
Expand Up @@ -7585,9 +7585,8 @@ void Sema::ActOnOpenMPDeclareVariantDirective(
FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI,
ArrayRef<Expr *> AdjustArgsNothing,
ArrayRef<Expr *> AdjustArgsNeedDevicePtr,
ArrayRef<OMPDeclareVariantAttr::InteropType> AppendArgs,
SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc,
SourceRange SR) {
ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc,
SourceLocation AppendArgsLoc, SourceRange SR) {

// OpenMP 5.1 [2.3.5, declare variant directive, Restrictions]
// An adjust_args clause or append_args clause can only be specified if the
Expand Down Expand Up @@ -7647,8 +7646,7 @@ void Sema::ActOnOpenMPDeclareVariantDirective(
AdjustArgsNothing.size(),
const_cast<Expr **>(AdjustArgsNeedDevicePtr.data()),
AdjustArgsNeedDevicePtr.size(),
const_cast<OMPDeclareVariantAttr::InteropType *>(AppendArgs.data()),
AppendArgs.size(), SR);
const_cast<OMPInteropInfo *>(AppendArgs.data()), AppendArgs.size(), SR);
FD->addAttr(NewAttr);
}

Expand Down
7 changes: 5 additions & 2 deletions clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
Expand Up @@ -506,7 +506,7 @@ static void instantiateOMPDeclareVariantAttr(

SmallVector<Expr *, 8> NothingExprs;
SmallVector<Expr *, 8> NeedDevicePtrExprs;
SmallVector<OMPDeclareVariantAttr::InteropType, 8> AppendArgs;
SmallVector<OMPInteropInfo, 4> AppendArgs;

for (Expr *E : Attr.adjustArgsNothing()) {
ExprResult ER = Subst(E);
Expand All @@ -520,7 +520,10 @@ static void instantiateOMPDeclareVariantAttr(
continue;
NeedDevicePtrExprs.push_back(ER.get());
}
llvm::append_range(AppendArgs, Attr.appendArgs());
for (OMPInteropInfo &II : Attr.appendArgs()) {
// When prefer_type is implemented for append_args handle them here too.
AppendArgs.emplace_back(II.IsTarget, II.IsTargetSync);
}

S.ActOnOpenMPDeclareVariantDirective(
FD, E, TI, NothingExprs, NeedDevicePtrExprs, AppendArgs, SourceLocation(),
Expand Down
4 changes: 1 addition & 3 deletions clang/lib/Sema/TreeTransform.h
Expand Up @@ -9671,9 +9671,7 @@ OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
if (IVR.isInvalid())
return nullptr;

OMPInteropInfo InteropInfo;
InteropInfo.IsTarget = C->getIsTarget();
InteropInfo.IsTargetSync = C->getIsTargetSync();
OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync());
InteropInfo.PreferTypes.reserve(C->varlist_size() - 1);
for (Expr *E : llvm::drop_begin(C->varlists())) {
ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Serialization/ASTReaderDecl.cpp
Expand Up @@ -2859,6 +2859,8 @@ class AttrReader {
return Reader.readInt();
}

bool readBool() { return Reader.readBool(); }

SourceRange readSourceRange() {
return Reader.readSourceRange();
}
Expand Down
45 changes: 45 additions & 0 deletions clang/utils/TableGen/ClangAttrEmitter.cpp
Expand Up @@ -806,6 +806,49 @@ namespace {
}
};

class VariadicOMPInteropInfoArgument : public VariadicArgument {
public:
VariadicOMPInteropInfoArgument(const Record &Arg, StringRef Attr)
: VariadicArgument(Arg, Attr, "OMPInteropInfo") {}

void writeDump(raw_ostream &OS) const override {
OS << " for (" << getAttrName() << "Attr::" << getLowerName()
<< "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
<< getLowerName() << "_end(); I != E; ++I) {\n";
OS << " if (I->IsTarget && I->IsTargetSync)\n";
OS << " OS << \" Target_TargetSync\";\n";
OS << " else if (I->IsTarget)\n";
OS << " OS << \" Target\";\n";
OS << " else\n";
OS << " OS << \" TargetSync\";\n";
OS << " }\n";
}

void writePCHReadDecls(raw_ostream &OS) const override {
OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n";
OS << " SmallVector<OMPInteropInfo, 4> " << getLowerName() << ";\n";
OS << " " << getLowerName() << ".reserve(" << getLowerName()
<< "Size);\n";
OS << " for (unsigned I = 0, E = " << getLowerName() << "Size; ";
OS << "I != E; ++I) {\n";
OS << " bool IsTarget = Record.readBool();\n";
OS << " bool IsTargetSync = Record.readBool();\n";
OS << " " << getLowerName()
<< ".emplace_back(IsTarget, IsTargetSync);\n";
OS << " }\n";
}

void writePCHWrite(raw_ostream &OS) const override {
OS << " Record.push_back(SA->" << getLowerName() << "_size());\n";
OS << " for (" << getAttrName() << "Attr::" << getLowerName()
<< "_iterator I = SA->" << getLowerName() << "_begin(), E = SA->"
<< getLowerName() << "_end(); I != E; ++I) {\n";
OS << " Record.writeBool(I->IsTarget);\n";
OS << " Record.writeBool(I->IsTargetSync);\n";
OS << " }\n";
}
};

class VariadicParamIdxArgument : public VariadicArgument {
public:
VariadicParamIdxArgument(const Record &Arg, StringRef Attr)
Expand Down Expand Up @@ -1374,6 +1417,8 @@ createArgument(const Record &Arg, StringRef Attr,
Ptr = std::make_unique<VersionArgument>(Arg, Attr);
else if (ArgName == "OMPTraitInfoArgument")
Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "OMPTraitInfo *");
else if (ArgName == "VariadicOMPInteropInfoArgument")
Ptr = std::make_unique<VariadicOMPInteropInfoArgument>(Arg, Attr);

if (!Ptr) {
// Search in reverse order so that the most-derived type is handled first.
Expand Down

0 comments on commit 129904d

Please sign in to comment.