From 8dee3c1ca08fecb8fc79f751a113ff8fd73c4e9b Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Wed, 25 Aug 2021 16:24:34 +0200 Subject: [PATCH] [JVM] Do not unbox when local variable initialized with null. This is already the case for straightline code such as ``` inline fun f(size: Int, block: () -> R): R { var result: R result = block() return result } ``` However, if the local variable introduction happens at a merge point as in the following example, we allow the unboxing but only do it halfway. The initialization of the local is still done with a null value. ``` inline fun f(size: Int, block: () -> R): R { var result: R while (true) { result = block() if (size == 0) break } return result } ``` This change disallows unboxing for this move complicated case as well by bailing out if a local use is with a TaintedBoxedValue (merge of Object and Integer). ^KT-48394 Fixed. --- .../boxing/RedundantBoxingMethodTransformer.kt | 2 +- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/box/boxingOptimization/kt48394.kt | 14 ++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/IrCodegenBoxWasmTestGenerated.java | 5 +++++ 10 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/boxingOptimization/kt48394.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt index 5844d1f8e0c..7c6e8d6abd6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt @@ -129,7 +129,7 @@ class RedundantBoxingMethodTransformer(private val generationState: GenerationSt private fun isUnsafeToRemoveBoxingForConnectedValues(usedValues: List, unboxedType: Type): Boolean = usedValues.any { input -> if (input === StrictBasicValue.UNINITIALIZED_VALUE) return@any false - if (input !is BoxedBasicValue) return@any true + if (input !is CleanBoxedValue) return@any true val descriptor = input.descriptor !descriptor.isSafeToRemove || descriptor.unboxedType != unboxedType 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 28a892cc1e9..ddef4ba3499 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 @@ -1808,6 +1808,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/boxingOptimization/kt46859.kt"); } + @Test + @TestMetadata("kt48394.kt") + public void testKt48394() throws Exception { + runTest("compiler/testData/codegen/box/boxingOptimization/kt48394.kt"); + } + @Test @TestMetadata("kt5493.kt") public void testKt5493() throws Exception { diff --git a/compiler/testData/codegen/box/boxingOptimization/kt48394.kt b/compiler/testData/codegen/box/boxingOptimization/kt48394.kt new file mode 100644 index 00000000000..39e44a1156c --- /dev/null +++ b/compiler/testData/codegen/box/boxingOptimization/kt48394.kt @@ -0,0 +1,14 @@ +inline fun f(size: Int, block: () -> R): R { + var result: R + while (true) { + result = block() + if (size == 0) break + } + return result +} + +fun computeResult(size: Int) = f(size) { + 42 +} + +fun box() = if (computeResult(0) == 42) "OK" else "FAIL" 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 3b69fc796b3..52dca94f6d5 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 @@ -1706,6 +1706,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/boxingOptimization/kt46859.kt"); } + @Test + @TestMetadata("kt48394.kt") + public void testKt48394() throws Exception { + runTest("compiler/testData/codegen/box/boxingOptimization/kt48394.kt"); + } + @Test @TestMetadata("kt5493.kt") public void testKt5493() 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 eaa87507749..939da3e8f9d 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 @@ -1808,6 +1808,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/boxingOptimization/kt46859.kt"); } + @Test + @TestMetadata("kt48394.kt") + public void testKt48394() throws Exception { + runTest("compiler/testData/codegen/box/boxingOptimization/kt48394.kt"); + } + @Test @TestMetadata("kt5493.kt") public void testKt5493() 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 65a75cff46d..46e3975a897 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -1510,6 +1510,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/boxingOptimization/kt46859.kt"); } + @TestMetadata("kt48394.kt") + public void testKt48394() throws Exception { + runTest("compiler/testData/codegen/box/boxingOptimization/kt48394.kt"); + } + @TestMetadata("kt5493.kt") public void testKt5493() throws Exception { runTest("compiler/testData/codegen/box/boxingOptimization/kt5493.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 16f7dfb0456..0295fca6b34 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 @@ -990,6 +990,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/boxingOptimization/kt46859.kt"); } + @TestMetadata("kt48394.kt") + public void testKt48394() throws Exception { + runTest("compiler/testData/codegen/box/boxingOptimization/kt48394.kt"); + } + @TestMetadata("kt5493.kt") public void testKt5493() throws Exception { runTest("compiler/testData/codegen/box/boxingOptimization/kt5493.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 79d2d27bb3a..4dfa86b7696 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 @@ -990,6 +990,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/boxingOptimization/kt46859.kt"); } + @TestMetadata("kt48394.kt") + public void testKt48394() throws Exception { + runTest("compiler/testData/codegen/box/boxingOptimization/kt48394.kt"); + } + @TestMetadata("kt5493.kt") public void testKt5493() throws Exception { runTest("compiler/testData/codegen/box/boxingOptimization/kt5493.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 cd1148e8b56..0c0d7c0e5e7 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 @@ -990,6 +990,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/boxingOptimization/kt46859.kt"); } + @TestMetadata("kt48394.kt") + public void testKt48394() throws Exception { + runTest("compiler/testData/codegen/box/boxingOptimization/kt48394.kt"); + } + @TestMetadata("kt5493.kt") public void testKt5493() throws Exception { runTest("compiler/testData/codegen/box/boxingOptimization/kt5493.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 37833c62cb8..795849fbcb7 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 @@ -875,6 +875,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/boxingOptimization/kt46859.kt"); } + @TestMetadata("kt48394.kt") + public void testKt48394() throws Exception { + runTest("compiler/testData/codegen/box/boxingOptimization/kt48394.kt"); + } + @TestMetadata("kt5588.kt") public void testKt5588() throws Exception { runTest("compiler/testData/codegen/box/boxingOptimization/kt5588.kt");