[PATCH] D106165: [flang][OpenMP] Add semantic check for target nesting
Peixin Qiao via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 30 20:18:30 PDT 2021
peixin added a comment.
@kiranchandramohan Thanks for the review.
================
Comment at: flang/lib/Semantics/check-omp-structure.cpp:481
+ // 2.12.5 Target Construct Restriction
+ bool eligibleTarget{true};
+ llvm::omp::Directive directive;
----------------
kiranchandramohan wrote:
> Nit:Would eligibleTargetDir be better?
elibleTargetDir does not match its intention. Would ineligibleTargetDir be better?
================
Comment at: flang/lib/Semantics/check-omp-structure.cpp:291
}
+ if (GetTARGETNest() > 0) {
+ CheckTARGETNest(x);
----------------
kiranchandramohan wrote:
> peixin wrote:
> > kiranchandramohan wrote:
> > > peixin wrote:
> > > > clementval wrote:
> > > > > It would be better to have a generic `IsNestedIn` function where you can pass the directive you want to check for. We don't want to have a counter for each construct.
> > > > I am thinking about if we can replace this for loop search with the counter marked for `target` nesting since the for loop is executed for each openmp construct check, which is not efficient. With the design in https://reviews.llvm.org/D106335, I only need add one more element in the enum definition of `directiveNestType`. What do you think?
> > > That sounds good to me.
> > >
> > > I think ideally, you can do the following.
> > > On visiting a target_data, target_update, target_enter_data or target_exit_data directive check if it is nested in a target region using GetDirectiveNest and report a warning if it is nested.
> > Thanks for the suggestion. Fixed now.
> I was suggesting something like the following to avoid double traversal of OpenMPBlockConstruct. We would be visiting these nodes anyway during regular traversal.
> Have you considered this? Feel free to dissent.
> ```
> void OmpStructureChecker::Enter(const parser::OpenMPBlockConstruct &x) {
> const auto &beginBlockDir{std::get<parser::OmpBeginBlockDirective>(c.t)};
> const auto &beginDir{std::get<parser::OmpBlockDirective>(beginBlockDir.t)};
> if (GetDirectiveNest(TargetNest) > 0) {
> if (beginDir.v == llvm::omp::Directive::OMPD_target_data) {
> //print warning
> }
> }
> ```
Actually, my first implementation is like what you suggest. Arnamoy suggests the current implementation and I argee with him. Merging the semantic checks for `target_data` and other three directives in one function seems easier to read and understand. In addition, implementing the semantic check of the four directives nested inside `target` in one fuction seems more reasonable since they are in one restriction. This is one time-readability tradeoff. I think the double traversal does not take too much time. What do you think?
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D106165/new/
https://reviews.llvm.org/D106165
More information about the llvm-commits
mailing list