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
@@ -24625,6 +24625,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
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");
@@ -24755,6 +24760,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
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");
@@ -24925,6 +24935,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
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");