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:
+3
-2
@@ -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
|
||||||
|
|||||||
+3
-6
@@ -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
|
||||||
|
|||||||
+2
-1
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -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)
|
||||||
|
|||||||
+7
-6
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user