From 60875f96b4024f414a94c5a5cef989f813e01911 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Mon, 20 Jul 2020 15:56:29 +0200 Subject: [PATCH] Do not take LVT into account when calculating liveness of variables --- .../optimization/common/variableLiveness.kt | 47 ++----------------- .../box/coroutines/debug/debuggerMetadata.kt | 5 ++ .../coroutines/debug/debuggerMetadata_ir.kt | 6 ++- .../tailCallOptimizations/crossinline.txt | 32 ------------- .../tailCallOptimizations/crossinline_1_2.txt | 32 ------------- .../tailCallOptimizations/crossinline_ir.txt | 20 -------- .../innerObjectRetransformation.txt | 1 - .../innerObjectRetransformation_1_2.txt | 1 - .../innerObjectRetransformation_ir.txt | 1 - .../coroutines/coroutineFields.txt | 1 - .../coroutines/coroutineFields_1_3.txt | 1 - .../coroutines/spilling/component1.kt | 1 - .../coroutines/spilling/component1.txt | 1 - .../coroutines/tcoContinuation.txt | 18 ------- .../coroutines/tcoContinuation_1_3.txt | 18 ------- .../coroutines/tcoContinuation_ir.txt | 8 ---- .../debug/localVariableCorrectLabel.kt | 7 +-- .../varValueConflictsWithTableSameSort.kt | 11 +++-- .../LightAnalysisModeTestGenerated.java | 10 ++-- 19 files changed, 32 insertions(+), 189 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/variableLiveness.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/variableLiveness.kt index bec1d165e68..754e93fa676 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/variableLiveness.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/variableLiveness.kt @@ -13,8 +13,6 @@ import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode import org.jetbrains.org.objectweb.asm.tree.IincInsnNode import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.VarInsnNode -import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue -import org.jetbrains.org.objectweb.asm.tree.analysis.Frame import java.util.* @@ -29,10 +27,6 @@ class VariableLivenessFrame(val maxLocals: Int) : VarFrame { - val typeAnnotatedFrames = MethodTransformer.analyze("fake", node, OptimizationBasicInterpreter()) - val visibleByDebuggerVariables = analyzeVisibleByDebuggerVariables(node, typeAnnotatedFrames) - return analyze(node, object : BackwardAnalysisInterpreter { +fun analyzeLiveness(node: MethodNode): List = + analyze(node, object : BackwardAnalysisInterpreter { override fun newFrame(maxLocals: Int) = VariableLivenessFrame(maxLocals) override fun def(frame: VariableLivenessFrame, insn: AbstractInsnNode) = defVar(frame, insn) override fun use(frame: VariableLivenessFrame, insn: AbstractInsnNode) = - useVar(frame, insn, node, visibleByDebuggerVariables[node.instructions.indexOf(insn)]) + useVar(frame, insn) }) -} - -private fun analyzeVisibleByDebuggerVariables( - node: MethodNode, - typeAnnotatedFrames: TypeAnnotatedFrames -): Array { - val res = Array(node.instructions.size()) { BitSet(node.maxLocals) } - for (local in node.localVariables) { - if (local.name.isInvisibleDebuggerVariable()) continue - for (index in node.instructions.indexOf(local.start) until node.instructions.indexOf(local.end)) { - if (Type.getType(local.desc).sort == typeAnnotatedFrames[index]?.getLocal(local.index)?.type?.sort) { - res[index].set(local.index) - } - } - } - return res -} private fun defVar(frame: VariableLivenessFrame, insn: AbstractInsnNode) { if (insn is VarInsnNode && insn.isStoreOperation()) { @@ -80,22 +55,10 @@ private fun defVar(frame: VariableLivenessFrame, insn: AbstractInsnNode) { } } -private fun useVar( - frame: VariableLivenessFrame, - insn: AbstractInsnNode, - node: MethodNode, - visibleByDebuggerVariables: BitSet -) { - frame.markAllAlive(visibleByDebuggerVariables) - +private fun useVar(frame: VariableLivenessFrame, insn: AbstractInsnNode) { if (insn is VarInsnNode && insn.isLoadOperation()) { frame.markAlive(insn.`var`) } else if (insn is IincInsnNode) { frame.markAlive(insn.`var`) } -} - -private fun String.isInvisibleDebuggerVariable(): Boolean = - startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_ARGUMENT) || - startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION) || - this == SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt b/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt index cf612c96946..3c473c13fe2 100644 --- a/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt +++ b/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt @@ -44,6 +44,7 @@ suspend fun named(): String { val s8 = "" val s9 = "" val map = getSpilledToVariable().toMap() + println(s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9) return map["L$0"] + map["L$1"] + map["L$2"] + map["L$3"] + map["L$4"] + map["L$5"] + map["L$6"] + map["L$7"] + map["L$8"] } @@ -51,14 +52,17 @@ suspend fun suspended() { dummy() val ss = "" suspendHere() + println(ss) } suspend fun multipleLocalsInOneSlot() { for (first in 0 until 1) { suspendHere() + println(first) } for (second in 0 until 1) { suspendHere() + println(second) } } @@ -78,6 +82,7 @@ fun box(): String { dummy() val a = "" res = getSpilledToVariable().toMap()["L$0"] ?: "lambda fail" + println(a) } if (res != "a") { return "" + res diff --git a/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata_ir.kt b/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata_ir.kt index 06b8edb8d2b..5be19b5a276 100644 --- a/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata_ir.kt +++ b/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata_ir.kt @@ -3,7 +3,6 @@ // TARGET_BACKEND: JVM // WITH_RUNTIME // WITH_COROUTINES -// TODO: Merge the test with debuggerMetadata when KT-28016 is fixed, particulary, do not spill 0, since it is constant. @file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "CANNOT_OVERRIDE_INVISIBLE_MEMBER") @@ -45,6 +44,7 @@ suspend fun named(): String { val s8 = "" val s9 = "" val map = getSpilledToVariable().toMap() + println(s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9) return map["L$0"] + map["L$1"] + map["L$2"] + map["L$3"] + map["L$4"] + map["L$5"] + map["L$6"] + map["L$7"] + map["L$8"] } @@ -52,14 +52,17 @@ suspend fun suspended() { dummy() val ss = "" suspendHere() + println(ss) } suspend fun multipleLocalsInOneSlot() { for (first in 0 until 1) { suspendHere() + println(first) } for (second in 0 until 1) { suspendHere() + println(second) } } @@ -79,6 +82,7 @@ fun box(): String { dummy() val a = "" res = getSpilledToVariable().toMap()["L$0"] ?: "lambda fail" + println(a) } if (res != "a") { return "" + res diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.txt index dabc92bc3f6..75a6ac4d3c0 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.txt @@ -4,9 +4,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 L$3: java.lang.Object - field L$4: java.lang.Object - field L$5: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1 @@ -20,9 +17,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 { @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 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$box$1$filter$$inlined$source$1$lambda$1 @@ -62,9 +56,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1 { public final class CrossinlineKt$box$1$fold$$inlined$consumeEach$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 L$4: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$fold$$inlined$consumeEach$1 @@ -93,9 +84,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 L$3: java.lang.Object - field L$4: java.lang.Object - field L$5: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1 @@ -109,9 +97,6 @@ public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2$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$box$1$invokeSuspend$$inlined$filter$1$2 @@ -160,9 +145,6 @@ final class CrossinlineKt$box$1 { synthetic final field $res: kotlin.jvm.internal.Ref$IntRef 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 L$4: java.lang.Object field label: int inner (anonymous) class CrossinlineKt$box$1 method (p0: kotlin.jvm.internal.Ref$IntRef, p1: kotlin.coroutines.Continuation): void @@ -201,9 +183,6 @@ 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 L$3: java.lang.Object - field L$4: java.lang.Object - field L$5: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1 @@ -217,9 +196,6 @@ public final class CrossinlineKt$filter$$inlined$source$1$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$filter$$inlined$source$1$lambda$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$filter$$inlined$source$1$lambda$1 @@ -259,9 +235,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 { public final class CrossinlineKt$fold$$inlined$consumeEach$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 L$4: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$1 @@ -289,10 +262,6 @@ public final class CrossinlineKt$fold$$inlined$consumeEach$1 { public final class CrossinlineKt$fold$1 { // source: 'crossinline.kt' 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 L$4: java.lang.Object field label: int synthetic field result: java.lang.Object inner (anonymous) class CrossinlineKt$fold$1 @@ -309,7 +278,6 @@ public final class CrossinlineKt$range$$inlined$source$1$1 { field L$1: java.lang.Object field L$2: java.lang.Object field L$3: java.lang.Object - field L$4: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$range$$inlined$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 a12f17b4d9d..612b01bc1f1 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_1_2.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_1_2.txt @@ -3,9 +3,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 - field L$3: java.lang.Object - field L$4: java.lang.Object - field L$5: 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 @@ -20,9 +17,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 - 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$box$1$doResume$$inlined$filter$1$2 @@ -71,9 +65,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 L$3: java.lang.Object - field L$4: java.lang.Object - field L$5: 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 @@ -88,9 +79,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 - 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$box$1$filter$$inlined$source$1$lambda$1 @@ -131,9 +119,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1 { public final class CrossinlineKt$box$1$fold$$inlined$consumeEach$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 L$4: 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 @@ -164,9 +149,6 @@ final class CrossinlineKt$box$1 { synthetic final field $res: kotlin.jvm.internal.Ref$IntRef 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 L$4: java.lang.Object inner (anonymous) class CrossinlineKt$box$1 method (p0: kotlin.jvm.internal.Ref$IntRef, p1: kotlin.coroutines.experimental.Continuation): void public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.experimental.Continuation): kotlin.coroutines.experimental.Continuation @@ -205,9 +187,6 @@ 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 L$3: java.lang.Object - field L$4: java.lang.Object - field L$5: 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 @@ -222,9 +201,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 - 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$filter$$inlined$source$1$lambda$1 @@ -265,9 +241,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 { public final class CrossinlineKt$fold$$inlined$consumeEach$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 L$4: 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 @@ -296,10 +269,6 @@ public final class CrossinlineKt$fold$$inlined$consumeEach$1 { public final class CrossinlineKt$fold$1 { // source: 'crossinline.kt' 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 L$4: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable inner (anonymous) class CrossinlineKt$fold$1 @@ -317,7 +286,6 @@ public final class CrossinlineKt$range$$inlined$source$1$1 { field L$1: java.lang.Object field L$2: java.lang.Object field L$3: java.lang.Object - field L$4: 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 diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt index 9d863a0c6c0..abc5a205f4f 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt @@ -4,9 +4,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 L$3: java.lang.Object - field L$4: java.lang.Object - field L$5: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1 @@ -20,8 +17,6 @@ public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2$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$2 @@ -69,9 +64,6 @@ final class CrossinlineKt$box$1 { synthetic final field $res: kotlin.jvm.internal.Ref$IntRef 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 L$4: java.lang.Object field label: int inner (anonymous) class CrossinlineKt$box$1 method (p0: kotlin.jvm.internal.Ref$IntRef, p1: kotlin.coroutines.Continuation): void @@ -110,9 +102,6 @@ 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 L$3: java.lang.Object - field L$4: java.lang.Object - field L$5: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1 @@ -138,8 +127,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 { @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$filter$lambda-3$$inlined$consumeEach$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$lambda-3$$inlined$consumeEach$1 @@ -167,8 +154,6 @@ public final class CrossinlineKt$filter$lambda-3$$inlined$consumeEach$1 { public final class CrossinlineKt$fold$$inlined$consumeEach$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$fold$$inlined$consumeEach$1 @@ -196,10 +181,6 @@ public final class CrossinlineKt$fold$$inlined$consumeEach$1 { final class CrossinlineKt$fold$1 { // source: 'crossinline.kt' 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 L$4: java.lang.Object field label: int synthetic field result: java.lang.Object inner (anonymous) class CrossinlineKt$fold$1 @@ -212,7 +193,6 @@ final class CrossinlineKt$fold$1 { public final class CrossinlineKt$range$$inlined$source$1$1 { field I$0: int field I$1: int - field I$2: int field L$0: java.lang.Object field L$1: java.lang.Object field L$2: java.lang.Object diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation.txt index f9a0cc9823b..180919b7706 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation.txt @@ -51,7 +51,6 @@ public final class flow/InnerObjectRetransformationKt$check$$inlined$flowWith$1 @kotlin.coroutines.jvm.internal.DebugMetadata final class flow/InnerObjectRetransformationKt$check$1 { // source: 'innerObjectRetransformation.kt' - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object inner (anonymous) class flow/InnerObjectRetransformationKt$check$1 diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_1_2.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_1_2.txt index d326385c4f8..a0950fcd6d5 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_1_2.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_1_2.txt @@ -48,7 +48,6 @@ public final class flow/InnerObjectRetransformationKt$check$$inlined$flowWith$1 @kotlin.Metadata final class flow/InnerObjectRetransformationKt$check$1 { // source: 'innerObjectRetransformation.kt' - field L$0: java.lang.Object synthetic field data: java.lang.Object synthetic field exception: java.lang.Throwable inner (anonymous) class flow/InnerObjectRetransformationKt$check$1 diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_ir.txt index 2a7c4cb38c5..a116204aa21 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/innerObjectRetransformation_ir.txt @@ -51,7 +51,6 @@ public final class flow/InnerObjectRetransformationKt$check$$inlined$flowWith$1 @kotlin.Metadata final class flow/InnerObjectRetransformationKt$check$1 { // source: 'innerObjectRetransformation.kt' - field L$0: java.lang.Object field label: int synthetic field result: java.lang.Object inner (anonymous) class flow/InnerObjectRetransformationKt$check$1 diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields.txt b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields.txt index 2944cee94e8..443485b9780 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields.txt @@ -45,7 +45,6 @@ final class CoroutineFieldsKt$box$1 { field J$0: long field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object private synthetic field p$: Controller inner (anonymous) class CoroutineFieldsKt$box$1 method (p0: kotlin.jvm.internal.Ref$ObjectRef, p1: COROUTINES_PACKAGE.Continuation): void diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_1_3.txt b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_1_3.txt index a8bba29a18a..46e69c1e5c3 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_1_3.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/coroutineFields_1_3.txt @@ -44,7 +44,6 @@ final class CoroutineFieldsKt$box$1 { field J$0: long field L$0: java.lang.Object field L$1: java.lang.Object - field L$2: java.lang.Object field label: int private synthetic field p$: Controller inner (anonymous) class CoroutineFieldsKt$box$1 diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.kt b/compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.kt index 75b79a6bd7a..f5e1db6d7d6 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.kt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.kt @@ -1,5 +1,4 @@ // WITH_RUNTIME -// IGNORE_BACKEND: JVM_IR interface Result diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.txt b/compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.txt index e6909462f32..ef6e107d741 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.txt @@ -2,7 +2,6 @@ @kotlin.Metadata final class Component1Kt$test$1 { // source: 'component1.kt' - field L$0: java.lang.Object field label: int private synthetic field p$: Foo inner (anonymous) class Component1Kt$test$1 diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation.txt b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation.txt index e8d7ee0f2fc..c678c1fbbfe 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation.txt @@ -80,12 +80,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 { public final class TcoContinuationKt$foo$$inlined$map$1$2$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 L$4: java.lang.Object - field L$5: java.lang.Object - field L$6: java.lang.Object - field L$7: 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 @@ -134,12 +128,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 { public final class TcoContinuationKt$map$$inlined$transform$1$2$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 L$4: java.lang.Object - field L$5: java.lang.Object - field L$6: java.lang.Object - field L$7: 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 @@ -192,12 +180,6 @@ public final class TcoContinuationKt$map$$inlined$transform$2$1 { public final class TcoContinuationKt$map$$inlined$transform$2$2$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 L$4: java.lang.Object - field L$5: java.lang.Object - field L$6: java.lang.Object - field L$7: 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 710991d70aa..b9ea98b562a 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_1_3.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_1_3.txt @@ -77,12 +77,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 { public final class TcoContinuationKt$foo$$inlined$map$1$2$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 L$4: java.lang.Object - field L$5: java.lang.Object - field L$6: java.lang.Object - field L$7: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$foo$$inlined$map$1$2 @@ -128,12 +122,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 { public final class TcoContinuationKt$map$$inlined$transform$1$2$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 L$4: java.lang.Object - field L$5: java.lang.Object - field L$6: java.lang.Object - field L$7: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$1$2 @@ -183,12 +171,6 @@ public final class TcoContinuationKt$map$$inlined$transform$2$1 { public final class TcoContinuationKt$map$$inlined$transform$2$2$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 L$4: java.lang.Object - field L$5: java.lang.Object - field L$6: java.lang.Object - field L$7: 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 0a4bd95bcfd..bcbd5788bc8 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/tcoContinuation_ir.txt @@ -77,10 +77,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 { public final class TcoContinuationKt$foo$$inlined$map$1$2$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 L$4: java.lang.Object - field L$5: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$foo$$inlined$map$1$2 @@ -125,10 +121,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 { public final class TcoContinuationKt$map$$inlined$transform$1$2$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 L$4: java.lang.Object - field L$5: java.lang.Object field label: int synthetic field result: java.lang.Object synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$1$2 diff --git a/compiler/testData/codegen/bytecodeText/coroutines/debug/localVariableCorrectLabel.kt b/compiler/testData/codegen/bytecodeText/coroutines/debug/localVariableCorrectLabel.kt index 0418149b071..0e78d33f3b2 100644 --- a/compiler/testData/codegen/bytecodeText/coroutines/debug/localVariableCorrectLabel.kt +++ b/compiler/testData/codegen/bytecodeText/coroutines/debug/localVariableCorrectLabel.kt @@ -17,9 +17,10 @@ suspend fun SequenceScope.awaitSeq(): Int = 42 // label numbers differ in BEs // JVM_TEMPLATES -// 1 LOCALVARIABLE a I L17 L.* -// 1 LINENUMBER 8 L17 +// 1 LOCALVARIABLE a I L[0-9]+ L20 +// 1 LINENUMBER 9 L20 +/* TODO: JVM_IR does not generate LINENUMBER at the end of the lambda */ // JVM_IR_TEMPLATES -// 1 LOCALVARIABLE a I L14 L.* +// 1 LOCALVARIABLE a I L[0-9]+ L5 // 1 LINENUMBER 8 L14 diff --git a/compiler/testData/codegen/bytecodeText/coroutines/varValueConflictsWithTableSameSort.kt b/compiler/testData/codegen/bytecodeText/coroutines/varValueConflictsWithTableSameSort.kt index 6f3cd404d79..0ea4632b030 100644 --- a/compiler/testData/codegen/bytecodeText/coroutines/varValueConflictsWithTableSameSort.kt +++ b/compiler/testData/codegen/bytecodeText/coroutines/varValueConflictsWithTableSameSort.kt @@ -15,17 +15,18 @@ fun box(): String { builder { var shiftSlot: String = "" - // Initialize var with Int value + // Initialize var with String value try { var i: String = "abc" i = "123" } finally { } // This variable should take the same slot as 'i' had - var s: String + var s: String = "FAIL" // We shout not spill 's' to continuation field because it's not effectively initialized if (suspendHere() == "OK") { + println(s) s = "OK" } else { @@ -45,5 +46,9 @@ fun box(): String { // 1 ALOAD 3\s+ATHROW /* 1 load in result = s */ // 1 ALOAD 3\s+PUTFIELD kotlin/jvm/internal/Ref\$ObjectRef\.element +/* 1 load in spill */ +// 1 ALOAD 3\s+PUTFIELD VarValueConflictsWithTableSameSortKt\$box\$1\.L\$0 : Ljava/lang/Object; +/* 1 load in println(s) */ +// 1 ALOAD 3\s+INVOKEVIRTUAL java/io/PrintStream.println \(Ljava/lang/Object;\)V /* But no further load when spilling 's' to the continuation */ -// 2 ALOAD 3 +// 4 ALOAD 3 diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index e7dc61889c7..149b31a15f3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -7558,11 +7558,6 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class Debug extends AbstractLightAnalysisModeTest { - @TestMetadata("debuggerMetadata_ir.kt") - public void ignoreDebuggerMetadata_ir() throws Exception { - runTest("compiler/testData/codegen/box/coroutines/debug/debuggerMetadata_ir.kt"); - } - private void runTest(String testDataFilePath) throws Exception { KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); } @@ -7576,6 +7571,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt"); } + @TestMetadata("debuggerMetadata_ir.kt") + public void testDebuggerMetadata_ir() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/debug/debuggerMetadata_ir.kt"); + } + @TestMetadata("elvisLineNumber.kt") public void testElvisLineNumber() throws Exception { runTest("compiler/testData/codegen/box/coroutines/debug/elvisLineNumber.kt");