FIR CFG: merge DFA + CFA edge in Simple edge

This commit is contained in:
Mikhail Glukhikh
2020-05-12 19:11:29 +03:00
parent 32cfee50e0
commit 41f241f608
10 changed files with 27 additions and 14 deletions
@@ -71,10 +71,23 @@ sealed class CFGNode<out E : FirElement>(val owner: ControlFlowGraph, val level:
addJustKindEdge(from, to, kind, propagateDeadness)
}
private fun merge(first: EdgeKind, second: EdgeKind?): EdgeKind? {
return when (first) {
second -> first
EdgeKind.Cfg -> if (second == EdgeKind.Dfg) null else first
EdgeKind.Dfg -> if (second == EdgeKind.Cfg) null else first
else -> first
}
}
internal fun addJustKindEdge(from: CFGNode<*>, to: CFGNode<*>, kind: EdgeKind, propagateDeadness: Boolean) {
if (kind != EdgeKind.Simple) {
from._outgoingEdges[to] = kind
to._incomingEdges[from] = kind
merge(kind, from._outgoingEdges[to])?.let {
from._outgoingEdges[to] = it
} ?: from._outgoingEdges.remove(to)
merge(kind, to._incomingEdges[from])?.let {
to._incomingEdges[from] = it
} ?: to._incomingEdges.remove(from)
}
if (propagateDeadness && kind == EdgeKind.Dead) {
to.isDead = true