From 02e53f95f85ab3de6faa5a7c7e270e8a2f548ea4 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Tue, 8 Oct 2019 10:59:06 +0300 Subject: [PATCH] [LLVM][Optimizations] Replace magic numbers with constants. --- .../backend/konan/OptimizationPipeline.kt | 50 ++++++++++++++----- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt index 7ed83ac2d93..98bb349a7aa 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt @@ -85,24 +85,29 @@ private class LlvmPipelineConfiguration(context: Context) { else -> "" } + /** + * Null value means that LLVM should use default inliner params + * for the provided optimization and size level. + */ val customInlineThreshold: Int? = when { - context.shouldOptimize() -> 100 + context.shouldOptimize() -> INLINE_THRESHOLD_OPT context.shouldContainDebugInfo() -> null else -> null } - val optimizationLevel: Int = when { - context.shouldOptimize() -> 3 - context.shouldContainDebugInfo() -> 0 - else -> 1 + val optimizationLevel: LlvmOptimizationLevel = when { + context.shouldOptimize() -> LlvmOptimizationLevel.AGGRESSIVE + context.shouldContainDebugInfo() -> LlvmOptimizationLevel.NONE + else -> LlvmOptimizationLevel.DEFAULT } - val sizeLevel: Int = when { + val sizeLevel: LlvmSizeLevel = when { + // We try to optimize code as much as possible on embedded targets. target is KonanTarget.ZEPHYR || - target == KonanTarget.WASM32 -> 3 - context.shouldOptimize() -> 0 - context.shouldContainDebugInfo() -> 0 - else -> 0 + target == KonanTarget.WASM32 -> LlvmSizeLevel.AGGRESSIVE + context.shouldOptimize() -> LlvmSizeLevel.NONE + context.shouldContainDebugInfo() -> LlvmSizeLevel.NONE + else -> LlvmSizeLevel.NONE } val codegenOptimizationLevel: LLVMCodeGenOptLevel = when { @@ -114,6 +119,27 @@ private class LlvmPipelineConfiguration(context: Context) { val relocMode: LLVMRelocMode = LLVMRelocMode.LLVMRelocDefault val codeModel: LLVMCodeModel = LLVMCodeModel.LLVMCodeModelDefault + + companion object { + // By default LLVM uses 250 for -03 builds. + // We use a smaller value since default value leads to + // unreasonably bloated runtime code without any measurable + // performance benefits. + // This value still has to be tuned for different targets, though. + private const val INLINE_THRESHOLD_OPT = 100 + } + + enum class LlvmOptimizationLevel(val value: Int) { + NONE(0), + DEFAULT(1), + AGGRESSIVE(3) + } + + enum class LlvmSizeLevel(val value: Int) { + NONE(0), + DEFAULT(1), + AGGRESSIVE(2) + } } internal fun runLlvmOptimizationPipeline(context: Context) { @@ -126,8 +152,8 @@ internal fun runLlvmOptimizationPipeline(context: Context) { initializeLlvmGlobalPassRegistry() val passBuilder = LLVMPassManagerBuilderCreate() val modulePasses = LLVMCreatePassManager() - LLVMPassManagerBuilderSetOptLevel(passBuilder, config.optimizationLevel) - LLVMPassManagerBuilderSetSizeLevel(passBuilder, config.sizeLevel) + LLVMPassManagerBuilderSetOptLevel(passBuilder, config.optimizationLevel.value) + LLVMPassManagerBuilderSetSizeLevel(passBuilder, config.sizeLevel.value) // TODO: use LLVMGetTargetFromName instead. val target = alloc() val foundLlvmTarget = LLVMGetTargetFromTriple(config.targetTriple, target.ptr, null) == 0