Revert "[Wasm] Don't use the new br_on_cast* instructions since they are not supported in Node.js yet"

This reverts commit 2d728727

#KT-60828 Fixed
This commit is contained in:
Zalim Bashorov
2023-09-14 00:38:02 +02:00
committed by Space Team
parent eecfc2c6d3
commit 86e854a980
4 changed files with 27 additions and 26 deletions
@@ -542,24 +542,26 @@ class BodyGenerator(
val parameterLocal = functionContext.referenceLocal(SyntheticLocalType.IS_INTERFACE_PARAMETER) val parameterLocal = functionContext.referenceLocal(SyntheticLocalType.IS_INTERFACE_PARAMETER)
body.buildSetLocal(parameterLocal, location) body.buildSetLocal(parameterLocal, location)
body.buildBlock("isInterface", WasmI32) { outerLabel -> body.buildBlock("isInterface", WasmI32) { outerLabel ->
body.buildBlock("isInterface") { innerLabel -> body.buildBlock("isInterface", WasmRefNullType(WasmHeapType.Simple.Struct)) { innerLabel ->
body.buildGetLocal(parameterLocal, location) body.buildGetLocal(parameterLocal, location)
body.buildStructGet(context.referenceGcType(irBuiltIns.anyClass), WasmSymbol(1), location) body.buildStructGet(context.referenceGcType(irBuiltIns.anyClass), WasmSymbol(1), location)
val tmpLocal = functionContext.referenceLocal(SyntheticLocalType.TMP_FOR_BR_ON_CAST_EMULATION) body.buildBrOnCastInstr(
body.buildInstr(WasmOp.LOCAL_TEE, location, WasmImmediate.LocalIdx(tmpLocal)) WasmOp.BR_ON_CAST_FAIL,
body.buildRefTestStatic(classITable, location) innerLabel,
body.buildInstr(WasmOp.I32_EQZ, location) fromIsNullable = true,
body.buildBrIf(innerLabel, location) toIsNullable = false,
from = WasmHeapType.Simple.Struct,
body.buildGetLocal(tmpLocal, location) to = WasmHeapType.Type(classITable),
body.buildRefCastStatic(classITable, location) location,
)
body.buildStructGet(classITable, context.referenceClassITableInterfaceSlot(irInterface.symbol), location) body.buildStructGet(classITable, context.referenceClassITableInterfaceSlot(irInterface.symbol), location)
body.buildInstr(WasmOp.REF_IS_NULL, location) body.buildInstr(WasmOp.REF_IS_NULL, location)
body.buildInstr(WasmOp.I32_EQZ, location) body.buildInstr(WasmOp.I32_EQZ, location)
body.buildBr(outerLabel, location) body.buildBr(outerLabel, location)
} }
body.buildDrop(location)
body.buildConstI32(0, location) body.buildConstI32(0, location)
} }
} else { } else {
@@ -606,23 +608,23 @@ class BodyGenerator(
} }
wasmSymbols.returnArgumentIfItIsKotlinAny -> { wasmSymbols.returnArgumentIfItIsKotlinAny -> {
body.buildBlock("returnIfAny") { innerLabel -> body.buildBlock("returnIfAny", WasmAnyRef) { innerLabel ->
body.buildGetLocal(functionContext.referenceLocal(0), location) body.buildGetLocal(functionContext.referenceLocal(0), location)
body.buildInstr(WasmOp.EXTERN_INTERNALIZE, location) body.buildInstr(WasmOp.EXTERN_INTERNALIZE, location)
val tmpLocal = functionContext.referenceLocal(SyntheticLocalType.TMP_FOR_BR_ON_CAST_EMULATION) body.buildBrOnCastInstr(
body.buildInstr(WasmOp.LOCAL_TEE, location, WasmImmediate.LocalIdx(tmpLocal)) WasmOp.BR_ON_CAST_FAIL,
innerLabel,
val toType = context.referenceGcType(backendContext.irBuiltIns.anyClass) fromIsNullable = true,
body.buildRefTestStatic(toType, location) toIsNullable = true,
body.buildInstr(WasmOp.I32_EQZ, location) from = WasmHeapType.Simple.Any,
body.buildBrIf(innerLabel, location) to = WasmHeapType.Type(context.referenceGcType(backendContext.irBuiltIns.anyClass)),
location,
body.buildGetLocal(tmpLocal, location) )
body.buildRefCastStatic(toType, location)
body.buildInstr(WasmOp.RETURN, location) body.buildInstr(WasmOp.RETURN, location)
} }
body.buildDrop(location)
} }
wasmSymbols.wasmArrayCopy -> { wasmSymbols.wasmArrayCopy -> {
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.wasm.ir.* import org.jetbrains.kotlin.wasm.ir.*
enum class LoopLabelType { BREAK, CONTINUE } enum class LoopLabelType { BREAK, CONTINUE }
enum class SyntheticLocalType { IS_INTERFACE_PARAMETER, TABLE_SWITCH_SELECTOR, TMP_FOR_BR_ON_CAST_EMULATION } enum class SyntheticLocalType { IS_INTERFACE_PARAMETER, TABLE_SWITCH_SELECTOR }
class WasmFunctionCodegenContext( class WasmFunctionCodegenContext(
val irFunction: IrFunction, val irFunction: IrFunction,
@@ -61,8 +61,6 @@ class WasmFunctionCodegenContext(
get() = when (this) { get() = when (this) {
SyntheticLocalType.IS_INTERFACE_PARAMETER -> SyntheticLocalType.IS_INTERFACE_PARAMETER ->
WasmRefNullType(WasmHeapType.Type(context.referenceGcType(backendContext.irBuiltIns.anyClass))) WasmRefNullType(WasmHeapType.Type(context.referenceGcType(backendContext.irBuiltIns.anyClass)))
SyntheticLocalType.TMP_FOR_BR_ON_CAST_EMULATION ->
WasmRefNullType(WasmHeapType.Simple.Any)
SyntheticLocalType.TABLE_SWITCH_SELECTOR -> WasmI32 SyntheticLocalType.TABLE_SWITCH_SELECTOR -> WasmI32
} }
@@ -251,6 +251,8 @@ internal annotation class WasmOp(val name: String) {
const val REF_TEST_NULL = "REF_TEST_NULL" const val REF_TEST_NULL = "REF_TEST_NULL"
const val REF_CAST = "REF_CAST" const val REF_CAST = "REF_CAST"
const val REF_CAST_NULL = "REF_CAST_NULL" const val REF_CAST_NULL = "REF_CAST_NULL"
const val BR_ON_CAST = "BR_ON_CAST"
const val BR_ON_CAST_FAIL = "BR_ON_CAST_FAIL"
const val EXTERN_INTERNALIZE = "EXTERN_INTERNALIZE" const val EXTERN_INTERNALIZE = "EXTERN_INTERNALIZE"
const val EXTERN_EXTERNALIZE = "EXTERN_EXTERNALIZE" const val EXTERN_EXTERNALIZE = "EXTERN_EXTERNALIZE"
const val PSEUDO_COMMENT_PREVIOUS_INSTR = "PSEUDO_COMMENT_PREVIOUS_INSTR" const val PSEUDO_COMMENT_PREVIOUS_INSTR = "PSEUDO_COMMENT_PREVIOUS_INSTR"
@@ -381,9 +381,8 @@ enum class WasmOp(
REF_CAST("ref.cast", 0xFB_16, HEAP_TYPE), REF_CAST("ref.cast", 0xFB_16, HEAP_TYPE),
REF_CAST_NULL("ref.cast null", 0xFB_17, HEAP_TYPE), REF_CAST_NULL("ref.cast null", 0xFB_17, HEAP_TYPE),
// TODO: KT-60828 Return br_on_cast_fail usages when it's possible BR_ON_CAST("br_on_cast", 0xFB_18, listOf(CONST_U8, LABEL_IDX, HEAP_TYPE, HEAP_TYPE)),
// BR_ON_CAST("br_on_cast", 0xFB_18, listOf(CONST_U8, LABEL_IDX, HEAP_TYPE, HEAP_TYPE)), BR_ON_CAST_FAIL("br_on_cast_fail", 0xFB_19, listOf(CONST_U8, LABEL_IDX, HEAP_TYPE, HEAP_TYPE)),
// BR_ON_CAST_FAIL("br_on_cast_fail", 0xFB_19, listOf(CONST_U8, LABEL_IDX, HEAP_TYPE, HEAP_TYPE)),
EXTERN_INTERNALIZE("extern.internalize", 0xFB_1A), // externref -> anyref EXTERN_INTERNALIZE("extern.internalize", 0xFB_1A), // externref -> anyref
EXTERN_EXTERNALIZE("extern.externalize", 0xFB_1B), // anyref -> externref EXTERN_EXTERNALIZE("extern.externalize", 0xFB_1B), // anyref -> externref