[Wasm] Add inline property accessors optimization
This commit is contained in:
+11
-2
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user