FIR CFG: handle 'Dead' properly in edge kind merging

This commit is contained in:
Mikhail Glukhikh
2020-05-12 19:32:17 +03:00
parent 41f241f608
commit 0c0f4ef3db
@@ -72,13 +72,17 @@ sealed class CFGNode<out E : FirElement>(val owner: ControlFlowGraph, val level:
} }
private fun merge(first: EdgeKind, second: EdgeKind?): EdgeKind? { private fun merge(first: EdgeKind, second: EdgeKind?): EdgeKind? {
return when (first) { return when (second) {
second -> first null, EdgeKind.Simple, first -> first
EdgeKind.Dead -> second
// Note: first can be only Cfg, Dfg, or Dead
else -> when (first) {
EdgeKind.Cfg -> if (second == EdgeKind.Dfg) null else first EdgeKind.Cfg -> if (second == EdgeKind.Dfg) null else first
EdgeKind.Dfg -> if (second == EdgeKind.Cfg) null else first EdgeKind.Dfg -> if (second == EdgeKind.Cfg) null else first
else -> first else -> first
} }
} }
}
internal fun addJustKindEdge(from: CFGNode<*>, to: CFGNode<*>, kind: EdgeKind, propagateDeadness: Boolean) { internal fun addJustKindEdge(from: CFGNode<*>, to: CFGNode<*>, kind: EdgeKind, propagateDeadness: Boolean) {
if (kind != EdgeKind.Simple) { if (kind != EdgeKind.Simple) {