From 1c210822ead4a5609c7c5723ed01f8fa25b330bd Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 7 Dec 2022 21:35:07 +0100 Subject: [PATCH] Add new configuration key that can enable IR inlining for JVM --- .../cli/common/arguments/K2JVMCompilerArguments.kt | 11 +++++++++++ .../src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt | 1 + .../jetbrains/kotlin/config/JVMConfigurationKeys.java | 3 +++ .../src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt | 6 ++++++ compiler/testData/cli/jvm/extraHelp.out | 1 + 5 files changed, 22 insertions(+) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index 9f69fb73352..3bf95ac4ee2 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -860,6 +860,17 @@ Also sets `-jvm-target` value equal to the selected JDK version""" field = value } + @Argument( + value = "-Xir-inliner", + description = "Inline functions using IR inliner instead of bytecode inliner" + ) + var enableIrInliner: Boolean = false + set(value) { + checkFrozen() + field = value + } + + override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap, Any> { val result = super.configureAnalysisFlags(collector, languageVersion) result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt index 791e6fcac10..5c6cca3e829 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt @@ -308,6 +308,7 @@ fun CompilerConfiguration.configureAdvancedJvmOptions(arguments: K2JVMCompilerAr put(JVMConfigurationKeys.IGNORE_CONST_OPTIMIZATION_ERRORS, arguments.ignoreConstOptimizationErrors) put(JVMConfigurationKeys.NO_NEW_JAVA_ANNOTATION_TARGETS, arguments.noNewJavaAnnotationTargets) put(JVMConfigurationKeys.OLD_INNER_CLASSES_LOGIC, arguments.oldInnerClassesLogic) + put(JVMConfigurationKeys.ENABLE_IR_INLINER, arguments.enableIrInliner) val assertionsMode = JVMAssertionsMode.fromStringOrNull(arguments.assertionsMode) diff --git a/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java b/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java index 44cca49e3f1..bc418bb8758 100644 --- a/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java +++ b/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java @@ -168,4 +168,7 @@ public class JVMConfigurationKeys { public static final CompilerConfigurationKey OLD_INNER_CLASSES_LOGIC = CompilerConfigurationKey.create("Use old logic for generation of InnerClasses attributes"); + + public static final CompilerConfigurationKey ENABLE_IR_INLINER = + CompilerConfigurationKey.create("Enable inlining on IR, instead of inlining on bytecode"); } diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 3d83856b767..82f9827f72d 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.backend.jvm.ir.constantValue import org.jetbrains.kotlin.backend.jvm.ir.shouldContainSuspendMarkers import org.jetbrains.kotlin.backend.jvm.lower.* import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.ir.IrElement @@ -293,6 +294,11 @@ internal val functionInliningPhase = makeIrModulePhase( return irFunction.symbol } } + + if (!context.configuration.getBoolean(JVMConfigurationKeys.ENABLE_IR_INLINER)) { + return@makeIrModulePhase FileLoweringPass.Empty + } + FunctionInlining( context, JvmInlineFunctionResolver(), context.innerClassesSupport, inlinePureArguments = false, diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index 3abb36901ca..de7ac887e2c 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -30,6 +30,7 @@ where advanced options include: -Xemit-jvm-type-annotations Emit JVM type annotations in bytecode -Xdebug Enable debug mode for compilation. Currently this includes spilling all variables in a suspending context regardless their liveness. + -Xir-inliner Inline functions using IR inliner instead of bytecode inliner -Xjvm-enable-preview Allow using features from Java language that are in preview phase. Works as `--enable-preview` in Java. All class files are marked as preview-generated thus it won't be possible to use them in release environment -Xenhance-type-parameter-types-to-def-not-null