Support deserialized IR in IfNullExpressionsFusionLowering
Deserializer generates simple branches instead of IrElseBranches.
This commit is contained in:
+13
-2
@@ -172,11 +172,22 @@ class IfNullExpressionsFusionLowering(val context: CommonBackendContext) : FileL
|
|||||||
val arg1 = condition0.getValueArgument(1) as? IrConst<*> ?: return null
|
val arg1 = condition0.getValueArgument(1) as? IrConst<*> ?: return null
|
||||||
if (arg1.value != null) 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() =
|
private fun IrExpression.isTrivial() =
|
||||||
this is IrExpressionWithCopy
|
this is IrExpressionWithCopy
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user