[K/N] Make -Xprofile-phases print profile of LLVM passes

This commit is contained in:
Sergey Bogolepov
2023-02-09 17:01:12 +02:00
committed by Space Cloud
parent 637258e175
commit f86d28449f
2 changed files with 17 additions and 2 deletions
@@ -37,6 +37,7 @@ data class LlvmPipelineConfig(
val makeDeclarationsHidden: Boolean,
val objCPasses: Boolean,
val inlineThreshold: Int?,
val timePasses: Boolean = false,
)
private fun getCpuModel(context: PhaseContext): String {
@@ -100,7 +101,8 @@ internal fun createLTOPipelineConfigForRuntime(generationState: NativeGeneration
internal fun createLTOFinalPipelineConfig(
context: PhaseContext,
targetTriple: String,
closedWorld: Boolean
closedWorld: Boolean,
timePasses: Boolean = false,
): LlvmPipelineConfig {
val config = context.config
val target = config.target
@@ -161,6 +163,7 @@ internal fun createLTOFinalPipelineConfig(
makeDeclarationsHidden,
objcPasses,
inlineThreshold,
timePasses = timePasses,
)
}
@@ -206,6 +209,9 @@ abstract class LlvmOptimizationPipeline(
LLVMKotlinAddTargetLibraryInfoWrapperPass(passManager, config.targetTriple)
// TargetTransformInfo pass.
LLVMAddAnalysisPasses(targetMachine, passManager)
if (config.timePasses) {
LLVMSetTimePasses(1)
}
configurePipeline(config, passManager, passBuilder)
executeCustomPreprocessing(config, llvmModule)
@@ -222,6 +228,10 @@ abstract class LlvmOptimizationPipeline(
""".trimIndent()
}
LLVMRunPassManager(passManager, llvmModule)
if (config.timePasses) {
LLVMPrintAllTimersToStdOut()
LLVMClearAllTimers()
}
} finally {
LLVMPassManagerBuilderDispose(passBuilder)
LLVMDisposePassManager(passManager)
@@ -159,7 +159,12 @@ internal fun PhaseEngine<NativeGenerationState>.runBitcodePostProcessing() {
if (checkExternalCalls) {
runPhase(CheckExternalCallsPhase)
}
val optimizationConfig = createLTOFinalPipelineConfig(context, context.llvm.targetTriple, closedWorld = context.llvmModuleSpecification.isFinal)
val optimizationConfig = createLTOFinalPipelineConfig(
context,
context.llvm.targetTriple,
closedWorld = context.llvmModuleSpecification.isFinal,
timePasses = context.config.flexiblePhaseConfig.needProfiling,
)
useContext(OptimizationState(context.config, context.llvmModule, optimizationConfig)) {
it.runPhase(MandatoryBitcodeLLVMPostprocessingPhase)
it.runPhase(ModuleBitcodeOptimizationPhase)