From 256317da156d241a1cd22a93554ee62bf61958b9 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Fri, 14 Dec 2018 15:28:01 +0300 Subject: [PATCH] [IR BE] Fix SharedVariableLowering * make it able to detect shared vars under any declaration kind, not only IrFunction * Add & update tests --- .../common/lower/SharedVariablesLowering.kt | 34 +++++++------------ .../testData/codegen/box/objects/kt2663.kt | 2 -- .../testData/codegen/box/objects/kt2663_3.kt | 9 +++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++ .../IrJsCodegenBoxTestGenerated.java | 5 +++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++ 8 files changed, 46 insertions(+), 24 deletions(-) create mode 100644 compiler/testData/codegen/box/objects/kt2663_3.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt index 090f914d6db..60b566239a0 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SharedVariablesLowering.kt @@ -18,12 +18,9 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.common.FunctionLoweringPass -import org.jetbrains.kotlin.backend.common.makePhase import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.declarations.IrDeclaration -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.expressions.IrSetVariable @@ -50,40 +47,33 @@ class SharedVariablesLowering(val context: BackendContext) : FunctionLoweringPas } private fun collectSharedVariables() { - irFunction.acceptVoid(object : IrElementVisitorVoid { - val declarationsStack = ArrayDeque() - val currentDeclaration: IrDeclaration - get() = declarationsStack.peek() - + irFunction.accept(object : IrElementVisitor { val relevantVars = HashSet() - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) + override fun visitElement(element: IrElement, data: IrDeclarationParent) { + element.acceptChildren(this, data) } - override fun visitFunction(declaration: IrFunction) { - declarationsStack.push(declaration) - declaration.acceptChildrenVoid(this) - declarationsStack.pop() - } + override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent) = + super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data) - override fun visitVariable(declaration: IrVariable) { - declaration.acceptChildrenVoid(this) + override fun visitVariable(declaration: IrVariable, data: IrDeclarationParent) { + declaration.acceptChildren(this, data) if (declaration.isVar) { relevantVars.add(declaration) } } - override fun visitVariableAccess(expression: IrValueAccessExpression) { - expression.acceptChildrenVoid(this) + override fun visitValueAccess(expression: IrValueAccessExpression, data: IrDeclarationParent) { + expression.acceptChildren(this, data) val value = expression.symbol.owner - if (value in relevantVars && (value as IrVariable).parent != currentDeclaration) { + if (value in relevantVars && (value as IrVariable).parent != data) { sharedVariables.add(value) } } - }) + }, irFunction) } private fun rewriteSharedVariables() { diff --git a/compiler/testData/codegen/box/objects/kt2663.kt b/compiler/testData/codegen/box/objects/kt2663.kt index 838df4e5e0e..b7dad56133f 100644 --- a/compiler/testData/codegen/box/objects/kt2663.kt +++ b/compiler/testData/codegen/box/objects/kt2663.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR -// IGNORE_BACKEND: JS_IR fun box() : String { var a = 1 diff --git a/compiler/testData/codegen/box/objects/kt2663_3.kt b/compiler/testData/codegen/box/objects/kt2663_3.kt new file mode 100644 index 00000000000..f55e05d9989 --- /dev/null +++ b/compiler/testData/codegen/box/objects/kt2663_3.kt @@ -0,0 +1,9 @@ +// IGNORE_BACKEND: JVM_IR +fun box() : String { + var a = 1 + + object { + val t = run { a++ } + } + return if (a == 2) "OK" else "fail" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 0897758fc34..8b9a2e88208 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -15995,6 +15995,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/objects/kt2663_2.kt"); } + @TestMetadata("kt2663_3.kt") + public void testKt2663_3() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt2663_3.kt"); + } + @TestMetadata("kt2675.kt") public void testKt2675() throws Exception { runTest("compiler/testData/codegen/box/objects/kt2675.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 6163dec3437..8b01e27ce8e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -15995,6 +15995,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/objects/kt2663_2.kt"); } + @TestMetadata("kt2663_3.kt") + public void testKt2663_3() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt2663_3.kt"); + } + @TestMetadata("kt2675.kt") public void testKt2675() throws Exception { runTest("compiler/testData/codegen/box/objects/kt2675.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index eed2d8fee65..0aa0abda80c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -16000,6 +16000,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/objects/kt2663_2.kt"); } + @TestMetadata("kt2663_3.kt") + public void testKt2663_3() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt2663_3.kt"); + } + @TestMetadata("kt2675.kt") public void testKt2675() throws Exception { runTest("compiler/testData/codegen/box/objects/kt2675.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index 12746b3990e..7d762687cab 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -13585,6 +13585,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/objects/kt2663_2.kt"); } + @TestMetadata("kt2663_3.kt") + public void testKt2663_3() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt2663_3.kt"); + } + @TestMetadata("kt2675.kt") public void testKt2675() throws Exception { runTest("compiler/testData/codegen/box/objects/kt2675.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index d455159de2f..3d4db9a7aad 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -14645,6 +14645,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/objects/kt2663_2.kt"); } + @TestMetadata("kt2663_3.kt") + public void testKt2663_3() throws Exception { + runTest("compiler/testData/codegen/box/objects/kt2663_3.kt"); + } + @TestMetadata("kt2675.kt") public void testKt2675() throws Exception { runTest("compiler/testData/codegen/box/objects/kt2675.kt");