JVM_IR: Optimize null checks.

Introduce lowering to remove null checks for primitive type
expressions and replace them with true/false. Side-effects
are preserved.

Generate ifnull/ifnonnull instructions for null checks instead
of materializing a null literal for an equality check.
This commit is contained in:
Mads Ager
2019-01-11 13:56:11 +01:00
committed by Mikhael Bogdanov
parent f5312f42c5
commit 690b8e0ac9
35 changed files with 240 additions and 106 deletions
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun box(): String {
230?.hashCode()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun box(): String {
var result = 0
if (1 == 1) {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun returningBoxed() : Int? = 1
fun acceptingBoxed(x : Int?) : Int ? = x
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun main(p: String?) {
if (!(p == null)) {
"then"
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun main(p: String?) {
if (p == null) {
"then"
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
class A
fun foo(x: Any?) {}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun box() {
val x: Any? = "abc"
val y: Any? = if (1 == 1) x else "cde"
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
class A
fun box() {
val x: A? = A()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
class A
fun box() {
val x: A? = A()
@@ -1,5 +1,4 @@
// !LANGUAGE: +ProperIeee754Comparisons
// IGNORE_BACKEND: JVM_IR
fun equals5(a: Any?, b: Any?) = if (a is Double && b is Double?) a == b else null!!
fun equals6(a: Any?, b: Any?) = if (a is Double? && b is Double) a == b else null!!
@@ -1,5 +1,4 @@
// !LANGUAGE: +ProperIeee754Comparisons
// IGNORE_BACKEND: JVM_IR
fun equals5(a: Any?, b: Any?) = if (a is Float && b is Float?) a == b else null!!
fun equals6(a: Any?, b: Any?) = if (a is Float? && b is Float) a == b else null!!
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
val a : Int? = 10
fun foo() = a!!.toString()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test(x: String?) {
if (x == null) return
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test1() {
val a = null
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test1() {
val a = Unit
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test() {
val value = System.getProperty("key")
if (value != null) {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun almostAlwaysTrue() = true
fun runNoInline(f: () -> Unit) = f()
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
fun test() {
lateinit var z: String
run {
@@ -0,0 +1,18 @@
fun f() : Int {
return 42
}
fun box(): String {
if (f() == null) {
return "fail 1"
}
if (f() != null) {
return "OK"
}
return "fail 2"
}
// 0 IF
// 0 ACONST_NULL
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun findUserId(username: String): Long? = null
fun main(args: Array<String>) {