JVM: remove CHECKCAST handling from PopBackwardPropagationTransformer

Redundant CHECKCASTs should've been removed by a previous pass.
This commit is contained in:
pyos
2021-05-26 14:24:42 +02:00
committed by Alexander Udalov
parent 535934dc28
commit 2f60ce21a0
@@ -60,7 +60,7 @@ class PopBackwardPropagationTransformer : MethodTransformer() {
if (insn.opcode == Opcodes.POP && frames[i] != null) { if (insn.opcode == Opcodes.POP && frames[i] != null) {
val inputTop = getInputTop(insn) val inputTop = getInputTop(insn)
val sources = inputTop.insns val sources = inputTop.insns
if (sources.all { !isDontTouch(it) } && sources.any { isTransformablePopOperand(it) }) { if (sources.none { isDontTouch(it) } && sources.any { isTransformablePopOperand(it) }) {
transformations[insn] = REPLACE_WITH_NOP transformations[insn] = REPLACE_WITH_NOP
sources.forEach { propagatePopBackwards(it, inputTop.size) } sources.forEach { propagatePopBackwards(it, inputTop.size) }
} }
@@ -122,7 +122,7 @@ class PopBackwardPropagationTransformer : MethodTransformer() {
} }
override fun unaryOperation(insn: AbstractInsnNode, value: SourceValue): SourceValue { override fun unaryOperation(insn: AbstractInsnNode, value: SourceValue): SourceValue {
if (insn.opcode != Opcodes.CHECKCAST && !insn.isPrimitiveTypeConversion()) { if (!insn.isPrimitiveTypeConversion()) {
value.insns.markAsDontTouch() value.insns.markAsDontTouch()
} }
return super.unaryOperation(insn, value) return super.unaryOperation(insn, value)
@@ -157,30 +157,16 @@ class PopBackwardPropagationTransformer : MethodTransformer() {
if (transformations.containsKey(insn)) return if (transformations.containsKey(insn)) return
when { when {
insn.opcode == Opcodes.CHECKCAST -> { insn.isPrimitiveBoxing() ->
val inputTop = getInputTop(insn)
val sources = inputTop.insns
val resultType = (insn as TypeInsnNode).desc
if (sources.all { !isDontTouch(it) } && sources.any { isTransformableCheckcastOperand(it, resultType) }) {
transformations[insn] = REPLACE_WITH_NOP
sources.forEach { propagatePopBackwards(it, inputTop.size) }
} else {
transformations[insn] = insertPopAfterTransformation(poppedValueSize)
}
}
insn.isPrimitiveBoxing() -> {
transformations[insn] = replaceWithPopTransformation(getInputTop(insn).size) transformations[insn] = replaceWithPopTransformation(getInputTop(insn).size)
}
insn.isPurePush() -> { insn.isPurePush() ->
transformations[insn] = REPLACE_WITH_NOP transformations[insn] = REPLACE_WITH_NOP
}
insn.isPrimitiveTypeConversion() -> { insn.isPrimitiveTypeConversion() -> {
val inputTop = getInputTop(insn) val inputTop = getInputTop(insn)
val sources = inputTop.insns val sources = inputTop.insns
if (sources.all { !isDontTouch(it) }) { if (sources.none { isDontTouch(it) }) {
transformations[insn] = REPLACE_WITH_NOP transformations[insn] = REPLACE_WITH_NOP
sources.forEach { propagatePopBackwards(it, inputTop.size) } sources.forEach { propagatePopBackwards(it, inputTop.size) }
} else { } else {
@@ -188,9 +174,8 @@ class PopBackwardPropagationTransformer : MethodTransformer() {
} }
} }
else -> { else ->
transformations[insn] = insertPopAfterTransformation(poppedValueSize) transformations[insn] = insertPopAfterTransformation(poppedValueSize)
}
} }
} }
@@ -214,11 +199,8 @@ class PopBackwardPropagationTransformer : MethodTransformer() {
return frame.top() ?: throw AssertionError("Instruction #$i has empty stack on input") return frame.top() ?: throw AssertionError("Instruction #$i has empty stack on input")
} }
private fun isTransformableCheckcastOperand(it: AbstractInsnNode, resultType: String) =
it.isPrimitiveBoxing() && (it as MethodInsnNode).owner == resultType
private fun isTransformablePopOperand(insn: AbstractInsnNode) = private fun isTransformablePopOperand(insn: AbstractInsnNode) =
insn.opcode == Opcodes.CHECKCAST || insn.isPrimitiveBoxing() || insn.isPurePush() insn.isPrimitiveBoxing() || insn.isPurePush()
private fun isDontTouch(insn: AbstractInsnNode) = private fun isDontTouch(insn: AbstractInsnNode) =
dontTouchInsnIndices[insnList.indexOf(insn)] dontTouchInsnIndices[insnList.indexOf(insn)]