[WASM] Table switch optimisation for reversed arguments
This commit is contained in:
+18
-7
@@ -10,12 +10,10 @@ import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
|||||||
import org.jetbrains.kotlin.backend.common.IrWhenUtils
|
import org.jetbrains.kotlin.backend.common.IrWhenUtils
|
||||||
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||||
import org.jetbrains.kotlin.backend.wasm.WasmBackendContext
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
|
import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
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.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.interpreter.toIrConst
|
import org.jetbrains.kotlin.ir.interpreter.toIrConst
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
@@ -58,7 +56,10 @@ class WasmStringSwitchOptimizerLowering(
|
|||||||
private fun tryMatchCaseToNullableStringConstant(condition: IrExpression): IrConst<*>? {
|
private fun tryMatchCaseToNullableStringConstant(condition: IrExpression): IrConst<*>? {
|
||||||
val eqCall = asEqCall(condition) ?: return null
|
val eqCall = asEqCall(condition) ?: return null
|
||||||
if (eqCall.valueArgumentsCount < 2) 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) {
|
return when (constantReceiver.kind) {
|
||||||
IrConstKind.String, IrConstKind.Null -> constantReceiver
|
IrConstKind.String, IrConstKind.Null -> constantReceiver
|
||||||
else -> null
|
else -> null
|
||||||
@@ -66,7 +67,17 @@ class WasmStringSwitchOptimizerLowering(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun IrBlockBuilder.addHashCodeVariable(firstEqCall: IrCall): IrVariable {
|
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 subjectType = subject.type
|
||||||
|
|
||||||
val whenSubject = buildVariable(
|
val whenSubject = buildVariable(
|
||||||
@@ -80,7 +91,7 @@ class WasmStringSwitchOptimizerLowering(
|
|||||||
|
|
||||||
whenSubject.initializer = subject
|
whenSubject.initializer = subject
|
||||||
+whenSubject
|
+whenSubject
|
||||||
firstEqCall.putValueArgument(0, irGet(whenSubject))
|
firstEqCall.putValueArgument(subjectArgumentIndex, irGet(whenSubject))
|
||||||
|
|
||||||
val tmpIntWhenSubject = buildVariable(
|
val tmpIntWhenSubject = buildVariable(
|
||||||
scope.getLocalDeclarationParent(),
|
scope.getLocalDeclarationParent(),
|
||||||
|
|||||||
Reference in New Issue
Block a user