diff --git a/.gitignore b/.gitignore index 4be53026b..29818c290 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ ### Generated files ### /benchmarks/gen/ /benchmarks/logs/ +/cfpq-paths-app/gen/ ### Antlr parsers ### /benchmarks/src/main/java/org/antlr/* diff --git a/cfpq-paths-app/README.md b/cfpq-paths-app/README.md new file mode 100644 index 000000000..51a8559d1 --- /dev/null +++ b/cfpq-paths-app/README.md @@ -0,0 +1,248 @@ +>[!CAUTION] +>For demo purposes only! +>Do not expect big graphs to be processed successfully (in reasonable time or without out-of-memory errors). + +This demo is based on UCFS, which, for a given grammar represented as an RSM, a graph, and start vertices, produces an SPPF. + +**RSM** (Recursive State Machine) is an automaton-like representation of context-free languages. + +**SPPF** (Shared Packed Parse Forest) is a derivation-tree-like structure that represents **all** possible paths satisfying the specified grammar. If the number of such paths is infinite, the SPPF contains cycles. +SPPF consists of nodes of the types listed below. Each node has a unique Id and detailed information specific to its type. + +* **Nonterminal** node contains the name of the non-terminal and pairs of vertices from the input graph that are the start and end of paths derived from that non-terminal. + + ![Graph for example 1](../docs/docs/figures/Nonterm_example.dot.svg) + + This node has number ```0``` and is the root of all derivations for all paths from 1 to 4 derivable from non-terminal ```S``` + +* **Terminal** node is a leaf and corresponds to an edge. + + ![Graph for example 1](../docs/docs/figures/Terminal_example.dot.svg) + + This node depicts edge ```3 -alloc-> 4```. + +* **Epsilon** node is a simplified way to represent that $\varepsilon$ is derived at a specific position. + + ![Graph for example 1](../docs/docs/figures/Epsilon_example.dot.svg) + +* **Range** node is a supplementary node that helps reuse subtrees. + + ![Graph for example 1](../docs/docs/figures/Range_example.dot.svg) + + This node represents all subpaths from 0 to 4 that are accepted while the RSM transitions from ```S_0``` to ```S_2```. + +* **Intermediate** node is a supplementary node used to connect subpaths. + + ![Graph for example 1](../docs/docs/figures/Intermediate_example.dot.svg) + + This node depicts that the path from 0 to 2 is composed of two parts: from 0 to 1 and from 1 to 2. + +**Requirements**: 11 java + +**To run (from project root)**: + +```bash +./gradlew :cfpq-app:run +``` + +**Input graphs:** ```src/main/resources/``` + +**Grammar and code for paths extraction:** ```src/main/kotlin/me/vkutuev/Main.kt``` + +>[!NOTE] +> We implemented a very naive path extraction algorithm solely to demonstrate SPPF traversal. + +## Examples + +We provide a few code snippets, the corresponding graphs to be analyzed, parts of the resulting SPPFs, and extracted paths. + +For analysis, we use the following extended points-to grammar (start non-terminal is ```S```), which allows us to analyze chains of fields. +``` +PointsTo -> ("assign" | ("load_i" Alias "store_i"))* "alloc" +FlowsTo -> "alloc_r" ("assign_r" | ("store_i_r" Alias "load_o_r"))* +Alias -> PointsTo FlowsTo +S -> (Alias? "store_i")* PointsTo +``` + +The `PointsTo`, `FlowsTo` and `Alias` rules follow the field-sensitive points-to grammar from [Dietrich et al., "Giga-scale exhaustive points-to analysis for Java in under a minute", OOPSLA 2015](https://doi.org/10.1145/2814270.2814307). + +For all our examples, we use a common grammar with $i \in [0..3]$. +The corresponding RSM is presented below: + +![Graph for example 1](../docs/docs/figures/rsm.dot.svg) + +### Example 1 +Code snippet: +```java +val n = new X() +val y = new Y() +val z = new Z() +val l = n +val t = y +l.u = y +t.v = z +``` + +Respective graph: + +![Graph for example 1](../docs/docs/figures/graph_1.dot.svg) + +Resulting SPPF: + +![SPPF for example 1](../docs/docs/figures/graph_1_sppf.dot.svg) + +Three trees are extracted because there are three paths of interest from node 1. +We do not extract subpaths derivable from non-terminals ```Alias``` and ```PointsTo```, as they contain no useful information for restoring fields. + + +Respective paths: + +* [(1-PointsTo->0)] + + This path is trivial. Such paths will be omitted in further examples. + +* [(1-Alias->2), (2-store_0->3), (3-PointsTo->4)] + + This path means that ```n.u = new Y()```. Vertex 2 is an alias for 1 (corresponding to ```n```), and 2 has a field ```u``` that points to ```new Y()``` (```store_0``` corresponds to ```l.u = y```). + +* [(1-Alias->2), (2-store_0->3), (3-Alias->5), (5-store_1->6), (6-PointsTo->7)] + + This path means that ```n.u.v = new Z()```. + + +### Example 2 + +Code snippet: +```java +val n = new X() +val l = n +while (...){ + l.next = new X() + l = l.next +} +``` + +Respective graph: + +![Graph for example 2](../docs/docs/figures/graph_2.dot.svg) + +Part of resulting SPPF: + +![SPPF for example 2](../docs/docs/figures/graph_2_sppf.dot.svg) + +This part contains a cycle formed by vertices 27–31–34–37–38–40–42–44–47–49–52–56 (colored in red). This is because there are infinitely many paths of interest. We extract some of them: + +* [(0-Alias->2), (2-store_0->3), (3-PointsTo->4)] + + ```n.next = new X () // line 4``` + +* [(0-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-PointsTo->4)] + + ```n.next.next = new X () // line 4``` + +* [(0-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-PointsTo->4)] + + ```n.next.next.next = new X () // line 4``` + +* [(0-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-PointsTo->4)] + + ```n.next.next.next.next = new X () // line 4``` + +* [(0-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-PointsTo->4)] + + ```n.next.next.next.next.next = new X () // line 4``` + +* [(0-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-Alias->2), (2-store_0->3), (3-PointsTo->4)] + + ```n.next.next.next.next.next.next = new X () // line 4``` + +More paths can be extracted if needed. Traversal should be tuned accordingly. + +### Example 3 + +Code snippet: +```java +val n = new X() +val l = n +while (...){ + val t = new X() + l.next = t + l = t +} +``` + +Respective graph: + +![Graph for example 3](../docs/docs/figures/graph_3.dot.svg) + +Part of resulting SPPF: + +![SPPF for example 3](../docs/docs/figures/graph_3_sppf.dot.svg) + +This SPPF also contains a cycle (3–5–7–11), so there are infinitely many paths of interest, and we extract only a few of them. + +* [(0-Alias->1), (1-store_0->2), (2-PointsTo->3)] + + ```n.next = new X() // line 4``` + +* [(0-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-PointsTo->3)] + + ```n.next.next = new X() // line 4``` + +* [(0-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-PointsTo->3)] + + ```n.next.next.next = new X() // line 4``` + +* [(0-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-PointsTo->3)] + + ```n.next.next.next.next = new X() // line 4``` + +* [(0-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-PointsTo->3)] + + ```n.next.next.next.next.next = new X() // line 4``` + +* [(0-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-Alias->1), (1-store_0->2), (2-PointsTo->3)] + + ```n.next.next.next.next.next.next = new X() // line 4``` + + +### Example 4 + +Code snippet: + +```java +val n = new X() +val z = new Z() +val u = new U() +z.x = n +u.y = n +val v = z.x +v.p = new Y() +val r = u.y +r.q = new P() +``` +Respective graph: + +![Graph for example 4](../docs/docs/figures/graph_4.dot.svg) + +For this example, we omit the figure of the SPPF due to its size. However, we present the respective paths. Note that in this example, we specify two vertices as start: 1 and 8. + +* [(1-Alias->9), (9-store_3->11), (11-PointsTo->13)] + + ```n.q = new P()``` + +* [(1-Alias->8), (8-store_2->10), (10-PointsTo->12)] + + ```n.p = new Y() ``` + +* [(8-Alias->9), (9-store_3->11), (11-PointsTo->13)] + + ```v.q = new P() ``` + +* [(8-store_2->10), (10-PointsTo->12)] + + ```v.p = new Y() ``` + +* [(8-Alias->8), (8-store_2->10), (10-PointsTo->12)] + + ```v.p = new Y() ``` diff --git a/cfpq-paths-app/build.gradle.kts b/cfpq-paths-app/build.gradle.kts new file mode 100644 index 000000000..5f2ce270d --- /dev/null +++ b/cfpq-paths-app/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + kotlin("jvm") version "2.3.0" + application +} + +repositories { + mavenCentral() +} + +dependencies { + implementation(kotlin("stdlib")) + implementation(project(":solver")) + + testImplementation(kotlin("test")) + testImplementation("org.junit.jupiter:junit-jupiter:5.8.1") +} + +kotlin { + jvmToolchain(11) +} + +tasks.test { useJUnitPlatform() } + +application { + mainClass = "org.ucfs.paths.MainKt" +} diff --git a/cfpq-paths-app/src/main/kotlin/org/ucfs/paths/Main.kt b/cfpq-paths-app/src/main/kotlin/org/ucfs/paths/Main.kt new file mode 100644 index 000000000..712bb7422 --- /dev/null +++ b/cfpq-paths-app/src/main/kotlin/org/ucfs/paths/Main.kt @@ -0,0 +1,128 @@ +package org.ucfs.paths + +import org.ucfs.grammar.combinator.Grammar +import org.ucfs.grammar.combinator.extension.StringExtension.or +import org.ucfs.grammar.combinator.extension.StringExtension.times +import org.ucfs.grammar.combinator.regexp.Nt +import org.ucfs.grammar.combinator.regexp.Option +import org.ucfs.grammar.combinator.regexp.many +import org.ucfs.input.DotParser +import org.ucfs.input.InputGraph +import org.ucfs.input.TerminalInputLabel +import org.ucfs.parser.Gll +import org.ucfs.sppf.getSppfDot +import org.ucfs.sppf.node.* +import java.nio.file.Files +import java.nio.file.Path + +class PointsToGrammar : Grammar() { + val S by Nt().asStart() + val Alias by Nt() + val PointsTo by Nt(many("assign" or ("load_0" * Alias * "store_0") + or ("load_1" * Alias * "store_1") + or ("load_2" * Alias * "store_2") + or ("load_3" * Alias * "store_3") + ) * "alloc") + val FlowsTo by Nt("alloc_r" * many("assign_r" or ("store_0_r" * Alias * "load_0_r") + or ("store_1_r" * Alias * "load_1_r") + or ("store_2_r" * Alias * "load_2_r") + or ("store_3_r" * Alias * "load_3_r"))) + + init { + Alias /= PointsTo * FlowsTo + S /= many( Option(Alias) * ("store_0" or "store_1" or "store_2" or "store_3")) * PointsTo + } +} + +fun readGraph(name: String): InputGraph { + val dotGraph = object {}.javaClass.getResource("/$name")?.readText() + ?: throw RuntimeException("File $name not found in resources") + val dotParser = DotParser() + return dotParser.parseDot(dotGraph) +} + +data class OutEdge(val start: Int, val symbol: String, val end: Int){ + override fun toString(): String = "(" + start.toString() + "-" + symbol + "->" + end.toString() + ")" +} + +fun getPathFromSppf(node: RangeSppfNode, maxDepth: Int): List>? { + if (maxDepth == 0) { + return null + } + when (val nodeType = node.type) { + is TerminalType<*> -> { + val range = node.inputRange ?: throw RuntimeException("Null inputRange for TerminalType node of SPPF") + return listOf(listOf(OutEdge(range.from, nodeType.terminal.toString(), range.to))) + } + + //Do not extract subpaths for non-terminal Alias because they are useless. + is NonterminalType if nodeType.startState.nonterminal.name == "Alias" -> { + val range = node.inputRange ?: throw RuntimeException("Null inputRange for Alias Nonterminal node of SPPF") + return listOf(listOf(OutEdge(range.from, "Alias", range.to))) + } + + //Do not extract subpaths for non-terminal PointsTo because they are useless. + is NonterminalType if nodeType.startState.nonterminal.name == "PointsTo" -> { + val range = node.inputRange ?: throw RuntimeException("Null inputRange for PointsTo Nonterminal node of SPPF") + return listOf(listOf(OutEdge(range.from, "PointsTo", range.to))) + } + + is EpsilonNonterminalType -> { + return listOf(emptyList()) + } + + is EmptyType -> { + throw RuntimeException("SPPF cannot contain EmptyRange") + } + + is IntermediateType<*>, is NonterminalType -> { + val subPaths = node.children.map { getPathFromSppf(it, maxDepth - 1) } + if (subPaths.any { it == null }) { + return null + } + val paths = subPaths.filterNotNull().fold(listOf(listOf())) { acc, lst -> + acc.flatMap { list -> lst.map { element -> list + element } } + } + return paths + } + + is Range -> { + val paths = node.children.map { + getPathFromSppf(it, maxDepth - 1)?.filterNotNull() + }.filterNotNull().flatten() + if (paths.isEmpty()) { + return null + } + return paths + } + + else -> { + println("Type of node is ${node.type.javaClass}") + throw RuntimeException("Unknown RangeType in SPPF") + } + } +} + +fun saveSppf(name: String, sppf: Set>) { + val graphName = name.removeSuffix(".dot") + val genPath = Path.of("gen", "sppf") + Files.createDirectories(genPath) + val file = genPath.resolve("${graphName}_sppf.dot").toFile() + + file.printWriter().use { out -> + out.println(getSppfDot(sppf)) + } +} + +fun main() { + listOf("graph_1.dot", "graph_2.dot", "graph_3.dot", "graph_4.dot").forEach { graphName -> + val graph = readGraph(graphName) + val grammar = PointsToGrammar() + val gll = Gll.gll(grammar.rsm, graph) + val sppf = gll.parse() + println("Founded paths in $graphName") + sppf.forEach { getPathFromSppf(it, maxDepth = 30)?.forEach { println(it.toString()) } } + println() + saveSppf(graphName, sppf) + } +} diff --git a/cfpq-paths-app/src/main/resources/graph_1.dot b/cfpq-paths-app/src/main/resources/graph_1.dot new file mode 100644 index 000000000..47cc9326e --- /dev/null +++ b/cfpq-paths-app/src/main/resources/graph_1.dot @@ -0,0 +1,27 @@ +digraph { + start -> 1; + 1 -> 0 [label = "alloc"]; + 0 -> 1 [label = "alloc_r"]; + 2 -> 1 [label = "assign"]; + 1 -> 2 [label = "assign_r"]; + 2 -> 3 [label = "store_0"]; + 3 -> 2 [label = "store_0_r"]; + 3 -> 4 [label = "alloc"]; + 4 -> 3 [label = "alloc_r"]; + 5 -> 3 [label = "assign"]; + 3 -> 5 [label = "assign_r"]; + 5 -> 6 [label = "store_1"]; + 6 -> 5 [label = "store_1_r"]; + 6 -> 7 [label = "alloc"]; + 7 -> 6 [label = "alloc_r"]; + + 0[label = "new X()"] + 1[label = "n"] + 2[label = "l"] + 3[label = "y"] + 4[label = "new Y()"] + 5[label = "t"] + 6[label = "z"] + 7[label = "new Z()"] + +} diff --git a/cfpq-paths-app/src/main/resources/graph_2.dot b/cfpq-paths-app/src/main/resources/graph_2.dot new file mode 100644 index 000000000..3067231fa --- /dev/null +++ b/cfpq-paths-app/src/main/resources/graph_2.dot @@ -0,0 +1,25 @@ +digraph { + start -> 0; + 0 -> 1 [label = "alloc"]; + 1 -> 0 [label = "alloc_r"]; + 2 -> 0 [label = "assign"]; + 0 -> 2 [label = "assign_r"]; + 2 -> 1 [label = "pt"]; + 1 -> 2 [label = "pt_r"]; + 2 -> 3 [label = "store_0"]; + 3 -> 2 [label = "store_0_r"]; + 3 -> 4 [label = "alloc"]; + 4 -> 3 [label = "alloc_r"]; + 2 -> 5 [label = "assign"]; + 5 -> 2 [label = "assign_r"]; + 5 -> 2 [label = "load_0"]; + 2 -> 5 [label = "load_0_r"]; + + 0[label = "n"] + 1[label = "new X() // line 1"] + 2[label = "l"] + 3[label = "tmp1 // line 4"] + 4[label = "new X() // line 4"] + 5[label = "tmp2 // line 5"] + +} diff --git a/cfpq-paths-app/src/main/resources/graph_3.dot b/cfpq-paths-app/src/main/resources/graph_3.dot new file mode 100644 index 000000000..f3451bb6a --- /dev/null +++ b/cfpq-paths-app/src/main/resources/graph_3.dot @@ -0,0 +1,20 @@ +digraph { + start -> 0; + 1 -> 0 [label = "assign"]; + 0 -> 1 [label = "assign_r"]; + 1 -> 2 [label = "store_0"]; + 2 -> 1 [label = "store_0_r"]; + 1 -> 2 [label = "assign"]; + 2 -> 1 [label = "assign_r"]; + 2 -> 3 [label = "alloc"]; + 3 -> 2 [label = "alloc_r"]; + 0 -> 4 [label = "alloc"]; + 4 -> 0 [label = "alloc_r"]; + + + 0[label = "n"] + 1[label = "l"] + 2[label = "t" ] + 3[label = "new X() // line 4"] + 4[label = "new X() // line 1"] +} diff --git a/cfpq-paths-app/src/main/resources/graph_4.dot b/cfpq-paths-app/src/main/resources/graph_4.dot new file mode 100644 index 000000000..8ff719da2 --- /dev/null +++ b/cfpq-paths-app/src/main/resources/graph_4.dot @@ -0,0 +1,45 @@ +digraph { + start -> 1; + start -> 8; + 1 -> 0 [label = "alloc"]; + 0 -> 1 [label = "alloc_r"]; + 4 -> 2 [label = "alloc"]; + 2 -> 4 [label = "alloc_r"]; + 5 -> 3 [label = "alloc"]; + 3 -> 5 [label = "alloc_r"]; + 10 -> 12 [label = "alloc"]; + 12 -> 10 [label = "alloc_r"]; + 11 -> 13 [label = "alloc"]; + 13 -> 11 [label = "alloc_r"]; + 8 -> 6 [label = "assign"]; + 6 -> 8 [label = "assign_r"]; + 9 -> 7 [label = "assign"]; + 7 -> 9 [label = "assign_r"]; + 4 -> 1 [label = "store_0"]; + 1 -> 4 [label = "store_0_r"]; + 5 -> 1 [label = "store_1"]; + 1 -> 5 [label = "store_1_r"]; + 8 -> 10 [label = "store_2"]; + 10 -> 8 [label = "store_2_r"]; + 9 -> 11 [label = "store_3"]; + 11 -> 9 [label = "store_3_r"]; + 6 -> 4 [label = "load_0"]; + 4 -> 6 [label = "load_0_r"]; + 7 -> 5 [label = "load_1"]; + 5 -> 7 [label = "load_1_r"]; + + 0[label="new X()"]; + 1[label="n"]; + 2[label="new Z()"]; + 3[label="new U()"]; + 4[label="z"]; + 5[label="u"]; + 6[label="tmp1 // line 6"]; + 7[label="tmp2 // line 8"]; + 8[label="v"]; + 9[label="r"]; + 10[label="tmp3 // line 7"]; + 11[label="tmp4 // line 9"]; + 12[label="new Y()"]; + 13[label="new P()"]; +} diff --git a/cfpq-paths-app/src/test/kotlin/org/ucfs/paths/PathExtractionTest.kt b/cfpq-paths-app/src/test/kotlin/org/ucfs/paths/PathExtractionTest.kt new file mode 100644 index 000000000..0b92a704c --- /dev/null +++ b/cfpq-paths-app/src/test/kotlin/org/ucfs/paths/PathExtractionTest.kt @@ -0,0 +1,80 @@ +package org.ucfs.paths + +import org.junit.jupiter.api.Test +import org.ucfs.parser.Gll +import org.ucfs.rsm.symbol.Term +import org.ucfs.sppf.node.* +import kotlin.test.* + +class PathExtractionTest { + private fun paths(graph: String, maxDepth: Int = 30): Set = + Gll.gll(PointsToGrammar().rsm, readGraph(graph)).parse() + .flatMap { getPathFromSppf(it, maxDepth) ?: emptyList() }.map { it.toString() }.toSet() + // Hand-built SPPF: `slot` is the start state of S, i.e. a nonterminal that is not collapsed like Alias/PointsTo. + private val slot = PointsToGrammar().rsm + private fun leaf(from: Int, s: String, to: Int) = RangeSppfNode(InputRange(from, to), null, TerminalType(Term(s))) + private fun node(type: RangeType, vararg children: RangeSppfNode) = + RangeSppfNode(null, null, type).apply { this.children.addAll(children) } + private val ab = node(IntermediateType(slot, 1), leaf(0, "a", 1), leaf(1, "b", 2)) + + @Test + fun `leaf node types`() { + assertEquals("[[(0-a->1)]]", getPathFromSppf(leaf(0, "a", 1), 1).toString(), "terminal is one edge") + assertNull(getPathFromSppf(leaf(0, "a", 1), 0), "maxDepth 0 cuts the traversal") + assertEquals(listOf(emptyList()), getPathFromSppf(node(EpsilonNonterminalType(slot)), 1), "epsilon") + assertFailsWith("EmptyType is invalid in SPPF") { getPathFromSppf(node(EmptyType()), 1) } + } + + @Test + fun `intermediate and nonterminal concatenate children, range unions alternatives`() { + val expected = listOf("[(0-a->1), (1-b->2)]", "[(0-c->2)]") + val range = node(Range, node(NonterminalType(slot), ab), leaf(0, "c", 2)) + assertEquals(expected, getPathFromSppf(range, 4)?.map { it.toString() }, "both alternatives") + } + + @Test + fun `exhausted depth gives null for sequences and drops range alternatives`() { + assertNull(getPathFromSppf(ab, 1), "intermediate with a null child") + assertNull(getPathFromSppf(node(NonterminalType(slot), ab), 2), "nonterminal with a null child") + assertNull(getPathFromSppf(node(Range, ab), 2), "range whose only alternative is null") + val range = node(Range, ab, leaf(0, "c", 2)) + assertEquals("[[(0-c->2)]]", getPathFromSppf(range, 2).toString(), "only the alternative that fits") + } + + @Test + fun `example 1 - all paths from README are extracted`() { + val expected = setOf( + "[(1-PointsTo->0)]", "[(1-Alias->2), (2-store_0->3), (3-PointsTo->4)]", + "[(1-Alias->2), (2-store_0->3), (3-Alias->5), (5-store_1->6), (6-PointsTo->7)]", + ) + assertEquals(expected, paths("graph_1.dot"), "graph_1") + } + + // Alias(1,8) needs the field bridge load_f Alias store_f (Dietrich et al. OOPSLA'15, Eq. 1): + // 8 -assign-> 6 -load_0-> 4 -Alias-> 4 -store_0-> 1 -alloc-> 0. The duplicate (8-store_2->10) vs + // (8-Alias->8), (8-store_2->10) comes from S (project extension) allowing both ε and reflexive Alias(8,8). + @Test + fun `example 4 - paths from two start vertices`() { + val expected = setOf( + "[(1-Alias->9), (9-store_3->11), (11-PointsTo->13)]", "[(1-Alias->8), (8-store_2->10), (10-PointsTo->12)]", + "[(8-Alias->9), (9-store_3->11), (11-PointsTo->13)]", "[(8-store_2->10), (10-PointsTo->12)]", + "[(8-Alias->8), (8-store_2->10), (10-PointsTo->12)]", "[(1-PointsTo->0)]", "[(8-PointsTo->0)]", + ) + assertEquals(expected, paths("graph_4.dot"), "graph_4") + } + + // Path n.(f.)^k = new X() of examples 2 and 3: Alias, then k times store_0 joined by Alias, then PointsTo. + private fun loopPath(v: Int, f: Int, t: Int, a: Int, k: Int) = + "[($v-Alias->$f), ${"($f-store_0->$t), ($t-Alias->$f), ".repeat(k - 1)}($f-store_0->$t), ($t-PointsTo->$a)]" + + @Test + fun `examples 2 and 3 - cyclic SPPF gives finite path set growing with maxDepth`() { + for ((graph, args) in listOf("graph_2.dot" to listOf(0, 2, 3, 4), "graph_3.dot" to listOf(0, 1, 2, 3))) { + val (v, f, t, a) = args + val shallow = paths(graph) + assertTrue((1..6).all { loopPath(v, f, t, a, it) in shallow }, "$graph: k=1..6 in $shallow") + val deep = paths(graph, maxDepth = 40) + assertTrue(deep.containsAll(shallow) && deep.size > shallow.size, "$graph: 40 ⊋ 30, got $deep") + } + } +} diff --git a/docs/docs/figures/Epsilon_example.dot b/docs/docs/figures/Epsilon_example.dot new file mode 100644 index 000000000..fe56a9c3e --- /dev/null +++ b/docs/docs/figures/Epsilon_example.dot @@ -0,0 +1,3 @@ +digraph g{ +_0_12 [label = "2 Epsilon RSM: S_0, input: [0, 0]", shape = invhouse] +} \ No newline at end of file diff --git a/docs/docs/figures/Epsilon_example.dot.svg b/docs/docs/figures/Epsilon_example.dot.svg new file mode 100644 index 000000000..e39d541be --- /dev/null +++ b/docs/docs/figures/Epsilon_example.dot.svg @@ -0,0 +1,19 @@ + + + + + + +g + + + +_0_12 + +2     Epsilon RSM: S_0, input: [0, 0] + + + diff --git a/docs/docs/figures/Intermediate_example.dot b/docs/docs/figures/Intermediate_example.dot new file mode 100644 index 000000000..12323b224 --- /dev/null +++ b/docs/docs/figures/Intermediate_example.dot @@ -0,0 +1,4 @@ +digraph g{ +_1_8 [label = "16 Intermediate input: 1, rsm: Alias_1, input: [0, 2]", shape = plain] +} + diff --git a/docs/docs/figures/Intermediate_example.dot.svg b/docs/docs/figures/Intermediate_example.dot.svg new file mode 100644 index 000000000..8487bffd2 --- /dev/null +++ b/docs/docs/figures/Intermediate_example.dot.svg @@ -0,0 +1,18 @@ + + + + + + +g + + + +_1_8 +16     Intermediate input: 1, rsm: Alias_1, input: [0, 2] + + + diff --git a/docs/docs/figures/Nonterm_example.dot b/docs/docs/figures/Nonterm_example.dot new file mode 100644 index 000000000..b65f1ef17 --- /dev/null +++ b/docs/docs/figures/Nonterm_example.dot @@ -0,0 +1,4 @@ +digraph g{ +_1_0 [label = "0 Nonterminal S, input: [0, 4]", shape = invtrapezium] +} + diff --git a/docs/docs/figures/Nonterm_example.dot.svg b/docs/docs/figures/Nonterm_example.dot.svg new file mode 100644 index 000000000..b4e60e705 --- /dev/null +++ b/docs/docs/figures/Nonterm_example.dot.svg @@ -0,0 +1,19 @@ + + + + + + +g + + + +_1_0 + +0     Nonterminal S, input: [0, 4] + + + diff --git a/docs/docs/figures/Range_example.dot b/docs/docs/figures/Range_example.dot new file mode 100644 index 000000000..aa8f56187 --- /dev/null +++ b/docs/docs/figures/Range_example.dot @@ -0,0 +1,4 @@ +digraph g{ +_1_1 [label = "1 Range , input: [0, 4], rsm: [S_0, S_2]", shape = ellipse] +} + diff --git a/docs/docs/figures/Range_example.dot.svg b/docs/docs/figures/Range_example.dot.svg new file mode 100644 index 000000000..e1b36d3f1 --- /dev/null +++ b/docs/docs/figures/Range_example.dot.svg @@ -0,0 +1,19 @@ + + + + + + +g + + + +_1_1 + +1     Range , input: [0, 4], rsm: [S_0, S_2] + + + diff --git a/docs/docs/figures/Terminal_example.dot b/docs/docs/figures/Terminal_example.dot new file mode 100644 index 000000000..b64dea439 --- /dev/null +++ b/docs/docs/figures/Terminal_example.dot @@ -0,0 +1,4 @@ +digraph g{ +_1_5 [label = "13 Terminal 'alloc', input: [3, 4]", shape = rectangle] +} + diff --git a/docs/docs/figures/Terminal_example.dot.svg b/docs/docs/figures/Terminal_example.dot.svg new file mode 100644 index 000000000..9947cddfd --- /dev/null +++ b/docs/docs/figures/Terminal_example.dot.svg @@ -0,0 +1,19 @@ + + + + + + +g + + + +_1_5 + +13     Terminal 'alloc', input: [3, 4] + + + diff --git a/docs/docs/figures/graph_1.dot b/docs/docs/figures/graph_1.dot new file mode 100644 index 000000000..db6f85581 --- /dev/null +++ b/docs/docs/figures/graph_1.dot @@ -0,0 +1,27 @@ +digraph { + start -> 1; + 1 -> 0 [label = "alloc"]; + 0 -> 1 [label = "alloc_r"]; + 2 -> 1 [label = "assign"]; + 1 -> 2 [label = "assign_r"]; + 2 -> 3 [label = "store_0"]; + 3 -> 2 [label = "store_0_r"]; + 3 -> 4 [label = "alloc"]; + 4 -> 3 [label = "alloc_r"]; + 5 -> 3 [label = "assign"]; + 3 -> 5 [label = "assign_r"]; + 5 -> 6 [label = "store_1"]; + 6 -> 5 [label = "store_1_r"]; + 6 -> 7 [label = "alloc"]; + 7 -> 6 [label = "alloc_r"]; + + 0[label = "0 | new X()"] + 1[label = "1 | n"] + 2[label = "2 | l"] + 3[label = "3 | y"] + 4[label = "4 | new Y()"] + 5[label = "5 | t"] + 6[label = "6 | z"] + 7[label = "7 | new Z()"] + +} diff --git a/docs/docs/figures/graph_1.dot.svg b/docs/docs/figures/graph_1.dot.svg new file mode 100644 index 000000000..9c58204f4 --- /dev/null +++ b/docs/docs/figures/graph_1.dot.svg @@ -0,0 +1,171 @@ + + + + + + +%3 + + + +start + +start + + + +1 + +1 | n + + + +start->1 + + + + + +0 + +0 | new X() + + + +1->0 + + +alloc + + + +2 + +2 | l + + + +1->2 + + +assign_r + + + +0->1 + + +alloc_r + + + +2->1 + + +assign + + + +3 + +3 | y + + + +2->3 + + +store_0 + + + +3->2 + + +store_0_r + + + +4 + +4 | new Y() + + + +3->4 + + +alloc + + + +5 + +5 | t + + + +3->5 + + +assign_r + + + +4->3 + + +alloc_r + + + +5->3 + + +assign + + + +6 + +6 | z + + + +5->6 + + +store_1 + + + +6->5 + + +store_1_r + + + +7 + +7 | new Z() + + + +6->7 + + +alloc + + + +7->6 + + +alloc_r + + + diff --git a/docs/docs/figures/graph_1_sppf.dot b/docs/docs/figures/graph_1_sppf.dot new file mode 100644 index 000000000..25b11c79e --- /dev/null +++ b/docs/docs/figures/graph_1_sppf.dot @@ -0,0 +1,176 @@ +digraph g { +labelloc="t" +label="" +subgraph cluster_0{ +labelloc="t" +_0_0 [label = "0 Nonterminal S, input: [1, 0]", shape = invtrapezium] +_0_1 [label = "1 Range , input: [1, 0], rsm: [S_0, S_2]", shape = ellipse] +_0_2 [label = "2 Nonterminal PointsTo, input: [1, 0]", shape = invtrapezium] +_0_3 [label = "3 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_0_4 [label = "4 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_0_0->_0_1 +_0_1->_0_2 +_0_2->_0_3 +_0_3->_0_4 +} + +subgraph cluster_1{ +labelloc="t" +_1_0 [label = "0 Nonterminal S, input: [1, 4]", shape = invtrapezium] +_1_1 [label = "1 Range , input: [1, 4], rsm: [S_0, S_2]", shape = ellipse] +_1_2 [label = "10 Nonterminal Alias, input: [1, 2]", shape = invtrapezium] +_1_3 [label = "11 Terminal 'store_0', input: [2, 3]", shape = rectangle] +_1_4 [label = "12 Terminal 'alloc', input: [3, 4]", shape = rectangle] +_1_5 [label = "13 Range , input: [1, 2], rsm: [Alias_0, Alias_2]", shape = ellipse] +_1_6 [label = "14 Intermediate input: 0, rsm: Alias_1, input: [1, 2]", shape = plain] +_1_7 [label = "15 Range , input: [1, 0], rsm: [Alias_0, Alias_1]", shape = ellipse] +_1_8 [label = "16 Range , input: [0, 2], rsm: [Alias_1, Alias_2]", shape = ellipse] +_1_9 [label = "17 Nonterminal PointsTo, input: [1, 0]", shape = invtrapezium] +_1_10 [label = "18 Nonterminal FlowsTo, input: [0, 2]", shape = invtrapezium] +_1_11 [label = "19 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_12 [label = "2 Intermediate input: 3, rsm: S_0, input: [1, 4]", shape = plain] +_1_13 [label = "20 Range , input: [0, 2], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_14 [label = "21 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_1_15 [label = "22 Intermediate input: 1, rsm: FlowsTo_1, input: [0, 2]", shape = plain] +_1_16 [label = "23 Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_17 [label = "24 Range , input: [1, 2], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_1_18 [label = "25 Terminal 'alloc_r', input: [0, 1]", shape = rectangle] +_1_19 [label = "26 Terminal 'assign_r', input: [1, 2]", shape = rectangle] +_1_20 [label = "3 Range , input: [1, 3], rsm: [S_0, S_0]", shape = ellipse] +_1_21 [label = "4 Range , input: [3, 4], rsm: [S_0, S_2]", shape = ellipse] +_1_22 [label = "5 Intermediate input: 2, rsm: S_1, input: [1, 3]", shape = plain] +_1_23 [label = "6 Nonterminal PointsTo, input: [3, 4]", shape = invtrapezium] +_1_24 [label = "7 Range , input: [1, 2], rsm: [S_0, S_1]", shape = ellipse] +_1_25 [label = "8 Range , input: [2, 3], rsm: [S_1, S_0]", shape = ellipse] +_1_26 [label = "9 Range , input: [3, 4], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_0->_1_1 +_1_1->_1_12 +_1_2->_1_5 +_1_5->_1_6 +_1_6->_1_7 +_1_6->_1_8 +_1_7->_1_9 +_1_8->_1_10 +_1_9->_1_11 +_1_10->_1_13 +_1_11->_1_14 +_1_12->_1_20 +_1_12->_1_21 +_1_13->_1_15 +_1_15->_1_16 +_1_15->_1_17 +_1_16->_1_18 +_1_17->_1_19 +_1_20->_1_22 +_1_21->_1_23 +_1_22->_1_24 +_1_22->_1_25 +_1_23->_1_26 +_1_24->_1_2 +_1_25->_1_3 +_1_26->_1_4 +} + +subgraph cluster_2{ +labelloc="t" +_2_0 [label = "0 Nonterminal S, input: [1, 7]", shape = invtrapezium] +_2_1 [label = "1 Range , input: [1, 7], rsm: [S_0, S_2]", shape = ellipse] +_2_2 [label = "10 Intermediate input: 3, rsm: S_0, input: [1, 5]", shape = plain] +_2_3 [label = "11 Terminal 'store_1', input: [5, 6]", shape = rectangle] +_2_4 [label = "12 Terminal 'alloc', input: [6, 7]", shape = rectangle] +_2_5 [label = "13 Range , input: [1, 3], rsm: [S_0, S_0]", shape = ellipse] +_2_6 [label = "14 Range , input: [3, 5], rsm: [S_0, S_1]", shape = ellipse] +_2_7 [label = "15 Intermediate input: 2, rsm: S_1, input: [1, 3]", shape = plain] +_2_8 [label = "16 Nonterminal Alias, input: [3, 5]", shape = invtrapezium] +_2_9 [label = "17 Range , input: [1, 2], rsm: [S_0, S_1]", shape = ellipse] +_2_10 [label = "18 Range , input: [2, 3], rsm: [S_1, S_0]", shape = ellipse] +_2_11 [label = "19 Range , input: [3, 5], rsm: [Alias_0, Alias_2]", shape = ellipse] +_2_12 [label = "2 Intermediate input: 6, rsm: S_0, input: [1, 7]", shape = plain] +_2_13 [label = "20 Nonterminal Alias, input: [1, 2]", shape = invtrapezium] +_2_14 [label = "21 Terminal 'store_0', input: [2, 3]", shape = rectangle] +_2_15 [label = "22 Intermediate input: 4, rsm: Alias_1, input: [3, 5]", shape = plain] +_2_16 [label = "23 Range , input: [1, 2], rsm: [Alias_0, Alias_2]", shape = ellipse] +_2_17 [label = "24 Range , input: [3, 4], rsm: [Alias_0, Alias_1]", shape = ellipse] +_2_18 [label = "25 Range , input: [4, 5], rsm: [Alias_1, Alias_2]", shape = ellipse] +_2_19 [label = "26 Intermediate input: 0, rsm: Alias_1, input: [1, 2]", shape = plain] +_2_20 [label = "27 Nonterminal PointsTo, input: [3, 4]", shape = invtrapezium] +_2_21 [label = "28 Nonterminal FlowsTo, input: [4, 5]", shape = invtrapezium] +_2_22 [label = "29 Range , input: [1, 0], rsm: [Alias_0, Alias_1]", shape = ellipse] +_2_23 [label = "3 Range , input: [1, 6], rsm: [S_0, S_0]", shape = ellipse] +_2_24 [label = "30 Range , input: [0, 2], rsm: [Alias_1, Alias_2]", shape = ellipse] +_2_25 [label = "31 Range , input: [3, 4], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_2_26 [label = "32 Range , input: [4, 5], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_2_27 [label = "33 Nonterminal PointsTo, input: [1, 0]", shape = invtrapezium] +_2_28 [label = "34 Nonterminal FlowsTo, input: [0, 2]", shape = invtrapezium] +_2_29 [label = "35 Terminal 'alloc', input: [3, 4]", shape = rectangle] +_2_30 [label = "36 Intermediate input: 3, rsm: FlowsTo_1, input: [4, 5]", shape = plain] +_2_31 [label = "37 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_2_32 [label = "38 Range , input: [0, 2], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_2_33 [label = "39 Range , input: [4, 3], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_2_34 [label = "4 Range , input: [6, 7], rsm: [S_0, S_2]", shape = ellipse] +_2_35 [label = "40 Range , input: [3, 5], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_2_36 [label = "41 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_2_37 [label = "42 Intermediate input: 1, rsm: FlowsTo_1, input: [0, 2]", shape = plain] +_2_38 [label = "43 Terminal 'alloc_r', input: [4, 3]", shape = rectangle] +_2_39 [label = "44 Terminal 'assign_r', input: [3, 5]", shape = rectangle] +_2_40 [label = "45 Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_2_41 [label = "46 Range , input: [1, 2], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_2_42 [label = "47 Terminal 'alloc_r', input: [0, 1]", shape = rectangle] +_2_43 [label = "48 Terminal 'assign_r', input: [1, 2]", shape = rectangle] +_2_44 [label = "5 Intermediate input: 5, rsm: S_1, input: [1, 6]", shape = plain] +_2_45 [label = "6 Nonterminal PointsTo, input: [6, 7]", shape = invtrapezium] +_2_46 [label = "7 Range , input: [1, 5], rsm: [S_0, S_1]", shape = ellipse] +_2_47 [label = "8 Range , input: [5, 6], rsm: [S_1, S_0]", shape = ellipse] +_2_48 [label = "9 Range , input: [6, 7], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_2_0->_2_1 +_2_1->_2_12 +_2_2->_2_5 +_2_2->_2_6 +_2_5->_2_7 +_2_6->_2_8 +_2_7->_2_9 +_2_7->_2_10 +_2_8->_2_11 +_2_9->_2_13 +_2_10->_2_14 +_2_11->_2_15 +_2_12->_2_23 +_2_12->_2_34 +_2_13->_2_16 +_2_15->_2_17 +_2_15->_2_18 +_2_16->_2_19 +_2_17->_2_20 +_2_18->_2_21 +_2_19->_2_22 +_2_19->_2_24 +_2_20->_2_25 +_2_21->_2_26 +_2_22->_2_27 +_2_23->_2_44 +_2_24->_2_28 +_2_25->_2_29 +_2_26->_2_30 +_2_27->_2_31 +_2_28->_2_32 +_2_30->_2_33 +_2_30->_2_35 +_2_31->_2_36 +_2_32->_2_37 +_2_33->_2_38 +_2_34->_2_45 +_2_35->_2_39 +_2_37->_2_40 +_2_37->_2_41 +_2_40->_2_42 +_2_41->_2_43 +_2_44->_2_46 +_2_44->_2_47 +_2_45->_2_48 +_2_46->_2_2 +_2_47->_2_3 +_2_48->_2_4 +} + +} + diff --git a/docs/docs/figures/graph_1_sppf.dot.svg b/docs/docs/figures/graph_1_sppf.dot.svg new file mode 100644 index 000000000..76a662962 --- /dev/null +++ b/docs/docs/figures/graph_1_sppf.dot.svg @@ -0,0 +1,967 @@ + + + + + + +g + + +cluster_0 + + + +cluster_1 + + + +cluster_2 + + + + +_0_0 + +0     Nonterminal S, input: [1, 0] + + + +_0_1 + +1     Range , input: [1, 0], rsm: [S_0, S_2] + + + +_0_0->_0_1 + + + + + +_0_2 + +2     Nonterminal PointsTo, input: [1, 0] + + + +_0_1->_0_2 + + + + + +_0_3 + +3     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_0_2->_0_3 + + + + + +_0_4 + +4     Terminal 'alloc', input: [1, 0] + + + +_0_3->_0_4 + + + + + +_1_0 + +0     Nonterminal S, input: [1, 4] + + + +_1_1 + +1     Range , input: [1, 4], rsm: [S_0, S_2] + + + +_1_0->_1_1 + + + + + +_1_12 +2     Intermediate input: 3, rsm: S_0, input: [1, 4] + + + +_1_1->_1_12 + + + + + +_1_2 + +10     Nonterminal Alias, input: [1, 2] + + + +_1_5 + +13     Range , input: [1, 2], rsm: [Alias_0, Alias_2] + + + +_1_2->_1_5 + + + + + +_1_3 + +11     Terminal 'store_0', input: [2, 3] + + + +_1_4 + +12     Terminal 'alloc', input: [3, 4] + + + +_1_6 +14     Intermediate input: 0, rsm: Alias_1, input: [1, 2] + + + +_1_5->_1_6 + + + + + +_1_7 + +15     Range , input: [1, 0], rsm: [Alias_0, Alias_1] + + + +_1_6->_1_7 + + + + + +_1_8 + +16     Range , input: [0, 2], rsm: [Alias_1, Alias_2] + + + +_1_6->_1_8 + + + + + +_1_9 + +17     Nonterminal PointsTo, input: [1, 0] + + + +_1_7->_1_9 + + + + + +_1_10 + +18     Nonterminal FlowsTo, input: [0, 2] + + + +_1_8->_1_10 + + + + + +_1_11 + +19     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_1_9->_1_11 + + + + + +_1_13 + +20     Range , input: [0, 2], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_10->_1_13 + + + + + +_1_14 + +21     Terminal 'alloc', input: [1, 0] + + + +_1_11->_1_14 + + + + + +_1_20 + +3     Range , input: [1, 3], rsm: [S_0, S_0] + + + +_1_12->_1_20 + + + + + +_1_21 + +4     Range , input: [3, 4], rsm: [S_0, S_2] + + + +_1_12->_1_21 + + + + + +_1_15 +22     Intermediate input: 1, rsm: FlowsTo_1, input: [0, 2] + + + +_1_13->_1_15 + + + + + +_1_16 + +23     Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_15->_1_16 + + + + + +_1_17 + +24     Range , input: [1, 2], rsm: [FlowsTo_1, FlowsTo_1] + + + +_1_15->_1_17 + + + + + +_1_18 + +25     Terminal 'alloc_r', input: [0, 1] + + + +_1_16->_1_18 + + + + + +_1_19 + +26     Terminal 'assign_r', input: [1, 2] + + + +_1_17->_1_19 + + + + + +_1_22 +5     Intermediate input: 2, rsm: S_1, input: [1, 3] + + + +_1_20->_1_22 + + + + + +_1_23 + +6     Nonterminal PointsTo, input: [3, 4] + + + +_1_21->_1_23 + + + + + +_1_24 + +7     Range , input: [1, 2], rsm: [S_0, S_1] + + + +_1_22->_1_24 + + + + + +_1_25 + +8     Range , input: [2, 3], rsm: [S_1, S_0] + + + +_1_22->_1_25 + + + + + +_1_26 + +9     Range , input: [3, 4], rsm: [PointsTo_0, PointsTo_5] + + + +_1_23->_1_26 + + + + + +_1_24->_1_2 + + + + + +_1_25->_1_3 + + + + + +_1_26->_1_4 + + + + + +_2_0 + +0     Nonterminal S, input: [1, 7] + + + +_2_1 + +1     Range , input: [1, 7], rsm: [S_0, S_2] + + + +_2_0->_2_1 + + + + + +_2_12 +2     Intermediate input: 6, rsm: S_0, input: [1, 7] + + + +_2_1->_2_12 + + + + + +_2_2 +10     Intermediate input: 3, rsm: S_0, input: [1, 5] + + + +_2_5 + +13     Range , input: [1, 3], rsm: [S_0, S_0] + + + +_2_2->_2_5 + + + + + +_2_6 + +14     Range , input: [3, 5], rsm: [S_0, S_1] + + + +_2_2->_2_6 + + + + + +_2_3 + +11     Terminal 'store_1', input: [5, 6] + + + +_2_4 + +12     Terminal 'alloc', input: [6, 7] + + + +_2_7 +15     Intermediate input: 2, rsm: S_1, input: [1, 3] + + + +_2_5->_2_7 + + + + + +_2_8 + +16     Nonterminal Alias, input: [3, 5] + + + +_2_6->_2_8 + + + + + +_2_9 + +17     Range , input: [1, 2], rsm: [S_0, S_1] + + + +_2_7->_2_9 + + + + + +_2_10 + +18     Range , input: [2, 3], rsm: [S_1, S_0] + + + +_2_7->_2_10 + + + + + +_2_11 + +19     Range , input: [3, 5], rsm: [Alias_0, Alias_2] + + + +_2_8->_2_11 + + + + + +_2_13 + +20     Nonterminal Alias, input: [1, 2] + + + +_2_9->_2_13 + + + + + +_2_14 + +21     Terminal 'store_0', input: [2, 3] + + + +_2_10->_2_14 + + + + + +_2_15 +22     Intermediate input: 4, rsm: Alias_1, input: [3, 5] + + + +_2_11->_2_15 + + + + + +_2_23 + +3     Range , input: [1, 6], rsm: [S_0, S_0] + + + +_2_12->_2_23 + + + + + +_2_34 + +4     Range , input: [6, 7], rsm: [S_0, S_2] + + + +_2_12->_2_34 + + + + + +_2_16 + +23     Range , input: [1, 2], rsm: [Alias_0, Alias_2] + + + +_2_13->_2_16 + + + + + +_2_17 + +24     Range , input: [3, 4], rsm: [Alias_0, Alias_1] + + + +_2_15->_2_17 + + + + + +_2_18 + +25     Range , input: [4, 5], rsm: [Alias_1, Alias_2] + + + +_2_15->_2_18 + + + + + +_2_19 +26     Intermediate input: 0, rsm: Alias_1, input: [1, 2] + + + +_2_16->_2_19 + + + + + +_2_20 + +27     Nonterminal PointsTo, input: [3, 4] + + + +_2_17->_2_20 + + + + + +_2_21 + +28     Nonterminal FlowsTo, input: [4, 5] + + + +_2_18->_2_21 + + + + + +_2_22 + +29     Range , input: [1, 0], rsm: [Alias_0, Alias_1] + + + +_2_19->_2_22 + + + + + +_2_24 + +30     Range , input: [0, 2], rsm: [Alias_1, Alias_2] + + + +_2_19->_2_24 + + + + + +_2_25 + +31     Range , input: [3, 4], rsm: [PointsTo_0, PointsTo_5] + + + +_2_20->_2_25 + + + + + +_2_26 + +32     Range , input: [4, 5], rsm: [FlowsTo_0, FlowsTo_1] + + + +_2_21->_2_26 + + + + + +_2_27 + +33     Nonterminal PointsTo, input: [1, 0] + + + +_2_22->_2_27 + + + + + +_2_44 +5     Intermediate input: 5, rsm: S_1, input: [1, 6] + + + +_2_23->_2_44 + + + + + +_2_28 + +34     Nonterminal FlowsTo, input: [0, 2] + + + +_2_24->_2_28 + + + + + +_2_29 + +35     Terminal 'alloc', input: [3, 4] + + + +_2_25->_2_29 + + + + + +_2_30 +36     Intermediate input: 3, rsm: FlowsTo_1, input: [4, 5] + + + +_2_26->_2_30 + + + + + +_2_31 + +37     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_2_27->_2_31 + + + + + +_2_32 + +38     Range , input: [0, 2], rsm: [FlowsTo_0, FlowsTo_1] + + + +_2_28->_2_32 + + + + + +_2_33 + +39     Range , input: [4, 3], rsm: [FlowsTo_0, FlowsTo_1] + + + +_2_30->_2_33 + + + + + +_2_35 + +40     Range , input: [3, 5], rsm: [FlowsTo_1, FlowsTo_1] + + + +_2_30->_2_35 + + + + + +_2_36 + +41     Terminal 'alloc', input: [1, 0] + + + +_2_31->_2_36 + + + + + +_2_37 +42     Intermediate input: 1, rsm: FlowsTo_1, input: [0, 2] + + + +_2_32->_2_37 + + + + + +_2_38 + +43     Terminal 'alloc_r', input: [4, 3] + + + +_2_33->_2_38 + + + + + +_2_45 + +6     Nonterminal PointsTo, input: [6, 7] + + + +_2_34->_2_45 + + + + + +_2_39 + +44     Terminal 'assign_r', input: [3, 5] + + + +_2_35->_2_39 + + + + + +_2_40 + +45     Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1] + + + +_2_37->_2_40 + + + + + +_2_41 + +46     Range , input: [1, 2], rsm: [FlowsTo_1, FlowsTo_1] + + + +_2_37->_2_41 + + + + + +_2_42 + +47     Terminal 'alloc_r', input: [0, 1] + + + +_2_40->_2_42 + + + + + +_2_43 + +48     Terminal 'assign_r', input: [1, 2] + + + +_2_41->_2_43 + + + + + +_2_46 + +7     Range , input: [1, 5], rsm: [S_0, S_1] + + + +_2_44->_2_46 + + + + + +_2_47 + +8     Range , input: [5, 6], rsm: [S_1, S_0] + + + +_2_44->_2_47 + + + + + +_2_48 + +9     Range , input: [6, 7], rsm: [PointsTo_0, PointsTo_5] + + + +_2_45->_2_48 + + + + + +_2_46->_2_2 + + + + + +_2_47->_2_3 + + + + + +_2_48->_2_4 + + + + + diff --git a/docs/docs/figures/graph_2.dot b/docs/docs/figures/graph_2.dot new file mode 100644 index 000000000..89921de33 --- /dev/null +++ b/docs/docs/figures/graph_2.dot @@ -0,0 +1,23 @@ +digraph { + start -> 0; + 0 -> 1 [label = "alloc"]; + 1 -> 0 [label = "alloc_r"]; + 2 -> 0 [label = "assign"]; + 0 -> 2 [label = "assign_r"]; + 2 -> 3 [label = "store_0"]; + 3 -> 2 [label = "store_0_r"]; + 3 -> 4 [label = "alloc"]; + 4 -> 3 [label = "alloc_r"]; + 2 -> 5 [label = "assign"]; + 5 -> 2 [label = "assign_r"]; + 5 -> 2 [label = "load_0"]; + 2 -> 5 [label = "load_0_r"]; + + 0[label = "0 | n"] + 1[label = "1 | new X() // line 1"] + 2[label = "2 | l"] + 3[label = "3 | tmp1 // line 4"] + 4[label = "4 | new X() // line 4"] + 5[label = "5 | tmp2 // line 5"] + +} diff --git a/docs/docs/figures/graph_2.dot.svg b/docs/docs/figures/graph_2.dot.svg new file mode 100644 index 000000000..823dd0988 --- /dev/null +++ b/docs/docs/figures/graph_2.dot.svg @@ -0,0 +1,145 @@ + + + + + + +%191 + + + +start + +start + + + +0 + +0 | n + + + +start->0 + + + + + +1 + +1 | new X() // line 1 + + + +0->1 + + +alloc + + + +2 + +2 | l + + + +0->2 + + +assign_r + + + +1->0 + + +alloc_r + + + +2->0 + + +assign + + + +3 + +3 | tmp1 // line 4 + + + +2->3 + + +store_0 + + + +5 + +5 | tmp2 // line 5 + + + +2->5 + + +assign + + + +2->5 + + +load_0_r + + + +3->2 + + +store_0_r + + + +4 + +4 | new X() // line 4 + + + +3->4 + + +alloc + + + +4->3 + + +alloc_r + + + +5->2 + + +assign_r + + + +5->2 + + +load_0 + + + diff --git a/docs/docs/figures/graph_2_sppf.dot b/docs/docs/figures/graph_2_sppf.dot new file mode 100644 index 000000000..7ac8ed0b9 --- /dev/null +++ b/docs/docs/figures/graph_2_sppf.dot @@ -0,0 +1,177 @@ +digraph g { +labelloc="t" +label="" + +subgraph cluster_1{ +labelloc="t" +_1_0 [label = "0 Nonterminal S, input: [0, 4]", shape = invtrapezium] +_1_1 [label = "1 Range , input: [0, 4], rsm: [S_0, S_2]", shape = ellipse] +_1_2 [label = "10 Nonterminal Alias, input: [0, 2]", shape = invtrapezium] +_1_3 [label = "11 Intermediate input: 3, rsm: S_0, input: [0, 2]", shape = plain] +_1_4 [label = "12 Terminal 'store_0', input: [2, 3]", shape = rectangle] +_1_5 [label = "13 Terminal 'alloc', input: [3, 4]", shape = rectangle] +_1_6 [label = "14 Range , input: [0, 2], rsm: [Alias_0, Alias_2]", shape = ellipse] +_1_7 [label = "15 Range , input: [3, 2], rsm: [S_0, S_1]", shape = ellipse] +_1_8 [label = "16 Intermediate input: 1, rsm: Alias_1, input: [0, 2]", shape = plain] +_1_9 [label = "17 Nonterminal Alias, input: [3, 2]", shape = invtrapezium] +_1_10 [label = "18 Range , input: [0, 1], rsm: [Alias_0, Alias_1]", shape = ellipse] +_1_11 [label = "19 Range , input: [1, 2], rsm: [Alias_1, Alias_2]", shape = ellipse] +_1_12 [label = "2 Intermediate input: 3, rsm: S_0, input: [0, 4]", shape = plain] +_1_13 [label = "20 Range , input: [3, 2], rsm: [Alias_0, Alias_2]", shape = ellipse] +_1_14 [label = "21 Nonterminal PointsTo, input: [0, 1]", shape = invtrapezium] +_1_15 [label = "22 Nonterminal FlowsTo, input: [1, 2]", shape = invtrapezium] +_1_16 [label = "23 Intermediate input: 4, rsm: Alias_1, input: [3, 2]", shape = plain] +_1_17 [label = "24 Range , input: [0, 1], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_18 [label = "25 Range , input: [1, 2], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_19 [label = "26 Range , input: [3, 4], rsm: [Alias_0, Alias_1]", shape = ellipse] +_1_20 [label = "27 Range , input: [4, 2], rsm: [Alias_1, Alias_2]", shape = ellipse, color="red"] +_1_21 [label = "28 Terminal 'alloc', input: [0, 1]", shape = rectangle] +_1_22 [label = "29 Intermediate input: 0, rsm: FlowsTo_1, input: [1, 2]", shape = plain] +_1_23 [label = "3 Range , input: [0, 3], rsm: [S_0, S_0]", shape = ellipse] +_1_24 [label = "30 Nonterminal PointsTo, input: [3, 4]", shape = invtrapezium] +_1_25 [label = "31 Nonterminal FlowsTo, input: [4, 2]", shape = invtrapezium, color="red"] +_1_26 [label = "32 Range , input: [1, 0], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_27 [label = "33 Range , input: [0, 2], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_1_28 [label = "34 Range , input: [4, 2], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse, color="red"] +_1_29 [label = "35 Terminal 'alloc_r', input: [1, 0]", shape = rectangle] +_1_30 [label = "36 Terminal 'assign_r', input: [0, 2]", shape = rectangle] +_1_31 [label = "37 Intermediate input: 5, rsm: FlowsTo_1, input: [4, 2]", shape = plain, color="red"] +_1_32 [label = "38 Range , input: [4, 5], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse, color="red"] +_1_33 [label = "39 Range , input: [5, 2], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_1_34 [label = "4 Range , input: [3, 4], rsm: [S_0, S_2]", shape = ellipse] +_1_35 [label = "40 Intermediate input: 2, rsm: FlowsTo_9, input: [4, 5]", shape = plain, color="red"] +_1_36 [label = "41 Terminal 'assign_r', input: [5, 2]", shape = rectangle] +_1_37 [label = "42 Range , input: [4, 2], rsm: [FlowsTo_0, FlowsTo_9]", shape = ellipse, color="red"] +_1_38 [label = "43 Range , input: [2, 5], rsm: [FlowsTo_9, FlowsTo_1]", shape = ellipse] +_1_39 [label = "44 Intermediate input: 2, rsm: FlowsTo_2, input: [4, 2]", shape = plain, color="red"] +_1_40 [label = "45 Terminal 'load_0_r', input: [2, 5]", shape = rectangle] +_1_41 [label = "46 Range , input: [4, 2], rsm: [FlowsTo_0, FlowsTo_2]", shape = ellipse] +_1_42 [label = "47 Range , input: [2, 2], rsm: [FlowsTo_2, FlowsTo_9]", shape = ellipse, color="red"] +_1_43 [label = "48 Intermediate input: 3, rsm: FlowsTo_1, input: [4, 2]", shape = plain] +_1_44 [label = "49 Nonterminal Alias, input: [2, 2]", shape = invtrapezium, color="red"] +_1_45 [label = "5 Intermediate input: 2, rsm: S_1, input: [0, 3]", shape = plain] +_1_46 [label = "50 Range , input: [4, 3], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_47 [label = "51 Range , input: [3, 2], rsm: [FlowsTo_1, FlowsTo_2]", shape = ellipse] +_1_48 [label = "52 Range , input: [2, 2], rsm: [Alias_0, Alias_2]", shape = ellipse, color="red"] +_1_49 [label = "53 Terminal 'alloc_r', input: [4, 3]", shape = rectangle] +_1_50 [label = "54 Terminal 'store_0_r', input: [3, 2]", shape = rectangle] +_1_51 [label = "55 Intermediate input: 1, rsm: Alias_1, input: [2, 2]", shape = plain] +_1_52 [label = "56 Intermediate input: 4, rsm: Alias_1, input: [2, 2]", shape = plain, color="red"] +_1_53 [label = "57 Range , input: [2, 1], rsm: [Alias_0, Alias_1]", shape = ellipse] +_1_54 [label = "58 Range , input: [2, 4], rsm: [Alias_0, Alias_1]", shape = ellipse] +_1_55 [label = "59 Nonterminal PointsTo, input: [2, 1]", shape = invtrapezium] +_1_56 [label = "6 Nonterminal PointsTo, input: [3, 4]", shape = invtrapezium] +_1_57 [label = "60 Nonterminal PointsTo, input: [2, 4]", shape = invtrapezium] +_1_58 [label = "61 Range , input: [2, 1], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_59 [label = "62 Range , input: [2, 4], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_60 [label = "63 Intermediate input: 0, rsm: PointsTo_0, input: [2, 1]", shape = plain] +_1_61 [label = "64 Intermediate input: 3, rsm: PointsTo_0, input: [2, 4]", shape = plain] +_1_62 [label = "65 Range , input: [2, 0], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_1_63 [label = "66 Range , input: [2, 3], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_1_64 [label = "67 Terminal 'assign', input: [2, 0]", shape = rectangle] +_1_65 [label = "68 Intermediate input: 2, rsm: PointsTo_9, input: [2, 3]", shape = plain] +_1_66 [label = "69 Range , input: [2, 2], rsm: [PointsTo_0, PointsTo_9]", shape = ellipse] +_1_67 [label = "7 Range , input: [0, 2], rsm: [S_0, S_1]", shape = ellipse] +_1_68 [label = "70 Range , input: [2, 3], rsm: [PointsTo_9, PointsTo_0]", shape = ellipse] +_1_69 [label = "71 Intermediate input: 2, rsm: PointsTo_1, input: [2, 2]", shape = plain] +_1_70 [label = "72 Range , input: [2, 2], rsm: [PointsTo_0, PointsTo_1]", shape = ellipse] +_1_71 [label = "73 Range , input: [2, 2], rsm: [PointsTo_1, PointsTo_9]", shape = ellipse] +_1_72 [label = "74 Intermediate input: 5, rsm: PointsTo_0, input: [2, 2]", shape = plain] +_1_73 [label = "75 Nonterminal Alias, input: [2, 2]", shape = invtrapezium] +_1_74 [label = "76 Range , input: [2, 5], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_1_75 [label = "77 Range , input: [5, 2], rsm: [PointsTo_0, PointsTo_1]", shape = ellipse] +_1_76 [label = "78 Terminal 'assign', input: [2, 5]", shape = rectangle] +_1_77 [label = "79 Terminal 'load_0', input: [5, 2]", shape = rectangle] +_1_78 [label = "8 Range , input: [2, 3], rsm: [S_1, S_0]", shape = ellipse] +_1_79 [label = "9 Range , input: [3, 4], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_0->_1_1 +_1_1->_1_12 +_1_2->_1_6 +_1_3->_1_23 +_1_3->_1_7 +_1_6->_1_8 +_1_7->_1_9 +_1_8->_1_10 +_1_8->_1_11 +_1_9->_1_13 +_1_10->_1_14 +_1_11->_1_15 +_1_12->_1_23 +_1_12->_1_34 +_1_13->_1_16 +_1_14->_1_17 +_1_15->_1_18 +_1_16->_1_19 +_1_16->_1_20 +_1_17->_1_21 +_1_18->_1_22 +_1_19->_1_24 +_1_20->_1_25 +_1_22->_1_26 +_1_22->_1_27 +_1_23->_1_45 +_1_24->_1_79 +_1_25->_1_28 +_1_26->_1_29 +_1_27->_1_30 +_1_28->_1_31 +_1_31->_1_32 +_1_31->_1_33 +_1_32->_1_35 +_1_33->_1_36 +_1_34->_1_56 +_1_35->_1_37 +_1_35->_1_38 +_1_37->_1_39 +_1_38->_1_40 +_1_39->_1_41 +_1_39->_1_42 +_1_41->_1_43 +_1_42->_1_44 +_1_43->_1_46 +_1_43->_1_47 +_1_44->_1_48 +_1_45->_1_67 +_1_45->_1_78 +_1_46->_1_49 +_1_47->_1_50 +_1_48->_1_51 +_1_48->_1_52 +_1_51->_1_53 +_1_51->_1_11 +_1_52->_1_54 +_1_52->_1_20 +_1_53->_1_55 +_1_54->_1_57 +_1_55->_1_58 +_1_56->_1_79 +_1_57->_1_59 +_1_58->_1_60 +_1_59->_1_61 +_1_60->_1_62 +_1_60->_1_17 +_1_61->_1_63 +_1_61->_1_79 +_1_62->_1_64 +_1_63->_1_65 +_1_65->_1_66 +_1_65->_1_68 +_1_66->_1_69 +_1_67->_1_2 +_1_67->_1_3 +_1_68->_1_4 +_1_69->_1_70 +_1_69->_1_71 +_1_70->_1_72 +_1_71->_1_73 +_1_72->_1_74 +_1_72->_1_75 +_1_73->_1_48 +_1_74->_1_76 +_1_75->_1_77 +_1_78->_1_4 +_1_79->_1_5 +} + +} + diff --git a/docs/docs/figures/graph_2_sppf.dot.svg b/docs/docs/figures/graph_2_sppf.dot.svg new file mode 100644 index 000000000..144bea2ab --- /dev/null +++ b/docs/docs/figures/graph_2_sppf.dot.svg @@ -0,0 +1,1002 @@ + + + + + + +g + + +cluster_1 + + + + +_1_0 + +0     Nonterminal S, input: [0, 4] + + + +_1_1 + +1     Range , input: [0, 4], rsm: [S_0, S_2] + + + +_1_0->_1_1 + + + + + +_1_12 +2     Intermediate input: 3, rsm: S_0, input: [0, 4] + + + +_1_1->_1_12 + + + + + +_1_2 + +10     Nonterminal Alias, input: [0, 2] + + + +_1_6 + +14     Range , input: [0, 2], rsm: [Alias_0, Alias_2] + + + +_1_2->_1_6 + + + + + +_1_3 +11     Intermediate input: 3, rsm: S_0, input: [0, 2] + + + +_1_7 + +15     Range , input: [3, 2], rsm: [S_0, S_1] + + + +_1_3->_1_7 + + + + + +_1_23 + +3     Range , input: [0, 3], rsm: [S_0, S_0] + + + +_1_3->_1_23 + + + + + +_1_4 + +12     Terminal 'store_0', input: [2, 3] + + + +_1_5 + +13     Terminal 'alloc', input: [3, 4] + + + +_1_8 +16     Intermediate input: 1, rsm: Alias_1, input: [0, 2] + + + +_1_6->_1_8 + + + + + +_1_9 + +17     Nonterminal Alias, input: [3, 2] + + + +_1_7->_1_9 + + + + + +_1_10 + +18     Range , input: [0, 1], rsm: [Alias_0, Alias_1] + + + +_1_8->_1_10 + + + + + +_1_11 + +19     Range , input: [1, 2], rsm: [Alias_1, Alias_2] + + + +_1_8->_1_11 + + + + + +_1_13 + +20     Range , input: [3, 2], rsm: [Alias_0, Alias_2] + + + +_1_9->_1_13 + + + + + +_1_14 + +21     Nonterminal PointsTo, input: [0, 1] + + + +_1_10->_1_14 + + + + + +_1_15 + +22     Nonterminal FlowsTo, input: [1, 2] + + + +_1_11->_1_15 + + + + + +_1_12->_1_23 + + + + + +_1_34 + +4     Range , input: [3, 4], rsm: [S_0, S_2] + + + +_1_12->_1_34 + + + + + +_1_16 +23     Intermediate input: 4, rsm: Alias_1, input: [3, 2] + + + +_1_13->_1_16 + + + + + +_1_17 + +24     Range , input: [0, 1], rsm: [PointsTo_0, PointsTo_5] + + + +_1_14->_1_17 + + + + + +_1_18 + +25     Range , input: [1, 2], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_15->_1_18 + + + + + +_1_19 + +26     Range , input: [3, 4], rsm: [Alias_0, Alias_1] + + + +_1_16->_1_19 + + + + + +_1_20 + +27     Range , input: [4, 2], rsm: [Alias_1, Alias_2] + + + +_1_16->_1_20 + + + + + +_1_21 + +28     Terminal 'alloc', input: [0, 1] + + + +_1_17->_1_21 + + + + + +_1_22 +29     Intermediate input: 0, rsm: FlowsTo_1, input: [1, 2] + + + +_1_18->_1_22 + + + + + +_1_24 + +30     Nonterminal PointsTo, input: [3, 4] + + + +_1_19->_1_24 + + + + + +_1_25 + +31     Nonterminal FlowsTo, input: [4, 2] + + + +_1_20->_1_25 + + + + + +_1_26 + +32     Range , input: [1, 0], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_22->_1_26 + + + + + +_1_27 + +33     Range , input: [0, 2], rsm: [FlowsTo_1, FlowsTo_1] + + + +_1_22->_1_27 + + + + + +_1_45 +5     Intermediate input: 2, rsm: S_1, input: [0, 3] + + + +_1_23->_1_45 + + + + + +_1_79 + +9     Range , input: [3, 4], rsm: [PointsTo_0, PointsTo_5] + + + +_1_24->_1_79 + + + + + +_1_28 + +34     Range , input: [4, 2], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_25->_1_28 + + + + + +_1_29 + +35     Terminal 'alloc_r', input: [1, 0] + + + +_1_26->_1_29 + + + + + +_1_30 + +36     Terminal 'assign_r', input: [0, 2] + + + +_1_27->_1_30 + + + + + +_1_31 +37     Intermediate input: 5, rsm: FlowsTo_1, input: [4, 2] + + + +_1_28->_1_31 + + + + + +_1_32 + +38     Range , input: [4, 5], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_31->_1_32 + + + + + +_1_33 + +39     Range , input: [5, 2], rsm: [FlowsTo_1, FlowsTo_1] + + + +_1_31->_1_33 + + + + + +_1_35 +40     Intermediate input: 2, rsm: FlowsTo_9, input: [4, 5] + + + +_1_32->_1_35 + + + + + +_1_36 + +41     Terminal 'assign_r', input: [5, 2] + + + +_1_33->_1_36 + + + + + +_1_56 + +6     Nonterminal PointsTo, input: [3, 4] + + + +_1_34->_1_56 + + + + + +_1_37 + +42     Range , input: [4, 2], rsm: [FlowsTo_0, FlowsTo_9] + + + +_1_35->_1_37 + + + + + +_1_38 + +43     Range , input: [2, 5], rsm: [FlowsTo_9, FlowsTo_1] + + + +_1_35->_1_38 + + + + + +_1_39 +44     Intermediate input: 2, rsm: FlowsTo_2, input: [4, 2] + + + +_1_37->_1_39 + + + + + +_1_40 + +45     Terminal 'load_0_r', input: [2, 5] + + + +_1_38->_1_40 + + + + + +_1_41 + +46     Range , input: [4, 2], rsm: [FlowsTo_0, FlowsTo_2] + + + +_1_39->_1_41 + + + + + +_1_42 + +47     Range , input: [2, 2], rsm: [FlowsTo_2, FlowsTo_9] + + + +_1_39->_1_42 + + + + + +_1_43 +48     Intermediate input: 3, rsm: FlowsTo_1, input: [4, 2] + + + +_1_41->_1_43 + + + + + +_1_44 + +49     Nonterminal Alias, input: [2, 2] + + + +_1_42->_1_44 + + + + + +_1_46 + +50     Range , input: [4, 3], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_43->_1_46 + + + + + +_1_47 + +51     Range , input: [3, 2], rsm: [FlowsTo_1, FlowsTo_2] + + + +_1_43->_1_47 + + + + + +_1_48 + +52     Range , input: [2, 2], rsm: [Alias_0, Alias_2] + + + +_1_44->_1_48 + + + + + +_1_67 + +7     Range , input: [0, 2], rsm: [S_0, S_1] + + + +_1_45->_1_67 + + + + + +_1_78 + +8     Range , input: [2, 3], rsm: [S_1, S_0] + + + +_1_45->_1_78 + + + + + +_1_49 + +53     Terminal 'alloc_r', input: [4, 3] + + + +_1_46->_1_49 + + + + + +_1_50 + +54     Terminal 'store_0_r', input: [3, 2] + + + +_1_47->_1_50 + + + + + +_1_51 +55     Intermediate input: 1, rsm: Alias_1, input: [2, 2] + + + +_1_48->_1_51 + + + + + +_1_52 +56     Intermediate input: 4, rsm: Alias_1, input: [2, 2] + + + +_1_48->_1_52 + + + + + +_1_51->_1_11 + + + + + +_1_53 + +57     Range , input: [2, 1], rsm: [Alias_0, Alias_1] + + + +_1_51->_1_53 + + + + + +_1_52->_1_20 + + + + + +_1_54 + +58     Range , input: [2, 4], rsm: [Alias_0, Alias_1] + + + +_1_52->_1_54 + + + + + +_1_55 + +59     Nonterminal PointsTo, input: [2, 1] + + + +_1_53->_1_55 + + + + + +_1_57 + +60     Nonterminal PointsTo, input: [2, 4] + + + +_1_54->_1_57 + + + + + +_1_58 + +61     Range , input: [2, 1], rsm: [PointsTo_0, PointsTo_5] + + + +_1_55->_1_58 + + + + + +_1_56->_1_79 + + + + + +_1_59 + +62     Range , input: [2, 4], rsm: [PointsTo_0, PointsTo_5] + + + +_1_57->_1_59 + + + + + +_1_60 +63     Intermediate input: 0, rsm: PointsTo_0, input: [2, 1] + + + +_1_58->_1_60 + + + + + +_1_61 +64     Intermediate input: 3, rsm: PointsTo_0, input: [2, 4] + + + +_1_59->_1_61 + + + + + +_1_60->_1_17 + + + + + +_1_62 + +65     Range , input: [2, 0], rsm: [PointsTo_0, PointsTo_0] + + + +_1_60->_1_62 + + + + + +_1_63 + +66     Range , input: [2, 3], rsm: [PointsTo_0, PointsTo_0] + + + +_1_61->_1_63 + + + + + +_1_61->_1_79 + + + + + +_1_64 + +67     Terminal 'assign', input: [2, 0] + + + +_1_62->_1_64 + + + + + +_1_65 +68     Intermediate input: 2, rsm: PointsTo_9, input: [2, 3] + + + +_1_63->_1_65 + + + + + +_1_66 + +69     Range , input: [2, 2], rsm: [PointsTo_0, PointsTo_9] + + + +_1_65->_1_66 + + + + + +_1_68 + +70     Range , input: [2, 3], rsm: [PointsTo_9, PointsTo_0] + + + +_1_65->_1_68 + + + + + +_1_69 +71     Intermediate input: 2, rsm: PointsTo_1, input: [2, 2] + + + +_1_66->_1_69 + + + + + +_1_67->_1_2 + + + + + +_1_67->_1_3 + + + + + +_1_68->_1_4 + + + + + +_1_70 + +72     Range , input: [2, 2], rsm: [PointsTo_0, PointsTo_1] + + + +_1_69->_1_70 + + + + + +_1_71 + +73     Range , input: [2, 2], rsm: [PointsTo_1, PointsTo_9] + + + +_1_69->_1_71 + + + + + +_1_72 +74     Intermediate input: 5, rsm: PointsTo_0, input: [2, 2] + + + +_1_70->_1_72 + + + + + +_1_73 + +75     Nonterminal Alias, input: [2, 2] + + + +_1_71->_1_73 + + + + + +_1_74 + +76     Range , input: [2, 5], rsm: [PointsTo_0, PointsTo_0] + + + +_1_72->_1_74 + + + + + +_1_75 + +77     Range , input: [5, 2], rsm: [PointsTo_0, PointsTo_1] + + + +_1_72->_1_75 + + + + + +_1_73->_1_48 + + + + + +_1_76 + +78     Terminal 'assign', input: [2, 5] + + + +_1_74->_1_76 + + + + + +_1_77 + +79     Terminal 'load_0', input: [5, 2] + + + +_1_75->_1_77 + + + + + +_1_78->_1_4 + + + + + +_1_79->_1_5 + + + + + diff --git a/docs/docs/figures/graph_3.dot b/docs/docs/figures/graph_3.dot new file mode 100644 index 000000000..e2e5b2c09 --- /dev/null +++ b/docs/docs/figures/graph_3.dot @@ -0,0 +1,20 @@ +digraph { + start -> 0; + 1 -> 0 [label = "assign"]; + 0 -> 1 [label = "assign_r"]; + 1 -> 2 [label = "store_0"]; + 2 -> 1 [label = "store_0_r"]; + 1 -> 2 [label = "assign"]; + 2 -> 1 [label = "assign_r"]; + 2 -> 3 [label = "alloc"]; + 3 -> 2 [label = "alloc_r"]; + 0 -> 4 [label = "alloc"]; + 4 -> 0 [label = "alloc_r"]; + + + 0[label = "0 | n"] + 1[label = "1 | l"] + 2[label = "2 | t" ] + 3[label = "3 | new X() // line 4"] + 4[label = "4 | new X() // line 1"] +} diff --git a/docs/docs/figures/graph_3.dot.svg b/docs/docs/figures/graph_3.dot.svg new file mode 100644 index 000000000..3beaf3825 --- /dev/null +++ b/docs/docs/figures/graph_3.dot.svg @@ -0,0 +1,125 @@ + + + + + + +%393 + + + +start + +start + + + +0 + +0 | n + + + +start->0 + + + + + +1 + +1 | l + + + +0->1 + + +assign_r + + + +4 + +4 | new X() // line 1 + + + +0->4 + + +alloc + + + +1->0 + + +assign + + + +2 + +2 | t + + + +1->2 + + +store_0 + + + +1->2 + + +assign + + + +2->1 + + +store_0_r + + + +2->1 + + +assign_r + + + +3 + +3 | new X() // line 4 + + + +2->3 + + +alloc + + + +3->2 + + +alloc_r + + + +4->0 + + +alloc_r + + + diff --git a/docs/docs/figures/graph_3_sppf.dot b/docs/docs/figures/graph_3_sppf.dot new file mode 100644 index 000000000..0a0877649 --- /dev/null +++ b/docs/docs/figures/graph_3_sppf.dot @@ -0,0 +1,95 @@ +digraph g { +labelloc="t" +label="" +subgraph cluster_0{ +labelloc="t" +_0_0 [label = "0 Nonterminal S, input: [0, 3]", shape = invtrapezium] +_0_1 [label = "1 Range , input: [0, 3], rsm: [S_0, S_2]", shape = ellipse] +_0_2 [label = "10 Nonterminal Alias, input: [0, 1]", shape = invtrapezium] +_0_3 [label = "11 Intermediate input: 2, rsm: S_0, input: [0, 1]", shape = plain, color="red"] +_0_4 [label = "12 Terminal 'store_0', input: [1, 2]", shape = rectangle] +_0_5 [label = "13 Terminal 'alloc', input: [2, 3]", shape = rectangle] +_0_6 [label = "14 Range , input: [0, 1], rsm: [Alias_0, Alias_2]", shape = ellipse] +_0_7 [label = "15 Range , input: [2, 1], rsm: [S_0, S_1]", shape = ellipse] +_0_8 [label = "16 Intermediate input: 4, rsm: Alias_1, input: [0, 1]", shape = plain] +_0_9 [label = "17 Nonterminal Alias, input: [2, 1]", shape = invtrapezium] +_0_10 [label = "18 Range , input: [0, 4], rsm: [Alias_0, Alias_1]", shape = ellipse] +_0_11 [label = "19 Range , input: [4, 1], rsm: [Alias_1, Alias_2]", shape = ellipse] +_0_12 [label = "2 Intermediate input: 2, rsm: S_0, input: [0, 3]", shape = plain] +_0_13 [label = "20 Range , input: [2, 1], rsm: [Alias_0, Alias_2]", shape = ellipse] +_0_14 [label = "21 Nonterminal PointsTo, input: [0, 4]", shape = invtrapezium] +_0_15 [label = "22 Nonterminal FlowsTo, input: [4, 1]", shape = invtrapezium] +_0_16 [label = "23 Intermediate input: 3, rsm: Alias_1, input: [2, 1]", shape = plain] +_0_17 [label = "24 Range , input: [0, 4], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_0_18 [label = "25 Range , input: [4, 1], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_0_19 [label = "26 Range , input: [2, 3], rsm: [Alias_0, Alias_1]", shape = ellipse] +_0_20 [label = "27 Range , input: [3, 1], rsm: [Alias_1, Alias_2]", shape = ellipse] +_0_21 [label = "28 Terminal 'alloc', input: [0, 4]", shape = rectangle] +_0_22 [label = "29 Intermediate input: 0, rsm: FlowsTo_1, input: [4, 1]", shape = plain] +_0_23 [label = "3 Range , input: [0, 2], rsm: [S_0, S_0]", shape = ellipse, color="red"] +_0_24 [label = "30 Nonterminal PointsTo, input: [2, 3]", shape = invtrapezium] +_0_25 [label = "31 Nonterminal FlowsTo, input: [3, 1]", shape = invtrapezium] +_0_26 [label = "32 Range , input: [4, 0], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_0_27 [label = "33 Range , input: [0, 1], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_0_28 [label = "34 Range , input: [3, 1], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_0_29 [label = "35 Terminal 'alloc_r', input: [4, 0]", shape = rectangle] +_0_30 [label = "36 Terminal 'assign_r', input: [0, 1]", shape = rectangle] +_0_31 [label = "37 Intermediate input: 2, rsm: FlowsTo_1, input: [3, 1]", shape = plain] +_0_32 [label = "38 Range , input: [3, 2], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_0_33 [label = "39 Range , input: [2, 1], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_0_34 [label = "4 Range , input: [2, 3], rsm: [S_0, S_2]", shape = ellipse] +_0_35 [label = "40 Terminal 'alloc_r', input: [3, 2]", shape = rectangle] +_0_36 [label = "41 Terminal 'assign_r', input: [2, 1]", shape = rectangle] +_0_37 [label = "5 Intermediate input: 1, rsm: S_1, input: [0, 2]", shape = plain, color="red"] +_0_38 [label = "6 Nonterminal PointsTo, input: [2, 3]", shape = invtrapezium] +_0_39 [label = "7 Range , input: [0, 1], rsm: [S_0, S_1]", shape = ellipse, color="red"] +_0_40 [label = "8 Range , input: [1, 2], rsm: [S_1, S_0]", shape = ellipse] +_0_41 [label = "9 Range , input: [2, 3], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_0_0->_0_1 +_0_1->_0_12 +_0_2->_0_6 +_0_3->_0_23 +_0_3->_0_7 +_0_6->_0_8 +_0_7->_0_9 +_0_8->_0_10 +_0_8->_0_11 +_0_9->_0_13 +_0_10->_0_14 +_0_11->_0_15 +_0_12->_0_23 +_0_12->_0_34 +_0_13->_0_16 +_0_14->_0_17 +_0_15->_0_18 +_0_16->_0_19 +_0_16->_0_20 +_0_17->_0_21 +_0_18->_0_22 +_0_19->_0_24 +_0_20->_0_25 +_0_22->_0_26 +_0_22->_0_27 +_0_23->_0_37 +_0_24->_0_41 +_0_25->_0_28 +_0_26->_0_29 +_0_27->_0_30 +_0_28->_0_31 +_0_31->_0_32 +_0_31->_0_33 +_0_32->_0_35 +_0_33->_0_36 +_0_34->_0_38 +_0_37->_0_39 +_0_37->_0_40 +_0_38->_0_41 +_0_39->_0_2 +_0_39->_0_3 +_0_40->_0_4 +_0_41->_0_5 +} + + +} + diff --git a/docs/docs/figures/graph_3_sppf.dot.svg b/docs/docs/figures/graph_3_sppf.dot.svg new file mode 100644 index 000000000..547d50c85 --- /dev/null +++ b/docs/docs/figures/graph_3_sppf.dot.svg @@ -0,0 +1,520 @@ + + + + + + +g + + +cluster_0 + + + + +_0_0 + +0     Nonterminal S, input: [0, 3] + + + +_0_1 + +1     Range , input: [0, 3], rsm: [S_0, S_2] + + + +_0_0->_0_1 + + + + + +_0_12 +2     Intermediate input: 2, rsm: S_0, input: [0, 3] + + + +_0_1->_0_12 + + + + + +_0_2 + +10     Nonterminal Alias, input: [0, 1] + + + +_0_6 + +14     Range , input: [0, 1], rsm: [Alias_0, Alias_2] + + + +_0_2->_0_6 + + + + + +_0_3 +11     Intermediate input: 2, rsm: S_0, input: [0, 1] + + + +_0_7 + +15     Range , input: [2, 1], rsm: [S_0, S_1] + + + +_0_3->_0_7 + + + + + +_0_23 + +3     Range , input: [0, 2], rsm: [S_0, S_0] + + + +_0_3->_0_23 + + + + + +_0_4 + +12     Terminal 'store_0', input: [1, 2] + + + +_0_5 + +13     Terminal 'alloc', input: [2, 3] + + + +_0_8 +16     Intermediate input: 4, rsm: Alias_1, input: [0, 1] + + + +_0_6->_0_8 + + + + + +_0_9 + +17     Nonterminal Alias, input: [2, 1] + + + +_0_7->_0_9 + + + + + +_0_10 + +18     Range , input: [0, 4], rsm: [Alias_0, Alias_1] + + + +_0_8->_0_10 + + + + + +_0_11 + +19     Range , input: [4, 1], rsm: [Alias_1, Alias_2] + + + +_0_8->_0_11 + + + + + +_0_13 + +20     Range , input: [2, 1], rsm: [Alias_0, Alias_2] + + + +_0_9->_0_13 + + + + + +_0_14 + +21     Nonterminal PointsTo, input: [0, 4] + + + +_0_10->_0_14 + + + + + +_0_15 + +22     Nonterminal FlowsTo, input: [4, 1] + + + +_0_11->_0_15 + + + + + +_0_12->_0_23 + + + + + +_0_34 + +4     Range , input: [2, 3], rsm: [S_0, S_2] + + + +_0_12->_0_34 + + + + + +_0_16 +23     Intermediate input: 3, rsm: Alias_1, input: [2, 1] + + + +_0_13->_0_16 + + + + + +_0_17 + +24     Range , input: [0, 4], rsm: [PointsTo_0, PointsTo_5] + + + +_0_14->_0_17 + + + + + +_0_18 + +25     Range , input: [4, 1], rsm: [FlowsTo_0, FlowsTo_1] + + + +_0_15->_0_18 + + + + + +_0_19 + +26     Range , input: [2, 3], rsm: [Alias_0, Alias_1] + + + +_0_16->_0_19 + + + + + +_0_20 + +27     Range , input: [3, 1], rsm: [Alias_1, Alias_2] + + + +_0_16->_0_20 + + + + + +_0_21 + +28     Terminal 'alloc', input: [0, 4] + + + +_0_17->_0_21 + + + + + +_0_22 +29     Intermediate input: 0, rsm: FlowsTo_1, input: [4, 1] + + + +_0_18->_0_22 + + + + + +_0_24 + +30     Nonterminal PointsTo, input: [2, 3] + + + +_0_19->_0_24 + + + + + +_0_25 + +31     Nonterminal FlowsTo, input: [3, 1] + + + +_0_20->_0_25 + + + + + +_0_26 + +32     Range , input: [4, 0], rsm: [FlowsTo_0, FlowsTo_1] + + + +_0_22->_0_26 + + + + + +_0_27 + +33     Range , input: [0, 1], rsm: [FlowsTo_1, FlowsTo_1] + + + +_0_22->_0_27 + + + + + +_0_37 +5     Intermediate input: 1, rsm: S_1, input: [0, 2] + + + +_0_23->_0_37 + + + + + +_0_41 + +9     Range , input: [2, 3], rsm: [PointsTo_0, PointsTo_5] + + + +_0_24->_0_41 + + + + + +_0_28 + +34     Range , input: [3, 1], rsm: [FlowsTo_0, FlowsTo_1] + + + +_0_25->_0_28 + + + + + +_0_29 + +35     Terminal 'alloc_r', input: [4, 0] + + + +_0_26->_0_29 + + + + + +_0_30 + +36     Terminal 'assign_r', input: [0, 1] + + + +_0_27->_0_30 + + + + + +_0_31 +37     Intermediate input: 2, rsm: FlowsTo_1, input: [3, 1] + + + +_0_28->_0_31 + + + + + +_0_32 + +38     Range , input: [3, 2], rsm: [FlowsTo_0, FlowsTo_1] + + + +_0_31->_0_32 + + + + + +_0_33 + +39     Range , input: [2, 1], rsm: [FlowsTo_1, FlowsTo_1] + + + +_0_31->_0_33 + + + + + +_0_35 + +40     Terminal 'alloc_r', input: [3, 2] + + + +_0_32->_0_35 + + + + + +_0_36 + +41     Terminal 'assign_r', input: [2, 1] + + + +_0_33->_0_36 + + + + + +_0_38 + +6     Nonterminal PointsTo, input: [2, 3] + + + +_0_34->_0_38 + + + + + +_0_39 + +7     Range , input: [0, 1], rsm: [S_0, S_1] + + + +_0_37->_0_39 + + + + + +_0_40 + +8     Range , input: [1, 2], rsm: [S_1, S_0] + + + +_0_37->_0_40 + + + + + +_0_38->_0_41 + + + + + +_0_39->_0_2 + + + + + +_0_39->_0_3 + + + + + +_0_40->_0_4 + + + + + +_0_41->_0_5 + + + + + diff --git a/docs/docs/figures/graph_4.dot b/docs/docs/figures/graph_4.dot new file mode 100644 index 000000000..a8936f86d --- /dev/null +++ b/docs/docs/figures/graph_4.dot @@ -0,0 +1,45 @@ +digraph { + start -> 1; + start -> 8; + 1 -> 0 [label = "alloc"]; + 0 -> 1 [label = "alloc_r"]; + 4 -> 2 [label = "alloc"]; + 2 -> 4 [label = "alloc_r"]; + 5 -> 3 [label = "alloc"]; + 3 -> 5 [label = "alloc_r"]; + 10 -> 12 [label = "alloc"]; + 12 -> 10 [label = "alloc_r"]; + 11 -> 13 [label = "alloc"]; + 13 -> 11 [label = "alloc_r"]; + 8 -> 6 [label = "assign"]; + 6 -> 8 [label = "assign_r"]; + 9 -> 7 [label = "assign"]; + 7 -> 9 [label = "assign_r"]; + 4 -> 1 [label = "store_0"]; + 1 -> 4 [label = "store_0_r"]; + 5 -> 1 [label = "store_1"]; + 1 -> 5 [label = "store_1_r"]; + 8 -> 10 [label = "store_2"]; + 10 -> 8 [label = "store_2_r"]; + 9 -> 11 [label = "store_3"]; + 11 -> 9 [label = "store_3_r"]; + 6 -> 4 [label = "load_0"]; + 4 -> 6 [label = "load_0_r"]; + 7 -> 5 [label = "load_1"]; + 5 -> 7 [label = "load_1_r"]; + + 0[label="0 | new X()"]; + 1[label="1 | n"]; + 2[label="2 | new Z()"]; + 3[label="3 | new U()"]; + 4[label="4 | z"]; + 5[label="5 | u"]; + 6[label="6 | tmp1 // line 6"]; + 7[label="7 | tmp2 // line 8"]; + 8[label="8 | v"]; + 9[label="9 | r"]; + 10[label="10 | tmp3 // line 7"]; + 11[label="11 | tmp4 // line 9"]; + 12[label="12 | new Y()"]; + 13[label="13 | new P()"]; +} diff --git a/docs/docs/figures/graph_4.dot.svg b/docs/docs/figures/graph_4.dot.svg new file mode 100644 index 000000000..5a55bc680 --- /dev/null +++ b/docs/docs/figures/graph_4.dot.svg @@ -0,0 +1,297 @@ + + + + + + +%503 + + + +start + +start + + + +1 + +1 | n + + + +start->1 + + + + + +8 + +8 | v + + + +start->8 + + + + + +0 + +0 | new X() + + + +1->0 + + +alloc + + + +4 + +4 | z + + + +1->4 + + +store_0_r + + + +5 + +5 | u + + + +1->5 + + +store_1_r + + + +10 + +10 | tmp3 // line 7 + + + +8->10 + + +store_2 + + + +6 + +6 | tmp1 // line 6 + + + +8->6 + + +assign + + + +0->1 + + +alloc_r + + + +4->1 + + +store_0 + + + +2 + +2 | new Z() + + + +4->2 + + +alloc + + + +4->6 + + +load_0_r + + + +2->4 + + +alloc_r + + + +5->1 + + +store_1 + + + +3 + +3 | new U() + + + +5->3 + + +alloc + + + +7 + +7 | tmp2 // line 8 + + + +5->7 + + +load_1_r + + + +3->5 + + +alloc_r + + + +10->8 + + +store_2_r + + + +12 + +12 | new Y() + + + +10->12 + + +alloc + + + +12->10 + + +alloc_r + + + +11 + +11 | tmp4 // line 9 + + + +13 + +13 | new P() + + + +11->13 + + +alloc + + + +9 + +9 | r + + + +11->9 + + +store_3_r + + + +13->11 + + +alloc_r + + + +6->8 + + +assign_r + + + +6->4 + + +load_0 + + + +9->11 + + +store_3 + + + +9->7 + + +assign + + + +7->5 + + +load_1 + + + +7->9 + + +assign_r + + + diff --git a/docs/docs/figures/graph_4_sppf.dot b/docs/docs/figures/graph_4_sppf.dot new file mode 100644 index 000000000..d7983d9c2 --- /dev/null +++ b/docs/docs/figures/graph_4_sppf.dot @@ -0,0 +1,573 @@ +digraph g { +labelloc="t" +label="" +subgraph cluster_0{ +labelloc="t" +_0_0 [label = "0 Nonterminal S, input: [1, 0]", shape = invtrapezium] +_0_1 [label = "1 Range , input: [1, 0], rsm: [S_0, S_2]", shape = ellipse] +_0_2 [label = "2 Nonterminal PointsTo, input: [1, 0]", shape = invtrapezium] +_0_3 [label = "3 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_0_4 [label = "4 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_0_0->_0_1 +_0_1->_0_2 +_0_2->_0_3 +_0_3->_0_4 +} + +subgraph cluster_1{ +labelloc="t" +_1_0 [label = "0 Nonterminal S, input: [1, 12]", shape = invtrapezium] +_1_1 [label = "1 Range , input: [1, 12], rsm: [S_0, S_2]", shape = ellipse] +_1_2 [label = "10 Nonterminal Alias, input: [1, 8]", shape = invtrapezium] +_1_3 [label = "11 Terminal 'store_2', input: [8, 10]", shape = rectangle] +_1_4 [label = "12 Terminal 'alloc', input: [10, 12]", shape = rectangle] +_1_5 [label = "13 Range , input: [1, 8], rsm: [Alias_0, Alias_2]", shape = ellipse] +_1_6 [label = "14 Intermediate input: 0, rsm: Alias_1, input: [1, 8]", shape = plain] +_1_7 [label = "15 Range , input: [1, 0], rsm: [Alias_0, Alias_1]", shape = ellipse] +_1_8 [label = "16 Range , input: [0, 8], rsm: [Alias_1, Alias_2]", shape = ellipse] +_1_9 [label = "17 Nonterminal PointsTo, input: [1, 0]", shape = invtrapezium] +_1_10 [label = "18 Nonterminal FlowsTo, input: [0, 8]", shape = invtrapezium] +_1_11 [label = "19 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_12 [label = "2 Intermediate input: 10, rsm: S_0, input: [1, 12]", shape = plain] +_1_13 [label = "20 Range , input: [0, 8], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_14 [label = "21 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_1_15 [label = "22 Intermediate input: 6, rsm: FlowsTo_1, input: [0, 8]", shape = plain] +_1_16 [label = "23 Range , input: [0, 6], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_17 [label = "24 Range , input: [6, 8], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_1_18 [label = "25 Intermediate input: 4, rsm: FlowsTo_9, input: [0, 6]", shape = plain] +_1_19 [label = "26 Terminal 'assign_r', input: [6, 8]", shape = rectangle] +_1_20 [label = "27 Range , input: [0, 4], rsm: [FlowsTo_0, FlowsTo_9]", shape = ellipse] +_1_21 [label = "28 Range , input: [4, 6], rsm: [FlowsTo_9, FlowsTo_1]", shape = ellipse] +_1_22 [label = "29 Intermediate input: 4, rsm: FlowsTo_2, input: [0, 4]", shape = plain] +_1_23 [label = "3 Range , input: [1, 10], rsm: [S_0, S_0]", shape = ellipse] +_1_24 [label = "30 Terminal 'load_0_r', input: [4, 6]", shape = rectangle] +_1_25 [label = "31 Range , input: [0, 4], rsm: [FlowsTo_0, FlowsTo_2]", shape = ellipse] +_1_26 [label = "32 Range , input: [4, 4], rsm: [FlowsTo_2, FlowsTo_9]", shape = ellipse] +_1_27 [label = "33 Intermediate input: 1, rsm: FlowsTo_1, input: [0, 4]", shape = plain] +_1_28 [label = "34 Nonterminal Alias, input: [4, 4]", shape = invtrapezium] +_1_29 [label = "35 Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_30 [label = "36 Range , input: [1, 4], rsm: [FlowsTo_1, FlowsTo_2]", shape = ellipse] +_1_31 [label = "37 Range , input: [4, 4], rsm: [Alias_0, Alias_2]", shape = ellipse] +_1_32 [label = "38 Terminal 'alloc_r', input: [0, 1]", shape = rectangle] +_1_33 [label = "39 Terminal 'store_0_r', input: [1, 4]", shape = rectangle] +_1_34 [label = "4 Range , input: [10, 12], rsm: [S_0, S_2]", shape = ellipse] +_1_35 [label = "40 Intermediate input: 2, rsm: Alias_1, input: [4, 4]", shape = plain] +_1_36 [label = "41 Range , input: [4, 2], rsm: [Alias_0, Alias_1]", shape = ellipse] +_1_37 [label = "42 Range , input: [2, 4], rsm: [Alias_1, Alias_2]", shape = ellipse] +_1_38 [label = "43 Nonterminal PointsTo, input: [4, 2]", shape = invtrapezium] +_1_39 [label = "44 Nonterminal FlowsTo, input: [2, 4]", shape = invtrapezium] +_1_40 [label = "45 Range , input: [4, 2], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_41 [label = "46 Range , input: [2, 4], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_1_42 [label = "47 Terminal 'alloc', input: [4, 2]", shape = rectangle] +_1_43 [label = "48 Terminal 'alloc_r', input: [2, 4]", shape = rectangle] +_1_44 [label = "5 Intermediate input: 8, rsm: S_1, input: [1, 10]", shape = plain] +_1_45 [label = "6 Nonterminal PointsTo, input: [10, 12]", shape = invtrapezium] +_1_46 [label = "7 Range , input: [1, 8], rsm: [S_0, S_1]", shape = ellipse] +_1_47 [label = "8 Range , input: [8, 10], rsm: [S_1, S_0]", shape = ellipse] +_1_48 [label = "9 Range , input: [10, 12], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_1_0->_1_1 +_1_1->_1_12 +_1_2->_1_5 +_1_5->_1_6 +_1_6->_1_7 +_1_6->_1_8 +_1_7->_1_9 +_1_8->_1_10 +_1_9->_1_11 +_1_10->_1_13 +_1_11->_1_14 +_1_12->_1_23 +_1_12->_1_34 +_1_13->_1_15 +_1_15->_1_16 +_1_15->_1_17 +_1_16->_1_18 +_1_17->_1_19 +_1_18->_1_20 +_1_18->_1_21 +_1_20->_1_22 +_1_21->_1_24 +_1_22->_1_25 +_1_22->_1_26 +_1_23->_1_44 +_1_25->_1_27 +_1_26->_1_28 +_1_27->_1_29 +_1_27->_1_30 +_1_28->_1_31 +_1_29->_1_32 +_1_30->_1_33 +_1_31->_1_35 +_1_34->_1_45 +_1_35->_1_36 +_1_35->_1_37 +_1_36->_1_38 +_1_37->_1_39 +_1_38->_1_40 +_1_39->_1_41 +_1_40->_1_42 +_1_41->_1_43 +_1_44->_1_46 +_1_44->_1_47 +_1_45->_1_48 +_1_46->_1_2 +_1_47->_1_3 +_1_48->_1_4 +} + +subgraph cluster_2{ +labelloc="t" +_2_0 [label = "0 Nonterminal S, input: [1, 13]", shape = invtrapezium] +_2_1 [label = "1 Range , input: [1, 13], rsm: [S_0, S_2]", shape = ellipse] +_2_2 [label = "10 Nonterminal Alias, input: [1, 9]", shape = invtrapezium] +_2_3 [label = "11 Terminal 'store_3', input: [9, 11]", shape = rectangle] +_2_4 [label = "12 Terminal 'alloc', input: [11, 13]", shape = rectangle] +_2_5 [label = "13 Range , input: [1, 9], rsm: [Alias_0, Alias_2]", shape = ellipse] +_2_6 [label = "14 Intermediate input: 0, rsm: Alias_1, input: [1, 9]", shape = plain] +_2_7 [label = "15 Range , input: [1, 0], rsm: [Alias_0, Alias_1]", shape = ellipse] +_2_8 [label = "16 Range , input: [0, 9], rsm: [Alias_1, Alias_2]", shape = ellipse] +_2_9 [label = "17 Nonterminal PointsTo, input: [1, 0]", shape = invtrapezium] +_2_10 [label = "18 Nonterminal FlowsTo, input: [0, 9]", shape = invtrapezium] +_2_11 [label = "19 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_2_12 [label = "2 Intermediate input: 11, rsm: S_0, input: [1, 13]", shape = plain] +_2_13 [label = "20 Range , input: [0, 9], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_2_14 [label = "21 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_2_15 [label = "22 Intermediate input: 7, rsm: FlowsTo_1, input: [0, 9]", shape = plain] +_2_16 [label = "23 Range , input: [0, 7], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_2_17 [label = "24 Range , input: [7, 9], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_2_18 [label = "25 Intermediate input: 5, rsm: FlowsTo_8, input: [0, 7]", shape = plain] +_2_19 [label = "26 Terminal 'assign_r', input: [7, 9]", shape = rectangle] +_2_20 [label = "27 Range , input: [0, 5], rsm: [FlowsTo_0, FlowsTo_8]", shape = ellipse] +_2_21 [label = "28 Range , input: [5, 7], rsm: [FlowsTo_8, FlowsTo_1]", shape = ellipse] +_2_22 [label = "29 Intermediate input: 5, rsm: FlowsTo_3, input: [0, 5]", shape = plain] +_2_23 [label = "3 Range , input: [1, 11], rsm: [S_0, S_0]", shape = ellipse] +_2_24 [label = "30 Terminal 'load_1_r', input: [5, 7]", shape = rectangle] +_2_25 [label = "31 Range , input: [0, 5], rsm: [FlowsTo_0, FlowsTo_3]", shape = ellipse] +_2_26 [label = "32 Range , input: [5, 5], rsm: [FlowsTo_3, FlowsTo_8]", shape = ellipse] +_2_27 [label = "33 Intermediate input: 1, rsm: FlowsTo_1, input: [0, 5]", shape = plain] +_2_28 [label = "34 Nonterminal Alias, input: [5, 5]", shape = invtrapezium] +_2_29 [label = "35 Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_2_30 [label = "36 Range , input: [1, 5], rsm: [FlowsTo_1, FlowsTo_3]", shape = ellipse] +_2_31 [label = "37 Range , input: [5, 5], rsm: [Alias_0, Alias_2]", shape = ellipse] +_2_32 [label = "38 Terminal 'alloc_r', input: [0, 1]", shape = rectangle] +_2_33 [label = "39 Terminal 'store_1_r', input: [1, 5]", shape = rectangle] +_2_34 [label = "4 Range , input: [11, 13], rsm: [S_0, S_2]", shape = ellipse] +_2_35 [label = "40 Intermediate input: 3, rsm: Alias_1, input: [5, 5]", shape = plain] +_2_36 [label = "41 Range , input: [5, 3], rsm: [Alias_0, Alias_1]", shape = ellipse] +_2_37 [label = "42 Range , input: [3, 5], rsm: [Alias_1, Alias_2]", shape = ellipse] +_2_38 [label = "43 Nonterminal PointsTo, input: [5, 3]", shape = invtrapezium] +_2_39 [label = "44 Nonterminal FlowsTo, input: [3, 5]", shape = invtrapezium] +_2_40 [label = "45 Range , input: [5, 3], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_2_41 [label = "46 Range , input: [3, 5], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_2_42 [label = "47 Terminal 'alloc', input: [5, 3]", shape = rectangle] +_2_43 [label = "48 Terminal 'alloc_r', input: [3, 5]", shape = rectangle] +_2_44 [label = "5 Intermediate input: 9, rsm: S_1, input: [1, 11]", shape = plain] +_2_45 [label = "6 Nonterminal PointsTo, input: [11, 13]", shape = invtrapezium] +_2_46 [label = "7 Range , input: [1, 9], rsm: [S_0, S_1]", shape = ellipse] +_2_47 [label = "8 Range , input: [9, 11], rsm: [S_1, S_0]", shape = ellipse] +_2_48 [label = "9 Range , input: [11, 13], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_2_0->_2_1 +_2_1->_2_12 +_2_2->_2_5 +_2_5->_2_6 +_2_6->_2_7 +_2_6->_2_8 +_2_7->_2_9 +_2_8->_2_10 +_2_9->_2_11 +_2_10->_2_13 +_2_11->_2_14 +_2_12->_2_23 +_2_12->_2_34 +_2_13->_2_15 +_2_15->_2_16 +_2_15->_2_17 +_2_16->_2_18 +_2_17->_2_19 +_2_18->_2_20 +_2_18->_2_21 +_2_20->_2_22 +_2_21->_2_24 +_2_22->_2_25 +_2_22->_2_26 +_2_23->_2_44 +_2_25->_2_27 +_2_26->_2_28 +_2_27->_2_29 +_2_27->_2_30 +_2_28->_2_31 +_2_29->_2_32 +_2_30->_2_33 +_2_31->_2_35 +_2_34->_2_45 +_2_35->_2_36 +_2_35->_2_37 +_2_36->_2_38 +_2_37->_2_39 +_2_38->_2_40 +_2_39->_2_41 +_2_40->_2_42 +_2_41->_2_43 +_2_44->_2_46 +_2_44->_2_47 +_2_45->_2_48 +_2_46->_2_2 +_2_47->_2_3 +_2_48->_2_4 +} + +subgraph cluster_3{ +labelloc="t" +_3_0 [label = "0 Nonterminal S, input: [8, 0]", shape = invtrapezium] +_3_1 [label = "1 Range , input: [8, 0], rsm: [S_0, S_2]", shape = ellipse] +_3_2 [label = "10 Range , input: [4, 1], rsm: [PointsTo_9, PointsTo_0]", shape = ellipse] +_3_3 [label = "11 Intermediate input: 4, rsm: PointsTo_1, input: [8, 4]", shape = plain] +_3_4 [label = "12 Terminal 'store_0', input: [4, 1]", shape = rectangle] +_3_5 [label = "13 Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_1]", shape = ellipse] +_3_6 [label = "14 Range , input: [4, 4], rsm: [PointsTo_1, PointsTo_9]", shape = ellipse] +_3_7 [label = "15 Intermediate input: 6, rsm: PointsTo_0, input: [8, 4]", shape = plain] +_3_8 [label = "16 Nonterminal Alias, input: [4, 4]", shape = invtrapezium] +_3_9 [label = "17 Range , input: [8, 6], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_3_10 [label = "18 Range , input: [6, 4], rsm: [PointsTo_0, PointsTo_1]", shape = ellipse] +_3_11 [label = "19 Range , input: [4, 4], rsm: [Alias_0, Alias_2]", shape = ellipse] +_3_12 [label = "2 Nonterminal PointsTo, input: [8, 0]", shape = invtrapezium] +_3_13 [label = "20 Terminal 'assign', input: [8, 6]", shape = rectangle] +_3_14 [label = "21 Terminal 'load_0', input: [6, 4]", shape = rectangle] +_3_15 [label = "22 Intermediate input: 2, rsm: Alias_1, input: [4, 4]", shape = plain] +_3_16 [label = "23 Range , input: [4, 2], rsm: [Alias_0, Alias_1]", shape = ellipse] +_3_17 [label = "24 Range , input: [2, 4], rsm: [Alias_1, Alias_2]", shape = ellipse] +_3_18 [label = "25 Nonterminal PointsTo, input: [4, 2]", shape = invtrapezium] +_3_19 [label = "26 Nonterminal FlowsTo, input: [2, 4]", shape = invtrapezium] +_3_20 [label = "27 Range , input: [4, 2], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_3_21 [label = "28 Range , input: [2, 4], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_3_22 [label = "29 Terminal 'alloc', input: [4, 2]", shape = rectangle] +_3_23 [label = "3 Range , input: [8, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_3_24 [label = "30 Terminal 'alloc_r', input: [2, 4]", shape = rectangle] +_3_25 [label = "4 Intermediate input: 1, rsm: PointsTo_0, input: [8, 0]", shape = plain] +_3_26 [label = "5 Range , input: [8, 1], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_3_27 [label = "6 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_3_28 [label = "7 Intermediate input: 4, rsm: PointsTo_9, input: [8, 1]", shape = plain] +_3_29 [label = "8 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_3_30 [label = "9 Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_9]", shape = ellipse] +_3_0->_3_1 +_3_1->_3_12 +_3_2->_3_4 +_3_3->_3_5 +_3_3->_3_6 +_3_5->_3_7 +_3_6->_3_8 +_3_7->_3_9 +_3_7->_3_10 +_3_8->_3_11 +_3_9->_3_13 +_3_10->_3_14 +_3_11->_3_15 +_3_12->_3_23 +_3_15->_3_16 +_3_15->_3_17 +_3_16->_3_18 +_3_17->_3_19 +_3_18->_3_20 +_3_19->_3_21 +_3_20->_3_22 +_3_21->_3_24 +_3_23->_3_25 +_3_25->_3_26 +_3_25->_3_27 +_3_26->_3_28 +_3_27->_3_29 +_3_28->_3_30 +_3_28->_3_2 +_3_30->_3_3 +} + +subgraph cluster_4{ +labelloc="t" +_4_0 [label = "0 Nonterminal S, input: [8, 12]", shape = invtrapezium] +_4_1 [label = "1 Range , input: [8, 12], rsm: [S_0, S_2]", shape = ellipse] +_4_2 [label = "10 Range , input: [10, 12], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_4_3 [label = "11 Nonterminal Alias, input: [8, 8]", shape = invtrapezium] +_4_4 [label = "12 Terminal 'alloc', input: [10, 12]", shape = rectangle] +_4_5 [label = "13 Range , input: [8, 8], rsm: [Alias_0, Alias_2]", shape = ellipse] +_4_6 [label = "14 Intermediate input: 0, rsm: Alias_1, input: [8, 8]", shape = plain] +_4_7 [label = "15 Range , input: [8, 0], rsm: [Alias_0, Alias_1]", shape = ellipse] +_4_8 [label = "16 Range , input: [0, 8], rsm: [Alias_1, Alias_2]", shape = ellipse] +_4_9 [label = "17 Nonterminal PointsTo, input: [8, 0]", shape = invtrapezium] +_4_10 [label = "18 Nonterminal FlowsTo, input: [0, 8]", shape = invtrapezium] +_4_11 [label = "19 Range , input: [8, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_4_12 [label = "2 Intermediate input: 10, rsm: S_0, input: [8, 12]", shape = plain] +_4_13 [label = "20 Range , input: [0, 8], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_4_14 [label = "21 Intermediate input: 1, rsm: PointsTo_0, input: [8, 0]", shape = plain] +_4_15 [label = "22 Intermediate input: 6, rsm: FlowsTo_1, input: [0, 8]", shape = plain] +_4_16 [label = "23 Range , input: [8, 1], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_4_17 [label = "24 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_4_18 [label = "25 Range , input: [0, 6], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_4_19 [label = "26 Range , input: [6, 8], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_4_20 [label = "27 Intermediate input: 4, rsm: PointsTo_9, input: [8, 1]", shape = plain] +_4_21 [label = "28 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_4_22 [label = "29 Intermediate input: 4, rsm: FlowsTo_9, input: [0, 6]", shape = plain] +_4_23 [label = "3 Range , input: [8, 10], rsm: [S_0, S_0]", shape = ellipse] +_4_24 [label = "30 Terminal 'assign_r', input: [6, 8]", shape = rectangle] +_4_25 [label = "31 Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_9]", shape = ellipse] +_4_26 [label = "32 Range , input: [4, 1], rsm: [PointsTo_9, PointsTo_0]", shape = ellipse] +_4_27 [label = "33 Range , input: [0, 4], rsm: [FlowsTo_0, FlowsTo_9]", shape = ellipse] +_4_28 [label = "34 Range , input: [4, 6], rsm: [FlowsTo_9, FlowsTo_1]", shape = ellipse] +_4_29 [label = "35 Intermediate input: 4, rsm: PointsTo_1, input: [8, 4]", shape = plain] +_4_30 [label = "36 Terminal 'store_0', input: [4, 1]", shape = rectangle] +_4_31 [label = "37 Intermediate input: 4, rsm: FlowsTo_2, input: [0, 4]", shape = plain] +_4_32 [label = "38 Terminal 'load_0_r', input: [4, 6]", shape = rectangle] +_4_33 [label = "39 Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_1]", shape = ellipse] +_4_34 [label = "4 Range , input: [10, 12], rsm: [S_0, S_2]", shape = ellipse] +_4_35 [label = "40 Range , input: [4, 4], rsm: [PointsTo_1, PointsTo_9]", shape = ellipse] +_4_36 [label = "41 Range , input: [0, 4], rsm: [FlowsTo_0, FlowsTo_2]", shape = ellipse] +_4_37 [label = "42 Range , input: [4, 4], rsm: [FlowsTo_2, FlowsTo_9]", shape = ellipse] +_4_38 [label = "43 Intermediate input: 6, rsm: PointsTo_0, input: [8, 4]", shape = plain] +_4_39 [label = "44 Nonterminal Alias, input: [4, 4]", shape = invtrapezium] +_4_40 [label = "45 Intermediate input: 1, rsm: FlowsTo_1, input: [0, 4]", shape = plain] +_4_41 [label = "46 Nonterminal Alias, input: [4, 4]", shape = invtrapezium] +_4_42 [label = "47 Range , input: [8, 6], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_4_43 [label = "48 Range , input: [6, 4], rsm: [PointsTo_0, PointsTo_1]", shape = ellipse] +_4_44 [label = "49 Range , input: [4, 4], rsm: [Alias_0, Alias_2]", shape = ellipse] +_4_45 [label = "5 Terminal 'store_2', input: [8, 10]", shape = rectangle] +_4_46 [label = "50 Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_4_47 [label = "51 Range , input: [1, 4], rsm: [FlowsTo_1, FlowsTo_2]", shape = ellipse] +_4_48 [label = "52 Terminal 'assign', input: [8, 6]", shape = rectangle] +_4_49 [label = "53 Terminal 'load_0', input: [6, 4]", shape = rectangle] +_4_50 [label = "54 Intermediate input: 2, rsm: Alias_1, input: [4, 4]", shape = plain] +_4_51 [label = "55 Terminal 'alloc_r', input: [0, 1]", shape = rectangle] +_4_52 [label = "56 Terminal 'store_0_r', input: [1, 4]", shape = rectangle] +_4_53 [label = "57 Range , input: [4, 2], rsm: [Alias_0, Alias_1]", shape = ellipse] +_4_54 [label = "58 Range , input: [2, 4], rsm: [Alias_1, Alias_2]", shape = ellipse] +_4_55 [label = "59 Nonterminal PointsTo, input: [4, 2]", shape = invtrapezium] +_4_56 [label = "6 Intermediate input: 8, rsm: S_1, input: [8, 10]", shape = plain] +_4_57 [label = "60 Nonterminal FlowsTo, input: [2, 4]", shape = invtrapezium] +_4_58 [label = "61 Range , input: [4, 2], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_4_59 [label = "62 Range , input: [2, 4], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_4_60 [label = "63 Terminal 'alloc', input: [4, 2]", shape = rectangle] +_4_61 [label = "64 Terminal 'alloc_r', input: [2, 4]", shape = rectangle] +_4_62 [label = "7 Nonterminal PointsTo, input: [10, 12]", shape = invtrapezium] +_4_63 [label = "8 Range , input: [8, 8], rsm: [S_0, S_1]", shape = ellipse] +_4_64 [label = "9 Range , input: [8, 10], rsm: [S_1, S_0]", shape = ellipse] +_4_0->_4_1 +_4_1->_4_12 +_4_2->_4_4 +_4_3->_4_5 +_4_5->_4_6 +_4_6->_4_7 +_4_6->_4_8 +_4_7->_4_9 +_4_8->_4_10 +_4_9->_4_11 +_4_10->_4_13 +_4_11->_4_14 +_4_12->_4_23 +_4_12->_4_34 +_4_13->_4_15 +_4_14->_4_16 +_4_14->_4_17 +_4_15->_4_18 +_4_15->_4_19 +_4_16->_4_20 +_4_17->_4_21 +_4_18->_4_22 +_4_19->_4_24 +_4_20->_4_25 +_4_20->_4_26 +_4_22->_4_27 +_4_22->_4_28 +_4_23->_4_45 +_4_23->_4_56 +_4_25->_4_29 +_4_26->_4_30 +_4_27->_4_31 +_4_28->_4_32 +_4_29->_4_33 +_4_29->_4_35 +_4_31->_4_36 +_4_31->_4_37 +_4_33->_4_38 +_4_34->_4_62 +_4_35->_4_39 +_4_36->_4_40 +_4_37->_4_41 +_4_38->_4_42 +_4_38->_4_43 +_4_39->_4_44 +_4_40->_4_46 +_4_40->_4_47 +_4_41->_4_44 +_4_42->_4_48 +_4_43->_4_49 +_4_44->_4_50 +_4_46->_4_51 +_4_47->_4_52 +_4_50->_4_53 +_4_50->_4_54 +_4_53->_4_55 +_4_54->_4_57 +_4_55->_4_58 +_4_56->_4_63 +_4_56->_4_64 +_4_57->_4_59 +_4_58->_4_60 +_4_59->_4_61 +_4_62->_4_2 +_4_63->_4_3 +_4_64->_4_45 +} + +subgraph cluster_5{ +labelloc="t" +_5_0 [label = "0 Nonterminal S, input: [8, 13]", shape = invtrapezium] +_5_1 [label = "1 Range , input: [8, 13], rsm: [S_0, S_2]", shape = ellipse] +_5_2 [label = "10 Nonterminal Alias, input: [8, 9]", shape = invtrapezium] +_5_3 [label = "11 Terminal 'store_3', input: [9, 11]", shape = rectangle] +_5_4 [label = "12 Terminal 'alloc', input: [11, 13]", shape = rectangle] +_5_5 [label = "13 Range , input: [8, 9], rsm: [Alias_0, Alias_2]", shape = ellipse] +_5_6 [label = "14 Intermediate input: 0, rsm: Alias_1, input: [8, 9]", shape = plain] +_5_7 [label = "15 Range , input: [8, 0], rsm: [Alias_0, Alias_1]", shape = ellipse] +_5_8 [label = "16 Range , input: [0, 9], rsm: [Alias_1, Alias_2]", shape = ellipse] +_5_9 [label = "17 Nonterminal PointsTo, input: [8, 0]", shape = invtrapezium] +_5_10 [label = "18 Nonterminal FlowsTo, input: [0, 9]", shape = invtrapezium] +_5_11 [label = "19 Range , input: [8, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_5_12 [label = "2 Intermediate input: 11, rsm: S_0, input: [8, 13]", shape = plain] +_5_13 [label = "20 Range , input: [0, 9], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_5_14 [label = "21 Intermediate input: 1, rsm: PointsTo_0, input: [8, 0]", shape = plain] +_5_15 [label = "22 Intermediate input: 7, rsm: FlowsTo_1, input: [0, 9]", shape = plain] +_5_16 [label = "23 Range , input: [8, 1], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_5_17 [label = "24 Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_5_18 [label = "25 Range , input: [0, 7], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_5_19 [label = "26 Range , input: [7, 9], rsm: [FlowsTo_1, FlowsTo_1]", shape = ellipse] +_5_20 [label = "27 Intermediate input: 4, rsm: PointsTo_9, input: [8, 1]", shape = plain] +_5_21 [label = "28 Terminal 'alloc', input: [1, 0]", shape = rectangle] +_5_22 [label = "29 Intermediate input: 5, rsm: FlowsTo_8, input: [0, 7]", shape = plain] +_5_23 [label = "3 Range , input: [8, 11], rsm: [S_0, S_0]", shape = ellipse] +_5_24 [label = "30 Terminal 'assign_r', input: [7, 9]", shape = rectangle] +_5_25 [label = "31 Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_9]", shape = ellipse] +_5_26 [label = "32 Range , input: [4, 1], rsm: [PointsTo_9, PointsTo_0]", shape = ellipse] +_5_27 [label = "33 Range , input: [0, 5], rsm: [FlowsTo_0, FlowsTo_8]", shape = ellipse] +_5_28 [label = "34 Range , input: [5, 7], rsm: [FlowsTo_8, FlowsTo_1]", shape = ellipse] +_5_29 [label = "35 Intermediate input: 4, rsm: PointsTo_1, input: [8, 4]", shape = plain] +_5_30 [label = "36 Terminal 'store_0', input: [4, 1]", shape = rectangle] +_5_31 [label = "37 Intermediate input: 5, rsm: FlowsTo_3, input: [0, 5]", shape = plain] +_5_32 [label = "38 Terminal 'load_1_r', input: [5, 7]", shape = rectangle] +_5_33 [label = "39 Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_1]", shape = ellipse] +_5_34 [label = "4 Range , input: [11, 13], rsm: [S_0, S_2]", shape = ellipse] +_5_35 [label = "40 Range , input: [4, 4], rsm: [PointsTo_1, PointsTo_9]", shape = ellipse] +_5_36 [label = "41 Range , input: [0, 5], rsm: [FlowsTo_0, FlowsTo_3]", shape = ellipse] +_5_37 [label = "42 Range , input: [5, 5], rsm: [FlowsTo_3, FlowsTo_8]", shape = ellipse] +_5_38 [label = "43 Intermediate input: 6, rsm: PointsTo_0, input: [8, 4]", shape = plain] +_5_39 [label = "44 Nonterminal Alias, input: [4, 4]", shape = invtrapezium] +_5_40 [label = "45 Intermediate input: 1, rsm: FlowsTo_1, input: [0, 5]", shape = plain] +_5_41 [label = "46 Nonterminal Alias, input: [5, 5]", shape = invtrapezium] +_5_42 [label = "47 Range , input: [8, 6], rsm: [PointsTo_0, PointsTo_0]", shape = ellipse] +_5_43 [label = "48 Range , input: [6, 4], rsm: [PointsTo_0, PointsTo_1]", shape = ellipse] +_5_44 [label = "49 Range , input: [4, 4], rsm: [Alias_0, Alias_2]", shape = ellipse] +_5_45 [label = "5 Intermediate input: 9, rsm: S_1, input: [8, 11]", shape = plain] +_5_46 [label = "50 Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_5_47 [label = "51 Range , input: [1, 5], rsm: [FlowsTo_1, FlowsTo_3]", shape = ellipse] +_5_48 [label = "52 Range , input: [5, 5], rsm: [Alias_0, Alias_2]", shape = ellipse] +_5_49 [label = "53 Terminal 'assign', input: [8, 6]", shape = rectangle] +_5_50 [label = "54 Terminal 'load_0', input: [6, 4]", shape = rectangle] +_5_51 [label = "55 Intermediate input: 2, rsm: Alias_1, input: [4, 4]", shape = plain] +_5_52 [label = "56 Terminal 'alloc_r', input: [0, 1]", shape = rectangle] +_5_53 [label = "57 Terminal 'store_1_r', input: [1, 5]", shape = rectangle] +_5_54 [label = "58 Intermediate input: 3, rsm: Alias_1, input: [5, 5]", shape = plain] +_5_55 [label = "59 Range , input: [4, 2], rsm: [Alias_0, Alias_1]", shape = ellipse] +_5_56 [label = "6 Nonterminal PointsTo, input: [11, 13]", shape = invtrapezium] +_5_57 [label = "60 Range , input: [2, 4], rsm: [Alias_1, Alias_2]", shape = ellipse] +_5_58 [label = "61 Range , input: [5, 3], rsm: [Alias_0, Alias_1]", shape = ellipse] +_5_59 [label = "62 Range , input: [3, 5], rsm: [Alias_1, Alias_2]", shape = ellipse] +_5_60 [label = "63 Nonterminal PointsTo, input: [4, 2]", shape = invtrapezium] +_5_61 [label = "64 Nonterminal FlowsTo, input: [2, 4]", shape = invtrapezium] +_5_62 [label = "65 Nonterminal PointsTo, input: [5, 3]", shape = invtrapezium] +_5_63 [label = "66 Nonterminal FlowsTo, input: [3, 5]", shape = invtrapezium] +_5_64 [label = "67 Range , input: [4, 2], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_5_65 [label = "68 Range , input: [2, 4], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_5_66 [label = "69 Range , input: [5, 3], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_5_67 [label = "7 Range , input: [8, 9], rsm: [S_0, S_1]", shape = ellipse] +_5_68 [label = "70 Range , input: [3, 5], rsm: [FlowsTo_0, FlowsTo_1]", shape = ellipse] +_5_69 [label = "71 Terminal 'alloc', input: [4, 2]", shape = rectangle] +_5_70 [label = "72 Terminal 'alloc_r', input: [2, 4]", shape = rectangle] +_5_71 [label = "73 Terminal 'alloc', input: [5, 3]", shape = rectangle] +_5_72 [label = "74 Terminal 'alloc_r', input: [3, 5]", shape = rectangle] +_5_73 [label = "8 Range , input: [9, 11], rsm: [S_1, S_0]", shape = ellipse] +_5_74 [label = "9 Range , input: [11, 13], rsm: [PointsTo_0, PointsTo_5]", shape = ellipse] +_5_0->_5_1 +_5_1->_5_12 +_5_2->_5_5 +_5_5->_5_6 +_5_6->_5_7 +_5_6->_5_8 +_5_7->_5_9 +_5_8->_5_10 +_5_9->_5_11 +_5_10->_5_13 +_5_11->_5_14 +_5_12->_5_23 +_5_12->_5_34 +_5_13->_5_15 +_5_14->_5_16 +_5_14->_5_17 +_5_15->_5_18 +_5_15->_5_19 +_5_16->_5_20 +_5_17->_5_21 +_5_18->_5_22 +_5_19->_5_24 +_5_20->_5_25 +_5_20->_5_26 +_5_22->_5_27 +_5_22->_5_28 +_5_23->_5_45 +_5_25->_5_29 +_5_26->_5_30 +_5_27->_5_31 +_5_28->_5_32 +_5_29->_5_33 +_5_29->_5_35 +_5_31->_5_36 +_5_31->_5_37 +_5_33->_5_38 +_5_34->_5_56 +_5_35->_5_39 +_5_36->_5_40 +_5_37->_5_41 +_5_38->_5_42 +_5_38->_5_43 +_5_39->_5_44 +_5_40->_5_46 +_5_40->_5_47 +_5_41->_5_48 +_5_42->_5_49 +_5_43->_5_50 +_5_44->_5_51 +_5_45->_5_67 +_5_45->_5_73 +_5_46->_5_52 +_5_47->_5_53 +_5_48->_5_54 +_5_51->_5_55 +_5_51->_5_57 +_5_54->_5_58 +_5_54->_5_59 +_5_55->_5_60 +_5_56->_5_74 +_5_57->_5_61 +_5_58->_5_62 +_5_59->_5_63 +_5_60->_5_64 +_5_61->_5_65 +_5_62->_5_66 +_5_63->_5_68 +_5_64->_5_69 +_5_65->_5_70 +_5_66->_5_71 +_5_67->_5_2 +_5_68->_5_72 +_5_73->_5_3 +_5_74->_5_4 +} + +} + diff --git a/docs/docs/figures/graph_4_sppf.dot.svg b/docs/docs/figures/graph_4_sppf.dot.svg new file mode 100644 index 000000000..f7bf293fd --- /dev/null +++ b/docs/docs/figures/graph_4_sppf.dot.svg @@ -0,0 +1,3255 @@ + + + + + + +g + + +cluster_2 + + + +cluster_0 + + + +cluster_1 + + + +cluster_3 + + + +cluster_5 + + + +cluster_4 + + + + +_0_0 + +0     Nonterminal S, input: [1, 0] + + + +_0_1 + +1     Range , input: [1, 0], rsm: [S_0, S_2] + + + +_0_0->_0_1 + + + + + +_0_2 + +2     Nonterminal PointsTo, input: [1, 0] + + + +_0_1->_0_2 + + + + + +_0_3 + +3     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_0_2->_0_3 + + + + + +_0_4 + +4     Terminal 'alloc', input: [1, 0] + + + +_0_3->_0_4 + + + + + +_1_0 + +0     Nonterminal S, input: [1, 12] + + + +_1_1 + +1     Range , input: [1, 12], rsm: [S_0, S_2] + + + +_1_0->_1_1 + + + + + +_1_12 +2     Intermediate input: 10, rsm: S_0, input: [1, 12] + + + +_1_1->_1_12 + + + + + +_1_2 + +10     Nonterminal Alias, input: [1, 8] + + + +_1_5 + +13     Range , input: [1, 8], rsm: [Alias_0, Alias_2] + + + +_1_2->_1_5 + + + + + +_1_3 + +11     Terminal 'store_2', input: [8, 10] + + + +_1_4 + +12     Terminal 'alloc', input: [10, 12] + + + +_1_6 +14     Intermediate input: 0, rsm: Alias_1, input: [1, 8] + + + +_1_5->_1_6 + + + + + +_1_7 + +15     Range , input: [1, 0], rsm: [Alias_0, Alias_1] + + + +_1_6->_1_7 + + + + + +_1_8 + +16     Range , input: [0, 8], rsm: [Alias_1, Alias_2] + + + +_1_6->_1_8 + + + + + +_1_9 + +17     Nonterminal PointsTo, input: [1, 0] + + + +_1_7->_1_9 + + + + + +_1_10 + +18     Nonterminal FlowsTo, input: [0, 8] + + + +_1_8->_1_10 + + + + + +_1_11 + +19     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_1_9->_1_11 + + + + + +_1_13 + +20     Range , input: [0, 8], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_10->_1_13 + + + + + +_1_14 + +21     Terminal 'alloc', input: [1, 0] + + + +_1_11->_1_14 + + + + + +_1_23 + +3     Range , input: [1, 10], rsm: [S_0, S_0] + + + +_1_12->_1_23 + + + + + +_1_34 + +4     Range , input: [10, 12], rsm: [S_0, S_2] + + + +_1_12->_1_34 + + + + + +_1_15 +22     Intermediate input: 6, rsm: FlowsTo_1, input: [0, 8] + + + +_1_13->_1_15 + + + + + +_1_16 + +23     Range , input: [0, 6], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_15->_1_16 + + + + + +_1_17 + +24     Range , input: [6, 8], rsm: [FlowsTo_1, FlowsTo_1] + + + +_1_15->_1_17 + + + + + +_1_18 +25     Intermediate input: 4, rsm: FlowsTo_9, input: [0, 6] + + + +_1_16->_1_18 + + + + + +_1_19 + +26     Terminal 'assign_r', input: [6, 8] + + + +_1_17->_1_19 + + + + + +_1_20 + +27     Range , input: [0, 4], rsm: [FlowsTo_0, FlowsTo_9] + + + +_1_18->_1_20 + + + + + +_1_21 + +28     Range , input: [4, 6], rsm: [FlowsTo_9, FlowsTo_1] + + + +_1_18->_1_21 + + + + + +_1_22 +29     Intermediate input: 4, rsm: FlowsTo_2, input: [0, 4] + + + +_1_20->_1_22 + + + + + +_1_24 + +30     Terminal 'load_0_r', input: [4, 6] + + + +_1_21->_1_24 + + + + + +_1_25 + +31     Range , input: [0, 4], rsm: [FlowsTo_0, FlowsTo_2] + + + +_1_22->_1_25 + + + + + +_1_26 + +32     Range , input: [4, 4], rsm: [FlowsTo_2, FlowsTo_9] + + + +_1_22->_1_26 + + + + + +_1_44 +5     Intermediate input: 8, rsm: S_1, input: [1, 10] + + + +_1_23->_1_44 + + + + + +_1_27 +33     Intermediate input: 1, rsm: FlowsTo_1, input: [0, 4] + + + +_1_25->_1_27 + + + + + +_1_28 + +34     Nonterminal Alias, input: [4, 4] + + + +_1_26->_1_28 + + + + + +_1_29 + +35     Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_27->_1_29 + + + + + +_1_30 + +36     Range , input: [1, 4], rsm: [FlowsTo_1, FlowsTo_2] + + + +_1_27->_1_30 + + + + + +_1_31 + +37     Range , input: [4, 4], rsm: [Alias_0, Alias_2] + + + +_1_28->_1_31 + + + + + +_1_32 + +38     Terminal 'alloc_r', input: [0, 1] + + + +_1_29->_1_32 + + + + + +_1_33 + +39     Terminal 'store_0_r', input: [1, 4] + + + +_1_30->_1_33 + + + + + +_1_35 +40     Intermediate input: 2, rsm: Alias_1, input: [4, 4] + + + +_1_31->_1_35 + + + + + +_1_45 + +6     Nonterminal PointsTo, input: [10, 12] + + + +_1_34->_1_45 + + + + + +_1_36 + +41     Range , input: [4, 2], rsm: [Alias_0, Alias_1] + + + +_1_35->_1_36 + + + + + +_1_37 + +42     Range , input: [2, 4], rsm: [Alias_1, Alias_2] + + + +_1_35->_1_37 + + + + + +_1_38 + +43     Nonterminal PointsTo, input: [4, 2] + + + +_1_36->_1_38 + + + + + +_1_39 + +44     Nonterminal FlowsTo, input: [2, 4] + + + +_1_37->_1_39 + + + + + +_1_40 + +45     Range , input: [4, 2], rsm: [PointsTo_0, PointsTo_5] + + + +_1_38->_1_40 + + + + + +_1_41 + +46     Range , input: [2, 4], rsm: [FlowsTo_0, FlowsTo_1] + + + +_1_39->_1_41 + + + + + +_1_42 + +47     Terminal 'alloc', input: [4, 2] + + + +_1_40->_1_42 + + + + + +_1_43 + +48     Terminal 'alloc_r', input: [2, 4] + + + +_1_41->_1_43 + + + + + +_1_46 + +7     Range , input: [1, 8], rsm: [S_0, S_1] + + + +_1_44->_1_46 + + + + + +_1_47 + +8     Range , input: [8, 10], rsm: [S_1, S_0] + + + +_1_44->_1_47 + + + + + +_1_48 + +9     Range , input: [10, 12], rsm: [PointsTo_0, PointsTo_5] + + + +_1_45->_1_48 + + + + + +_1_46->_1_2 + + + + + +_1_47->_1_3 + + + + + +_1_48->_1_4 + + + + + +_2_0 + +0     Nonterminal S, input: [1, 13] + + + +_2_1 + +1     Range , input: [1, 13], rsm: [S_0, S_2] + + + +_2_0->_2_1 + + + + + +_2_12 +2     Intermediate input: 11, rsm: S_0, input: [1, 13] + + + +_2_1->_2_12 + + + + + +_2_2 + +10     Nonterminal Alias, input: [1, 9] + + + +_2_5 + +13     Range , input: [1, 9], rsm: [Alias_0, Alias_2] + + + +_2_2->_2_5 + + + + + +_2_3 + +11     Terminal 'store_3', input: [9, 11] + + + +_2_4 + +12     Terminal 'alloc', input: [11, 13] + + + +_2_6 +14     Intermediate input: 0, rsm: Alias_1, input: [1, 9] + + + +_2_5->_2_6 + + + + + +_2_7 + +15     Range , input: [1, 0], rsm: [Alias_0, Alias_1] + + + +_2_6->_2_7 + + + + + +_2_8 + +16     Range , input: [0, 9], rsm: [Alias_1, Alias_2] + + + +_2_6->_2_8 + + + + + +_2_9 + +17     Nonterminal PointsTo, input: [1, 0] + + + +_2_7->_2_9 + + + + + +_2_10 + +18     Nonterminal FlowsTo, input: [0, 9] + + + +_2_8->_2_10 + + + + + +_2_11 + +19     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_2_9->_2_11 + + + + + +_2_13 + +20     Range , input: [0, 9], rsm: [FlowsTo_0, FlowsTo_1] + + + +_2_10->_2_13 + + + + + +_2_14 + +21     Terminal 'alloc', input: [1, 0] + + + +_2_11->_2_14 + + + + + +_2_23 + +3     Range , input: [1, 11], rsm: [S_0, S_0] + + + +_2_12->_2_23 + + + + + +_2_34 + +4     Range , input: [11, 13], rsm: [S_0, S_2] + + + +_2_12->_2_34 + + + + + +_2_15 +22     Intermediate input: 7, rsm: FlowsTo_1, input: [0, 9] + + + +_2_13->_2_15 + + + + + +_2_16 + +23     Range , input: [0, 7], rsm: [FlowsTo_0, FlowsTo_1] + + + +_2_15->_2_16 + + + + + +_2_17 + +24     Range , input: [7, 9], rsm: [FlowsTo_1, FlowsTo_1] + + + +_2_15->_2_17 + + + + + +_2_18 +25     Intermediate input: 5, rsm: FlowsTo_8, input: [0, 7] + + + +_2_16->_2_18 + + + + + +_2_19 + +26     Terminal 'assign_r', input: [7, 9] + + + +_2_17->_2_19 + + + + + +_2_20 + +27     Range , input: [0, 5], rsm: [FlowsTo_0, FlowsTo_8] + + + +_2_18->_2_20 + + + + + +_2_21 + +28     Range , input: [5, 7], rsm: [FlowsTo_8, FlowsTo_1] + + + +_2_18->_2_21 + + + + + +_2_22 +29     Intermediate input: 5, rsm: FlowsTo_3, input: [0, 5] + + + +_2_20->_2_22 + + + + + +_2_24 + +30     Terminal 'load_1_r', input: [5, 7] + + + +_2_21->_2_24 + + + + + +_2_25 + +31     Range , input: [0, 5], rsm: [FlowsTo_0, FlowsTo_3] + + + +_2_22->_2_25 + + + + + +_2_26 + +32     Range , input: [5, 5], rsm: [FlowsTo_3, FlowsTo_8] + + + +_2_22->_2_26 + + + + + +_2_44 +5     Intermediate input: 9, rsm: S_1, input: [1, 11] + + + +_2_23->_2_44 + + + + + +_2_27 +33     Intermediate input: 1, rsm: FlowsTo_1, input: [0, 5] + + + +_2_25->_2_27 + + + + + +_2_28 + +34     Nonterminal Alias, input: [5, 5] + + + +_2_26->_2_28 + + + + + +_2_29 + +35     Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1] + + + +_2_27->_2_29 + + + + + +_2_30 + +36     Range , input: [1, 5], rsm: [FlowsTo_1, FlowsTo_3] + + + +_2_27->_2_30 + + + + + +_2_31 + +37     Range , input: [5, 5], rsm: [Alias_0, Alias_2] + + + +_2_28->_2_31 + + + + + +_2_32 + +38     Terminal 'alloc_r', input: [0, 1] + + + +_2_29->_2_32 + + + + + +_2_33 + +39     Terminal 'store_1_r', input: [1, 5] + + + +_2_30->_2_33 + + + + + +_2_35 +40     Intermediate input: 3, rsm: Alias_1, input: [5, 5] + + + +_2_31->_2_35 + + + + + +_2_45 + +6     Nonterminal PointsTo, input: [11, 13] + + + +_2_34->_2_45 + + + + + +_2_36 + +41     Range , input: [5, 3], rsm: [Alias_0, Alias_1] + + + +_2_35->_2_36 + + + + + +_2_37 + +42     Range , input: [3, 5], rsm: [Alias_1, Alias_2] + + + +_2_35->_2_37 + + + + + +_2_38 + +43     Nonterminal PointsTo, input: [5, 3] + + + +_2_36->_2_38 + + + + + +_2_39 + +44     Nonterminal FlowsTo, input: [3, 5] + + + +_2_37->_2_39 + + + + + +_2_40 + +45     Range , input: [5, 3], rsm: [PointsTo_0, PointsTo_5] + + + +_2_38->_2_40 + + + + + +_2_41 + +46     Range , input: [3, 5], rsm: [FlowsTo_0, FlowsTo_1] + + + +_2_39->_2_41 + + + + + +_2_42 + +47     Terminal 'alloc', input: [5, 3] + + + +_2_40->_2_42 + + + + + +_2_43 + +48     Terminal 'alloc_r', input: [3, 5] + + + +_2_41->_2_43 + + + + + +_2_46 + +7     Range , input: [1, 9], rsm: [S_0, S_1] + + + +_2_44->_2_46 + + + + + +_2_47 + +8     Range , input: [9, 11], rsm: [S_1, S_0] + + + +_2_44->_2_47 + + + + + +_2_48 + +9     Range , input: [11, 13], rsm: [PointsTo_0, PointsTo_5] + + + +_2_45->_2_48 + + + + + +_2_46->_2_2 + + + + + +_2_47->_2_3 + + + + + +_2_48->_2_4 + + + + + +_3_0 + +0     Nonterminal S, input: [8, 0] + + + +_3_1 + +1     Range , input: [8, 0], rsm: [S_0, S_2] + + + +_3_0->_3_1 + + + + + +_3_12 + +2     Nonterminal PointsTo, input: [8, 0] + + + +_3_1->_3_12 + + + + + +_3_2 + +10     Range , input: [4, 1], rsm: [PointsTo_9, PointsTo_0] + + + +_3_4 + +12     Terminal 'store_0', input: [4, 1] + + + +_3_2->_3_4 + + + + + +_3_3 +11     Intermediate input: 4, rsm: PointsTo_1, input: [8, 4] + + + +_3_5 + +13     Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_1] + + + +_3_3->_3_5 + + + + + +_3_6 + +14     Range , input: [4, 4], rsm: [PointsTo_1, PointsTo_9] + + + +_3_3->_3_6 + + + + + +_3_7 +15     Intermediate input: 6, rsm: PointsTo_0, input: [8, 4] + + + +_3_5->_3_7 + + + + + +_3_8 + +16     Nonterminal Alias, input: [4, 4] + + + +_3_6->_3_8 + + + + + +_3_9 + +17     Range , input: [8, 6], rsm: [PointsTo_0, PointsTo_0] + + + +_3_7->_3_9 + + + + + +_3_10 + +18     Range , input: [6, 4], rsm: [PointsTo_0, PointsTo_1] + + + +_3_7->_3_10 + + + + + +_3_11 + +19     Range , input: [4, 4], rsm: [Alias_0, Alias_2] + + + +_3_8->_3_11 + + + + + +_3_13 + +20     Terminal 'assign', input: [8, 6] + + + +_3_9->_3_13 + + + + + +_3_14 + +21     Terminal 'load_0', input: [6, 4] + + + +_3_10->_3_14 + + + + + +_3_15 +22     Intermediate input: 2, rsm: Alias_1, input: [4, 4] + + + +_3_11->_3_15 + + + + + +_3_23 + +3     Range , input: [8, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_3_12->_3_23 + + + + + +_3_16 + +23     Range , input: [4, 2], rsm: [Alias_0, Alias_1] + + + +_3_15->_3_16 + + + + + +_3_17 + +24     Range , input: [2, 4], rsm: [Alias_1, Alias_2] + + + +_3_15->_3_17 + + + + + +_3_18 + +25     Nonterminal PointsTo, input: [4, 2] + + + +_3_16->_3_18 + + + + + +_3_19 + +26     Nonterminal FlowsTo, input: [2, 4] + + + +_3_17->_3_19 + + + + + +_3_20 + +27     Range , input: [4, 2], rsm: [PointsTo_0, PointsTo_5] + + + +_3_18->_3_20 + + + + + +_3_21 + +28     Range , input: [2, 4], rsm: [FlowsTo_0, FlowsTo_1] + + + +_3_19->_3_21 + + + + + +_3_22 + +29     Terminal 'alloc', input: [4, 2] + + + +_3_20->_3_22 + + + + + +_3_24 + +30     Terminal 'alloc_r', input: [2, 4] + + + +_3_21->_3_24 + + + + + +_3_25 +4     Intermediate input: 1, rsm: PointsTo_0, input: [8, 0] + + + +_3_23->_3_25 + + + + + +_3_26 + +5     Range , input: [8, 1], rsm: [PointsTo_0, PointsTo_0] + + + +_3_25->_3_26 + + + + + +_3_27 + +6     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_3_25->_3_27 + + + + + +_3_28 +7     Intermediate input: 4, rsm: PointsTo_9, input: [8, 1] + + + +_3_26->_3_28 + + + + + +_3_29 + +8     Terminal 'alloc', input: [1, 0] + + + +_3_27->_3_29 + + + + + +_3_28->_3_2 + + + + + +_3_30 + +9     Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_9] + + + +_3_28->_3_30 + + + + + +_3_30->_3_3 + + + + + +_4_0 + +0     Nonterminal S, input: [8, 12] + + + +_4_1 + +1     Range , input: [8, 12], rsm: [S_0, S_2] + + + +_4_0->_4_1 + + + + + +_4_12 +2     Intermediate input: 10, rsm: S_0, input: [8, 12] + + + +_4_1->_4_12 + + + + + +_4_2 + +10     Range , input: [10, 12], rsm: [PointsTo_0, PointsTo_5] + + + +_4_4 + +12     Terminal 'alloc', input: [10, 12] + + + +_4_2->_4_4 + + + + + +_4_3 + +11     Nonterminal Alias, input: [8, 8] + + + +_4_5 + +13     Range , input: [8, 8], rsm: [Alias_0, Alias_2] + + + +_4_3->_4_5 + + + + + +_4_6 +14     Intermediate input: 0, rsm: Alias_1, input: [8, 8] + + + +_4_5->_4_6 + + + + + +_4_7 + +15     Range , input: [8, 0], rsm: [Alias_0, Alias_1] + + + +_4_6->_4_7 + + + + + +_4_8 + +16     Range , input: [0, 8], rsm: [Alias_1, Alias_2] + + + +_4_6->_4_8 + + + + + +_4_9 + +17     Nonterminal PointsTo, input: [8, 0] + + + +_4_7->_4_9 + + + + + +_4_10 + +18     Nonterminal FlowsTo, input: [0, 8] + + + +_4_8->_4_10 + + + + + +_4_11 + +19     Range , input: [8, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_4_9->_4_11 + + + + + +_4_13 + +20     Range , input: [0, 8], rsm: [FlowsTo_0, FlowsTo_1] + + + +_4_10->_4_13 + + + + + +_4_14 +21     Intermediate input: 1, rsm: PointsTo_0, input: [8, 0] + + + +_4_11->_4_14 + + + + + +_4_23 + +3     Range , input: [8, 10], rsm: [S_0, S_0] + + + +_4_12->_4_23 + + + + + +_4_34 + +4     Range , input: [10, 12], rsm: [S_0, S_2] + + + +_4_12->_4_34 + + + + + +_4_15 +22     Intermediate input: 6, rsm: FlowsTo_1, input: [0, 8] + + + +_4_13->_4_15 + + + + + +_4_16 + +23     Range , input: [8, 1], rsm: [PointsTo_0, PointsTo_0] + + + +_4_14->_4_16 + + + + + +_4_17 + +24     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_4_14->_4_17 + + + + + +_4_18 + +25     Range , input: [0, 6], rsm: [FlowsTo_0, FlowsTo_1] + + + +_4_15->_4_18 + + + + + +_4_19 + +26     Range , input: [6, 8], rsm: [FlowsTo_1, FlowsTo_1] + + + +_4_15->_4_19 + + + + + +_4_20 +27     Intermediate input: 4, rsm: PointsTo_9, input: [8, 1] + + + +_4_16->_4_20 + + + + + +_4_21 + +28     Terminal 'alloc', input: [1, 0] + + + +_4_17->_4_21 + + + + + +_4_22 +29     Intermediate input: 4, rsm: FlowsTo_9, input: [0, 6] + + + +_4_18->_4_22 + + + + + +_4_24 + +30     Terminal 'assign_r', input: [6, 8] + + + +_4_19->_4_24 + + + + + +_4_25 + +31     Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_9] + + + +_4_20->_4_25 + + + + + +_4_26 + +32     Range , input: [4, 1], rsm: [PointsTo_9, PointsTo_0] + + + +_4_20->_4_26 + + + + + +_4_27 + +33     Range , input: [0, 4], rsm: [FlowsTo_0, FlowsTo_9] + + + +_4_22->_4_27 + + + + + +_4_28 + +34     Range , input: [4, 6], rsm: [FlowsTo_9, FlowsTo_1] + + + +_4_22->_4_28 + + + + + +_4_45 + +5     Terminal 'store_2', input: [8, 10] + + + +_4_23->_4_45 + + + + + +_4_56 +6     Intermediate input: 8, rsm: S_1, input: [8, 10] + + + +_4_23->_4_56 + + + + + +_4_29 +35     Intermediate input: 4, rsm: PointsTo_1, input: [8, 4] + + + +_4_25->_4_29 + + + + + +_4_30 + +36     Terminal 'store_0', input: [4, 1] + + + +_4_26->_4_30 + + + + + +_4_31 +37     Intermediate input: 4, rsm: FlowsTo_2, input: [0, 4] + + + +_4_27->_4_31 + + + + + +_4_32 + +38     Terminal 'load_0_r', input: [4, 6] + + + +_4_28->_4_32 + + + + + +_4_33 + +39     Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_1] + + + +_4_29->_4_33 + + + + + +_4_35 + +40     Range , input: [4, 4], rsm: [PointsTo_1, PointsTo_9] + + + +_4_29->_4_35 + + + + + +_4_36 + +41     Range , input: [0, 4], rsm: [FlowsTo_0, FlowsTo_2] + + + +_4_31->_4_36 + + + + + +_4_37 + +42     Range , input: [4, 4], rsm: [FlowsTo_2, FlowsTo_9] + + + +_4_31->_4_37 + + + + + +_4_38 +43     Intermediate input: 6, rsm: PointsTo_0, input: [8, 4] + + + +_4_33->_4_38 + + + + + +_4_62 + +7     Nonterminal PointsTo, input: [10, 12] + + + +_4_34->_4_62 + + + + + +_4_39 + +44     Nonterminal Alias, input: [4, 4] + + + +_4_35->_4_39 + + + + + +_4_40 +45     Intermediate input: 1, rsm: FlowsTo_1, input: [0, 4] + + + +_4_36->_4_40 + + + + + +_4_41 + +46     Nonterminal Alias, input: [4, 4] + + + +_4_37->_4_41 + + + + + +_4_42 + +47     Range , input: [8, 6], rsm: [PointsTo_0, PointsTo_0] + + + +_4_38->_4_42 + + + + + +_4_43 + +48     Range , input: [6, 4], rsm: [PointsTo_0, PointsTo_1] + + + +_4_38->_4_43 + + + + + +_4_44 + +49     Range , input: [4, 4], rsm: [Alias_0, Alias_2] + + + +_4_39->_4_44 + + + + + +_4_46 + +50     Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1] + + + +_4_40->_4_46 + + + + + +_4_47 + +51     Range , input: [1, 4], rsm: [FlowsTo_1, FlowsTo_2] + + + +_4_40->_4_47 + + + + + +_4_41->_4_44 + + + + + +_4_48 + +52     Terminal 'assign', input: [8, 6] + + + +_4_42->_4_48 + + + + + +_4_49 + +53     Terminal 'load_0', input: [6, 4] + + + +_4_43->_4_49 + + + + + +_4_50 +54     Intermediate input: 2, rsm: Alias_1, input: [4, 4] + + + +_4_44->_4_50 + + + + + +_4_51 + +55     Terminal 'alloc_r', input: [0, 1] + + + +_4_46->_4_51 + + + + + +_4_52 + +56     Terminal 'store_0_r', input: [1, 4] + + + +_4_47->_4_52 + + + + + +_4_53 + +57     Range , input: [4, 2], rsm: [Alias_0, Alias_1] + + + +_4_50->_4_53 + + + + + +_4_54 + +58     Range , input: [2, 4], rsm: [Alias_1, Alias_2] + + + +_4_50->_4_54 + + + + + +_4_55 + +59     Nonterminal PointsTo, input: [4, 2] + + + +_4_53->_4_55 + + + + + +_4_57 + +60     Nonterminal FlowsTo, input: [2, 4] + + + +_4_54->_4_57 + + + + + +_4_58 + +61     Range , input: [4, 2], rsm: [PointsTo_0, PointsTo_5] + + + +_4_55->_4_58 + + + + + +_4_63 + +8     Range , input: [8, 8], rsm: [S_0, S_1] + + + +_4_56->_4_63 + + + + + +_4_64 + +9     Range , input: [8, 10], rsm: [S_1, S_0] + + + +_4_56->_4_64 + + + + + +_4_59 + +62     Range , input: [2, 4], rsm: [FlowsTo_0, FlowsTo_1] + + + +_4_57->_4_59 + + + + + +_4_60 + +63     Terminal 'alloc', input: [4, 2] + + + +_4_58->_4_60 + + + + + +_4_61 + +64     Terminal 'alloc_r', input: [2, 4] + + + +_4_59->_4_61 + + + + + +_4_62->_4_2 + + + + + +_4_63->_4_3 + + + + + +_4_64->_4_45 + + + + + +_5_0 + +0     Nonterminal S, input: [8, 13] + + + +_5_1 + +1     Range , input: [8, 13], rsm: [S_0, S_2] + + + +_5_0->_5_1 + + + + + +_5_12 +2     Intermediate input: 11, rsm: S_0, input: [8, 13] + + + +_5_1->_5_12 + + + + + +_5_2 + +10     Nonterminal Alias, input: [8, 9] + + + +_5_5 + +13     Range , input: [8, 9], rsm: [Alias_0, Alias_2] + + + +_5_2->_5_5 + + + + + +_5_3 + +11     Terminal 'store_3', input: [9, 11] + + + +_5_4 + +12     Terminal 'alloc', input: [11, 13] + + + +_5_6 +14     Intermediate input: 0, rsm: Alias_1, input: [8, 9] + + + +_5_5->_5_6 + + + + + +_5_7 + +15     Range , input: [8, 0], rsm: [Alias_0, Alias_1] + + + +_5_6->_5_7 + + + + + +_5_8 + +16     Range , input: [0, 9], rsm: [Alias_1, Alias_2] + + + +_5_6->_5_8 + + + + + +_5_9 + +17     Nonterminal PointsTo, input: [8, 0] + + + +_5_7->_5_9 + + + + + +_5_10 + +18     Nonterminal FlowsTo, input: [0, 9] + + + +_5_8->_5_10 + + + + + +_5_11 + +19     Range , input: [8, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_5_9->_5_11 + + + + + +_5_13 + +20     Range , input: [0, 9], rsm: [FlowsTo_0, FlowsTo_1] + + + +_5_10->_5_13 + + + + + +_5_14 +21     Intermediate input: 1, rsm: PointsTo_0, input: [8, 0] + + + +_5_11->_5_14 + + + + + +_5_23 + +3     Range , input: [8, 11], rsm: [S_0, S_0] + + + +_5_12->_5_23 + + + + + +_5_34 + +4     Range , input: [11, 13], rsm: [S_0, S_2] + + + +_5_12->_5_34 + + + + + +_5_15 +22     Intermediate input: 7, rsm: FlowsTo_1, input: [0, 9] + + + +_5_13->_5_15 + + + + + +_5_16 + +23     Range , input: [8, 1], rsm: [PointsTo_0, PointsTo_0] + + + +_5_14->_5_16 + + + + + +_5_17 + +24     Range , input: [1, 0], rsm: [PointsTo_0, PointsTo_5] + + + +_5_14->_5_17 + + + + + +_5_18 + +25     Range , input: [0, 7], rsm: [FlowsTo_0, FlowsTo_1] + + + +_5_15->_5_18 + + + + + +_5_19 + +26     Range , input: [7, 9], rsm: [FlowsTo_1, FlowsTo_1] + + + +_5_15->_5_19 + + + + + +_5_20 +27     Intermediate input: 4, rsm: PointsTo_9, input: [8, 1] + + + +_5_16->_5_20 + + + + + +_5_21 + +28     Terminal 'alloc', input: [1, 0] + + + +_5_17->_5_21 + + + + + +_5_22 +29     Intermediate input: 5, rsm: FlowsTo_8, input: [0, 7] + + + +_5_18->_5_22 + + + + + +_5_24 + +30     Terminal 'assign_r', input: [7, 9] + + + +_5_19->_5_24 + + + + + +_5_25 + +31     Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_9] + + + +_5_20->_5_25 + + + + + +_5_26 + +32     Range , input: [4, 1], rsm: [PointsTo_9, PointsTo_0] + + + +_5_20->_5_26 + + + + + +_5_27 + +33     Range , input: [0, 5], rsm: [FlowsTo_0, FlowsTo_8] + + + +_5_22->_5_27 + + + + + +_5_28 + +34     Range , input: [5, 7], rsm: [FlowsTo_8, FlowsTo_1] + + + +_5_22->_5_28 + + + + + +_5_45 +5     Intermediate input: 9, rsm: S_1, input: [8, 11] + + + +_5_23->_5_45 + + + + + +_5_29 +35     Intermediate input: 4, rsm: PointsTo_1, input: [8, 4] + + + +_5_25->_5_29 + + + + + +_5_30 + +36     Terminal 'store_0', input: [4, 1] + + + +_5_26->_5_30 + + + + + +_5_31 +37     Intermediate input: 5, rsm: FlowsTo_3, input: [0, 5] + + + +_5_27->_5_31 + + + + + +_5_32 + +38     Terminal 'load_1_r', input: [5, 7] + + + +_5_28->_5_32 + + + + + +_5_33 + +39     Range , input: [8, 4], rsm: [PointsTo_0, PointsTo_1] + + + +_5_29->_5_33 + + + + + +_5_35 + +40     Range , input: [4, 4], rsm: [PointsTo_1, PointsTo_9] + + + +_5_29->_5_35 + + + + + +_5_36 + +41     Range , input: [0, 5], rsm: [FlowsTo_0, FlowsTo_3] + + + +_5_31->_5_36 + + + + + +_5_37 + +42     Range , input: [5, 5], rsm: [FlowsTo_3, FlowsTo_8] + + + +_5_31->_5_37 + + + + + +_5_38 +43     Intermediate input: 6, rsm: PointsTo_0, input: [8, 4] + + + +_5_33->_5_38 + + + + + +_5_56 + +6     Nonterminal PointsTo, input: [11, 13] + + + +_5_34->_5_56 + + + + + +_5_39 + +44     Nonterminal Alias, input: [4, 4] + + + +_5_35->_5_39 + + + + + +_5_40 +45     Intermediate input: 1, rsm: FlowsTo_1, input: [0, 5] + + + +_5_36->_5_40 + + + + + +_5_41 + +46     Nonterminal Alias, input: [5, 5] + + + +_5_37->_5_41 + + + + + +_5_42 + +47     Range , input: [8, 6], rsm: [PointsTo_0, PointsTo_0] + + + +_5_38->_5_42 + + + + + +_5_43 + +48     Range , input: [6, 4], rsm: [PointsTo_0, PointsTo_1] + + + +_5_38->_5_43 + + + + + +_5_44 + +49     Range , input: [4, 4], rsm: [Alias_0, Alias_2] + + + +_5_39->_5_44 + + + + + +_5_46 + +50     Range , input: [0, 1], rsm: [FlowsTo_0, FlowsTo_1] + + + +_5_40->_5_46 + + + + + +_5_47 + +51     Range , input: [1, 5], rsm: [FlowsTo_1, FlowsTo_3] + + + +_5_40->_5_47 + + + + + +_5_48 + +52     Range , input: [5, 5], rsm: [Alias_0, Alias_2] + + + +_5_41->_5_48 + + + + + +_5_49 + +53     Terminal 'assign', input: [8, 6] + + + +_5_42->_5_49 + + + + + +_5_50 + +54     Terminal 'load_0', input: [6, 4] + + + +_5_43->_5_50 + + + + + +_5_51 +55     Intermediate input: 2, rsm: Alias_1, input: [4, 4] + + + +_5_44->_5_51 + + + + + +_5_67 + +7     Range , input: [8, 9], rsm: [S_0, S_1] + + + +_5_45->_5_67 + + + + + +_5_73 + +8     Range , input: [9, 11], rsm: [S_1, S_0] + + + +_5_45->_5_73 + + + + + +_5_52 + +56     Terminal 'alloc_r', input: [0, 1] + + + +_5_46->_5_52 + + + + + +_5_53 + +57     Terminal 'store_1_r', input: [1, 5] + + + +_5_47->_5_53 + + + + + +_5_54 +58     Intermediate input: 3, rsm: Alias_1, input: [5, 5] + + + +_5_48->_5_54 + + + + + +_5_55 + +59     Range , input: [4, 2], rsm: [Alias_0, Alias_1] + + + +_5_51->_5_55 + + + + + +_5_57 + +60     Range , input: [2, 4], rsm: [Alias_1, Alias_2] + + + +_5_51->_5_57 + + + + + +_5_58 + +61     Range , input: [5, 3], rsm: [Alias_0, Alias_1] + + + +_5_54->_5_58 + + + + + +_5_59 + +62     Range , input: [3, 5], rsm: [Alias_1, Alias_2] + + + +_5_54->_5_59 + + + + + +_5_60 + +63     Nonterminal PointsTo, input: [4, 2] + + + +_5_55->_5_60 + + + + + +_5_74 + +9     Range , input: [11, 13], rsm: [PointsTo_0, PointsTo_5] + + + +_5_56->_5_74 + + + + + +_5_61 + +64     Nonterminal FlowsTo, input: [2, 4] + + + +_5_57->_5_61 + + + + + +_5_62 + +65     Nonterminal PointsTo, input: [5, 3] + + + +_5_58->_5_62 + + + + + +_5_63 + +66     Nonterminal FlowsTo, input: [3, 5] + + + +_5_59->_5_63 + + + + + +_5_64 + +67     Range , input: [4, 2], rsm: [PointsTo_0, PointsTo_5] + + + +_5_60->_5_64 + + + + + +_5_65 + +68     Range , input: [2, 4], rsm: [FlowsTo_0, FlowsTo_1] + + + +_5_61->_5_65 + + + + + +_5_66 + +69     Range , input: [5, 3], rsm: [PointsTo_0, PointsTo_5] + + + +_5_62->_5_66 + + + + + +_5_68 + +70     Range , input: [3, 5], rsm: [FlowsTo_0, FlowsTo_1] + + + +_5_63->_5_68 + + + + + +_5_69 + +71     Terminal 'alloc', input: [4, 2] + + + +_5_64->_5_69 + + + + + +_5_70 + +72     Terminal 'alloc_r', input: [2, 4] + + + +_5_65->_5_70 + + + + + +_5_71 + +73     Terminal 'alloc', input: [5, 3] + + + +_5_66->_5_71 + + + + + +_5_67->_5_2 + + + + + +_5_72 + +74     Terminal 'alloc_r', input: [3, 5] + + + +_5_68->_5_72 + + + + + +_5_73->_5_3 + + + + + +_5_74->_5_4 + + + + + diff --git a/docs/docs/figures/rsm.dot b/docs/docs/figures/rsm.dot new file mode 100644 index 000000000..f1ae35e3b --- /dev/null +++ b/docs/docs/figures/rsm.dot @@ -0,0 +1,106 @@ +digraph g { +S_2 [label = "S_2", shape = doublecircle, color = red] +PointsTo_4 [label = "PointsTo_4", shape = circle, color = black] +PointsTo_3 [label = "PointsTo_3", shape = circle, color = black] +PointsTo_2 [label = "PointsTo_2", shape = circle, color = black] +PointsTo_1 [label = "PointsTo_1", shape = circle, color = black] +FlowsTo_9 [label = "FlowsTo_9", shape = circle, color = black] +FlowsTo_8 [label = "FlowsTo_8", shape = circle, color = black] +S_1 [label = "S_1", shape = circle, color = black] +FlowsTo_5 [label = "FlowsTo_5", shape = circle, color = black] +FlowsTo_4 [label = "FlowsTo_4", shape = circle, color = black] +PointsTo_5 [label = "PointsTo_5", shape = doublecircle, color = red] +FlowsTo_1 [label = "FlowsTo_1", shape = doublecircle, color = red] +FlowsTo_7 [label = "FlowsTo_7", shape = circle, color = black] +FlowsTo_6 [label = "FlowsTo_6", shape = circle, color = black] +PointsTo_9 [label = "PointsTo_9", shape = circle, color = black] +PointsTo_8 [label = "PointsTo_8", shape = circle, color = black] +PointsTo_7 [label = "PointsTo_7", shape = circle, color = black] +FlowsTo_3 [label = "FlowsTo_3", shape = circle, color = black] +S_0 [label = "S_0", shape = circle, color = green] +PointsTo_6 [label = "PointsTo_6", shape = circle, color = black] +FlowsTo_2 [label = "FlowsTo_2", shape = circle, color = black] +Alias_2 [label = "Alias_2", shape = doublecircle, color = red] +FlowsTo_0 [label = "FlowsTo_0", shape = circle, color = green] +Alias_1 [label = "Alias_1", shape = circle, color = black] +PointsTo_0 [label = "PointsTo_0", shape = circle, color = green] +Alias_0 [label = "Alias_0", shape = circle, color = green] +PointsTo_4 -> PointsTo_6 [label = "Alias"] +PointsTo_3 -> PointsTo_7 [label = "Alias"] +PointsTo_2 -> PointsTo_8 [label = "Alias"] +PointsTo_1 -> PointsTo_9 [label = "Alias"] +FlowsTo_9 -> FlowsTo_1 [label = "load_0_r"] +FlowsTo_8 -> FlowsTo_1 [label = "load_1_r"] +S_1 -> S_0 [label = "store_0"] +S_1 -> S_0 [label = "store_1"] +S_1 -> S_0 [label = "store_2"] +S_1 -> S_0 [label = "store_3"] +FlowsTo_5 -> FlowsTo_6 [label = "Alias"] +FlowsTo_4 -> FlowsTo_7 [label = "Alias"] +FlowsTo_1 -> FlowsTo_1 [label = "assign_r"] +FlowsTo_1 -> FlowsTo_2 [label = "store_0_r"] +FlowsTo_1 -> FlowsTo_3 [label = "store_1_r"] +FlowsTo_1 -> FlowsTo_4 [label = "store_2_r"] +FlowsTo_1 -> FlowsTo_5 [label = "store_3_r"] +FlowsTo_7 -> FlowsTo_1 [label = "load_2_r"] +FlowsTo_6 -> FlowsTo_1 [label = "load_3_r"] +PointsTo_9 -> PointsTo_0 [label = "store_0"] +PointsTo_8 -> PointsTo_0 [label = "store_1"] +PointsTo_7 -> PointsTo_0 [label = "store_2"] +FlowsTo_3 -> FlowsTo_8 [label = "Alias"] +S_0 -> S_0 [label = "store_0"] +S_0 -> S_0 [label = "store_1"] +S_0 -> S_0 [label = "store_2"] +S_0 -> S_0 [label = "store_3"] +S_0 -> S_1 [label = "Alias"] +S_0 -> S_2 [label = "PointsTo"] +PointsTo_6 -> PointsTo_0 [label = "store_3"] +FlowsTo_2 -> FlowsTo_9 [label = "Alias"] +FlowsTo_0 -> FlowsTo_1 [label = "alloc_r"] +Alias_1 -> Alias_2 [label = "FlowsTo"] +PointsTo_0 -> PointsTo_0 [label = "assign"] +PointsTo_0 -> PointsTo_1 [label = "load_0"] +PointsTo_0 -> PointsTo_2 [label = "load_1"] +PointsTo_0 -> PointsTo_3 [label = "load_2"] +PointsTo_0 -> PointsTo_4 [label = "load_3"] +PointsTo_0 -> PointsTo_5 [label = "alloc"] +Alias_0 -> Alias_1 [label = "PointsTo"] +subgraph cluster_S { +S_1 +S_2 +S_0 +label = "S" +} +subgraph cluster_FlowsTo { +FlowsTo_9 +FlowsTo_8 +FlowsTo_0 +FlowsTo_5 +FlowsTo_4 +FlowsTo_1 +FlowsTo_7 +FlowsTo_6 +FlowsTo_3 +FlowsTo_2 +label = "FlowsTo" +} +subgraph cluster_Alias { +Alias_2 +Alias_0 +Alias_1 +label = "Alias" +} +subgraph cluster_PointsTo { +PointsTo_4 +PointsTo_3 +PointsTo_2 +PointsTo_1 +PointsTo_5 +PointsTo_0 +PointsTo_9 +PointsTo_8 +PointsTo_7 +PointsTo_6 +label = "PointsTo" +} +} diff --git a/docs/docs/figures/rsm.dot.svg b/docs/docs/figures/rsm.dot.svg new file mode 100644 index 000000000..096eee3a8 --- /dev/null +++ b/docs/docs/figures/rsm.dot.svg @@ -0,0 +1,473 @@ + + + + + + +g + + +cluster_S + +S + + +cluster_FlowsTo + +FlowsTo + + +cluster_Alias + +Alias + + +cluster_PointsTo + +PointsTo + + + +S_2 + + +S_2 + + + +PointsTo_4 + +PointsTo_4 + + + +PointsTo_6 + +PointsTo_6 + + + +PointsTo_4->PointsTo_6 + + +Alias + + + +PointsTo_3 + +PointsTo_3 + + + +PointsTo_7 + +PointsTo_7 + + + +PointsTo_3->PointsTo_7 + + +Alias + + + +PointsTo_2 + +PointsTo_2 + + + +PointsTo_8 + +PointsTo_8 + + + +PointsTo_2->PointsTo_8 + + +Alias + + + +PointsTo_1 + +PointsTo_1 + + + +PointsTo_9 + +PointsTo_9 + + + +PointsTo_1->PointsTo_9 + + +Alias + + + +FlowsTo_9 + +FlowsTo_9 + + + +FlowsTo_1 + + +FlowsTo_1 + + + +FlowsTo_9->FlowsTo_1 + + +load_0_r + + + +FlowsTo_8 + +FlowsTo_8 + + + +FlowsTo_8->FlowsTo_1 + + +load_1_r + + + +S_1 + +S_1 + + + +S_0 + +S_0 + + + +S_1->S_0 + + +store_0 + + + +S_1->S_0 + + +store_1 + + + +S_1->S_0 + + +store_2 + + + +S_1->S_0 + + +store_3 + + + +FlowsTo_5 + +FlowsTo_5 + + + +FlowsTo_6 + +FlowsTo_6 + + + +FlowsTo_5->FlowsTo_6 + + +Alias + + + +FlowsTo_4 + +FlowsTo_4 + + + +FlowsTo_7 + +FlowsTo_7 + + + +FlowsTo_4->FlowsTo_7 + + +Alias + + + +PointsTo_5 + + +PointsTo_5 + + + +FlowsTo_1->FlowsTo_5 + + +store_3_r + + + +FlowsTo_1->FlowsTo_4 + + +store_2_r + + + +FlowsTo_1->FlowsTo_1 + + +assign_r + + + +FlowsTo_3 + +FlowsTo_3 + + + +FlowsTo_1->FlowsTo_3 + + +store_1_r + + + +FlowsTo_2 + +FlowsTo_2 + + + +FlowsTo_1->FlowsTo_2 + + +store_0_r + + + +FlowsTo_7->FlowsTo_1 + + +load_2_r + + + +FlowsTo_6->FlowsTo_1 + + +load_3_r + + + +PointsTo_0 + +PointsTo_0 + + + +PointsTo_9->PointsTo_0 + + +store_0 + + + +PointsTo_8->PointsTo_0 + + +store_1 + + + +PointsTo_7->PointsTo_0 + + +store_2 + + + +FlowsTo_3->FlowsTo_8 + + +Alias + + + +S_0->S_2 + + +PointsTo + + + +S_0->S_1 + + +Alias + + + +S_0->S_0 + + +store_0 + + + +S_0->S_0 + + +store_1 + + + +S_0->S_0 + + +store_2 + + + +S_0->S_0 + + +store_3 + + + +PointsTo_6->PointsTo_0 + + +store_3 + + + +FlowsTo_2->FlowsTo_9 + + +Alias + + + +Alias_2 + + +Alias_2 + + + +FlowsTo_0 + +FlowsTo_0 + + + +FlowsTo_0->FlowsTo_1 + + +alloc_r + + + +Alias_1 + +Alias_1 + + + +Alias_1->Alias_2 + + +FlowsTo + + + +PointsTo_0->PointsTo_4 + + +load_3 + + + +PointsTo_0->PointsTo_3 + + +load_2 + + + +PointsTo_0->PointsTo_2 + + +load_1 + + + +PointsTo_0->PointsTo_1 + + +load_0 + + + +PointsTo_0->PointsTo_5 + + +alloc + + + +PointsTo_0->PointsTo_0 + + +assign + + + +Alias_0 + +Alias_0 + + + +Alias_0->Alias_1 + + +PointsTo + + + diff --git a/settings.gradle.kts b/settings.gradle.kts index a77d71c5f..0055379ac 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,4 +4,5 @@ plugins { rootProject.name = "ucfs" include("solver") include("generator") -include("test-shared") \ No newline at end of file +include("test-shared") +include("cfpq-paths-app")