[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.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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user