FIR CFA: remove CFGNode.outgoingEdges

If it's symmetric with incomingEdges, then what's the point?..
This commit is contained in:
pyos
2022-11-27 22:51:22 +01:00
committed by Dmitriy Novozhilov
parent 7feeb7cd4e
commit fa0ea1504e
10 changed files with 35 additions and 78 deletions
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.resolve.dfa.FirControlFlowGraphReferenceImpl
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.EdgeKind
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.test.Assertions
@@ -27,28 +26,18 @@ class FirCfgConsistencyChecker(private val assertions: Assertions) : FirVisitorV
private fun checkConsistency(graph: ControlFlowGraph) {
for (node in graph.nodes) {
assertions.assertEquals(node.followingNodes.size, node.followingNodes.toSet().size) { "followingNodes has repeats: $node" }
assertions.assertEquals(node.previousNodes.size, node.previousNodes.toSet().size) { "previousNodes has repeats: $node" }
for (to in node.followingNodes) {
checkEdge(node, to)
assertions.assertContainsElements(to.previousNodes, node)
assertions.assertFalse(node.isDead && to.isDead && to.edgeFrom(node).kind.usedInDfa) {
"data flow between dead nodes: $node -> $to"
}
}
for (from in node.previousNodes) {
checkEdge(from, node)
assertions.assertContainsElements(from.followingNodes, node)
}
if (node.followingNodes.isEmpty() && node.previousNodes.isEmpty()) {
throw AssertionError("Unconnected CFG node: $node")
}
}
}
private val cfgKinds = listOf(EdgeKind.DeadForward, EdgeKind.CfgForward, EdgeKind.DeadBackward, EdgeKind.CfgBackward)
private fun checkEdge(from: CFGNode<*>, to: CFGNode<*>) {
assertions.assertContainsElements(from.followingNodes, to)
assertions.assertContainsElements(to.previousNodes, from)
val fromKind = from.outgoingEdges.getValue(to).kind
val toKind = to.incomingEdges.getValue(from).kind
assertions.assertEquals(fromKind, toKind)
if (from.isDead && to.isDead) {
assertions.assertContainsElements(cfgKinds, toKind)
assertions.assertFalse(node.followingNodes.isEmpty() && node.previousNodes.isEmpty()) { "Unconnected CFG node: $node" }
}
}
@@ -57,7 +46,7 @@ class FirCfgConsistencyChecker(private val assertions: Assertions) : FirVisitorV
for (node in graph.nodes) {
for (previousNode in node.previousNodes) {
if (previousNode.owner != graph) continue
if (!node.incomingEdges.getValue(previousNode).kind.isBack) {
if (!node.edgeFrom(previousNode).kind.isBack) {
assertions.assertTrue(previousNode in visited)
}
}