From 7f26deb5e60f5d93b78858f578d3fbbcf474681d Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Mon, 9 Nov 2020 17:18:03 +0300 Subject: [PATCH] [Wasm] Enable for loops optimization --- .../backend/common/lower/loops/HeaderProcessor.kt | 4 +++- .../kotlin/backend/wasm/WasmLoweringPhases.kt | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt index 8d994e425bd..0300e61cc9e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt @@ -382,7 +382,9 @@ internal class IndexedGetLoopHeader( with(builder) { // loopVariable = objectVariable[inductionVariable] val indexedGetFun = with(headerInfo.expressionHandler) { headerInfo.objectVariable.type.getFunction } - val get = irCall(indexedGetFun.symbol).apply { + // Making sure that expression type has type of the variable when it exists. + // Return type of get function can be a type parameter (for example Array::get) which is not a subtype of loopVariable type. + val get = irCall(indexedGetFun.symbol, type = loopVariable?.type ?: indexedGetFun.returnType).apply { dispatchReceiver = irGet(headerInfo.objectVariable) putValueArgument(0, irGet(inductionVariable)) } 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 78142b78ede..56b32d80129 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.wasm 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.phaser.* import org.jetbrains.kotlin.backend.wasm.lower.* import org.jetbrains.kotlin.ir.backend.js.lower.* @@ -399,6 +400,12 @@ private val virtualDispatchReceiverExtractionPhase = makeWasmModulePhase( description = "Eliminate side-effects in dispatch receivers of virtual function calls" ) +private val forLoopsLoweringPhase = makeWasmModulePhase( + ::ForLoopsLowering, + name = "ForLoopsLowering", + description = "[Optimization] For loops lowering" +) + val wasmPhases = NamedCompilerPhase( name = "IrModuleLowering", description = "IR module lowering", @@ -447,6 +454,9 @@ val wasmPhases = NamedCompilerPhase( stringConstructorLowering then returnableBlockLoweringPhase then + + forLoopsLoweringPhase then + defaultArgumentStubGeneratorPhase then defaultArgumentPatchOverridesPhase then defaultParameterInjectorPhase then