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
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.transformStatement
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -83,7 +84,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
} }
(irConstructor.body as IrBlockBody).statements.forEach { statement -> (irConstructor.body as IrBlockBody).statements.forEach { statement ->
+statement.transform(object : IrElementTransformerVoid() { +statement.transformStatement(object : IrElementTransformerVoid() {
override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression { override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression {
expression.transformChildrenVoid() expression.transformChildrenVoid()
return irBlock(expression) { return irBlock(expression) {
@@ -124,7 +125,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
return expression return expression
} }
}, null) })
} }
+irReturn(irGet(thisVar)) +irReturn(irGet(thisVar))
}.statements }.statements
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.builders.declarations.buildField
@@ -267,9 +264,9 @@ class LocalDeclarationsLowering(
private inner class FunctionBodiesRewriter(val localContext: LocalContext?) : IrElementTransformerVoid() { private inner class FunctionBodiesRewriter(val localContext: LocalContext?) : IrElementTransformerVoid() {
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty) = override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrStatement =
// Both accessors extracted as closures. // Both accessors extracted as closures.
declaration.delegate.transform(this, null) declaration.delegate.transformStatement(this)
override fun visitClass(declaration: IrClass) = if (declaration in localClasses) { override fun visitClass(declaration: IrClass) = if (declaration in localClasses) {
localClasses[declaration]!!.declaration localClasses[declaration]!!.declaration
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrDoWhileLoopImpl import org.jetbrains.kotlin.ir.expressions.impl.IrDoWhileLoopImpl
import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.transformStatement
/** /**
* Replaces returnable blocks and `return`'s with loops and `break`'s correspondingly. * Replaces returnable blocks and `return`'s with loops and `break`'s correspondingly.
@@ -118,7 +119,7 @@ class ReturnableBlockTransformer(val context: CommonBackendContext, val containe
builder.irSetVar(variable.symbol, s.value) builder.irSetVar(variable.symbol, s.value)
} }
} else { } else {
s.transform(this, null) s.transformStatement(this)
} }
} }
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.transformStatement
import org.jetbrains.kotlin.ir.util.explicitParameters import org.jetbrains.kotlin.ir.util.explicitParameters
import org.jetbrains.kotlin.ir.util.getArgumentsWithIr import org.jetbrains.kotlin.ir.util.getArgumentsWithIr
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -100,7 +101,7 @@ private fun lowerTailRecursionCalls(context: BackendContext, irFunction: IrFunct
) )
oldBodyStatements.forEach { oldBodyStatements.forEach {
+it.transform(transformer, null) +it.transformStatement(transformer)
} }
+irBreak(loop) +irBreak(loop)
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* 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.types.IrType
import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.util.dump
import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.patchDeclarationParents
@@ -123,7 +124,7 @@ class BlockDecomposerTransformer(
val transformedStatements = mutableListOf<IrStatement>() val transformedStatements = mutableListOf<IrStatement>()
statements.forEach { statements.forEach {
val transformer = if (it === statements.last()) expressionTransformer else statementTransformer val transformer = if (it === statements.last()) expressionTransformer else statementTransformer
val s = it.transform(transformer, null) val s = it.transformStatement(transformer)
if (s is IrComposite) { if (s is IrComposite) {
transformedStatements.addAll(s.statements) transformedStatements.addAll(s.statements)
} else { } else {
@@ -139,14 +140,14 @@ class BlockDecomposerTransformer(
override fun visitFunction(declaration: IrFunction): IrStatement { override fun visitFunction(declaration: IrFunction): IrStatement {
function = declaration function = declaration
tmpVarCounter = 0 tmpVarCounter = 0
return declaration.transform(statementTransformer, null) return declaration.transformStatement(statementTransformer)
} }
override fun visitElement(element: IrElement) = element.transform(statementTransformer, null) override fun visitElement(element: IrElement) = element.transform(statementTransformer, null)
private fun processStatements(statements: MutableList<IrStatement>) { private fun processStatements(statements: MutableList<IrStatement>) {
statements.transformFlat { statements.transformFlat {
destructureComposite(it.transform(statementTransformer, null)) destructureComposite(it.transformStatement(statementTransformer))
} }
} }
@@ -157,7 +158,7 @@ class BlockDecomposerTransformer(
private fun IrStatement.asExpression(last: IrExpression): IrExpression { private fun IrStatement.asExpression(last: IrExpression): IrExpression {
val composite = JsIrBuilder.buildComposite(last.type) val composite = JsIrBuilder.buildComposite(last.type)
composite.statements += transform(statementTransformer, null) composite.statements += transformStatement(statementTransformer)
composite.statements += last composite.statements += last
return composite return composite
} }
@@ -658,10 +659,10 @@ class BlockDecomposerTransformer(
val newStatements = mutableListOf<IrStatement>() val newStatements = mutableListOf<IrStatement>()
for (i in 0 until expression.statements.lastIndex) { 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) return JsIrBuilder.buildComposite(expression.type, newStatements)
} }
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetVariableImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetVariableImpl
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
import org.jetbrains.kotlin.ir.transformStatement
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.types.isNullable import org.jetbrains.kotlin.ir.types.isNullable
@@ -202,7 +203,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
constructor.body?.statements?.forEach { statement -> constructor.body?.statements?.forEach { statement ->
+statement +statement
.transform(object : IrElementTransformerVoid() { .transformStatement(object : IrElementTransformerVoid() {
// Don't recurse under nested class declarations // Don't recurse under nested class declarations
override fun visitClass(declaration: IrClass): IrStatement { override fun visitClass(declaration: IrClass): IrStatement {
return declaration return declaration
@@ -239,8 +240,8 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
+irGet(thisVar) +irGet(thisVar)
}) })
} }
}, null) })
.transform(this@JvmInlineClassLowering, null) .transformStatement(this@JvmInlineClassLowering)
.patchDeclarationParents(replacement) .patchDeclarationParents(replacement)
} }
@@ -427,7 +428,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
if (statement is IrFunction) if (statement is IrFunction)
transformFunctionFlat(statement) transformFunctionFlat(statement)
else else
listOf(statement.transform(this, null)) listOf(statement.transformStatement(this))
} }
} }
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.ir package org.jetbrains.kotlin.ir
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
interface IrElement { interface IrElement {
@@ -33,10 +34,10 @@ interface IrElement {
fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D): Unit fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D): Unit
} }
interface IrStatement : IrElement { interface IrStatement : IrElement
override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrStatement =
super.transform(transformer, data) as IrStatement fun IrStatement.transformStatement(transformer: IrElementTransformerVoid): IrStatement =
} transform(transformer, null) as IrStatement
inline fun <reified T : IrElement> IrElement.assertCast(): T = inline fun <reified T : IrElement> IrElement.assertCast(): T =
if (this is T) this else throw AssertionError("Expected ${T::class.simpleName}: $this") if (this is T) this else throw AssertionError("Expected ${T::class.simpleName}: $this")
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.IrElementBase
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface IrSymbolOwner : IrElement { interface IrSymbolOwner : IrElement {
@@ -46,10 +45,7 @@ interface IrDeclaration : IrStatement, IrMutableAnnotationContainer {
val factory: IrFactory val factory: IrFactory
} }
abstract class IrDeclarationBase : IrElementBase(), IrDeclaration { abstract class IrDeclarationBase : IrElementBase(), IrDeclaration
override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrStatement =
accept(transformer, data) as IrStatement
}
interface IrSymbolDeclaration<out S : IrSymbol> : IrDeclaration, IrSymbolOwner { interface IrSymbolDeclaration<out S : IrSymbol> : IrDeclaration, IrSymbolOwner {
override val symbol: S override val symbol: S
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.ir.expressions package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.IrElementBase import org.jetbrains.kotlin.ir.IrElementBase
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrFactory import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -58,7 +59,7 @@ abstract class IrBlockBody : IrBody(), IrStatementContainer {
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) { override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
statements.forEachIndexed { i, irStatement -> statements.forEachIndexed { i, irStatement ->
statements[i] = irStatement.transform(transformer, data) statements[i] = irStatement.transform(transformer, data) as IrStatement
} }
} }
} }
@@ -97,7 +97,7 @@ class IrReturnableBlockImpl(
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) { override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
statements.forEachIndexed { i, irStatement -> statements.forEachIndexed { i, irStatement ->
statements[i] = irStatement.transform(transformer, data) statements[i] = irStatement.transform(transformer, data) as IrStatement
} }
} }
} }