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