Files
swift-mirror/lib/SILOptimizer/UtilityPasses/FunctionOrderPrinter.cpp
Meghana Gupta fd98ce10c7 Update PassManager's function worklist for newly added SILFunctions
The PassManager should transform all functions in bottom up order.
This is necessary because when optimizations like inlining looks at the
callee function bodies to compute profitability, the callee functions
should have already undergone optimizations to get better profitability
estimates.

The PassManager builds its function worklist based on bottom up order
on initialization. However, newly created SILFunctions due to
specialization etc, are simply appended to the function worklist. This
can cause us to make bad inlining decisions due to inaccurate
profitability estimates. This change now updates the function worklist such
that, all the callees of the newly added SILFunction are proccessed
before it by the PassManager.

Fixes rdar://52202680
2020-05-11 19:43:22 -07:00

67 lines
2.0 KiB
C++

//===--- FunctionOrderPrinter.cpp - Function ordering test pass -----------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This pass prints a bottom-up ordering of functions in the module (in the
// sense that each function is printed before functions that call it).
//
//===----------------------------------------------------------------------===//
#include "swift/SILOptimizer/Analysis/FunctionOrder.h"
#include "swift/Demangling/Demangle.h"
#include "swift/SILOptimizer/Analysis/BasicCalleeAnalysis.h"
#include "swift/SIL/SILFunction.h"
#include "swift/SIL/SILModule.h"
#include "swift/SILOptimizer/PassManager/Transforms.h"
#include "llvm/Support/raw_ostream.h"
using namespace swift;
#define DEBUG_TYPE "function-order-printer"
namespace {
class FunctionOrderPrinterPass : public SILModuleTransform {
BasicCalleeAnalysis *BCA;
/// The entry point to the transformation.
void run() override {
BCA = getAnalysis<BasicCalleeAnalysis>();
BottomUpFunctionOrder Orderer(BCA);
Orderer.computeBottomUpOrder(getModule());
llvm::outs() << "Bottom up function order:\n";
auto SCCs = Orderer.getSCCs();
for (auto &SCC : SCCs) {
std::string Indent;
if (SCC.size() != 1) {
llvm::outs() << "Non-trivial SCC:\n";
Indent = std::string(2, ' ');
}
for (auto *F : SCC) {
llvm::outs() << Indent
<< Demangle::demangleSymbolAsString(F->getName())
<< "\n";
}
}
llvm::outs() << "\n";
}
};
} // end anonymous namespace
SILTransform *swift::createFunctionOrderPrinter() {
return new FunctionOrderPrinterPass();
}