================
@@ -955,31 +960,69 @@ class OMPLoopBasedDirective : public 
OMPExecutableDirective {
   }
 };
 
-/// The base class for all loop transformation directives.
-class OMPLoopTransformationDirective : public OMPLoopBasedDirective {
+/// Common class of data shared between
+/// OMPCanonicalLoopNestTransformationDirective and
+/// OMPCanonicalLoopSequenceTransformationDirective
+class OMPLoopTransformationDirective {
   friend class ASTStmtReader;
 
-  /// Number of loops generated by this loop transformation.
-  unsigned NumGeneratedLoops = 0;
+  /// Number of (top-level) generated loops.
+  /// This value is 1 for most transformations as they only map one loop nest
+  /// into another.
+  /// Some loop transformations (like a non-partial 'unroll') may not generate
+  /// a loop nest, so this would be 0.
+  /// Some loop transformations (like 'fuse' with looprange and 'split') may
+  /// generate more than one loop nest, so the value would be >= 1.
+  unsigned NumGeneratedLoops = 1;
+
+  /// We need this because we cannot easily make OMPLoopTransformationDirective
+  /// a proper Stmt.
+  Stmt *S;
 
 protected:
-  explicit OMPLoopTransformationDirective(StmtClass SC,
-                                          OpenMPDirectiveKind Kind,
-                                          SourceLocation StartLoc,
-                                          SourceLocation EndLoc,
-                                          unsigned NumAssociatedLoops)
-      : OMPLoopBasedDirective(SC, Kind, StartLoc, EndLoc, NumAssociatedLoops) 
{}
+  void setNumGeneratedLoops(unsigned N) { NumGeneratedLoops = N; }
 
-  /// Set the number of loops generated by this loop transformation.
-  void setNumGeneratedLoops(unsigned Num) { NumGeneratedLoops = Num; }
+  explicit OMPLoopTransformationDirective(Stmt *S) : S(S) {}
+
+public:
+  unsigned getNumGeneratedLoops() const { return NumGeneratedLoops; }
+
+  /// Returns the specific directive related to this loop transformation.
+  Stmt *getDirective() const { return S; }
+
+  /// Get the de-sugared statements after the loop transformation.
+  ///
+  /// Might be nullptr if either the directive generates no loops and is 
handled
+  /// directly in CodeGen, or resolving a template-dependence context is
+  /// required.
+  Stmt *getTransformedStmt() const;
+
+  /// Return preinits statement.
+  Stmt *getPreInits() const;
+
+  static bool classof(const Stmt *T) {
+    return isa<OMPCanonicalLoopNestTransformationDirective>(T) ||
+           isa<OMPCanonicalLoopSequenceTransformationDirective>(T);
----------------
alexey-bataev wrote:

```suggestion
    return isa<OMPCanonicalLoopNestTransformationDirective, 
OMPCanonicalLoopSequenceTransformationDirective>(T);
```

https://github.com/llvm/llvm-project/pull/139293
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to