Files
kotlin-fork/compiler/testData/codegen/box/boxingOptimization/boxedIntegersCmp.kt
T
Dmitry Petrov e1b41eee15 Specialize Comparable#compareTo for boxed primitives
Support Comparable#compareTo for boxed primitive in redundant
boxing/unboxing analysis, along with CHECKCAST to java.lang.Comparable.

Note that we can do that for Float and Double, too, because
Float#compareTo(Float) and Double#compareTo(Double) are delegated to
Float#compare(float, float) and Double#compare(double, double),
respectively.

Fuse specialized comparison for integers with conditional jumps
if possible (both for Comparable#compareTo and Intrinsics#areEqual).

 #KT-11959 Fixed
2017-05-22 11:57:20 +03:00

46 lines
1.3 KiB
Kotlin
Vendored

inline fun ltx(a: Comparable<Any>, b: Any) = a < b
inline fun lex(a: Comparable<Any>, b: Any) = a <= b
inline fun gex(a: Comparable<Any>, b: Any) = a >= b
inline fun gtx(a: Comparable<Any>, b: Any) = a > b
inline fun lt(a: Any, b: Any) = ltx(a as Comparable<Any>, b)
inline fun le(a: Any, b: Any) = lex(a as Comparable<Any>, b)
inline fun ge(a: Any, b: Any) = gex(a as Comparable<Any>, b)
inline fun gt(a: Any, b: Any) = gtx(a as Comparable<Any>, b)
val ONE = 1
val ONEL = 1L
fun box(): String {
return when {
!lt(ONE, 42) -> "Fail 1 LT"
lt(42, ONE) -> "Fail 2 LT"
!le(ONE, 42) -> "Fail 1 LE"
le(42, ONE) -> "Fail 2 LE"
!le(1, ONE) -> "Fail 3 LE"
!ge(42, ONE) -> "Fail 1 GE"
ge(ONE, 42) -> "Fail 2 GE"
!ge(1, ONE) -> "Fail 3 GE"
gt(ONE, 42) -> "Fail 1 GT"
!gt(42, ONE) -> "Fail 2 GT"
!lt(ONEL, 42L) -> "Fail 1 LT L"
lt(42L, ONEL) -> "Fail 2 LT L"
!le(ONEL, 42L) -> "Fail 1 LE L"
le(42L, ONEL) -> "Fail 2 LE L"
!le(ONEL, 1L) -> "Fail 3 LE L"
!ge(42L, ONEL) -> "Fail 1 GE L"
ge(ONEL, 42L) -> "Fail 2 GE L"
!ge(ONEL, 1L) -> "Fail 3 GE L"
gt(ONEL, 42L) -> "Fail 1 GT L"
!gt(42L, ONEL) -> "Fail 2 GT L"
else -> "OK"
}
}