[WASM] Table switch optimisation for reversed arguments

This commit is contained in:
Igor Yakovlev
2022-10-28 12:28:47 +02:00
committed by teamcity
parent 0e54e00e48
commit 5d44766752
@@ -10,12 +10,10 @@ import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
import org.jetbrains.kotlin.backend.common.IrWhenUtils
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
import org.jetbrains.kotlin.backend.wasm.WasmBackendContext
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.interpreter.toIrConst
import org.jetbrains.kotlin.ir.types.IrType
@@ -58,7 +56,10 @@ class WasmStringSwitchOptimizerLowering(
private fun tryMatchCaseToNullableStringConstant(condition: IrExpression): IrConst<*>? {
val eqCall = asEqCall(condition) ?: return null
if (eqCall.valueArgumentsCount < 2) return null
val constantReceiver = eqCall.getValueArgument(1) as? IrConst<*> ?: return null
val constantReceiver =
eqCall.getValueArgument(0) as? IrConst<*>
?: eqCall.getValueArgument(1) as? IrConst<*>
?: return null
return when (constantReceiver.kind) {
IrConstKind.String, IrConstKind.Null -> constantReceiver
else -> null
@@ -66,7 +67,17 @@ class WasmStringSwitchOptimizerLowering(
}
private fun IrBlockBuilder.addHashCodeVariable(firstEqCall: IrCall): IrVariable {
val subject = firstEqCall.getValueArgument(0)!!
val subject: IrExpression
val subjectArgumentIndex: Int
val firstArgument = firstEqCall.getValueArgument(0)!!
if (firstArgument is IrConst<*>) {
subject = firstEqCall.getValueArgument(1)!!
subjectArgumentIndex = 1
} else {
subject = firstArgument
subjectArgumentIndex = 0
}
val subjectType = subject.type
val whenSubject = buildVariable(
@@ -80,7 +91,7 @@ class WasmStringSwitchOptimizerLowering(
whenSubject.initializer = subject
+whenSubject
firstEqCall.putValueArgument(0, irGet(whenSubject))
firstEqCall.putValueArgument(subjectArgumentIndex, irGet(whenSubject))
val tmpIntWhenSubject = buildVariable(
scope.getLocalDeclarationParent(),