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
@@ -0,0 +1,16 @@
// WITH_RUNTIME
// IGNORE_BACKEND: JS_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)
)
}
fun box(): String {
if (foo().any { it == true })
return "fail: ${foo().contentDeepToString()}"
return "OK"
}
@@ -0,0 +1,23 @@
// WITH_RUNTIME
// IGNORE_BACKEND: JS_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
)
}
fun box(): String {
if (foo().any { it == false })
return "fail: ${foo().contentDeepToString()}"
return "OK"
}
@@ -0,0 +1,25 @@
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS
// reason - no error from division by zero in JS
fun expectArithmeticException(f: () -> Unit): Boolean {
try {
f()
} catch (e: ArithmeticException) {
return true
}
return false
}
fun box(): String {
if (!expectArithmeticException { 1 / 0 })
return "fail: 1 / 0 didn't throw exception"
if (!expectArithmeticException { 1 * 2 / 0 })
return "fail: 1 * 2 / 0 didn't throw exception"
if (!expectArithmeticException { 1 * (2 / 0) })
return "fail: 1 * (2 / 0) didn't throw exception"
return "OK"
}