From 6db5ad7310e4a76bd5032da5e0dff604543d8e04 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 3 Aug 2020 22:13:54 +0200 Subject: [PATCH] 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. --- .../common/lower/InlineClassDeclarationLowering.kt | 5 +++-- .../common/lower/LocalDeclarationsLowering.kt | 9 +++------ .../backend/common/lower/ReturnableBlockLowering.kt | 3 ++- .../kotlin/backend/common/lower/TailrecLowering.kt | 3 ++- .../ir/backend/js/lower/BlockDecomposerLowering.kt | 13 +++++++------ .../backend/jvm/lower/JvmInlineClassLowering.kt | 9 +++++---- .../src/org/jetbrains/kotlin/ir/IrElement.kt | 9 +++++---- .../kotlin/ir/declarations/IrDeclaration.kt | 6 +----- .../org/jetbrains/kotlin/ir/expressions/IrBody.kt | 3 ++- .../kotlin/ir/expressions/impl/IrBlockImpl.kt | 2 +- 10 files changed, 31 insertions(+), 31 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt index b9838c6a8f7..f4b4323f5f7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.transformStatement import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -83,7 +84,7 @@ class InlineClassLowering(val context: CommonBackendContext) { } (irConstructor.body as IrBlockBody).statements.forEach { statement -> - +statement.transform(object : IrElementTransformerVoid() { + +statement.transformStatement(object : IrElementTransformerVoid() { override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression { expression.transformChildrenVoid() return irBlock(expression) { @@ -124,7 +125,7 @@ class InlineClassLowering(val context: CommonBackendContext) { return expression } - }, null) + }) } +irReturn(irGet(thisVar)) }.statements diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index 361ff78f045..3956d36d135 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -12,10 +12,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI -import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildField @@ -267,9 +264,9 @@ class LocalDeclarationsLowering( private inner class FunctionBodiesRewriter(val localContext: LocalContext?) : IrElementTransformerVoid() { - override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty) = + override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrStatement = // Both accessors extracted as closures. - declaration.delegate.transform(this, null) + declaration.delegate.transformStatement(this) override fun visitClass(declaration: IrClass) = if (declaration in localClasses) { localClasses[declaration]!!.declaration diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt index bd9786dbb15..6cafb822b3f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt @@ -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.symbols.IrReturnableBlockSymbol 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. @@ -118,7 +119,7 @@ class ReturnableBlockTransformer(val context: CommonBackendContext, val containe builder.irSetVar(variable.symbol, s.value) } } else { - s.transform(this, null) + s.transformStatement(this) } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt index 6e57c95f00a..12d8fe65307 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl 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.getArgumentsWithIr import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid @@ -100,7 +101,7 @@ private fun lowerTailRecursionCalls(context: BackendContext, irFunction: IrFunct ) oldBodyStatements.forEach { - +it.transform(transformer, null) + +it.transformStatement(transformer) } +irBreak(loop) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt index 564bbc6e64e..d6b862fa88a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt @@ -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() 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) { 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() 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) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt index 71c5360531c..65f3cd10d56 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt @@ -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.symbols.IrValueSymbol 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.classOrNull import org.jetbrains.kotlin.ir.types.isNullable @@ -202,7 +203,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F constructor.body?.statements?.forEach { statement -> +statement - .transform(object : IrElementTransformerVoid() { + .transformStatement(object : IrElementTransformerVoid() { // Don't recurse under nested class declarations override fun visitClass(declaration: IrClass): IrStatement { return declaration @@ -239,8 +240,8 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F +irGet(thisVar) }) } - }, null) - .transform(this@JvmInlineClassLowering, null) + }) + .transformStatement(this@JvmInlineClassLowering) .patchDeclarationParents(replacement) } @@ -427,7 +428,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F if (statement is IrFunction) transformFunctionFlat(statement) else - listOf(statement.transform(this, null)) + listOf(statement.transformStatement(this)) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrElement.kt index efee0c89744..136f29f1c44 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrElement.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.ir import org.jetbrains.kotlin.ir.visitors.IrElementTransformer +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitor interface IrElement { @@ -33,10 +34,10 @@ interface IrElement { fun transformChildren(transformer: IrElementTransformer, data: D): Unit } -interface IrStatement : IrElement { - override fun transform(transformer: IrElementTransformer, data: D): IrStatement = - super.transform(transformer, data) as IrStatement -} +interface IrStatement : IrElement + +fun IrStatement.transformStatement(transformer: IrElementTransformerVoid): IrStatement = + transform(transformer, null) as IrStatement inline fun IrElement.assertCast(): T = if (this is T) this else throw AssertionError("Expected ${T::class.simpleName}: $this") diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt index e161cf36d10..063f48db4c1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.IrElementBase import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.symbols.IrSymbol -import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.name.Name interface IrSymbolOwner : IrElement { @@ -46,10 +45,7 @@ interface IrDeclaration : IrStatement, IrMutableAnnotationContainer { val factory: IrFactory } -abstract class IrDeclarationBase : IrElementBase(), IrDeclaration { - override fun transform(transformer: IrElementTransformer, data: D): IrStatement = - accept(transformer, data) as IrStatement -} +abstract class IrDeclarationBase : IrElementBase(), IrDeclaration interface IrSymbolDeclaration : IrDeclaration, IrSymbolOwner { override val symbol: S diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBody.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBody.kt index 551b58773cd..8e47f184810 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBody.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBody.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.ir.expressions import org.jetbrains.kotlin.ir.IrElementBase +import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrFactory import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor @@ -58,7 +59,7 @@ abstract class IrBlockBody : IrBody(), IrStatementContainer { override fun transformChildren(transformer: IrElementTransformer, data: D) { statements.forEachIndexed { i, irStatement -> - statements[i] = irStatement.transform(transformer, data) + statements[i] = irStatement.transform(transformer, data) as IrStatement } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt index 72e7be5a000..b1a4868299c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt @@ -97,7 +97,7 @@ class IrReturnableBlockImpl( override fun transformChildren(transformer: IrElementTransformer, data: D) { statements.forEachIndexed { i, irStatement -> - statements[i] = irStatement.transform(transformer, data) + statements[i] = irStatement.transform(transformer, data) as IrStatement } } }