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
@@ -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 <D> transformChildren(transformer: IrElementTransformer<D>, data: D): Unit
}
interface IrStatement : IrElement {
override fun <D> transform(transformer: IrElementTransformer<D>, 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 <reified T : IrElement> IrElement.assertCast(): T =
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.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 <D> transform(transformer: IrElementTransformer<D>, data: D): IrStatement =
accept(transformer, data) as IrStatement
}
abstract class IrDeclarationBase : IrElementBase(), IrDeclaration
interface IrSymbolDeclaration<out S : IrSymbol> : IrDeclaration, IrSymbolOwner {
override val symbol: S
@@ -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 <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
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) {
statements.forEachIndexed { i, irStatement ->
statements[i] = irStatement.transform(transformer, data)
statements[i] = irStatement.transform(transformer, data) as IrStatement
}
}
}