From 68d428afb6a9b8feb284ddae4bed49e4fa818a96 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Tue, 13 Oct 2020 21:14:41 +0500 Subject: [PATCH] [IR] Supported implicit casts in box/unbox fold lowering --- .../konan/optimizations/Devirtualization.kt | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt index f1451d6e086..a6b24fb2456 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt @@ -1617,6 +1617,13 @@ internal object Devirtualization { error("Unexpected coercion: ${this.dump()}") } + fun IrExpression.unwrapImplicitCasts(): IrExpression { + var expression = this + while (expression is IrTypeOperatorCall && expression.operator == IrTypeOperator.IMPLICIT_CAST) + expression = expression.argument + return expression + } + fun fold(expression: IrExpression, coercion: IrCall, cast: IrTypeOperatorCall?, transformRecursively: Boolean): PossiblyFoldedExpression { @@ -1629,14 +1636,15 @@ internal object Devirtualization { if (transformRecursively) this.transform(transformer, data = null) else this val coercionDeclaringClass = coercion.symbol.owner.getCoercedClass() - if (expression.isBoxOrUnboxCall()) { - expression as IrCall - val result = - if (coercionDeclaringClass == expression.symbol.owner.getCoercedClass()) - expression.getArguments().single().second - else expression + expression.unwrapImplicitCasts().let { + if (it.isBoxOrUnboxCall()) { + val result = + if (coercionDeclaringClass == (it as IrCall).symbol.owner.getCoercedClass()) + it.getArguments().single().second + else expression - return PossiblyFoldedExpression(result.transformIfAsked(), result != expression) + return PossiblyFoldedExpression(result.transformIfAsked(), result != expression) + } } return when (expression) { is IrReturnableBlock -> {