IR: inline some transformChildren calls in IrElementTransformer{,Void}
IrElementTransformer.visitDeclaration/visitExpression are very prominent hotspots, and it seems that HotSpot doesn't optimize the inlined Kotlin bytecode there well enough. Reduce the bytecode in these and similar methods by inlining calls to also/apply/transformChildrenVoid.
This commit is contained in:
+1
-1
@@ -439,7 +439,7 @@ class BlockDecomposerTransformer(
|
||||
|
||||
private inner class ExpressionTransformer : IrElementTransformerVoid() {
|
||||
|
||||
override fun visitExpression(expression: IrExpression) = expression.transformChildren()
|
||||
override fun visitExpression(expression: IrExpression) = expression.apply { transformChildrenVoid() }
|
||||
|
||||
override fun visitGetField(expression: IrGetField): IrExpression {
|
||||
expression.transformChildrenVoid(expressionTransformer)
|
||||
|
||||
@@ -22,20 +22,30 @@ import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
|
||||
interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
|
||||
override fun visitElement(element: IrElement, data: D): IrElement =
|
||||
element.also { it.transformChildren(this, data) }
|
||||
override fun visitElement(element: IrElement, data: D): IrElement {
|
||||
element.transformChildren(this, data)
|
||||
return element
|
||||
}
|
||||
|
||||
override fun visitModuleFragment(declaration: IrModuleFragment, data: D): IrModuleFragment =
|
||||
declaration.also { it.transformChildren(this, data) }
|
||||
override fun visitModuleFragment(declaration: IrModuleFragment, data: D): IrModuleFragment {
|
||||
declaration.transformChildren(this, data)
|
||||
return declaration
|
||||
}
|
||||
|
||||
override fun visitFile(declaration: IrFile, data: D): IrFile =
|
||||
declaration.also { it.transformChildren(this, data) }
|
||||
override fun visitFile(declaration: IrFile, data: D): IrFile {
|
||||
declaration.transformChildren(this, data)
|
||||
return declaration
|
||||
}
|
||||
|
||||
override fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: D): IrExternalPackageFragment =
|
||||
declaration.also { it.transformChildren(this, data) }
|
||||
override fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: D): IrExternalPackageFragment {
|
||||
declaration.transformChildren(this, data)
|
||||
return declaration
|
||||
}
|
||||
|
||||
override fun visitDeclaration(declaration: IrDeclarationBase, data: D): IrStatement =
|
||||
declaration.also { it.transformChildren(this, data) }
|
||||
override fun visitDeclaration(declaration: IrDeclarationBase, data: D): IrStatement {
|
||||
declaration.transformChildren(this, data)
|
||||
return declaration
|
||||
}
|
||||
|
||||
override fun visitScript(declaration: IrScript, data: D) = visitDeclaration(declaration, data)
|
||||
override fun visitClass(declaration: IrClass, data: D) = visitDeclaration(declaration, data)
|
||||
@@ -52,8 +62,10 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
|
||||
override fun visitValueParameter(declaration: IrValueParameter, data: D) = visitDeclaration(declaration, data)
|
||||
override fun visitTypeAlias(declaration: IrTypeAlias, data: D) = visitDeclaration(declaration, data)
|
||||
|
||||
override fun visitBody(body: IrBody, data: D): IrBody =
|
||||
body.also { it.transformChildren(this, data) }
|
||||
override fun visitBody(body: IrBody, data: D): IrBody {
|
||||
body.transformChildren(this, data)
|
||||
return body
|
||||
}
|
||||
|
||||
override fun visitExpressionBody(body: IrExpressionBody, data: D) = visitBody(body, data)
|
||||
override fun visitBlockBody(body: IrBlockBody, data: D) = visitBody(body, data)
|
||||
@@ -62,14 +74,18 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
|
||||
override fun visitSuspendableExpression(expression: IrSuspendableExpression, data: D) = visitExpression(expression, data)
|
||||
override fun visitSuspensionPoint(expression: IrSuspensionPoint, data: D) = visitExpression(expression, data)
|
||||
|
||||
override fun visitExpression(expression: IrExpression, data: D): IrExpression =
|
||||
expression.also { it.transformChildren(this, data) }
|
||||
override fun visitExpression(expression: IrExpression, data: D): IrExpression {
|
||||
expression.transformChildren(this, data)
|
||||
return expression
|
||||
}
|
||||
|
||||
override fun <T> visitConst(expression: IrConst<T>, data: D) = visitExpression(expression, data)
|
||||
override fun visitVararg(expression: IrVararg, data: D) = visitExpression(expression, data)
|
||||
|
||||
override fun visitSpreadElement(spread: IrSpreadElement, data: D): IrSpreadElement =
|
||||
spread.also { it.transformChildren(this, data) }
|
||||
override fun visitSpreadElement(spread: IrSpreadElement, data: D): IrSpreadElement {
|
||||
spread.transformChildren(this, data)
|
||||
return spread
|
||||
}
|
||||
|
||||
override fun visitContainerExpression(expression: IrContainerExpression, data: D) = visitExpression(expression, data)
|
||||
override fun visitBlock(expression: IrBlock, data: D) = visitContainerExpression(expression, data)
|
||||
@@ -112,25 +128,25 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
|
||||
|
||||
override fun visitWhen(expression: IrWhen, data: D) = visitExpression(expression, data)
|
||||
|
||||
override fun visitBranch(branch: IrBranch, data: D): IrBranch =
|
||||
branch.also {
|
||||
it.condition = it.condition.transform(this, data)
|
||||
it.result = it.result.transform(this, data)
|
||||
}
|
||||
override fun visitBranch(branch: IrBranch, data: D): IrBranch {
|
||||
branch.transformChildren(this, data)
|
||||
return branch
|
||||
}
|
||||
|
||||
override fun visitElseBranch(branch: IrElseBranch, data: D): IrElseBranch =
|
||||
branch.also {
|
||||
it.condition = it.condition.transform(this, data)
|
||||
it.result = it.result.transform(this, data)
|
||||
}
|
||||
override fun visitElseBranch(branch: IrElseBranch, data: D): IrElseBranch {
|
||||
branch.transformChildren(this, data)
|
||||
return branch
|
||||
}
|
||||
|
||||
override fun visitLoop(loop: IrLoop, data: D) = visitExpression(loop, data)
|
||||
override fun visitWhileLoop(loop: IrWhileLoop, data: D) = visitLoop(loop, data)
|
||||
override fun visitDoWhileLoop(loop: IrDoWhileLoop, data: D) = visitLoop(loop, data)
|
||||
override fun visitTry(aTry: IrTry, data: D) = visitExpression(aTry, data)
|
||||
|
||||
override fun visitCatch(aCatch: IrCatch, data: D): IrCatch =
|
||||
aCatch.also { it.transformChildren(this, data) }
|
||||
override fun visitCatch(aCatch: IrCatch, data: D): IrCatch {
|
||||
aCatch.transformChildren(this, data)
|
||||
return aCatch
|
||||
}
|
||||
|
||||
override fun visitBreakContinue(jump: IrBreakContinue, data: D) = visitExpression(jump, data)
|
||||
override fun visitBreak(jump: IrBreak, data: D) = visitBreakContinue(jump, data)
|
||||
|
||||
+49
-11
@@ -22,16 +22,26 @@ import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
|
||||
abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
protected fun <T : IrElement> T.transformChildren() = apply { transformChildrenVoid() }
|
||||
open fun visitElement(element: IrElement): IrElement {
|
||||
element.transformChildren(this, null)
|
||||
return element
|
||||
}
|
||||
|
||||
open fun visitElement(element: IrElement): IrElement = element.transformChildren()
|
||||
final override fun visitElement(element: IrElement, data: Nothing?): IrElement = visitElement(element)
|
||||
|
||||
open fun visitModuleFragment(declaration: IrModuleFragment): IrModuleFragment = declaration.transformChildren()
|
||||
open fun visitModuleFragment(declaration: IrModuleFragment): IrModuleFragment {
|
||||
declaration.transformChildren(this, null)
|
||||
return declaration
|
||||
}
|
||||
|
||||
final override fun visitModuleFragment(declaration: IrModuleFragment, data: Nothing?): IrModuleFragment =
|
||||
visitModuleFragment(declaration)
|
||||
|
||||
open fun visitPackageFragment(declaration: IrPackageFragment): IrPackageFragment = declaration.transformChildren()
|
||||
open fun visitPackageFragment(declaration: IrPackageFragment): IrPackageFragment {
|
||||
declaration.transformChildren(this, null)
|
||||
return declaration
|
||||
}
|
||||
|
||||
final override fun visitPackageFragment(declaration: IrPackageFragment, data: Nothing?): IrElement = visitPackageFragment(declaration)
|
||||
|
||||
open fun visitFile(declaration: IrFile): IrFile = visitPackageFragment(declaration) as IrFile
|
||||
@@ -43,7 +53,11 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
final override fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: Nothing?): IrExternalPackageFragment =
|
||||
visitExternalPackageFragment(declaration)
|
||||
|
||||
open fun visitDeclaration(declaration: IrDeclarationBase): IrStatement = declaration.transformChildren()
|
||||
open fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
|
||||
declaration.transformChildren(this, null)
|
||||
return declaration
|
||||
}
|
||||
|
||||
final override fun visitDeclaration(declaration: IrDeclarationBase, data: Nothing?): IrStatement = visitDeclaration(declaration)
|
||||
|
||||
open fun visitScript(declaration: IrScript) = visitDeclaration(declaration)
|
||||
@@ -90,7 +104,11 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
open fun visitTypeAlias(declaration: IrTypeAlias) = visitDeclaration(declaration)
|
||||
final override fun visitTypeAlias(declaration: IrTypeAlias, data: Nothing?) = visitTypeAlias(declaration)
|
||||
|
||||
open fun visitBody(body: IrBody): IrBody = body.transformChildren()
|
||||
open fun visitBody(body: IrBody): IrBody {
|
||||
body.transformChildren(this, null)
|
||||
return body
|
||||
}
|
||||
|
||||
final override fun visitBody(body: IrBody, data: Nothing?): IrBody = visitBody(body)
|
||||
|
||||
open fun visitExpressionBody(body: IrExpressionBody) = visitBody(body)
|
||||
@@ -109,7 +127,11 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
open fun visitSuspensionPoint(expression: IrSuspensionPoint) = visitExpression(expression)
|
||||
final override fun visitSuspensionPoint(expression: IrSuspensionPoint, data: Nothing?) = visitSuspensionPoint(expression)
|
||||
|
||||
open fun visitExpression(expression: IrExpression): IrExpression = expression.transformChildren()
|
||||
open fun visitExpression(expression: IrExpression): IrExpression {
|
||||
expression.transformChildren(this, null)
|
||||
return expression
|
||||
}
|
||||
|
||||
final override fun visitExpression(expression: IrExpression, data: Nothing?): IrExpression = visitExpression(expression)
|
||||
|
||||
open fun <T> visitConst(expression: IrConst<T>) = visitExpression(expression)
|
||||
@@ -118,7 +140,11 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
open fun visitVararg(expression: IrVararg) = visitExpression(expression)
|
||||
final override fun visitVararg(expression: IrVararg, data: Nothing?) = visitVararg(expression)
|
||||
|
||||
open fun visitSpreadElement(spread: IrSpreadElement) = spread.transformChildren()
|
||||
open fun visitSpreadElement(spread: IrSpreadElement): IrSpreadElement {
|
||||
spread.transformChildren(this, null)
|
||||
return spread
|
||||
}
|
||||
|
||||
final override fun visitSpreadElement(spread: IrSpreadElement, data: Nothing?): IrSpreadElement = visitSpreadElement(spread)
|
||||
|
||||
open fun visitContainerExpression(expression: IrContainerExpression) = visitExpression(expression)
|
||||
@@ -221,10 +247,18 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
open fun visitWhen(expression: IrWhen) = visitExpression(expression)
|
||||
final override fun visitWhen(expression: IrWhen, data: Nothing?) = visitWhen(expression)
|
||||
|
||||
open fun visitBranch(branch: IrBranch) = branch.transformChildren()
|
||||
open fun visitBranch(branch: IrBranch): IrBranch {
|
||||
branch.transformChildren(this, null)
|
||||
return branch
|
||||
}
|
||||
|
||||
final override fun visitBranch(branch: IrBranch, data: Nothing?): IrBranch = visitBranch(branch)
|
||||
|
||||
open fun visitElseBranch(branch: IrElseBranch) = branch.transformChildren()
|
||||
open fun visitElseBranch(branch: IrElseBranch): IrElseBranch {
|
||||
branch.transformChildren(this, null)
|
||||
return branch
|
||||
}
|
||||
|
||||
final override fun visitElseBranch(branch: IrElseBranch, data: Nothing?): IrElseBranch = visitElseBranch(branch)
|
||||
|
||||
open fun visitLoop(loop: IrLoop) = visitExpression(loop)
|
||||
@@ -239,7 +273,11 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
open fun visitTry(aTry: IrTry) = visitExpression(aTry)
|
||||
final override fun visitTry(aTry: IrTry, data: Nothing?) = visitTry(aTry)
|
||||
|
||||
open fun visitCatch(aCatch: IrCatch): IrCatch = aCatch.apply { transformChildrenVoid() }
|
||||
open fun visitCatch(aCatch: IrCatch): IrCatch {
|
||||
aCatch.transformChildren(this, null)
|
||||
return aCatch
|
||||
}
|
||||
|
||||
final override fun visitCatch(aCatch: IrCatch, data: Nothing?): IrCatch = visitCatch(aCatch)
|
||||
|
||||
open fun visitBreakContinue(jump: IrBreakContinue) = visitExpression(jump)
|
||||
|
||||
Reference in New Issue
Block a user