From 7a99f9ff2e84f0cbe2b5404cea2da3bc52888814 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 9 Aug 2021 17:44:24 +0300 Subject: [PATCH] JVM_IR KT-47984 allow noinline functional inplace args --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../backend/jvm/codegen/IrInlineCodegen.kt | 2 +- .../inlineCircularDedepency.kt | 30 +++++++++++++++++++ .../inlineArgsInPlace/noinlineParameter.kt | 20 +++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 ++++ .../IrJsCodegenBoxTestGenerated.java | 5 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++++ .../IrCodegenBoxWasmTestGenerated.java | 5 ++++ 11 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inlineArgsInPlace/inlineCircularDedepency.kt create mode 100644 compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 8431bc77980..3989d0737a5 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -18252,6 +18252,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineArgsInPlace/mutableCollectionPlusAssign.kt"); } + @Test + @TestMetadata("noinlineParameter.kt") + public void testNoinlineParameter() throws Exception { + runTest("compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt"); + } + @Test @TestMetadata("suspensionPointInsideArgument.kt") public void testSuspensionPointInsideArgument() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt index 8caf2628c6e..71007811f5b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt @@ -58,7 +58,7 @@ class IrInlineCodegen( } if (actualParametersCount == 0) return false - if (function.valueParameters.any { it.isFunctionOrSuspendFunction() }) + if (function.valueParameters.any { !it.isNoinline && it.isFunctionOrSuspendFunction() }) return false return canInlineArgumentsInPlace(sourceCompiler.compileInlineFunction(jvmSignature).node) diff --git a/compiler/testData/codegen/box/inlineArgsInPlace/inlineCircularDedepency.kt b/compiler/testData/codegen/box/inlineArgsInPlace/inlineCircularDedepency.kt new file mode 100644 index 00000000000..083b043ff69 --- /dev/null +++ b/compiler/testData/codegen/box/inlineArgsInPlace/inlineCircularDedepency.kt @@ -0,0 +1,30 @@ +// IGNORE_BACKEND: WASM +// FULL_JDK +// WITH_RUNTIME + +val z = ArrayList() + +inline fun a(body: () -> Unit) { + body() + z += "a" +} + +inline fun b(body: () -> Unit) { + z += "b" + body() + a { z += "from b" } +} + +fun test() { + b { z += "test" } +} + +fun box(): String { + test() + + if (z != listOf("b", "test", "from b", "a")) + return z.toString() + + return "OK" +} + diff --git a/compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt b/compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt new file mode 100644 index 00000000000..0e9f3b27161 --- /dev/null +++ b/compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt @@ -0,0 +1,20 @@ +// IGNORE_BACKEND: WASM +// WITH_RUNTIME + +// CHECK_BYTECODE_TEXT +// JVM_IR_TEMPLATES +// 1 ASTORE 1 +// 12 ALOAD 1 +// JVM_TEMPLATES +// 2 ASTORE 1 +// 13 ALOAD 1 + +@Suppress("DEPRECATION_ERROR") +fun box(): String { + val seq = buildSequence { + yield("O") + yield("K") + } + val it = seq.iterator() + return it.next() + it.next() +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index f8cb9a2c852..1da61a1bc06 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -18108,6 +18108,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineArgsInPlace/mutableCollectionPlusAssign.kt"); } + @Test + @TestMetadata("noinlineParameter.kt") + public void testNoinlineParameter() throws Exception { + runTest("compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt"); + } + @Test @TestMetadata("suspensionPointInsideArgument.kt") public void testSuspensionPointInsideArgument() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index e99ed51cf49..2c4434023b5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -18252,6 +18252,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineArgsInPlace/mutableCollectionPlusAssign.kt"); } + @Test + @TestMetadata("noinlineParameter.kt") + public void testNoinlineParameter() throws Exception { + runTest("compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt"); + } + @Test @TestMetadata("suspensionPointInsideArgument.kt") public void testSuspensionPointInsideArgument() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 37161c57574..608fd09bfd7 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -15009,6 +15009,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineArgsInPlace/mutableCollectionPlusAssign.kt"); } + @TestMetadata("noinlineParameter.kt") + public void testNoinlineParameter() throws Exception { + runTest("compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt"); + } + @TestMetadata("suspensionPointInsideArgument.kt") public void testSuspensionPointInsideArgument() throws Exception { runTest("compiler/testData/codegen/box/inlineArgsInPlace/suspensionPointInsideArgument.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 041b5412a40..ab9e508d6c0 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -13098,6 +13098,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/inlineArgsInPlace/mutableCollectionPlusAssign.kt"); } + @TestMetadata("noinlineParameter.kt") + public void testNoinlineParameter() throws Exception { + runTest("compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt"); + } + @TestMetadata("suspensionPointInsideArgument.kt") public void testSuspensionPointInsideArgument() throws Exception { runTest("compiler/testData/codegen/box/inlineArgsInPlace/suspensionPointInsideArgument.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index c6ce7135016..d4dd863d277 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -12504,6 +12504,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineArgsInPlace/mutableCollectionPlusAssign.kt"); } + @TestMetadata("noinlineParameter.kt") + public void testNoinlineParameter() throws Exception { + runTest("compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt"); + } + @TestMetadata("suspensionPointInsideArgument.kt") public void testSuspensionPointInsideArgument() throws Exception { runTest("compiler/testData/codegen/box/inlineArgsInPlace/suspensionPointInsideArgument.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 816fd8a5122..db7f1c24830 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -12569,6 +12569,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineArgsInPlace/mutableCollectionPlusAssign.kt"); } + @TestMetadata("noinlineParameter.kt") + public void testNoinlineParameter() throws Exception { + runTest("compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt"); + } + @TestMetadata("suspensionPointInsideArgument.kt") public void testSuspensionPointInsideArgument() throws Exception { runTest("compiler/testData/codegen/box/inlineArgsInPlace/suspensionPointInsideArgument.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index bec14829fdf..d158af9fe85 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -6659,6 +6659,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/inlineArgsInPlace/mutableCollectionPlusAssign.kt"); } + @TestMetadata("noinlineParameter.kt") + public void testNoinlineParameter() throws Exception { + runTest("compiler/testData/codegen/box/inlineArgsInPlace/noinlineParameter.kt"); + } + @TestMetadata("suspensionPointInsideArgument.kt") public void testSuspensionPointInsideArgument() throws Exception { runTest("compiler/testData/codegen/box/inlineArgsInPlace/suspensionPointInsideArgument.kt");