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

Reply via email to