KT-15862 Inline generic functions can unexpectedly box primitives
Previous version of the boxing/unboxing analysis treated merging boxed and non-boxed values as a hazard.
If such merged values are not used (e.g., early return + local variables reused in inlined calls),
corresponding boxing/unboxing operations still can be optimized out.
All information related to boxed value usage by instructions is moved to 'BoxedValueDescriptor'.
Introduce "tainted" (and "clean") boxed values, with the following rules:
merge(B, B) = B, if unboxed types are compatible,
T, otherwise
merge(B, X) = T
merge(T, X) = T
where
X is a non-boxed value,
B is a "clean" boxed value,
T is a "tainted" boxed value.
Postpone decision about value merge hazards until a "tainted" value is used.
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
// Just make sure there's no VerifyError
|
||||
|
||||
fun getOrElse() =
|
||||
mapOf<String, Int>().getOrElse("foo") { 3 }
|
||||
|
||||
fun isNotEmpty(l: ArrayList<Int>) =
|
||||
l.iterator()?.hasNext() ?: false
|
||||
|
||||
fun box() = "OK"
|
||||
Reference in New Issue
Block a user