//===- polly/ScheduleTreeTransform.h ----------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Make changes to isl's schedule tree data structure. // //===----------------------------------------------------------------------===// #ifndef POLLY_SCHEDULETREETRANSFORM_H #define POLLY_SCHEDULETREETRANSFORM_H #include "polly/Support/ISLTools.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/Support/ErrorHandling.h" #include "isl/isl-noexceptions.h" #include <cassert> namespace polly { struct BandAttr; /// This class defines a simple visitor class that may be used for /// various schedule tree analysis purposes. template <typename Derived, typename RetTy = void, typename... Args> struct ScheduleTreeVisitor { … }; /// Recursively visit all nodes of a schedule tree. template <typename Derived, typename RetTy = void, typename... Args> struct RecursiveScheduleTreeVisitor : ScheduleTreeVisitor<Derived, RetTy, Args...> { … }; /// Recursively visit all nodes of a schedule tree while allowing changes. /// /// The visit methods return an isl::schedule_node that is used to continue /// visiting the tree. Structural changes such as returning a different node /// will confuse the visitor. template <typename Derived, typename... Args> struct ScheduleNodeRewriter : public RecursiveScheduleTreeVisitor<Derived, isl::schedule_node, Args...> { … }; /// Is this node the marker for its parent band? bool isBandMark(const isl::schedule_node &Node); /// Extract the BandAttr from a band's wrapping marker. Can also pass the band /// itself and this methods will try to find its wrapping mark. Returns nullptr /// if the band has not BandAttr. BandAttr *getBandAttr(isl::schedule_node MarkOrBand); /// Hoist all domains from extension into the root domain node, such that there /// are no more extension nodes (which isl does not support for some /// operations). This assumes that domains added by to extension nodes do not /// overlap. isl::schedule hoistExtensionNodes(isl::schedule Sched); /// Replace the AST band @p BandToUnroll by a sequence of all its iterations. /// /// The implementation enumerates all points in the partial schedule and creates /// an ISL sequence node for each point. The number of iterations must be a /// constant. isl::schedule applyFullUnroll(isl::schedule_node BandToUnroll); /// Replace the AST band @p BandToUnroll by a partially unrolled equivalent. isl::schedule applyPartialUnroll(isl::schedule_node BandToUnroll, int Factor); /// Loop-distribute the band @p BandToFission as much as possible. isl::schedule applyMaxFission(isl::schedule_node BandToFission); /// Build the desired set of partial tile prefixes. /// /// We build a set of partial tile prefixes, which are prefixes of the vector /// loop that have exactly VectorWidth iterations. /// /// 1. Drop all constraints involving the dimension that represents the /// vector loop. /// 2. Constrain the last dimension to get a set, which has exactly VectorWidth /// iterations. /// 3. Subtract loop domain from it, project out the vector loop dimension and /// get a set that contains prefixes, which do not have exactly VectorWidth /// iterations. /// 4. Project out the vector loop dimension of the set that was build on the /// first step and subtract the set built on the previous step to get the /// desired set of prefixes. /// /// @param ScheduleRange A range of a map, which describes a prefix schedule /// relation. isl::set getPartialTilePrefixes(isl::set ScheduleRange, int VectorWidth); /// Create an isl::union_set, which describes the isolate option based on /// IsolateDomain. /// /// @param IsolateDomain An isl::set whose @p OutDimsNum last dimensions should /// belong to the current band node. /// @param OutDimsNum A number of dimensions that should belong to /// the current band node. isl::union_set getIsolateOptions(isl::set IsolateDomain, unsigned OutDimsNum); /// Create an isl::union_set, which describes the specified option for the /// dimension of the current node. /// /// @param Ctx An isl::ctx, which is used to create the isl::union_set. /// @param Option The name of the option. isl::union_set getDimOptions(isl::ctx Ctx, const char *Option); /// Tile a schedule node. /// /// @param Node The node to tile. /// @param Identifier An name that identifies this kind of tiling and /// that is used to mark the tiled loops in the /// generated AST. /// @param TileSizes A vector of tile sizes that should be used for /// tiling. /// @param DefaultTileSize A default tile size that is used for dimensions /// that are not covered by the TileSizes vector. isl::schedule_node tileNode(isl::schedule_node Node, const char *Identifier, llvm::ArrayRef<int> TileSizes, int DefaultTileSize); /// Tile a schedule node and unroll point loops. /// /// @param Node The node to register tile. /// @param TileSizes A vector of tile sizes that should be used for /// tiling. /// @param DefaultTileSize A default tile size that is used for dimensions isl::schedule_node applyRegisterTiling(isl::schedule_node Node, llvm::ArrayRef<int> TileSizes, int DefaultTileSize); /// Apply greedy fusion. That is, fuse any loop that is possible to be fused /// top-down. /// /// @param Sched Sched tree to fuse all the loops in. /// @param Deps Validity constraints that must be preserved. isl::schedule applyGreedyFusion(isl::schedule Sched, const isl::union_map &Deps); } // namespace polly #endif // POLLY_SCHEDULETREETRANSFORM_H