[WASM] Remove unreachable code from compiled wasm

This commit is contained in:
Igor Yakovlev
2022-08-10 20:13:17 +02:00
committed by teamcity
parent c2d4a2cfb5
commit 03c500d9e9
5 changed files with 91 additions and 37 deletions
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.backend.wasm.ir2wasm
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.expressions.IrLoop
import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.wasm.ir.WasmExpressionBuilder
import org.jetbrains.kotlin.wasm.ir.WasmInstr
import org.jetbrains.kotlin.wasm.ir.WasmLocal
enum class LoopLabelType { BREAK, CONTINUE }
@@ -23,6 +23,9 @@ interface WasmFunctionCodegenContext : WasmBaseCodegenContext {
fun referenceLocal(index: Int): WasmLocal
fun referenceLocal(type: SyntheticLocalType): WasmLocal
fun defineNonLocalReturnLevel(block: IrReturnableBlockSymbol, level: Int)
fun referenceNonLocalReturnLevel(block: IrReturnableBlockSymbol): Int
fun defineLoopLevel(irLoop: IrLoop, labelType: LoopLabelType, level: Int)
fun referenceLoopLevel(irLoop: IrLoop, labelType: LoopLabelType): Int
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.wasm.WasmBackendContext
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.expressions.IrLoop
import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.wasm.ir.*
@@ -29,6 +30,7 @@ class WasmFunctionCodegenContextImpl(
private val wasmLocals = LinkedHashMap<IrValueSymbol, WasmLocal>()
private val wasmSyntheticLocals = LinkedHashMap<SyntheticLocalType, WasmLocal>()
private val loopLevels = LinkedHashMap<Pair<IrLoop, LoopLabelType>, Int>()
private val nonLocalReturnLevels = LinkedHashMap<IrReturnableBlockSymbol, Int>()
override fun defineLocal(irValueDeclaration: IrValueSymbol) {
assert(irValueDeclaration !in wasmLocals) { "Redefinition of local" }
@@ -70,6 +72,14 @@ class WasmFunctionCodegenContextImpl(
}
}
override fun defineNonLocalReturnLevel(block: IrReturnableBlockSymbol, level: Int) {
nonLocalReturnLevels[block] = level
}
override fun referenceNonLocalReturnLevel(block: IrReturnableBlockSymbol): Int {
return nonLocalReturnLevels.getValue(block)
}
override fun defineLoopLevel(irLoop: IrLoop, labelType: LoopLabelType, level: Int) {
val loopKey = Pair(irLoop, labelType)
assert(loopKey !in loopLevels) { "Redefinition of loop" }