[IR] Fix performance regression
Signed-off-by: Evgeniy.Zhelenskiy <Evgeniy.Zhelenskiy@jetbrains.com> #KT-1179
This commit is contained in:
committed by
Space Team
parent
51e76aa19a
commit
b45f2baff5
+20
-15
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user