diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java index 8bae7592882..a2e331ecaa3 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java @@ -2494,6 +2494,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java index b523a4a93b0..0920ea54938 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java @@ -2494,6 +2494,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 160cb98be3b..d29949196f7 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -2489,6 +2489,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index 7dce1d42e18..11036f737af 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -2489,6 +2489,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index c7686a08e03..18571faaa7a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -2489,6 +2489,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt index 2e55986f1ea..f566d61a209 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt @@ -224,6 +224,8 @@ class WasmSymbols( symbolTable.descriptorExtension.referenceSimpleFunction(it) } + val getBoxedBoolean: IrSimpleFunctionSymbol = getInternalFunction("getBoxedBoolean") + val boxBoolean: IrSimpleFunctionSymbol = getInternalFunction("boxBoolean") val boxIntrinsic: IrSimpleFunctionSymbol = getInternalFunction("boxIntrinsic") val unboxIntrinsic: IrSimpleFunctionSymbol = getInternalFunction("unboxIntrinsic") diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/WasmUsefulDeclarationProcessor.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/WasmUsefulDeclarationProcessor.kt index 43dadecf809..0b4f457e7c9 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/WasmUsefulDeclarationProcessor.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/WasmUsefulDeclarationProcessor.kt @@ -78,12 +78,23 @@ internal class WasmUsefulDeclarationProcessor( context.wasmSymbols.wasmTypeId, context.wasmSymbols.refCastNull, context.wasmSymbols.refTest, - context.wasmSymbols.boxIntrinsic, context.wasmSymbols.wasmArrayCopy -> { call.getTypeArgument(0)?.enqueueRuntimeClassOrAny(from, "intrinsic ${call.symbol.owner.name}") true } - + context.wasmSymbols.boxIntrinsic -> { + val type = call.getTypeArgument(0)!! + if (type == context.irBuiltIns.booleanType) { + context.wasmSymbols.getBoxedBoolean.owner.enqueue(from, "intrinsic boxIntrinsic") + } else { + type.enqueueRuntimeClassOrAny(from, "intrinsic boxIntrinsic") + } + true + } + context.wasmSymbols.boxBoolean -> { + context.irBuiltIns.booleanType.enqueueRuntimeClassOrAny(from, "intrinsic boxBoolean") + true + } else -> false } diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt index fa20a49ca08..e37d25bf1b0 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt @@ -377,8 +377,18 @@ class BodyGenerator( // Box intrinsic has an additional klass ID argument. // Processing it separately + if (call.symbol == wasmSymbols.boxBoolean) { + generateBox(call.getValueArgument(0)!!, irBuiltIns.booleanType) + return + } if (call.symbol == wasmSymbols.boxIntrinsic) { - generateBox(call.getValueArgument(0)!!, call.getTypeArgument(0)!!) + val type = call.getTypeArgument(0)!! + if (type == irBuiltIns.booleanType) { + generateExpression(call.getValueArgument(0)!!) + body.buildCall(context.referenceFunction(context.backendContext.wasmSymbols.getBoxedBoolean), location) + } else { + generateBox(call.getValueArgument(0)!!, type) + } return } diff --git a/compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt b/compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt new file mode 100644 index 00000000000..4890bfb2893 --- /dev/null +++ b/compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt @@ -0,0 +1,13 @@ +fun boxBoolean(b: Boolean): Any = b + +fun box(): String { + if (boxBoolean(true) !== boxBoolean(true)) return "FAIL1" + if (boxBoolean(false) !== boxBoolean(false)) return "FAIL2" + if (boxBoolean(true) === boxBoolean(false)) return "FAIL3" + if (boxBoolean(false) === boxBoolean(true)) return "FAIL4" + if (boxBoolean(true) != boxBoolean(true)) return "FAIL5" + if (boxBoolean(false) != boxBoolean(false)) return "FAIL6" + if (boxBoolean(true) == boxBoolean(false)) return "FAIL7" + if (boxBoolean(false) == boxBoolean(true)) return "FAIL8" + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/primitiveTypes/kt36952_identityEqualsWithBooleanInLocalFunction.kt b/compiler/testData/codegen/box/primitiveTypes/kt36952_identityEqualsWithBooleanInLocalFunction.kt index 0f92fc19cc5..262c6c5d696 100644 --- a/compiler/testData/codegen/box/primitiveTypes/kt36952_identityEqualsWithBooleanInLocalFunction.kt +++ b/compiler/testData/codegen/box/primitiveTypes/kt36952_identityEqualsWithBooleanInLocalFunction.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: WASM - fun box(): String { fun a(a: Any) = a === 1.1 is Double return if (a(true)) "OK" else "Fail" diff --git a/compiler/testData/debug/stepping/callableReference.kt b/compiler/testData/debug/stepping/callableReference.kt index 6e8c53114ff..b5d2564dafc 100644 --- a/compiler/testData/debug/stepping/callableReference.kt +++ b/compiler/testData/debug/stepping/callableReference.kt @@ -39,9 +39,19 @@ fun f(block: () -> Unit) { // EXPECTATIONS WASM // test.kt:1 $box -// test.kt:4 $box (12, 4) +// test.kt:4 $box (12, 12, 4) +// Runtime.kt:70 $kotlin.wasm.internal.getBoxedBoolean (8, 8) +// Runtime.kt:73 $kotlin.wasm.internal.getBoxedBoolean (8, 35) +// Standard.kt:71 $kotlin.wasm.internal.getBoxedBoolean (0, 0, 0, 0) +// Standard.kt:95 $kotlin.wasm.internal.getBoxedBoolean (4, 4) +// Standard.kt:98 $kotlin.wasm.internal.getBoxedBoolean (4, 10, 4, 4, 10, 4) +// Standard.kt:74 $kotlin.wasm.internal.getBoxedBoolean (15, 7) +// Standard.kt:99 $kotlin.wasm.internal.getBoxedBoolean (11, 4, 11, 4) +// Runtime.kt:74 $kotlin.wasm.internal.getBoxedBoolean (5, 5) // test.kt:5 $box (6, 6, 4) // test.kt:11 $f -// test.kt:6 $box$lambda.invoke (8, 12, 12, 12, 12, 8, 16) +// test.kt:6 $box$lambda.invoke (8, 12, 8, 16) +// Runtime.kt:71 $kotlin.wasm.internal.getBoxedBoolean (8, 33) +// Standard.kt:68 $kotlin.wasm.internal.getBoxedBoolean (25, 25, 25, 25, 45, 38) // test.kt:12 $f // test.kt:8 $box diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java index 6c92c57acb0..00a89d53ca0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java @@ -2489,6 +2489,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { 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 e797a721761..9d518b5ff73 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 @@ -2297,6 +2297,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { 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 cc98722de1c..000f1395eac 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 @@ -2489,6 +2489,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index fc394053f3e..2dd450936d5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -2489,6 +2489,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java index 8ef9ae2cb1e..3ee53c841b7 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java @@ -2489,6 +2489,12 @@ public class FirBlackBoxCodegenTestWithInlineScopesGenerated extends AbstractFir KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index d5d8c7cbeff..8cc6b4712ec 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2186,6 +2186,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { runTest("compiler/testData/codegen/box/boxingOptimization/boxedIntegersCmp.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index 93d9887f408..4b8b18ffa12 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -1643,6 +1643,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenBoxTestGenerated.java index 5acb397529a..acccb5257db 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenBoxTestGenerated.java @@ -1643,6 +1643,12 @@ public class FirJsES6CodegenBoxTestGenerated extends AbstractFirJsES6CodegenBoxT KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index ebe39f4db99..dd4cdbfd3ff 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -1643,6 +1643,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index 55614a81a77..fa0c124cdf3 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -1643,6 +1643,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt index 227cb121f1d..79a7b673a65 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt @@ -63,6 +63,20 @@ internal fun nullableDoubleIeee754Equals(lhs: Double?, rhs: Double?): Boolean { return wasm_f64_eq(lhs, rhs) } +private var TRUE: Boolean? = null +private var FALSE: Boolean? = null + +internal fun getBoxedBoolean(x: Boolean): Boolean? = + if (x) { + TRUE ?: boxBoolean(true).also { TRUE = it } + } else { + FALSE ?: boxBoolean(false).also { FALSE = it } + } + +@ExcludedFromCodegen +internal fun boxBoolean(x: Boolean): Boolean? = + implementedAsIntrinsic + @ExcludedFromCodegen internal fun boxIntrinsic(x: T): R = implementedAsIntrinsic diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenBoxTestGenerated.java index 19f1094338b..bab2dc42b31 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenBoxTestGenerated.java @@ -1723,6 +1723,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenBoxTestNoPLGenerated.java index bf160b7d06e..9372a194325 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenBoxTestNoPLGenerated.java @@ -1771,6 +1771,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenBoxTestGenerated.java index f07ddc44a44..916c0e13066 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenBoxTestGenerated.java @@ -1675,6 +1675,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenBoxTestNoPLGenerated.java index 7eb9950c050..8288223f37f 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenBoxTestNoPLGenerated.java @@ -1724,6 +1724,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsCodegenBoxTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsCodegenBoxTestGenerated.java index ec69900e0f4..b68a70f39e4 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsCodegenBoxTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmJsCodegenBoxTestGenerated.java @@ -1643,6 +1643,12 @@ public class FirWasmJsCodegenBoxTestGenerated extends AbstractFirWasmJsCodegenBo KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenBoxTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenBoxTestGenerated.java index e760cd727b1..843e2fa4bc8 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenBoxTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenBoxTestGenerated.java @@ -1643,6 +1643,12 @@ public class K1WasmCodegenBoxTestGenerated extends AbstractK1WasmCodegenBoxTest KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/boxingOptimization"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true); } + @Test + @TestMetadata("boxedBooleanIdentity.kt") + public void testBoxedBooleanIdentity() { + runTest("compiler/testData/codegen/box/boxingOptimization/boxedBooleanIdentity.kt"); + } + @Test @TestMetadata("boxedIntegersCmp.kt") public void testBoxedIntegersCmp() {