diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineTransformerMethodVisitor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineTransformerMethodVisitor.kt index 34966f1bb37..3d654c27539 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineTransformerMethodVisitor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineTransformerMethodVisitor.kt @@ -20,6 +20,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.org.objectweb.asm.tree.* +import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue import kotlin.math.max private const val COROUTINES_DEBUG_METADATA_VERSION = 1 @@ -610,14 +611,13 @@ class CoroutineTransformerMethodVisitor( // k - continuation // k + 1 - data // k + 2 - exception - val variablesToSpill = - (0 until localsCount) - .filterNot { it in setOf(continuationIndex, dataIndex, exceptionIndex) } - .map { Pair(it, frame.getLocal(it)) } - .filter { (index, value) -> - (index == 0 && needDispatchReceiver && isForNamedFunction) || - (value.type != null && livenessFrame.isAlive(index)) - } + val variablesToSpill = arrayListOf>() + for (slot in 0 until localsCount) { + if (slot == continuationIndex || slot == dataIndex || slot == exceptionIndex) continue + val value = frame.getLocal(slot) + if (value.type == null || !livenessFrame.isAlive(slot)) continue + variablesToSpill += slot to value + } for ((index, basicValue) in variablesToSpill) { if (basicValue == StrictBasicValue.NULL_VALUE) { diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.txt index 75a6ac4d3c0..52e247339a5 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.txt @@ -3,7 +3,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1 @@ -16,7 +15,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 { @kotlin.Metadata @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$box$1$filter$$inlined$source$1$lambda$1$1 { - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1$lambda$1 @@ -55,7 +53,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$box$1$fold$$inlined$consumeEach$1$1 { field L$0: java.lang.Object - field L$1: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$fold$$inlined$consumeEach$1 @@ -83,7 +80,6 @@ public final class CrossinlineKt$box$1$fold$$inlined$consumeEach$1 { public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1 @@ -96,7 +92,6 @@ public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 { @kotlin.Metadata @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2$1 { - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2 @@ -182,7 +177,6 @@ public final class CrossinlineKt$consumeEach$2 { public final class CrossinlineKt$filter$$inlined$source$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1 @@ -195,7 +189,6 @@ public final class CrossinlineKt$filter$$inlined$source$1$1 { @kotlin.Metadata @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$filter$$inlined$source$1$lambda$1$1 { - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1$lambda$1 @@ -234,7 +227,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$fold$$inlined$consumeEach$1$1 { field L$0: java.lang.Object - field L$1: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$1 @@ -277,7 +269,6 @@ public final class CrossinlineKt$range$$inlined$source$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object field L$2: java.lang.Object - field L$3: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$range$$inlined$source$1 @@ -304,7 +295,6 @@ public final class CrossinlineKt$source$1$consume$1 { // source: 'crossinline.kt' field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$source$1 diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_1_2.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_1_2.txt index 612b01bc1f1..5be28ead196 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_1_2.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_1_2.txt @@ -2,7 +2,6 @@ public final class CrossinlineKt$box$1$doResume$$inlined$filter$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$box$1$doResume$$inlined$filter$1 @@ -16,7 +15,6 @@ public final class CrossinlineKt$box$1$doResume$$inlined$filter$1$1 { @kotlin.Metadata public final class CrossinlineKt$box$1$doResume$$inlined$filter$1$2$1 { - field L$0: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$box$1$doResume$$inlined$filter$1$2 @@ -64,7 +62,6 @@ public final class CrossinlineKt$box$1$doResume$$inlined$fold$1 { public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1 @@ -78,7 +75,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 { @kotlin.Metadata public final class CrossinlineKt$box$1$filter$$inlined$source$1$lambda$1$1 { - field L$0: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1$lambda$1 @@ -118,7 +114,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1 { @kotlin.Metadata public final class CrossinlineKt$box$1$fold$$inlined$consumeEach$1$1 { field L$0: java.lang.Object - field L$1: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$box$1$fold$$inlined$consumeEach$1 @@ -186,7 +181,6 @@ public final class CrossinlineKt$consumeEach$2 { public final class CrossinlineKt$filter$$inlined$source$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1 @@ -200,7 +194,6 @@ public final class CrossinlineKt$filter$$inlined$source$1$1 { @kotlin.Metadata public final class CrossinlineKt$filter$$inlined$source$1$lambda$1$1 { - field L$0: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1$lambda$1 @@ -240,7 +233,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 { @kotlin.Metadata public final class CrossinlineKt$fold$$inlined$consumeEach$1$1 { field L$0: java.lang.Object - field L$1: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$1 @@ -285,7 +277,6 @@ public final class CrossinlineKt$range$$inlined$source$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object field L$2: java.lang.Object - field L$3: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$range$$inlined$source$1 @@ -313,7 +304,6 @@ public final class CrossinlineKt$source$1$consume$1 { // source: 'crossinline.kt' field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: CrossinlineKt$source$1 diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt index abc5a205f4f..1aa86e4304a 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt @@ -3,7 +3,6 @@ public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1 @@ -16,7 +15,6 @@ public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 { @kotlin.Metadata @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2$1 { - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2 @@ -101,7 +99,6 @@ public final class CrossinlineKt$consumeEach$2 { public final class CrossinlineKt$filter$$inlined$source$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1 @@ -126,7 +123,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 { @kotlin.Metadata @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$filter$lambda-3$$inlined$consumeEach$1$1 { - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$filter$lambda-3$$inlined$consumeEach$1 @@ -153,7 +149,6 @@ public final class CrossinlineKt$filter$lambda-3$$inlined$consumeEach$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$fold$$inlined$consumeEach$1$1 { field L$0: java.lang.Object - field L$1: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$1 @@ -196,7 +191,6 @@ public final class CrossinlineKt$range$$inlined$source$1$1 { field L$0: java.lang.Object field L$1: java.lang.Object field L$2: java.lang.Object - field L$3: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$range$$inlined$source$1 @@ -223,7 +217,6 @@ public final class CrossinlineKt$source$1$consume$1 { // source: 'crossinline.kt' field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$source$1 diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5.txt index 7a96178c95c..fffa2273d53 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5.txt @@ -29,7 +29,6 @@ final class Override5Kt$box$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class Override5Kt$inlineMe$1$generic$1 { // source: 'override5.kt' - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: Override5Kt$inlineMe$1 diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5_ir.txt index 808e2276c0d..1048a4239c7 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/unit/override5_ir.txt @@ -29,7 +29,6 @@ final class Override5Kt$box$1 { @kotlin.Metadata public final class Override5Kt$inlineMe$1$generic$1 { // source: 'override5.kt' - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: Override5Kt$inlineMe$1 diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields.txt b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields.txt index 443485b9780..80ad24d8ab6 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields.txt @@ -15,7 +15,6 @@ final class Controller$multipleSuspensions$1 { @kotlin.Metadata final class Controller$nonTailCall$1 { // source: 'coroutineFields.kt' - field L$0: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: Controller diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_1_3.txt b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_1_3.txt index 46e69c1e5c3..268f2893334 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_1_3.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_1_3.txt @@ -15,7 +15,6 @@ final class Controller$multipleSuspensions$1 { @kotlin.coroutines.jvm.internal.DebugMetadata final class Controller$nonTailCall$1 { // source: 'coroutineFields.kt' - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: Controller diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_ir.txt b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_ir.txt index 4dedb0fdc70..b7d0d8ebc2b 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_ir.txt @@ -15,7 +15,6 @@ final class Controller$multipleSuspensions$1 { @kotlin.Metadata final class Controller$nonTailCall$1 { // source: 'coroutineFields.kt' - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: Controller diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation.txt b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation.txt index c678c1fbbfe..f75aa83e3aa 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation.txt @@ -79,7 +79,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 { @kotlin.Metadata public final class TcoContinuationKt$foo$$inlined$map$1$2$1 { field L$0: java.lang.Object - field L$1: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: TcoContinuationKt$foo$$inlined$map$1$2 @@ -127,7 +126,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 { @kotlin.Metadata public final class TcoContinuationKt$map$$inlined$transform$1$2$1 { field L$0: java.lang.Object - field L$1: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$1$2 @@ -179,7 +177,6 @@ public final class TcoContinuationKt$map$$inlined$transform$2$1 { @kotlin.Metadata public final class TcoContinuationKt$map$$inlined$transform$2$2$1 { field L$0: java.lang.Object - field L$1: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$2$2 diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_1_3.txt b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_1_3.txt index b9ea98b562a..1f971ed16ea 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_1_3.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_1_3.txt @@ -76,7 +76,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class TcoContinuationKt$foo$$inlined$map$1$2$1 { field L$0: java.lang.Object - field L$1: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$foo$$inlined$map$1$2 @@ -121,7 +120,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class TcoContinuationKt$map$$inlined$transform$1$2$1 { field L$0: java.lang.Object - field L$1: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$1$2 @@ -170,7 +168,6 @@ public final class TcoContinuationKt$map$$inlined$transform$2$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class TcoContinuationKt$map$$inlined$transform$2$2$1 { field L$0: java.lang.Object - field L$1: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$2$2 diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt index bcbd5788bc8..0dc33f3c04e 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt @@ -76,7 +76,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class TcoContinuationKt$foo$$inlined$map$1$2$1 { field L$0: java.lang.Object - field L$1: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$foo$$inlined$map$1$2 @@ -120,7 +119,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class TcoContinuationKt$map$$inlined$transform$1$2$1 { field L$0: java.lang.Object - field L$1: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$1$2