Implement constant folding in the IR backend for JVM

The newly added pass folds the set of constant functions of the
current backend, plus IrBuiltIns.
This commit is contained in:
Ting-Yuan Huang
2019-02-07 16:12:28 -08:00
committed by max-kammerer
parent 7e4d33be24
commit 79fcaae991
28 changed files with 576 additions and 7 deletions
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
val a: Byte = 1 + 10
// 1 BIPUSH 11
@@ -0,0 +1,22 @@
// TARGET_BACKEND: JVM_IR
fun foo(): Array<Boolean> {
return arrayOf(
0.0 / 0 == 0.0 / 0,
0.0F > -0.0F,
0.0.equals(-0.0),
(0.0 / 0.0).equals(1.0 / 0.0)
)
}
// Disabled: current backend doesn't fold them.
// 4 INVOKESTATIC
// 4 INVOKESTATIC java/lang/Boolean.valueOf
// 1 ICONST_1
// 5 ICONST_0
// 0 IFEQ
// 0 IFNE
// 0 IFGE
// 0 IFGT
// 0 IFLE
// 0 IFLT
@@ -0,0 +1,29 @@
// TARGET_BACKEND: JVM_IR
fun foo(): Array<Boolean> {
return arrayOf(
19 < 20.0,
12 > 11,
3.0F <= 4.0,
4.0F >= 4,
0.0 / 0 != 0.0 / 0,
0.0 == -0.0,
123 == 123,
123L == 123L,
0.0F == -0.0F,
0.0.compareTo(-0.0) > 0,
(0.0 / 0.0).compareTo(1.0 / 0.0) > 0
)
}
// Disabled because the current backend doesn't fold them.
// 11 INVOKESTATIC
// 11 INVOKESTATIC java/lang/Boolean.valueOf
// 1 ICONST_0
// 12 ICONST_1
// 0 IFEQ
// 0 IFNE
// 0 IFGE
// 0 IFGT
// 0 IFLE
// 0 IFLT
@@ -0,0 +1,16 @@
val a = 1.0 + 10
val b = 2 + 10.0
val c = 3.0F + 10
val d = 4 + 10.0F
val e = 1.0 / 0
val f = 1 / 0.0
val g = 0.0 / 0
val h = 0 / 0.0
val i = 0.0 / 0.0
// 1 LDC 11.0
// 1 LDC 12.0
// 1 LDC 13.0
// 1 LDC 14.0
// 2 LDC Infinity
// 3 LDC NaN
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun box(): String {
val z = 1;
return "O" + "K".toString() + z
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
val a: Short = 1 + 255
// 1 SIPUSH 256
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun box(): String {
return "O" + "K".toString() + 1.toLong()
}