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
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user