when: emit switch for String if possible

Effectively, the following when structure:

  when (s) {
    s1, s2 -> e1,
    s3 -> e2,
    s4 -> e3,
    ...
    else -> e
  }

is implemented as:

  when (s.hashCode()) {
    h1 -> {
      if (s == s1)
        e1
      else if (s == s2)
        e1
      else if (s == s3)
        e2
      else
        e
    }
    h2 -> if (s == s3) e2 else e,
    ...
    else -> e
  }

where s1.hashCode() == s2.hashCode() == s3.hashCode() == h1,
      s4.hashCode() == h2.

A tableswitch or lookupswitch is used for the hash code lookup.

Change-Id: I087bf623dbb4a41d3cc64399a1b42342a50757a6
This commit is contained in:
Ting-Yuan Huang
2019-03-07 17:26:58 -08:00
committed by max-kammerer
parent 1a9ed88be4
commit f6cf434650
22 changed files with 570 additions and 70 deletions
@@ -18990,6 +18990,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/when/callProperty.kt");
}
@TestMetadata("edgeCases.kt")
public void testEdgeCases() throws Exception {
runTest("compiler/testData/codegen/box/when/edgeCases.kt");
}
@TestMetadata("emptyWhen.kt")
public void testEmptyWhen() throws Exception {
runTest("compiler/testData/codegen/box/when/emptyWhen.kt");
@@ -19120,6 +19125,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/when/switchOptimizationDense.kt");
}
@TestMetadata("switchOptimizationDuplicates.kt")
public void testSwitchOptimizationDuplicates() throws Exception {
runTest("compiler/testData/codegen/box/when/switchOptimizationDuplicates.kt");
}
@TestMetadata("switchOptimizationMultipleConditions.kt")
public void testSwitchOptimizationMultipleConditions() throws Exception {
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
@@ -19290,6 +19300,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/when/stringOptimization/duplicatingItemsSameHashCode.kt");
}
@TestMetadata("duplicatingItemsSameHashCode2.kt")
public void testDuplicatingItemsSameHashCode2() throws Exception {
runTest("compiler/testData/codegen/box/when/stringOptimization/duplicatingItemsSameHashCode2.kt");
}
@TestMetadata("duplicatingItemsSameHashCode3.kt")
public void testDuplicatingItemsSameHashCode3() throws Exception {
runTest("compiler/testData/codegen/box/when/stringOptimization/duplicatingItemsSameHashCode3.kt");
}
@TestMetadata("expression.kt")
public void testExpression() throws Exception {
runTest("compiler/testData/codegen/box/when/stringOptimization/expression.kt");
@@ -20090,6 +20090,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/when/callProperty.kt");
}
@TestMetadata("edgeCases.kt")
public void testEdgeCases() throws Exception {
runTest("compiler/testData/codegen/box/when/edgeCases.kt");
}
@TestMetadata("emptyWhen.kt")
public void testEmptyWhen() throws Exception {
runTest("compiler/testData/codegen/box/when/emptyWhen.kt");
@@ -20220,6 +20225,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/when/switchOptimizationDense.kt");
}
@TestMetadata("switchOptimizationDuplicates.kt")
public void testSwitchOptimizationDuplicates() throws Exception {
runTest("compiler/testData/codegen/box/when/switchOptimizationDuplicates.kt");
}
@TestMetadata("switchOptimizationMultipleConditions.kt")
public void testSwitchOptimizationMultipleConditions() throws Exception {
runTest("compiler/testData/codegen/box/when/switchOptimizationMultipleConditions.kt");
@@ -20390,6 +20400,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/when/stringOptimization/duplicatingItemsSameHashCode.kt");
}
@TestMetadata("duplicatingItemsSameHashCode2.kt")
public void testDuplicatingItemsSameHashCode2() throws Exception {
runTest("compiler/testData/codegen/box/when/stringOptimization/duplicatingItemsSameHashCode2.kt");
}
@TestMetadata("duplicatingItemsSameHashCode3.kt")
public void testDuplicatingItemsSameHashCode3() throws Exception {
runTest("compiler/testData/codegen/box/when/stringOptimization/duplicatingItemsSameHashCode3.kt");
}
@TestMetadata("expression.kt")
public void testExpression() throws Exception {
runTest("compiler/testData/codegen/box/when/stringOptimization/expression.kt");