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
@@ -0,0 +1,10 @@
fun foo(x: Int): String {
return when (x) {
2_147_483_647 -> "MAX"
-2_147_483_648 -> "MIN"
else -> "else"
}
}
// 1 LOOKUPSWITCH
// 0 TABLESWITCH
@@ -0,0 +1,19 @@
fun foo(x: Int): Int {
return when (x) {
1, 1, 2 -> 1001
1, 2 -> 1002
1 -> 1003
2 -> 1004
3 -> 1005
else -> 1006
}
}
// 1 SIPUSH 1001
// 0 SIPUSH 1002
// 0 SIPUSH 1003
// 0 SIPUSH 1004
// 1 SIPUSH 1005
// 1 SIPUSH 1006
// 1 TABLESWITCH
// 0 LOOKUPSWITCH