Skip to content

Commit d018ee2

Browse files
authored
Merge pull request rust-lang#268 from jrolli/merge-functions-pass
Add passthru for 'MergeFunctionsPass'
2 parents 995152f + 7f77618 commit d018ee2

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

src/passes.rs

+10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use llvm_sys::core::{LLVMDisposePassManager, LLVMInitializeFunctionPassManager,
22
use llvm_sys::initialization::{LLVMInitializeCore, LLVMInitializeTransformUtils, LLVMInitializeScalarOpts, LLVMInitializeObjCARCOpts, LLVMInitializeVectorization, LLVMInitializeInstCombine, LLVMInitializeIPO, LLVMInitializeInstrumentation, LLVMInitializeAnalysis, LLVMInitializeIPA, LLVMInitializeCodeGen, LLVMInitializeTarget};
33
use llvm_sys::prelude::{LLVMPassManagerRef, LLVMPassRegistryRef};
44
use llvm_sys::transforms::ipo::{LLVMAddArgumentPromotionPass, LLVMAddConstantMergePass, LLVMAddDeadArgEliminationPass, LLVMAddFunctionAttrsPass, LLVMAddFunctionInliningPass, LLVMAddAlwaysInlinerPass, LLVMAddGlobalDCEPass, LLVMAddGlobalOptimizerPass, LLVMAddIPSCCPPass, LLVMAddInternalizePass, LLVMAddStripDeadPrototypesPass, LLVMAddPruneEHPass, LLVMAddStripSymbolsPass};
5+
#[llvm_versions(10.0..=latest)]
6+
use llvm_sys::transforms::ipo::LLVMAddMergeFunctionsPass;
57
use llvm_sys::transforms::pass_manager_builder::{LLVMPassManagerBuilderRef, LLVMPassManagerBuilderCreate, LLVMPassManagerBuilderDispose, LLVMPassManagerBuilderSetOptLevel, LLVMPassManagerBuilderSetSizeLevel, LLVMPassManagerBuilderSetDisableUnitAtATime, LLVMPassManagerBuilderSetDisableUnrollLoops, LLVMPassManagerBuilderSetDisableSimplifyLibCalls, LLVMPassManagerBuilderUseInlinerWithThreshold, LLVMPassManagerBuilderPopulateFunctionPassManager, LLVMPassManagerBuilderPopulateModulePassManager, LLVMPassManagerBuilderPopulateLTOPassManager};
68
use llvm_sys::transforms::scalar::{LLVMAddAggressiveDCEPass, LLVMAddMemCpyOptPass, LLVMAddAlignmentFromAssumptionsPass, LLVMAddCFGSimplificationPass, LLVMAddDeadStoreEliminationPass, LLVMAddScalarizerPass, LLVMAddMergedLoadStoreMotionPass, LLVMAddGVNPass, LLVMAddIndVarSimplifyPass, LLVMAddInstructionCombiningPass, LLVMAddJumpThreadingPass, LLVMAddLICMPass, LLVMAddLoopDeletionPass, LLVMAddLoopIdiomPass, LLVMAddLoopRotatePass, LLVMAddLoopRerollPass, LLVMAddLoopUnrollPass, LLVMAddLoopUnswitchPass, LLVMAddPartiallyInlineLibCallsPass, LLVMAddSCCPPass, LLVMAddScalarReplAggregatesPass, LLVMAddScalarReplAggregatesPassSSA, LLVMAddScalarReplAggregatesPassWithThreshold, LLVMAddSimplifyLibCallsPass, LLVMAddTailCallEliminationPass, LLVMAddDemoteMemoryToRegisterPass, LLVMAddVerifierPass, LLVMAddCorrelatedValuePropagationPass, LLVMAddEarlyCSEPass, LLVMAddLowerExpectIntrinsicPass, LLVMAddTypeBasedAliasAnalysisPass, LLVMAddScopedNoAliasAAPass, LLVMAddBasicAliasAnalysisPass, LLVMAddReassociatePass};
79
#[llvm_versions(3.7..=latest)]
@@ -304,6 +306,14 @@ impl<T: PassManagerSubType> PassManager<T> {
304306
}
305307
}
306308

309+
/// Discovers identical functions and collapses them.
310+
#[llvm_versions(10.0..=latest)]
311+
pub fn add_merge_functions_pass(&self) {
312+
unsafe {
313+
LLVMAddMergeFunctionsPass(self.pass_manager)
314+
}
315+
}
316+
307317
/// This pass deletes dead arguments from internal functions. Dead argument
308318
/// elimination removes arguments which are directly dead, as well as arguments
309319
/// only passed into function calls as dead arguments of other functions. This

tests/all/test_passes.rs

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ fn test_init_all_passes_for_module() {
1212

1313
pass_manager.add_argument_promotion_pass();
1414
pass_manager.add_constant_merge_pass();
15+
#[cfg(not(any(feature = "llvm3-6", feature = "llvm3-7", feature = "llvm3-8", feature = "llvm3-9",
16+
feature = "llvm4-0", feature = "llvm5-0", feature = "llvm6-0", feature = "llvm7-0",
17+
feature = "llvm8-0", feature = "llvm9-0")))]
18+
pass_manager.add_merge_functions_pass();
1519
pass_manager.add_dead_arg_elimination_pass();
1620
pass_manager.add_function_attrs_pass();
1721
pass_manager.add_function_inlining_pass();

0 commit comments

Comments
 (0)