1*c8457eb5SMogball //===- TopologicalSort.cpp - Topological sort pass ------------------------===//
2*c8457eb5SMogball //
3*c8457eb5SMogball // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*c8457eb5SMogball // See https://llvm.org/LICENSE.txt for license information.
5*c8457eb5SMogball // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*c8457eb5SMogball //
7*c8457eb5SMogball //===----------------------------------------------------------------------===//
8*c8457eb5SMogball 
9*c8457eb5SMogball #include "PassDetail.h"
10*c8457eb5SMogball #include "mlir/IR/RegionKindInterface.h"
11*c8457eb5SMogball #include "mlir/Transforms/TopologicalSortUtils.h"
12*c8457eb5SMogball 
13*c8457eb5SMogball using namespace mlir;
14*c8457eb5SMogball 
15*c8457eb5SMogball namespace {
16*c8457eb5SMogball struct TopologicalSortPass : public TopologicalSortBase<TopologicalSortPass> {
runOnOperation__anonb4aac55c0111::TopologicalSortPass17*c8457eb5SMogball   void runOnOperation() override {
18*c8457eb5SMogball     // Topologically sort the regions of the operation without SSA dominance.
19*c8457eb5SMogball     getOperation()->walk([](RegionKindInterface op) {
20*c8457eb5SMogball       for (auto &it : llvm::enumerate(op->getRegions())) {
21*c8457eb5SMogball         if (op.hasSSADominance(it.index()))
22*c8457eb5SMogball           continue;
23*c8457eb5SMogball         for (Block &block : it.value())
24*c8457eb5SMogball           sortTopologically(&block);
25*c8457eb5SMogball       }
26*c8457eb5SMogball     });
27*c8457eb5SMogball   }
28*c8457eb5SMogball };
29*c8457eb5SMogball } // end anonymous namespace
30*c8457eb5SMogball 
createTopologicalSortPass()31*c8457eb5SMogball std::unique_ptr<Pass> mlir::createTopologicalSortPass() {
32*c8457eb5SMogball   return std::make_unique<TopologicalSortPass>();
33*c8457eb5SMogball }
34