Files
swift-mirror/lib/SILPasses/IVInfoPrinter.cpp
Mark Lacey 021983017a Add a SIL SCC visitor and an induction variable analysis.
The induction variable analysis derives from the SCC visitor CRTP-style
and uses it to drive analysis to find the IVs of a function.

The current definition of induction variable is very weak, but enough to
use for very basic bounds-check elimination.

This is not quite ready for real use. There is an assert that I've
commented out that is firing but should not be, and that will require
some more investigation.

Swift SVN r19845
2014-07-11 02:48:03 +00:00

78 lines
2.0 KiB
C++

//===------------ 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<IVAnalysis>();
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();
}