From 3335db0aa8db181f4ac5ecf7451d5178acafb6ef Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 22 Aug 2023 17:05:31 +0200 Subject: [PATCH] [IR] Simplify unsigned check in `EVALUATION_MODE` This way we are not creating useless intermediate lists. This change speeds up backend by approximately 0.38%. --- .../kotlin/ir/interpreter/checker/EvaluationMode.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt index 0bf3c58c0b9..5e755317beb 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt @@ -81,12 +81,19 @@ enum class EvaluationMode { override fun canEvaluateExpression(expression: IrExpression): Boolean { if (expression !is IrCall) return false - if (expression.getAllArgumentsWithIr().any { it.second?.type?.isUnsigned() == true }) { + if (expression.hasUnsignedArgs()) { return expression.symbol.owner.fqNameWhenAvailable?.asString() == "kotlin.String.plus" } return true } + + private fun IrCall.hasUnsignedArgs(): Boolean { + fun IrExpression?.hasUnsignedType() = this != null && type.isUnsigned() + if (dispatchReceiver.hasUnsignedType() || extensionReceiver.hasUnsignedType()) return true + if ((0 until this.valueArgumentsCount).any { getValueArgument(it)?.type?.isUnsigned() == true }) return true + return false + } }, ONLY_INTRINSIC_CONST {