[IR] Fix performance regression

Signed-off-by: Evgeniy.Zhelenskiy <Evgeniy.Zhelenskiy@jetbrains.com>

#KT-1179
This commit is contained in:
Evgeniy.Zhelenskiy
2022-10-11 17:47:54 +02:00
committed by Space Team
parent 51e76aa19a
commit b45f2baff5
@@ -201,7 +201,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
else -> when (val lastExpression = expression.statements.lastOrNull()) { else -> when (val lastExpression = expression.statements.lastOrNull()) {
is IrExpression -> irContainer(expression) { is IrExpression -> irContainer(expression) {
val inner = handleSavedExpression(lastExpression, handler) ?: return null val inner = handleSavedExpression(lastExpression, handler) ?: return null
for (oldStatement in expression.statements.dropLast(1)) { for (oldStatement in expression.statements.subListWithoutLast(1)) {
+oldStatement +oldStatement
} }
+inner +inner
@@ -227,7 +227,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
expression: IrExpression, expression: IrExpression,
handler: IrBlockBuilder.(values: List<IrExpression>) -> IrExpression handler: IrBlockBuilder.(values: List<IrExpression>) -> IrExpression
): IrExpression? = ): IrExpression? =
scope.handleSavedExpression(expression) { irBlock { +handler(it.instance.makeFlattenedGetterExpressions(this)) } } scope.handleSavedExpression(expression) { irBlock { +handler(it.instance.makeFlattenedGetterExpressions(this)) }.unwrapBlock() }
fun registerReplacement(expression: IrExpression, instance: MfvcNodeInstance) { fun registerReplacement(expression: IrExpression, instance: MfvcNodeInstance) {
expression2MfvcNodeInstanceAccessor[expression] = MfvcNodeInstanceAccessor.Getter(instance) expression2MfvcNodeInstanceAccessor[expression] = MfvcNodeInstanceAccessor.Getter(instance)
@@ -302,8 +302,10 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
val fieldsToRemove = propertiesReplacement.keys.mapNotNull { oldBackingFields[it] }.toSet() val fieldsToRemove = propertiesReplacement.keys.mapNotNull { oldBackingFields[it] }.toSet()
val newDeclarations = makeNewDeclarationsForRegularClass(fieldsToRemove, propertiesReplacement, irClass) if (fieldsToRemove.isNotEmpty() || propertiesReplacement.isNotEmpty()) {
irClass.declarations.replaceAll(newDeclarations) val newDeclarations = makeNewDeclarationsForRegularClass(fieldsToRemove, propertiesReplacement, irClass)
irClass.declarations.replaceAll(newDeclarations)
}
} }
private fun collectRegularClassMfvcPropertiesReplacement(properties: LinkedHashSet<IrProperty>) = private fun collectRegularClassMfvcPropertiesReplacement(properties: LinkedHashSet<IrProperty>) =
@@ -703,7 +705,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
replacement != null -> context.createIrBuilder(currentScope.symbol).irBlock { replacement != null -> context.createIrBuilder(currentScope.symbol).irBlock {
buildReplacement(function, expression, replacement) buildReplacement(function, expression, replacement)
} }.unwrapBlock()
else -> { else -> {
val newConstructor = (function as? IrConstructor) val newConstructor = (function as? IrConstructor)
@@ -711,7 +713,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
?: return super.visitFunctionAccess(expression) ?: return super.visitFunctionAccess(expression)
context.createIrBuilder(currentScope.symbol).irBlock { context.createIrBuilder(currentScope.symbol).irBlock {
buildReplacement(function, expression, newConstructor) buildReplacement(function, expression, newConstructor)
} }.unwrapBlock()
} }
} }
} }
@@ -732,7 +734,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
with(valueDeclarationsRemapper) { with(valueDeclarationsRemapper) {
addReplacement(expression) ?: return expression addReplacement(expression) ?: return expression
} }
} }.unwrapBlock()
} }
if (expression.isSpecializedMFVCEqEq) { if (expression.isSpecializedMFVCEqEq) {
return context.createIrBuilder(getCurrentScopeSymbol()).irBlock { return context.createIrBuilder(getCurrentScopeSymbol()).irBlock {
@@ -809,7 +811,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
// both are boxed // both are boxed
return super.visitCall(expression) return super.visitCall(expression)
} }
} }.unwrapBlock()
} }
return super.visitCall(expression) return super.visitCall(expression)
} }
@@ -953,7 +955,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
with(valueDeclarationsRemapper) { with(valueDeclarationsRemapper) {
return context.createIrBuilder(expression.symbol).irBlock { return context.createIrBuilder(expression.symbol).irBlock {
addReplacement(expression) ?: return expression addReplacement(expression) ?: return expression
} }.unwrapBlock()
} }
} }
@@ -963,7 +965,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
return context.createIrBuilder(getCurrentScopeSymbol()).irBlock { return context.createIrBuilder(getCurrentScopeSymbol()).irBlock {
addReplacement(expression, safe = expression.origin != UNSAFE_MFVC_SET_ORIGIN) addReplacement(expression, safe = expression.origin != UNSAFE_MFVC_SET_ORIGIN)
?: return expression.also { it.value = it.value.transform(this@JvmMultiFieldValueClassLowering, null) } ?: return expression.also { it.value = it.value.transform(this@JvmMultiFieldValueClassLowering, null) }
} }.unwrapBlock()
} }
} }
@@ -977,7 +979,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
addReplacement(expression, safe = expression.origin != UNSAFE_MFVC_SET_ORIGIN) addReplacement(expression, safe = expression.origin != UNSAFE_MFVC_SET_ORIGIN)
?: return super.visitSetValue(expression) ?: return super.visitSetValue(expression)
} }
} }.unwrapBlock()
override fun visitVariable(declaration: IrVariable): IrStatement { override fun visitVariable(declaration: IrVariable): IrStatement {
val initializer = declaration.initializer val initializer = declaration.initializer
@@ -992,7 +994,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
initializer?.let { initializer?.let {
flattenExpressionTo(it, instance) flattenExpressionTo(it, instance)
} }
} }.unwrapBlock()
} }
return super.visitVariable(declaration) return super.visitVariable(declaration)
} }
@@ -1021,7 +1023,7 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
} }
val expressions = removeExtraSetVariablesFromExpressionList(block, variables) val expressions = removeExtraSetVariablesFromExpressionList(block, variables)
if (block.statements.isNotEmpty()) { if (block.statements.isNotEmpty()) {
+block +block.unwrapBlock()
} }
return expressions return expressions
} }
@@ -1156,12 +1158,12 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
} }
private fun handleStatementContainer(expression: IrStatementContainer, resultIsUsed: Boolean) { private fun handleStatementContainer(expression: IrStatementContainer, resultIsUsed: Boolean) {
for (statement in expression.statements.dropLast(1)) { for (statement in expression.statements.subListWithoutLast(1)) {
statement.accept(this, false) statement.accept(this, false)
} }
expression.statements.lastOrNull()?.accept(this, resultIsUsed) expression.statements.lastOrNull()?.accept(this, resultIsUsed)
val statementsToRemove = mutableSetOf<IrStatement>() val statementsToRemove = mutableSetOf<IrStatement>()
for (statement in expression.statements.dropLast(if (resultIsUsed) 1 else 0)) { for (statement in expression.statements.subListWithoutLast(if (resultIsUsed) 1 else 0)) {
val call = getFunctionCallOrNull(statement) ?: continue val call = getFunctionCallOrNull(statement) ?: continue
val node = replacements.getRootMfvcNode(call.type.erasedUpperBound) ?: continue val node = replacements.getRootMfvcNode(call.type.erasedUpperBound) ?: continue
if (node.boxMethod == call.symbol.owner && if (node.boxMethod == call.symbol.owner &&
@@ -1176,6 +1178,9 @@ private class JvmMultiFieldValueClassLowering(context: JvmBackendContext) : JvmV
} }
} }
// like dropLast but creates a view to the original list instead of copying content of it
private fun <T> List<T>.subListWithoutLast(n: Int) = if (size > n) subList(0, size - n) else emptyList()
private sealed class BlockOrBody { private sealed class BlockOrBody {
abstract val element: IrElement abstract val element: IrElement