Generate complex equality comparison only when RHS can have side effects

In "short" version, LHS is always evaluated before RHS,
and RHS may be not evaluated if LHS is null.
So, it makes sense to use "short" version in cases when RHS can't have
side effects (because of more compact bytecode and more opportunities
for code elimination).
This commit is contained in:
Dmitry Petrov
2017-07-14 09:20:28 +03:00
parent 8aacddb9f0
commit 81609e4c6f
2 changed files with 10 additions and 2 deletions
@@ -17,10 +17,18 @@ inline fun evaluateAndCheckOrder(marker: String, expectedValue: Boolean, expecte
if (order != expectedOrder) throw AssertionError("$marker, order: Expected: '$expectedOrder', actual: '$order'")
}
val nn: Int? = null
fun box(): String {
evaluateAndCheckOrder("1", true, "ab") { a(1) == b(1) }
evaluateAndCheckOrder("2", true, "ab") { a(1) != b(2) }
evaluateAndCheckOrder("3", true, "ab") { !(a(1) == b(2)) }
evaluateAndCheckOrder("4", true, "ab") { !(a(1) != b(1)) }
evaluateAndCheckOrder("null == 1", false, "a") { nn == a(1) }
evaluateAndCheckOrder("null != 1", true, "a") { nn != a(1) }
evaluateAndCheckOrder("!(null == 1)", true, "a") { !(nn == a(1)) }
evaluateAndCheckOrder("!(null != 1)", false, "a") { !(nn != a(1)) }
return "OK"
}