================
@@ -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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits