[Wasm] Add inline property accessors optimization

This commit is contained in:
Svyatoslav Kuzmich
2020-12-15 16:54:47 +03:00
parent 2aa3c197a3
commit ba8223218f
2 changed files with 19 additions and 2 deletions
@@ -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.ir.isTopLevel
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
import org.jetbrains.kotlin.backend.common.lower.irBlock 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.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.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl 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? { private fun tryInlineSimpleGetter(call: IrCall, callee: IrSimpleFunction, backingField: IrField): IrExpression? {
if (!isSimpleGetter(callee, backingField)) return null 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) 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 { private fun isSimpleGetter(callee: IrSimpleFunction, backingField: IrField): Boolean {
@@ -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.*
import org.jetbrains.kotlin.backend.common.lower.inline.FunctionInlining 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.loops.ForLoopsLowering
import org.jetbrains.kotlin.backend.common.lower.optimizations.PropertyAccessorInlineLowering
import org.jetbrains.kotlin.backend.common.phaser.* import org.jetbrains.kotlin.backend.common.phaser.*
import org.jetbrains.kotlin.backend.wasm.lower.* import org.jetbrains.kotlin.backend.wasm.lower.*
import org.jetbrains.kotlin.ir.backend.js.lower.* import org.jetbrains.kotlin.ir.backend.js.lower.*
@@ -406,6 +407,12 @@ private val forLoopsLoweringPhase = makeWasmModulePhase(
description = "[Optimization] For loops lowering" description = "[Optimization] For loops lowering"
) )
private val propertyAccessorInlinerLoweringPhase = makeWasmModulePhase(
::PropertyAccessorInlineLowering,
name = "PropertyAccessorInlineLowering",
description = "[Optimization] Inline property accessors"
)
val wasmPhases = NamedCompilerPhase( val wasmPhases = NamedCompilerPhase(
name = "IrModuleLowering", name = "IrModuleLowering",
description = "IR module lowering", description = "IR module lowering",
@@ -456,6 +463,7 @@ val wasmPhases = NamedCompilerPhase(
returnableBlockLoweringPhase then returnableBlockLoweringPhase then
forLoopsLoweringPhase then forLoopsLoweringPhase then
propertyAccessorInlinerLoweringPhase then
defaultArgumentStubGeneratorPhase then defaultArgumentStubGeneratorPhase then
defaultArgumentPatchOverridesPhase then defaultArgumentPatchOverridesPhase then