https://github.com/alexey-bataev commented:
```
@@ analyzeLoopSequence, SemaOpenMP.cpp:15600
- unsigned FirstGenerated = SeqAnalysis.Loops.size();
if (!analyzeLoopSequence(TransformedStmt, SeqAnalysis, Context, Kind,
/*IsGeneratedSequence=*/true))
return false;
- // ... fused loop for fuse, otherwise the last generated loop.
- if (Stmt *Finals = LoopTransform->getFinals()) {
- const auto *Fuse =
dyn_cast<OMPFuseDirective>(LoopTransform->getDirective());
- unsigned Idx = Fuse ? Fuse->getFusedLoopIdx() :
NumGeneratedTopLevelLoops - 1;
- assert(FirstGenerated + Idx < SeqAnalysis.Loops.size() && ...);
- SeqAnalysis.Loops[FirstGenerated + Idx].TransformFinals = Finals;
- }
+ // Finals follow the last generated loop; a looprange fuse inlines its
own.
+ if (Stmt *Finals = LoopTransform->getFinals()) {
+ assert(!SeqAnalysis.Loops.back().TransformFinals &&
+ "Generated loop already has Finals");
+ SeqAnalysis.Loops.back().TransformFinals = Finals;
+ }
return true;
@@ ActOnOpenMPFuseDirective, SemaOpenMP.cpp:18303
+ auto WithFinals = [&](Stmt *Loop, Stmt *Finals) -> Stmt * {
+ return Finals ? CompoundStmt::Create(Context, {Loop, Finals},
+ FPOptionsOverride(), SourceLocation(),
+ SourceLocation())
+ : Loop;
+ };
Stmt *FusionStmt = FusedForStmt;
- unsigned FusedLoopIdx = 0;
if (LRC && CountVal != SeqAnalysis.LoopSeqSize) {
...
- Stmt *LoopStmt = SeqAnalysis.Loops[I].TheForStmt;
- if (Stmt *LoopFinals = SeqAnalysis.Loops[I].TransformFinals)
- LoopStmt = CompoundStmt::Create(...);
- FinalLoops.push_back(LoopStmt);
+ FinalLoops.push_back(WithFinals(SeqAnalysis.Loops[I].TheForStmt,
+ SeqAnalysis.Loops[I].TransformFinals));
}
- FusedLoopIdx = FirstVal - 1;
- FinalLoops.insert(FinalLoops.begin() + FusedLoopIdx, FusedForStmt);
+ FinalLoops.insert(FinalLoops.begin() + (FirstVal - 1),
+ WithFinals(FusedForStmt, CombinedFinals));
+ CombinedFinals = nullptr; // emitted inline
FusionStmt = CompoundStmt::Create(...);
}
return OMPFuseDirective::Create(..., buildPreInits(Context, PreInits),
- CombinedFinals, FusedLoopIdx);
+ CombinedFinals);
@@ EmitOMPFuseDirective, CGStmtOpenMP.cpp:3485
- const Stmt *Transformed = S.getTransformedStmt();
- const Stmt *Finals = S.getFinals();
- ... (looprange enumerate loop, lines 3492-3503)
- EmitStmt(Transformed);
- if (Finals)
- EmitStmt(Finals);
+ EmitStmt(S.getTransformedStmt());
+ if (Stmt *Finals = S.getFinals())
+ EmitStmt(Finals);
```
since the patch already wraps out-of-range loops as {Loop; Finals} and
recognises that shape in analyzeLoopSequence
https://github.com/llvm/llvm-project/pull/214717
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits