[Openmp-commits] [PATCH] D91980: [OpenMP] Add initial support for `omp [begin/end] assumes`
Alexey Bataev via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Wed Nov 25 14:29:12 PST 2020
ABataev added inline comments.
================
Comment at: clang/lib/Parse/ParseOpenMP.cpp:1569-1593
+ int idx = -1;
+ if (Tok.isAnyIdentifier()) {
+ II = Tok.getIdentifierInfo();
+ llvm::StringSwitch<int> SS(II->getName());
+ for (const AssumptionClauseMappingInfo &ACMI : AssumptionClauseMappings) {
+ if (ACMI.StartsWith)
+ SS.StartsWith(ACMI.Identifier, ++idx);
----------------
jdoerfert wrote:
> ABataev wrote:
> > jdoerfert wrote:
> > > ABataev wrote:
> > > > ABataev wrote:
> > > > > `Idx`
> > > > Better to outline it into function/lambda
> > > Which part? Assuming you mean the 9 line conditional above, I'm not convinced. Even if I do outline it, 4 lines will have to stay here and I don't see any reuse.
> > The part that searches over the table.
> > The part that searches over the table.
>
> I don't follow. Where is a search? The part that builds a string switch? line 1569 - 1579?
Yes.
================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:3218
+ DeclContext *DC = DeclContexts.pop_back_val();
+ for (auto *SubDC : DC->decls()) {
+ if (auto *CTD = dyn_cast<ClassTemplateDecl>(SubDC)) {
----------------
I would also add a check that the decl is valid here before checking it and applying the attributes.
================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:3225
+ }
+ if (isa<CXXRecordDecl>(SubDC) || isa<NamespaceDecl>(SubDC)) {
+ DeclContexts.push_back(cast<DeclContext>(SubDC));
----------------
```
if (auto *SubCtx = dyn_cast<DeclContext>(SubDC)) {
DeclContexts.push_back(cast<DeclContext>(SubCtx));
continue;
}
```
?
================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:3210
+
+ SmallVector<DeclContext *, 8> DeclContexts;
+ DeclContexts.push_back(CurContext);
----------------
jdoerfert wrote:
> ABataev wrote:
> > jdoerfert wrote:
> > > ABataev wrote:
> > > > What are you trying to do here? Scan all the decls in the current context and mark all the functions with the assumption attributes?
> > > Pretty much, yeah. Find all function declarations and add the attribute. I'll add a comment.
> > Does it mean that for this code
> > ```
> > void foo();
> > #pragma omp assume ...
> > void bar();
> > #pragma omp end assume
> > ```
> > `foo()` must have the same assumptions like `bar()`? It looks to me, currently we'll end up with the same attributes for both functions. But I'm not sure that this is correct to mark the function outside of the `assumes` region with the same attributes just like the function inside.
> Your example mixes the global `omp assumes` with the scoped `begin/end omp assumes`. The former has the effect to be added to prior declarations, the latter does not have this effect. This is how it is supposed to work:
> ```
> void foo(); // no assumption
> #pragma omp begin assumes ext_XYZ
> void bar(); // XYZ assumption
> #pragma omp end assumes
> ```
> ```
> void foo(); // XYZ assumption
> #pragma omp assumes ext_XYZ
> void bar(); // XYZ assumption
> ```
>
>
>
Ah, I see. `omp assumes` looks weird. :( It may lead to conflicts
PS. What about lambdas? Could add a test that lambdas get annotations too?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D91980/new/
https://reviews.llvm.org/D91980
More information about the Openmp-commits
mailing list