summaryrefslogtreecommitdiff
path: root/chapter05
diff options
context:
space:
mode:
authordibyendumajumdar <mobile@majumdar.org.uk>2023-10-30 21:55:01 +0000
committerDibyendu Majumdar <dibyendumajumdar@users.noreply.github.com>2023-11-01 18:56:50 +0000
commit1f675fd160ef331574b998ec9691673abcfb7c70 (patch)
tree1660c30a32aef71d2e711a260e30647304aea4e6 /chapter05
parent29aea4487d70dfc08eb3afb84481c5e419aec33c (diff)
downloadSimple-1f675fd160ef331574b998ec9691673abcfb7c70.tar.gz
Simple-1f675fd160ef331574b998ec9691673abcfb7c70.zip
Update the description of Region node
Update visuals Update chapter list
Diffstat (limited to 'chapter05')
-rw-r--r--chapter05/README.md35
-rw-r--r--chapter05/docs/05-graph1.gv77
-rw-r--r--chapter05/docs/05-graph1.svg274
-rw-r--r--chapter05/docs/05-graph2.gv80
-rw-r--r--chapter05/docs/05-graph2.svg326
5 files changed, 389 insertions, 403 deletions
diff --git a/chapter05/README.md b/chapter05/README.md
index 8929dfad..32f57fea 100644
--- a/chapter05/README.md
+++ b/chapter05/README.md
@@ -55,9 +55,30 @@ through the data value from the matching input [[1]](#1).
## `Region` Nodes
-`Region` nodes were originally introduced to replace Basic Blocks in the IR
-[[3]](#3). However, we do not assign a `Region` to every node in the graph; we
-insert a `Region` node at a merge point where it takes control from each
+> Every instruction has a control input from a basic block. If the control input is an edge
+> in our abstract graph, then the basic block must be a node in the abstract graph. So we
+> define a REGION instruction to replace a basic block. A REGION instruction takes
+> control from each predecessor block as input and produces a merged control as an output [[3]](#3).
+
+However:
+
+> We can remove the control dependence for any given Node simply by replacing the
+> pointer value with the special value NULL. This operation only makes sense for Nodes
+> that represent data computations. PHI, IF, JUMP and STOP Nodes all require the control
+> input for semantic correctness. REGION Nodes require several control inputs (one per
+> CFG input to the basic block they represent). Almost all other Nodes can live without a
+> control dependence. A data computation without a control dependence does not exactly
+> reside in any particular basic block. Its correct behavior depends solely on the remaining
+> data dependences. It, and the Nodes that depend on it or on which it depends, exists in a
+> “sea” of Nodes, with little control structure.
+
+> The “sea” of Nodes is useful for optimization, but does not represent any traditional
+> intermediate representation such as a CFG. We need a way to serialize the graph and get
+> back the control dependences. We do this with a simple global code motion algorithm [[4]](#4).
+
+Thus, we do not associate a control edge on every data node in the graph.
+
+We insert a `Region` node at a merge point where it takes control from each
predecessor control edge, and produces a merged control as output. Data flows
via `Phi` nodes at these merge points.
@@ -135,6 +156,10 @@ Combining Analyses, Combining Optimizations, 132.
Click, C. (1995).
Combining Analyses, Combining Optimizations, 102-103.
-<a id="2">[3]</a>
+<a id="3">[3]</a>
Click, C. (1995).
-Combining Analyses, Combining Optimizations, 129. \ No newline at end of file
+Combining Analyses, Combining Optimizations, 129.
+
+<a id="4">[4]</a>
+Click, C. (1995).
+Combining Analyses, Combining Optimizations, 86. \ No newline at end of file
diff --git a/chapter05/docs/05-graph1.gv b/chapter05/docs/05-graph1.gv
index 99993814..6b2a5788 100644
--- a/chapter05/docs/05-graph1.gv
+++ b/chapter05/docs/05-graph1.gv
@@ -2,18 +2,19 @@ digraph chapter05 {
/*
int a = 1;
if (arg == 1)
- a = arg+2;
+ a = arg+2;
else {
- a = arg-3;
- #showGraph;
+ a = arg-3;
+ #showGraph;
}
return a;
-#showGraph;
*/
rankdir=BT;
+ ordering="in";
+ concentrate="true";
subgraph cluster_Nodes {
- Start1 [ shape=plaintext label=<
+ Start2 [ shape=plaintext label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR><TD BGCOLOR="yellow">Start</TD></TR>
<TR><TD>
@@ -23,9 +24,9 @@ return a;
</TD></TR>
</TABLE>>
];
- Con_5 [ label="#1" ];
- EQNode6 [ label="EQNode" ];
- If7 [ shape=plaintext label=<
+ Con_7 [ label="#1" ];
+ EQNode8 [ label="==" ];
+ If9 [ shape=plaintext label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR><TD BGCOLOR="yellow">If</TD></TR>
<TR><TD>
@@ -35,51 +36,51 @@ return a;
</TD></TR>
</TABLE>>
];
- Con_11 [ label="#2" ];
- Add12 [ label="Add" ];
- Con_13 [ label="#3" ];
- Sub14 [ label="Sub" ];
+ Con_13 [ label="#2" ];
+ Add14 [ label="+" ];
+ Con_15 [ label="#3" ];
+ Sub16 [ label="-" ];
}
node [shape=plaintext];
- subgraph cluster_Scope20_0 {
- Scope20_0 [label=<
+ subgraph cluster_Scope1_0 {
+ Scope1_0 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="cyan">0</TD><TD PORT="Scope20_0_$ctrl">$ctrl</TD><TD PORT="Scope20_0_arg">arg</TD></TR>
+ <TR><TD BGCOLOR="cyan">0</TD><TD PORT="Scope1_0_$ctrl">$ctrl</TD><TD PORT="Scope1_0_arg">arg</TD></TR>
</TABLE>>];
- subgraph cluster_Scope20_1 {
- Scope20_1 [label=<
+ subgraph cluster_Scope1_1 {
+ Scope1_1 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="cyan">1</TD><TD PORT="Scope20_1_a">a</TD></TR>
+ <TR><TD BGCOLOR="cyan">1</TD><TD PORT="Scope1_1_a">a</TD></TR>
</TABLE>>];
}
}
node [shape=plaintext];
- subgraph cluster_Scope21_0 {
- Scope21_0 [label=<
+ subgraph cluster_Scope12_0 {
+ Scope12_0 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="cyan">0</TD><TD PORT="Scope21_0_$ctrl">$ctrl</TD><TD PORT="Scope21_0_arg">arg</TD></TR>
+ <TR><TD BGCOLOR="cyan">0</TD><TD PORT="Scope12_0_$ctrl">$ctrl</TD><TD PORT="Scope12_0_arg">arg</TD></TR>
</TABLE>>];
- subgraph cluster_Scope21_1 {
- Scope21_1 [label=<
+ subgraph cluster_Scope12_1 {
+ Scope12_1 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="cyan">1</TD><TD PORT="Scope21_1_a">a</TD></TR>
+ <TR><TD BGCOLOR="cyan">1</TD><TD PORT="Scope12_1_a">a</TD></TR>
</TABLE>>];
}
}
- EQNode6 -> Start1:p1;
- EQNode6 -> Con_5;
- If7 -> Start1:p0 [color=red];
- If7 -> EQNode6;
- Add12 -> Start1:p1;
- Add12 -> Con_11;
- Sub14 -> Start1:p1;
- Sub14 -> Con_13;
+ EQNode8 -> Start2:p1;
+ EQNode8 -> Con_7;
+ If9 -> Start2:p0 [color=red];
+ If9 -> EQNode8;
+ Add14 -> Start2:p1;
+ Add14 -> Con_13;
+ Sub16 -> Start2:p1;
+ Sub16 -> Con_15;
edge [style=dashed color=cornflowerblue];
- Scope20_0:"Scope20_0_$ctrl" -> If7:p1;
- Scope20_0:"Scope20_0_arg" -> Start1:p1;
- Scope20_1:"Scope20_1_a" -> Sub14;
+ Scope1_0:"Scope1_0_$ctrl" -> If9:p0;
+ Scope1_0:"Scope1_0_arg" -> Start2:p1;
+ Scope1_1:"Scope1_1_a" -> Add14;
edge [style=dashed color=cornflowerblue];
- Scope21_0:"Scope21_0_$ctrl" -> If7:p0;
- Scope21_0:"Scope21_0_arg" -> Start1:p1;
- Scope21_1:"Scope21_1_a" -> Add12;
+ Scope12_0:"Scope12_0_$ctrl" -> If9:p1;
+ Scope12_0:"Scope12_0_arg" -> Start2:p1;
+ Scope12_1:"Scope12_1_a" -> Sub16;
} \ No newline at end of file
diff --git a/chapter05/docs/05-graph1.svg b/chapter05/docs/05-graph1.svg
index 488a71cb..ac1f91fc 100644
--- a/chapter05/docs/05-graph1.svg
+++ b/chapter05/docs/05-graph1.svg
@@ -4,145 +4,145 @@
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: chapter05 Pages: 1 -->
-<svg width="471pt" height="356pt"
- viewBox="0.00 0.00 471.00 356.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<svg width="432pt" height="356pt"
+ viewBox="0.00 0.00 432.00 356.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 352)">
<title>chapter05</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-352 467,-352 467,4 -4,4"/>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-352 428,-352 428,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="89,-88 89,-340 419,-340 419,-88 89,-88"/>
+<polygon fill="none" stroke="black" points="85,-88 85,-340 415,-340 415,-88 85,-88"/>
</g>
<g id="clust2" class="cluster">
-<title>cluster_Scope20_0</title>
+<title>cluster_Scope1_0</title>
<polygon fill="none" stroke="black" points="8,-8 8,-76 208,-76 208,-8 8,-8"/>
</g>
<g id="clust3" class="cluster">
-<title>cluster_Scope20_1</title>
+<title>cluster_Scope1_1</title>
<polygon fill="none" stroke="black" points="16,-16 16,-68 86,-68 86,-16 16,-16"/>
</g>
<g id="clust4" class="cluster">
-<title>cluster_Scope21_0</title>
-<polygon fill="none" stroke="black" points="255,-8 255,-76 455,-76 455,-8 255,-8"/>
+<title>cluster_Scope12_0</title>
+<polygon fill="none" stroke="black" points="216,-8 216,-76 416,-76 416,-8 216,-8"/>
</g>
<g id="clust5" class="cluster">
-<title>cluster_Scope21_1</title>
-<polygon fill="none" stroke="black" points="263,-16 263,-68 333,-68 333,-16 263,-16"/>
+<title>cluster_Scope12_1</title>
+<polygon fill="none" stroke="black" points="224,-16 224,-68 294,-68 294,-16 224,-16"/>
</g>
-<!-- Start1 -->
+<!-- Start2 -->
<g id="node1" class="node">
-<title>Start1</title>
-<polygon fill="yellow" stroke="transparent" points="178,-303 178,-328 259,-328 259,-303 178,-303"/>
-<polygon fill="none" stroke="black" points="178,-303 178,-328 259,-328 259,-303 178,-303"/>
-<text text-anchor="start" x="200" y="-311.8" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="178,-272 178,-303 259,-303 259,-272 178,-272"/>
-<polygon fill="yellow" stroke="transparent" points="183,-277 183,-298 223,-298 223,-277 183,-277"/>
-<polygon fill="none" stroke="black" points="183,-277 183,-298 223,-298 223,-277 183,-277"/>
-<text text-anchor="start" x="186" y="-283.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="223,-277 223,-298 254,-298 254,-277 223,-277"/>
-<text text-anchor="start" x="226" y="-283.8" font-family="Times,serif" font-size="14.00">arg</text>
-</g>
-<!-- Con_5 -->
+<title>Start2</title>
+<polygon fill="yellow" stroke="transparent" points="174,-303 174,-328 255,-328 255,-303 174,-303"/>
+<polygon fill="none" stroke="black" points="174,-303 174,-328 255,-328 255,-303 174,-303"/>
+<text text-anchor="start" x="196" y="-311.8" font-family="Times,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="174,-272 174,-303 255,-303 255,-272 174,-272"/>
+<polygon fill="yellow" stroke="transparent" points="179,-277 179,-298 219,-298 219,-277 179,-277"/>
+<polygon fill="none" stroke="black" points="179,-277 179,-298 219,-298 219,-277 179,-277"/>
+<text text-anchor="start" x="182" y="-283.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="219,-277 219,-298 250,-298 250,-277 219,-277"/>
+<text text-anchor="start" x="222" y="-283.8" font-family="Times,serif" font-size="14.00">arg</text>
+</g>
+<!-- Con_7 -->
<g id="node2" class="node">
-<title>Con_5</title>
-<ellipse fill="none" stroke="black" cx="312" cy="-300" rx="27" ry="18"/>
-<text text-anchor="middle" x="312" y="-296.3" font-family="Times,serif" font-size="14.00">#1</text>
+<title>Con_7</title>
+<ellipse fill="none" stroke="black" cx="308" cy="-300" rx="27" ry="18"/>
+<text text-anchor="middle" x="308" y="-296.3" font-family="Times,serif" font-size="14.00">#1</text>
</g>
-<!-- EQNode6 -->
+<!-- EQNode8 -->
<g id="node3" class="node">
-<title>EQNode6</title>
-<ellipse fill="none" stroke="black" cx="271" cy="-214" rx="49.29" ry="18"/>
-<text text-anchor="middle" x="271" y="-210.3" font-family="Times,serif" font-size="14.00">EQNode</text>
+<title>EQNode8</title>
+<ellipse fill="none" stroke="black" cx="245" cy="-214" rx="27" ry="18"/>
+<text text-anchor="middle" x="245" y="-210.3" font-family="Times,serif" font-size="14.00">==</text>
</g>
-<!-- EQNode6&#45;&gt;Start1 -->
+<!-- EQNode8&#45;&gt;Start2 -->
<g id="edge1" class="edge">
-<title>EQNode6&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="black" d="M256.87,-231.41C250.04,-240.69 242.75,-253.02 240.07,-265.99"/>
-<polygon fill="black" stroke="black" points="236.58,-265.69 239,-276 243.54,-266.43 236.58,-265.69"/>
+<title>EQNode8&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="black" d="M240.7,-231.97C238.58,-241.48 236.3,-253.83 235.4,-265.95"/>
+<polygon fill="black" stroke="black" points="231.9,-265.87 235,-276 238.89,-266.15 231.9,-265.87"/>
</g>
-<!-- EQNode6&#45;&gt;Con_5 -->
+<!-- EQNode8&#45;&gt;Con_7 -->
<g id="edge2" class="edge">
-<title>EQNode6&#45;&gt;Con_5</title>
-<path fill="none" stroke="black" d="M279.3,-232C285.1,-243.88 292.94,-259.96 299.5,-273.39"/>
-<polygon fill="black" stroke="black" points="296.46,-275.15 303.99,-282.6 302.75,-272.08 296.46,-275.15"/>
+<title>EQNode8&#45;&gt;Con_7</title>
+<path fill="none" stroke="black" d="M256.56,-230.41C266.06,-243.08 279.67,-261.23 290.51,-275.68"/>
+<polygon fill="black" stroke="black" points="287.72,-277.79 296.52,-283.69 293.32,-273.59 287.72,-277.79"/>
</g>
-<!-- If7 -->
+<!-- If9 -->
<g id="node4" class="node">
-<title>If7</title>
-<polygon fill="yellow" stroke="transparent" points="181,-131 181,-156 275,-156 275,-131 181,-131"/>
-<polygon fill="none" stroke="black" points="181,-131 181,-156 275,-156 275,-131 181,-131"/>
-<text text-anchor="start" x="222.5" y="-139.8" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="181,-100 181,-131 275,-131 275,-100 181,-100"/>
-<polygon fill="yellow" stroke="transparent" points="186,-105 186,-126 226,-126 226,-105 186,-105"/>
-<polygon fill="none" stroke="black" points="186,-105 186,-126 226,-126 226,-105 186,-105"/>
-<text text-anchor="start" x="189" y="-111.8" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="226,-105 226,-126 270,-126 270,-105 226,-105"/>
-<polygon fill="none" stroke="black" points="226,-105 226,-126 270,-126 270,-105 226,-105"/>
-<text text-anchor="start" x="229" y="-111.8" font-family="Times,serif" font-size="14.00">False</text>
-</g>
-<!-- If7&#45;&gt;Start1 -->
+<title>If9</title>
+<polygon fill="yellow" stroke="transparent" points="169,-131 169,-156 263,-156 263,-131 169,-131"/>
+<polygon fill="none" stroke="black" points="169,-131 169,-156 263,-156 263,-131 169,-131"/>
+<text text-anchor="start" x="210.5" y="-139.8" font-family="Times,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="169,-100 169,-131 263,-131 263,-100 169,-100"/>
+<polygon fill="yellow" stroke="transparent" points="174,-105 174,-126 214,-126 214,-105 174,-105"/>
+<polygon fill="none" stroke="black" points="174,-105 174,-126 214,-126 214,-105 174,-105"/>
+<text text-anchor="start" x="177" y="-111.8" font-family="Times,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="transparent" points="214,-105 214,-126 258,-126 258,-105 214,-105"/>
+<polygon fill="none" stroke="black" points="214,-105 214,-126 258,-126 258,-105 214,-105"/>
+<text text-anchor="start" x="217" y="-111.8" font-family="Times,serif" font-size="14.00">False</text>
+</g>
+<!-- If9&#45;&gt;Start2 -->
<g id="edge3" class="edge">
-<title>If7&#45;&gt;Start1:p0</title>
-<path fill="none" stroke="red" d="M219.54,-160.28C212.88,-187.44 204.51,-228.22 203.18,-265.97"/>
-<polygon fill="red" stroke="red" points="199.68,-265.94 203,-276 206.68,-266.06 199.68,-265.94"/>
+<title>If9&#45;&gt;Start2:p0</title>
+<path fill="none" stroke="red" d="M210.29,-160.14C205.78,-187.26 200.08,-228.01 199.14,-265.52"/>
+<polygon fill="red" stroke="red" points="195.63,-265.96 199,-276 202.63,-266.05 195.63,-265.96"/>
</g>
-<!-- If7&#45;&gt;EQNode6 -->
+<!-- If9&#45;&gt;EQNode8 -->
<g id="edge4" class="edge">
-<title>If7&#45;&gt;EQNode6</title>
-<path fill="none" stroke="black" d="M244.01,-160.28C248.52,-169.09 253.38,-178.58 257.71,-187.04"/>
-<polygon fill="black" stroke="black" points="254.66,-188.76 262.33,-196.07 260.89,-185.57 254.66,-188.76"/>
+<title>If9&#45;&gt;EQNode8</title>
+<path fill="none" stroke="black" d="M226.8,-160.28C229.78,-168.9 232.97,-178.17 235.85,-186.49"/>
+<polygon fill="black" stroke="black" points="232.58,-187.76 239.16,-196.07 239.2,-185.48 232.58,-187.76"/>
</g>
-<!-- Con_11 -->
+<!-- Con_13 -->
<g id="node5" class="node">
-<title>Con_11</title>
-<ellipse fill="none" stroke="black" cx="384" cy="-300" rx="27" ry="18"/>
-<text text-anchor="middle" x="384" y="-296.3" font-family="Times,serif" font-size="14.00">#2</text>
+<title>Con_13</title>
+<ellipse fill="none" stroke="black" cx="120" cy="-300" rx="27" ry="18"/>
+<text text-anchor="middle" x="120" y="-296.3" font-family="Times,serif" font-size="14.00">#2</text>
</g>
-<!-- Add12 -->
+<!-- Add14 -->
<g id="node6" class="node">
-<title>Add12</title>
-<ellipse fill="none" stroke="black" cx="367" cy="-214" rx="28.7" ry="18"/>
-<text text-anchor="middle" x="367" y="-210.3" font-family="Times,serif" font-size="14.00">Add</text>
+<title>Add14</title>
+<ellipse fill="none" stroke="black" cx="153" cy="-214" rx="27" ry="18"/>
+<text text-anchor="middle" x="153" y="-210.3" font-family="Times,serif" font-size="14.00">+</text>
</g>
-<!-- Add12&#45;&gt;Start1 -->
+<!-- Add14&#45;&gt;Start2 -->
<g id="edge5" class="edge">
-<title>Add12&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="black" d="M345.25,-226.01C326.31,-235.99 298.43,-251.6 276,-268 269.65,-272.64 267.95,-278.9 264.5,-282.95"/>
-<polygon fill="black" stroke="black" points="262.82,-279.86 255,-287 265.57,-286.29 262.82,-279.86"/>
+<title>Add14&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="black" d="M174.12,-225.69C193.67,-236.17 221.18,-252.54 231.18,-266.44"/>
+<polygon fill="black" stroke="black" points="228.04,-268.01 235,-276 234.54,-265.42 228.04,-268.01"/>
</g>
-<!-- Add12&#45;&gt;Con_11 -->
+<!-- Add14&#45;&gt;Con_13 -->
<g id="edge6" class="edge">
-<title>Add12&#45;&gt;Con_11</title>
-<path fill="none" stroke="black" d="M370.44,-232C372.77,-243.5 375.89,-258.93 378.55,-272.08"/>
-<polygon fill="black" stroke="black" points="375.15,-272.92 380.56,-282.03 382.01,-271.53 375.15,-272.92"/>
+<title>Add14&#45;&gt;Con_13</title>
+<path fill="none" stroke="black" d="M146.48,-231.6C141.87,-243.33 135.59,-259.3 130.31,-272.76"/>
+<polygon fill="black" stroke="black" points="126.91,-271.85 126.51,-282.44 133.42,-274.41 126.91,-271.85"/>
</g>
-<!-- Con_13 -->
+<!-- Con_15 -->
<g id="node7" class="node">
-<title>Con_13</title>
-<ellipse fill="none" stroke="black" cx="124" cy="-300" rx="27" ry="18"/>
-<text text-anchor="middle" x="124" y="-296.3" font-family="Times,serif" font-size="14.00">#3</text>
+<title>Con_15</title>
+<ellipse fill="none" stroke="black" cx="380" cy="-300" rx="27" ry="18"/>
+<text text-anchor="middle" x="380" y="-296.3" font-family="Times,serif" font-size="14.00">#3</text>
</g>
-<!-- Sub14 -->
+<!-- Sub16 -->
<g id="node8" class="node">
-<title>Sub14</title>
-<ellipse fill="none" stroke="black" cx="155" cy="-214" rx="28.7" ry="18"/>
-<text text-anchor="middle" x="155" y="-210.3" font-family="Times,serif" font-size="14.00">Sub</text>
+<title>Sub16</title>
+<ellipse fill="none" stroke="black" cx="317" cy="-214" rx="27" ry="18"/>
+<text text-anchor="middle" x="317" y="-210.3" font-family="Times,serif" font-size="14.00">&#45;</text>
</g>
-<!-- Sub14&#45;&gt;Start1 -->
+<!-- Sub16&#45;&gt;Start2 -->
<g id="edge7" class="edge">
-<title>Sub14&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="black" d="M177.07,-225.84C197.1,-236.27 224.99,-252.48 235.13,-266.39"/>
-<polygon fill="black" stroke="black" points="232.02,-268.03 239,-276 238.51,-265.42 232.02,-268.03"/>
+<title>Sub16&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="black" d="M304.31,-229.92C290.9,-245.57 270.14,-269.43 258.76,-280.7"/>
+<polygon fill="black" stroke="black" points="256.56,-277.98 251,-287 260.97,-283.41 256.56,-277.98"/>
</g>
-<!-- Sub14&#45;&gt;Con_13 -->
+<!-- Sub16&#45;&gt;Con_15 -->
<g id="edge8" class="edge">
-<title>Sub14&#45;&gt;Con_13</title>
-<path fill="none" stroke="black" d="M148.88,-231.6C144.54,-243.33 138.65,-259.3 133.69,-272.76"/>
-<polygon fill="black" stroke="black" points="130.29,-271.85 130.11,-282.44 136.86,-274.27 130.29,-271.85"/>
+<title>Sub16&#45;&gt;Con_15</title>
+<path fill="none" stroke="black" d="M328.56,-230.41C338.06,-243.08 351.67,-261.23 362.51,-275.68"/>
+<polygon fill="black" stroke="black" points="359.72,-277.79 368.52,-283.69 365.32,-273.59 359.72,-277.79"/>
</g>
-<!-- Scope20_0 -->
+<!-- Scope1_0 -->
<g id="node9" class="node">
-<title>Scope20_0</title>
+<title>Scope1_0</title>
<polygon fill="cyan" stroke="transparent" points="105,-31 105,-52 121,-52 121,-31 105,-31"/>
<polygon fill="none" stroke="black" points="105,-31 105,-52 121,-52 121,-31 105,-31"/>
<text text-anchor="start" x="108" y="-37.8" font-family="Times,serif" font-size="14.00">0</text>
@@ -151,70 +151,70 @@
<polygon fill="none" stroke="black" points="161,-31 161,-52 192,-52 192,-31 161,-31"/>
<text text-anchor="start" x="164" y="-37.8" font-family="Times,serif" font-size="14.00">arg</text>
</g>
-<!-- Scope20_0&#45;&gt;Start1 -->
+<!-- Scope1_0&#45;&gt;Start2 -->
<g id="edge10" class="edge">
-<title>Scope20_0:Scope20_0_arg&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M177,-53C177,-61.62 118.7,-187.55 117,-196 113.84,-211.69 107.8,-218.91 117,-232 147.93,-276.04 227.44,-225.96 237.87,-266.02"/>
-<polygon fill="cornflowerblue" stroke="cornflowerblue" points="234.39,-266.46 239,-276 241.35,-265.67 234.39,-266.46"/>
+<title>Scope1_0:Scope1_0_arg&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M177,-53C177,-72.12 160.6,-70.93 152,-88 122.36,-146.82 79.43,-177.9 117,-232 146.68,-274.74 223.16,-227.66 233.77,-265.81"/>
+<polygon fill="cornflowerblue" stroke="cornflowerblue" points="230.33,-266.49 235,-276 237.28,-265.65 230.33,-266.49"/>
</g>
-<!-- Scope20_0&#45;&gt;If7 -->
+<!-- Scope1_0&#45;&gt;If9 -->
<g id="edge9" class="edge">
-<title>Scope20_0:Scope20_0_$ctrl&#45;&gt;If7:p1</title>
-<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M141,-53C141,-101.77 232.71,-58.8 246.32,-93.95"/>
-<polygon fill="cornflowerblue" stroke="cornflowerblue" points="242.9,-94.71 248,-104 249.8,-93.56 242.9,-94.71"/>
+<title>Scope1_0:Scope1_0_$ctrl&#45;&gt;If9:p0</title>
+<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M141,-53C141,-81.73 181.94,-74.1 191.86,-94.03"/>
+<polygon fill="cornflowerblue" stroke="cornflowerblue" points="188.48,-94.96 194,-104 195.32,-93.49 188.48,-94.96"/>
</g>
-<!-- Scope20_1 -->
+<!-- Scope1_1 -->
<g id="node10" class="node">
-<title>Scope20_1</title>
+<title>Scope1_1</title>
<polygon fill="cyan" stroke="transparent" points="36,-31 36,-52 52,-52 52,-31 36,-31"/>
<polygon fill="none" stroke="black" points="36,-31 36,-52 52,-52 52,-31 36,-31"/>
<text text-anchor="start" x="39" y="-37.8" font-family="Times,serif" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="52,-31 52,-52 67,-52 67,-31 52,-31"/>
<text text-anchor="start" x="55" y="-37.8" font-family="Times,serif" font-size="14.00">a</text>
</g>
-<!-- Scope20_1&#45;&gt;Sub14 -->
+<!-- Scope1_1&#45;&gt;Add14 -->
<g id="edge11" class="edge">
-<title>Scope20_1:Scope20_1_a&#45;&gt;Sub14</title>
-<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M60,-53C60,-109.34 104.1,-163.18 132.2,-191.77"/>
-<polygon fill="cornflowerblue" stroke="cornflowerblue" points="129.75,-194.27 139.31,-198.82 134.67,-189.29 129.75,-194.27"/>
+<title>Scope1_1:Scope1_1_a&#45;&gt;Add14</title>
+<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M60,-53C60,-108.8 102.8,-162.53 130.33,-191.31"/>
+<polygon fill="cornflowerblue" stroke="cornflowerblue" points="128.14,-194.07 137.64,-198.75 133.13,-189.17 128.14,-194.07"/>
</g>
-<!-- Scope21_0 -->
+<!-- Scope12_0 -->
<g id="node11" class="node">
-<title>Scope21_0</title>
-<polygon fill="cyan" stroke="transparent" points="352,-31 352,-52 368,-52 368,-31 352,-31"/>
-<polygon fill="none" stroke="black" points="352,-31 352,-52 368,-52 368,-31 352,-31"/>
-<text text-anchor="start" x="355" y="-37.8" font-family="Times,serif" font-size="14.00">0</text>
-<polygon fill="none" stroke="black" points="368,-31 368,-52 408,-52 408,-31 368,-31"/>
-<text text-anchor="start" x="371" y="-37.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="408,-31 408,-52 439,-52 439,-31 408,-31"/>
-<text text-anchor="start" x="411" y="-37.8" font-family="Times,serif" font-size="14.00">arg</text>
-</g>
-<!-- Scope21_0&#45;&gt;Start1 -->
+<title>Scope12_0</title>
+<polygon fill="cyan" stroke="transparent" points="313,-31 313,-52 329,-52 329,-31 313,-31"/>
+<polygon fill="none" stroke="black" points="313,-31 313,-52 329,-52 329,-31 313,-31"/>
+<text text-anchor="start" x="316" y="-37.8" font-family="Times,serif" font-size="14.00">0</text>
+<polygon fill="none" stroke="black" points="329,-31 329,-52 369,-52 369,-31 329,-31"/>
+<text text-anchor="start" x="332" y="-37.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="369,-31 369,-52 400,-52 400,-31 369,-31"/>
+<text text-anchor="start" x="372" y="-37.8" font-family="Times,serif" font-size="14.00">arg</text>
+</g>
+<!-- Scope12_0&#45;&gt;Start2 -->
<g id="edge13" class="edge">
-<title>Scope21_0:Scope21_0_arg&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M424,-53C424,-133 456.67,-170.92 405,-232 366.55,-277.44 328.13,-239.26 276,-268 269.11,-271.8 267.55,-278.27 264.27,-282.59"/>
-<polygon fill="cornflowerblue" stroke="cornflowerblue" points="262.53,-279.54 255,-287 265.53,-285.86 262.53,-279.54"/>
+<title>Scope12_0:Scope12_0_arg&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M385,-53C385,-133.82 402.85,-168.39 353,-232 328.7,-263.01 305.02,-246.51 272,-268 265.41,-272.29 263.77,-278.64 260.39,-282.8"/>
+<polygon fill="cornflowerblue" stroke="cornflowerblue" points="258.7,-279.72 251,-287 261.56,-286.11 258.7,-279.72"/>
</g>
-<!-- Scope21_0&#45;&gt;If7 -->
+<!-- Scope12_0&#45;&gt;If9 -->
<g id="edge12" class="edge">
-<title>Scope21_0:Scope21_0_$ctrl&#45;&gt;If7:p0</title>
-<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M388,-53C388,-77.87 360.63,-68.25 337,-76 312.25,-84.12 230.52,-76.68 210.47,-94.63"/>
-<polygon fill="cornflowerblue" stroke="cornflowerblue" points="207.15,-93.47 206,-104 213.46,-96.48 207.15,-93.47"/>
+<title>Scope12_0:Scope12_0_$ctrl&#45;&gt;If9:p1</title>
+<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M349,-53C349,-98.16 313.19,-112.94 269.13,-114.79"/>
+<polygon fill="cornflowerblue" stroke="cornflowerblue" points="268.93,-111.3 259,-115 269.07,-118.3 268.93,-111.3"/>
</g>
-<!-- Scope21_1 -->
+<!-- Scope12_1 -->
<g id="node12" class="node">
-<title>Scope21_1</title>
-<polygon fill="cyan" stroke="transparent" points="283,-31 283,-52 299,-52 299,-31 283,-31"/>
-<polygon fill="none" stroke="black" points="283,-31 283,-52 299,-52 299,-31 283,-31"/>
-<text text-anchor="start" x="286" y="-37.8" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="299,-31 299,-52 314,-52 314,-31 299,-31"/>
-<text text-anchor="start" x="302" y="-37.8" font-family="Times,serif" font-size="14.00">a</text>
-</g>
-<!-- Scope21_1&#45;&gt;Add12 -->
+<title>Scope12_1</title>
+<polygon fill="cyan" stroke="transparent" points="244,-31 244,-52 260,-52 260,-31 244,-31"/>
+<polygon fill="none" stroke="black" points="244,-31 244,-52 260,-52 260,-31 244,-31"/>
+<text text-anchor="start" x="247" y="-37.8" font-family="Times,serif" font-size="14.00">1</text>
+<polygon fill="none" stroke="black" points="260,-31 260,-52 275,-52 275,-31 260,-31"/>
+<text text-anchor="start" x="263" y="-37.8" font-family="Times,serif" font-size="14.00">a</text>
+</g>
+<!-- Scope12_1&#45;&gt;Sub16 -->
<g id="edge14" class="edge">
-<title>Scope21_1:Scope21_1_a&#45;&gt;Add12</title>
-<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M307,-53C307,-103.54 333.58,-157.68 351.35,-188.24"/>
-<polygon fill="cornflowerblue" stroke="cornflowerblue" points="348.42,-190.15 356.55,-196.94 354.42,-186.56 348.42,-190.15"/>
+<title>Scope12_1:Scope12_1_a&#45;&gt;Sub16</title>
+<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M268,-53C268,-69.44 275,-72.33 280,-88 290.77,-121.73 302.19,-160.92 309.45,-186.29"/>
+<polygon fill="cornflowerblue" stroke="cornflowerblue" points="306.09,-187.29 312.2,-195.95 312.83,-185.37 306.09,-187.29"/>
</g>
</g>
</svg>
diff --git a/chapter05/docs/05-graph2.gv b/chapter05/docs/05-graph2.gv
index d2c819a8..55702eea 100644
--- a/chapter05/docs/05-graph2.gv
+++ b/chapter05/docs/05-graph2.gv
@@ -2,18 +2,19 @@ digraph chapter05 {
/*
int a = 1;
if (arg == 1)
- a = arg+2;
+ a = arg+2;
else {
- a = arg-3;
- #showGraph;
+ a = arg-3;
+ #showGraph;
}
return a;
-#showGraph;
*/
rankdir=BT;
+ ordering="in";
+ concentrate="true";
subgraph cluster_Nodes {
- Start1 [ shape=plaintext label=<
+ Start2 [ shape=plaintext label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR><TD BGCOLOR="yellow">Start</TD></TR>
<TR><TD>
@@ -23,9 +24,10 @@ return a;
</TD></TR>
</TABLE>>
];
- Con_5 [ label="#1" ];
- EQNode6 [ label="EQNode" ];
- If7 [ shape=plaintext label=<
+ Stop3 [ shape=box style=filled fillcolor=yellow label="Stop" ];
+ Con_7 [ label="#1" ];
+ EQNode8 [ label="==" ];
+ If9 [ shape=plaintext label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR><TD BGCOLOR="yellow">If</TD></TR>
<TR><TD>
@@ -35,43 +37,29 @@ return a;
</TD></TR>
</TABLE>>
];
- Con_11 [ label="#2" ];
- Add12 [ label="Add" ];
- Con_13 [ label="#3" ];
- Sub14 [ label="Sub" ];
- Region15 [ shape=box style=filled fillcolor=yellow label="Region" ];
- Phi16 [ label="Phi" ];
- Return17 [ shape=box style=filled fillcolor=yellow label="Return" ];
+ Con_13 [ label="#2" ];
+ Add14 [ label="+" ];
+ Con_15 [ label="#3" ];
+ Sub16 [ label="-" ];
+ Region17 [ shape=box style=filled fillcolor=yellow label="Region" ];
+ Phi_a18 [ style=filled fillcolor=lightyellow label="&phi;_a" ];
+ Return19 [ shape=box style=filled fillcolor=yellow label="Return" ];
+ { rank=same; Phi_a18;}
}
- node [shape=plaintext];
- subgraph cluster_Scope20_0 {
- Scope20_0 [label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="cyan">0</TD><TD PORT="Scope20_0_$ctrl">$ctrl</TD><TD PORT="Scope20_0_arg">arg</TD></TR>
- </TABLE>>];
- subgraph cluster_Scope20_1 {
- Scope20_1 [label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD BGCOLOR="cyan">1</TD><TD PORT="Scope20_1_a">a</TD></TR>
- </TABLE>>];
- }
- }
- EQNode6 -> Start1:p1;
- EQNode6 -> Con_5;
- If7 -> Start1:p0 [color=red];
- If7 -> EQNode6;
- Add12 -> Start1:p1;
- Add12 -> Con_11;
- Sub14 -> Start1:p1;
- Sub14 -> Con_13;
- Region15 -> If7:p0 [color=red];
- Region15 -> If7:p1 [color=red];
- Phi16 -> Region15 [color=red];
- Phi16 -> Add12;
- Phi16 -> Sub14;
- Return17 -> Region15 [color=red];
- Return17 -> Phi16;
- edge [style=dashed color=cornflowerblue];
- Scope20_0:"Scope20_0_arg" -> Start1:p1;
- Scope20_1:"Scope20_1_a" -> Phi16;
+ Stop3 -> Return19 [color=red];
+ EQNode8 -> Start2:p1;
+ EQNode8 -> Con_7;
+ If9 -> Start2:p0 [color=red];
+ If9 -> EQNode8;
+ Add14 -> Start2:p1;
+ Add14 -> Con_13;
+ Sub16 -> Start2:p1;
+ Sub16 -> Con_15;
+ Region17 -> If9:p0 [color=red];
+ Region17 -> If9:p1 [color=red];
+ Phi_a18 -> Region17 [color=red];
+ Phi_a18 -> Add14;
+ Phi_a18 -> Sub16;
+ Return19 -> Region17 [color=red];
+ Return19 -> Phi_a18;
} \ No newline at end of file
diff --git a/chapter05/docs/05-graph2.svg b/chapter05/docs/05-graph2.svg
index 70d1a8c5..07a07ced 100644
--- a/chapter05/docs/05-graph2.svg
+++ b/chapter05/docs/05-graph2.svg
@@ -4,225 +4,197 @@
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: chapter05 Pages: 1 -->
-<svg width="542pt" height="500pt"
- viewBox="0.00 0.00 542.00 500.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 496)">
+<svg width="334pt" height="564pt"
+ viewBox="0.00 0.00 334.00 564.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 560)">
<title>chapter05</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-496 538,-496 538,4 -4,4"/>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-560 330,-560 330,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="8,-16 8,-484 318,-484 318,-16 8,-16"/>
+<polygon fill="none" stroke="black" points="8,-8 8,-548 318,-548 318,-8 8,-8"/>
</g>
-<g id="clust2" class="cluster">
-<title>cluster_Scope20_0</title>
-<polygon fill="none" stroke="black" points="326,-8 326,-76 526,-76 526,-8 326,-8"/>
-</g>
-<g id="clust3" class="cluster">
-<title>cluster_Scope20_1</title>
-<polygon fill="none" stroke="black" points="334,-16 334,-68 404,-68 404,-16 334,-16"/>
-</g>
-<!-- Start1 -->
+<!-- Start2 -->
<g id="node1" class="node">
-<title>Start1</title>
-<polygon fill="yellow" stroke="transparent" points="174,-447 174,-472 255,-472 255,-447 174,-447"/>
-<polygon fill="none" stroke="black" points="174,-447 174,-472 255,-472 255,-447 174,-447"/>
-<text text-anchor="start" x="196" y="-455.8" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="174,-416 174,-447 255,-447 255,-416 174,-416"/>
-<polygon fill="yellow" stroke="transparent" points="179,-421 179,-442 219,-442 219,-421 179,-421"/>
-<polygon fill="none" stroke="black" points="179,-421 179,-442 219,-442 219,-421 179,-421"/>
-<text text-anchor="start" x="182" y="-427.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="219,-421 219,-442 250,-442 250,-421 219,-421"/>
-<text text-anchor="start" x="222" y="-427.8" font-family="Times,serif" font-size="14.00">arg</text>
-</g>
-<!-- Con_5 -->
+<title>Start2</title>
+<polygon fill="yellow" stroke="transparent" points="135,-511 135,-536 216,-536 216,-511 135,-511"/>
+<polygon fill="none" stroke="black" points="135,-511 135,-536 216,-536 216,-511 135,-511"/>
+<text text-anchor="start" x="157" y="-519.8" font-family="Times,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="135,-480 135,-511 216,-511 216,-480 135,-480"/>
+<polygon fill="yellow" stroke="transparent" points="140,-485 140,-506 180,-506 180,-485 140,-485"/>
+<polygon fill="none" stroke="black" points="140,-485 140,-506 180,-506 180,-485 140,-485"/>
+<text text-anchor="start" x="143" y="-491.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="180,-485 180,-506 211,-506 211,-485 180,-485"/>
+<text text-anchor="start" x="183" y="-491.8" font-family="Times,serif" font-size="14.00">arg</text>
+</g>
+<!-- Stop3 -->
<g id="node2" class="node">
-<title>Con_5</title>
-<ellipse fill="none" stroke="black" cx="120" cy="-444" rx="27" ry="18"/>
-<text text-anchor="middle" x="120" y="-440.3" font-family="Times,serif" font-size="14.00">#1</text>
+<title>Stop3</title>
+<polygon fill="yellow" stroke="black" points="221,-52 167,-52 167,-16 221,-16 221,-52"/>
+<text text-anchor="middle" x="194" y="-30.3" font-family="Times,serif" font-size="14.00">Stop</text>
</g>
-<!-- EQNode6 -->
-<g id="node3" class="node">
-<title>EQNode6</title>
-<ellipse fill="none" stroke="black" cx="139" cy="-358" rx="49.29" ry="18"/>
-<text text-anchor="middle" x="139" y="-354.3" font-family="Times,serif" font-size="14.00">EQNode</text>
+<!-- Return19 -->
+<g id="node12" class="node">
+<title>Return19</title>
+<polygon fill="yellow" stroke="black" points="227,-124 161,-124 161,-88 227,-88 227,-124"/>
+<text text-anchor="middle" x="194" y="-102.3" font-family="Times,serif" font-size="14.00">Return</text>
</g>
-<!-- EQNode6&#45;&gt;Start1 -->
+<!-- Stop3&#45;&gt;Return19 -->
<g id="edge1" class="edge">
-<title>EQNode6&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="black" d="M179.99,-368.1C202.72,-375.5 227.59,-388.34 233.63,-409.86"/>
-<polygon fill="black" stroke="black" points="230.19,-410.56 235,-420 237.13,-409.62 230.19,-410.56"/>
+<title>Stop3&#45;&gt;Return19</title>
+<path fill="none" stroke="red" d="M194,-52.3C194,-60.02 194,-69.29 194,-77.89"/>
+<polygon fill="red" stroke="red" points="190.5,-77.9 194,-87.9 197.5,-77.9 190.5,-77.9"/>
</g>
-<!-- EQNode6&#45;&gt;Con_5 -->
-<g id="edge2" class="edge">
-<title>EQNode6&#45;&gt;Con_5</title>
-<path fill="none" stroke="black" d="M135.16,-376C132.55,-387.5 129.06,-402.93 126.09,-416.08"/>
-<polygon fill="black" stroke="black" points="122.63,-415.5 123.84,-426.03 129.46,-417.05 122.63,-415.5"/>
+<!-- Con_7 -->
+<g id="node3" class="node">
+<title>Con_7</title>
+<ellipse fill="none" stroke="black" cx="269" cy="-508" rx="27" ry="18"/>
+<text text-anchor="middle" x="269" y="-504.3" font-family="Times,serif" font-size="14.00">#1</text>
</g>
-<!-- If7 -->
+<!-- EQNode8 -->
<g id="node4" class="node">
-<title>If7</title>
-<polygon fill="yellow" stroke="transparent" points="24,-275 24,-300 118,-300 118,-275 24,-275"/>
-<polygon fill="none" stroke="black" points="24,-275 24,-300 118,-300 118,-275 24,-275"/>
-<text text-anchor="start" x="65.5" y="-283.8" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="24,-244 24,-275 118,-275 118,-244 24,-244"/>
-<polygon fill="yellow" stroke="transparent" points="29,-249 29,-270 69,-270 69,-249 29,-249"/>
-<polygon fill="none" stroke="black" points="29,-249 29,-270 69,-270 69,-249 29,-249"/>
-<text text-anchor="start" x="32" y="-255.8" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="69,-249 69,-270 113,-270 113,-249 69,-249"/>
-<polygon fill="none" stroke="black" points="69,-249 69,-270 113,-270 113,-249 69,-249"/>
-<text text-anchor="start" x="72" y="-255.8" font-family="Times,serif" font-size="14.00">False</text>
-</g>
-<!-- If7&#45;&gt;Start1 -->
+<title>EQNode8</title>
+<ellipse fill="none" stroke="black" cx="255" cy="-422" rx="27" ry="18"/>
+<text text-anchor="middle" x="255" y="-418.3" font-family="Times,serif" font-size="14.00">==</text>
+</g>
+<!-- EQNode8&#45;&gt;Start2 -->
+<g id="edge2" class="edge">
+<title>EQNode8&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="black" d="M248.78,-439.7C242.25,-456.15 231.48,-480.23 221.01,-490.3"/>
+<polygon fill="black" stroke="black" points="219.25,-487.27 212,-495 222.49,-493.48 219.25,-487.27"/>
+</g>
+<!-- EQNode8&#45;&gt;Con_7 -->
<g id="edge3" class="edge">
-<title>If7&#45;&gt;Start1:p0</title>
-<path fill="none" stroke="red" d="M66.46,-304.11C64.93,-326.1 66.49,-355.24 81,-376 102.18,-406.31 125.07,-391.74 156,-412 162.92,-416.54 164.7,-423.06 168.48,-427.16"/>
-<polygon fill="red" stroke="red" points="167.42,-430.5 178,-431 170.04,-424.01 167.42,-430.5"/>
+<title>EQNode8&#45;&gt;Con_7</title>
+<path fill="none" stroke="black" d="M257.83,-440C259.75,-451.5 262.32,-466.93 264.51,-480.08"/>
+<polygon fill="black" stroke="black" points="261.07,-480.74 266.17,-490.03 267.98,-479.59 261.07,-480.74"/>
</g>
-<!-- If7&#45;&gt;EQNode6 -->
+<!-- If9 -->
+<g id="node5" class="node">
+<title>If9</title>
+<polygon fill="yellow" stroke="transparent" points="208,-339 208,-364 302,-364 302,-339 208,-339"/>
+<polygon fill="none" stroke="black" points="208,-339 208,-364 302,-364 302,-339 208,-339"/>
+<text text-anchor="start" x="249.5" y="-347.8" font-family="Times,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="208,-308 208,-339 302,-339 302,-308 208,-308"/>
+<polygon fill="yellow" stroke="transparent" points="213,-313 213,-334 253,-334 253,-313 213,-313"/>
+<polygon fill="none" stroke="black" points="213,-313 213,-334 253,-334 253,-313 213,-313"/>
+<text text-anchor="start" x="216" y="-319.8" font-family="Times,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="transparent" points="253,-313 253,-334 297,-334 297,-313 253,-313"/>
+<polygon fill="none" stroke="black" points="253,-313 253,-334 297,-334 297,-313 253,-313"/>
+<text text-anchor="start" x="256" y="-319.8" font-family="Times,serif" font-size="14.00">False</text>
+</g>
+<!-- If9&#45;&gt;Start2 -->
<g id="edge4" class="edge">
-<title>If7&#45;&gt;EQNode6</title>
-<path fill="none" stroke="black" d="M96.32,-304.28C103.88,-313.61 112.04,-323.7 119.19,-332.53"/>
-<polygon fill="black" stroke="black" points="116.66,-334.97 125.68,-340.54 122.11,-330.57 116.66,-334.97"/>
+<title>If9&#45;&gt;Start2:p0</title>
+<path fill="none" stroke="red" d="M234.15,-368.33C211.65,-402.25 177.35,-454.28 164.81,-475.08"/>
+<polygon fill="red" stroke="red" points="161.66,-473.54 160,-484 167.82,-476.86 161.66,-473.54"/>
</g>
-<!-- Con_11 -->
-<g id="node5" class="node">
-<title>Con_11</title>
-<ellipse fill="none" stroke="black" cx="263" cy="-272" rx="27" ry="18"/>
-<text text-anchor="middle" x="263" y="-268.3" font-family="Times,serif" font-size="14.00">#2</text>
+<!-- If9&#45;&gt;EQNode8 -->
+<g id="edge5" class="edge">
+<title>If9&#45;&gt;EQNode8</title>
+<path fill="none" stroke="black" d="M255,-368.28C255,-376.58 255,-385.48 255,-393.56"/>
+<polygon fill="black" stroke="black" points="251.5,-393.6 255,-403.6 258.5,-393.6 251.5,-393.6"/>
</g>
-<!-- Add12 -->
+<!-- Con_13 -->
<g id="node6" class="node">
-<title>Add12</title>
-<ellipse fill="none" stroke="black" cx="263" cy="-186" rx="28.7" ry="18"/>
-<text text-anchor="middle" x="263" y="-182.3" font-family="Times,serif" font-size="14.00">Add</text>
+<title>Con_13</title>
+<ellipse fill="none" stroke="black" cx="63" cy="-336" rx="27" ry="18"/>
+<text text-anchor="middle" x="63" y="-332.3" font-family="Times,serif" font-size="14.00">#2</text>
</g>
-<!-- Add12&#45;&gt;Start1 -->
-<g id="edge5" class="edge">
-<title>Add12&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="black" d="M276.75,-201.93C284.96,-211.9 294.62,-225.75 299,-240 323.67,-320.23 337.38,-422.23 261.26,-430.47"/>
-<polygon fill="black" stroke="black" points="260.81,-426.99 251,-431 261.17,-433.98 260.81,-426.99"/>
+<!-- Add14 -->
+<g id="node7" class="node">
+<title>Add14</title>
+<ellipse fill="none" stroke="black" cx="63" cy="-250" rx="27" ry="18"/>
+<text text-anchor="middle" x="63" y="-246.3" font-family="Times,serif" font-size="14.00">+</text>
</g>
-<!-- Add12&#45;&gt;Con_11 -->
+<!-- Add14&#45;&gt;Start2 -->
<g id="edge6" class="edge">
-<title>Add12&#45;&gt;Con_11</title>
-<path fill="none" stroke="black" d="M263,-204.4C263,-215.74 263,-230.77 263,-243.68"/>
-<polygon fill="black" stroke="black" points="259.5,-243.9 263,-253.9 266.5,-243.9 259.5,-243.9"/>
+<title>Add14&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="black" d="M49.25,-265.93C41.04,-275.9 31.38,-289.75 27,-304 18.64,-331.19 10.48,-344.84 27,-368 69.04,-426.93 155.55,-353.24 181,-421"/>
+<path fill="none" stroke="black" d="M181,-423C182.58,-427.33 188.61,-449.48 192.53,-466.05"/>
+<polygon fill="black" stroke="black" points="189.13,-466.89 194.73,-475.88 195.96,-465.36 189.13,-466.89"/>
</g>
-<!-- Con_13 -->
-<g id="node7" class="node">
-<title>Con_13</title>
-<ellipse fill="none" stroke="black" cx="171" cy="-272" rx="27" ry="18"/>
-<text text-anchor="middle" x="171" y="-268.3" font-family="Times,serif" font-size="14.00">#3</text>
+<!-- Add14&#45;&gt;Con_13 -->
+<g id="edge7" class="edge">
+<title>Add14&#45;&gt;Con_13</title>
+<path fill="none" stroke="black" d="M63,-268.4C63,-279.74 63,-294.77 63,-307.68"/>
+<polygon fill="black" stroke="black" points="59.5,-307.9 63,-317.9 66.5,-307.9 59.5,-307.9"/>
</g>
-<!-- Sub14 -->
+<!-- Con_15 -->
<g id="node8" class="node">
-<title>Sub14</title>
-<ellipse fill="none" stroke="black" cx="180" cy="-186" rx="28.7" ry="18"/>
-<text text-anchor="middle" x="180" y="-182.3" font-family="Times,serif" font-size="14.00">Sub</text>
+<title>Con_15</title>
+<ellipse fill="none" stroke="black" cx="135" cy="-336" rx="27" ry="18"/>
+<text text-anchor="middle" x="135" y="-332.3" font-family="Times,serif" font-size="14.00">#3</text>
</g>
-<!-- Sub14&#45;&gt;Start1 -->
-<g id="edge7" class="edge">
-<title>Sub14&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="black" d="M189.92,-203.13C195.76,-213.34 202.81,-227.03 207,-240 230.84,-313.72 234.69,-337.05 234.98,-409.88"/>
-<polygon fill="black" stroke="black" points="231.48,-410.01 235,-420 238.48,-409.99 231.48,-410.01"/>
+<!-- Sub16 -->
+<g id="node9" class="node">
+<title>Sub16</title>
+<ellipse fill="none" stroke="black" cx="155" cy="-250" rx="27" ry="18"/>
+<text text-anchor="middle" x="155" y="-246.3" font-family="Times,serif" font-size="14.00">&#45;</text>
</g>
-<!-- Sub14&#45;&gt;Con_13 -->
+<!-- Sub16&#45;&gt;Start2 -->
<g id="edge8" class="edge">
-<title>Sub14&#45;&gt;Con_13</title>
-<path fill="none" stroke="black" d="M178.18,-204C176.96,-215.38 175.33,-230.62 173.93,-243.69"/>
-<polygon fill="black" stroke="black" points="170.4,-243.71 172.82,-254.03 177.36,-244.46 170.4,-243.71"/>
+<title>Sub16&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="black" d="M161.1,-267.96C164.56,-278.25 168.65,-291.73 171,-304 180.82,-355.26 163.3,-371.9 181,-421"/>
</g>
-<!-- Region15 -->
-<g id="node9" class="node">
-<title>Region15</title>
-<polygon fill="yellow" stroke="black" points="128,-204 62,-204 62,-168 128,-168 128,-204"/>
-<text text-anchor="middle" x="95" y="-182.3" font-family="Times,serif" font-size="14.00">Region</text>
-</g>
-<!-- Region15&#45;&gt;If7 -->
+<!-- Sub16&#45;&gt;Con_15 -->
<g id="edge9" class="edge">
-<title>Region15&#45;&gt;If7:p0</title>
-<path fill="none" stroke="red" d="M72.54,-204.25C63.23,-213.05 53.81,-224.66 50.37,-237.74"/>
-<polygon fill="red" stroke="red" points="46.85,-237.63 49,-248 53.79,-238.55 46.85,-237.63"/>
-</g>
-<!-- Region15&#45;&gt;If7 -->
-<g id="edge10" class="edge">
-<title>Region15&#45;&gt;If7:p1</title>
-<path fill="none" stroke="red" d="M93.28,-204.07C92.44,-213.52 91.54,-225.74 91.17,-237.67"/>
-<polygon fill="red" stroke="red" points="87.66,-237.94 91,-248 94.66,-238.06 87.66,-237.94"/>
+<title>Sub16&#45;&gt;Con_15</title>
+<path fill="none" stroke="black" d="M150.95,-268C148.21,-279.5 144.54,-294.93 141.41,-308.08"/>
+<polygon fill="black" stroke="black" points="137.95,-307.49 139.04,-318.03 144.76,-309.11 137.95,-307.49"/>
</g>
-<!-- Phi16 -->
+<!-- Region17 -->
<g id="node10" class="node">
-<title>Phi16</title>
-<ellipse fill="none" stroke="black" cx="180" cy="-114" rx="27" ry="18"/>
-<text text-anchor="middle" x="180" y="-110.3" font-family="Times,serif" font-size="14.00">Phi</text>
+<title>Region17</title>
+<polygon fill="yellow" stroke="black" points="266,-268 200,-268 200,-232 266,-232 266,-268"/>
+<text text-anchor="middle" x="233" y="-246.3" font-family="Times,serif" font-size="14.00">Region</text>
</g>
-<!-- Phi16&#45;&gt;Add12 -->
-<g id="edge12" class="edge">
-<title>Phi16&#45;&gt;Add12</title>
-<path fill="none" stroke="black" d="M196.4,-128.83C208.45,-138.99 225.02,-152.97 238.62,-164.44"/>
-<polygon fill="black" stroke="black" points="236.74,-167.43 246.64,-171.2 241.25,-162.08 236.74,-167.43"/>
-</g>
-<!-- Phi16&#45;&gt;Sub14 -->
-<g id="edge13" class="edge">
-<title>Phi16&#45;&gt;Sub14</title>
-<path fill="none" stroke="black" d="M180,-132.3C180,-140.02 180,-149.29 180,-157.89"/>
-<polygon fill="black" stroke="black" points="176.5,-157.9 180,-167.9 183.5,-157.9 176.5,-157.9"/>
+<!-- Region17&#45;&gt;If9 -->
+<g id="edge10" class="edge">
+<title>Region17&#45;&gt;If9:p0</title>
+<path fill="none" stroke="red" d="M233,-268.09C233,-277.55 233,-289.77 233,-301.69"/>
+<polygon fill="red" stroke="red" points="229.5,-302 233,-312 236.5,-302 229.5,-302"/>
</g>
-<!-- Phi16&#45;&gt;Region15 -->
+<!-- Region17&#45;&gt;If9 -->
<g id="edge11" class="edge">
-<title>Phi16&#45;&gt;Region15</title>
-<path fill="none" stroke="red" d="M163.61,-128.5C152.35,-137.77 137.08,-150.34 123.81,-161.27"/>
-<polygon fill="red" stroke="red" points="121.36,-158.76 115.86,-167.82 125.81,-164.16 121.36,-158.76"/>
+<title>Region17&#45;&gt;If9:p1</title>
+<path fill="none" stroke="red" d="M253.02,-268.12C261.64,-277.06 270.48,-288.84 273.71,-301.84"/>
+<polygon fill="red" stroke="red" points="270.27,-302.52 275,-312 277.22,-301.64 270.27,-302.52"/>
</g>
-<!-- Return17 -->
+<!-- Phi_a18 -->
<g id="node11" class="node">
-<title>Return17</title>
-<polygon fill="yellow" stroke="black" points="183,-60 117,-60 117,-24 183,-24 183,-60"/>
-<text text-anchor="middle" x="150" y="-38.3" font-family="Times,serif" font-size="14.00">Return</text>
+<title>Phi_a18</title>
+<ellipse fill="lightyellow" stroke="black" cx="163" cy="-178" rx="27" ry="18"/>
+<text text-anchor="middle" x="163" y="-174.3" font-family="Times,serif" font-size="14.00">φ_a</text>
+</g>
+<!-- Phi_a18&#45;&gt;Add14 -->
+<g id="edge13" class="edge">
+<title>Phi_a18&#45;&gt;Add14</title>
+<path fill="none" stroke="black" d="M145.12,-191.51C129.72,-202.3 107.26,-218.02 89.72,-230.3"/>
+<polygon fill="black" stroke="black" points="87.25,-227.76 81.06,-236.36 91.26,-233.49 87.25,-227.76"/>
</g>
-<!-- Return17&#45;&gt;Region15 -->
+<!-- Phi_a18&#45;&gt;Sub16 -->
<g id="edge14" class="edge">
-<title>Return17&#45;&gt;Region15</title>
-<path fill="none" stroke="red" d="M143.37,-60.13C133.91,-84.54 116.47,-129.57 105.32,-158.36"/>
-<polygon fill="red" stroke="red" points="102.01,-157.22 101.66,-167.81 108.53,-159.75 102.01,-157.22"/>
+<title>Phi_a18&#45;&gt;Sub16</title>
+<path fill="none" stroke="black" d="M161.02,-196.3C160.14,-204.02 159.08,-213.29 158.1,-221.89"/>
+<polygon fill="black" stroke="black" points="154.61,-221.56 156.95,-231.9 161.57,-222.36 154.61,-221.56"/>
+</g>
+<!-- Phi_a18&#45;&gt;Region17 -->
+<g id="edge12" class="edge">
+<title>Phi_a18&#45;&gt;Region17</title>
+<path fill="none" stroke="red" d="M177.5,-193.5C186.46,-202.46 198.19,-214.19 208.55,-224.55"/>
+<polygon fill="red" stroke="red" points="206.25,-227.2 215.8,-231.8 211.2,-222.25 206.25,-227.2"/>
</g>
-<!-- Return17&#45;&gt;Phi16 -->
+<!-- Return19&#45;&gt;Region17 -->
<g id="edge15" class="edge">
-<title>Return17&#45;&gt;Phi16</title>
-<path fill="none" stroke="black" d="M157.42,-60.3C160.88,-68.39 165.08,-78.19 168.91,-87.13"/>
-<polygon fill="black" stroke="black" points="165.72,-88.56 172.88,-96.38 172.15,-85.81 165.72,-88.56"/>
+<title>Return19&#45;&gt;Region17</title>
+<path fill="none" stroke="red" d="M198.7,-124.13C205.38,-148.44 217.67,-193.18 225.58,-221.99"/>
+<polygon fill="red" stroke="red" points="222.26,-223.09 228.28,-231.81 229.01,-221.24 222.26,-223.09"/>
</g>
-<!-- Scope20_0 -->
-<g id="node12" class="node">
-<title>Scope20_0</title>
-<polygon fill="cyan" stroke="transparent" points="423,-31 423,-52 439,-52 439,-31 423,-31"/>
-<polygon fill="none" stroke="black" points="423,-31 423,-52 439,-52 439,-31 423,-31"/>
-<text text-anchor="start" x="426" y="-37.8" font-family="Times,serif" font-size="14.00">0</text>
-<polygon fill="none" stroke="black" points="439,-31 439,-52 479,-52 479,-31 439,-31"/>
-<text text-anchor="start" x="442" y="-37.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="479,-31 479,-52 510,-52 510,-31 479,-31"/>
-<text text-anchor="start" x="482" y="-37.8" font-family="Times,serif" font-size="14.00">arg</text>
-</g>
-<!-- Scope20_0&#45;&gt;Start1 -->
+<!-- Return19&#45;&gt;Phi_a18 -->
<g id="edge16" class="edge">
-<title>Scope20_0:Scope20_0_arg&#45;&gt;Start1:p1</title>
-<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M495,-53C495,-121.37 416,-116.63 416,-185 416,-185 416,-185 416,-273 416,-371.06 356.8,-427.09 261.28,-430.8"/>
-<polygon fill="cornflowerblue" stroke="cornflowerblue" points="260.93,-427.31 251,-431 261.07,-434.31 260.93,-427.31"/>
-</g>
-<!-- Scope20_1 -->
-<g id="node13" class="node">
-<title>Scope20_1</title>
-<polygon fill="cyan" stroke="transparent" points="354,-31 354,-52 370,-52 370,-31 354,-31"/>
-<polygon fill="none" stroke="black" points="354,-31 354,-52 370,-52 370,-31 354,-31"/>
-<text text-anchor="start" x="357" y="-37.8" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="370,-31 370,-52 385,-52 385,-31 370,-31"/>
-<text text-anchor="start" x="373" y="-37.8" font-family="Times,serif" font-size="14.00">a</text>
-</g>
-<!-- Scope20_1&#45;&gt;Phi16 -->
-<g id="edge17" class="edge">
-<title>Scope20_1:Scope20_1_a&#45;&gt;Phi16</title>
-<path fill="none" stroke="cornflowerblue" stroke-dasharray="5,2" d="M378,-53C378,-86.31 274.09,-102.84 216.82,-109.43"/>
-<polygon fill="cornflowerblue" stroke="cornflowerblue" points="216.26,-105.97 206.7,-110.55 217.03,-112.93 216.26,-105.97"/>
+<title>Return19&#45;&gt;Phi_a18</title>
+<path fill="none" stroke="black" d="M186.34,-124.3C182.76,-132.39 178.42,-142.19 174.46,-151.13"/>
+<polygon fill="black" stroke="black" points="171.21,-149.82 170.36,-160.38 177.61,-152.65 171.21,-149.82"/>
</g>
</g>
</svg>