34878d17eb
1. if an argument of a `pop` cannot be removed, then all other potential arguments of that `pop` can't be removed either, and the same applies to other `pop`s that touch them; 2. the same is true for primitive conversions, but this is even trickier to implement correctly, so I simply did the same thing as with boxing operators: replace the conversion itself with a `pop` and keep the argument as-is. Somehow this actually removes *more* redundant primitive type conversions than the old code in a couple bytecode text tests, so I've patched them to kind of use the value, forcing the instructions to stay. #KT-46921 Fixed
13 lines
381 B
Kotlin
Vendored
13 lines
381 B
Kotlin
Vendored
// TARGET_BACKEND: JVM
|
|
// FILE: I.java
|
|
public interface I<T> {
|
|
public T create();
|
|
}
|
|
|
|
// FILE: box.kt
|
|
// A specific bytecode pattern here may confuse POP propagation.
|
|
inline fun <reified T, V : Any> I<V>.bar(default: T, crossinline baz: V.(T) -> T) =
|
|
u@{ it: Any? -> create().baz(it as? T ?: return@u default) }
|
|
|
|
fun box() = I<String> { "O" }.bar("fail") { this + it }("K")
|