ABataev marked an inline comment as done.
ABataev added inline comments.

================
Comment at: clang/lib/CodeGen/CGStmtOpenMP.cpp:3627
+      emitScanBasedDirective(CGF, S, NumIteratorsGen, FirstGen, SecondGen);
+    } else {
+      OMPCancelStackRAII CancelRegion(CGF, OMPD_parallel_for, S.hasCancel());
----------------
jdoerfert wrote:
> ABataev wrote:
> > jdoerfert wrote:
> > > This looks pretty much like D81658, right? Could we avoid the duplication 
> > > and maybe use a templated function (or something else)?
> > The duplication is quite small. Here we don't need to check for 
> > lastprivates update, we need to check for the cancellation region. I don't 
> > think that the outlined functions are going to be much simpler and easier 
> > to read.
> I mean, these ~25 lines will exist 3 times at least. 2 times tacking 
> lastprivate, which we can do for the third time at no extra cost, and 2 times 
> with the cancelation RAII. Any change will need to be duplicated 3 times as 
> well, etc.
> 
> If we do
> ```
> template<typename RAII>
> void emitWorksharingHelper(..., bool &HasLastprivate)
>     if (llvm::any_of(S.getClausesOfKind<OMPReductionClause>(),
>                      [](const OMPReductionClause *C) {
>                        return C->getModifier() == OMPC_REDUCTION_inscan;
>                      })) {
>       const auto &&NumIteratorsGen = [&S](CodeGenFunction &CGF) {
>         OMPLocalDeclMapRAII Scope(CGF);
>         OMPLoopScope LoopScope(CGF, S);
>         return CGF.EmitScalarExpr(S.getNumIterations());
>       };
>       const auto &&FirstGen = [&S](CodeGenFunction &CGF) {
>         RAII CancelRegion(CGF, OMPD_for, S.hasCancel());
>         (void)CGF.EmitOMPWorksharingLoop(S, S.getEnsureUpperBound(),
>                                          emitForLoopBounds,
>                                          emitDispatchForLoopBounds);
>         // Emit an implicit barrier at the end.
>         CGF.CGM.getOpenMPRuntime().emitBarrierCall(CGF, S.getBeginLoc(),
>                                                    OMPD_for);
>       };
>       const auto &&SecondGen = [&S, &HasLastprivate](CodeGenFunction &CGF) {
>         RAII CancelRegion(CGF, OMPD_for, S.hasCancel());
>         HasLastprivate = CGF.EmitOMPWorksharingLoop(S, 
> S.getEnsureUpperBound(),
>                                          emitForLoopBounds,
>                                          emitDispatchForLoopBounds);
>       };
>       emitScanBasedDirective(CGF, S, NumIteratorsGen, FirstGen, SecondGen);
>     } else {
>       OMPCancelStackRAII CancelRegion(CGF, OMPD_parallel_for, S.hasCancel());
>         CGF.EmitOMPWorksharingLoop(S, S.getEnsureUpperBound(), 
> emitForLoopBounds,
>                                    emitDispatchForLoopBounds);
>     }
> ```
> We can call it three times:
> ```
> emitWorksharingHelper<OMPCancelStackRAII>(...);
> emitWorksharingHelper<OMPCancelStackRAII>(...);
> emitWorksharingHelper<OMPDummyRAII>(...);
> ```
> 
> Wouldn't that be cleaner?
1. It requires the new `OMPDummyRAII` class.
2. Thу functionality under control of the `else` branch also must be affected.
3. We don't always need to check for `HasLastprivate`.
4. The `NumIteratorsGen` might be different.
5. We'll have a lot of trouble with adding new functionality to this function, 
especially if this functionality is unique for one construct and not required 
for others.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D81478



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

Reply via email to