IR: remove cast to IrStatement in IrDeclarationBase.transform

Default implementation of `IrStatement.transform` contained a cast to
`IrStatement`. Since almost all IR elements inherit from IrStatement,
this implementation was used in many subclasses. However, checkcast to
interface is slow and this place was indeed noticeable in the profiler
snapshot. Since not that many places really expected to get IrStatement
out of IrStatement.transform, introduce a new method
`transformStatement` that does this cast, and use it in all those
places. Meanwhile, most implementations will use the IrElement's
implementation of `transform` which merely invokes `accept` without
casts.
This commit is contained in:
Alexander Udalov
2020-08-03 22:13:54 +02:00
parent fb8e39a621
commit 6db5ad7310
10 changed files with 31 additions and 31 deletions
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.transformStatement
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.dump
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
@@ -123,7 +124,7 @@ class BlockDecomposerTransformer(
val transformedStatements = mutableListOf<IrStatement>()
statements.forEach {
val transformer = if (it === statements.last()) expressionTransformer else statementTransformer
val s = it.transform(transformer, null)
val s = it.transformStatement(transformer)
if (s is IrComposite) {
transformedStatements.addAll(s.statements)
} else {
@@ -139,14 +140,14 @@ class BlockDecomposerTransformer(
override fun visitFunction(declaration: IrFunction): IrStatement {
function = declaration
tmpVarCounter = 0
return declaration.transform(statementTransformer, null)
return declaration.transformStatement(statementTransformer)
}
override fun visitElement(element: IrElement) = element.transform(statementTransformer, null)
private fun processStatements(statements: MutableList<IrStatement>) {
statements.transformFlat {
destructureComposite(it.transform(statementTransformer, null))
destructureComposite(it.transformStatement(statementTransformer))
}
}
@@ -157,7 +158,7 @@ class BlockDecomposerTransformer(
private fun IrStatement.asExpression(last: IrExpression): IrExpression {
val composite = JsIrBuilder.buildComposite(last.type)
composite.statements += transform(statementTransformer, null)
composite.statements += transformStatement(statementTransformer)
composite.statements += last
return composite
}
@@ -658,10 +659,10 @@ class BlockDecomposerTransformer(
val newStatements = mutableListOf<IrStatement>()
for (i in 0 until expression.statements.lastIndex) {
newStatements += destructureComposite(expression.statements[i].transform(statementTransformer, null))
newStatements += destructureComposite(expression.statements[i].transformStatement(statementTransformer))
}
newStatements += destructureComposite(expression.statements.last().transform(expressionTransformer, null))
newStatements += destructureComposite(expression.statements.last().transformStatement(expressionTransformer))
return JsIrBuilder.buildComposite(expression.type, newStatements)
}