[Openmp-commits] [clang] [llvm] [openmp] [CLANG][OpenMP] Restore loop variable values after transformation directives (PR #214717)

Alexey Bataev via Openmp-commits openmp-commits at lists.llvm.org
Tue Oct 13 14:49:56 PDT 2026


================
@@ -18040,16 +18128,29 @@ StmtResult SemaOpenMP::ActOnOpenMPFuseDirective(ArrayRef<OMPClause *> Clauses,
           llvm::append_range(PreInits, TransformPreInit);
       }
 
-      FinalLoops.push_back(SeqAnalysis.Loops[I].TheForStmt);
+      // For out-of-range loop-transformations, emit their finalization inline
+      // right after the transformed loop so that IVs are restored as if the
+      // transformation had not been present (OpenMP 6.0 finalization rule).
+      Stmt *LoopStmt = SeqAnalysis.Loops[I].TheForStmt;
+      if (Stmt *LoopFinals = SeqAnalysis.Loops[I].TransformFinals)
+        LoopStmt = CompoundStmt::Create(Context, {LoopStmt, LoopFinals},
+                                        FPOptionsOverride(), SourceLocation(),
+                                        SourceLocation());
+      FinalLoops.push_back(LoopStmt);
     }
----------------
alexey-bataev wrote:

Rejects valid nested fuse?
```
int main(void) {
  int i, j, k, l;
#pragma omp fuse
  {
#pragma omp fuse looprange(1, 2)
    {
      for (i = 0; i < 10; i++)
        ;
      for (j = 0; j < 15; j++)
        ;
#pragma omp reverse
      for (k = 0; k < 5; k++)
        ;
    }
    for (l = 0; l < 4; l++)
      ;
  }
  return 0;
}

```

https://github.com/llvm/llvm-project/pull/214717


More information about the Openmp-commits mailing list