JVM: be more careful when removing unused constants

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
This commit is contained in:
pyos
2021-05-26 15:10:45 +02:00
committed by Alexander Udalov
parent 2f60ce21a0
commit 34878d17eb
8 changed files with 113 additions and 118 deletions
+12
View File
@@ -0,0 +1,12 @@
// 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")