Support deserialized IR in IfNullExpressionsFusionLowering

Deserializer generates simple branches instead of IrElseBranches.
This commit is contained in:
Dmitry Petrov
2020-05-26 15:40:39 +03:00
parent c9f721848a
commit f81be526bc
@@ -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