diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/SharedVariablesManager.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/SharedVariablesManager.kt index 99027db60ec..6f76701cd07 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/SharedVariablesManager.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/SharedVariablesManager.kt @@ -107,6 +107,11 @@ class JvmSharedVariablesManager( override fun defineSharedValue(originalDeclaration: IrVariable, sharedVariableDeclaration: IrVariable): IrStatement { val initializer = originalDeclaration.initializer ?: return sharedVariableDeclaration + val default = IrConstImpl.defaultValueForType(initializer.startOffset, initializer.endOffset, originalDeclaration.type) + if (initializer is IrConst<*> && initializer.value == default.value) { + // The field is preinitialized to the default value, so an explicit set is not required. + return sharedVariableDeclaration + } val initializationStatement = with(initializer) { IrSetVariableImpl(startOffset, endOffset, irBuiltIns.unitType, originalDeclaration.symbol, this, null) } diff --git a/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInLocalObject.kt b/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInLocalObject.kt index 957e305cffd..3d4e7385c18 100644 --- a/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInLocalObject.kt +++ b/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInLocalObject.kt @@ -1,5 +1,5 @@ fun test() { - var x = 0 + var x = 1 run { val obj = object { fun foo() { ++x } diff --git a/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInNoInlineOnly.kt b/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInNoInlineOnly.kt index de57444d84b..70b9b8d34fc 100644 --- a/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInNoInlineOnly.kt +++ b/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInNoInlineOnly.kt @@ -1,7 +1,7 @@ fun runNoInline(f: () -> Unit) = f() fun test() { - var x = 0 + var x = 1 runNoInline { ++x } } diff --git a/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInNoInlneInsideChainOfInlineFuns.kt b/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInNoInlneInsideChainOfInlineFuns.kt index dd70d0cae61..1293797bf3f 100644 --- a/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInNoInlneInsideChainOfInlineFuns.kt +++ b/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/capturedInNoInlneInsideChainOfInlineFuns.kt @@ -1,7 +1,7 @@ fun runNoInline(f: () -> Unit) = f() fun test() { - var x = 0 + var x = 1 run { run { runNoInline { diff --git a/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/sharedSlotsWithCapturedVars.kt b/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/sharedSlotsWithCapturedVars.kt index d6de787dc32..8ca9de23895 100644 --- a/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/sharedSlotsWithCapturedVars.kt +++ b/compiler/testData/codegen/bytecodeText/capturedVarsOptimization/sharedSlotsWithCapturedVars.kt @@ -1,6 +1,3 @@ -// IGNORE_BACKEND: JVM_IR -// TODO KT-36648 Captured variables not optimized in JVM_IR - fun box(): String { run { run { @@ -24,8 +21,7 @@ fun box(): String { // 4 ILOAD 6 // 4 ISTORE 6 -// Temporary variable slots for 'x2++' + store to fake index: -// 0 ILOAD 1 +// Temporary variable for 'x2++' + store to fake variable marking the outer `run`: // 2 ISTORE 1 // 0 NEW diff --git a/compiler/testData/codegen/bytecodeText/localInitializationLVT/lateinit.kt b/compiler/testData/codegen/bytecodeText/localInitializationLVT/lateinit.kt index 0f571dc0bd8..2efd1f5cf68 100644 --- a/compiler/testData/codegen/bytecodeText/localInitializationLVT/lateinit.kt +++ b/compiler/testData/codegen/bytecodeText/localInitializationLVT/lateinit.kt @@ -7,10 +7,4 @@ fun test(): Char { } // 1 LOCALVARIABLE c Ljava/lang/Object; - -// JVM_TEMPLATES -// 2 ASTORE 0 - -// JVM_IR_TEMPLATES -// 3 ASTORE 0 -// *two* of them are after the start of c's live range \ No newline at end of file +// 2 ASTORE 0 \ No newline at end of file