jdoerfert added a comment.

In D70258#1788825 <https://reviews.llvm.org/D70258#1788825>, @rjmccall wrote:

> So it's never that OpenMP has things that need to be finalized before exiting 
> (e.g. if something in frontend-emitted code throws an exception), it's just 
> that OpenMP might need to generate its own control flow that breaks through 
> arbitrary scopes in the frontend?


Depending on how you look at it. OpenMP has to finalize some constructs, which 
usually means to place a call before we continue with the code that follows. It 
also introduce a new scope in which things like privatization happen, however 
these are almost completely handled through clang (see below). The one thing 
that comes to mind is `lastprivate` which is handled by OpenMP.

Btw. Exceptions have to be caught inside an OpenMP scope that has a finalizer 
as it would be UB otherwise (as with the `return`).

> I would really hope that the OpenMP implementation in Clang would've used 
> Clang's cleanup stack rather than inventing its own mechanism.

This patch uses (parts of) clangs cleanup logic and the existing CGOpenMP 
cleanup code (which is the existing OpenMP specific stack 
(`CodeGenFunction::OMPCancelStack`) this one will replace).

---

In the code that glues the old CGOpenMP to the new OMPBuilder, where we create 
the finalization callback, the existing `getOMPCancelDestination` is used as 
shown below.

  CodeGenFunction::JumpDest Dest = CGF.getOMPCancelDestination(OMPD_parallel);
  CGF.EmitBranchThroughCleanup(Dest);

In the follow up patch (D70290 <https://reviews.llvm.org/D70290>) that will 
lower `#pragma omp parallel` through the OMPIRBuilder, we don't need the 
`clang::CodeGenFunction::OMPCancelDestination`/`clang::CodeGenFunction::OMPCancelStack`
 stuff anymore (for the parallel) and the finalization callback becomes:

  CodeGenFunction::JumpDest Dest = getJumpDestInCurrentScope(DestBB);
  EmitBranchThroughCleanup(Dest);

With `DestBB` defined as the end of the OpenMP region/scope.

---

The additional stack is also needed because depending on the nesting we may or 
may not create control flow that can jump to the end of a scope. So

  #pragma omp parallel
  {
    {
      ... ;
      #pragma omp barrier // or an implicit barrier
      ... ;
    }
    parallel_exit:
  }

will cause a control flow edge from the barrier to `parallel_exit`. This edge 
may not exist if there is another OpenMP region nested in the parallel.

---

In D70258#1788854 <https://reviews.llvm.org/D70258#1788854>, @ABataev wrote:

> In D70258#1788825 <https://reviews.llvm.org/D70258#1788825>, @rjmccall wrote:
>
> > I would really hope that the OpenMP implementation in Clang would've used 
> > Clang's cleanup stack rather than inventing its own mechanism.
>
>
> John, current implementation completely relies on Clang's cleanup stack.


Let me rephrase the above statement less misleading:
The current implementation relies on Clang's cleanup stack *and* the OpenMP 
specific `clang::CodeGenFunction::OMPCancelStack`, which is what this patch 
will eventually replace.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70258



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

Reply via email to