From ccac23f5b29af150461d32f60e2c28786c65f54d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 22 Jun 2020 22:53:42 +0200 Subject: [PATCH] IR: make mapOptimized non-inline, rename to transformIfNeeded This seems to have no effect on performance, however it clearly shows that this method is a hotspot now with regard to own CPU samples. Furthermore, it somewhat decreases the bytecode size at call sites and might actually allow the HotSpot to inline those methods earlier and hopefully deoptimize less frequently. --- .../org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt | 7 ++++--- .../jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt | 6 +++--- .../kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt | 6 +++--- .../kotlin/ir/declarations/impl/IrClassImpl.kt | 4 ++-- .../kotlin/ir/declarations/impl/IrFunctionBase.kt | 7 +++---- .../kotlin/ir/declarations/impl/IrTypeAliasImpl.kt | 6 +++--- .../kotlin/ir/declarations/lazy/IrLazyClass.kt | 4 ++-- .../kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt | 8 ++++---- .../kotlin/ir/declarations/lazy/IrLazyTypeAlias.kt | 6 +++--- .../src/org/jetbrains/kotlin/ir/util/transform.kt | 10 ++++++---- 10 files changed, 33 insertions(+), 31 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index 81312d40a38..4a460ea09ed 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -6,8 +6,9 @@ package org.jetbrains.kotlin.fir.lazy import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.fir.backend.* +import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter +import org.jetbrains.kotlin.fir.backend.toIrType import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol @@ -19,8 +20,8 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl -import org.jetbrains.kotlin.ir.util.mapOptimized import org.jetbrains.kotlin.ir.util.transform +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -190,7 +191,7 @@ class Fir2IrLazyClass( override fun transformChildren(transformer: IrElementTransformer, data: D) { thisReceiver = thisReceiver?.transform(transformer, data) - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) declarations.transform { it.transform(transformer, data) } } } \ No newline at end of file diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt index 77242fe8de8..de749bc62ee 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt @@ -20,8 +20,8 @@ import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.util.mapOptimized import org.jetbrains.kotlin.ir.util.parentClassOrNull +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -125,11 +125,11 @@ class Fir2IrLazyConstructor( } override fun transformChildren(transformer: IrElementTransformer, data: D) { - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) dispatchReceiverParameter = dispatchReceiverParameter?.transform(transformer, data) extensionReceiverParameter = extensionReceiverParameter?.transform(transformer, data) - valueParameters = valueParameters.mapOptimized { it.transform(transformer, data) } + valueParameters = valueParameters.transformIfNeeded(transformer, data) body = body?.transform(transformer, data) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt index 567d1f71f00..fe92501c7e4 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.util.mapOptimized +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -147,11 +147,11 @@ class Fir2IrLazySimpleFunction( } override fun transformChildren(transformer: IrElementTransformer, data: D) { - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) dispatchReceiverParameter = dispatchReceiverParameter?.transform(transformer, data) extensionReceiverParameter = extensionReceiverParameter?.transform(transformer, data) - valueParameters = valueParameters.mapOptimized { it.transform(transformer, data) } + valueParameters = valueParameters.transformIfNeeded(transformer, data) body = body?.transform(transformer, data) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt index c73d8044f1a..c22d17ede5e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.declarations.impl.carriers.ClassCarrier import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.transform -import org.jetbrains.kotlin.ir.util.mapOptimized +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -177,7 +177,7 @@ class IrClassImpl( override fun transformChildren(transformer: IrElementTransformer, data: D) { thisReceiver = thisReceiver?.transform(transformer, data) - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) declarations.transform { it.transform(transformer, data) } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionBase.kt index 54cbbd35fd4..582d6171d8d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionBase.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.ir.declarations.impl.carriers.FunctionBaseCarrier import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType -import org.jetbrains.kotlin.ir.util.mapOptimized +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -144,12 +144,11 @@ abstract class IrFunctionBase>( } override fun transformChildren(transformer: IrElementTransformer, data: D) { - - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) dispatchReceiverParameter = dispatchReceiverParameter?.transform(transformer, data) extensionReceiverParameter = extensionReceiverParameter?.transform(transformer, data) - valueParameters = valueParameters.mapOptimized { it.transform(transformer, data) } + valueParameters = valueParameters.transformIfNeeded(transformer, data) body = body?.transform(transformer, data) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrTypeAliasImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrTypeAliasImpl.kt index 66506a80b5e..f23df27e301 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrTypeAliasImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrTypeAliasImpl.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.ir.declarations.IrTypeParameter import org.jetbrains.kotlin.ir.declarations.impl.carriers.TypeAliasCarrier import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.util.mapOptimized +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -59,7 +59,7 @@ class IrTypeAliasImpl( } override fun transformChildren(transformer: IrElementTransformer, data: D) { - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) } companion object { @@ -81,4 +81,4 @@ class IrTypeAliasImpl( origin ) } -} \ No newline at end of file +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt index e7c83052c62..ff79b9a047e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator import org.jetbrains.kotlin.ir.util.TypeTranslator import org.jetbrains.kotlin.ir.util.transform -import org.jetbrains.kotlin.ir.util.mapOptimized +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.metadata.ProtoBuf @@ -102,7 +102,7 @@ class IrLazyClass( override fun transformChildren(transformer: IrElementTransformer, data: D) { thisReceiver = thisReceiver?.transform(transformer, data) - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) declarations.transform { it.transform(transformer, data) } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt index 0db10584cde..b1919549944 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunctionBase.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator import org.jetbrains.kotlin.ir.util.TypeTranslator -import org.jetbrains.kotlin.ir.util.mapOptimized +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -77,12 +77,12 @@ abstract class IrLazyFunctionBase( } override fun transformChildren(transformer: IrElementTransformer, data: D) { - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) dispatchReceiverParameter = dispatchReceiverParameter?.transform(transformer, data) extensionReceiverParameter = extensionReceiverParameter?.transform(transformer, data) - valueParameters = valueParameters.mapOptimized { it.transform(transformer, data) } + valueParameters = valueParameters.transformIfNeeded(transformer, data) body = body?.transform(transformer, data) } -} \ No newline at end of file +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyTypeAlias.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyTypeAlias.kt index d6835bce796..b9b10f4935d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyTypeAlias.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyTypeAlias.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator import org.jetbrains.kotlin.ir.util.TypeTranslator -import org.jetbrains.kotlin.ir.util.mapOptimized +import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -63,6 +63,6 @@ class IrLazyTypeAlias( } override fun transformChildren(transformer: IrElementTransformer, data: D) { - typeParameters = typeParameters.mapOptimized { it.transform(transformer, data) } + typeParameters = typeParameters.transformIfNeeded(transformer, data) } -} \ No newline at end of file +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt index a9193e92429..8f9aca58b26 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer +import org.jetbrains.kotlin.ir.visitors.IrElementTransformer inline fun MutableList.transform(transformation: (T) -> IrElement) { forEachIndexed { i, item -> @@ -65,16 +66,17 @@ fun IrDeclarationContainer.transformDeclarationsFlat(transformation: (IrDeclarat } /** - * Similar to `map`. Return the same List instance if no element instances have changed. + * Transforms the list of elements with the given transformer. Return the same List instance if no element instances have changed. */ -inline fun List.mapOptimized(transformation: (T) -> IrElement): List { +fun List.transformIfNeeded(transformer: IrElementTransformer, data: D): List { var result: ArrayList? = null for ((i, item) in withIndex()) { - val transformed = transformation(item) as T + @Suppress("UNCHECKED_CAST") + val transformed = item.transform(transformer, data) as T if (transformed !== item && result == null) { result = ArrayList(this) } result?.set(i, transformed) } return result ?: this -} \ No newline at end of file +}