From 8306b1bd71d2847c3b0b5687133f67a308139d48 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Wed, 29 Jun 2022 14:43:14 +0200 Subject: [PATCH] [WASM] Remove deprecated wasm instructions --- .../dce/WasmUsefulDeclarationProcessor.kt | 40 ++++--------------- .../backend/wasm/ir2wasm/BodyGenerator.kt | 26 +++++------- .../kotlin/wasm/internal/WasmInstructions.kt | 6 +-- .../stdlib/wasm/src/generated/_WasmOp.kt | 18 ++++----- .../org/jetbrains/kotlin/wasm/ir/Operators.kt | 12 ------ .../kotlin/wasm/ir/WasmExpressionBuilder.kt | 4 -- 6 files changed, 28 insertions(+), 78 deletions(-) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/WasmUsefulDeclarationProcessor.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/WasmUsefulDeclarationProcessor.kt index a48f2b924b6..c773ecc83fe 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/WasmUsefulDeclarationProcessor.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/WasmUsefulDeclarationProcessor.kt @@ -43,56 +43,30 @@ internal class WasmUsefulDeclarationProcessor( } true } + context.wasmSymbols.wasmClassId, context.wasmSymbols.wasmInterfaceId, context.wasmSymbols.refCast, - context.wasmSymbols.refTest -> { - call.getTypeArgument(0)?.getClass()?.enqueue(from, "generic intrinsic ${call.symbol.owner.name}") + context.wasmSymbols.refTest, + context.wasmSymbols.boxIntrinsic -> { + call.getTypeArgument(0)?.enqueueRuntimeClassOrAny(from, "intrinsic ${call.symbol.owner.name}") true } + else -> false } - private fun tryToProcessWasmOpIntrinsicCall(from: IrDeclaration, call: IrCall, function: IrFunction): Boolean { - if (function.hasWasmNoOpCastAnnotation()) { - return true - } - - val opString = function.getWasmOpAnnotation() - if (opString != null) { - val op = WasmOp.valueOf(opString) - when (op.immediates.size) { - 0 -> { - if (op == WasmOp.REF_TEST || op == WasmOp.REF_TEST_STATIC) { - call.getTypeArgument(0)?.enqueueRuntimeClassOrAny(from, "REF_TEST/REF_TEST_STATIC") - } - } - 1 -> { - if (op.immediates.firstOrNull() == WasmImmediateKind.STRUCT_TYPE_IDX) { - function.dispatchReceiverParameter?.type?.classOrNull?.owner?.enqueue(from, "STRUCT_TYPE_IDX") - } - } - } - return true - } - return false - } - override fun visitCall(expression: IrCall, data: IrDeclaration) { super.visitCall(expression, data) - if (expression.symbol == context.wasmSymbols.boxIntrinsic) { - expression.getTypeArgument(0)?.enqueueRuntimeClassOrAny(data, "boxIntrinsic") - return - } - val function: IrFunction = expression.symbol.owner.realOverrideTarget if (function.returnType == context.irBuiltIns.unitType) { unitGetInstance.enqueue(data, "function Unit return type") } if (tryToProcessIntrinsicCall(data, expression)) return - if (tryToProcessWasmOpIntrinsicCall(data, expression, function)) return + if (function.hasWasmNoOpCastAnnotation()) return + if (function.getWasmOpAnnotation() != null) return val isSuperCall = expression.superQualifierSymbol != null if (function is IrSimpleFunction && function.isOverridable && !isSuperCall) { diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt index 012cabce4d4..142d91fdfe6 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt @@ -197,9 +197,8 @@ class BodyGenerator( if (klass.getWasmArrayAnnotation() != null) { require(expression.valueArgumentsCount == 1) { "@WasmArrayOf constructs must have exactly one argument" } generateExpression(expression.getValueArgument(0)!!) - body.buildRttCanon(wasmGcType) body.buildInstr( - WasmOp.ARRAY_NEW_DEFAULT_WITH_RTT, + WasmOp.ARRAY_NEW_DEFAULT, WasmImmediate.GcType(wasmGcType) ) return @@ -383,7 +382,7 @@ class BodyGenerator( call: IrFunctionAccessExpression, function: IrFunction ): Boolean { - if (tryToGenerateWasmOpIntrinsicCall(call, function)) { + if (tryToGenerateWasmOpIntrinsicCall(function)) { return true } @@ -436,6 +435,13 @@ class BodyGenerator( ) } + wasmSymbols.refTest -> { + generateRefTest( + fromType = call.getValueArgument(0)!!.type, + toType = call.getTypeArgument(0)!! + ) + } + wasmSymbols.unboxIntrinsic -> { val fromType = call.getTypeArgument(0)!! @@ -625,7 +631,7 @@ class BodyGenerator( } // Return true if function is recognized as intrinsic. - private fun tryToGenerateWasmOpIntrinsicCall(call: IrFunctionAccessExpression, function: IrFunction): Boolean { + private fun tryToGenerateWasmOpIntrinsicCall(function: IrFunction): Boolean { if (function.hasWasmNoOpCastAnnotation()) { return true } @@ -635,17 +641,7 @@ class BodyGenerator( val op = WasmOp.valueOf(opString) when (op.immediates.size) { 0 -> { - when (op) { - WasmOp.REF_TEST, WasmOp.REF_TEST_STATIC -> { - generateRefTest( - fromType = call.getValueArgument(0)!!.type, - toType = call.getTypeArgument(0)!! - ) - } - else -> { - body.buildInstr(op) - } - } + body.buildInstr(op) } 1 -> { val immediates = arrayOf( diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmInstructions.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmInstructions.kt index decb9620eb3..69bbc71cafe 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmInstructions.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmInstructions.kt @@ -21,6 +21,9 @@ internal fun wasm_unreachable(): Nothing = internal fun wasm_ref_cast(a: Any?): To = implementedAsIntrinsic +internal fun wasm_ref_test(a: Any?): Boolean = + implementedAsIntrinsic + @WasmOp(WasmOp.I32_EQ) public external fun wasm_i32_eq(a: Int, b: Int): Boolean @@ -285,9 +288,6 @@ public external fun wasm_ref_is_null(a: Any?): Boolean @WasmOp(WasmOp.REF_EQ) public external fun wasm_ref_eq(a: Any?, b: Any?): Boolean -@WasmOp(WasmOp.REF_TEST) -public external fun wasm_ref_test(a: Any?): Boolean - // --- @WasmOp(WasmOp.F32_NEAREST) diff --git a/libraries/stdlib/wasm/src/generated/_WasmOp.kt b/libraries/stdlib/wasm/src/generated/_WasmOp.kt index 82d188a1894..c1bdf9d20b3 100644 --- a/libraries/stdlib/wasm/src/generated/_WasmOp.kt +++ b/libraries/stdlib/wasm/src/generated/_WasmOp.kt @@ -239,15 +239,14 @@ internal annotation class WasmOp(val name: String) { const val CALL_REF = "CALL_REF" const val RETURN_CALL_REF = "RETURN_CALL_REF" const val FUNC_BIND = "FUNC_BIND" - const val LET = "LET" - const val STRUCT_NEW_WITH_RTT = "STRUCT_NEW_WITH_RTT" - const val STRUCT_NEW_DEFAULT_WITH_RTT = "STRUCT_NEW_DEFAULT_WITH_RTT" + const val STRUCT_NEW = "STRUCT_NEW" + const val STRUCT_NEW_DEFAULT = "STRUCT_NEW_DEFAULT" const val STRUCT_GET = "STRUCT_GET" const val STRUCT_GET_S = "STRUCT_GET_S" const val STRUCT_GET_U = "STRUCT_GET_U" const val STRUCT_SET = "STRUCT_SET" - const val ARRAY_NEW_WITH_RTT = "ARRAY_NEW_WITH_RTT" - const val ARRAY_NEW_DEFAULT_WITH_RTT = "ARRAY_NEW_DEFAULT_WITH_RTT" + const val ARRAY_NEW = "ARRAY_NEW" + const val ARRAY_NEW_DEFAULT = "ARRAY_NEW_DEFAULT" const val ARRAY_GET = "ARRAY_GET" const val ARRAY_GET_S = "ARRAY_GET_S" const val ARRAY_GET_U = "ARRAY_GET_U" @@ -256,12 +255,9 @@ internal annotation class WasmOp(val name: String) { const val I31_NEW = "I31_NEW" const val I31_GET_S = "I31_GET_S" const val I31_GET_U = "I31_GET_U" - const val RTT_CANON = "RTT_CANON" - const val RTT_SUB = "RTT_SUB" - const val REF_TEST = "REF_TEST" - const val REF_CAST = "REF_CAST" - const val BR_ON_CAST = "BR_ON_CAST" - const val BR_ON_CAST_FAIL = "BR_ON_CAST_FAIL" + const val REF_TEST_STATIC = "REF_TEST_STATIC" + const val REF_CAST_STATIC = "REF_CAST_STATIC" + const val BR_ON_CAST_STATIC_FAIL = "BR_ON_CAST_STATIC_FAIL" const val REF_IS_FUNC = "REF_IS_FUNC" const val REF_IS_DATA = "REF_IS_DATA" const val REF_IS_I31 = "REF_IS_I31" diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt index 1622121aef9..65270c5cb2d 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt @@ -338,11 +338,8 @@ enum class WasmOp( CALL_REF("call_ref", 0x14), RETURN_CALL_REF("return_call_ref", 0x15), FUNC_BIND("func.bind", 0x16, FUNC_IDX), - LET("let", 0x17, listOf(BLOCK_TYPE, LOCAL_DEFS)), // GC - STRUCT_NEW_WITH_RTT("struct.new_with_rtt", 0xFB_01, STRUCT_TYPE_IDX), - STRUCT_NEW_DEFAULT_WITH_RTT("struct.new_default_with_rtt", 0xFB_02, STRUCT_TYPE_IDX), STRUCT_NEW("struct.new", 0xFB_07, STRUCT_TYPE_IDX), STRUCT_NEW_DEFAULT("struct.new_default", 0xFB_08, STRUCT_TYPE_IDX), STRUCT_GET("struct.get", 0xFB_03, listOf(STRUCT_TYPE_IDX, STRUCT_FIELD_IDX)), @@ -350,8 +347,6 @@ enum class WasmOp( STRUCT_GET_U("struct.get_u", 0xFB_05, listOf(STRUCT_TYPE_IDX, STRUCT_FIELD_IDX)), STRUCT_SET("struct.set", 0xFB_06, listOf(STRUCT_TYPE_IDX, STRUCT_FIELD_IDX)), - ARRAY_NEW_WITH_RTT("array.new_with_rtt", 0xFB_11, STRUCT_TYPE_IDX), - ARRAY_NEW_DEFAULT_WITH_RTT("array.new_default_with_rtt", 0xFB_12, STRUCT_TYPE_IDX), ARRAY_NEW("array.new", 0xFB_1B, STRUCT_TYPE_IDX), ARRAY_NEW_DEFAULT("array.new_default", 0xFB_1C, STRUCT_TYPE_IDX), ARRAY_GET("array.get", 0xFB_13, listOf(STRUCT_TYPE_IDX)), @@ -364,16 +359,9 @@ enum class WasmOp( I31_GET_S("i31.get_s", 0xFB_21), I31_GET_U("i31.get_u", 0xFB_22), - RTT_CANON("rtt.canon", 0xFB_30, TYPE_IDX), - - REF_TEST("ref.test", 0xFB_40), REF_TEST_STATIC("ref.test_static", 0xFB_44, STRUCT_TYPE_IDX), - REF_CAST("ref.cast", 0xFB_41), REF_CAST_STATIC("ref.cast_static", 0xFB_45, STRUCT_TYPE_IDX), - BR_ON_CAST("br_on_cast", 0xFB_42, listOf(LABEL_IDX)), - - BR_ON_CAST_FAIL("br_on_cast_fail", 0xfb43, listOf(LABEL_IDX)), BR_ON_CAST_STATIC_FAIL("br_on_cast_static_fail", 0xfb47, listOf(LABEL_IDX, STRUCT_TYPE_IDX)), REF_IS_FUNC("ref.is_func", 0xfb50), diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/WasmExpressionBuilder.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/WasmExpressionBuilder.kt index e11dc356568..ca675725b7f 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/WasmExpressionBuilder.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/WasmExpressionBuilder.kt @@ -162,10 +162,6 @@ abstract class WasmExpressionBuilder { buildInstr(WasmOp.REF_NULL, WasmImmediate.HeapType(WasmRefType(type))) } - fun buildRttCanon(decl: WasmSymbol) { - buildInstr(WasmOp.RTT_CANON, WasmImmediate.TypeIdx(decl)) - } - fun buildDrop() { buildInstr(WasmOp.DROP) }