mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
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
67 lines
2.0 KiB
C++
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();
|
|
}
|