//===------------ IVInfoPrinter.cpp - Print SIL IV Info -*- C++ -*-------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #include "swift/SILAnalysis/IVAnalysis.h" #include "swift/SILPasses/Passes.h" #include "swift/SILPasses/Transforms.h" using namespace swift; namespace { class IVInfoPrinter : public SILFunctionTransform { StringRef getName() override { return "SIL IV Information Printer"; } void dumpIV(ValueBase *Header, ValueBase *IV) { if (IV == Header) { llvm::errs() << "IV Header: "; IV->dump(); return; } llvm::errs() << "IV: "; IV->dump(); llvm::errs() << "with header: "; Header->dump(); } /// The entry point to the transformation. void run() override { auto *IV = PM->getAnalysis(); auto *F = getFunction(); auto &Info = IV->getIVInfo(F); bool FoundIV = false; for (auto &BB : *F) { for (auto A : BB.getBBArgs()) if (Info.isInductionVariable(A)) { if (!FoundIV) llvm::errs() << "Induction variables for function: " << F->getName() << "\n"; FoundIV = true; dumpIV(Info.getInductionVariableHeader(A), A); } for (auto &I : BB) if (Info.isInductionVariable(&I)) { if (!FoundIV) llvm::errs() << "Induction variables for function: " << F->getName() << "\n"; FoundIV = true; dumpIV(Info.getInductionVariableHeader(&I), &I); } } if (FoundIV) llvm::errs() << "\n"; } }; } // end anonymous namespace SILTransform *swift::createIVInfoPrinter() { return new IVInfoPrinter(); }