when: emit lookupswitch/tableswitch if possible

A lookupswitch or tableswitch can be used if all conditions are equality
checks to constants. To be more specific, it can be done if:
  1. All conditions are CALL 'EQEQ(Any?, Any?)': Boolean
  2. All types of variables involved in comparison are in the same group
     of Char/Byte/Short/Int, String or enum.
  3. All arg0 refer to the same value.
  4. All arg1 are IrConst<*>.

Change-Id: Ifd7cb618395f6c5cc64601018b446f0bb7f5891c
This commit is contained in:
Ting-Yuan Huang
2019-02-18 01:48:54 -08:00
committed by max-kammerer
parent f5d0a38629
commit c1d721a15f
10 changed files with 249 additions and 11 deletions
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val A = 10
private const val B = 20
@@ -0,0 +1,11 @@
fun foo(x: Int): String {
return when (x) {
100 -> "1"
200 -> "2"
300 -> "3"
else -> "else"
}
}
// 1 LOOKUPSWITCH
// 0 TABLESWITCH
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
object Constants {
const val A = 30
const val B = 40
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val A = 10
private const val B = 20
@@ -0,0 +1,11 @@
fun foo(x: Int): String {
return when (x) {
101 -> "1"
102 -> "2"
103 -> "3"
else -> "else"
}
}
// 0 LOOKUPSWITCH
// 1 TABLESWITCH