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*c8457eb5SMogballstd::unique_ptr<Pass> mlir::createTopologicalSortPass() { 32*c8457eb5SMogball return std::make_unique<TopologicalSortPass>(); 33*c8457eb5SMogball } 34