From f81be526bc3b2c56f38edab759d6935cc07f77b4 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 26 May 2020 15:40:39 +0300 Subject: [PATCH] Support deserialized IR in IfNullExpressionsFusionLowering Deserializer generates simple branches instead of IrElseBranches. --- .../lower/IfNullExpressionsFusionLowering.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/IfNullExpressionsFusionLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/IfNullExpressionsFusionLowering.kt index b5277f254d9..e3284bcc3db 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/IfNullExpressionsFusionLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/IfNullExpressionsFusionLowering.kt @@ -172,11 +172,22 @@ class IfNullExpressionsFusionLowering(val context: CommonBackendContext) : FileL val arg1 = condition0.getValueArgument(1) as? IrConst<*> ?: return null if (arg1.value != null) return null - val branch1 = whenExpr.branches[1] as? IrElseBranch ?: return null + val elseResult = whenExpr.branches[1].getElseBranchResultOrNull() ?: return null - return IfNullExpr(whenExpr.type, subjectVar, branch0.result, branch1.result) + return IfNullExpr(whenExpr.type, subjectVar, branch0.result, elseResult) } + private fun IrBranch.getElseBranchResultOrNull() = + when { + this is IrElseBranch -> + result + // deserialization generates a simple branch with const 'true' condition + condition is IrConst<*> && condition.value == true -> + result + else -> + null + } + private fun IrExpression.isTrivial() = this is IrExpressionWithCopy