xref: /freebsd/contrib/llvm-project/llvm/lib/Analysis/CFGSCCPrinter.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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 Andric PreservedAnalyses 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