KJS IR: Fix KT-45738 - Consider recursive checkForPrimitiveOrPattern
Recursive results from checkForPrimitiveOrPattern were ignored. If it found a case/condition that could not be optimized the resulting "false" was not propagated. This would lead to a "optimized" when without all conditions. - see KT-45738 - The return is now lifted out of the when to make it more obvious what is going on. - New test for mixed multiple conditions in when
This commit is contained in:
+6
@@ -41640,6 +41640,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("switchOptimizationMultipleMixedConditions.kt")
|
||||
public void testSwitchOptimizationMultipleMixedConditions() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleMixedConditions.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("switchOptimizationSingleStatementCase.kt")
|
||||
public void testSwitchOptimizationSingleStatementCase() throws Exception {
|
||||
|
||||
+8
-7
@@ -69,16 +69,17 @@ class SwitchOptimizer(private val context: JsGenerationContext, private val last
|
||||
if (constExpr !is IrConst<*>) return false
|
||||
if (!constExpr.isTrueConstant()) return false
|
||||
|
||||
when (branchExpr) {
|
||||
return when (branchExpr) {
|
||||
is IrWhen -> checkForPrimitiveOrPattern(branchExpr, constants)
|
||||
is IrCall -> {
|
||||
val constant = tryToExtractEqeqeqConst(branchExpr) ?: return false
|
||||
constants += constant
|
||||
is IrCall -> when (val constant = tryToExtractEqeqeqConst(branchExpr)) {
|
||||
null -> false
|
||||
else -> {
|
||||
constants += constant
|
||||
true
|
||||
}
|
||||
}
|
||||
else -> return false
|
||||
else -> false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
if (!checkBranchIsOrPattern(thenBranch.result, thenBranch.condition)) return false
|
||||
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
private fun parse(text: String) = when (text) {
|
||||
Numbers.One.name, "one", "1" -> 1
|
||||
Numbers.Two.name, "two", "2" -> 2
|
||||
else -> -1
|
||||
}
|
||||
|
||||
enum class Numbers {
|
||||
One,
|
||||
Two,
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
|
||||
val oneParsed = parse("one")
|
||||
if (oneParsed != 1) return "'one' should map to '1' but was $oneParsed"
|
||||
|
||||
val OneParsed = parse("One")
|
||||
if (OneParsed != 1) return "'One' should map to '1' but was $OneParsed"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+6
@@ -41616,6 +41616,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("switchOptimizationMultipleMixedConditions.kt")
|
||||
public void testSwitchOptimizationMultipleMixedConditions() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleMixedConditions.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("switchOptimizationSingleStatementCase.kt")
|
||||
public void testSwitchOptimizationSingleStatementCase() throws Exception {
|
||||
|
||||
+6
@@ -41640,6 +41640,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("switchOptimizationMultipleMixedConditions.kt")
|
||||
public void testSwitchOptimizationMultipleMixedConditions() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleMixedConditions.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("switchOptimizationSingleStatementCase.kt")
|
||||
public void testSwitchOptimizationSingleStatementCase() throws Exception {
|
||||
|
||||
+5
@@ -33494,6 +33494,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationMultipleMixedConditions.kt")
|
||||
public void testSwitchOptimizationMultipleMixedConditions() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleMixedConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationSingleStatementCase.kt")
|
||||
public void testSwitchOptimizationSingleStatementCase() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationSingleStatementCase.kt");
|
||||
|
||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
Generated
+5
@@ -28124,6 +28124,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationMultipleMixedConditions.kt")
|
||||
public void testSwitchOptimizationMultipleMixedConditions() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleMixedConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationSingleStatementCase.kt")
|
||||
public void testSwitchOptimizationSingleStatementCase() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationSingleStatementCase.kt");
|
||||
|
||||
Generated
+5
@@ -27535,6 +27535,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationMultipleMixedConditions.kt")
|
||||
public void testSwitchOptimizationMultipleMixedConditions() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleMixedConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationSingleStatementCase.kt")
|
||||
public void testSwitchOptimizationSingleStatementCase() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationSingleStatementCase.kt");
|
||||
|
||||
Generated
+5
@@ -27495,6 +27495,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationMultipleMixedConditions.kt")
|
||||
public void testSwitchOptimizationMultipleMixedConditions() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleMixedConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationSingleStatementCase.kt")
|
||||
public void testSwitchOptimizationSingleStatementCase() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationSingleStatementCase.kt");
|
||||
|
||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java
Generated
+5
@@ -15568,6 +15568,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationDuplicates.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationMultipleMixedConditions.kt")
|
||||
public void testSwitchOptimizationMultipleMixedConditions() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleMixedConditions.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOptimizationSingleStatementCase.kt")
|
||||
public void testSwitchOptimizationSingleStatementCase() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/when/switchOptimizationSingleStatementCase.kt");
|
||||
|
||||
Reference in New Issue
Block a user