1*bdd1243dSDimitry Andric //===- CFGSCCPrinter.cpp --------------------------------------------------===// 2*bdd1243dSDimitry Andric // 3*bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*bdd1243dSDimitry Andric // 7*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8*bdd1243dSDimitry Andric 9*bdd1243dSDimitry Andric #include "llvm/Analysis/CFGSCCPrinter.h" 10*bdd1243dSDimitry Andric #include "llvm/ADT/SCCIterator.h" 11*bdd1243dSDimitry Andric #include "llvm/IR/CFG.h" 12*bdd1243dSDimitry Andric 13*bdd1243dSDimitry Andric using namespace llvm; 14*bdd1243dSDimitry Andric run(Function & F,FunctionAnalysisManager & AM)15*bdd1243dSDimitry AndricPreservedAnalyses CFGSCCPrinterPass::run(Function &F, 16*bdd1243dSDimitry Andric FunctionAnalysisManager &AM) { 17*bdd1243dSDimitry Andric unsigned SccNum = 0; 18*bdd1243dSDimitry Andric OS << "SCCs for Function " << F.getName() << " in PostOrder:"; 19*bdd1243dSDimitry Andric for (scc_iterator<Function *> SCCI = scc_begin(&F); !SCCI.isAtEnd(); ++SCCI) { 20*bdd1243dSDimitry Andric const std::vector<BasicBlock *> &NextSCC = *SCCI; 21*bdd1243dSDimitry Andric OS << "\nSCC #" << ++SccNum << ": "; 22*bdd1243dSDimitry Andric bool First = true; 23*bdd1243dSDimitry Andric for (BasicBlock *BB : NextSCC) { 24*bdd1243dSDimitry Andric if (First) 25*bdd1243dSDimitry Andric First = false; 26*bdd1243dSDimitry Andric else 27*bdd1243dSDimitry Andric OS << ", "; 28*bdd1243dSDimitry Andric BB->printAsOperand(OS, false); 29*bdd1243dSDimitry Andric } 30*bdd1243dSDimitry Andric if (NextSCC.size() == 1 && SCCI.hasCycle()) 31*bdd1243dSDimitry Andric OS << " (Has self-loop)."; 32*bdd1243dSDimitry Andric } 33*bdd1243dSDimitry Andric OS << "\n"; 34*bdd1243dSDimitry Andric 35*bdd1243dSDimitry Andric return PreservedAnalyses::all(); 36*bdd1243dSDimitry Andric } 37