From ba8223218fa3994d7966d789e77e5ae17fae7791 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Tue, 15 Dec 2020 16:54:47 +0300 Subject: [PATCH] [Wasm] Add inline property accessors optimization --- .../optimizations/PropertyAccessorInlineLowering.kt | 13 +++++++++++-- .../kotlin/backend/wasm/WasmLoweringPhases.kt | 8 ++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt index dea400679fc..4e44e216030 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt @@ -10,8 +10,9 @@ import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.ir.isTopLevel import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.irBlock -import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.DescriptorVisibilities +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.ir.builders.irImplicitCast import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl @@ -83,9 +84,17 @@ class PropertyAccessorInlineLowering(private val context: CommonBackendContext) private fun tryInlineSimpleGetter(call: IrCall, callee: IrSimpleFunction, backingField: IrField): IrExpression? { if (!isSimpleGetter(callee, backingField)) return null - return call.run { + val builder = context.createIrBuilder(call.symbol, call.startOffset, call.endOffset) + + val getField = call.run { IrGetFieldImpl(startOffset, endOffset, backingField.symbol, backingField.type, call.dispatchReceiver, origin) } + + // Preserve call types when backingField have different type. This usually happens with generic field types. + return if (backingField.type != call.type) + builder.irImplicitCast(getField, call.type) + else + getField } private fun isSimpleGetter(callee: IrSimpleFunction, backingField: IrField): Boolean { diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt index 2cf8c5ba990..eb46d02bbe0 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.common.lower.inline.FunctionInlining import org.jetbrains.kotlin.backend.common.lower.loops.ForLoopsLowering +import org.jetbrains.kotlin.backend.common.lower.optimizations.PropertyAccessorInlineLowering import org.jetbrains.kotlin.backend.common.phaser.* import org.jetbrains.kotlin.backend.wasm.lower.* import org.jetbrains.kotlin.ir.backend.js.lower.* @@ -406,6 +407,12 @@ private val forLoopsLoweringPhase = makeWasmModulePhase( description = "[Optimization] For loops lowering" ) +private val propertyAccessorInlinerLoweringPhase = makeWasmModulePhase( + ::PropertyAccessorInlineLowering, + name = "PropertyAccessorInlineLowering", + description = "[Optimization] Inline property accessors" +) + val wasmPhases = NamedCompilerPhase( name = "IrModuleLowering", description = "IR module lowering", @@ -456,6 +463,7 @@ val wasmPhases = NamedCompilerPhase( returnableBlockLoweringPhase then forLoopsLoweringPhase then + propertyAccessorInlinerLoweringPhase then defaultArgumentStubGeneratorPhase then defaultArgumentPatchOverridesPhase then