Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.
/ swift-llvm Public archive

Move the Swift function-merging pass to LLVM #123

Open
wants to merge 1 commit into
base: swift-5.0-branch
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/llvm/InitializePasses.h
Original file line number Diff line number Diff line change
@@ -272,6 +272,7 @@ void initializeMemorySSAPrinterLegacyPassPass(PassRegistry&);
void initializeMemorySSAWrapperPassPass(PassRegistry&);
void initializeMemorySanitizerPass(PassRegistry&);
void initializeMergeFunctionsPass(PassRegistry&);
void initializeMergeSimilarFunctionsPass(PassRegistry &);
void initializeMergeICmpsPass(PassRegistry&);
void initializeMergedLoadStoreMotionLegacyPassPass(PassRegistry&);
void initializeMetaRenamerPass(PassRegistry&);
1 change: 1 addition & 0 deletions include/llvm/LinkAllPasses.h
Original file line number Diff line number Diff line change
@@ -189,6 +189,7 @@ namespace {
(void) llvm::createPostOrderFunctionAttrsLegacyPass();
(void) llvm::createReversePostOrderFunctionAttrsPass();
(void) llvm::createMergeFunctionsPass();
(void)llvm::createMergeSimilarFunctionsPass();
(void) llvm::createMergeICmpsPass();
(void) llvm::createExpandMemCmpPass();
std::string buf;
6 changes: 6 additions & 0 deletions include/llvm/Transforms/IPO.h
Original file line number Diff line number Diff line change
@@ -201,6 +201,12 @@ Pass *createReversePostOrderFunctionAttrsPass();
///
ModulePass *createMergeFunctionsPass();

//===----------------------------------------------------------------------===//
/// createMergeSimilarFunctionsPass - This pass discovers similar functions and
/// collapses them.
///
ModulePass *createMergeSimilarFunctionsPass();

//===----------------------------------------------------------------------===//
/// createHotColdSplittingPass - This pass outlines cold blocks into a separate
/// function(s).
1 change: 1 addition & 0 deletions include/llvm/Transforms/IPO/PassManagerBuilder.h
Original file line number Diff line number Diff line change
@@ -153,6 +153,7 @@ class PassManagerBuilder {
bool VerifyInput;
bool VerifyOutput;
bool MergeFunctions;
bool MergeSimilarFunctions;
bool PrepareForLTO;
bool PrepareForThinLTO;
bool PerformThinLTO;
1 change: 1 addition & 0 deletions lib/Transforms/IPO/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -25,6 +25,7 @@ add_llvm_library(LLVMipo
LoopExtractor.cpp
LowerTypeTests.cpp
MergeFunctions.cpp
MergeSimilarFunctions.cpp
PartialInlining.cpp
PassManagerBuilder.cpp
PruneEH.cpp
1 change: 1 addition & 0 deletions lib/Transforms/IPO/IPO.cpp
Original file line number Diff line number Diff line change
@@ -45,6 +45,7 @@ void llvm::initializeIPO(PassRegistry &Registry) {
initializeSingleLoopExtractorPass(Registry);
initializeLowerTypeTestsPass(Registry);
initializeMergeFunctionsPass(Registry);
initializeMergeSimilarFunctionsPass(Registry);
initializePartialInlinerLegacyPassPass(Registry);
initializePostOrderFunctionAttrsLegacyPassPass(Registry);
initializeReversePostOrderFunctionAttrsLegacyPassPass(Registry);
1,130 changes: 1,130 additions & 0 deletions lib/Transforms/IPO/MergeSimilarFunctions.cpp

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions lib/Transforms/IPO/PassManagerBuilder.cpp
Original file line number Diff line number Diff line change
@@ -170,6 +170,7 @@ PassManagerBuilder::PassManagerBuilder() {
VerifyInput = false;
VerifyOutput = false;
MergeFunctions = false;
MergeSimilarFunctions = false;
PrepareForLTO = false;
EnablePGOInstrGen = RunPGOInstrGen;
PGOInstrGen = PGOOutputFile;
@@ -446,6 +447,9 @@ void PassManagerBuilder::populateModulePassManager(
else if (GlobalExtensionsNotEmpty() || !Extensions.empty())
MPM.add(createBarrierNoopPass());

if (MergeSimilarFunctions)
MPM.add(createMergeSimilarFunctionsPass());

if (PerformThinLTO) {
// Drop available_externally and unreferenced globals. This is necessary
// with ThinLTO in order to avoid leaving undefined references to dead
@@ -713,6 +717,9 @@ void PassManagerBuilder::populateModulePassManager(
if (MergeFunctions)
MPM.add(createMergeFunctionsPass());

if (MergeSimilarFunctions)
MPM.add(createMergeSimilarFunctionsPass());

// LoopSink pass sinks instructions hoisted by LICM, which serves as a
// canonicalization pass that enables other optimizations. As a result,
// LoopSink pass needs to be a very late IR pass to avoid undoing LICM
@@ -905,6 +912,9 @@ void PassManagerBuilder::addLateLTOOptimizationPasses(
// currently it damages debug info.
if (MergeFunctions)
PM.add(createMergeFunctionsPass());

if (MergeSimilarFunctions)
PM.add(createMergeSimilarFunctionsPass());
}

void PassManagerBuilder::populateThinLTOPassManager(
504 changes: 504 additions & 0 deletions test/Transforms/MergeFunc/merge_similar_func.ll

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions test/Transforms/MergeFunc/merge_similar_func_coff.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
; RUN: opt -S -mtriple i686-windows -merge-similar-functions -mergesimfunc-threshold=4 %s | FileCheck %s

@g = external global i32

define dllexport i32 @f(i32 %x, i32 %y) {
%sum = add i32 %x, %y
%sum2 = add i32 %sum, %y
%l = load i32, i32* @g, align 4
%sum3 = add i32 %sum2, %y
ret i32 %sum3
}

define dllexport i32 @h(i32 %x, i32 %y) {
%sum = add i32 %x, %y
%sum2 = add i32 %sum, %y
%l = load i32, i32* @g, align 4
%sum3 = add i32 %sum2, %y
ret i32 %sum3
}

; CHECK-NOT: define internal dllexport i32 @fTm(i32, i32)
; CHECK-LABEL: define internal i32 @fTm(i32, i32)