diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/StackPeepholeOptimizationsTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/StackPeepholeOptimizationsTransformer.kt index 1eeb1c532b3..18fd1923152 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/StackPeepholeOptimizationsTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/StackPeepholeOptimizationsTransformer.kt @@ -19,14 +19,12 @@ package org.jetbrains.kotlin.codegen.optimization.boxing import org.jetbrains.kotlin.codegen.optimization.common.findPreviousOrNull import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer import org.jetbrains.org.objectweb.asm.Opcodes -import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode -import org.jetbrains.org.objectweb.asm.tree.InsnList -import org.jetbrains.org.objectweb.asm.tree.InsnNode -import org.jetbrains.org.objectweb.asm.tree.MethodNode +import org.jetbrains.org.objectweb.asm.tree.* class StackPeepholeOptimizationsTransformer : MethodTransformer() { override fun transform(internalClassName: String, methodNode: MethodNode) { - while (transformOnce(methodNode)) { + while (true) { + if (!transformOnce(methodNode)) break } } @@ -115,20 +113,26 @@ class StackPeepholeOptimizationsTransformer : MethodTransformer() { opcode == Opcodes.DUP private fun AbstractInsnNode.isPurePushOfSize1(): Boolean = - opcode in Opcodes.ACONST_NULL..Opcodes.FCONST_2 || - opcode in Opcodes.BIPUSH..Opcodes.ILOAD || - opcode == Opcodes.FLOAD || - opcode == Opcodes.ALOAD || - isUnitInstance() + !isLdcOfSize2() && ( + opcode in Opcodes.ACONST_NULL..Opcodes.FCONST_2 || + opcode in Opcodes.BIPUSH..Opcodes.ILOAD || + opcode == Opcodes.FLOAD || + opcode == Opcodes.ALOAD || + isUnitInstance() + ) private fun AbstractInsnNode.isEliminatedByPop2() = isPurePushOfSize2() || opcode == Opcodes.DUP2 private fun AbstractInsnNode.isPurePushOfSize2(): Boolean = - opcode == Opcodes.LCONST_0 || opcode == Opcodes.LCONST_1 || + isLdcOfSize2() || + opcode == Opcodes.LCONST_0 || opcode == Opcodes.LCONST_1 || opcode == Opcodes.DCONST_0 || opcode == Opcodes.DCONST_1 || opcode == Opcodes.LLOAD || opcode == Opcodes.DLOAD + + private fun AbstractInsnNode.isLdcOfSize2(): Boolean = + opcode == Opcodes.LDC && this is LdcInsnNode && (this.cst is Double || this.cst is Long) } 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 547481f8033..26ba83bde63 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 @@ -27998,6 +27998,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/primitiveTypes/kt446.kt"); } + @Test + @TestMetadata("kt46864_double.kt") + public void testKt46864_double() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt"); + } + + @Test + @TestMetadata("kt46864_long.kt") + public void testKt46864_long() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt"); + } + @Test @TestMetadata("kt518.kt") public void testKt518() throws Exception { diff --git a/compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt b/compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt new file mode 100644 index 00000000000..c5be3df73af --- /dev/null +++ b/compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt @@ -0,0 +1,5 @@ +fun box(): String { + // NB it's important that the following expression is unused + (40.523 !== 62.562) + return "OK" +} diff --git a/compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt b/compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt new file mode 100644 index 00000000000..236f233729e --- /dev/null +++ b/compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt @@ -0,0 +1,5 @@ +fun box(): String { + // NB it's important that the following expression is unused + (1234L !== 5678L) + return "OK" +} 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 f32b45c4e80..4ba9987f9b3 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 @@ -27968,6 +27968,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/primitiveTypes/kt446.kt"); } + @Test + @TestMetadata("kt46864_double.kt") + public void testKt46864_double() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt"); + } + + @Test + @TestMetadata("kt46864_long.kt") + public void testKt46864_long() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt"); + } + @Test @TestMetadata("kt518.kt") public void testKt518() 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 fd5b1a2989f..661b41a3f9a 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 @@ -27998,6 +27998,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/primitiveTypes/kt446.kt"); } + @Test + @TestMetadata("kt46864_double.kt") + public void testKt46864_double() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt"); + } + + @Test + @TestMetadata("kt46864_long.kt") + public void testKt46864_long() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt"); + } + @Test @TestMetadata("kt518.kt") public void testKt518() 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 8c72fa159b7..936133e31dd 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -23744,6 +23744,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/primitiveTypes/kt446.kt"); } + @TestMetadata("kt46864_double.kt") + public void testKt46864_double() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt"); + } + + @TestMetadata("kt46864_long.kt") + public void testKt46864_long() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt"); + } + @TestMetadata("kt518.kt") public void testKt518() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/kt518.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 f3bbad2ba51..bd5a4d0a625 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 @@ -18668,6 +18668,16 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/primitiveTypes/kt446.kt"); } + @TestMetadata("kt46864_double.kt") + public void testKt46864_double() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt"); + } + + @TestMetadata("kt46864_long.kt") + public void testKt46864_long() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt"); + } + @TestMetadata("kt518.kt") public void testKt518() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/kt518.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 2ce38035cab..992109e33ef 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 @@ -18074,6 +18074,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/primitiveTypes/kt446.kt"); } + @TestMetadata("kt46864_double.kt") + public void testKt46864_double() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt"); + } + + @TestMetadata("kt46864_long.kt") + public void testKt46864_long() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt"); + } + @TestMetadata("kt518.kt") public void testKt518() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/kt518.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 feb2bd587a6..7abb91bb6ba 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 @@ -18139,6 +18139,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/primitiveTypes/kt446.kt"); } + @TestMetadata("kt46864_double.kt") + public void testKt46864_double() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt"); + } + + @TestMetadata("kt46864_long.kt") + public void testKt46864_long() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt"); + } + @TestMetadata("kt518.kt") public void testKt518() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/kt518.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 11436ee02e0..d8154cf2c67 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 @@ -11475,6 +11475,16 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/primitiveTypes/kt446.kt"); } + @TestMetadata("kt46864_double.kt") + public void testKt46864_double() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_double.kt"); + } + + @TestMetadata("kt46864_long.kt") + public void testKt46864_long() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/kt46864_long.kt"); + } + @TestMetadata("kt518.kt") public void testKt518() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/kt518.kt");