jdenny added inline comments.

================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:5355
+  Expr *Cond, *Inc;
+  VarDecl *CounterDecl, *LVDecl;
+  if (auto *For = dyn_cast<ForStmt>(AStmt)) {
----------------
jdenny wrote:
> `CounterDecl` is the declaration of the "loop iteration variable" based on 
> the comments now on `OMPCanonicalLoop`, right?  If so, can we update the 
> variable names here?  One possibility is `LIVDecl` and `LUVDecl`.
This is marked done, but I don't see a change or reply for it.


================
Comment at: clang/lib/Sema/TreeTransform.h:8321
+TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
+  // The OMPCanonicalLoop will be recreated when transforming the 
loop-associted
+  // directive.
----------------
Meinersbur wrote:
> jdenny wrote:
> > I'm used to seeing `TransformX` call `RebuildX` call `ActOnX`.  Why not do 
> > that for `X=OMPCanonicalLoop`?  Does `TransformOMPExecutableDirective` 
> > really need a special case for `OMPCanonicalLoop`?
> The intended behaviour is: 
> 
> 1. Transform the child loop
> 2. Return the child loop as representing the OMPCanonicalLoop (i.e. 
> OMPCanonicalLoop wrapper is removed).
> 3. Parent loop-associated directive (e.g. workshare) is processed.
> 4. `ActOnOpenMPCanonicalLoop` adds new OMPCanonicalLoop wrapper for loop nest.
> 
> This guarantees maximum flexibility on what of the loop can be changed, such 
> as
> * Change lower bound, upper bound, step
> * Convert between CXXForRangeStmt and ForStmt
> * Change the associated depth (e.g. different value for `collapse` clause)
> * Remove the directive and no OMPCanonicalLoop remain
> 
> This also saves adding many lines of code handling transforming each member 
> of OMPCanonicalLoop separately.
> The intended behaviour is: 
> 
> 1. Transform the child loop

For  my suggestion, that call would remain within `TransformOMPCanonicalLoop` 
where it is now.

> 2. Return the child loop as representing the OMPCanonicalLoop (i.e. 
> OMPCanonicalLoop wrapper is removed).

For my suggestion, this would not happen.  I think it's normal for a 
`TransformX` to return the transformed `X` not the transformed child of `X`.  
If a caller wants to transform the child, then it should transform the child 
directly instead.

> 3. Parent loop-associated directive (e.g. workshare) is processed.

It looks to me like step 3 is currently within 
`TransformOMPExecutableDirective` and starts before the call to 
`TranformOMPCanonicalLoop` and thus before step 1.  It completes after step 4.  
Or am I misunderstanding what you're describing as step 3?

> 4. `ActOnOpenMPCanonicalLoop` adds new OMPCanonicalLoop wrapper for loop nest.

For my suggestion, this would still happen.  However, instead of step 2: within 
`TransformOMPCanonicalLoop`, you would call `RebuildOMPCanonicalLoop`, which 
would call `ActOnOpenMPCanonicalLoop` as step 4.  The effect is you moved 
`ActOnOpenMPCanonicalLoop` from the caller (`TransformOMPExecutableDirective`) 
to the callee's callee, but the behavior should remain the same.

> This guarantees maximum flexibility on what of the loop can be changed, such 
> as
> * Change lower bound, upper bound, step
> * Convert between CXXForRangeStmt and ForStmt
> * Change the associated depth (e.g. different value for `collapse` clause)
> * Remove the directive and no OMPCanonicalLoop remain

Flexibility for whom?

A class extending `TreeTransform`?  With my suggestion, it can override 
`TransformOMPCanonicalLoop` or `RebuildOMPCanonicalLoop`, depending on how much 
it wants to alter the transformation.

Or a caller of `TransformOMPCanonicalLoop` within `TreeTransform`?  I only see 
one right now, `TransformOMPExecutableDirective`, and I don't see how it needs 
the flexibility.  Are there other callers I missed?

Are you trying to create flexibility without requiring deriving from 
`TreeTransform`?  But, as far as I can tell, you're doing so at the expense of 
normal `TreeTransform` semantics.  Doesn't seem worth it.

If you see a precedent for your approach elsewhere in `TreeTransform`, please 
point it out.

> This also saves adding many lines of code handling transforming each member 
> of OMPCanonicalLoop separately.

Why would you need to?  In the other `TransformX` functions I looked at, the 
arguments to the `RebuildX` function are transformed, and those are typically 
just the arguments to the `ActOnX` function.  In other words, you would just 
transform the loop within your `OMPCanonicalLoop` as you're doing now.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D94973/new/

https://reviews.llvm.org/D94973

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to