summaryrefslogtreecommitdiff
path: root/chapter11
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-29 13:08:30 -0700
committerCliff Click <cliffc@acm.org>2026-09-29 13:08:30 -0700
commitb475b072b38db7f46406ed6128fffe3e15a6e7ac (patch)
tree4690b23b117f29003801212bbbf7d89322adb9a3 /chapter11
parenta8558640bd9e3391134577db3c53737273135bf9 (diff)
downloadSimple-b475b072b38db7f46406ed6128fffe3e15a6e7ac.tar.gz
Simple-b475b072b38db7f46406ed6128fffe3e15a6e7ac.zip
forward port lazy memory to ch11
Diffstat (limited to 'chapter11')
-rw-r--r--chapter11/README.md306
-rw-r--r--chapter11/docs/Makefile2
-rw-r--r--chapter11/docs/graph1.gv15
-rw-r--r--chapter11/docs/graph1.svg317
-rw-r--r--chapter11/docs/graph2.gv16
-rw-r--r--chapter11/docs/graph2.svg342
-rw-r--r--chapter11/docs/graph3.gv16
-rw-r--r--chapter11/docs/graph3.svg354
-rw-r--r--chapter11/docs/graph4.gv19
-rw-r--r--chapter11/docs/graph4.svg435
-rw-r--r--chapter11/docs/graph5.gv20
-rw-r--r--chapter11/docs/graph5.svg486
-rw-r--r--chapter11/docs/graph6.gv20
-rw-r--r--chapter11/docs/graph6.svg478
-rw-r--r--chapter11/docs/graph8.gv2
-rw-r--r--chapter11/docs/graph8.svg104
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java16
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/Parser.java39
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/BulkMemPhiNode.java237
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java12
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java60
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/MemPhiNode.java36
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/Node.java12
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/PhiNode.java6
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/ReturnNode.java28
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/ScopeNode.java4
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/StartNode.java46
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java8
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter04Test.java5
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter05Test.java14
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter06Test.java12
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter07Test.java26
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter08Test.java16
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter09Test.java10
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter10Test.java74
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter10bTest.java64
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java8
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java7
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java11
39 files changed, 2181 insertions, 1502 deletions
diff --git a/chapter11/README.md b/chapter11/README.md
index c2f329bc..b91f4fd7 100644
--- a/chapter11/README.md
+++ b/chapter11/README.md
@@ -1,9 +1,18 @@
# Chapter 11: Global Code Motion
-The preceding memory lesson is now split into [10a](../chapter10a/README.md)
-and [10b](../chapter10b/README.md). This snapshot still constructs the older
-per-alias memory chains in the parser. The language is unchanged; forwarding
-10b's bulk-memory representation through Chapters 11-24 is a separate migration.
+This chapter schedules the memory representation introduced in
+[10b](../chapter10b/README.md): one parser-visible `$mem`, with `MemMerge`,
+`MemPhi`, and `BulkMemPhi` recovering independent field chains. Start supplies
+`{ctrl, $mem, arg}`. Return consumes `{ctrl, $mem, result}`, with the complete
+memory aggregate in slot 1. Nodes consuming or producing both control and
+memory consistently use slot 0 for control and slot 1 for memory.
+
+The new scheduling rule is to distinguish a memory aggregate from a memory
+write. `MemMerge` gets a placement from its inputs and uses, but emits no heap
+operation and creates no load/store anti-dependency. A Store or MemPhi can
+constrain a Load only for the same alias; a BulkMemPhi can constrain it only
+while it still covers that alias. Both kinds of memory Phi remain attached to
+their Region, just like scalar Phis.
# Table of Contents
@@ -56,7 +65,7 @@ At its core, the scheduling algorithm works in two phases:
* Schedule Early - in this phase, we do an upward DFS walk on the "inputs" of each Node, starting from the bottom (Stop). We schedule each data node to the
first control block where they are dominated by their inputs.
-* Schedule Late - in this phase we do a downward DFS walk on the "outputs" of each Node starting from the top (Start), and move data nodes to a block between the first block calculated above,
+* Schedule Late - in this phase we work backwards from Stop, scheduling uses before definitions, and move data nodes to a block between the first block calculated above,
and the last control block where they dominate all their uses. The placement is subject to the condition that it is in the shallowest loop nest possible, and is as control dependent as possible.
Additionally, the placement of Load instructions must ensure correct ordering between Loads and Stores of the same memory location.
@@ -78,6 +87,10 @@ return i;
First lets look at the graph before scheduling.
+These walkthrough diagrams show the precise `S.f` chain and the final
+MemMerge consumed by Return. The unchanged default memory comes from Start;
+any redundant bulk Phis have folded away. Arrows point from uses to definitions.
+
![Graph1](./docs/graph1.svg)
Observe that
@@ -369,133 +382,148 @@ A pre-condition of this is to ensure that infinite loops have been "fixed" as de
The implementation of early schedule is shown below:
```java
- // ------------------------------------------------------------------------
-private static void schedEarly() {
- ArrayList<CFGNode> rpo = new ArrayList<>();
- BitSet visit = new BitSet();
- _rpo_cfg(Parser.START, visit, rpo);
- // Reverse Post-Order on CFG
- for( int j=rpo.size()-1; j>=0; j-- ) {
- CFGNode cfg = rpo.get(j);
- cfg.loopDepth();
- for( Node n : cfg._inputs )
- _schedEarly(n,visit);
- // Strictly for dead infinite loops, we can have entire code blocks
- // not reachable from below - so we reach down, from above, one
- // step. Since _schedEarly modifies the output arrays, the normal
- // region._outputs ArrayList iterator throws CME. The extra edges
- // are always *added* after any Phis, so just walk the Phi prefix.
- if( cfg instanceof RegionNode region ) {
- int len = region.nOuts();
- for( int i=0; i<len; i++ )
- if( region.out(i) instanceof PhiNode phi )
- _schedEarly(phi,visit);
+ private static void schedEarly() {
+ ArrayList<CFGNode> rpo = new ArrayList<>();
+ BitSet visit = new BitSet();
+ _rpo_cfg(Parser.START, visit, rpo);
+ // Reverse Post-Order on CFG
+ for( int j=rpo.size()-1; j>=0; j-- ) {
+ CFGNode cfg = rpo.get(j);
+ cfg.loopDepth();
+ for( Node n : cfg._inputs )
+ _schedEarly(n,visit);
+ // In dead infinite loops, entire code blocks may be unreachable
+ // from below. Reach down from the CFG to their Phis so their
+ // inputs are scheduled too.
+ if( cfg instanceof RegionNode ) {
+ int len = cfg.nOuts();
+ for( int i=0; i<len; i++ )
+ if( cfg.out(i) instanceof PhiNode phi )
+ _schedEarly(phi,visit);
+ }
+ }
}
- }
-}
-// Post-Order of CFG
-private static void _rpo_cfg(Node n, BitSet visit, ArrayList<CFGNode> rpo) {
- if( !(n instanceof CFGNode cfg) || visit.get(cfg._nid) )
- return; // Been there, done that
- visit.set(cfg._nid);
- for( Node use : cfg._outputs )
- _rpo_cfg(use,visit,rpo);
- rpo.add(cfg);
-}
+ // Post-Order of CFG
+ private static void _rpo_cfg(Node n, BitSet visit, ArrayList<CFGNode> rpo) {
+ if( !(n instanceof CFGNode cfg) || visit.get(cfg._nid) )
+ return; // Been there, done that
+ visit.set(cfg._nid);
+ for( Node use : cfg._outputs )
+ _rpo_cfg(use,visit,rpo);
+ rpo.add(cfg);
+ }
-private static void _schedEarly(Node n, BitSet visit) {
- if( n==null || visit.get(n._nid) ) return; // Been there, done that
- visit.set(n._nid);
- // Schedule not-pinned not-CFG inputs before self. Since skipping
- // Pinned, this never walks the backedge of Phis (and thus spins around
- // a data-only loop, eventually attempting relying on some pre-visited-
- // not-post-visited data op with no scheduled control.
- for( Node def : n._inputs )
- if( def!=null && !def.isPinned() )
- _schedEarly(def,visit);
- // If not-pinned (e.g. constants, projections, phi) and not-CFG
- if( !n.isPinned() ) {
- // Schedule at deepest input
- CFGNode early = Parser.START; // Maximally early, lowest idepth
- for( int i=1; i<n.nIns(); i++ )
- if( n.in(i).cfg0().idepth() > early.idepth() )
- early = n.in(i).cfg0(); // Latest/deepest input
- n.setDef(0,early); // First place this can go
- }
-}
+ private static void _schedEarly(Node n, BitSet visit) {
+ if( n==null || visit.get(n._nid) ) return; // Been there, done that
+ visit.set(n._nid);
+ // Schedule inputs first, except Phis: following their backedges would
+ // enter a data cycle before its control has been scheduled.
+ for( Node def : n._inputs )
+ if( def!=null && !(def instanceof PhiNode) )
+ _schedEarly(def,visit);
+ // An existing edge 0 already supplies control (or a Phi/Proj binding).
+ if( n.in(0)==null ) {
+ // Schedule at deepest input
+ CFGNode early = Parser.START; // Maximally early, lowest idepth
+ for( int i=1; i<n.nIns(); i++ )
+ if( n.in(i)!=null && n.in(i).cfg0().idepth() > early.idepth() )
+ early = n.in(i).cfg0(); // Latest/deepest input
+ n.setDef(0,early); // First place this can go
+ }
+ }
```
-* The early schedule populates the control input for data nodes - recall that this is null up to this point as data nodes are not attached to any control flow nodes until now.
-* Most of the code above is about walking the graph in the right order. The actual computation of the early schedule is in these lines:
-
-```java
- // If not-pinned (e.g. constants, projections, phi) and not-CFG
- if( !n.isPinned() ) {
- // Schedule at deepest input
- CFGNode early = Parser.START; // Maximally early, lowest idepth
- for( int i=1; i<n.nIns(); i++ )
- if( n.in(i).cfg0().idepth() > early.idepth() )
- early = n.in(i).cfg0(); // Latest/deepest input
- n.setDef(0,early); // First place this can go
- }
-```
+Existing control and Phi/Proj bindings are preserved. Floating nodes receive
+the deepest input block as their earliest placement. MemMerge follows this
+same rule, ignoring absent entries in its sparse alias table.
## Late Schedule
-During this phase we do a downward DFS walk on the "outputs" of each Node starting from the top (Start), and move data nodes to a block between the first block in the early schedule,
-and the last control block where they dominate all their uses. The placement is subject to the condition that it is in the shallowest loop nest possible, and is as control dependent as possible.
-Additionally, the placement of Load instructions must ensure correct ordering between Loads and Stores of the same memory location.
-
-The code for computing the late schedule is shown below.
+Late scheduling starts at Stop and uses a worklist to place uses before their
+definitions. CFG nodes, Phis, projections, and allocations provide fixed
+placements. Other nodes wait until their uses have been scheduled; a Load also
+waits for memory users that can overwrite or merge its alias. The chosen block
+lies between the early placement and the common dominator of all uses, favoring
+shallower loops and then deeper control flow.
```java
- // ------------------------------------------------------------------------
- private static void schedLate(StartNode start) {
+ private static void schedLate( StopNode stop) {
CFGNode[] late = new CFGNode[Node.UID()];
Node[] ns = new Node[Node.UID()];
- _schedLate(start,ns,late);
+ // Record Load NIDs at all their CFG block choices, then check against
+ // Store block choices to force a Load above an anti-dependent Store.
+ int[] anti = new int[Node.UID()];
+ // Breadth-first scheduling
+ breadth(stop,ns,late,anti);
+
+ // Copy the best placement choice into the control slot
for( int i=0; i<late.length; i++ )
- if( ns[i] != null )
+ if( ns[i] != null && !(ns[i] instanceof ProjNode) )
ns[i].setDef(0,late[i]);
}
- // Forwards post-order pass. Schedule all outputs first, then draw a
- // idom-tree line from the LCA of uses to the early schedule. Schedule is
- // legal anywhere on this line; pick the most control-dependent (largest
- // idepth) in the shallowest loop nest.
- private static void _schedLate(Node n, Node[] ns, CFGNode[] late) {
- if( late[n._nid]!=null ) return; // Been there, done that
- // These I know the late schedule of, and need to set early for loops
- if( n instanceof CFGNode cfg ) late[n._nid] = cfg.blockHead() ? cfg : cfg.cfg(0);
- if( n instanceof PhiNode phi ) late[n._nid] = phi.region();
-
- // Walk Stores before Loads, so we can get the anti-deps right
- for( Node use : n._outputs )
- if( isForwardsEdge(use,n) &&
- use._type instanceof TypeMem )
- _schedLate(use,ns,late);
- // Walk everybody now
- for( Node use : n._outputs )
- if( isForwardsEdge(use,n) )
- _schedLate(use,ns,late);
- // Already implicitly scheduled
- if( n.isPinned() ) return;
- // Need to schedule n
+ private static void breadth(Node stop, Node[] ns, CFGNode[] late, int[] anti) {
+ // Things on the worklist have some (but perhaps not all) uses done.
+ WorkList<Node> work = new WorkList<>();
+ work.push(stop);
+ Node n;
+ outer:
+ while( (n = work.pop()) != null ) {
+ assert late[n._nid]==null; // No double visit
+ // These I know the late schedule of, and need to set early for loops
+ if( n instanceof CFGNode cfg ) late[n._nid] = cfg.blockHead() ? cfg : cfg.cfg(0);
+ else if( n instanceof PhiNode phi ) late[n._nid] = phi.region();
+ // These nodes have a fixed late placement at their original control.
+ else if( n instanceof ProjNode || n instanceof NewNode || n==Parser.ZERO ) late[n._nid] = n.cfg0();
+ else {
+
+ // All uses done?
+ for( Node use : n._outputs )
+ if( use!=null && late[use._nid]==null )
+ continue outer; // Nope, await all uses done
+
+ // Loads need their memory inputs' uses also done
+ if( n instanceof LoadNode ld )
+ for( Node memuse : ld.mem()._outputs )
+ if( antiUse(ld,memuse) && late[memuse._nid]==null )
+ continue outer;
+
+ // All uses done, schedule
+ _doSchedLate(n,ns,late,anti);
+ }
+ // A use just finished; reconsider its inputs and waiting loads,
+ // even when the shared memory input was already scheduled.
+ for( Node def : n._inputs ) {
+ if( def==null ) continue;
+ if( late[def._nid]==null ) work.push(def);
+ for( Node out : def._outputs )
+ if( out instanceof LoadNode ld && late[ld._nid]==null )
+ work.push(ld);
+ }
+ if( n instanceof LoopNode loop )
+ for( Node phi : loop._outputs )
+ if( phi instanceof PhiNode && late[phi._nid]==null )
+ work.push(phi);
+ }
+ }
+
+ private static void _doSchedLate(Node n, Node[] ns, CFGNode[] late, int[] anti) {
// Walk uses, gathering the LCA (Least Common Ancestor) of uses
- CFGNode early = (CFGNode)n.in(0);
+ CFGNode early = n.in(0) instanceof CFGNode cfg ? cfg : n.in(0).cfg0();
assert early != null;
CFGNode lca = null;
for( Node use : n._outputs )
- lca = use_block(n,use, late).idom(lca);
+ if( use != null )
+ lca = use_block(n,use, late).domLCA(lca);
// Loads may need anti-dependencies, raising their LCA
if( n instanceof LoadNode load )
- lca = find_anti_dep(lca,load,early,late);
+ lca = find_anti_dep(lca,load,early,late,anti);
// Walk up from the LCA to the early, looking for best place. This is
- // lowest execution frequency, approximated by least loop depth and
+ // the lowest execution frequency, approximated by least loop depth and
// deepest control flow.
CFGNode best = lca;
lca = lca.idom(); // Already found best for starting LCA
@@ -515,35 +543,41 @@ The code for computing the late schedule is shown below.
CFGNode found=null;
for( int i=1; i<phi.nIns(); i++ )
if( phi.in(i)==n )
- if( found==null ) found = phi.region().cfg(i);
- else Utils.TODO(); // Can be more than once
+ found = phi.region().cfg(i).domLCA(found); // Can be more than one matching input.
assert found!=null;
return found;
}
+
// Least loop depth first, then largest idepth
private static boolean better( CFGNode lca, CFGNode best ) {
- return lca._loopDepth < best._loopDepth ||
- (lca.idepth() > best.idepth() || best instanceof IfNode);
- }
-
- // Skip iteration if a backedge
- private static boolean isForwardsEdge(Node use, Node def) {
- return use != null && def != null &&
- !(use.nIns()>2 && use.in(2)==def && (use instanceof LoopNode || (use instanceof PhiNode phi && phi.region() instanceof LoopNode)));
+ return lca.loopDepth() < best.loopDepth() ||
+ lca instanceof NeverNode ||
+ lca.idepth() > best.idepth() ||
+ best instanceof IfNode;
}
```
## Inserting Anti Dependencies
-To ensure that Loads and Stores to the same memory location are correctly ordered, we insert an edge from the Load to the Store as described below.
+To ensure that Loads and Stores to the same memory location are correctly ordered, we insert an edge from the Store to the Load as described below: the Store must wait for the earlier Load.
We call these edges anti-dependencies because they do not represent the Def-Use dependency that we normally capture in SoN, and are purely present as scheduling constraints.
We compute anti-dependencies DURING running schedule late. This is because we rely on the early-schedule, and the late-schedule of the Load's uses (before scheduling the Load).
-Looking backwards from the Load we follow the memory edge to the "memory definer" - a start-mem-projection, or a phi-mem, or a store.
-We look forwards from the mem-def to all its mem-def users. There is always at least one; there may be many. These completely (all of it) and exactly (no doubling up) cover the forward memory space, sort of like a network flow problem - but we limit our analysis to same-alias,
-because for example, a start-mem-proj produces all aliases. This gives us a candidate set of mem-defs; some of these need the anti-dependency on the Load, but not all.
+Looking backwards from the Load, we follow its memory input to Start's memory
+projection, a memory Phi, or a Store. Optimization has already selected the
+Load's precise slice through any MemMerge. We inspect users of that memory
+definition, keeping only Stores and memory Phis that cover the Load's alias.
+Start's single memory projection may supply many aliases, so sharing a memory
+input alone does not imply an anti-dependency.
+
+MemMerge only packages slices; it does not overwrite any of them. Treating it
+as a write could make a Load wait for an aggregate which itself depends on the
+Load's result. The same alias filter is used both when deciding whether a Load
+is ready to schedule and when computing its anti-dependencies. A completed
+memory user wakes waiting loads even if their shared memory definition has
+already been scheduled.
Since we're in the middle of "schedule late", we have already computed all the late schedules of a Load's users, and we have the Loads "Least Common Ancestor" of uses, the LCA or late position.
We inspect the set of mem-defs that might impact the Load, and either add an anti-dependency from Store to Load, or raise the Loads effective LCA.
@@ -553,38 +587,50 @@ For stores, we do the same - until/unless we find stores with the SAME block as
The implementation is shown below.
```java
- private static CFGNode find_anti_dep(CFGNode lca, LoadNode load, CFGNode early, CFGNode[] late) {
+ // Only a store or memory Phi covering this alias can constrain a load.
+ // MemMerge packages slices without overwriting them.
+ private static boolean antiUse(LoadNode load, Node use) {
+ return switch( use ) {
+ case StoreNode st -> st._alias==load._alias;
+ case MemPhiNode phi -> phi._alias==load._alias;
+ case BulkMemPhiNode phi -> !phi.isSplit(load._alias);
+ default -> false;
+ };
+ }
+
+ private static CFGNode find_anti_dep(CFGNode lca, LoadNode load, CFGNode early, CFGNode[] late, int[] anti) {
// We could skip final-field loads here.
// Walk LCA->early, flagging Load's block location choices
for( CFGNode cfg=lca; early!=null && cfg!=early.idom(); cfg = cfg.idom() )
- cfg._anti = load._nid;
+ anti[cfg._nid] = load._nid;
// Walk load->mem uses, looking for Stores causing an anti-dep
for( Node mem : load.mem()._outputs ) {
+ if( !antiUse(load,mem) ) continue;
switch( mem ) {
case StoreNode st:
- lca = anti_dep(load,late[st._nid],st.cfg0(),lca,st);
+ lca = anti_dep(load,late[st._nid],st.cfg0(),lca,st,anti);
break;
case PhiNode phi:
// Repeat anti-dep for matching Phi inputs.
// No anti-dep edges but may raise the LCA.
for( int i=1; i<phi.nIns(); i++ )
if( phi.in(i)==load.mem() )
- lca = anti_dep(load,phi.region().cfg(i),load.mem().cfg0(),lca,null);
+ lca = anti_dep(load,phi.region().cfg(i),load.mem().cfg0(),lca,null,anti);
break;
- case LoadNode ld: break; // Loads do not cause anti-deps on other loads
- case ReturnNode ret: break; // Load must already be ahead of Return
default: throw Utils.TODO();
}
}
return lca;
}
- private static CFGNode anti_dep( LoadNode load, CFGNode stblk, CFGNode defblk, CFGNode lca, Node st ) {
- // Walk store blocks "reach" from its scheduled location to its earliest
+ //
+ private static CFGNode anti_dep( LoadNode load, CFGNode stblk, CFGNode defblk, CFGNode lca, Node st, int[] anti ) {
+ // Preserve the full store range for the earlier evaluator scheduler.
+ // It places nodes independently of GCM and may hoist this store.
for( ; stblk != defblk.idom(); stblk = stblk.idom() ) {
// Store and Load overlap, need anti-dependence
- if( stblk._anti==load._nid ) {
- lca = stblk.idom(lca); // Raise Loads LCA
+ if( anti[stblk._nid]==load._nid ) {
+ lca = stblk.domLCA(lca); // Raise Loads LCA
if( lca == stblk && st != null && Utils.find(st._inputs,load) == -1 ) // And if something moved,
st.addDef(load); // Add anti-dep as well
return lca; // Cap this stores' anti-dep to here
diff --git a/chapter11/docs/Makefile b/chapter11/docs/Makefile
index 12659b8f..055882b2 100644
--- a/chapter11/docs/Makefile
+++ b/chapter11/docs/Makefile
@@ -1,11 +1,13 @@
GV := $(wildcard *.gv)
SVG := $(patsubst %.gv,%.svg,$(GV))
+.DELETE_ON_ERROR:
.PHONY: all
all: $(SVG)
%.svg: %.gv
dot -Tsvg $< > $@
+ @sed -i 's/\r$$//' $@
.PHONY: clean
clean:
diff --git a/chapter11/docs/graph1.gv b/chapter11/docs/graph1.gv
index 74c54fdb..3554a572 100644
--- a/chapter11/docs/graph1.gv
+++ b/chapter11/docs/graph1.gv
@@ -18,11 +18,12 @@ return i;
<TR><TD BGCOLOR="yellow">Start</TD></TR>
<TR><TD>
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">arg</TD><TD PORT="p2">$2</TD></TR>
+ <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">$mem</TD><TD PORT="p2">arg</TD></TR>
</TABLE>
</TD></TR>
</TABLE>>
];
+ MemMerge [ shape=box label="MemMerge" ];
Stop3 [ shape=box style=filled fillcolor=yellow label="Stop" ];
Con_4 [ label="#0" ];
new9 [ label="new S" ];
@@ -44,14 +45,14 @@ return i;
Con_21 [ label="#1" ];
Store22 [ label=".f =" ];
Region23 [ shape=box style=filled fillcolor=yellow label="Region" ];
- Phi_224 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_224 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Return25 [ shape=box style=filled fillcolor=yellow label="Return" ];
{ rank=same; Region23;Phi_224;}
}
edge [ fontname=Helvetica, fontsize=8 ];
Stop3 -> Return25[taillabel=0 color=red];
new9 -> Start2:p0[taillabel=0 color=green];
- Store12 -> Start2:p2[taillabel=1 color=blue];
+ Store12 -> Start2:p1[taillabel=1 color=blue];
Store12 -> new9[taillabel=2];
Store12 -> Con_11[taillabel=3];
new13 -> Start2:p0[taillabel=0 color=green];
@@ -61,7 +62,7 @@ return i;
Load16 -> Store14[taillabel=1 color=blue];
Load16 -> new9[taillabel=2];
If17 -> Start2:p0[taillabel=0 color=red];
- If17 -> Start2:p1[taillabel=1];
+ If17 -> Start2:p2[taillabel=1];
Store22 -> Store14[taillabel=1 color=blue];
Store22 -> new9[taillabel=2];
Store22 -> Con_21[taillabel=3];
@@ -71,6 +72,8 @@ return i;
Phi_224 -> Store22[taillabel=1 color=blue];
Phi_224 -> Store14[taillabel=2 color=blue constraint=false];
Return25 -> Region23[taillabel=0 color=red];
- Return25 -> Load16[taillabel=1];
- Return25 -> Phi_224[taillabel=2 color=blue];
+ Return25 -> Load16[taillabel=2];
+ Return25 -> MemMerge[taillabel=1 color=blue];
+ MemMerge -> Start2:p1[taillabel=1 color=blue];
+ MemMerge -> Phi_224[taillabel=2 color=blue];
}
diff --git a/chapter11/docs/graph1.svg b/chapter11/docs/graph1.svg
index 592db961..422d790e 100644
--- a/chapter11/docs/graph1.svg
+++ b/chapter11/docs/graph1.svg
@@ -1,285 +1,306 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.43.0 (0)
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: chapter11 Pages: 1 -->
-<svg width="336pt" height="636pt"
- viewBox="0.00 0.00 336.00 636.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 632)">
+<svg width="346pt" height="714pt"
+ viewBox="0.00 0.00 346.00 714.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 710)">
<title>chapter11</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-632 332,-632 332,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-710 342,-710 342,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="8,-8 8,-620 320,-620 320,-8 8,-8"/>
+<polygon fill="none" stroke="black" points="8,-8 8,-698 330,-698 330,-8 8,-8"/>
</g>
<!-- Start2 -->
<g id="node1" class="node">
<title>Start2</title>
-<polygon fill="yellow" stroke="transparent" points="198,-583 198,-608 304,-608 304,-583 198,-583"/>
-<polygon fill="none" stroke="black" points="198,-583 198,-608 304,-608 304,-583 198,-583"/>
-<text text-anchor="start" x="232.5" y="-591.8" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="198,-552 198,-583 304,-583 304,-552 198,-552"/>
-<polygon fill="yellow" stroke="transparent" points="203,-557 203,-578 243,-578 243,-557 203,-557"/>
-<polygon fill="none" stroke="black" points="203,-557 203,-578 243,-578 243,-557 203,-557"/>
-<text text-anchor="start" x="206" y="-563.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="243,-557 243,-578 274,-578 274,-557 243,-557"/>
-<text text-anchor="start" x="246" y="-563.8" font-family="Times,serif" font-size="14.00">arg</text>
-<polygon fill="none" stroke="black" points="274,-557 274,-578 299,-578 299,-557 274,-557"/>
-<text text-anchor="start" x="277" y="-563.8" font-family="Times,serif" font-size="14.00">$2</text>
+<polygon fill="yellow" stroke="none" points="207.38,-659.5 207.38,-686 312.62,-686 312.62,-659.5 207.38,-659.5"/>
+<polygon fill="none" stroke="black" points="207.38,-659.5 207.38,-686 312.62,-686 312.62,-659.5 207.38,-659.5"/>
+<text text-anchor="start" x="247.25" y="-667.7" font-family="Times New Roman,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="207.38,-627 207.38,-659.5 312.62,-659.5 312.62,-627 207.38,-627"/>
+<polygon fill="yellow" stroke="none" points="212.38,-632 212.38,-654.5 243.12,-654.5 243.12,-632 212.38,-632"/>
+<polygon fill="none" stroke="black" points="212.38,-632 212.38,-654.5 243.12,-654.5 243.12,-632 212.38,-632"/>
+<text text-anchor="start" x="215.38" y="-638.2" font-family="Times New Roman,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="243.12,-632 243.12,-654.5 284.38,-654.5 284.38,-632 243.12,-632"/>
+<text text-anchor="start" x="246.12" y="-638.2" font-family="Times New Roman,serif" font-size="14.00">$mem</text>
+<polygon fill="none" stroke="black" points="284.38,-632 284.38,-654.5 307.62,-654.5 307.62,-632 284.38,-632"/>
+<text text-anchor="start" x="287.38" y="-638.2" font-family="Times New Roman,serif" font-size="14.00">arg</text>
+</g>
+<!-- MemMerge -->
+<g id="node2" class="node">
+<title>MemMerge</title>
+<polygon fill="none" stroke="black" points="195,-196 113,-196 113,-160 195,-160 195,-196"/>
+<text text-anchor="middle" x="154" y="-172.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+</g>
+<!-- MemMerge&#45;&gt;Start2 -->
+<g id="edge25" class="edge">
+<title>MemMerge&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="blue" d="M174.24,-196.05C184.06,-205.56 195.02,-218.24 201,-232 238.55,-318.39 196.42,-352.07 221,-443 234.8,-494.06 259.62,-499.34 271,-551 277.81,-581.92 266.84,-592.84 264.27,-619.8"/>
+<polygon fill="blue" stroke="blue" points="260.79,-619.34 263.82,-629.49 267.78,-619.66 260.79,-619.34"/>
+<text text-anchor="middle" x="171.99" y="-198.2" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Phi_224 -->
+<g id="node15" class="node">
+<title>Phi_224</title>
+<ellipse fill="lightyellow" stroke="black" cx="139" cy="-250" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="139" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
+</g>
+<!-- MemMerge&#45;&gt;Phi_224 -->
+<g id="edge26" class="edge">
+<title>MemMerge&#45;&gt;Phi_224</title>
+<path fill="none" stroke="blue" d="M150.29,-196.3C148.71,-203.68 146.83,-212.48 145.05,-220.75"/>
+<polygon fill="blue" stroke="blue" points="141.66,-219.9 142.98,-230.42 148.5,-221.37 141.66,-219.9"/>
+<text text-anchor="middle" x="148.04" y="-198.45" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Stop3 -->
-<g id="node2" class="node">
+<g id="node3" class="node">
<title>Stop3</title>
-<polygon fill="yellow" stroke="black" points="210,-52 156,-52 156,-16 210,-16 210,-52"/>
-<text text-anchor="middle" x="183" y="-30.3" font-family="Times,serif" font-size="14.00">Stop</text>
+<polygon fill="yellow" stroke="black" points="181,-52 127,-52 127,-16 181,-16 181,-52"/>
+<text text-anchor="middle" x="154" y="-28.95" font-family="Times New Roman,serif" font-size="14.00">Stop</text>
</g>
<!-- Return25 -->
-<g id="node15" class="node">
+<g id="node16" class="node">
<title>Return25</title>
-<polygon fill="yellow" stroke="black" points="216,-124 150,-124 150,-88 216,-88 216,-124"/>
-<text text-anchor="middle" x="183" y="-102.3" font-family="Times,serif" font-size="14.00">Return</text>
+<polygon fill="yellow" stroke="black" points="181,-124 127,-124 127,-88 181,-88 181,-124"/>
+<text text-anchor="middle" x="154" y="-100.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Stop3&#45;&gt;Return25 -->
<g id="edge1" class="edge">
<title>Stop3&#45;&gt;Return25</title>
-<path fill="none" stroke="red" d="M183,-52.3C183,-60.02 183,-69.29 183,-77.89"/>
-<polygon fill="red" stroke="red" points="179.5,-77.9 183,-87.9 186.5,-77.9 179.5,-77.9"/>
-<text text-anchor="middle" x="180" y="-54.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M154,-52.3C154,-59.59 154,-68.27 154,-76.46"/>
+<polygon fill="red" stroke="red" points="150.5,-76.38 154,-86.38 157.5,-76.38 150.5,-76.38"/>
+<text text-anchor="middle" x="151.75" y="-54.45" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_4 -->
-<g id="node3" class="node">
+<g id="node4" class="node">
<title>Con_4</title>
-<ellipse fill="none" stroke="black" cx="137" cy="-422" rx="27" ry="18"/>
-<text text-anchor="middle" x="137" y="-418.3" font-family="Times,serif" font-size="14.00">#0</text>
+<ellipse fill="none" stroke="black" cx="93" cy="-497" rx="27" ry="18"/>
+<text text-anchor="middle" x="93" y="-491.95" font-family="Times New Roman,serif" font-size="14.00">#0</text>
</g>
<!-- new9 -->
-<g id="node4" class="node">
+<g id="node5" class="node">
<title>new9</title>
-<ellipse fill="none" stroke="black" cx="151" cy="-494" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="151" y="-490.3" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="50" cy="-569" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="50" y="-563.95" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new9&#45;&gt;Start2 -->
<g id="edge2" class="edge">
<title>new9&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M155.04,-512.06C160.38,-530.53 171.62,-558.28 191.99,-565.33"/>
-<polygon fill="green" stroke="green" points="191.56,-568.8 202,-567 192.71,-561.9 191.56,-568.8"/>
-<text text-anchor="middle" x="152.04" y="-514.66" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M68.15,-584.47C94.9,-604.4 147.46,-638.35 200.14,-642.77"/>
+<polygon fill="green" stroke="green" points="199.72,-646.26 209.86,-643.19 200.02,-639.26 199.72,-646.26"/>
+<text text-anchor="middle" x="70.4" y="-586.62" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_11 -->
-<g id="node5" class="node">
+<g id="node6" class="node">
<title>Con_11</title>
-<ellipse fill="none" stroke="black" cx="255" cy="-494" rx="27" ry="18"/>
-<text text-anchor="middle" x="255" y="-490.3" font-family="Times,serif" font-size="14.00">#2</text>
+<ellipse fill="none" stroke="black" cx="149" cy="-569" rx="27" ry="18"/>
+<text text-anchor="middle" x="149" y="-563.95" font-family="Times New Roman,serif" font-size="14.00">#2</text>
</g>
<!-- Store12 -->
-<g id="node6" class="node">
+<g id="node7" class="node">
<title>Store12</title>
-<ellipse fill="none" stroke="black" cx="230" cy="-422" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="230" y="-418.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="165" cy="-497" rx="27" ry="18"/>
+<text text-anchor="middle" x="165" y="-491.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store12&#45;&gt;Start2 -->
<g id="edge3" class="edge">
-<title>Store12&#45;&gt;Start2:p2</title>
-<path fill="none" stroke="blue" d="M222.43,-439.51C215.04,-458.25 206.57,-489.16 219,-512 234.25,-540.04 275.92,-524.64 285.17,-545.89"/>
-<polygon fill="blue" stroke="blue" points="281.77,-546.79 287,-556 288.66,-545.54 281.77,-546.79"/>
-<text text-anchor="middle" x="219.43" y="-442.11" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<title>Store12&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="blue" d="M147.77,-510.96C126.13,-528.81 94,-561.66 113,-587 152.26,-639.35 250.4,-570.87 262.52,-619.62"/>
+<polygon fill="blue" stroke="blue" points="259.03,-619.93 263.59,-629.5 265.99,-619.18 259.03,-619.93"/>
+<text text-anchor="middle" x="145.52" y="-513.11" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Store12&#45;&gt;new9 -->
<g id="edge4" class="edge">
<title>Store12&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M214.01,-437.17C203.14,-446.8 188.53,-459.75 176.11,-470.75"/>
-<polygon fill="black" stroke="black" points="173.5,-468.39 168.33,-477.64 178.14,-473.63 173.5,-468.39"/>
-<text text-anchor="middle" x="211.01" y="-439.77" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M145.49,-509.87C127.95,-520.55 101.87,-536.43 81.39,-548.89"/>
+<polygon fill="black" stroke="black" points="79.58,-545.9 72.86,-554.09 83.22,-551.88 79.58,-545.9"/>
+<text text-anchor="middle" x="147.74" y="-502.27" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store12&#45;&gt;Con_11 -->
<g id="edge5" class="edge">
<title>Store12&#45;&gt;Con_11</title>
-<path fill="none" stroke="black" d="M236.05,-439.95C238.91,-447.94 242.38,-457.67 245.57,-466.6"/>
-<polygon fill="black" stroke="black" points="242.34,-467.97 249,-476.21 248.94,-465.62 242.34,-467.97"/>
-<text text-anchor="middle" x="233.05" y="-442.55" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M161.04,-515.3C159.36,-522.68 157.35,-531.48 155.46,-539.75"/>
+<polygon fill="black" stroke="black" points="152.06,-538.89 153.25,-549.42 158.89,-540.45 152.06,-538.89"/>
+<text text-anchor="middle" x="158.79" y="-517.45" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- new13 -->
-<g id="node7" class="node">
+<g id="node8" class="node">
<title>new13</title>
-<ellipse fill="none" stroke="black" cx="55" cy="-494" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="55" y="-490.3" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="228" cy="-569" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="228" y="-563.95" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new13&#45;&gt;Start2 -->
<g id="edge6" class="edge">
<title>new13&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M72.65,-510.27C97.21,-530 144.07,-562.34 191.81,-566.54"/>
-<polygon fill="green" stroke="green" points="191.85,-570.05 202,-567 192.17,-563.06 191.85,-570.05"/>
-<text text-anchor="middle" x="69.65" y="-512.87" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M227.89,-587.35C227.84,-596.51 227.79,-608.2 227.76,-619.69"/>
+<polygon fill="green" stroke="green" points="224.26,-619.48 227.75,-629.49 231.26,-619.49 224.26,-619.48"/>
+<text text-anchor="middle" x="225.64" y="-589.5" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store14 -->
-<g id="node8" class="node">
+<g id="node9" class="node">
<title>Store14</title>
-<ellipse fill="none" stroke="black" cx="136" cy="-336" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="136" y="-332.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="93" cy="-409.5" rx="27" ry="18"/>
+<text text-anchor="middle" x="93" y="-404.45" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store14&#45;&gt;Con_4 -->
<g id="edge9" class="edge">
<title>Store14&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M136.21,-354.4C136.34,-365.74 136.52,-380.77 136.67,-393.68"/>
-<polygon fill="black" stroke="black" points="133.18,-393.95 136.8,-403.9 140.18,-393.86 133.18,-393.95"/>
-<text text-anchor="middle" x="133.21" y="-357" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M93,-427.8C93,-439.16 93,-454.28 93,-467.4"/>
+<polygon fill="black" stroke="black" points="89.5,-467.21 93,-477.21 96.5,-467.21 89.5,-467.21"/>
+<text text-anchor="middle" x="90.75" y="-429.95" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store14&#45;&gt;Store12 -->
<g id="edge7" class="edge">
<title>Store14&#45;&gt;Store12</title>
-<path fill="none" stroke="blue" d="M151.95,-351.25C166.89,-364.6 189.42,-384.73 206.44,-399.94"/>
-<polygon fill="blue" stroke="blue" points="204.5,-402.91 214.29,-406.96 209.17,-397.69 204.5,-402.91"/>
-<text text-anchor="middle" x="148.95" y="-353.85" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M105.87,-425.79C116.73,-438.67 132.44,-457.34 144.94,-472.18"/>
+<polygon fill="blue" stroke="blue" points="142.15,-474.29 151.26,-479.69 147.5,-469.79 142.15,-474.29"/>
+<text text-anchor="middle" x="103.62" y="-427.94" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Store14&#45;&gt;new13 -->
<g id="edge8" class="edge">
<title>Store14&#45;&gt;new13</title>
-<path fill="none" stroke="black" d="M127.49,-353.24C120.39,-366.8 110.02,-386.65 101,-404 89.97,-425.23 77.52,-449.33 68.35,-467.1"/>
-<polygon fill="black" stroke="black" points="65.1,-465.77 63.63,-476.26 71.32,-468.97 65.1,-465.77"/>
-<text text-anchor="middle" x="124.49" y="-355.84" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M107.31,-425.06C113.63,-431.04 121.35,-437.78 129,-443 158.55,-463.17 177.93,-451.66 201,-479 215.33,-495.99 222.06,-520.44 225.21,-539.41"/>
+<polygon fill="black" stroke="black" points="221.73,-539.76 226.58,-549.18 228.66,-538.79 221.73,-539.76"/>
+<text text-anchor="middle" x="109.56" y="-427.21" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Load16 -->
-<g id="node9" class="node">
+<g id="node10" class="node">
<title>Load16</title>
-<ellipse fill="none" stroke="black" cx="183" cy="-250" rx="27" ry="18"/>
-<text text-anchor="middle" x="183" y="-246.3" font-family="Times,serif" font-size="14.00">.f</text>
+<ellipse fill="none" stroke="black" cx="43" cy="-322" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-316.95" font-family="Times New Roman,serif" font-size="14.00">.f</text>
</g>
<!-- Load16&#45;&gt;new9 -->
<g id="edge11" class="edge">
<title>Load16&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M184.02,-268.21C185.58,-301.74 187.07,-378 173,-440 170.94,-449.08 167.45,-458.59 163.85,-467.01"/>
-<polygon fill="black" stroke="black" points="160.59,-465.75 159.66,-476.3 166.96,-468.63 160.59,-465.75"/>
-<text text-anchor="middle" x="181.02" y="-270.81" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M47,-410.5C36.94,-454.72 41.17,-507.73 45.4,-539.6"/>
+<polygon fill="black" stroke="black" points="41.89,-539.81 46.78,-549.21 48.82,-538.82 41.89,-539.81"/>
+<path fill="none" stroke="black" d="M46.72,-340.02C49.87,-357.49 53,-385.34 47,-408.5"/>
+<text text-anchor="middle" x="44.75" y="-402.9" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Load16&#45;&gt;Store14 -->
<g id="edge10" class="edge">
<title>Load16&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M173.94,-267.2C167.18,-279.28 157.81,-296.02 150.08,-309.84"/>
-<polygon fill="blue" stroke="blue" points="146.86,-308.42 145.03,-318.85 152.97,-311.84 146.86,-308.42"/>
-<text text-anchor="middle" x="170.94" y="-269.8" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M52.4,-339.08C59.55,-351.3 69.53,-368.37 77.81,-382.52"/>
+<polygon fill="blue" stroke="blue" points="74.63,-384.03 82.7,-390.89 80.68,-380.49 74.63,-384.03"/>
+<text text-anchor="middle" x="50.15" y="-341.23" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- If17 -->
-<g id="node10" class="node">
+<g id="node11" class="node">
<title>If17</title>
-<polygon fill="yellow" stroke="transparent" points="210,-339 210,-364 304,-364 304,-339 210,-339"/>
-<polygon fill="none" stroke="black" points="210,-339 210,-364 304,-364 304,-339 210,-339"/>
-<text text-anchor="start" x="251.5" y="-347.8" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="210,-308 210,-339 304,-339 304,-308 210,-308"/>
-<polygon fill="yellow" stroke="transparent" points="215,-313 215,-334 255,-334 255,-313 215,-313"/>
-<polygon fill="none" stroke="black" points="215,-313 215,-334 255,-334 255,-313 215,-313"/>
-<text text-anchor="start" x="218" y="-319.8" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="255,-313 255,-334 299,-334 299,-313 255,-313"/>
-<polygon fill="none" stroke="black" points="255,-313 255,-334 299,-334 299,-313 255,-313"/>
-<text text-anchor="start" x="258" y="-319.8" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="238,-412.5 238,-439 314,-439 314,-412.5 238,-412.5"/>
+<polygon fill="none" stroke="black" points="238,-412.5 238,-439 314,-439 314,-412.5 238,-412.5"/>
+<text text-anchor="start" x="271.5" y="-420.7" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="238,-380 238,-412.5 314,-412.5 314,-380 238,-380"/>
+<polygon fill="yellow" stroke="none" points="243,-385 243,-407.5 274.5,-407.5 274.5,-385 243,-385"/>
+<polygon fill="none" stroke="black" points="243,-385 243,-407.5 274.5,-407.5 274.5,-385 243,-385"/>
+<text text-anchor="start" x="246" y="-391.2" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="274.5,-385 274.5,-407.5 309,-407.5 309,-385 274.5,-385"/>
+<polygon fill="none" stroke="black" points="274.5,-385 274.5,-407.5 309,-407.5 309,-385 274.5,-385"/>
+<text text-anchor="start" x="277.5" y="-391.2" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- If17&#45;&gt;Start2 -->
<g id="edge12" class="edge">
<title>If17&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M274.94,-368.3C293.31,-404.87 315.92,-466.19 291,-512 275.75,-540.04 234.08,-524.64 224.83,-545.89"/>
-<polygon fill="red" stroke="red" points="221.34,-545.54 223,-556 228.23,-546.79 221.34,-545.54"/>
-<text text-anchor="middle" x="271.94" y="-370.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M301,-498C306.79,-539.34 292.85,-551.43 271,-587 261.11,-603.09 244.32,-604.88 234.83,-613.4"/>
+<polygon fill="red" stroke="red" points="231.88,-611.53 229.53,-621.86 237.81,-615.25 231.88,-611.53"/>
+<path fill="none" stroke="red" d="M287.84,-442.9C293,-458.69 298.44,-478.09 301,-496"/>
+<text text-anchor="middle" x="298.75" y="-490.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- If17&#45;&gt;Start2 -->
+<g id="edge13" class="edge">
+<title>If17&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M301,-498C306.61,-537.22 310.42,-547.63 306,-587 304.69,-598.67 301.49,-604.88 299.06,-612.05"/>
+<polygon fill="black" stroke="black" points="295.7,-611.02 296.82,-621.55 302.52,-612.62 295.7,-611.02"/>
+<text text-anchor="middle" x="298.75" y="-500.15" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_21 -->
-<g id="node11" class="node">
+<g id="node12" class="node">
<title>Con_21</title>
-<ellipse fill="none" stroke="black" cx="43" cy="-336" rx="27" ry="18"/>
-<text text-anchor="middle" x="43" y="-332.3" font-family="Times,serif" font-size="14.00">#1</text>
+<ellipse fill="none" stroke="black" cx="165" cy="-409.5" rx="27" ry="18"/>
+<text text-anchor="middle" x="165" y="-404.45" font-family="Times New Roman,serif" font-size="14.00">#1</text>
</g>
<!-- Store22 -->
-<g id="node12" class="node">
+<g id="node13" class="node">
<title>Store22</title>
-<ellipse fill="none" stroke="black" cx="99" cy="-250" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="99" y="-246.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="135" cy="-322" rx="27" ry="18"/>
+<text text-anchor="middle" x="135" y="-316.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store22&#45;&gt;new9 -->
<g id="edge15" class="edge">
<title>Store22&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M95.12,-268.01C88.19,-302.16 76.55,-380.87 101,-440 105.95,-451.96 114.93,-462.83 123.93,-471.57"/>
-<polygon fill="black" stroke="black" points="121.66,-474.24 131.41,-478.38 126.37,-469.06 121.66,-474.24"/>
-<text text-anchor="middle" x="92.12" y="-270.61" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M113.11,-332.75C95.54,-341.64 71.49,-356.38 57,-376 48.02,-388.16 50.79,-393.87 47,-408.5"/>
+<text text-anchor="middle" x="115.36" y="-334.9" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store22&#45;&gt;Store14 -->
<g id="edge14" class="edge">
<title>Store22&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M106.31,-267.6C111.53,-279.45 118.65,-295.62 124.61,-309.15"/>
-<polygon fill="blue" stroke="blue" points="121.47,-310.7 128.71,-318.44 127.88,-307.88 121.47,-310.7"/>
-<text text-anchor="middle" x="103.31" y="-270.2" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M126.9,-339.49C120.98,-351.55 112.81,-368.17 105.98,-382.08"/>
+<polygon fill="blue" stroke="blue" points="103.01,-380.19 101.74,-390.71 109.29,-383.27 103.01,-380.19"/>
+<text text-anchor="middle" x="124.65" y="-341.64" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Store22&#45;&gt;Con_21 -->
<g id="edge16" class="edge">
<title>Store22&#45;&gt;Con_21</title>
-<path fill="none" stroke="black" d="M88.47,-266.8C80.25,-279.12 68.7,-296.45 59.3,-310.55"/>
-<polygon fill="black" stroke="black" points="56.12,-309.01 53.49,-319.27 61.95,-312.89 56.12,-309.01"/>
-<text text-anchor="middle" x="85.47" y="-269.4" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M140.93,-339.89C145.04,-351.6 150.6,-367.46 155.34,-380.98"/>
+<polygon fill="black" stroke="black" points="151.97,-381.94 158.58,-390.21 158.58,-379.62 151.97,-381.94"/>
+<text text-anchor="middle" x="138.68" y="-342.04" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Region23 -->
-<g id="node13" class="node">
+<g id="node14" class="node">
<title>Region23</title>
-<polygon fill="yellow" stroke="black" points="268,-196 202,-196 202,-160 268,-160 268,-196"/>
-<text text-anchor="middle" x="235" y="-174.3" font-family="Times,serif" font-size="14.00">Region</text>
+<polygon fill="yellow" stroke="black" points="285.5,-268 230.5,-268 230.5,-232 285.5,-232 285.5,-268"/>
+<text text-anchor="middle" x="258" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">Region</text>
</g>
<!-- Region23&#45;&gt;If17 -->
<g id="edge17" class="edge">
<title>Region23&#45;&gt;If17:p0</title>
-<path fill="none" stroke="red" d="M235,-196.22C235,-219.49 235,-262.58 235,-301.64"/>
-<polygon fill="red" stroke="red" points="231.5,-302 235,-312 238.5,-302 231.5,-302"/>
-<text text-anchor="middle" x="232" y="-198.82" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
-</g>
-<!-- Region23&#45;&gt;If17 -->
-<g id="edge18" class="edge">
-<title>Region23&#45;&gt;If17:p1</title>
-<path fill="none" stroke="red" d="M244.11,-196.1C255.5,-218.96 273.84,-261.33 276.64,-301.77"/>
-<polygon fill="red" stroke="red" points="273.15,-302.13 277,-312 280.14,-301.88 273.15,-302.13"/>
-<text text-anchor="middle" x="241.11" y="-198.7" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
-</g>
-<!-- Phi_224 -->
-<g id="node14" class="node">
-<title>Phi_224</title>
-<ellipse fill="lightyellow" stroke="black" cx="131" cy="-178" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="131" y="-174.3" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<path fill="none" stroke="red" d="M258.16,-268.22C258.36,-291.29 258.68,-333.85 258.74,-372.64"/>
+<polygon fill="red" stroke="red" points="255.24,-372.49 258.75,-382.49 262.24,-372.48 255.24,-372.49"/>
+<text text-anchor="middle" x="255.91" y="-270.37" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_224&#45;&gt;Store14 -->
<g id="edge21" class="edge">
<title>Phi_224&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M159.11,-187.55C179.74,-195.47 206.28,-209.49 219,-232 237.92,-265.48 196.57,-299.24 165.7,-318.58"/>
-<polygon fill="blue" stroke="blue" points="163.69,-315.71 156.94,-323.87 167.31,-321.7 163.69,-315.71"/>
-<text text-anchor="middle" x="162.11" y="-190.15" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="blue" d="M122.4,-267.57C113.78,-277.31 104.01,-290.37 99,-304 90,-328.5 89.21,-358.4 90.25,-379.93"/>
+<polygon fill="blue" stroke="blue" points="86.75,-379.98 90.9,-389.73 93.73,-379.52 86.75,-379.98"/>
+<text text-anchor="middle" x="120.15" y="-269.72" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_224&#45;&gt;Store22 -->
<g id="edge20" class="edge">
<title>Phi_224&#45;&gt;Store22</title>
-<path fill="none" stroke="blue" d="M123.42,-195.59C119.63,-203.87 114.97,-214.08 110.73,-223.34"/>
-<polygon fill="blue" stroke="blue" points="107.5,-221.98 106.53,-232.53 113.87,-224.89 107.5,-221.98"/>
-<text text-anchor="middle" x="120.42" y="-198.19" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M138.01,-268.3C137.59,-275.59 137.1,-284.27 136.63,-292.46"/>
+<polygon fill="blue" stroke="blue" points="133.14,-292.2 136.06,-302.38 140.13,-292.6 133.14,-292.2"/>
+<text text-anchor="middle" x="135.76" y="-270.45" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_224&#45;&gt;Region23 -->
<g id="edge19" class="edge">
<title>Phi_224&#45;&gt;Region23</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M164.31,-178C173.41,-178 182.5,-178 191.6,-178"/>
-<polygon fill="black" stroke="black" points="191.87,-181.5 201.87,-178 191.87,-174.5 191.87,-181.5"/>
-<text text-anchor="middle" x="167.31" y="-171.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M191.99,-250C200.94,-250 209.88,-250 218.82,-250"/>
+<polygon fill="black" stroke="black" points="218.64,-253.5 228.64,-250 218.64,-246.5 218.64,-253.5"/>
+<text text-anchor="middle" x="194.24" y="-242.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Return25&#45;&gt;MemMerge -->
+<g id="edge24" class="edge">
+<title>Return25&#45;&gt;MemMerge</title>
+<path fill="none" stroke="blue" d="M154,-124.3C154,-131.59 154,-140.27 154,-148.46"/>
+<polygon fill="blue" stroke="blue" points="150.5,-148.38 154,-158.38 157.5,-148.38 150.5,-148.38"/>
+<text text-anchor="middle" x="151.75" y="-126.45" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Return25&#45;&gt;Load16 -->
<g id="edge23" class="edge">
<title>Return25&#45;&gt;Load16</title>
-<path fill="none" stroke="black" d="M183,-124.13C183,-148.33 183,-192.79 183,-221.61"/>
-<polygon fill="black" stroke="black" points="179.5,-221.81 183,-231.81 186.5,-221.81 179.5,-221.81"/>
-<text text-anchor="middle" x="180" y="-126.73" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M134.47,-124.14C124.31,-133.85 112.32,-146.7 104,-160 77.05,-203.06 59,-259.91 49.91,-293.26"/>
+<polygon fill="black" stroke="black" points="46.62,-291.99 47.45,-302.55 53.39,-293.78 46.62,-291.99"/>
+<text text-anchor="middle" x="132.22" y="-126.29" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Return25&#45;&gt;Region23 -->
<g id="edge22" class="edge">
<title>Return25&#45;&gt;Region23</title>
-<path fill="none" stroke="red" d="M195.85,-124.3C202.03,-132.61 209.54,-142.72 216.32,-151.86"/>
-<polygon fill="red" stroke="red" points="213.52,-153.96 222.29,-159.9 219.14,-149.78 213.52,-153.96"/>
-<text text-anchor="middle" x="192.85" y="-126.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
-</g>
-<!-- Return25&#45;&gt;Phi_224 -->
-<g id="edge24" class="edge">
-<title>Return25&#45;&gt;Phi_224</title>
-<path fill="none" stroke="blue" d="M170.15,-124.3C163.79,-132.86 156.01,-143.33 149.07,-152.67"/>
-<polygon fill="blue" stroke="blue" points="146.15,-150.74 142.99,-160.86 151.77,-154.92 146.15,-150.74"/>
-<text text-anchor="middle" x="167.15" y="-126.9" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M172.12,-124.31C182.08,-134.28 194.34,-147.32 204,-160 218.92,-179.59 233.25,-203.54 243.4,-221.66"/>
+<polygon fill="red" stroke="red" points="240.24,-223.18 248.13,-230.25 246.37,-219.8 240.24,-223.18"/>
+<text text-anchor="middle" x="169.87" y="-126.46" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
</g>
</svg>
diff --git a/chapter11/docs/graph2.gv b/chapter11/docs/graph2.gv
index 04d02a3f..730cf845 100644
--- a/chapter11/docs/graph2.gv
+++ b/chapter11/docs/graph2.gv
@@ -18,11 +18,12 @@ return i;
<TR><TD BGCOLOR="yellow">Start</TD></TR>
<TR><TD>
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">arg</TD><TD PORT="p2">$2</TD></TR>
+ <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">$mem</TD><TD PORT="p2">arg</TD></TR>
</TABLE>
</TD></TR>
</TABLE>>
];
+ MemMerge [ shape=box label="MemMerge" ];
Stop3 [ shape=box style=filled fillcolor=yellow label="Stop" ];
Con_4 [ label="#0" ];
new9 [ label="new S" ];
@@ -44,7 +45,7 @@ return i;
Con_21 [ label="#1" ];
Store22 [ label=".f =" ];
Region23 [ shape=box style=filled fillcolor=yellow label="Region" ];
- Phi_224 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_224 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Return25 [ shape=box style=filled fillcolor=yellow label="Return" ];
{ rank=same; Region23;Phi_224;}
}
@@ -52,7 +53,7 @@ return i;
Stop3 -> Return25[taillabel=0 color=red];
new9 -> Start2:p0[taillabel=0 color=green];
Store12 -> Start2:p0[taillabel=0 color=red];
- Store12 -> Start2:p2[taillabel=1 color=blue];
+ Store12 -> Start2:p1[taillabel=1 color=blue];
Store12 -> new9[taillabel=2];
Store12 -> Con_11[taillabel=3];
new13 -> Start2:p0[taillabel=0 color=green];
@@ -64,7 +65,7 @@ return i;
Load16 -> Store14[taillabel=1 color=blue];
Load16 -> new9[taillabel=2];
If17 -> Start2:p0[taillabel=0 color=red];
- If17 -> Start2:p1[taillabel=1];
+ If17 -> Start2:p2[taillabel=1];
Store22 -> Start2:p0[taillabel=0 color=red];
Store22 -> Store14[taillabel=1 color=blue];
Store22 -> new9[taillabel=2];
@@ -75,6 +76,9 @@ return i;
Phi_224 -> Store22[taillabel=1 color=blue];
Phi_224 -> Store14[taillabel=2 color=blue constraint=false];
Return25 -> Region23[taillabel=0 color=red];
- Return25 -> Load16[taillabel=1];
- Return25 -> Phi_224[taillabel=2 color=blue];
+ Return25 -> Load16[taillabel=2];
+ Return25 -> MemMerge[taillabel=1 color=blue];
+ MemMerge -> Start2:p1[taillabel=1 color=blue];
+ MemMerge -> Phi_224[taillabel=2 color=blue];
+ MemMerge -> Region23[taillabel=0 color=green];
}
diff --git a/chapter11/docs/graph2.svg b/chapter11/docs/graph2.svg
index 00f7b594..b8d43cc9 100644
--- a/chapter11/docs/graph2.svg
+++ b/chapter11/docs/graph2.svg
@@ -1,309 +1,335 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.43.0 (0)
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: chapter11 Pages: 1 -->
-<svg width="346pt" height="636pt"
- viewBox="0.00 0.00 346.00 636.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 632)">
+<svg width="358pt" height="714pt"
+ viewBox="0.00 0.00 358.12 714.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 710)">
<title>chapter11</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-632 342,-632 342,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-710 354.12,-710 354.12,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="8,-8 8,-620 330,-620 330,-8 8,-8"/>
+<polygon fill="none" stroke="black" points="10.12,-8 10.12,-698 342.12,-698 342.12,-8 10.12,-8"/>
</g>
<!-- Start2 -->
<g id="node1" class="node">
<title>Start2</title>
-<polygon fill="yellow" stroke="transparent" points="137,-583 137,-608 243,-608 243,-583 137,-583"/>
-<polygon fill="none" stroke="black" points="137,-583 137,-608 243,-608 243,-583 137,-583"/>
-<text text-anchor="start" x="171.5" y="-591.8" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="137,-552 137,-583 243,-583 243,-552 137,-552"/>
-<polygon fill="yellow" stroke="transparent" points="142,-557 142,-578 182,-578 182,-557 142,-557"/>
-<polygon fill="none" stroke="black" points="142,-557 142,-578 182,-578 182,-557 142,-557"/>
-<text text-anchor="start" x="145" y="-563.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="182,-557 182,-578 213,-578 213,-557 182,-557"/>
-<text text-anchor="start" x="185" y="-563.8" font-family="Times,serif" font-size="14.00">arg</text>
-<polygon fill="none" stroke="black" points="213,-557 213,-578 238,-578 238,-557 213,-557"/>
-<text text-anchor="start" x="216" y="-563.8" font-family="Times,serif" font-size="14.00">$2</text>
+<polygon fill="yellow" stroke="none" points="178.5,-659.5 178.5,-686 283.75,-686 283.75,-659.5 178.5,-659.5"/>
+<polygon fill="none" stroke="black" points="178.5,-659.5 178.5,-686 283.75,-686 283.75,-659.5 178.5,-659.5"/>
+<text text-anchor="start" x="218.37" y="-667.7" font-family="Times New Roman,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="178.5,-627 178.5,-659.5 283.75,-659.5 283.75,-627 178.5,-627"/>
+<polygon fill="yellow" stroke="none" points="183.5,-632 183.5,-654.5 214.25,-654.5 214.25,-632 183.5,-632"/>
+<polygon fill="none" stroke="black" points="183.5,-632 183.5,-654.5 214.25,-654.5 214.25,-632 183.5,-632"/>
+<text text-anchor="start" x="186.5" y="-638.2" font-family="Times New Roman,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="214.25,-632 214.25,-654.5 255.5,-654.5 255.5,-632 214.25,-632"/>
+<text text-anchor="start" x="217.25" y="-638.2" font-family="Times New Roman,serif" font-size="14.00">$mem</text>
+<polygon fill="none" stroke="black" points="255.5,-632 255.5,-654.5 278.75,-654.5 278.75,-632 255.5,-632"/>
+<text text-anchor="start" x="258.5" y="-638.2" font-family="Times New Roman,serif" font-size="14.00">arg</text>
+</g>
+<!-- MemMerge -->
+<g id="node2" class="node">
+<title>MemMerge</title>
+<polygon fill="none" stroke="black" points="235.12,-196 153.12,-196 153.12,-160 235.12,-160 235.12,-196"/>
+<text text-anchor="middle" x="194.12" y="-172.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+</g>
+<!-- MemMerge&#45;&gt;Start2 -->
+<g id="edge29" class="edge">
+<title>MemMerge&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="blue" d="M230.64,-196.45C271.82,-218.98 333.12,-262.35 333.12,-321 333.12,-321 333.12,-321 333.12,-498 333.12,-542.32 315.79,-552.37 288.12,-587 271.8,-607.42 244.66,-602.71 236.96,-619.82"/>
+<polygon fill="blue" stroke="blue" points="233.55,-619.04 235.15,-629.51 240.43,-620.33 233.55,-619.04"/>
+<text text-anchor="middle" x="228.39" y="-198.6" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Region23 -->
+<g id="node14" class="node">
+<title>Region23</title>
+<polygon fill="yellow" stroke="black" points="270.62,-268 215.62,-268 215.62,-232 270.62,-232 270.62,-268"/>
+<text text-anchor="middle" x="243.12" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">Region</text>
+</g>
+<!-- MemMerge&#45;&gt;Region23 -->
+<g id="edge31" class="edge">
+<title>MemMerge&#45;&gt;Region23</title>
+<path fill="none" stroke="green" d="M206.23,-196.3C211.81,-204.27 218.55,-213.9 224.74,-222.74"/>
+<polygon fill="green" stroke="green" points="221.68,-224.47 230.28,-230.66 227.41,-220.46 221.68,-224.47"/>
+<text text-anchor="middle" x="203.98" y="-198.45" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Phi_224 -->
+<g id="node15" class="node">
+<title>Phi_224</title>
+<ellipse fill="lightyellow" stroke="black" cx="145.12" cy="-250" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="145.12" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
+</g>
+<!-- MemMerge&#45;&gt;Phi_224 -->
+<g id="edge30" class="edge">
+<title>MemMerge&#45;&gt;Phi_224</title>
+<path fill="none" stroke="blue" d="M182.01,-196.3C176.35,-204.39 169.49,-214.19 163.23,-223.13"/>
+<polygon fill="blue" stroke="blue" points="160.49,-220.94 157.62,-231.14 166.23,-224.95 160.49,-220.94"/>
+<text text-anchor="middle" x="179.76" y="-198.45" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Stop3 -->
-<g id="node2" class="node">
+<g id="node3" class="node">
<title>Stop3</title>
-<polygon fill="yellow" stroke="black" points="176,-52 122,-52 122,-16 176,-16 176,-52"/>
-<text text-anchor="middle" x="149" y="-30.3" font-family="Times,serif" font-size="14.00">Stop</text>
+<polygon fill="yellow" stroke="black" points="136.12,-52 82.12,-52 82.12,-16 136.12,-16 136.12,-52"/>
+<text text-anchor="middle" x="109.12" y="-28.95" font-family="Times New Roman,serif" font-size="14.00">Stop</text>
</g>
<!-- Return25 -->
-<g id="node15" class="node">
+<g id="node16" class="node">
<title>Return25</title>
-<polygon fill="yellow" stroke="black" points="182,-124 116,-124 116,-88 182,-88 182,-124"/>
-<text text-anchor="middle" x="149" y="-102.3" font-family="Times,serif" font-size="14.00">Return</text>
+<polygon fill="yellow" stroke="black" points="136.12,-124 82.12,-124 82.12,-88 136.12,-88 136.12,-124"/>
+<text text-anchor="middle" x="109.12" y="-100.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Stop3&#45;&gt;Return25 -->
<g id="edge1" class="edge">
<title>Stop3&#45;&gt;Return25</title>
-<path fill="none" stroke="red" d="M149,-52.3C149,-60.02 149,-69.29 149,-77.89"/>
-<polygon fill="red" stroke="red" points="145.5,-77.9 149,-87.9 152.5,-77.9 145.5,-77.9"/>
-<text text-anchor="middle" x="146" y="-54.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M109.12,-52.3C109.12,-59.59 109.12,-68.27 109.12,-76.46"/>
+<polygon fill="red" stroke="red" points="105.62,-76.38 109.12,-86.38 112.62,-76.38 105.62,-76.38"/>
+<text text-anchor="middle" x="106.87" y="-54.45" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_4 -->
-<g id="node3" class="node">
+<g id="node4" class="node">
<title>Con_4</title>
-<ellipse fill="none" stroke="black" cx="121" cy="-422" rx="27" ry="18"/>
-<text text-anchor="middle" x="121" y="-418.3" font-family="Times,serif" font-size="14.00">#0</text>
+<ellipse fill="none" stroke="black" cx="85.12" cy="-497" rx="27" ry="18"/>
+<text text-anchor="middle" x="85.12" y="-491.95" font-family="Times New Roman,serif" font-size="14.00">#0</text>
</g>
<!-- new9 -->
-<g id="node4" class="node">
+<g id="node5" class="node">
<title>new9</title>
-<ellipse fill="none" stroke="black" cx="191" cy="-494" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="191" y="-490.3" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="158.12" cy="-569" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="158.12" y="-563.95" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new9&#45;&gt;Start2 -->
<g id="edge2" class="edge">
<title>new9&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M178.53,-511.11C172.27,-520.49 165.49,-533 162.99,-546"/>
-<polygon fill="green" stroke="green" points="159.51,-545.7 162,-556 166.47,-546.4 159.51,-545.7"/>
-<text text-anchor="middle" x="175.53" y="-513.71" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M175.17,-584.76C183.98,-593.73 193.64,-606.07 197.33,-619.77"/>
+<polygon fill="green" stroke="green" points="193.84,-620.07 198.66,-629.5 200.77,-619.12 193.84,-620.07"/>
+<text text-anchor="middle" x="177.42" y="-586.91" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_11 -->
-<g id="node5" class="node">
+<g id="node6" class="node">
<title>Con_11</title>
-<ellipse fill="none" stroke="black" cx="275" cy="-494" rx="27" ry="18"/>
-<text text-anchor="middle" x="275" y="-490.3" font-family="Times,serif" font-size="14.00">#2</text>
+<ellipse fill="none" stroke="black" cx="237.12" cy="-569" rx="27" ry="18"/>
+<text text-anchor="middle" x="237.12" y="-563.95" font-family="Times New Roman,serif" font-size="14.00">#2</text>
</g>
<!-- Store12 -->
-<g id="node6" class="node">
+<g id="node7" class="node">
<title>Store12</title>
-<ellipse fill="none" stroke="black" cx="217" cy="-422" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="217" y="-418.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="200.12" cy="-497" rx="27" ry="18"/>
+<text text-anchor="middle" x="200.12" y="-491.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store12&#45;&gt;Start2 -->
<g id="edge3" class="edge">
<title>Store12&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M239.72,-432.8C270.79,-446.95 322.54,-473.53 321,-493"/>
-<path fill="none" stroke="red" d="M321,-495C315.6,-563.11 190.37,-496.28 166.07,-538.32"/>
-<polygon fill="red" stroke="red" points="162.72,-537.27 162.68,-547.87 169.32,-539.61 162.72,-537.27"/>
-<text text-anchor="middle" x="242.72" y="-435.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M283.12,-570C284.3,-608.41 225.3,-593.17 205.36,-613.49"/>
+<polygon fill="red" stroke="red" points="202.48,-611.47 200.58,-621.89 208.57,-614.92 202.48,-611.47"/>
+<path fill="none" stroke="red" d="M223.33,-506.27C247.55,-516.58 282.16,-536.72 283.12,-568"/>
+<text text-anchor="middle" x="280.87" y="-562.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store12&#45;&gt;new9 -->
<g id="edge5" class="edge">
<title>Store12&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M210.84,-439.59C207.84,-447.66 204.16,-457.57 200.79,-466.65"/>
-<polygon fill="black" stroke="black" points="197.5,-465.45 197.3,-476.04 204.06,-467.89 197.5,-465.45"/>
-<text text-anchor="middle" x="207.84" y="-442.19" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M190.38,-514.24C185.52,-522.33 179.52,-532.34 174.02,-541.51"/>
+<polygon fill="black" stroke="black" points="171.02,-539.69 168.88,-550.07 177.03,-543.29 171.02,-539.69"/>
+<text text-anchor="middle" x="188.13" y="-516.39" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store12&#45;&gt;Con_11 -->
<g id="edge6" class="edge">
<title>Store12&#45;&gt;Con_11</title>
-<path fill="none" stroke="black" d="M229.59,-438.19C237.26,-447.45 247.23,-459.48 255.86,-469.91"/>
-<polygon fill="black" stroke="black" points="253.36,-472.37 262.44,-477.84 258.75,-467.91 253.36,-472.37"/>
-<text text-anchor="middle" x="226.59" y="-440.79" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M208.7,-514.24C213.05,-522.45 218.42,-532.63 223.33,-541.91"/>
+<polygon fill="black" stroke="black" points="220.11,-543.31 227.88,-550.51 226.3,-540.04 220.11,-543.31"/>
+<text text-anchor="middle" x="206.45" y="-516.39" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- new13 -->
-<g id="node7" class="node">
+<g id="node8" class="node">
<title>new13</title>
-<ellipse fill="none" stroke="black" cx="75" cy="-494" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="75" y="-490.3" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="72.12" cy="-569" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="72.12" y="-563.95" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new13&#45;&gt;Start2 -->
<g id="edge7" class="edge">
<title>new13&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M81.73,-512.06C90.25,-530.86 106.79,-559.28 130.97,-565.69"/>
-<polygon fill="green" stroke="green" points="130.63,-569.17 141,-567 131.54,-562.23 130.63,-569.17"/>
-<text text-anchor="middle" x="78.73" y="-514.66" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M84.9,-585.89C102,-605.42 134.45,-636.66 171.03,-642.35"/>
+<polygon fill="green" stroke="green" points="170.74,-645.84 180.99,-643.13 171.29,-638.86 170.74,-645.84"/>
+<text text-anchor="middle" x="82.65" y="-588.04" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store14 -->
-<g id="node8" class="node">
+<g id="node9" class="node">
<title>Store14</title>
-<ellipse fill="none" stroke="black" cx="74" cy="-336" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="74" y="-332.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="65.12" cy="-409.5" rx="27" ry="18"/>
+<text text-anchor="middle" x="65.12" y="-404.45" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store14&#45;&gt;Start2 -->
<g id="edge8" class="edge">
<title>Store14&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M75,-423C81.23,-454.16 104.2,-450.38 123,-476 125.09,-478.85 144.12,-515.97 154.8,-538.72"/>
-<polygon fill="red" stroke="red" points="151.69,-540.34 159.03,-547.99 158.06,-537.44 151.69,-540.34"/>
-<text text-anchor="middle" x="72" y="-416.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M39.12,-498C35.91,-530.2 3.02,-539.93 19.12,-568"/>
+<path fill="none" stroke="red" d="M57.93,-427.13C51.12,-444.08 41.58,-471.3 39.12,-496"/>
+<text text-anchor="middle" x="36.87" y="-490.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store14&#45;&gt;Con_4 -->
<g id="edge11" class="edge">
<title>Store14&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M83.06,-353.2C89.82,-365.28 99.19,-382.02 106.92,-395.84"/>
-<polygon fill="black" stroke="black" points="104.03,-397.84 111.97,-404.85 110.14,-394.42 104.03,-397.84"/>
-<text text-anchor="middle" x="80.06" y="-355.8" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M69.07,-427.39C71.77,-438.91 75.4,-454.44 78.53,-467.81"/>
+<polygon fill="black" stroke="black" points="75.08,-468.44 80.76,-477.38 81.89,-466.84 75.08,-468.44"/>
+<text text-anchor="middle" x="66.82" y="-429.54" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store14&#45;&gt;Store12 -->
<g id="edge9" class="edge">
<title>Store14&#45;&gt;Store12</title>
-<path fill="none" stroke="blue" d="M91.16,-350.58C98.61,-356.24 107.55,-362.71 116,-368 138.6,-382.16 165.37,-396.08 185.67,-406.11"/>
-<polygon fill="blue" stroke="blue" points="184.27,-409.32 194.79,-410.56 187.34,-403.03 184.27,-409.32"/>
-<text text-anchor="middle" x="88.16" y="-353.18" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M84.18,-422.57C106.99,-437.02 145.41,-461.35 171.73,-478.02"/>
+<polygon fill="blue" stroke="blue" points="169.56,-480.79 179.88,-483.18 173.31,-474.88 169.56,-480.79"/>
+<text text-anchor="middle" x="86.43" y="-424.72" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Store14&#45;&gt;new13 -->
<g id="edge10" class="edge">
<title>Store14&#45;&gt;new13</title>
-<path fill="none" stroke="black" d="M72.36,-354.25C71.17,-371.36 70.46,-398.26 75,-421"/>
-<path fill="none" stroke="black" d="M75,-423C77.77,-436.87 78.02,-452.6 77.47,-465.63"/>
-<polygon fill="black" stroke="black" points="73.97,-465.65 76.86,-475.84 80.95,-466.07 73.97,-465.65"/>
-<text text-anchor="middle" x="69.36" y="-356.85" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M39.12,-498C37.54,-513.82 44.48,-529.98 52.39,-542.78"/>
+<polygon fill="black" stroke="black" points="49.45,-544.68 57.96,-551 55.25,-540.75 49.45,-544.68"/>
+<text text-anchor="middle" x="36.87" y="-500.15" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Load16 -->
-<g id="node9" class="node">
+<g id="node10" class="node">
<title>Load16</title>
-<ellipse fill="none" stroke="black" cx="74" cy="-250" rx="27" ry="18"/>
-<text text-anchor="middle" x="74" y="-246.3" font-family="Times,serif" font-size="14.00">.f</text>
+<ellipse fill="none" stroke="black" cx="45.12" cy="-322" rx="27" ry="18"/>
+<text text-anchor="middle" x="45.12" y="-316.95" font-family="Times New Roman,serif" font-size="14.00">.f</text>
</g>
<!-- Load16&#45;&gt;Start2 -->
<g id="edge12" class="edge">
<title>Load16&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M60.29,-266C52.02,-276 42.12,-289.86 37,-304 19.23,-353.07 6.22,-373.12 27,-421"/>
-<path fill="none" stroke="red" d="M27,-423C42.75,-459.29 5.97,-478.5 27,-512 52.69,-552.92 76.85,-564.12 118.8,-566.47"/>
-<polygon fill="red" stroke="red" points="118.8,-569.97 128.93,-566.86 119.08,-562.98 118.8,-569.97"/>
-<text text-anchor="middle" x="57.29" y="-268.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M37.1,-339.54C18.2,-381.13 -24.39,-492.12 19.12,-568"/>
+<path fill="none" stroke="red" d="M19.12,-570C23.95,-577.31 22.39,-581.38 29.12,-587 78.43,-628.14 103.69,-640.51 159.1,-642.82"/>
+<polygon fill="red" stroke="red" points="158.99,-646.32 169.09,-643.11 159.19,-639.32 158.99,-646.32"/>
+<text text-anchor="middle" x="34.85" y="-341.69" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Load16&#45;&gt;new9 -->
<g id="edge14" class="edge">
<title>Load16&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M27,-423C37.2,-446.5 102.74,-468.87 147.82,-481.75"/>
-<polygon fill="black" stroke="black" points="147.08,-485.18 157.66,-484.5 148.97,-478.44 147.08,-485.18"/>
-<text text-anchor="middle" x="24" y="-416.6" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M63.11,-335.98C75.41,-345.72 91.23,-360.08 101.12,-376 109.09,-388.84 106.98,-393.97 111.12,-408.5"/>
+<path fill="none" stroke="black" d="M111.12,-410.5C124.08,-456.01 139.97,-508.64 149.56,-540.08"/>
+<polygon fill="black" stroke="black" points="146.19,-541.04 152.46,-549.58 152.89,-538.99 146.19,-541.04"/>
+<text text-anchor="middle" x="60.86" y="-338.13" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Load16&#45;&gt;Store14 -->
<g id="edge13" class="edge">
<title>Load16&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M74,-268.4C74,-279.74 74,-294.77 74,-307.68"/>
-<polygon fill="blue" stroke="blue" points="70.5,-307.9 74,-317.9 77.5,-307.9 70.5,-307.9"/>
-<text text-anchor="middle" x="71" y="-271" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M49.07,-339.89C51.77,-351.41 55.4,-366.94 58.53,-380.31"/>
+<polygon fill="blue" stroke="blue" points="55.08,-380.94 60.76,-389.88 61.89,-379.34 55.08,-380.94"/>
+<text text-anchor="middle" x="46.82" y="-342.04" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- If17 -->
-<g id="node10" class="node">
+<g id="node11" class="node">
<title>If17</title>
-<polygon fill="yellow" stroke="transparent" points="220,-339 220,-364 314,-364 314,-339 220,-339"/>
-<polygon fill="none" stroke="black" points="220,-339 220,-364 314,-364 314,-339 220,-339"/>
-<text text-anchor="start" x="261.5" y="-347.8" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="220,-308 220,-339 314,-339 314,-308 220,-308"/>
-<polygon fill="yellow" stroke="transparent" points="225,-313 225,-334 265,-334 265,-313 225,-313"/>
-<polygon fill="none" stroke="black" points="225,-313 225,-334 265,-334 265,-313 225,-313"/>
-<text text-anchor="start" x="228" y="-319.8" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="265,-313 265,-334 309,-334 309,-313 265,-313"/>
-<polygon fill="none" stroke="black" points="265,-313 265,-334 309,-334 309,-313 265,-313"/>
-<text text-anchor="start" x="268" y="-319.8" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="230.12,-412.5 230.12,-439 306.12,-439 306.12,-412.5 230.12,-412.5"/>
+<polygon fill="none" stroke="black" points="230.12,-412.5 230.12,-439 306.12,-439 306.12,-412.5 230.12,-412.5"/>
+<text text-anchor="start" x="263.62" y="-420.7" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="230.12,-380 230.12,-412.5 306.12,-412.5 306.12,-380 230.12,-380"/>
+<polygon fill="yellow" stroke="none" points="235.12,-385 235.12,-407.5 266.62,-407.5 266.62,-385 235.12,-385"/>
+<polygon fill="none" stroke="black" points="235.12,-385 235.12,-407.5 266.62,-407.5 266.62,-385 235.12,-385"/>
+<text text-anchor="start" x="238.12" y="-391.2" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="266.62,-385 266.62,-407.5 301.12,-407.5 301.12,-385 266.62,-385"/>
+<polygon fill="none" stroke="black" points="266.62,-385 266.62,-407.5 301.12,-407.5 301.12,-385 266.62,-385"/>
+<text text-anchor="start" x="269.62" y="-391.2" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- If17&#45;&gt;Start2 -->
<g id="edge15" class="edge">
<title>If17&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M258.27,-368.06C255.35,-385.41 255.35,-406.41 267,-421"/>
-<text text-anchor="middle" x="255.27" y="-370.66" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M263.95,-442.76C262.88,-459.03 263.19,-478.88 268.12,-496"/>
+<text text-anchor="middle" x="261.7" y="-444.91" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_21 -->
-<g id="node11" class="node">
+<g id="node12" class="node">
<title>Con_21</title>
-<ellipse fill="none" stroke="black" cx="167" cy="-336" rx="27" ry="18"/>
-<text text-anchor="middle" x="167" y="-332.3" font-family="Times,serif" font-size="14.00">#1</text>
+<ellipse fill="none" stroke="black" cx="157.12" cy="-409.5" rx="27" ry="18"/>
+<text text-anchor="middle" x="157.12" y="-404.45" font-family="Times New Roman,serif" font-size="14.00">#1</text>
</g>
<!-- Store22 -->
-<g id="node12" class="node">
+<g id="node13" class="node">
<title>Store22</title>
-<ellipse fill="none" stroke="black" cx="149" cy="-250" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="149" y="-246.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="117.12" cy="-322" rx="27" ry="18"/>
+<text text-anchor="middle" x="117.12" y="-316.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store22&#45;&gt;Start2 -->
<g id="edge17" class="edge">
<title>Store22&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M121,-337C124.72,-350.99 120.62,-357.9 131,-368 171.82,-407.72 207.03,-371.77 254,-404 261.84,-409.38 261.07,-413.57 267,-421"/>
-<path fill="none" stroke="red" d="M267,-423C291.51,-453.71 324.1,-453.83 321,-493"/>
-<text text-anchor="middle" x="118" y="-330.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M138.84,-333.04C155.95,-342.01 179.17,-356.71 193.12,-376 211.33,-401.18 196.96,-416.46 213.12,-443 230.78,-471.99 258.72,-463.38 268.12,-496"/>
+<path fill="none" stroke="red" d="M268.12,-498C276.93,-528.57 282.14,-536.2 283.12,-568"/>
+<text text-anchor="middle" x="136.59" y="-335.19" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store22&#45;&gt;new9 -->
<g id="edge19" class="edge">
<title>Store22&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M138.02,-266.62C127.62,-283.37 114.49,-310.8 121,-335"/>
-<path fill="none" stroke="black" d="M121,-337C124.76,-350.98 124.46,-355.08 131,-368 139.92,-385.61 147.62,-386.63 157,-404 167.83,-424.05 176.84,-448.28 182.87,-466.4"/>
-<polygon fill="black" stroke="black" points="179.57,-467.59 185.98,-476.03 186.23,-465.43 179.57,-467.59"/>
-<text text-anchor="middle" x="135.02" y="-269.22" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M112.54,-340.07C108.62,-357.58 104.56,-385.46 111.12,-408.5"/>
+<text text-anchor="middle" x="110.29" y="-342.22" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store22&#45;&gt;Store14 -->
<g id="edge18" class="edge">
<title>Store22&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M135.59,-266.02C124.07,-278.92 107.3,-297.71 94.16,-312.42"/>
-<polygon fill="blue" stroke="blue" points="91.34,-310.32 87.29,-320.11 96.56,-314.98 91.34,-310.32"/>
-<text text-anchor="middle" x="132.59" y="-268.62" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M107.34,-339.08C99.86,-351.38 89.4,-368.59 80.76,-382.79"/>
+<polygon fill="blue" stroke="blue" points="77.85,-380.83 75.64,-391.2 83.83,-384.47 77.85,-380.83"/>
+<text text-anchor="middle" x="105.09" y="-341.23" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Store22&#45;&gt;Con_21 -->
<g id="edge20" class="edge">
<title>Store22&#45;&gt;Con_21</title>
-<path fill="none" stroke="black" d="M152.64,-268C155.11,-279.5 158.41,-294.93 161.23,-308.08"/>
-<polygon fill="black" stroke="black" points="157.85,-308.98 163.36,-318.03 164.69,-307.52 157.85,-308.98"/>
-<text text-anchor="middle" x="149.64" y="-270.6" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
-</g>
-<!-- Region23 -->
-<g id="node13" class="node">
-<title>Region23</title>
-<polygon fill="yellow" stroke="black" points="269,-196 203,-196 203,-160 269,-160 269,-196"/>
-<text text-anchor="middle" x="236" y="-174.3" font-family="Times,serif" font-size="14.00">Region</text>
+<path fill="none" stroke="black" d="M124.83,-339.49C130.39,-351.36 138,-367.64 144.44,-381.4"/>
+<polygon fill="black" stroke="black" points="141.25,-382.83 148.65,-390.4 147.59,-379.86 141.25,-382.83"/>
+<text text-anchor="middle" x="122.58" y="-341.64" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Region23&#45;&gt;If17 -->
<g id="edge21" class="edge">
<title>Region23&#45;&gt;If17:p0</title>
-<path fill="none" stroke="red" d="M237.91,-196.19C240.33,-219.44 244.28,-262.49 244.91,-301.62"/>
-<polygon fill="red" stroke="red" points="241.42,-302.03 245,-312 248.42,-301.97 241.42,-302.03"/>
-<text text-anchor="middle" x="234.91" y="-198.79" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M244.76,-268.2C246.83,-291.25 250.19,-333.78 250.78,-372.63"/>
+<polygon fill="red" stroke="red" points="247.28,-372.51 250.86,-382.49 254.28,-372.46 247.28,-372.51"/>
+<text text-anchor="middle" x="242.51" y="-270.35" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region23&#45;&gt;If17 -->
<g id="edge22" class="edge">
<title>Region23&#45;&gt;If17:p1</title>
-<path fill="none" stroke="red" d="M249.35,-196.26C256.45,-206.22 264.76,-219.26 270,-232 282.41,-262.21 286.24,-273.37 286.89,-301.69"/>
-<polygon fill="red" stroke="red" points="283.4,-302.04 287,-312 290.4,-301.96 283.4,-302.04"/>
-<text text-anchor="middle" x="246.35" y="-198.86" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
-</g>
-<!-- Phi_224 -->
-<g id="node14" class="node">
-<title>Phi_224</title>
-<ellipse fill="lightyellow" stroke="black" cx="149" cy="-178" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="149" y="-174.3" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<path fill="none" stroke="red" d="M252.57,-268.22C257.8,-278.38 264.05,-291.63 268.12,-304 278.15,-334.53 282.78,-345.32 283.7,-372.64"/>
+<polygon fill="red" stroke="red" points="280.19,-372.54 283.85,-382.49 287.19,-372.43 280.19,-372.54"/>
+<text text-anchor="middle" x="250.32" y="-270.37" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_224&#45;&gt;Store14 -->
<g id="edge25" class="edge">
<title>Phi_224&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M163.74,-194.16C179.64,-212.44 200.82,-243.72 186,-268 167.78,-297.86 145.73,-285.55 116,-304 110.44,-307.45 104.68,-311.42 99.27,-315.34"/>
-<polygon fill="blue" stroke="blue" points="97.08,-312.61 91.14,-321.38 101.25,-318.23 97.08,-312.61"/>
-<text text-anchor="middle" x="160.74" y="-196.76" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="blue" d="M151.73,-268.04C157.85,-286.71 164.45,-317.05 153.12,-340 141.47,-363.59 126.88,-359.83 106.12,-376 101.11,-379.91 95.77,-384.11 90.66,-388.15"/>
+<polygon fill="blue" stroke="blue" points="88.67,-385.26 83.01,-394.21 93.02,-390.74 88.67,-385.26"/>
+<text text-anchor="middle" x="149.48" y="-270.19" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_224&#45;&gt;Store22 -->
<g id="edge24" class="edge">
<title>Phi_224&#45;&gt;Store22</title>
-<path fill="none" stroke="blue" d="M149,-196.3C149,-204.02 149,-213.29 149,-221.89"/>
-<polygon fill="blue" stroke="blue" points="145.5,-221.9 149,-231.9 152.5,-221.9 145.5,-221.9"/>
-<text text-anchor="middle" x="146" y="-198.9" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M138.2,-268.3C135.14,-275.96 131.46,-285.15 128.04,-293.7"/>
+<polygon fill="blue" stroke="blue" points="124.8,-292.39 124.33,-302.97 131.3,-294.99 124.8,-292.39"/>
+<text text-anchor="middle" x="135.95" y="-270.45" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_224&#45;&gt;Region23 -->
<g id="edge23" class="edge">
<title>Phi_224&#45;&gt;Region23</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M182.3,-178C185.73,-178 189.16,-178 192.58,-178"/>
-<polygon fill="black" stroke="black" points="192.86,-181.5 202.86,-178 192.86,-174.5 192.86,-181.5"/>
-<text text-anchor="middle" x="185.3" y="-171.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M198.33,-250C200.17,-250 202.01,-250 203.84,-250"/>
+<polygon fill="black" stroke="black" points="203.61,-253.5 213.61,-250 203.61,-246.5 203.61,-253.5"/>
+<text text-anchor="middle" x="200.58" y="-242.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Return25&#45;&gt;MemMerge -->
+<g id="edge28" class="edge">
+<title>Return25&#45;&gt;MemMerge</title>
+<path fill="none" stroke="blue" d="M130.13,-124.3C140.45,-132.8 153.06,-143.19 164.35,-152.49"/>
+<polygon fill="blue" stroke="blue" points="161.94,-155.04 171.89,-158.69 166.39,-149.63 161.94,-155.04"/>
+<text text-anchor="middle" x="127.88" y="-126.45" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Return25&#45;&gt;Load16 -->
<g id="edge27" class="edge">
<title>Return25&#45;&gt;Load16</title>
-<path fill="none" stroke="black" d="M133.12,-124.15C124.54,-134.07 114.25,-147.11 107,-160 95.8,-179.9 87.06,-204.34 81.39,-222.56"/>
-<polygon fill="black" stroke="black" points="78.01,-221.66 78.49,-232.24 84.71,-223.67 78.01,-221.66"/>
-<text text-anchor="middle" x="130.12" y="-126.75" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M73.12,-179C81.32,-218.99 67.84,-265.4 56.89,-293.98"/>
+<polygon fill="black" stroke="black" points="53.76,-292.38 53.29,-302.96 60.26,-294.99 53.76,-292.38"/>
+<path fill="none" stroke="black" d="M92.26,-124.39C81.14,-137.97 69.27,-157.7 73.12,-177"/>
+<text text-anchor="middle" x="70.87" y="-171.4" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Return25&#45;&gt;Region23 -->
<g id="edge26" class="edge">
<title>Return25&#45;&gt;Region23</title>
-<path fill="none" stroke="red" d="M170.51,-124.3C181.46,-133.12 194.95,-143.97 206.82,-153.53"/>
-<polygon fill="red" stroke="red" points="204.76,-156.35 214.74,-159.9 209.14,-150.9 204.76,-156.35"/>
-<text text-anchor="middle" x="167.51" y="-126.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
-</g>
-<!-- Return25&#45;&gt;Phi_224 -->
-<g id="edge28" class="edge">
-<title>Return25&#45;&gt;Phi_224</title>
-<path fill="none" stroke="blue" d="M149,-124.3C149,-132.02 149,-141.29 149,-149.89"/>
-<polygon fill="blue" stroke="blue" points="145.5,-149.9 149,-159.9 152.5,-149.9 145.5,-149.9"/>
-<text text-anchor="middle" x="146" y="-126.9" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M73.12,-179C85.3,-238.43 141.92,-209.98 204.75,-231.55"/>
+<polygon fill="red" stroke="red" points="203.29,-234.74 213.88,-235.09 205.83,-228.21 203.29,-234.74"/>
+<text text-anchor="middle" x="70.87" y="-181.15" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
</g>
</svg>
diff --git a/chapter11/docs/graph3.gv b/chapter11/docs/graph3.gv
index c47ac565..d89d0ed4 100644
--- a/chapter11/docs/graph3.gv
+++ b/chapter11/docs/graph3.gv
@@ -18,11 +18,12 @@ return i;
<TR><TD BGCOLOR="yellow">Start</TD></TR>
<TR><TD>
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">arg</TD><TD PORT="p2">$2</TD></TR>
+ <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">$mem</TD><TD PORT="p2">arg</TD></TR>
</TABLE>
</TD></TR>
</TABLE>>
];
+ MemMerge [ shape=box label="MemMerge" ];
Stop3 [ shape=box style=filled fillcolor=yellow label="Stop" ];
Con_4 [ label="#0" ];
new9 [ label="new S" ];
@@ -44,7 +45,7 @@ return i;
Con_21 [ label="#1" ];
Store22 [ label=".f =" ];
Region23 [ shape=box style=filled fillcolor=yellow label="Region" ];
- Phi_224 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_224 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Return25 [ shape=box style=filled fillcolor=yellow label="Return" ];
{ rank=same; Region23;Phi_224;}
}
@@ -52,7 +53,7 @@ return i;
Stop3 -> Return25[taillabel=0 color=red];
new9 -> Start2:p0[taillabel=0 color=green];
Store12 -> Start2:p0[taillabel=0 color=red];
- Store12 -> Start2:p2[taillabel=1 color=blue];
+ Store12 -> Start2:p1[taillabel=1 color=blue];
Store12 -> new9[taillabel=2];
Store12 -> Con_11[taillabel=3];
new13 -> Start2:p0[taillabel=0 color=green];
@@ -64,7 +65,7 @@ return i;
Load16 -> Store14[taillabel=1 color=blue];
Load16 -> new9[taillabel=2];
If17 -> Start2:p0[taillabel=0 color=red];
- If17 -> Start2:p1[taillabel=1];
+ If17 -> Start2:p2[taillabel=1];
Store22 -> If17:p0[taillabel=0 color=red];
Store22 -> Store14[taillabel=1 color=blue];
Store22 -> new9[taillabel=2];
@@ -76,6 +77,9 @@ return i;
Phi_224 -> Store22[taillabel=1 color=blue];
Phi_224 -> Store14[taillabel=2 color=blue constraint=false];
Return25 -> Region23[taillabel=0 color=red];
- Return25 -> Load16[taillabel=1];
- Return25 -> Phi_224[taillabel=2 color=blue];
+ Return25 -> Load16[taillabel=2];
+ Return25 -> MemMerge[taillabel=1 color=blue];
+ MemMerge -> Start2:p1[taillabel=1 color=blue];
+ MemMerge -> Phi_224[taillabel=2 color=blue];
+ MemMerge -> Region23[taillabel=0 color=green];
}
diff --git a/chapter11/docs/graph3.svg b/chapter11/docs/graph3.svg
index e017c4af..a16a1733 100644
--- a/chapter11/docs/graph3.svg
+++ b/chapter11/docs/graph3.svg
@@ -1,316 +1,348 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.43.0 (0)
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: chapter11 Pages: 1 -->
-<svg width="346pt" height="708pt"
- viewBox="0.00 0.00 346.00 708.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 704)">
+<svg width="356pt" height="786pt"
+ viewBox="0.00 0.00 356.00 786.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 782)">
<title>chapter11</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-704 342,-704 342,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-782 352,-782 352,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="8,-8 8,-692 330,-692 330,-8 8,-8"/>
+<polygon fill="none" stroke="black" points="8,-8 8,-770 340,-770 340,-8 8,-8"/>
</g>
<!-- Start2 -->
<g id="node1" class="node">
<title>Start2</title>
-<polygon fill="yellow" stroke="transparent" points="137,-655 137,-680 243,-680 243,-655 137,-655"/>
-<polygon fill="none" stroke="black" points="137,-655 137,-680 243,-680 243,-655 137,-655"/>
-<text text-anchor="start" x="171.5" y="-663.8" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="137,-624 137,-655 243,-655 243,-624 137,-624"/>
-<polygon fill="yellow" stroke="transparent" points="142,-629 142,-650 182,-650 182,-629 142,-629"/>
-<polygon fill="none" stroke="black" points="142,-629 142,-650 182,-650 182,-629 142,-629"/>
-<text text-anchor="start" x="145" y="-635.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="182,-629 182,-650 213,-650 213,-629 182,-629"/>
-<text text-anchor="start" x="185" y="-635.8" font-family="Times,serif" font-size="14.00">arg</text>
-<polygon fill="none" stroke="black" points="213,-629 213,-650 238,-650 238,-629 213,-629"/>
-<text text-anchor="start" x="216" y="-635.8" font-family="Times,serif" font-size="14.00">$2</text>
+<polygon fill="yellow" stroke="none" points="218.38,-731.5 218.38,-758 323.62,-758 323.62,-731.5 218.38,-731.5"/>
+<polygon fill="none" stroke="black" points="218.38,-731.5 218.38,-758 323.62,-758 323.62,-731.5 218.38,-731.5"/>
+<text text-anchor="start" x="258.25" y="-739.7" font-family="Times New Roman,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="218.38,-699 218.38,-731.5 323.62,-731.5 323.62,-699 218.38,-699"/>
+<polygon fill="yellow" stroke="none" points="223.38,-704 223.38,-726.5 254.12,-726.5 254.12,-704 223.38,-704"/>
+<polygon fill="none" stroke="black" points="223.38,-704 223.38,-726.5 254.12,-726.5 254.12,-704 223.38,-704"/>
+<text text-anchor="start" x="226.38" y="-710.2" font-family="Times New Roman,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="254.12,-704 254.12,-726.5 295.38,-726.5 295.38,-704 254.12,-704"/>
+<text text-anchor="start" x="257.12" y="-710.2" font-family="Times New Roman,serif" font-size="14.00">$mem</text>
+<polygon fill="none" stroke="black" points="295.38,-704 295.38,-726.5 318.62,-726.5 318.62,-704 295.38,-704"/>
+<text text-anchor="start" x="298.38" y="-710.2" font-family="Times New Roman,serif" font-size="14.00">arg</text>
+</g>
+<!-- MemMerge -->
+<g id="node2" class="node">
+<title>MemMerge</title>
+<polygon fill="none" stroke="black" points="234,-196 152,-196 152,-160 234,-160 234,-196"/>
+<text text-anchor="middle" x="193" y="-172.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+</g>
+<!-- MemMerge&#45;&gt;Start2 -->
+<g id="edge30" class="edge">
+<title>MemMerge&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="blue" d="M234.18,-194.39C253.1,-203.11 274.68,-215.59 290,-232 319.72,-263.83 331,-277.45 331,-321 331,-321 331,-321 331,-498 331,-538.11 326.09,-548.18 316,-587 309.95,-610.27 282.67,-661.11 276.15,-691.66"/>
+<polygon fill="blue" stroke="blue" points="272.69,-691.14 274.94,-701.5 279.64,-692 272.69,-691.14"/>
+<text text-anchor="middle" x="236.43" y="-186.79" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Region23 -->
+<g id="node14" class="node">
+<title>Region23</title>
+<polygon fill="yellow" stroke="black" points="280.5,-268 225.5,-268 225.5,-232 280.5,-232 280.5,-268"/>
+<text text-anchor="middle" x="253" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">Region</text>
+</g>
+<!-- MemMerge&#45;&gt;Region23 -->
+<g id="edge32" class="edge">
+<title>MemMerge&#45;&gt;Region23</title>
+<path fill="none" stroke="green" d="M207.83,-196.3C214.81,-204.44 223.27,-214.31 230.97,-223.3"/>
+<polygon fill="green" stroke="green" points="228.19,-225.43 237.35,-230.75 233.5,-220.88 228.19,-225.43"/>
+<text text-anchor="middle" x="205.58" y="-198.45" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Phi_224 -->
+<g id="node15" class="node">
+<title>Phi_224</title>
+<ellipse fill="lightyellow" stroke="black" cx="155" cy="-250" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="155" y="-244.95" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
+</g>
+<!-- MemMerge&#45;&gt;Phi_224 -->
+<g id="edge31" class="edge">
+<title>MemMerge&#45;&gt;Phi_224</title>
+<path fill="none" stroke="blue" d="M183.61,-196.3C179.42,-204.02 174.39,-213.29 169.72,-221.89"/>
+<polygon fill="blue" stroke="blue" points="166.7,-220.11 165.01,-230.57 172.85,-223.45 166.7,-220.11"/>
+<text text-anchor="middle" x="181.36" y="-198.45" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Stop3 -->
-<g id="node2" class="node">
+<g id="node3" class="node">
<title>Stop3</title>
-<polygon fill="yellow" stroke="black" points="186,-52 132,-52 132,-16 186,-16 186,-52"/>
-<text text-anchor="middle" x="159" y="-30.3" font-family="Times,serif" font-size="14.00">Stop</text>
+<polygon fill="yellow" stroke="black" points="220,-52 166,-52 166,-16 220,-16 220,-52"/>
+<text text-anchor="middle" x="193" y="-28.95" font-family="Times New Roman,serif" font-size="14.00">Stop</text>
</g>
<!-- Return25 -->
-<g id="node15" class="node">
+<g id="node16" class="node">
<title>Return25</title>
-<polygon fill="yellow" stroke="black" points="192,-124 126,-124 126,-88 192,-88 192,-124"/>
-<text text-anchor="middle" x="159" y="-102.3" font-family="Times,serif" font-size="14.00">Return</text>
+<polygon fill="yellow" stroke="black" points="220,-124 166,-124 166,-88 220,-88 220,-124"/>
+<text text-anchor="middle" x="193" y="-100.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Stop3&#45;&gt;Return25 -->
<g id="edge1" class="edge">
<title>Stop3&#45;&gt;Return25</title>
-<path fill="none" stroke="red" d="M159,-52.3C159,-60.02 159,-69.29 159,-77.89"/>
-<polygon fill="red" stroke="red" points="155.5,-77.9 159,-87.9 162.5,-77.9 155.5,-77.9"/>
-<text text-anchor="middle" x="156" y="-54.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M193,-52.3C193,-59.59 193,-68.27 193,-76.46"/>
+<polygon fill="red" stroke="red" points="189.5,-76.38 193,-86.38 196.5,-76.38 189.5,-76.38"/>
+<text text-anchor="middle" x="190.75" y="-54.45" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_4 -->
-<g id="node3" class="node">
+<g id="node4" class="node">
<title>Con_4</title>
-<ellipse fill="none" stroke="black" cx="87" cy="-494" rx="27" ry="18"/>
-<text text-anchor="middle" x="87" y="-490.3" font-family="Times,serif" font-size="14.00">#0</text>
+<ellipse fill="none" stroke="black" cx="235" cy="-569" rx="27" ry="18"/>
+<text text-anchor="middle" x="235" y="-563.95" font-family="Times New Roman,serif" font-size="14.00">#0</text>
</g>
<!-- new9 -->
-<g id="node4" class="node">
+<g id="node5" class="node">
<title>new9</title>
-<ellipse fill="none" stroke="black" cx="191" cy="-566" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="191" y="-562.3" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="70" cy="-641" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="70" y="-635.95" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new9&#45;&gt;Start2 -->
<g id="edge2" class="edge">
<title>new9&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M178.53,-583.11C172.27,-592.49 165.49,-605 162.99,-618"/>
-<polygon fill="green" stroke="green" points="159.51,-617.7 162,-628 166.47,-618.4 159.51,-617.7"/>
-<text text-anchor="middle" x="175.53" y="-585.71" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M87.44,-656.82C112.58,-676.72 161.43,-710.12 211.1,-714.72"/>
+<polygon fill="green" stroke="green" points="210.71,-718.2 220.86,-715.18 211.04,-711.21 210.71,-718.2"/>
+<text text-anchor="middle" x="89.69" y="-658.97" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_11 -->
-<g id="node5" class="node">
+<g id="node6" class="node">
<title>Con_11</title>
-<ellipse fill="none" stroke="black" cx="275" cy="-566" rx="27" ry="18"/>
-<text text-anchor="middle" x="275" y="-562.3" font-family="Times,serif" font-size="14.00">#2</text>
+<ellipse fill="none" stroke="black" cx="235" cy="-641" rx="27" ry="18"/>
+<text text-anchor="middle" x="235" y="-635.95" font-family="Times New Roman,serif" font-size="14.00">#2</text>
</g>
<!-- Store12 -->
-<g id="node6" class="node">
+<g id="node7" class="node">
<title>Store12</title>
-<ellipse fill="none" stroke="black" cx="256" cy="-494" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="256" y="-490.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="163" cy="-569" rx="27" ry="18"/>
+<text text-anchor="middle" x="163" y="-563.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store12&#45;&gt;Start2 -->
<g id="edge3" class="edge">
<title>Store12&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M278.09,-505.5C299.78,-517.5 328.59,-538.88 321,-565"/>
-<path fill="none" stroke="red" d="M321,-567C301.92,-632.61 187.71,-567.79 165.68,-610.25"/>
-<polygon fill="red" stroke="red" points="162.32,-609.27 162.62,-619.86 168.99,-611.39 162.32,-609.27"/>
-<text text-anchor="middle" x="281.09" y="-508.1" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M184.74,-580.27C215.27,-594.76 267.54,-619.8 271,-623 277.43,-628.96 279.81,-631.32 281,-640"/>
+<path fill="none" stroke="red" d="M281,-642C284.46,-667.2 257.45,-670.2 244.91,-685.38"/>
+<polygon fill="red" stroke="red" points="241.97,-683.46 240.43,-693.94 248.17,-686.71 241.97,-683.46"/>
+<text text-anchor="middle" x="182.49" y="-582.42" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store12&#45;&gt;new9 -->
<g id="edge5" class="edge">
<title>Store12&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M242.22,-509.85C233.66,-519.06 222.49,-531.09 212.76,-541.57"/>
-<polygon fill="black" stroke="black" points="209.91,-539.49 205.67,-549.2 215.04,-544.26 209.91,-539.49"/>
-<text text-anchor="middle" x="239.22" y="-512.45" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M145.51,-583.17C132.17,-593.2 113.54,-607.23 98.12,-618.83"/>
+<polygon fill="black" stroke="black" points="96.11,-615.97 90.22,-624.78 100.32,-621.56 96.11,-615.97"/>
+<text text-anchor="middle" x="143.26" y="-585.32" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store12&#45;&gt;Con_11 -->
<g id="edge6" class="edge">
<title>Store12&#45;&gt;Con_11</title>
-<path fill="none" stroke="black" d="M260.6,-511.95C262.75,-519.86 265.35,-529.46 267.76,-538.31"/>
-<polygon fill="black" stroke="black" points="264.45,-539.48 270.44,-548.21 271.2,-537.64 264.45,-539.48"/>
-<text text-anchor="middle" x="257.6" y="-514.55" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M177.92,-584.5C187.77,-594.08 200.86,-606.81 212.03,-617.66"/>
+<polygon fill="black" stroke="black" points="209.41,-620 219.02,-624.46 214.29,-614.98 209.41,-620"/>
+<text text-anchor="middle" x="175.67" y="-586.65" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- new13 -->
-<g id="node7" class="node">
+<g id="node8" class="node">
<title>new13</title>
-<ellipse fill="none" stroke="black" cx="75" cy="-566" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="75" y="-562.3" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="156" cy="-641" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="156" y="-635.95" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new13&#45;&gt;Start2 -->
<g id="edge7" class="edge">
<title>new13&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M81.73,-584.06C90.25,-602.86 106.79,-631.28 130.97,-637.69"/>
-<polygon fill="green" stroke="green" points="130.63,-641.17 141,-639 131.54,-634.23 130.63,-641.17"/>
-<text text-anchor="middle" x="78.73" y="-586.66" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M162.55,-658.99C170.89,-677.84 187.18,-706.54 211.2,-713.63"/>
+<polygon fill="green" stroke="green" points="210.48,-717.06 220.88,-715.03 211.48,-710.13 210.48,-717.06"/>
+<text text-anchor="middle" x="160.3" y="-661.14" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store14 -->
-<g id="node8" class="node">
+<g id="node9" class="node">
<title>Store14</title>
-<ellipse fill="none" stroke="black" cx="133" cy="-422" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="133" y="-418.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="182" cy="-497" rx="27" ry="18"/>
+<text text-anchor="middle" x="182" y="-491.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store14&#45;&gt;Start2 -->
<g id="edge8" class="edge">
<title>Store14&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M133,-495C125.43,-534.08 132.78,-545.53 143,-584 146.42,-596.87 152.99,-602.52 157.44,-610.16"/>
-<polygon fill="red" stroke="red" points="154.26,-611.64 161.18,-619.66 160.77,-609.07 154.26,-611.64"/>
-<text text-anchor="middle" x="130" y="-488.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M205.98,-505.45C226.83,-513.27 255.99,-527.73 271,-551 292.57,-584.45 275.58,-600.57 281,-640"/>
+<text text-anchor="middle" x="203.73" y="-507.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store14&#45;&gt;Con_4 -->
<g id="edge11" class="edge">
<title>Store14&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M122.56,-438.88C116.8,-447.66 109.52,-458.74 103.04,-468.58"/>
-<polygon fill="black" stroke="black" points="99.96,-466.9 97.4,-477.18 105.81,-470.74 99.96,-466.9"/>
-<text text-anchor="middle" x="119.56" y="-441.48" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M193.76,-513.54C200.42,-522.33 208.89,-533.52 216.43,-543.47"/>
+<polygon fill="black" stroke="black" points="213.53,-545.44 222.36,-551.3 219.11,-541.22 213.53,-545.44"/>
+<text text-anchor="middle" x="191.51" y="-515.69" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store14&#45;&gt;Store12 -->
<g id="edge9" class="edge">
<title>Store14&#45;&gt;Store12</title>
-<path fill="none" stroke="blue" d="M153.31,-434.56C173.34,-445.96 204.16,-463.5 226.81,-476.39"/>
-<polygon fill="blue" stroke="blue" points="225.24,-479.52 235.66,-481.42 228.7,-473.44 225.24,-479.52"/>
-<text text-anchor="middle" x="150.31" y="-437.16" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M177.4,-514.95C175.35,-522.51 172.87,-531.63 170.56,-540.15"/>
+<polygon fill="blue" stroke="blue" points="167.2,-539.18 167.95,-549.75 173.95,-541.02 167.2,-539.18"/>
+<text text-anchor="middle" x="175.15" y="-517.1" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Store14&#45;&gt;new13 -->
<g id="edge10" class="edge">
<title>Store14&#45;&gt;new13</title>
-<path fill="none" stroke="black" d="M134.81,-440.15C135.88,-454.43 136.45,-475.22 133,-493"/>
-<path fill="none" stroke="black" d="M133,-495C129.28,-514.17 115.61,-531.16 102.48,-543.6"/>
-<polygon fill="black" stroke="black" points="100.01,-541.11 94.89,-550.38 104.68,-546.33 100.01,-541.11"/>
-<text text-anchor="middle" x="131.81" y="-442.75" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M162.83,-510.26C150.03,-519.67 134.26,-533.91 127,-551 118.14,-571.85 127.53,-596.39 137.92,-614.41"/>
+<polygon fill="black" stroke="black" points="134.8,-616.02 143.05,-622.65 140.74,-612.32 134.8,-616.02"/>
+<text text-anchor="middle" x="160.58" y="-512.41" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Load16 -->
-<g id="node9" class="node">
+<g id="node10" class="node">
<title>Load16</title>
-<ellipse fill="none" stroke="black" cx="53" cy="-336" rx="27" ry="18"/>
-<text text-anchor="middle" x="53" y="-332.3" font-family="Times,serif" font-size="14.00">.f</text>
+<ellipse fill="none" stroke="black" cx="43" cy="-409.5" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-404.45" font-family="Times New Roman,serif" font-size="14.00">.f</text>
</g>
<!-- Load16&#45;&gt;Start2 -->
<g id="edge12" class="edge">
<title>Load16&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M47.25,-353.59C38.09,-382.82 22.94,-444.94 41,-493"/>
-<path fill="none" stroke="red" d="M41,-495C50.66,-517.36 30.14,-523.84 27,-548 24.94,-563.87 18.49,-570.45 27,-584 52.69,-624.92 76.85,-636.12 118.8,-638.47"/>
-<polygon fill="red" stroke="red" points="118.8,-641.97 128.93,-638.86 119.08,-634.98 118.8,-641.97"/>
-<text text-anchor="middle" x="44.25" y="-356.19" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M49.4,-427.07C59.67,-455.78 77.82,-516.65 69,-568"/>
+<path fill="none" stroke="red" d="M69,-570C64.24,-599.68 36.88,-594.62 27,-623 21.74,-638.11 17.38,-646.22 27,-659 50.34,-690 144.38,-709.24 199.08,-714.06"/>
+<polygon fill="red" stroke="red" points="198.71,-717.54 208.93,-714.77 199.21,-710.56 198.71,-717.54"/>
+<text text-anchor="middle" x="47.15" y="-429.22" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Load16&#45;&gt;new9 -->
<g id="edge14" class="edge">
<title>Load16&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M41,-495C44.08,-503.21 44.3,-506.35 51,-512 66.3,-524.9 113.87,-541.46 149.33,-552.61"/>
-<polygon fill="black" stroke="black" points="148.39,-555.98 158.98,-555.6 150.47,-549.3 148.39,-555.98"/>
-<text text-anchor="middle" x="38" y="-488.6" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M69,-570C66.69,-583.43 66.6,-598.53 67.22,-611.26"/>
+<polygon fill="black" stroke="black" points="63.72,-611.35 67.89,-621.09 70.7,-610.88 63.72,-611.35"/>
+<text text-anchor="middle" x="66.75" y="-562.4" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Load16&#45;&gt;Store14 -->
<g id="edge13" class="edge">
<title>Load16&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M66.93,-351.63C79.36,-364.68 97.74,-383.97 111.95,-398.9"/>
-<polygon fill="blue" stroke="blue" points="109.53,-401.43 118.96,-406.25 114.59,-396.6 109.53,-401.43"/>
-<text text-anchor="middle" x="63.93" y="-354.23" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M62.33,-422.39C85.88,-436.87 125.88,-461.48 153.09,-478.22"/>
+<polygon fill="blue" stroke="blue" points="151.2,-481.16 161.55,-483.42 154.86,-475.2 151.2,-481.16"/>
+<text text-anchor="middle" x="64.58" y="-424.54" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- If17 -->
-<g id="node10" class="node">
+<g id="node11" class="node">
<title>If17</title>
-<polygon fill="yellow" stroke="transparent" points="218,-339 218,-364 312,-364 312,-339 218,-339"/>
-<polygon fill="none" stroke="black" points="218,-339 218,-364 312,-364 312,-339 218,-339"/>
-<text text-anchor="start" x="259.5" y="-347.8" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="218,-308 218,-339 312,-339 312,-308 218,-308"/>
-<polygon fill="yellow" stroke="transparent" points="223,-313 223,-334 263,-334 263,-313 223,-313"/>
-<polygon fill="none" stroke="black" points="223,-313 223,-334 263,-334 263,-313 223,-313"/>
-<text text-anchor="start" x="226" y="-319.8" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="263,-313 263,-334 307,-334 307,-313 263,-313"/>
-<polygon fill="none" stroke="black" points="263,-313 263,-334 307,-334 307,-313 263,-313"/>
-<text text-anchor="start" x="266" y="-319.8" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="228,-412.5 228,-439 304,-439 304,-412.5 228,-412.5"/>
+<polygon fill="none" stroke="black" points="228,-412.5 228,-439 304,-439 304,-412.5 228,-412.5"/>
+<text text-anchor="start" x="261.5" y="-420.7" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="228,-380 228,-412.5 304,-412.5 304,-380 228,-380"/>
+<polygon fill="yellow" stroke="none" points="233,-385 233,-407.5 264.5,-407.5 264.5,-385 233,-385"/>
+<polygon fill="none" stroke="black" points="233,-385 233,-407.5 264.5,-407.5 264.5,-385 233,-385"/>
+<text text-anchor="start" x="236" y="-391.2" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="264.5,-385 264.5,-407.5 299,-407.5 299,-385 264.5,-385"/>
+<polygon fill="none" stroke="black" points="264.5,-385 264.5,-407.5 299,-407.5 299,-385 264.5,-385"/>
+<text text-anchor="start" x="267.5" y="-391.2" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- If17&#45;&gt;Start2 -->
<g id="edge15" class="edge">
<title>If17&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M283.07,-368.2C306.27,-412.32 341.25,-495.33 321,-565"/>
-<text text-anchor="middle" x="280.07" y="-370.8" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M311,-570C308.67,-603.77 276.11,-606.51 281,-640"/>
+<path fill="none" stroke="red" d="M282.37,-442.96C296.46,-474.31 314.08,-523.46 311,-568"/>
+<text text-anchor="middle" x="308.75" y="-562.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- If17&#45;&gt;Start2 -->
+<g id="edge16" class="edge">
+<title>If17&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M311,-570C310.66,-622.18 307.81,-639.78 307.14,-683.82"/>
+<polygon fill="black" stroke="black" points="303.64,-683.74 307.04,-693.78 310.64,-683.81 303.64,-683.74"/>
+<text text-anchor="middle" x="308.75" y="-572.15" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_21 -->
-<g id="node11" class="node">
+<g id="node12" class="node">
<title>Con_21</title>
-<ellipse fill="none" stroke="black" cx="125" cy="-336" rx="27" ry="18"/>
-<text text-anchor="middle" x="125" y="-332.3" font-family="Times,serif" font-size="14.00">#1</text>
+<ellipse fill="none" stroke="black" cx="155" cy="-409.5" rx="27" ry="18"/>
+<text text-anchor="middle" x="155" y="-404.45" font-family="Times New Roman,serif" font-size="14.00">#1</text>
</g>
<!-- Store22 -->
-<g id="node12" class="node">
+<g id="node13" class="node">
<title>Store22</title>
-<ellipse fill="none" stroke="black" cx="159" cy="-250" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="159" y="-246.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="155" cy="-322" rx="27" ry="18"/>
+<text text-anchor="middle" x="155" y="-316.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store22&#45;&gt;new9 -->
<g id="edge19" class="edge">
<title>Store22&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M191,-337C192.12,-409.45 191.64,-494.88 191.27,-537.67"/>
-<polygon fill="black" stroke="black" points="187.77,-537.81 191.18,-547.84 194.77,-537.87 187.77,-537.81"/>
-<text text-anchor="middle" x="188" y="-330.6" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M137.84,-335.86C126.26,-345.54 111.73,-359.88 104,-376 93.96,-396.94 78.72,-547.81 72.64,-611.62"/>
+<polygon fill="black" stroke="black" points="69.18,-611.02 71.72,-621.31 76.15,-611.68 69.18,-611.02"/>
+<text text-anchor="middle" x="135.59" y="-338.01" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store22&#45;&gt;Store14 -->
<g id="edge18" class="edge">
<title>Store22&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M168.96,-267.05C178.21,-283.46 190.61,-310.03 191,-335"/>
-<path fill="none" stroke="blue" d="M191,-337C191.39,-361.97 173.77,-384.91 157.85,-400.48"/>
-<polygon fill="blue" stroke="blue" points="155.22,-398.15 150.26,-407.51 159.98,-403.28 155.22,-398.15"/>
-<text text-anchor="middle" x="165.96" y="-269.65" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M168.75,-337.93C176.96,-347.9 186.62,-361.75 191,-376 200.34,-406.37 195.4,-443.02 189.86,-467.76"/>
+<polygon fill="blue" stroke="blue" points="186.48,-466.85 187.51,-477.4 193.28,-468.51 186.48,-466.85"/>
+<text text-anchor="middle" x="166.5" y="-340.08" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Store22&#45;&gt;Load16 -->
<g id="edge21" class="edge">
<title>Store22&#45;&gt;Load16</title>
-<path fill="none" stroke="black" d="M141.22,-263.98C126.92,-274.53 106.43,-289.92 89,-304 84.86,-307.35 80.51,-310.98 76.33,-314.54"/>
-<polygon fill="black" stroke="black" points="73.89,-312.03 68.59,-321.2 78.45,-317.33 73.89,-312.03"/>
-<text text-anchor="middle" x="138.22" y="-266.58" font-family="Helvetica,sans-Serif" font-size="8.00">4</text>
+<path fill="none" stroke="black" d="M137.39,-335.93C122.95,-346.57 102.04,-362.12 84,-376 78.96,-379.88 73.61,-384.06 68.5,-388.1"/>
+<polygon fill="black" stroke="black" points="66.51,-385.21 60.86,-394.17 70.86,-390.69 66.51,-385.21"/>
+<text text-anchor="middle" x="139.64" y="-338.08" font-family="Helvetica,sans-Serif" font-size="8.00">4</text>
</g>
<!-- Store22&#45;&gt;If17 -->
<g id="edge17" class="edge">
<title>Store22&#45;&gt;If17:p0</title>
-<path fill="none" stroke="red" d="M170.65,-266.62C182.83,-282.67 201.77,-306.77 213.47,-317.51"/>
-<polygon fill="red" stroke="red" points="211.7,-320.53 222,-323 215.49,-314.64 211.7,-320.53"/>
-<text text-anchor="middle" x="173.65" y="-269.22" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M169.18,-337.47C184.82,-353.32 209.52,-378.02 222.95,-389.7"/>
+<polygon fill="red" stroke="red" points="220.62,-392.34 230.77,-395.36 224.72,-386.67 220.62,-392.34"/>
+<text text-anchor="middle" x="171.43" y="-339.62" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store22&#45;&gt;Con_21 -->
<g id="edge20" class="edge">
<title>Store22&#45;&gt;Con_21</title>
-<path fill="none" stroke="black" d="M152.28,-267.6C147.49,-279.45 140.94,-295.62 135.46,-309.15"/>
-<polygon fill="black" stroke="black" points="132.21,-307.86 131.7,-318.44 138.7,-310.48 132.21,-307.86"/>
-<text text-anchor="middle" x="149.28" y="-270.2" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
-</g>
-<!-- Region23 -->
-<g id="node13" class="node">
-<title>Region23</title>
-<polygon fill="yellow" stroke="black" points="276,-196 210,-196 210,-160 276,-160 276,-196"/>
-<text text-anchor="middle" x="243" y="-174.3" font-family="Times,serif" font-size="14.00">Region</text>
+<path fill="none" stroke="black" d="M155,-340.3C155,-351.66 155,-366.78 155,-379.9"/>
+<polygon fill="black" stroke="black" points="151.5,-379.71 155,-389.71 158.5,-379.71 151.5,-379.71"/>
+<text text-anchor="middle" x="152.75" y="-342.45" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Region23&#45;&gt;If17 -->
<g id="edge22" class="edge">
<title>Region23&#45;&gt;If17:p0</title>
-<path fill="none" stroke="red" d="M243,-196.22C243,-219.49 243,-262.58 243,-301.64"/>
-<polygon fill="red" stroke="red" points="239.5,-302 243,-312 246.5,-302 239.5,-302"/>
-<text text-anchor="middle" x="240" y="-198.82" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M252.1,-268.21C250.96,-291.28 249.12,-333.83 248.8,-372.64"/>
+<polygon fill="red" stroke="red" points="245.3,-372.47 248.76,-382.49 252.3,-372.5 245.3,-372.47"/>
+<text text-anchor="middle" x="249.85" y="-270.36" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region23&#45;&gt;If17 -->
<g id="edge23" class="edge">
<title>Region23&#45;&gt;If17:p1</title>
-<path fill="none" stroke="red" d="M252.84,-196.18C258.29,-206.33 264.79,-219.58 269,-232 279.46,-262.85 284.04,-273.57 284.86,-301.73"/>
-<polygon fill="red" stroke="red" points="281.37,-302.05 285,-312 288.37,-301.95 281.37,-302.05"/>
-<text text-anchor="middle" x="249.84" y="-198.78" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
-</g>
-<!-- Phi_224 -->
-<g id="node14" class="node">
-<title>Phi_224</title>
-<ellipse fill="lightyellow" stroke="black" cx="159" cy="-178" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="159" y="-174.3" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<path fill="none" stroke="red" d="M259.4,-268.46C262.95,-278.7 267.2,-291.95 270,-304 277.21,-335.04 280.87,-345.68 281.61,-372.75"/>
+<polygon fill="red" stroke="red" points="278.11,-372.53 281.73,-382.49 285.11,-372.44 278.11,-372.53"/>
+<text text-anchor="middle" x="257.15" y="-270.61" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_224&#45;&gt;Store14 -->
<g id="edge26" class="edge">
<title>Phi_224&#45;&gt;Store14</title>
-<path fill="none" stroke="blue" d="M173.5,-194.31C181.86,-204.22 191.56,-217.87 196,-232 200.8,-247.26 198.68,-252.23 196,-268 192.06,-291.21 170.41,-346.42 161,-368 156.97,-377.25 151.97,-387.09 147.32,-395.75"/>
-<polygon fill="blue" stroke="blue" points="144.21,-394.15 142.48,-404.6 150.35,-397.51 144.21,-394.15"/>
-<text text-anchor="middle" x="170.5" y="-196.91" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="blue" d="M170.61,-267.54C186.09,-286.03 205.55,-316.46 191,-340 172.19,-370.43 137.81,-345.57 119,-376 103.34,-401.33 106.43,-416 119,-443 125.92,-457.87 139.3,-470.06 151.95,-478.98"/>
+<polygon fill="blue" stroke="blue" points="149.82,-481.77 160.1,-484.33 153.66,-475.91 149.82,-481.77"/>
+<text text-anchor="middle" x="168.36" y="-269.69" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_224&#45;&gt;Store22 -->
<g id="edge25" class="edge">
<title>Phi_224&#45;&gt;Store22</title>
-<path fill="none" stroke="blue" d="M159,-196.3C159,-204.02 159,-213.29 159,-221.89"/>
-<polygon fill="blue" stroke="blue" points="155.5,-221.9 159,-231.9 162.5,-221.9 155.5,-221.9"/>
-<text text-anchor="middle" x="156" y="-198.9" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M155,-268.3C155,-275.59 155,-284.27 155,-292.46"/>
+<polygon fill="blue" stroke="blue" points="151.5,-292.38 155,-302.38 158.5,-292.38 151.5,-292.38"/>
+<text text-anchor="middle" x="152.75" y="-270.45" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_224&#45;&gt;Region23 -->
<g id="edge24" class="edge">
<title>Phi_224&#45;&gt;Region23</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M192.47,-178C194.91,-178 197.35,-178 199.8,-178"/>
-<polygon fill="black" stroke="black" points="199.84,-181.5 209.84,-178 199.84,-174.5 199.84,-181.5"/>
-<text text-anchor="middle" x="195.47" y="-171.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M208.21,-250C210.05,-250 211.89,-250 213.72,-250"/>
+<polygon fill="black" stroke="black" points="213.49,-253.5 223.49,-250 213.49,-246.5 213.49,-253.5"/>
+<text text-anchor="middle" x="210.46" y="-242.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Return25&#45;&gt;MemMerge -->
+<g id="edge29" class="edge">
+<title>Return25&#45;&gt;MemMerge</title>
+<path fill="none" stroke="blue" d="M193,-124.3C193,-131.59 193,-140.27 193,-148.46"/>
+<polygon fill="blue" stroke="blue" points="189.5,-148.38 193,-158.38 196.5,-148.38 189.5,-148.38"/>
+<text text-anchor="middle" x="190.75" y="-126.45" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Return25&#45;&gt;Load16 -->
<g id="edge28" class="edge">
<title>Return25&#45;&gt;Load16</title>
-<path fill="none" stroke="black" d="M143.1,-124.14C134.51,-134.05 124.23,-147.09 117,-160 89.5,-209.12 69.82,-272.31 60.03,-307.76"/>
-<polygon fill="black" stroke="black" points="56.54,-307.25 57.31,-317.82 63.3,-309.08 56.54,-307.25"/>
-<text text-anchor="middle" x="140.1" y="-126.74" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M175.65,-124.07C165.7,-134.18 153.2,-147.43 143,-160 118.45,-190.25 109.65,-196.78 93,-232 69.52,-281.67 54.98,-344.54 48,-380.27"/>
+<polygon fill="black" stroke="black" points="44.61,-379.32 46.19,-389.8 51.49,-380.62 44.61,-379.32"/>
+<text text-anchor="middle" x="173.4" y="-126.22" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Return25&#45;&gt;Region23 -->
<g id="edge27" class="edge">
<title>Return25&#45;&gt;Region23</title>
-<path fill="none" stroke="red" d="M179.76,-124.3C190.24,-133.03 203.11,-143.76 214.5,-153.25"/>
-<polygon fill="red" stroke="red" points="212.55,-156.18 222.47,-159.9 217.03,-150.81 212.55,-156.18"/>
-<text text-anchor="middle" x="176.76" y="-126.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
-</g>
-<!-- Return25&#45;&gt;Phi_224 -->
-<g id="edge29" class="edge">
-<title>Return25&#45;&gt;Phi_224</title>
-<path fill="none" stroke="blue" d="M159,-124.3C159,-132.02 159,-141.29 159,-149.89"/>
-<polygon fill="blue" stroke="blue" points="155.5,-149.9 159,-159.9 162.5,-149.9 155.5,-149.9"/>
-<text text-anchor="middle" x="156" y="-126.9" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M214.94,-124.32C225.23,-133.72 236.62,-146.23 243,-160 251.76,-178.89 254.09,-202.36 254.32,-220.46"/>
+<polygon fill="red" stroke="red" points="250.82,-220.19 254.22,-230.23 257.82,-220.26 250.82,-220.19"/>
+<text text-anchor="middle" x="212.69" y="-126.47" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
</g>
</svg>
diff --git a/chapter11/docs/graph4.gv b/chapter11/docs/graph4.gv
index f6958ccb..cf622aa1 100644
--- a/chapter11/docs/graph4.gv
+++ b/chapter11/docs/graph4.gv
@@ -21,11 +21,12 @@ return v;
<TR><TD BGCOLOR="yellow">Start</TD></TR>
<TR><TD>
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">arg</TD><TD PORT="p2">$2</TD></TR>
+ <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">$mem</TD><TD PORT="p2">arg</TD></TR>
</TABLE>
</TD></TR>
</TABLE>>
];
+ MemMerge [ shape=box label="MemMerge" ];
Stop3 [ shape=box style=filled fillcolor=yellow label="Stop" ];
Con_4 [ label="#0" ];
new9 [ label="new S" ];
@@ -57,10 +58,10 @@ return v;
</TD></TR>
</TABLE>>
];
- Phi_230 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_230 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Store31 [ label=".f =" ];
Region32 [ shape=box style=filled fillcolor=yellow label="Region" ];
- Phi_233 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_233 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Sub35 [ label="-" ];
Con_36 [ label="#1" ];
Return37 [ shape=box style=filled fillcolor=yellow label="Return" ];
@@ -70,19 +71,19 @@ return v;
edge [ fontname=Helvetica, fontsize=8 ];
Stop3 -> Return37[taillabel=0 color=red];
new9 -> Start2:p0[taillabel=0 color=green];
- Store10 -> Start2:p2[taillabel=1 color=blue];
+ Store10 -> Start2:p1[taillabel=1 color=blue];
Store10 -> new9[taillabel=2];
Store10 -> Con_4[taillabel=3];
Loop11 -> Start2:p0[taillabel=1 color=red];
Loop11 -> Region32[taillabel=2 color=red constraint=false];
Phi_arg13 -> Loop11 [style=dotted taillabel=0];
- Phi_arg13 -> Start2:p1[taillabel=1];
+ Phi_arg13 -> Start2:p2[taillabel=1];
Phi_arg13 -> Sub35[taillabel=2 constraint=false];
LT14 -> Con_4[taillabel=1];
LT14 -> Phi_arg13[taillabel=2];
If16 -> Loop11[taillabel=0 color=red];
If16 -> LT14[taillabel=1];
- Div21 -> Start2:p1[taillabel=1];
+ Div21 -> Start2:p2[taillabel=1];
Div21 -> Con_22[taillabel=2];
EQ23 -> Phi_arg13[taillabel=1];
EQ23 -> Con_24[taillabel=2];
@@ -102,6 +103,8 @@ return v;
Sub35 -> Phi_arg13[taillabel=1];
Sub35 -> Con_36[taillabel=2];
Return37 -> If16:p1[taillabel=0 color=red];
- Return37 -> new9[taillabel=1];
- Return37 -> Phi_230[taillabel=2 color=blue];
+ Return37 -> new9[taillabel=2];
+ Return37 -> MemMerge[taillabel=1 color=blue];
+ MemMerge -> Start2:p1[taillabel=1 color=blue];
+ MemMerge -> Phi_230[taillabel=2 color=blue];
}
diff --git a/chapter11/docs/graph4.svg b/chapter11/docs/graph4.svg
index 7f392664..2730813a 100644
--- a/chapter11/docs/graph4.svg
+++ b/chapter11/docs/graph4.svg
@@ -1,408 +1,429 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.43.0 (0)
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: chapter11 Pages: 1 -->
-<svg width="454pt" height="680pt"
- viewBox="0.00 0.00 454.00 680.14" 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 676.14)">
+<svg width="510pt" height="689pt"
+ viewBox="0.00 0.00 510.00 688.57" 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 684.57)">
<title>chapter11</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-676.14 450,-676.14 450,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-684.57 506,-684.57 506,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="8,-24.14 8,-664.14 438,-664.14 438,-24.14 8,-24.14"/>
+<polygon fill="none" stroke="black" points="8,-23.57 8,-672.57 494,-672.57 494,-23.57 8,-23.57"/>
</g>
<!-- Start2 -->
<g id="node1" class="node">
<title>Start2</title>
-<polygon fill="yellow" stroke="transparent" points="129,-627.14 129,-652.14 235,-652.14 235,-627.14 129,-627.14"/>
-<polygon fill="none" stroke="black" points="129,-627.14 129,-652.14 235,-652.14 235,-627.14 129,-627.14"/>
-<text text-anchor="start" x="163.5" y="-635.94" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="129,-596.14 129,-627.14 235,-627.14 235,-596.14 129,-596.14"/>
-<polygon fill="yellow" stroke="transparent" points="134,-601.14 134,-622.14 174,-622.14 174,-601.14 134,-601.14"/>
-<polygon fill="none" stroke="black" points="134,-601.14 134,-622.14 174,-622.14 174,-601.14 134,-601.14"/>
-<text text-anchor="start" x="137" y="-607.94" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="174,-601.14 174,-622.14 205,-622.14 205,-601.14 174,-601.14"/>
-<text text-anchor="start" x="177" y="-607.94" font-family="Times,serif" font-size="14.00">arg</text>
-<polygon fill="none" stroke="black" points="205,-601.14 205,-622.14 230,-622.14 230,-601.14 205,-601.14"/>
-<text text-anchor="start" x="208" y="-607.94" font-family="Times,serif" font-size="14.00">$2</text>
+<polygon fill="yellow" stroke="none" points="177.38,-634.07 177.38,-660.57 282.62,-660.57 282.62,-634.07 177.38,-634.07"/>
+<polygon fill="none" stroke="black" points="177.38,-634.07 177.38,-660.57 282.62,-660.57 282.62,-634.07 177.38,-634.07"/>
+<text text-anchor="start" x="217.25" y="-642.27" font-family="Times New Roman,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="177.38,-601.57 177.38,-634.07 282.62,-634.07 282.62,-601.57 177.38,-601.57"/>
+<polygon fill="yellow" stroke="none" points="182.38,-606.57 182.38,-629.07 213.12,-629.07 213.12,-606.57 182.38,-606.57"/>
+<polygon fill="none" stroke="black" points="182.38,-606.57 182.38,-629.07 213.12,-629.07 213.12,-606.57 182.38,-606.57"/>
+<text text-anchor="start" x="185.38" y="-612.77" font-family="Times New Roman,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="213.12,-606.57 213.12,-629.07 254.38,-629.07 254.38,-606.57 213.12,-606.57"/>
+<text text-anchor="start" x="216.12" y="-612.77" font-family="Times New Roman,serif" font-size="14.00">$mem</text>
+<polygon fill="none" stroke="black" points="254.38,-606.57 254.38,-629.07 277.62,-629.07 277.62,-606.57 254.38,-606.57"/>
+<text text-anchor="start" x="257.38" y="-612.77" font-family="Times New Roman,serif" font-size="14.00">arg</text>
+</g>
+<!-- MemMerge -->
+<g id="node2" class="node">
+<title>MemMerge</title>
+<polygon fill="none" stroke="black" points="190,-345.57 108,-345.57 108,-309.57 190,-309.57 190,-345.57"/>
+<text text-anchor="middle" x="149" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+</g>
+<!-- MemMerge&#45;&gt;Start2 -->
+<g id="edge37" class="edge">
+<title>MemMerge&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="blue" d="M182.26,-345.95C196.56,-354.9 212.4,-367 223,-381.57 271.6,-448.32 296.36,-483.66 269,-561.57 262.19,-580.96 242.83,-581.28 236.1,-594.6"/>
+<polygon fill="blue" stroke="blue" points="232.74,-593.57 234.07,-604.09 239.58,-595.04 232.74,-593.57"/>
+<text text-anchor="middle" x="180.01" y="-348.1" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Phi_230 -->
+<g id="node16" class="node">
+<title>Phi_230</title>
+<ellipse fill="lightyellow" stroke="black" cx="161" cy="-399.57" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="161" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
+</g>
+<!-- MemMerge&#45;&gt;Phi_230 -->
+<g id="edge38" class="edge">
+<title>MemMerge&#45;&gt;Phi_230</title>
+<path fill="none" stroke="blue" d="M151.97,-345.87C153.23,-353.24 154.74,-362.04 156.16,-370.32"/>
+<polygon fill="blue" stroke="blue" points="152.67,-370.7 157.81,-379.97 159.57,-369.52 152.67,-370.7"/>
+<text text-anchor="middle" x="149.72" y="-348.02" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Stop3 -->
-<g id="node2" class="node">
+<g id="node3" class="node">
<title>Stop3</title>
-<polygon fill="yellow" stroke="black" points="189,-68.14 135,-68.14 135,-32.14 189,-32.14 189,-68.14"/>
-<text text-anchor="middle" x="162" y="-46.44" font-family="Times,serif" font-size="14.00">Stop</text>
+<polygon fill="yellow" stroke="black" points="194,-67.57 140,-67.57 140,-31.57 194,-31.57 194,-67.57"/>
+<text text-anchor="middle" x="167" y="-44.52" font-family="Times New Roman,serif" font-size="14.00">Stop</text>
</g>
<!-- Return37 -->
-<g id="node21" class="node">
+<g id="node22" class="node">
<title>Return37</title>
-<polygon fill="yellow" stroke="black" points="193,-154.14 127,-154.14 127,-118.14 193,-118.14 193,-154.14"/>
-<text text-anchor="middle" x="160" y="-132.44" font-family="Times,serif" font-size="14.00">Return</text>
+<polygon fill="yellow" stroke="black" points="183,-155.07 129,-155.07 129,-119.07 183,-119.07 183,-155.07"/>
+<text text-anchor="middle" x="156" y="-132.02" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Stop3&#45;&gt;Return37 -->
<g id="edge1" class="edge">
<title>Stop3&#45;&gt;Return37</title>
-<path fill="none" stroke="red" d="M161.59,-68.55C161.32,-79.89 160.96,-94.92 160.65,-107.83"/>
-<polygon fill="red" stroke="red" points="157.15,-107.97 160.41,-118.05 164.14,-108.13 157.15,-107.97"/>
-<text text-anchor="middle" x="158.59" y="-71.15" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M164.77,-67.87C163.31,-79.22 161.37,-94.35 159.68,-107.47"/>
+<polygon fill="red" stroke="red" points="156.22,-106.92 158.42,-117.29 163.16,-107.82 156.22,-106.92"/>
+<text text-anchor="middle" x="162.52" y="-70.02" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_4 -->
-<g id="node3" class="node">
+<g id="node4" class="node">
<title>Con_4</title>
-<ellipse fill="none" stroke="black" cx="264" cy="-538.14" rx="27" ry="18"/>
-<text text-anchor="middle" x="264" y="-534.44" font-family="Times,serif" font-size="14.00">#0</text>
+<ellipse fill="none" stroke="black" cx="233" cy="-543.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="233" y="-538.52" font-family="Times New Roman,serif" font-size="14.00">#0</text>
</g>
<!-- new9 -->
-<g id="node4" class="node">
+<g id="node5" class="node">
<title>new9</title>
-<ellipse fill="none" stroke="black" cx="55" cy="-538.14" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="55" y="-534.44" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="134" cy="-543.57" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="134" y="-538.52" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new9&#45;&gt;Start2 -->
<g id="edge2" class="edge">
<title>new9&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M63.59,-555.84C74.57,-574.87 95.49,-604.11 123,-610.06"/>
-<polygon fill="green" stroke="green" points="122.68,-613.55 133,-611.14 123.43,-606.59 122.68,-613.55"/>
-<text text-anchor="middle" x="60.59" y="-558.44" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M137.27,-561.92C141.67,-580.29 151.26,-607.68 170.22,-615.6"/>
+<polygon fill="green" stroke="green" points="169.4,-619 179.89,-617.52 170.76,-612.14 169.4,-619"/>
+<text text-anchor="middle" x="135.02" y="-564.07" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store10 -->
-<g id="node5" class="node">
+<g id="node6" class="node">
<title>Store10</title>
-<ellipse fill="none" stroke="black" cx="218" cy="-466.14" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="218" y="-462.44" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="174" cy="-471.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="174" y="-466.52" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store10&#45;&gt;Start2 -->
<g id="edge3" class="edge">
-<title>Store10&#45;&gt;Start2:p2</title>
-<path fill="none" stroke="blue" d="M218,-484.36C218,-507.63 218,-550.72 218,-589.78"/>
-<polygon fill="blue" stroke="blue" points="214.5,-590.14 218,-600.14 221.5,-590.14 214.5,-590.14"/>
-<text text-anchor="middle" x="215" y="-486.96" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<title>Store10&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="blue" d="M176.14,-489.77C178.97,-508.31 185.04,-538.28 197,-561.57 206.55,-580.16 225.16,-580.71 231.54,-594.37"/>
+<polygon fill="blue" stroke="blue" points="228.09,-594.95 233.46,-604.08 234.95,-593.59 228.09,-594.95"/>
+<text text-anchor="middle" x="173.89" y="-491.92" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Store10&#45;&gt;Con_4 -->
<g id="edge5" class="edge">
<title>Store10&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M228.44,-483.03C234.2,-491.8 241.48,-502.88 247.96,-512.73"/>
-<polygon fill="black" stroke="black" points="245.19,-514.89 253.6,-521.32 251.04,-511.04 245.19,-514.89"/>
-<text text-anchor="middle" x="225.44" y="-485.63" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M186.8,-487.75C194.46,-496.84 204.35,-508.57 213.01,-518.85"/>
+<polygon fill="black" stroke="black" points="210.13,-520.86 219.25,-526.25 215.48,-516.35 210.13,-520.86"/>
+<text text-anchor="middle" x="184.55" y="-489.9" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store10&#45;&gt;new9 -->
<g id="edge4" class="edge">
<title>Store10&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M195.75,-477.51C190.9,-479.73 185.79,-482.04 181,-484.14 151.47,-497.13 117.77,-511.27 92.65,-521.68"/>
-<polygon fill="black" stroke="black" points="91.04,-518.56 83.14,-525.61 93.72,-525.03 91.04,-518.56"/>
-<text text-anchor="middle" x="192.75" y="-480.11" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M164.72,-488.8C160.09,-496.9 154.38,-506.9 149.14,-516.07"/>
+<polygon fill="black" stroke="black" points="146.18,-514.2 144.26,-524.62 152.26,-517.67 146.18,-514.2"/>
+<text text-anchor="middle" x="162.47" y="-490.95" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Loop11 -->
-<g id="node6" class="node">
+<g id="node7" class="node">
<title>Loop11</title>
-<polygon fill="yellow" stroke="black" points="430,-412.14 376,-412.14 376,-376.14 430,-376.14 430,-412.14"/>
-<text text-anchor="middle" x="403" y="-390.44" font-family="Times,serif" font-size="14.00">Loop</text>
+<polygon fill="yellow" stroke="black" points="326,-417.57 272,-417.57 272,-381.57 326,-381.57 326,-417.57"/>
+<text text-anchor="middle" x="299" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">Loop</text>
</g>
<!-- Loop11&#45;&gt;Start2 -->
<g id="edge6" class="edge">
<title>Loop11&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M398.43,-412.15C388.69,-445.12 362.68,-517.81 314,-556.14 259,-599.46 164.25,-533.74 154.77,-590.03"/>
-<polygon fill="red" stroke="red" points="151.27,-589.91 154,-600.14 158.25,-590.44 151.27,-589.91"/>
-<text text-anchor="middle" x="395.43" y="-414.75" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M302.41,-417.85C307.63,-449.41 314.1,-517.19 284,-561.57 262.39,-593.42 210.43,-569.06 199.7,-594.37"/>
+<polygon fill="red" stroke="red" points="196.28,-593.62 198.01,-604.07 203.18,-594.83 196.28,-593.62"/>
+<text text-anchor="middle" x="300.16" y="-420" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region32 -->
-<g id="node17" class="node">
+<g id="node18" class="node">
<title>Region32</title>
-<polygon fill="yellow" stroke="black" points="278,-68.14 212,-68.14 212,-32.14 278,-32.14 278,-68.14"/>
-<text text-anchor="middle" x="245" y="-46.44" font-family="Times,serif" font-size="14.00">Region</text>
+<polygon fill="yellow" stroke="black" points="277.5,-67.57 222.5,-67.57 222.5,-31.57 277.5,-31.57 277.5,-67.57"/>
+<text text-anchor="middle" x="250" y="-44.52" font-family="Times New Roman,serif" font-size="14.00">Region</text>
</g>
<!-- Loop11&#45;&gt;Region32 -->
<g id="edge7" class="edge">
<title>Loop11&#45;&gt;Region32</title>
-<path fill="none" stroke="red" d="M375.77,-379.43C372.85,-378.21 369.89,-377.09 367,-376.14 287.4,-350.06 245.88,-394.32 182,-340.14 148.1,-311.39 72.96,-171.74 118,-104.14 120.57,-100.29 166.66,-81.64 202.59,-67.55"/>
-<polygon fill="red" stroke="red" points="203.9,-70.79 211.94,-63.89 201.35,-64.27 203.9,-70.79"/>
-<text text-anchor="middle" x="372.77" y="-373.03" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M294.37,-381.1C287.79,-356.73 275.97,-314.9 271,-309.57 241.37,-277.72 212.98,-301.92 180,-273.57 139.82,-239.03 133.81,-221.71 120,-170.57 112.24,-141.82 103.39,-128.28 120,-103.57 122.76,-99.46 174.37,-79.22 211.72,-64.98"/>
+<polygon fill="red" stroke="red" points="212.79,-68.32 220.89,-61.49 210.3,-61.77 212.79,-68.32"/>
+<text text-anchor="middle" x="292.12" y="-373.5" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_arg13 -->
-<g id="node7" class="node">
+<g id="node8" class="node">
<title>Phi_arg13</title>
-<ellipse fill="lightyellow" stroke="black" cx="321" cy="-394.14" rx="37.09" ry="18"/>
-<text text-anchor="middle" x="321" y="-390.44" font-family="Times,serif" font-size="14.00">φ_arg</text>
+<ellipse fill="lightyellow" stroke="black" cx="377" cy="-399.57" rx="32.93" ry="18"/>
+<text text-anchor="middle" x="377" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">φ_arg</text>
</g>
<!-- Phi_arg13&#45;&gt;Start2 -->
<g id="edge9" class="edge">
-<title>Phi_arg13&#45;&gt;Start2:p1</title>
-<path fill="none" stroke="black" d="M323.94,-412.28C328.4,-444.2 333.18,-513.39 300,-556.14 270.11,-594.65 201.29,-554.44 191.23,-590.04"/>
-<polygon fill="black" stroke="black" points="187.74,-589.79 190,-600.14 194.69,-590.64 187.74,-589.79"/>
-<text text-anchor="middle" x="320.94" y="-414.88" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<title>Phi_arg13&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M377.05,-417.98C376.25,-467.21 367.08,-604.69 289.96,-616.94"/>
+<polygon fill="black" stroke="black" points="289.83,-613.44 280.13,-617.7 290.37,-620.42 289.83,-613.44"/>
+<text text-anchor="middle" x="374.8" y="-420.13" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_arg13&#45;&gt;Loop11 -->
<g id="edge8" class="edge">
<title>Phi_arg13&#45;&gt;Loop11</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M358.16,-394.14C360.62,-394.14 363.08,-394.14 365.55,-394.14"/>
-<polygon fill="black" stroke="black" points="365.67,-397.64 375.67,-394.14 365.67,-390.64 365.67,-397.64"/>
-<text text-anchor="middle" x="361.16" y="-387.74" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M343.81,-399.57C341.82,-399.57 339.82,-399.57 337.83,-399.57"/>
+<polygon fill="black" stroke="black" points="337.94,-396.07 327.94,-399.57 337.94,-403.07 337.94,-396.07"/>
+<text text-anchor="middle" x="341.56" y="-391.97" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Sub35 -->
-<g id="node19" class="node">
+<g id="node20" class="node">
<title>Sub35</title>
-<ellipse fill="none" stroke="black" cx="218" cy="-322.14" rx="27" ry="18"/>
-<text text-anchor="middle" x="218" y="-318.44" font-family="Times,serif" font-size="14.00">&#45;</text>
+<ellipse fill="none" stroke="black" cx="459" cy="-327.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="459" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">&#45;</text>
</g>
<!-- LT14 -->
-<g id="node8" class="node">
+<g id="node9" class="node">
<title>LT14</title>
-<ellipse fill="none" stroke="black" cx="290" cy="-322.14" rx="27" ry="18"/>
-<text text-anchor="middle" x="290" y="-318.44" font-family="Times,serif" font-size="14.00">&lt;</text>
+<ellipse fill="none" stroke="black" cx="235" cy="-327.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="235" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">&lt;</text>
</g>
<!-- LT14&#45;&gt;Con_4 -->
<g id="edge11" class="edge">
<title>LT14&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M284.22,-340.12C280.96,-350.42 277.13,-363.89 275,-376.14 266.94,-422.56 264.72,-477.47 264.15,-509.69"/>
-<polygon fill="black" stroke="black" points="260.64,-510.04 264.01,-520.08 267.64,-510.13 260.64,-510.04"/>
-<text text-anchor="middle" x="281.22" y="-342.72" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M234.84,-345.72C234.5,-382.42 233.69,-468.91 233.27,-514.03"/>
+<polygon fill="black" stroke="black" points="229.77,-513.79 233.18,-523.82 236.77,-513.85 229.77,-513.79"/>
+<text text-anchor="middle" x="232.59" y="-347.87" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- LT14&#45;&gt;Phi_arg13 -->
<g id="edge12" class="edge">
<title>LT14&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M297.35,-339.73C300.92,-347.81 305.31,-357.71 309.33,-366.79"/>
-<polygon fill="black" stroke="black" points="306.24,-368.46 313.49,-376.19 312.64,-365.63 306.24,-368.46"/>
-<text text-anchor="middle" x="294.35" y="-342.33" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M256.26,-339.05C279.21,-350.36 316.09,-368.54 343.06,-381.84"/>
+<polygon fill="black" stroke="black" points="341.35,-384.89 351.86,-386.17 344.44,-378.61 341.35,-384.89"/>
+<text text-anchor="middle" x="258.51" y="-341.2" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- If16 -->
-<g id="node9" class="node">
+<g id="node10" class="node">
<title>If16</title>
-<polygon fill="yellow" stroke="transparent" points="242,-239.14 242,-264.14 336,-264.14 336,-239.14 242,-239.14"/>
-<polygon fill="none" stroke="black" points="242,-239.14 242,-264.14 336,-264.14 336,-239.14 242,-239.14"/>
-<text text-anchor="start" x="283.5" y="-247.94" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="242,-208.14 242,-239.14 336,-239.14 336,-208.14 242,-208.14"/>
-<polygon fill="yellow" stroke="transparent" points="247,-213.14 247,-234.14 287,-234.14 287,-213.14 247,-213.14"/>
-<polygon fill="none" stroke="black" points="247,-213.14 247,-234.14 287,-234.14 287,-213.14 247,-213.14"/>
-<text text-anchor="start" x="250" y="-219.94" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="287,-213.14 287,-234.14 331,-234.14 331,-213.14 287,-213.14"/>
-<polygon fill="none" stroke="black" points="287,-213.14 287,-234.14 331,-234.14 331,-213.14 287,-213.14"/>
-<text text-anchor="start" x="290" y="-219.94" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="197,-243.07 197,-269.57 273,-269.57 273,-243.07 197,-243.07"/>
+<polygon fill="none" stroke="black" points="197,-243.07 197,-269.57 273,-269.57 273,-243.07 197,-243.07"/>
+<text text-anchor="start" x="230.5" y="-251.27" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="197,-210.57 197,-243.07 273,-243.07 273,-210.57 197,-210.57"/>
+<polygon fill="yellow" stroke="none" points="202,-215.57 202,-238.07 233.5,-238.07 233.5,-215.57 202,-215.57"/>
+<polygon fill="none" stroke="black" points="202,-215.57 202,-238.07 233.5,-238.07 233.5,-215.57 202,-215.57"/>
+<text text-anchor="start" x="205" y="-221.77" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="233.5,-215.57 233.5,-238.07 268,-238.07 268,-215.57 233.5,-215.57"/>
+<polygon fill="none" stroke="black" points="233.5,-215.57 233.5,-238.07 268,-238.07 268,-215.57 233.5,-215.57"/>
+<text text-anchor="start" x="236.5" y="-221.77" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- If16&#45;&gt;Loop11 -->
<g id="edge13" class="edge">
<title>If16&#45;&gt;Loop11</title>
-<path fill="none" stroke="red" d="M311.8,-268.34C333.14,-297.54 364.63,-340.64 384.47,-367.78"/>
-<polygon fill="red" stroke="red" points="381.75,-369.99 390.47,-376 387.4,-365.86 381.75,-369.99"/>
-<text text-anchor="middle" x="308.8" y="-270.94" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M264.28,-273.52C272.55,-284.3 280.73,-296.83 286,-309.57 293.91,-328.67 297.12,-351.83 298.37,-369.73"/>
+<polygon fill="red" stroke="red" points="294.87,-369.85 298.88,-379.66 301.86,-369.5 294.87,-369.85"/>
+<text text-anchor="middle" x="262.03" y="-275.67" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- If16&#45;&gt;LT14 -->
<g id="edge14" class="edge">
<title>If16&#45;&gt;LT14</title>
-<path fill="none" stroke="black" d="M289.37,-268.42C289.47,-276.72 289.58,-285.63 289.67,-293.71"/>
-<polygon fill="black" stroke="black" points="286.17,-293.78 289.79,-303.74 293.17,-293.7 286.17,-293.78"/>
-<text text-anchor="middle" x="286.37" y="-271.02" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M235,-273.39C235,-281.55 235,-290.26 235,-298.21"/>
+<polygon fill="black" stroke="black" points="231.5,-298.02 235,-308.02 238.5,-298.02 231.5,-298.02"/>
+<text text-anchor="middle" x="232.75" y="-275.54" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Div21 -->
-<g id="node10" class="node">
+<g id="node11" class="node">
<title>Div21</title>
-<ellipse fill="none" stroke="black" cx="63" cy="-394.14" rx="27" ry="18"/>
-<text text-anchor="middle" x="63" y="-390.44" font-family="Times,serif" font-size="14.00">//</text>
+<ellipse fill="none" stroke="black" cx="43" cy="-399.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">//</text>
</g>
<!-- Div21&#45;&gt;Start2 -->
<g id="edge15" class="edge">
-<title>Div21&#45;&gt;Start2:p1</title>
-<path fill="none" stroke="black" d="M70.68,-411.57C79.34,-429.71 94.16,-459.58 109,-484.14 139.67,-534.92 184.56,-537.17 189.54,-590.05"/>
-<polygon fill="black" stroke="black" points="186.05,-590.31 190,-600.14 193.05,-590 186.05,-590.31"/>
-<text text-anchor="middle" x="67.68" y="-414.17" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<title>Div21&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M56.22,-415.68C64.22,-425.72 73.84,-439.58 79,-453.57 95.73,-498.87 59.24,-525.18 91,-561.57 140.95,-618.8 253.3,-535.12 265.01,-594.3"/>
+<polygon fill="black" stroke="black" points="261.5,-594.4 265.87,-604.06 268.48,-593.79 261.5,-594.4"/>
+<text text-anchor="middle" x="58.47" y="-417.83" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_22 -->
-<g id="node11" class="node">
+<g id="node12" class="node">
<title>Con_22</title>
-<ellipse fill="none" stroke="black" cx="145" cy="-466.14" rx="27" ry="18"/>
-<text text-anchor="middle" x="145" y="-462.44" font-family="Times,serif" font-size="14.00">#3</text>
+<ellipse fill="none" stroke="black" cx="43" cy="-471.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-466.52" font-family="Times New Roman,serif" font-size="14.00">#3</text>
</g>
<!-- Div21&#45;&gt;Con_22 -->
<g id="edge16" class="edge">
<title>Div21&#45;&gt;Con_22</title>
-<path fill="none" stroke="black" d="M79.2,-408.97C91.18,-419.2 107.69,-433.29 121.18,-444.8"/>
-<polygon fill="black" stroke="black" points="119.23,-447.75 129.11,-451.58 123.78,-442.43 119.23,-447.75"/>
-<text text-anchor="middle" x="76.2" y="-411.57" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M43,-417.87C43,-425.16 43,-433.84 43,-442.03"/>
+<polygon fill="black" stroke="black" points="39.5,-441.95 43,-451.95 46.5,-441.95 39.5,-441.95"/>
+<text text-anchor="middle" x="40.75" y="-420.02" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- EQ23 -->
-<g id="node12" class="node">
+<g id="node13" class="node">
<title>EQ23</title>
-<ellipse fill="none" stroke="black" cx="389" cy="-236.14" rx="27" ry="18"/>
-<text text-anchor="middle" x="389" y="-232.44" font-family="Times,serif" font-size="14.00">==</text>
+<ellipse fill="none" stroke="black" cx="346" cy="-240.07" rx="27" ry="18"/>
+<text text-anchor="middle" x="346" y="-235.02" font-family="Times New Roman,serif" font-size="14.00">==</text>
</g>
<!-- EQ23&#45;&gt;Phi_arg13 -->
<g id="edge17" class="edge">
<title>EQ23&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M381.85,-253.54C370.11,-280.48 346.63,-334.34 332.52,-366.71"/>
-<polygon fill="black" stroke="black" points="329.25,-365.45 328.46,-376.02 335.67,-368.25 329.25,-365.45"/>
-<text text-anchor="middle" x="378.85" y="-256.14" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M344.71,-258.4C343.62,-279.39 343.3,-315.66 351,-345.57 353.31,-354.54 357.23,-363.78 361.33,-371.99"/>
+<polygon fill="black" stroke="black" points="358.21,-373.56 366.01,-380.73 364.38,-370.26 358.21,-373.56"/>
+<text text-anchor="middle" x="342.46" y="-260.55" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_24 -->
-<g id="node13" class="node">
+<g id="node14" class="node">
<title>Con_24</title>
-<ellipse fill="none" stroke="black" cx="402" cy="-322.14" rx="27" ry="18"/>
-<text text-anchor="middle" x="402" y="-318.44" font-family="Times,serif" font-size="14.00">#5</text>
+<ellipse fill="none" stroke="black" cx="387" cy="-327.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="387" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">#5</text>
</g>
<!-- EQ23&#45;&gt;Con_24 -->
<g id="edge18" class="edge">
<title>EQ23&#45;&gt;Con_24</title>
-<path fill="none" stroke="black" d="M391.63,-254.14C393.41,-265.64 395.8,-281.07 397.83,-294.23"/>
-<polygon fill="black" stroke="black" points="394.38,-294.82 399.37,-304.17 401.3,-293.75 394.38,-294.82"/>
-<text text-anchor="middle" x="388.63" y="-256.74" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M353.91,-257.55C359.69,-269.62 367.66,-286.24 374.33,-300.14"/>
+<polygon fill="black" stroke="black" points="370.98,-301.26 378.46,-308.77 377.3,-298.24 370.98,-301.26"/>
+<text text-anchor="middle" x="351.66" y="-259.7" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- If25 -->
-<g id="node14" class="node">
+<g id="node15" class="node">
<title>If25</title>
-<polygon fill="yellow" stroke="transparent" points="220,-139.14 220,-164.14 314,-164.14 314,-139.14 220,-139.14"/>
-<polygon fill="none" stroke="black" points="220,-139.14 220,-164.14 314,-164.14 314,-139.14 220,-139.14"/>
-<text text-anchor="start" x="261.5" y="-147.94" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="220,-108.14 220,-139.14 314,-139.14 314,-108.14 220,-108.14"/>
-<polygon fill="yellow" stroke="transparent" points="225,-113.14 225,-134.14 265,-134.14 265,-113.14 225,-113.14"/>
-<polygon fill="none" stroke="black" points="225,-113.14 225,-134.14 265,-134.14 265,-113.14 225,-113.14"/>
-<text text-anchor="start" x="228" y="-119.94" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="265,-113.14 265,-134.14 309,-134.14 309,-113.14 265,-113.14"/>
-<polygon fill="none" stroke="black" points="265,-113.14 265,-134.14 309,-134.14 309,-113.14 265,-113.14"/>
-<text text-anchor="start" x="268" y="-119.94" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="229,-140.07 229,-166.57 305,-166.57 305,-140.07 229,-140.07"/>
+<polygon fill="none" stroke="black" points="229,-140.07 229,-166.57 305,-166.57 305,-140.07 229,-140.07"/>
+<text text-anchor="start" x="262.5" y="-148.27" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="229,-107.57 229,-140.07 305,-140.07 305,-107.57 229,-107.57"/>
+<polygon fill="yellow" stroke="none" points="234,-112.57 234,-135.07 265.5,-135.07 265.5,-112.57 234,-112.57"/>
+<polygon fill="none" stroke="black" points="234,-112.57 234,-135.07 265.5,-135.07 265.5,-112.57 234,-112.57"/>
+<text text-anchor="start" x="237" y="-118.77" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="265.5,-112.57 265.5,-135.07 300,-135.07 300,-112.57 265.5,-112.57"/>
+<polygon fill="none" stroke="black" points="265.5,-112.57 265.5,-135.07 300,-135.07 300,-112.57 265.5,-112.57"/>
+<text text-anchor="start" x="268.5" y="-118.77" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- If25&#45;&gt;If16 -->
<g id="edge19" class="edge">
<title>If25&#45;&gt;If16:p0</title>
-<path fill="none" stroke="red" d="M267,-168.16C267,-178.61 267,-190.56 267,-202.13"/>
-<polygon fill="red" stroke="red" points="263.5,-202.14 267,-212.14 270.5,-202.14 263.5,-202.14"/>
-<text text-anchor="middle" x="264" y="-170.76" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M234.98,-170.32C227.77,-180.06 221.5,-191.38 218.96,-203.38"/>
+<polygon fill="red" stroke="red" points="215.51,-202.74 217.91,-213.06 222.47,-203.49 215.51,-202.74"/>
+<text text-anchor="middle" x="232.73" y="-172.47" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- If25&#45;&gt;EQ23 -->
<g id="edge20" class="edge">
<title>If25&#45;&gt;EQ23</title>
-<path fill="none" stroke="black" d="M308.01,-168.43C322.36,-179.56 338.51,-192.27 353,-204.14 357.12,-207.52 361.45,-211.17 365.63,-214.73"/>
-<polygon fill="black" stroke="black" points="363.51,-217.52 373.37,-221.39 368.08,-212.22 363.51,-217.52"/>
-<text text-anchor="middle" x="305.01" y="-171.03" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
-</g>
-<!-- Phi_230 -->
-<g id="node15" class="node">
-<title>Phi_230</title>
-<ellipse fill="lightyellow" stroke="black" cx="141" cy="-394.14" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="141" y="-390.44" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<path fill="none" stroke="black" d="M292.21,-170.3C303.4,-184.61 316.37,-201.18 326.76,-214.47"/>
+<polygon fill="black" stroke="black" points="323.96,-216.57 332.88,-222.29 329.48,-212.26 323.96,-216.57"/>
+<text text-anchor="middle" x="289.96" y="-172.45" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_230&#45;&gt;Store10 -->
<g id="edge22" class="edge">
<title>Phi_230&#45;&gt;Store10</title>
-<path fill="none" stroke="blue" d="M157.33,-409.99C168.27,-419.93 182.82,-433.16 194.94,-444.18"/>
-<polygon fill="blue" stroke="blue" points="192.73,-446.9 202.48,-451.04 197.44,-441.72 192.73,-446.9"/>
-<text text-anchor="middle" x="154.33" y="-412.59" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M164.21,-417.87C165.58,-425.24 167.22,-434.04 168.75,-442.32"/>
+<polygon fill="blue" stroke="blue" points="165.28,-442.78 170.55,-451.97 172.16,-441.5 165.28,-442.78"/>
+<text text-anchor="middle" x="161.96" y="-420.02" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_230&#45;&gt;Loop11 -->
<g id="edge21" class="edge">
<title>Phi_230&#45;&gt;Loop11</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M157.93,-378.17C167.22,-370.51 179.4,-362.14 192,-358.14 262.32,-335.82 288.38,-333.72 358,-358.14 365.14,-360.65 371.99,-364.81 378.09,-369.44"/>
-<polygon fill="black" stroke="black" points="375.99,-372.24 385.92,-375.93 380.45,-366.85 375.99,-372.24"/>
-<text text-anchor="middle" x="154.93" y="-371.77" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M214.37,-399.57C229.71,-399.57 245.05,-399.57 260.39,-399.57"/>
+<polygon fill="black" stroke="black" points="260.05,-403.07 270.05,-399.57 260.05,-396.07 260.05,-403.07"/>
+<text text-anchor="middle" x="216.62" y="-391.97" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Phi_233 -->
-<g id="node18" class="node">
+<g id="node19" class="node">
<title>Phi_233</title>
-<ellipse fill="lightyellow" stroke="black" cx="84" cy="-50.14" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="84" y="-46.44" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<ellipse fill="lightyellow" stroke="black" cx="69" cy="-49.57" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="69" y="-44.52" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
</g>
<!-- Store31 -->
-<g id="node16" class="node">
+<g id="node17" class="node">
<title>Store31</title>
-<ellipse fill="none" stroke="black" cx="84" cy="-322.14" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="84" y="-318.44" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="43" cy="-327.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store31&#45;&gt;new9 -->
<g id="edge25" class="edge">
<title>Store31&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M64.25,-334.88C46.61,-346.87 22.71,-367.36 17,-393.14"/>
-<text text-anchor="middle" x="61.25" y="-337.48" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M56.48,-343.35C67.65,-356.68 82.68,-377.39 89,-398.57"/>
+<path fill="none" stroke="black" d="M89,-400.57C100.9,-440.42 115.61,-486.25 124.9,-514.81"/>
+<polygon fill="black" stroke="black" points="121.51,-515.71 127.94,-524.13 128.17,-513.54 121.51,-515.71"/>
+<text text-anchor="middle" x="58.73" y="-345.5" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store31&#45;&gt;Div21 -->
<g id="edge26" class="edge">
<title>Store31&#45;&gt;Div21</title>
-<path fill="none" stroke="black" d="M78.92,-340.09C76.52,-348.08 73.6,-357.81 70.92,-366.74"/>
-<polygon fill="black" stroke="black" points="67.56,-365.77 68.04,-376.35 74.26,-367.78 67.56,-365.77"/>
-<text text-anchor="middle" x="75.92" y="-342.69" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M43,-345.87C43,-353.16 43,-361.84 43,-370.03"/>
+<polygon fill="black" stroke="black" points="39.5,-369.95 43,-379.95 46.5,-369.95 39.5,-369.95"/>
+<text text-anchor="middle" x="40.75" y="-348.02" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store31&#45;&gt;Phi_230 -->
<g id="edge24" class="edge">
<title>Store31&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M96.37,-338.33C103.81,-347.47 113.44,-359.29 121.84,-369.62"/>
-<polygon fill="blue" stroke="blue" points="119.23,-371.95 128.26,-377.5 124.66,-367.53 119.23,-371.95"/>
-<text text-anchor="middle" x="93.37" y="-340.93" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M62.75,-340.28C79.89,-350.45 105.12,-365.42 125.72,-377.64"/>
+<polygon fill="blue" stroke="blue" points="123.72,-380.52 134.1,-382.61 127.29,-374.5 123.72,-380.52"/>
+<text text-anchor="middle" x="65" y="-342.43" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region32&#45;&gt;If25 -->
<g id="edge27" class="edge">
<title>Region32&#45;&gt;If25:p0</title>
-<path fill="none" stroke="red" d="M245,-68.23C245,-77.69 245,-89.92 245,-101.83"/>
-<polygon fill="red" stroke="red" points="241.5,-102.14 245,-112.14 248.5,-102.14 241.5,-102.14"/>
-<text text-anchor="middle" x="242" y="-70.83" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M249.89,-67.92C249.84,-77.07 249.79,-88.77 249.76,-100.25"/>
+<polygon fill="red" stroke="red" points="246.26,-100.05 249.75,-110.05 253.26,-100.06 246.26,-100.05"/>
+<text text-anchor="middle" x="247.64" y="-70.07" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region32&#45;&gt;If25 -->
<g id="edge28" class="edge">
<title>Region32&#45;&gt;If25:p1</title>
-<path fill="none" stroke="red" d="M265.02,-68.27C273.64,-77.2 282.48,-88.98 285.71,-101.99"/>
-<polygon fill="red" stroke="red" points="282.27,-102.66 287,-112.14 289.22,-101.78 282.27,-102.66"/>
-<text text-anchor="middle" x="262.02" y="-70.87" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M265.22,-67.95C271.77,-76.79 278.57,-88.22 281.39,-100.32"/>
+<polygon fill="red" stroke="red" points="277.9,-100.55 282.57,-110.06 284.84,-99.72 277.9,-100.55"/>
+<text text-anchor="middle" x="262.97" y="-70.1" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_233&#45;&gt;Phi_230 -->
<g id="edge31" class="edge">
<title>Phi_233&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M70.91,-76.61C45.62,-129.65 -3.2,-254.21 47,-340.14 53.76,-351.71 82.3,-366.89 106.18,-378.04"/>
-<polygon fill="blue" stroke="blue" points="74.08,-78.08 75.32,-67.56 67.79,-75.01 74.08,-78.08"/>
-<polygon fill="blue" stroke="blue" points="104.83,-381.28 115.38,-382.25 107.74,-374.91 104.83,-381.28"/>
-<text text-anchor="middle" x="72.32" y="-70.16" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="blue" d="M117.06,-66.52C146.85,-77.29 181.4,-91.65 192,-103.57 212.65,-126.78 191.64,-147.08 212,-170.57 237.01,-199.41 269.42,-174.4 290,-206.57 323.6,-259.09 310.68,-297.47 271,-345.57 256.18,-363.53 233.82,-375.83 213.13,-384.03"/>
+<polygon fill="blue" stroke="blue" points="118.37,-63.28 107.78,-63.24 116.04,-69.87 118.37,-63.28"/>
+<polygon fill="blue" stroke="blue" points="212.09,-380.68 203.93,-387.42 214.52,-387.25 212.09,-380.68"/>
+<text text-anchor="middle" x="108.6" y="-64.88" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_233&#45;&gt;Store31 -->
<g id="edge30" class="edge">
<title>Phi_233&#45;&gt;Store31</title>
-<path fill="none" stroke="blue" d="M84,-68.44C84,-114.16 84,-238.47 84,-293.87"/>
-<polygon fill="blue" stroke="blue" points="80.5,-293.99 84,-303.99 87.5,-293.99 80.5,-293.99"/>
-<text text-anchor="middle" x="81" y="-71.04" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M67.37,-67.83C63.02,-114.01 51.09,-240.72 45.7,-297.9"/>
+<polygon fill="blue" stroke="blue" points="42.22,-297.52 44.77,-307.8 49.19,-298.17 42.22,-297.52"/>
+<text text-anchor="middle" x="65.12" y="-69.98" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_233&#45;&gt;Region32 -->
<g id="edge29" class="edge">
<title>Phi_233&#45;&gt;Region32</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M97.7,-33.41C107.03,-23.4 120.31,-11.6 135,-6.14 157.5,2.22 166.32,1.7 189,-6.14 200.57,-10.14 211.56,-17.63 220.7,-25.31"/>
-<polygon fill="black" stroke="black" points="218.43,-27.97 228.22,-32.02 223.09,-22.75 218.43,-27.97"/>
-<text text-anchor="middle" x="94.7" y="-27.01" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M89.57,-32.51C103.01,-22.52 121.45,-10.85 140,-5.57 163.08,1.01 171.32,2.28 194,-5.57 205.22,-9.45 215.9,-16.6 224.86,-24.03"/>
+<polygon fill="black" stroke="black" points="222.28,-26.42 232.09,-30.44 226.93,-21.19 222.28,-26.42"/>
+<text text-anchor="middle" x="87.32" y="-24.91" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Sub35&#45;&gt;Phi_arg13 -->
<g id="edge32" class="edge">
<title>Sub35&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M244.96,-341.46C259.41,-351.29 277.23,-363.39 291.98,-373.42"/>
-<polygon fill="black" stroke="black" points="246.65,-338.38 236.41,-335.66 242.72,-344.17 246.65,-338.38"/>
-<polygon fill="black" stroke="black" points="290.03,-376.33 300.27,-379.05 293.96,-370.54 290.03,-376.33"/>
-<text text-anchor="middle" x="233.41" y="-338.26" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M434.35,-349.61C424.46,-358.05 413.06,-367.79 403.03,-376.34"/>
+<polygon fill="black" stroke="black" points="436.32,-352.53 441.65,-343.38 431.77,-347.21 436.32,-352.53"/>
+<polygon fill="black" stroke="black" points="400.78,-373.66 395.45,-382.82 405.33,-378.98 400.78,-373.66"/>
+<text text-anchor="middle" x="440.55" y="-344.55" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_36 -->
-<g id="node20" class="node">
+<g id="node21" class="node">
<title>Con_36</title>
-<ellipse fill="none" stroke="black" cx="219" cy="-394.14" rx="27" ry="18"/>
-<text text-anchor="middle" x="219" y="-390.44" font-family="Times,serif" font-size="14.00">#1</text>
+<ellipse fill="none" stroke="black" cx="459" cy="-399.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="459" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">#1</text>
</g>
<!-- Sub35&#45;&gt;Con_36 -->
<g id="edge33" class="edge">
<title>Sub35&#45;&gt;Con_36</title>
-<path fill="none" stroke="black" d="M218.25,-340.45C218.36,-348.16 218.49,-357.43 218.61,-366.03"/>
-<polygon fill="black" stroke="black" points="215.11,-366.09 218.76,-376.04 222.11,-365.99 215.11,-366.09"/>
-<text text-anchor="middle" x="215.25" y="-343.05" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M459,-345.87C459,-353.16 459,-361.84 459,-370.03"/>
+<polygon fill="black" stroke="black" points="455.5,-369.95 459,-379.95 462.5,-369.95 455.5,-369.95"/>
+<text text-anchor="middle" x="456.75" y="-348.02" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Return37&#45;&gt;MemMerge -->
+<g id="edge36" class="edge">
+<title>Return37&#45;&gt;MemMerge</title>
+<path fill="none" stroke="blue" d="M89,-241.07C86.12,-264.36 101.49,-285.96 117.39,-301.62"/>
+<polygon fill="blue" stroke="blue" points="114.82,-304.01 124.55,-308.22 119.57,-298.86 114.82,-304.01"/>
+<text text-anchor="middle" x="86.75" y="-233.47" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Return37&#45;&gt;new9 -->
<g id="edge35" class="edge">
<title>Return37&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M146.13,-154.21C122.96,-183.41 76.06,-245.48 47,-304.14 28.47,-341.55 26.02,-352.39 17,-393.14"/>
-<path fill="none" stroke="black" d="M17,-395.14C5.47,-435.72 24.68,-483.11 39.73,-511.59"/>
-<polygon fill="black" stroke="black" points="36.74,-513.41 44.63,-520.48 42.87,-510.03 36.74,-513.41"/>
-<text text-anchor="middle" x="143.13" y="-156.81" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M89,-241.07C84.7,-275.8 78.53,-365.17 89,-398.57"/>
+<path fill="none" stroke="black" d="M137.42,-155.26C119.26,-173.82 93.67,-205.3 89,-239.07"/>
+<text text-anchor="middle" x="86.75" y="-243.22" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Return37&#45;&gt;If16 -->
<g id="edge34" class="edge">
<title>Return37&#45;&gt;If16:p1</title>
-<path fill="none" stroke="red" d="M181.67,-154.25C188.31,-159.08 195.77,-164.11 203,-168.14 244.24,-191.16 299.97,-165.55 308.02,-202.1"/>
-<polygon fill="red" stroke="red" points="304.54,-202.53 309,-212.14 311.51,-201.85 304.54,-202.53"/>
-<text text-anchor="middle" x="178.67" y="-156.85" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
-</g>
-<!-- Return37&#45;&gt;Phi_230 -->
-<g id="edge36" class="edge">
-<title>Return37&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M158.72,-154.34C155.49,-197.97 146.93,-313.25 143.01,-366.05"/>
-<polygon fill="blue" stroke="blue" points="139.52,-365.79 142.27,-376.02 146.5,-366.31 139.52,-365.79"/>
-<text text-anchor="middle" x="155.72" y="-156.94" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M177.98,-155.47C198.53,-171.78 228.14,-195.38 242.42,-207.22"/>
+<polygon fill="red" stroke="red" points="239.8,-209.58 249.61,-213.56 244.43,-204.33 239.8,-209.58"/>
+<text text-anchor="middle" x="175.73" y="-157.62" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
</g>
</svg>
diff --git a/chapter11/docs/graph5.gv b/chapter11/docs/graph5.gv
index f89a83ac..0baa512f 100644
--- a/chapter11/docs/graph5.gv
+++ b/chapter11/docs/graph5.gv
@@ -21,11 +21,12 @@ return v;
<TR><TD BGCOLOR="yellow">Start</TD></TR>
<TR><TD>
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">arg</TD><TD PORT="p2">$2</TD></TR>
+ <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">$mem</TD><TD PORT="p2">arg</TD></TR>
</TABLE>
</TD></TR>
</TABLE>>
];
+ MemMerge [ shape=box label="MemMerge" ];
Stop3 [ shape=box style=filled fillcolor=yellow label="Stop" ];
Con_4 [ label="#0" ];
new9 [ label="new S" ];
@@ -57,10 +58,10 @@ return v;
</TD></TR>
</TABLE>>
];
- Phi_230 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_230 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Store31 [ label=".f =" ];
Region32 [ shape=box style=filled fillcolor=yellow label="Region" ];
- Phi_233 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_233 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Sub35 [ label="-" ];
Con_36 [ label="#1" ];
Return37 [ shape=box style=filled fillcolor=yellow label="Return" ];
@@ -71,13 +72,13 @@ return v;
Stop3 -> Return37[taillabel=0 color=red];
new9 -> Start2:p0[taillabel=0 color=green];
Store10 -> Start2:p0[taillabel=0 color=red];
- Store10 -> Start2:p2[taillabel=1 color=blue];
+ Store10 -> Start2:p1[taillabel=1 color=blue];
Store10 -> new9[taillabel=2];
Store10 -> Con_4[taillabel=3];
Loop11 -> Start2:p0[taillabel=1 color=red];
Loop11 -> Region32[taillabel=2 color=red constraint=false];
Phi_arg13 -> Loop11 [style=dotted taillabel=0];
- Phi_arg13 -> Start2:p1[taillabel=1];
+ Phi_arg13 -> Start2:p2[taillabel=1];
Phi_arg13 -> Sub35[taillabel=2 constraint=false];
LT14 -> Loop11[taillabel=0 color=red];
LT14 -> Con_4[taillabel=1];
@@ -85,7 +86,7 @@ return v;
If16 -> Loop11[taillabel=0 color=red];
If16 -> LT14[taillabel=1];
Div21 -> Start2[taillabel=0 color=red];
- Div21 -> Start2:p1[taillabel=1];
+ Div21 -> Start2:p2[taillabel=1];
Div21 -> Con_22[taillabel=2];
EQ23 -> Loop11[taillabel=0 color=red];
EQ23 -> Phi_arg13[taillabel=1];
@@ -108,6 +109,9 @@ return v;
Sub35 -> Phi_arg13[taillabel=1];
Sub35 -> Con_36[taillabel=2];
Return37 -> If16:p1[taillabel=0 color=red];
- Return37 -> new9[taillabel=1];
- Return37 -> Phi_230[taillabel=2 color=blue];
+ Return37 -> new9[taillabel=2];
+ Return37 -> MemMerge[taillabel=1 color=blue];
+ MemMerge -> Start2:p1[taillabel=1 color=blue];
+ MemMerge -> Phi_230[taillabel=2 color=blue];
+ MemMerge -> Loop11[taillabel=0 color=green];
}
diff --git a/chapter11/docs/graph5.svg b/chapter11/docs/graph5.svg
index 6dbf29f9..9336ac3e 100644
--- a/chapter11/docs/graph5.svg
+++ b/chapter11/docs/graph5.svg
@@ -1,452 +1,472 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.43.0 (0)
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: chapter11 Pages: 1 -->
-<svg width="474pt" height="680pt"
- viewBox="0.00 0.00 474.00 679.67" 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 675.67)">
+<svg width="526pt" height="689pt"
+ viewBox="0.00 0.00 526.00 688.57" 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 684.57)">
<title>chapter11</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-675.67 470,-675.67 470,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-684.57 522,-684.57 522,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="8,-23.67 8,-663.67 458,-663.67 458,-23.67 8,-23.67"/>
+<polygon fill="none" stroke="black" points="8,-23.57 8,-672.57 510,-672.57 510,-23.57 8,-23.57"/>
</g>
<!-- Start2 -->
<g id="node1" class="node">
<title>Start2</title>
-<polygon fill="yellow" stroke="transparent" points="109,-626.67 109,-651.67 215,-651.67 215,-626.67 109,-626.67"/>
-<polygon fill="none" stroke="black" points="109,-626.67 109,-651.67 215,-651.67 215,-626.67 109,-626.67"/>
-<text text-anchor="start" x="143.5" y="-635.47" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="109,-595.67 109,-626.67 215,-626.67 215,-595.67 109,-595.67"/>
-<polygon fill="yellow" stroke="transparent" points="114,-600.67 114,-621.67 154,-621.67 154,-600.67 114,-600.67"/>
-<polygon fill="none" stroke="black" points="114,-600.67 114,-621.67 154,-621.67 154,-600.67 114,-600.67"/>
-<text text-anchor="start" x="117" y="-607.47" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="154,-600.67 154,-621.67 185,-621.67 185,-600.67 154,-600.67"/>
-<text text-anchor="start" x="157" y="-607.47" font-family="Times,serif" font-size="14.00">arg</text>
-<polygon fill="none" stroke="black" points="185,-600.67 185,-621.67 210,-621.67 210,-600.67 185,-600.67"/>
-<text text-anchor="start" x="188" y="-607.47" font-family="Times,serif" font-size="14.00">$2</text>
+<polygon fill="yellow" stroke="none" points="146.38,-634.07 146.38,-660.57 251.62,-660.57 251.62,-634.07 146.38,-634.07"/>
+<polygon fill="none" stroke="black" points="146.38,-634.07 146.38,-660.57 251.62,-660.57 251.62,-634.07 146.38,-634.07"/>
+<text text-anchor="start" x="186.25" y="-642.27" font-family="Times New Roman,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="146.38,-601.57 146.38,-634.07 251.62,-634.07 251.62,-601.57 146.38,-601.57"/>
+<polygon fill="yellow" stroke="none" points="151.38,-606.57 151.38,-629.07 182.12,-629.07 182.12,-606.57 151.38,-606.57"/>
+<polygon fill="none" stroke="black" points="151.38,-606.57 151.38,-629.07 182.12,-629.07 182.12,-606.57 151.38,-606.57"/>
+<text text-anchor="start" x="154.38" y="-612.77" font-family="Times New Roman,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="182.12,-606.57 182.12,-629.07 223.38,-629.07 223.38,-606.57 182.12,-606.57"/>
+<text text-anchor="start" x="185.12" y="-612.77" font-family="Times New Roman,serif" font-size="14.00">$mem</text>
+<polygon fill="none" stroke="black" points="223.38,-606.57 223.38,-629.07 246.62,-629.07 246.62,-606.57 223.38,-606.57"/>
+<text text-anchor="start" x="226.38" y="-612.77" font-family="Times New Roman,serif" font-size="14.00">arg</text>
+</g>
+<!-- MemMerge -->
+<g id="node2" class="node">
+<title>MemMerge</title>
+<polygon fill="none" stroke="black" points="190,-345.57 108,-345.57 108,-309.57 190,-309.57 190,-345.57"/>
+<text text-anchor="middle" x="149" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+</g>
+<!-- MemMerge&#45;&gt;Start2 -->
+<g id="edge43" class="edge">
+<title>MemMerge&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="blue" d="M157.48,-345.84C162.13,-356.02 167.63,-369.27 171,-381.57 196.5,-474.76 202.31,-502.84 202.73,-594.11"/>
+<polygon fill="blue" stroke="blue" points="199.22,-594.06 202.75,-604.05 206.22,-594.04 199.22,-594.06"/>
+<text text-anchor="middle" x="155.23" y="-347.99" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Loop11 -->
+<g id="node7" class="node">
+<title>Loop11</title>
+<polygon fill="yellow" stroke="black" points="274,-417.57 220,-417.57 220,-381.57 274,-381.57 274,-417.57"/>
+<text text-anchor="middle" x="247" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">Loop</text>
+</g>
+<!-- MemMerge&#45;&gt;Loop11 -->
+<g id="edge45" class="edge">
+<title>MemMerge&#45;&gt;Loop11</title>
+<path fill="none" stroke="green" d="M173.48,-346.05C185.61,-354.72 200.45,-365.32 213.61,-374.72"/>
+<polygon fill="green" stroke="green" points="211.43,-377.46 221.6,-380.43 215.5,-371.76 211.43,-377.46"/>
+<text text-anchor="middle" x="171.23" y="-348.2" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Phi_230 -->
+<g id="node16" class="node">
+<title>Phi_230</title>
+<ellipse fill="lightyellow" stroke="black" cx="109" cy="-399.57" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="109" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
+</g>
+<!-- MemMerge&#45;&gt;Phi_230 -->
+<g id="edge44" class="edge">
+<title>MemMerge&#45;&gt;Phi_230</title>
+<path fill="none" stroke="blue" d="M139.11,-345.87C134.66,-353.67 129.29,-363.06 124.33,-371.74"/>
+<polygon fill="blue" stroke="blue" points="121.45,-369.73 119.52,-380.15 127.53,-373.2 121.45,-369.73"/>
+<text text-anchor="middle" x="136.86" y="-348.02" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Stop3 -->
-<g id="node2" class="node">
+<g id="node3" class="node">
<title>Stop3</title>
-<polygon fill="yellow" stroke="black" points="178,-67.67 124,-67.67 124,-31.67 178,-31.67 178,-67.67"/>
-<text text-anchor="middle" x="151" y="-45.97" font-family="Times,serif" font-size="14.00">Stop</text>
+<polygon fill="yellow" stroke="black" points="194,-67.57 140,-67.57 140,-31.57 194,-31.57 194,-67.57"/>
+<text text-anchor="middle" x="167" y="-44.52" font-family="Times New Roman,serif" font-size="14.00">Stop</text>
</g>
<!-- Return37 -->
-<g id="node21" class="node">
+<g id="node22" class="node">
<title>Return37</title>
-<polygon fill="yellow" stroke="black" points="184,-153.67 118,-153.67 118,-117.67 184,-117.67 184,-153.67"/>
-<text text-anchor="middle" x="151" y="-131.97" font-family="Times,serif" font-size="14.00">Return</text>
+<polygon fill="yellow" stroke="black" points="183,-155.07 129,-155.07 129,-119.07 183,-119.07 183,-155.07"/>
+<text text-anchor="middle" x="156" y="-132.02" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Stop3&#45;&gt;Return37 -->
<g id="edge1" class="edge">
<title>Stop3&#45;&gt;Return37</title>
-<path fill="none" stroke="red" d="M151,-68.08C151,-79.42 151,-94.45 151,-107.36"/>
-<polygon fill="red" stroke="red" points="147.5,-107.58 151,-117.58 154.5,-107.58 147.5,-107.58"/>
-<text text-anchor="middle" x="148" y="-70.68" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M164.77,-67.87C163.31,-79.22 161.37,-94.35 159.68,-107.47"/>
+<polygon fill="red" stroke="red" points="156.22,-106.92 158.42,-117.29 163.16,-107.82 156.22,-106.92"/>
+<text text-anchor="middle" x="162.52" y="-70.02" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_4 -->
-<g id="node3" class="node">
+<g id="node4" class="node">
<title>Con_4</title>
-<ellipse fill="none" stroke="black" cx="262" cy="-537.67" rx="27" ry="18"/>
-<text text-anchor="middle" x="262" y="-533.97" font-family="Times,serif" font-size="14.00">#0</text>
+<ellipse fill="none" stroke="black" cx="241" cy="-543.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="241" y="-538.52" font-family="Times New Roman,serif" font-size="14.00">#0</text>
</g>
<!-- new9 -->
-<g id="node4" class="node">
+<g id="node5" class="node">
<title>new9</title>
-<ellipse fill="none" stroke="black" cx="127" cy="-537.67" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="127" y="-533.97" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="122" cy="-543.57" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="122" y="-538.52" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new9&#45;&gt;Start2 -->
<g id="edge2" class="edge">
<title>new9&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M130.01,-555.71C131.49,-565.24 133.09,-577.6 133.72,-589.67"/>
-<polygon fill="green" stroke="green" points="130.22,-589.78 134,-599.67 137.22,-589.58 130.22,-589.78"/>
-<text text-anchor="middle" x="127.01" y="-558.31" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M140.72,-558.99C150.49,-567.91 161.22,-580.35 165.17,-594.47"/>
+<polygon fill="green" stroke="green" points="161.67,-594.66 166.54,-604.07 168.6,-593.67 161.67,-594.66"/>
+<text text-anchor="middle" x="138.47" y="-561.14" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store10 -->
-<g id="node5" class="node">
+<g id="node6" class="node">
<title>Store10</title>
-<ellipse fill="none" stroke="black" cx="138" cy="-465.67" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="138" y="-461.97" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="128" cy="-471.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="128" y="-466.52" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store10&#45;&gt;Start2 -->
<g id="edge3" class="edge">
<title>Store10&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M154.15,-480.42C167.51,-493.39 184.39,-514.14 185,-536.67"/>
-<path fill="none" stroke="red" d="M185,-538.67C185.75,-566.42 153.85,-566.41 140.14,-582.26"/>
-<polygon fill="red" stroke="red" points="136.81,-581.05 135.08,-591.5 142.95,-584.41 136.81,-581.05"/>
-<text text-anchor="middle" x="151.15" y="-483.02" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
-</g>
-<!-- Store10&#45;&gt;Start2 -->
-<g id="edge4" class="edge">
-<title>Store10&#45;&gt;Start2:p2</title>
-<path fill="none" stroke="blue" d="M155.9,-479.6C167.73,-489.22 182.4,-503.45 190,-519.67 203.61,-548.75 199.22,-561.31 198.19,-589.48"/>
-<polygon fill="blue" stroke="blue" points="194.69,-589.61 198,-599.67 201.69,-589.74 194.69,-589.61"/>
-<text text-anchor="middle" x="158.9" y="-482.2" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M142.02,-487.46C150.41,-497.42 160.33,-511.27 165,-525.57 174.79,-555.54 168.59,-567.3 167.06,-594.37"/>
+<polygon fill="red" stroke="red" points="163.57,-593.96 166.79,-604.05 170.57,-594.15 163.57,-593.96"/>
+<text text-anchor="middle" x="144.27" y="-489.61" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store10&#45;&gt;Con_4 -->
<g id="edge6" class="edge">
<title>Store10&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M158.48,-478.23C178.79,-489.7 210.11,-507.38 232.98,-520.29"/>
-<polygon fill="black" stroke="black" points="231.48,-523.46 241.9,-525.33 234.92,-517.37 231.48,-523.46"/>
-<text text-anchor="middle" x="155.48" y="-471.83" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M147.43,-484.6C165.24,-495.63 191.86,-512.12 212.15,-524.7"/>
+<polygon fill="black" stroke="black" points="210.2,-527.6 220.54,-529.89 213.88,-521.65 210.2,-527.6"/>
+<text text-anchor="middle" x="149.68" y="-486.75" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store10&#45;&gt;new9 -->
<g id="edge5" class="edge">
<title>Store10&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M135.34,-483.62C134.13,-491.33 132.66,-500.65 131.3,-509.31"/>
-<polygon fill="black" stroke="black" points="127.81,-508.98 129.71,-519.4 134.72,-510.06 127.81,-508.98"/>
-<text text-anchor="middle" x="132.34" y="-486.22" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
-</g>
-<!-- Loop11 -->
-<g id="node6" class="node">
-<title>Loop11</title>
-<polygon fill="yellow" stroke="black" points="194,-411.67 140,-411.67 140,-375.67 194,-375.67 194,-411.67"/>
-<text text-anchor="middle" x="167" y="-389.97" font-family="Times,serif" font-size="14.00">Loop</text>
+<path fill="none" stroke="black" d="M126.52,-489.87C125.89,-497.16 125.15,-505.84 124.45,-514.03"/>
+<polygon fill="black" stroke="black" points="120.96,-513.69 123.6,-523.95 127.94,-514.29 120.96,-513.69"/>
+<text text-anchor="middle" x="124.27" y="-492.02" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Loop11&#45;&gt;Start2 -->
<g id="edge7" class="edge">
<title>Loop11&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M170.34,-412.08C175.19,-438.77 183.78,-491.46 185,-536.67"/>
-<text text-anchor="middle" x="167.34" y="-414.68" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M257.71,-417.74C275.77,-449.11 307.46,-516.61 277,-561.57 249.83,-601.66 179.64,-560.76 168.31,-594.59"/>
+<polygon fill="red" stroke="red" points="164.9,-593.67 166.96,-604.07 171.83,-594.66 164.9,-593.67"/>
+<text text-anchor="middle" x="255.46" y="-419.89" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region32 -->
-<g id="node17" class="node">
+<g id="node18" class="node">
<title>Region32</title>
-<polygon fill="yellow" stroke="black" points="268,-67.67 202,-67.67 202,-31.67 268,-31.67 268,-67.67"/>
-<text text-anchor="middle" x="235" y="-45.97" font-family="Times,serif" font-size="14.00">Region</text>
+<polygon fill="yellow" stroke="black" points="277.5,-67.57 222.5,-67.57 222.5,-31.57 277.5,-31.57 277.5,-67.57"/>
+<text text-anchor="middle" x="250" y="-44.52" font-family="Times New Roman,serif" font-size="14.00">Region</text>
</g>
<!-- Loop11&#45;&gt;Region32 -->
<g id="edge8" class="edge">
<title>Loop11&#45;&gt;Region32</title>
-<path fill="none" stroke="red" d="M155.44,-375.36C125.2,-327.71 50.11,-192.34 109,-103.67 114.01,-96.13 157.85,-78.74 192.42,-65.93"/>
-<polygon fill="red" stroke="red" points="193.71,-69.18 201.89,-62.45 191.3,-62.61 193.71,-69.18"/>
-<text text-anchor="middle" x="152.44" y="-368.96" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M259.49,-381.16C271.43,-362.17 285.63,-331.55 271,-309.57 248.04,-275.07 216.63,-300.33 185,-273.57 123.24,-221.32 74.87,-170.7 120,-103.57 122.76,-99.46 174.37,-79.22 211.72,-64.98"/>
+<polygon fill="red" stroke="red" points="212.79,-68.32 220.89,-61.49 210.3,-61.77 212.79,-68.32"/>
+<text text-anchor="middle" x="257.24" y="-373.56" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_arg13 -->
-<g id="node7" class="node">
+<g id="node8" class="node">
<title>Phi_arg13</title>
-<ellipse fill="lightyellow" stroke="black" cx="341" cy="-393.67" rx="37.09" ry="18"/>
-<text text-anchor="middle" x="341" y="-389.97" font-family="Times,serif" font-size="14.00">φ_arg</text>
+<ellipse fill="lightyellow" stroke="black" cx="325" cy="-399.57" rx="32.93" ry="18"/>
+<text text-anchor="middle" x="325" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">φ_arg</text>
</g>
<!-- Phi_arg13&#45;&gt;Start2 -->
<g id="edge10" class="edge">
-<title>Phi_arg13&#45;&gt;Start2:p1</title>
-<path fill="none" stroke="black" d="M341.39,-411.71C341.18,-444.06 336.07,-514.83 298,-555.67 259.62,-596.84 181.02,-546.84 171.05,-589.48"/>
-<polygon fill="black" stroke="black" points="167.54,-589.37 170,-599.67 174.5,-590.09 167.54,-589.37"/>
-<text text-anchor="middle" x="338.39" y="-414.31" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<title>Phi_arg13&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M326.47,-417.98C329.72,-467.11 332.08,-604.13 258.97,-616.86"/>
+<polygon fill="black" stroke="black" points="258.81,-613.36 249.13,-617.69 259.39,-620.34 258.81,-613.36"/>
+<text text-anchor="middle" x="324.22" y="-420.13" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_arg13&#45;&gt;Loop11 -->
<g id="edge9" class="edge">
<title>Phi_arg13&#45;&gt;Loop11</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M321.44,-378.23C310.28,-370.41 295.63,-361.73 281,-357.67 251.45,-349.49 240.94,-347.52 212,-357.67 204.86,-360.18 198.01,-364.35 191.91,-368.97"/>
-<polygon fill="black" stroke="black" points="189.55,-366.38 184.08,-375.46 194.01,-371.77 189.55,-366.38"/>
-<text text-anchor="middle" x="318.44" y="-371.83" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M291.81,-399.57C289.82,-399.57 287.82,-399.57 285.83,-399.57"/>
+<polygon fill="black" stroke="black" points="285.94,-396.07 275.94,-399.57 285.94,-403.07 285.94,-396.07"/>
+<text text-anchor="middle" x="289.56" y="-391.97" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Sub35 -->
-<g id="node19" class="node">
+<g id="node20" class="node">
<title>Sub35</title>
-<ellipse fill="none" stroke="black" cx="217" cy="-321.67" rx="27" ry="18"/>
-<text text-anchor="middle" x="217" y="-317.97" font-family="Times,serif" font-size="14.00">&#45;</text>
+<ellipse fill="none" stroke="black" cx="439" cy="-327.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="439" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">&#45;</text>
</g>
<!-- LT14 -->
-<g id="node8" class="node">
+<g id="node9" class="node">
<title>LT14</title>
-<ellipse fill="none" stroke="black" cx="289" cy="-321.67" rx="27" ry="18"/>
-<text text-anchor="middle" x="289" y="-317.97" font-family="Times,serif" font-size="14.00">&lt;</text>
+<ellipse fill="none" stroke="black" cx="235" cy="-327.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="235" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">&lt;</text>
</g>
<!-- LT14&#45;&gt;Con_4 -->
<g id="edge13" class="edge">
<title>LT14&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M286.84,-339.83C282.17,-376.84 271.11,-464.49 265.46,-509.29"/>
-<polygon fill="black" stroke="black" points="261.95,-509.08 264.17,-519.44 268.9,-509.96 261.95,-509.08"/>
-<text text-anchor="middle" x="283.84" y="-342.43" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M225.54,-344.65C220.11,-354.85 213.81,-368.53 211,-381.57 200.86,-428.55 217.2,-483.7 229.46,-515.73"/>
+<polygon fill="black" stroke="black" points="226.06,-516.65 233.02,-524.64 232.56,-514.06 226.06,-516.65"/>
+<text text-anchor="middle" x="223.29" y="-346.8" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- LT14&#45;&gt;Loop11 -->
<g id="edge12" class="edge">
<title>LT14&#45;&gt;Loop11</title>
-<path fill="none" stroke="red" d="M269.13,-334.08C251.28,-344.31 224.66,-359.59 203.06,-371.98"/>
-<polygon fill="red" stroke="red" points="201.09,-369.08 194.16,-377.09 204.57,-375.15 201.09,-369.08"/>
-<text text-anchor="middle" x="266.13" y="-336.68" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M237.97,-345.87C239.23,-353.24 240.74,-362.04 242.16,-370.32"/>
+<polygon fill="red" stroke="red" points="238.67,-370.7 243.81,-379.97 245.57,-369.52 238.67,-370.7"/>
+<text text-anchor="middle" x="235.72" y="-348.02" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- LT14&#45;&gt;Phi_arg13 -->
<g id="edge14" class="edge">
<title>LT14&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M300.54,-338.21C307.02,-346.93 315.26,-358.02 322.61,-367.91"/>
-<polygon fill="black" stroke="black" points="319.99,-370.27 328.77,-376.21 325.61,-366.09 319.99,-370.27"/>
-<text text-anchor="middle" x="297.54" y="-340.81" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M251.93,-341.73C264.83,-351.77 282.86,-365.79 297.78,-377.4"/>
+<polygon fill="black" stroke="black" points="295.36,-379.95 305.4,-383.32 299.66,-374.42 295.36,-379.95"/>
+<text text-anchor="middle" x="249.68" y="-343.88" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- If16 -->
-<g id="node9" class="node">
+<g id="node10" class="node">
<title>If16</title>
-<polygon fill="yellow" stroke="transparent" points="205,-238.67 205,-263.67 299,-263.67 299,-238.67 205,-238.67"/>
-<polygon fill="none" stroke="black" points="205,-238.67 205,-263.67 299,-263.67 299,-238.67 205,-238.67"/>
-<text text-anchor="start" x="246.5" y="-247.47" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="205,-207.67 205,-238.67 299,-238.67 299,-207.67 205,-207.67"/>
-<polygon fill="yellow" stroke="transparent" points="210,-212.67 210,-233.67 250,-233.67 250,-212.67 210,-212.67"/>
-<polygon fill="none" stroke="black" points="210,-212.67 210,-233.67 250,-233.67 250,-212.67 210,-212.67"/>
-<text text-anchor="start" x="213" y="-219.47" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="250,-212.67 250,-233.67 294,-233.67 294,-212.67 250,-212.67"/>
-<polygon fill="none" stroke="black" points="250,-212.67 250,-233.67 294,-233.67 294,-212.67 250,-212.67"/>
-<text text-anchor="start" x="253" y="-219.47" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="202,-243.07 202,-269.57 278,-269.57 278,-243.07 202,-243.07"/>
+<polygon fill="none" stroke="black" points="202,-243.07 202,-269.57 278,-269.57 278,-243.07 202,-243.07"/>
+<text text-anchor="start" x="235.5" y="-251.27" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="202,-210.57 202,-243.07 278,-243.07 278,-210.57 202,-210.57"/>
+<polygon fill="yellow" stroke="none" points="207,-215.57 207,-238.07 238.5,-238.07 238.5,-215.57 207,-215.57"/>
+<polygon fill="none" stroke="black" points="207,-215.57 207,-238.07 238.5,-238.07 238.5,-215.57 207,-215.57"/>
+<text text-anchor="start" x="210" y="-221.77" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="238.5,-215.57 238.5,-238.07 273,-238.07 273,-215.57 238.5,-215.57"/>
+<polygon fill="none" stroke="black" points="238.5,-215.57 238.5,-238.07 273,-238.07 273,-215.57 238.5,-215.57"/>
+<text text-anchor="start" x="241.5" y="-221.77" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- If16&#45;&gt;Loop11 -->
<g id="edge15" class="edge">
<title>If16&#45;&gt;Loop11</title>
-<path fill="none" stroke="red" d="M209.76,-267.98C198.76,-278.17 188.03,-290.33 181,-303.67 170.94,-322.76 167.65,-347.11 166.77,-365.52"/>
-<polygon fill="red" stroke="red" points="163.27,-365.49 166.49,-375.59 170.26,-365.69 163.27,-365.49"/>
-<text text-anchor="middle" x="206.76" y="-270.58" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M267.48,-273.51C274.99,-284.3 282.12,-296.82 286,-309.57 290.66,-324.87 290.99,-330.36 286,-345.57 282.88,-355.08 277.32,-364.3 271.36,-372.3"/>
+<polygon fill="red" stroke="red" points="268.78,-369.92 265.24,-379.91 274.24,-374.31 268.78,-369.92"/>
+<text text-anchor="middle" x="265.23" y="-275.66" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- If16&#45;&gt;LT14 -->
<g id="edge16" class="edge">
<title>If16&#45;&gt;LT14</title>
-<path fill="none" stroke="black" d="M265.78,-267.95C269.68,-276.8 273.87,-286.34 277.62,-294.83"/>
-<polygon fill="black" stroke="black" points="274.52,-296.48 281.75,-304.22 280.92,-293.65 274.52,-296.48"/>
-<text text-anchor="middle" x="262.78" y="-270.55" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M238.11,-273.39C237.63,-281.55 237.12,-290.26 236.66,-298.21"/>
+<polygon fill="black" stroke="black" points="233.17,-297.84 236.08,-308.03 240.16,-298.25 233.17,-297.84"/>
+<text text-anchor="middle" x="235.86" y="-275.54" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Div21 -->
-<g id="node10" class="node">
+<g id="node11" class="node">
<title>Div21</title>
-<ellipse fill="none" stroke="black" cx="43" cy="-537.67" rx="27" ry="18"/>
-<text text-anchor="middle" x="43" y="-533.97" font-family="Times,serif" font-size="14.00">//</text>
+<ellipse fill="none" stroke="black" cx="43" cy="-543.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-538.52" font-family="Times New Roman,serif" font-size="14.00">//</text>
</g>
<!-- Div21&#45;&gt;Start2 -->
<g id="edge17" class="edge">
<title>Div21&#45;&gt;Start2</title>
-<path fill="none" stroke="red" d="M60.82,-551.25C73.8,-560.41 92.1,-573.33 109.58,-585.67"/>
-<polygon fill="red" stroke="red" points="107.88,-588.75 118.07,-591.66 111.91,-583.04 107.88,-588.75"/>
-<text text-anchor="middle" x="57.82" y="-553.85" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M63.39,-555.74C80.45,-565.09 105.82,-578.99 130.01,-592.25"/>
+<polygon fill="red" stroke="red" points="128.14,-595.22 138.59,-596.96 131.5,-589.08 128.14,-595.22"/>
+<text text-anchor="middle" x="65.64" y="-557.89" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Div21&#45;&gt;Start2 -->
<g id="edge18" class="edge">
-<title>Div21&#45;&gt;Start2:p1</title>
-<path fill="none" stroke="black" d="M64.54,-548.87C92.71,-562.22 140.81,-585.08 160.83,-594.93"/>
-<polygon fill="black" stroke="black" points="159.51,-598.19 170,-599.67 162.72,-591.97 159.51,-598.19"/>
-<text text-anchor="middle" x="67.54" y="-551.47" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<title>Div21&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M64.07,-555.23C68.91,-557.48 74.08,-559.72 79,-561.57 142.52,-585.33 224.7,-539.5 234.11,-594.15"/>
+<polygon fill="black" stroke="black" points="230.62,-594.36 234.88,-604.06 237.59,-593.81 230.62,-594.36"/>
+<text text-anchor="middle" x="66.32" y="-547.63" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_22 -->
-<g id="node11" class="node">
+<g id="node12" class="node">
<title>Con_22</title>
-<ellipse fill="none" stroke="black" cx="43" cy="-623.67" rx="27" ry="18"/>
-<text text-anchor="middle" x="43" y="-619.97" font-family="Times,serif" font-size="14.00">#3</text>
+<ellipse fill="none" stroke="black" cx="43" cy="-631.07" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-626.02" font-family="Times New Roman,serif" font-size="14.00">#3</text>
</g>
<!-- Div21&#45;&gt;Con_22 -->
<g id="edge19" class="edge">
<title>Div21&#45;&gt;Con_22</title>
-<path fill="none" stroke="black" d="M43,-556.08C43,-567.42 43,-582.45 43,-595.36"/>
-<polygon fill="black" stroke="black" points="39.5,-595.58 43,-605.58 46.5,-595.58 39.5,-595.58"/>
-<text text-anchor="middle" x="40" y="-558.68" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M43,-561.87C43,-573.22 43,-588.35 43,-601.47"/>
+<polygon fill="black" stroke="black" points="39.5,-601.28 43,-611.28 46.5,-601.28 39.5,-601.28"/>
+<text text-anchor="middle" x="40.75" y="-564.02" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- EQ23 -->
-<g id="node12" class="node">
+<g id="node13" class="node">
<title>EQ23</title>
-<ellipse fill="none" stroke="black" cx="361" cy="-321.67" rx="27" ry="18"/>
-<text text-anchor="middle" x="361" y="-317.97" font-family="Times,serif" font-size="14.00">==</text>
+<ellipse fill="none" stroke="black" cx="367" cy="-327.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="367" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">==</text>
</g>
<!-- EQ23&#45;&gt;Loop11 -->
<g id="edge20" class="edge">
<title>EQ23&#45;&gt;Loop11</title>
-<path fill="none" stroke="red" d="M339.92,-333.3C335.08,-335.55 329.91,-337.8 325,-339.67 274.96,-358.74 257.65,-355.93 203.69,-375.71"/>
-<polygon fill="red" stroke="red" points="202.46,-372.44 194.33,-379.24 204.92,-378.99 202.46,-372.44"/>
-<text text-anchor="middle" x="336.92" y="-335.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M347.18,-340.12C330.14,-350.07 305.08,-364.69 284.29,-376.81"/>
+<polygon fill="red" stroke="red" points="282.66,-373.71 275.79,-381.77 286.19,-379.76 282.66,-373.71"/>
+<text text-anchor="middle" x="349.43" y="-342.27" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- EQ23&#45;&gt;Phi_arg13 -->
<g id="edge21" class="edge">
<title>EQ23&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M356.16,-339.62C353.93,-347.41 351.23,-356.85 348.74,-365.6"/>
-<polygon fill="black" stroke="black" points="345.32,-364.82 345.94,-375.4 352.05,-366.75 345.32,-364.82"/>
-<text text-anchor="middle" x="353.16" y="-342.22" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M357.26,-344.8C352.4,-352.9 346.4,-362.9 340.89,-372.07"/>
+<polygon fill="black" stroke="black" points="337.9,-370.26 335.76,-380.63 343.9,-373.86 337.9,-370.26"/>
+<text text-anchor="middle" x="355.01" y="-346.95" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_24 -->
-<g id="node13" class="node">
+<g id="node14" class="node">
<title>Con_24</title>
-<ellipse fill="none" stroke="black" cx="423" cy="-393.67" rx="27" ry="18"/>
-<text text-anchor="middle" x="423" y="-389.97" font-family="Times,serif" font-size="14.00">#5</text>
+<ellipse fill="none" stroke="black" cx="403" cy="-399.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="403" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">#5</text>
</g>
<!-- EQ23&#45;&gt;Con_24 -->
<g id="edge22" class="edge">
<title>EQ23&#45;&gt;Con_24</title>
-<path fill="none" stroke="black" d="M374.15,-337.52C382.53,-346.99 393.56,-359.44 403.02,-370.11"/>
-<polygon fill="black" stroke="black" points="400.62,-372.69 409.87,-377.85 405.86,-368.04 400.62,-372.69"/>
-<text text-anchor="middle" x="371.15" y="-340.12" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M375.35,-344.8C379.58,-353.02 384.81,-363.19 389.58,-372.47"/>
+<polygon fill="black" stroke="black" points="386.32,-373.78 394,-381.07 392.54,-370.58 386.32,-373.78"/>
+<text text-anchor="middle" x="373.1" y="-346.95" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- If25 -->
-<g id="node14" class="node">
+<g id="node15" class="node">
<title>If25</title>
-<polygon fill="yellow" stroke="transparent" points="210,-138.67 210,-163.67 304,-163.67 304,-138.67 210,-138.67"/>
-<polygon fill="none" stroke="black" points="210,-138.67 210,-163.67 304,-163.67 304,-138.67 210,-138.67"/>
-<text text-anchor="start" x="251.5" y="-147.47" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="210,-107.67 210,-138.67 304,-138.67 304,-107.67 210,-107.67"/>
-<polygon fill="yellow" stroke="transparent" points="215,-112.67 215,-133.67 255,-133.67 255,-112.67 215,-112.67"/>
-<polygon fill="none" stroke="black" points="215,-112.67 215,-133.67 255,-133.67 255,-112.67 215,-112.67"/>
-<text text-anchor="start" x="218" y="-119.47" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="255,-112.67 255,-133.67 299,-133.67 299,-112.67 255,-112.67"/>
-<polygon fill="none" stroke="black" points="255,-112.67 255,-133.67 299,-133.67 299,-112.67 255,-112.67"/>
-<text text-anchor="start" x="258" y="-119.47" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="229,-140.07 229,-166.57 305,-166.57 305,-140.07 229,-140.07"/>
+<polygon fill="none" stroke="black" points="229,-140.07 229,-166.57 305,-166.57 305,-140.07 229,-140.07"/>
+<text text-anchor="start" x="262.5" y="-148.27" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="229,-107.57 229,-140.07 305,-140.07 305,-107.57 229,-107.57"/>
+<polygon fill="yellow" stroke="none" points="234,-112.57 234,-135.07 265.5,-135.07 265.5,-112.57 234,-112.57"/>
+<polygon fill="none" stroke="black" points="234,-112.57 234,-135.07 265.5,-135.07 265.5,-112.57 234,-112.57"/>
+<text text-anchor="start" x="237" y="-118.77" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="265.5,-112.57 265.5,-135.07 300,-135.07 300,-112.57 265.5,-112.57"/>
+<polygon fill="none" stroke="black" points="265.5,-112.57 265.5,-135.07 300,-135.07 300,-112.57 265.5,-112.57"/>
+<text text-anchor="start" x="268.5" y="-118.77" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- If25&#45;&gt;If16 -->
<g id="edge23" class="edge">
<title>If25&#45;&gt;If16:p0</title>
-<path fill="none" stroke="red" d="M240.36,-167.91C236.06,-178.07 232.22,-189.75 230.69,-201.44"/>
-<polygon fill="red" stroke="red" points="227.18,-201.46 230,-211.67 234.17,-201.93 227.18,-201.46"/>
-<text text-anchor="middle" x="237.36" y="-170.51" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M238.48,-170.44C231.99,-180.18 226.3,-191.42 223.93,-203.17"/>
+<polygon fill="red" stroke="red" points="220.45,-202.75 222.91,-213.06 227.42,-203.47 220.45,-202.75"/>
+<text text-anchor="middle" x="236.23" y="-172.59" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- If25&#45;&gt;EQ23 -->
<g id="edge24" class="edge">
<title>If25&#45;&gt;EQ23</title>
-<path fill="none" stroke="black" d="M288.6,-167.9C298.28,-178.61 308.37,-191.08 316,-203.67 333.46,-232.5 346.27,-269.27 353.66,-293.82"/>
-<polygon fill="black" stroke="black" points="350.33,-294.92 356.49,-303.54 357.05,-292.96 350.33,-294.92"/>
-<text text-anchor="middle" x="285.6" y="-170.5" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
-</g>
-<!-- Phi_230 -->
-<g id="node15" class="node">
-<title>Phi_230</title>
-<ellipse fill="lightyellow" stroke="black" cx="89" cy="-393.67" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="89" y="-389.97" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<path fill="none" stroke="black" d="M295.16,-170.52C303.84,-181.5 312.95,-194.14 320,-206.57 336.96,-236.47 350.49,-273.71 358.6,-298.71"/>
+<polygon fill="black" stroke="black" points="355.23,-299.66 361.58,-308.14 361.91,-297.55 355.23,-299.66"/>
+<text text-anchor="middle" x="292.91" y="-172.67" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_230&#45;&gt;Store10 -->
<g id="edge26" class="edge">
<title>Phi_230&#45;&gt;Store10</title>
-<path fill="none" stroke="blue" d="M100.36,-410.91C106.57,-419.78 114.38,-430.94 121.28,-440.78"/>
-<polygon fill="blue" stroke="blue" points="118.43,-442.82 127.03,-449.01 124.17,-438.81 118.43,-442.82"/>
-<text text-anchor="middle" x="97.36" y="-413.51" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M113.7,-417.87C115.72,-425.33 118.14,-434.24 120.41,-442.6"/>
+<polygon fill="blue" stroke="blue" points="116.96,-443.27 122.96,-452 123.72,-441.43 116.96,-443.27"/>
+<text text-anchor="middle" x="111.45" y="-420.02" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_230&#45;&gt;Loop11 -->
<g id="edge25" class="edge">
<title>Phi_230&#45;&gt;Loop11</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M122.21,-393.67C124.67,-393.67 127.13,-393.67 129.59,-393.67"/>
-<polygon fill="black" stroke="black" points="129.71,-397.17 139.71,-393.67 129.71,-390.17 129.71,-397.17"/>
-<text text-anchor="middle" x="125.21" y="-387.27" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M162.37,-399.57C177.71,-399.57 193.05,-399.57 208.39,-399.57"/>
+<polygon fill="black" stroke="black" points="208.05,-403.07 218.05,-399.57 208.05,-396.07 208.05,-403.07"/>
+<text text-anchor="middle" x="164.62" y="-391.97" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Phi_233 -->
-<g id="node18" class="node">
+<g id="node19" class="node">
<title>Phi_233</title>
-<ellipse fill="lightyellow" stroke="black" cx="61" cy="-49.67" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="61" y="-45.97" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<ellipse fill="lightyellow" stroke="black" cx="69" cy="-49.57" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="69" y="-44.52" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
</g>
<!-- Store31 -->
-<g id="node16" class="node">
+<g id="node17" class="node">
<title>Store31</title>
-<ellipse fill="none" stroke="black" cx="44" cy="-321.67" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="44" y="-317.97" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="43" cy="-327.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="43" y="-322.52" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store31&#45;&gt;new9 -->
<g id="edge30" class="edge">
<title>Store31&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M30,-466.67C39.91,-492.39 65.61,-510.26 88.07,-521.5"/>
-<polygon fill="black" stroke="black" points="86.58,-524.67 97.12,-525.77 89.57,-518.34 86.58,-524.67"/>
-<text text-anchor="middle" x="27" y="-460.27" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M30,-472.57C39.38,-497.6 63.9,-515.54 85.27,-526.98"/>
+<polygon fill="black" stroke="black" points="83.57,-530.04 94.08,-531.4 86.71,-523.79 83.57,-530.04"/>
+<text text-anchor="middle" x="27.75" y="-464.97" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store31&#45;&gt;Loop11 -->
<g id="edge28" class="edge">
<title>Store31&#45;&gt;Loop11</title>
-<path fill="none" stroke="red" d="M64.31,-334.23C82.34,-344.49 109.11,-359.73 130.8,-372.07"/>
-<polygon fill="red" stroke="red" points="129.32,-375.26 139.75,-377.16 132.79,-369.18 129.32,-375.26"/>
-<text text-anchor="middle" x="61.31" y="-336.83" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M66.8,-336.73C101.75,-348.72 167.31,-371.22 208.98,-385.52"/>
+<polygon fill="red" stroke="red" points="207.77,-388.8 218.36,-388.74 210.04,-382.18 207.77,-388.8"/>
+<text text-anchor="middle" x="64.55" y="-338.88" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store31&#45;&gt;Div21 -->
<g id="edge31" class="edge">
<title>Store31&#45;&gt;Div21</title>
-<path fill="none" stroke="black" d="M37.26,-339.26C27.22,-366.66 11.4,-422.52 30,-464.67"/>
-<path fill="none" stroke="black" d="M30,-466.67C35.26,-480.33 38.43,-496.32 40.33,-509.57"/>
-<polygon fill="black" stroke="black" points="36.86,-510.03 41.59,-519.51 43.8,-509.15 36.86,-510.03"/>
-<text text-anchor="middle" x="34.26" y="-341.86" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M36.55,-345.12C26.96,-372.45 11.89,-428.23 30,-470.57"/>
+<path fill="none" stroke="black" d="M30,-472.57C34.94,-485.77 38.06,-501.11 40,-514.05"/>
+<polygon fill="black" stroke="black" points="36.49,-514.19 41.27,-523.64 43.43,-513.27 36.49,-514.19"/>
+<text text-anchor="middle" x="34.3" y="-347.27" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store31&#45;&gt;Phi_230 -->
<g id="edge29" class="edge">
<title>Store31&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M54.21,-338.56C59.77,-347.21 66.77,-358.1 73.04,-367.84"/>
-<polygon fill="blue" stroke="blue" points="70.17,-369.85 78.52,-376.37 76.05,-366.06 70.17,-369.85"/>
-<text text-anchor="middle" x="51.21" y="-341.16" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M57,-343.41C65.39,-352.32 76.28,-363.86 85.92,-374.08"/>
+<polygon fill="blue" stroke="blue" points="83.2,-376.3 92.6,-381.17 88.29,-371.5 83.2,-376.3"/>
+<text text-anchor="middle" x="54.75" y="-345.56" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region32&#45;&gt;If25 -->
<g id="edge32" class="edge">
<title>Region32&#45;&gt;If25:p0</title>
-<path fill="none" stroke="red" d="M235,-67.77C235,-77.22 235,-89.45 235,-101.36"/>
-<polygon fill="red" stroke="red" points="231.5,-101.67 235,-111.67 238.5,-101.67 231.5,-101.67"/>
-<text text-anchor="middle" x="232" y="-70.37" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M249.89,-67.92C249.84,-77.07 249.79,-88.77 249.76,-100.25"/>
+<polygon fill="red" stroke="red" points="246.26,-100.05 249.75,-110.05 253.26,-100.06 246.26,-100.05"/>
+<text text-anchor="middle" x="247.64" y="-70.07" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region32&#45;&gt;If25 -->
<g id="edge33" class="edge">
<title>Region32&#45;&gt;If25:p1</title>
-<path fill="none" stroke="red" d="M255.02,-67.8C263.64,-76.74 272.48,-88.51 275.71,-101.52"/>
-<polygon fill="red" stroke="red" points="272.27,-102.19 277,-111.67 279.22,-101.31 272.27,-102.19"/>
-<text text-anchor="middle" x="252.02" y="-70.4" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M265.22,-67.95C271.77,-76.79 278.57,-88.22 281.39,-100.32"/>
+<polygon fill="red" stroke="red" points="277.9,-100.55 282.57,-110.06 284.84,-99.72 277.9,-100.55"/>
+<text text-anchor="middle" x="262.97" y="-70.1" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_233&#45;&gt;Phi_230 -->
<g id="edge36" class="edge">
<title>Phi_233&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M63.28,-78.47C68.55,-142.92 81.57,-301.9 86.79,-365.62"/>
-<polygon fill="blue" stroke="blue" points="66.73,-77.79 62.43,-68.1 59.75,-78.36 66.73,-77.79"/>
-<polygon fill="blue" stroke="blue" points="83.3,-366 87.61,-375.69 90.28,-365.43 83.3,-366"/>
-<text text-anchor="middle" x="59.43" y="-70.7" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="blue" d="M117.06,-66.52C146.85,-77.29 181.4,-91.65 192,-103.57 212.65,-126.78 191.37,-147.32 212,-170.57 238.69,-200.64 272.94,-172.95 295,-206.57 329.4,-258.98 315.45,-301.36 271,-345.57 244.42,-372 204.48,-385.25 170.9,-391.89"/>
+<polygon fill="blue" stroke="blue" points="118.37,-63.28 107.78,-63.24 116.04,-69.87 118.37,-63.28"/>
+<polygon fill="blue" stroke="blue" points="170.5,-388.41 161.28,-393.63 171.74,-395.3 170.5,-388.41"/>
+<text text-anchor="middle" x="108.6" y="-64.88" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_233&#45;&gt;Store31 -->
<g id="edge35" class="edge">
<title>Phi_233&#45;&gt;Store31</title>
-<path fill="none" stroke="blue" d="M59.91,-67.97C57.03,-113.69 49.21,-238 45.72,-293.4"/>
-<polygon fill="blue" stroke="blue" points="42.22,-293.32 45.08,-303.52 49.2,-293.76 42.22,-293.32"/>
-<text text-anchor="middle" x="56.91" y="-70.57" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M67.37,-67.83C63.02,-114.01 51.09,-240.72 45.7,-297.9"/>
+<polygon fill="blue" stroke="blue" points="42.22,-297.52 44.77,-307.8 49.19,-298.17 42.22,-297.52"/>
+<text text-anchor="middle" x="65.12" y="-69.98" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_233&#45;&gt;Region32 -->
<g id="edge34" class="edge">
<title>Phi_233&#45;&gt;Region32</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M77.36,-33.99C89.26,-23.73 106.31,-11.24 124,-5.67 146.89,1.53 155.28,2.07 178,-5.67 189.71,-9.67 200.89,-17.16 210.2,-24.83"/>
-<polygon fill="black" stroke="black" points="208.03,-27.59 217.86,-31.55 212.65,-22.33 208.03,-27.59"/>
-<text text-anchor="middle" x="74.36" y="-27.59" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M89.57,-32.51C103.01,-22.52 121.45,-10.85 140,-5.57 163.08,1.01 171.32,2.28 194,-5.57 205.22,-9.45 215.9,-16.6 224.86,-24.03"/>
+<polygon fill="black" stroke="black" points="222.28,-26.42 232.09,-30.44 226.93,-21.19 222.28,-26.42"/>
+<text text-anchor="middle" x="87.32" y="-24.91" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Sub35&#45;&gt;Loop11 -->
<g id="edge37" class="edge">
<title>Sub35&#45;&gt;Loop11</title>
-<path fill="none" stroke="red" d="M205.9,-338.21C199.85,-346.68 192.2,-357.39 185.3,-367.06"/>
-<polygon fill="red" stroke="red" points="182.44,-365.04 179.47,-375.21 188.13,-369.11 182.44,-365.04"/>
-<text text-anchor="middle" x="202.9" y="-340.81" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M417.91,-339.17C413.07,-341.42 407.9,-343.68 403,-345.57 354.16,-364.3 337.06,-362 284.88,-381.16"/>
+<polygon fill="red" stroke="red" points="283.87,-377.8 275.75,-384.61 286.34,-384.35 283.87,-377.8"/>
+<text text-anchor="middle" x="415.66" y="-341.32" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Sub35&#45;&gt;Phi_arg13 -->
<g id="edge38" class="edge">
<title>Sub35&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M245.77,-338.92C264.66,-349.58 289.38,-363.54 308.91,-374.56"/>
-<polygon fill="black" stroke="black" points="247.35,-335.79 236.92,-333.92 243.91,-341.89 247.35,-335.79"/>
-<polygon fill="black" stroke="black" points="307.32,-377.68 317.75,-379.55 310.76,-371.58 307.32,-377.68"/>
-<text text-anchor="middle" x="233.92" y="-336.52" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M409.92,-346.42C393.35,-356.59 372.61,-369.33 355.78,-379.67"/>
+<polygon fill="black" stroke="black" points="411.68,-349.45 418.37,-341.23 408.02,-343.48 411.68,-349.45"/>
+<polygon fill="black" stroke="black" points="354.36,-376.43 347.67,-384.65 358.02,-382.4 354.36,-376.43"/>
+<text text-anchor="middle" x="419.66" y="-342.59" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_36 -->
-<g id="node20" class="node">
+<g id="node21" class="node">
<title>Con_36</title>
-<ellipse fill="none" stroke="black" cx="239" cy="-393.67" rx="27" ry="18"/>
-<text text-anchor="middle" x="239" y="-389.97" font-family="Times,serif" font-size="14.00">#1</text>
+<ellipse fill="none" stroke="black" cx="475" cy="-399.57" rx="27" ry="18"/>
+<text text-anchor="middle" x="475" y="-394.52" font-family="Times New Roman,serif" font-size="14.00">#1</text>
</g>
<!-- Sub35&#45;&gt;Con_36 -->
<g id="edge39" class="edge">
<title>Sub35&#45;&gt;Con_36</title>
-<path fill="none" stroke="black" d="M222.33,-339.62C224.84,-347.62 227.9,-357.34 230.7,-366.27"/>
-<polygon fill="black" stroke="black" points="227.39,-367.39 233.72,-375.89 234.06,-365.3 227.39,-367.39"/>
-<text text-anchor="middle" x="219.33" y="-342.22" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M447.35,-344.8C451.58,-353.02 456.81,-363.19 461.58,-372.47"/>
+<polygon fill="black" stroke="black" points="458.32,-373.78 466,-381.07 464.54,-370.58 458.32,-373.78"/>
+<text text-anchor="middle" x="445.1" y="-346.95" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Return37&#45;&gt;MemMerge -->
+<g id="edge42" class="edge">
+<title>Return37&#45;&gt;MemMerge</title>
+<path fill="none" stroke="blue" d="M89,-241.07C86.12,-264.36 101.49,-285.96 117.39,-301.62"/>
+<polygon fill="blue" stroke="blue" points="114.82,-304.01 124.55,-308.22 119.57,-298.86 114.82,-304.01"/>
+<text text-anchor="middle" x="86.75" y="-233.47" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Return37&#45;&gt;new9 -->
<g id="edge41" class="edge">
<title>Return37&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M152.88,-153.84C154.6,-173.54 156.18,-206.74 151,-234.67"/>
-<path fill="none" stroke="black" d="M151,-236.67C140.92,-291.1 115.67,-296.53 81,-339.67 67.22,-356.83 55.13,-355.22 47,-375.67 26.8,-426.48 71.69,-483.13 102.06,-513.85"/>
-<polygon fill="black" stroke="black" points="99.83,-516.56 109.42,-521.08 104.74,-511.57 99.83,-516.56"/>
-<text text-anchor="middle" x="149.88" y="-156.44" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M137.23,-155.23C118.91,-173.78 93.19,-205.24 89,-239.07"/>
+<path fill="none" stroke="black" d="M89,-241.07C83.27,-287.37 97.64,-302.79 79,-345.57 70.45,-365.19 54.61,-361.56 47,-381.57 41.31,-396.52 42.73,-402.15 47,-417.57 57.57,-455.72 83.23,-493.93 101.59,-517.87"/>
+<polygon fill="black" stroke="black" points="98.84,-520.03 107.77,-525.73 104.34,-515.7 98.84,-520.03"/>
+<text text-anchor="middle" x="134.98" y="-157.38" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Return37&#45;&gt;If16 -->
<g id="edge40" class="edge">
<title>Return37&#45;&gt;If16:p1</title>
-<path fill="none" stroke="red" d="M173.3,-153.95C179.56,-158.57 186.45,-163.46 193,-167.67 223.49,-187.31 263.28,-174.61 270.76,-201.47"/>
-<polygon fill="red" stroke="red" points="267.32,-202.17 272,-211.67 274.27,-201.33 267.32,-202.17"/>
-<text text-anchor="middle" x="170.3" y="-156.55" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
-</g>
-<!-- Return37&#45;&gt;Phi_230 -->
-<g id="edge42" class="edge">
-<title>Return37&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M151,-236.67C145.42,-285.27 120.51,-337.2 104.01,-367.2"/>
-<polygon fill="blue" stroke="blue" points="100.84,-365.71 98.99,-376.14 106.94,-369.14 100.84,-365.71"/>
-<text text-anchor="middle" x="148" y="-230.27" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M177.62,-155.38C183.85,-160.32 190.67,-165.69 197,-170.57 219.31,-187.76 246.88,-183.75 254.01,-203.32"/>
+<polygon fill="red" stroke="red" points="250.53,-203.72 255.52,-213.07 257.45,-202.65 250.53,-203.72"/>
+<text text-anchor="middle" x="175.37" y="-157.53" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
</g>
</svg>
diff --git a/chapter11/docs/graph6.gv b/chapter11/docs/graph6.gv
index dfd07d7e..ff97eebc 100644
--- a/chapter11/docs/graph6.gv
+++ b/chapter11/docs/graph6.gv
@@ -21,11 +21,12 @@ return v;
<TR><TD BGCOLOR="yellow">Start</TD></TR>
<TR><TD>
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
- <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">arg</TD><TD PORT="p2">$2</TD></TR>
+ <TR><TD PORT="p0" BGCOLOR="yellow">$ctrl</TD><TD PORT="p1">$mem</TD><TD PORT="p2">arg</TD></TR>
</TABLE>
</TD></TR>
</TABLE>>
];
+ MemMerge [ shape=box label="MemMerge" ];
Stop3 [ shape=box style=filled fillcolor=yellow label="Stop" ];
Con_4 [ label="#0" ];
new9 [ label="new S" ];
@@ -57,10 +58,10 @@ return v;
</TD></TR>
</TABLE>>
];
- Phi_230 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_230 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Store31 [ label=".f =" ];
Region32 [ shape=box style=filled fillcolor=yellow label="Region" ];
- Phi_233 [ style=filled fillcolor=lightyellow label="&phi;_$2" ];
+ Phi_233 [ style=filled fillcolor=lightyellow label="MemPhi_2" ];
Sub35 [ label="-" ];
Con_36 [ label="#1" ];
Return37 [ shape=box style=filled fillcolor=yellow label="Return" ];
@@ -71,13 +72,13 @@ return v;
Stop3 -> Return37[taillabel=0 color=red];
new9 -> Start2:p0[taillabel=0 color=green];
Store10 -> Start2:p0[taillabel=0 color=red];
- Store10 -> Start2:p2[taillabel=1 color=blue];
+ Store10 -> Start2:p1[taillabel=1 color=blue];
Store10 -> new9[taillabel=2];
Store10 -> Con_4[taillabel=3];
Loop11 -> Start2:p0[taillabel=1 color=red];
Loop11 -> Region32[taillabel=2 color=red constraint=false];
Phi_arg13 -> Loop11 [style=dotted taillabel=0];
- Phi_arg13 -> Start2:p1[taillabel=1];
+ Phi_arg13 -> Start2:p2[taillabel=1];
Phi_arg13 -> Sub35[taillabel=2 constraint=false];
LT14 -> Loop11[taillabel=0 color=red];
LT14 -> Con_4[taillabel=1];
@@ -85,7 +86,7 @@ return v;
If16 -> Loop11[taillabel=0 color=red];
If16 -> LT14[taillabel=1];
Div21 -> Start2:p0[taillabel=0 color=red];
- Div21 -> Start2:p1[taillabel=1];
+ Div21 -> Start2:p2[taillabel=1];
Div21 -> Con_22[taillabel=2];
EQ23 -> If16:p0[taillabel=0 color=red];
EQ23 -> Phi_arg13[taillabel=1];
@@ -108,6 +109,9 @@ return v;
Sub35 -> Phi_arg13[taillabel=1];
Sub35 -> Con_36[taillabel=2];
Return37 -> If16:p1[taillabel=0 color=red];
- Return37 -> new9[taillabel=1];
- Return37 -> Phi_230[taillabel=2 color=blue];
+ Return37 -> new9[taillabel=2];
+ Return37 -> MemMerge[taillabel=1 color=blue];
+ MemMerge -> Start2:p1[taillabel=1 color=blue];
+ MemMerge -> Phi_230[taillabel=2 color=blue];
+ MemMerge -> If16:p1[taillabel=0 color=green];
}
diff --git a/chapter11/docs/graph6.svg b/chapter11/docs/graph6.svg
index 354f5d2f..8b8bb190 100644
--- a/chapter11/docs/graph6.svg
+++ b/chapter11/docs/graph6.svg
@@ -1,437 +1,471 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.43.0 (0)
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: chapter11 Pages: 1 -->
-<svg width="382pt" height="880pt"
- viewBox="0.00 0.00 382.00 880.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 876)">
+<svg width="384pt" height="889pt"
+ viewBox="0.00 0.00 384.00 889.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 885)">
<title>chapter11</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-876 378,-876 378,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-885 380,-885 380,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="8,-8 8,-864 366,-864 366,-8 8,-8"/>
+<polygon fill="none" stroke="black" points="8,-8 8,-873 368,-873 368,-8 8,-8"/>
</g>
<!-- Start2 -->
<g id="node1" class="node">
<title>Start2</title>
-<polygon fill="yellow" stroke="transparent" points="160,-827 160,-852 266,-852 266,-827 160,-827"/>
-<polygon fill="none" stroke="black" points="160,-827 160,-852 266,-852 266,-827 160,-827"/>
-<text text-anchor="start" x="194.5" y="-835.8" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="160,-796 160,-827 266,-827 266,-796 160,-796"/>
-<polygon fill="yellow" stroke="transparent" points="165,-801 165,-822 205,-822 205,-801 165,-801"/>
-<polygon fill="none" stroke="black" points="165,-801 165,-822 205,-822 205,-801 165,-801"/>
-<text text-anchor="start" x="168" y="-807.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
-<polygon fill="none" stroke="black" points="205,-801 205,-822 236,-822 236,-801 205,-801"/>
-<text text-anchor="start" x="208" y="-807.8" font-family="Times,serif" font-size="14.00">arg</text>
-<polygon fill="none" stroke="black" points="236,-801 236,-822 261,-822 261,-801 236,-801"/>
-<text text-anchor="start" x="239" y="-807.8" font-family="Times,serif" font-size="14.00">$2</text>
+<polygon fill="yellow" stroke="none" points="172.38,-834.5 172.38,-861 277.62,-861 277.62,-834.5 172.38,-834.5"/>
+<polygon fill="none" stroke="black" points="172.38,-834.5 172.38,-861 277.62,-861 277.62,-834.5 172.38,-834.5"/>
+<text text-anchor="start" x="212.25" y="-842.7" font-family="Times New Roman,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="172.38,-802 172.38,-834.5 277.62,-834.5 277.62,-802 172.38,-802"/>
+<polygon fill="yellow" stroke="none" points="177.38,-807 177.38,-829.5 208.12,-829.5 208.12,-807 177.38,-807"/>
+<polygon fill="none" stroke="black" points="177.38,-807 177.38,-829.5 208.12,-829.5 208.12,-807 177.38,-807"/>
+<text text-anchor="start" x="180.38" y="-813.2" font-family="Times New Roman,serif" font-size="14.00">$ctrl</text>
+<polygon fill="none" stroke="black" points="208.12,-807 208.12,-829.5 249.38,-829.5 249.38,-807 208.12,-807"/>
+<text text-anchor="start" x="211.12" y="-813.2" font-family="Times New Roman,serif" font-size="14.00">$mem</text>
+<polygon fill="none" stroke="black" points="249.38,-807 249.38,-829.5 272.62,-829.5 272.62,-807 249.38,-807"/>
+<text text-anchor="start" x="252.38" y="-813.2" font-family="Times New Roman,serif" font-size="14.00">arg</text>
+</g>
+<!-- MemMerge -->
+<g id="node2" class="node">
+<title>MemMerge</title>
+<polygon fill="none" stroke="black" points="333,-371 251,-371 251,-335 333,-335 333,-371"/>
+<text text-anchor="middle" x="292" y="-347.95" font-family="Times New Roman,serif" font-size="14.00">MemMerge</text>
+</g>
+<!-- MemMerge&#45;&gt;Start2 -->
+<g id="edge43" class="edge">
+<title>MemMerge&#45;&gt;Start2:p1</title>
+<path fill="none" stroke="blue" d="M307.5,-371.34C315.32,-381.11 324.15,-393.96 329,-407 361.8,-495.22 367.07,-526.05 347,-618 331.99,-686.78 323.62,-705.97 281,-762 265.35,-782.58 238.46,-778 230.83,-794.94"/>
+<polygon fill="blue" stroke="blue" points="227.43,-794.04 229.03,-804.51 234.31,-795.33 227.43,-794.04"/>
+<text text-anchor="middle" x="305.25" y="-373.49" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- If16 -->
+<g id="node10" class="node">
+<title>If16</title>
+<polygon fill="yellow" stroke="none" points="236,-443.5 236,-470 312,-470 312,-443.5 236,-443.5"/>
+<polygon fill="none" stroke="black" points="236,-443.5 236,-470 312,-470 312,-443.5 236,-443.5"/>
+<text text-anchor="start" x="269.5" y="-451.7" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="236,-411 236,-443.5 312,-443.5 312,-411 236,-411"/>
+<polygon fill="yellow" stroke="none" points="241,-416 241,-438.5 272.5,-438.5 272.5,-416 241,-416"/>
+<polygon fill="none" stroke="black" points="241,-416 241,-438.5 272.5,-438.5 272.5,-416 241,-416"/>
+<text text-anchor="start" x="244" y="-422.2" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="272.5,-416 272.5,-438.5 307,-438.5 307,-416 272.5,-416"/>
+<polygon fill="none" stroke="black" points="272.5,-416 272.5,-438.5 307,-438.5 307,-416 272.5,-416"/>
+<text text-anchor="start" x="275.5" y="-422.2" font-family="Times New Roman,serif" font-size="14.00">False</text>
+</g>
+<!-- MemMerge&#45;&gt;If16 -->
+<g id="edge45" class="edge">
+<title>MemMerge&#45;&gt;If16:p1</title>
+<path fill="none" stroke="green" d="M291.02,-371.35C290.56,-380.5 290.08,-392.19 289.86,-403.68"/>
+<polygon fill="green" stroke="green" points="286.37,-403.45 289.77,-413.49 293.36,-403.52 286.37,-403.45"/>
+<text text-anchor="middle" x="288.77" y="-373.5" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+</g>
+<!-- Phi_230 -->
+<g id="node16" class="node">
+<title>Phi_230</title>
+<ellipse fill="lightyellow" stroke="black" cx="109" cy="-600" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="109" y="-594.95" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
+</g>
+<!-- MemMerge&#45;&gt;Phi_230 -->
+<g id="edge44" class="edge">
+<title>MemMerge&#45;&gt;Phi_230</title>
+<path fill="none" stroke="blue" d="M262.46,-371.47C248.23,-380.82 231.57,-393.24 219,-407 195.6,-432.6 205.05,-451.1 179,-474 134.6,-513.03 57.61,-467.89 57,-527"/>
+<text text-anchor="middle" x="260.21" y="-373.62" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Stop3 -->
-<g id="node2" class="node">
+<g id="node3" class="node">
<title>Stop3</title>
-<polygon fill="yellow" stroke="black" points="150,-282 96,-282 96,-246 150,-246 150,-282"/>
-<text text-anchor="middle" x="123" y="-260.3" font-family="Times,serif" font-size="14.00">Stop</text>
+<polygon fill="yellow" stroke="black" points="260,-196 206,-196 206,-160 260,-160 260,-196"/>
+<text text-anchor="middle" x="233" y="-172.95" font-family="Times New Roman,serif" font-size="14.00">Stop</text>
</g>
<!-- Return37 -->
-<g id="node21" class="node">
+<g id="node22" class="node">
<title>Return37</title>
-<polygon fill="yellow" stroke="black" points="142,-368 76,-368 76,-332 142,-332 142,-368"/>
-<text text-anchor="middle" x="109" y="-346.3" font-family="Times,serif" font-size="14.00">Return</text>
+<polygon fill="yellow" stroke="black" points="260,-283.5 206,-283.5 206,-247.5 260,-247.5 260,-283.5"/>
+<text text-anchor="middle" x="233" y="-260.45" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Stop3&#45;&gt;Return37 -->
<g id="edge1" class="edge">
<title>Stop3&#45;&gt;Return37</title>
-<path fill="none" stroke="red" d="M120.1,-282.4C118.21,-293.74 115.7,-308.77 113.55,-321.68"/>
-<polygon fill="red" stroke="red" points="110.04,-321.47 111.85,-331.9 116.95,-322.62 110.04,-321.47"/>
-<text text-anchor="middle" x="117.1" y="-285" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M233,-196.3C233,-207.66 233,-222.78 233,-235.9"/>
+<polygon fill="red" stroke="red" points="229.5,-235.71 233,-245.71 236.5,-235.71 229.5,-235.71"/>
+<text text-anchor="middle" x="230.75" y="-198.45" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_4 -->
-<g id="node3" class="node">
+<g id="node4" class="node">
<title>Con_4</title>
-<ellipse fill="none" stroke="black" cx="231" cy="-738" rx="27" ry="18"/>
-<text text-anchor="middle" x="231" y="-734.3" font-family="Times,serif" font-size="14.00">#0</text>
+<ellipse fill="none" stroke="black" cx="239" cy="-744" rx="27" ry="18"/>
+<text text-anchor="middle" x="239" y="-738.95" font-family="Times New Roman,serif" font-size="14.00">#0</text>
</g>
<!-- new9 -->
-<g id="node4" class="node">
+<g id="node5" class="node">
<title>new9</title>
-<ellipse fill="none" stroke="black" cx="127" cy="-738" rx="38.99" ry="18"/>
-<text text-anchor="middle" x="127" y="-734.3" font-family="Times,serif" font-size="14.00">new S</text>
+<ellipse fill="none" stroke="black" cx="140" cy="-744" rx="33.95" ry="18"/>
+<text text-anchor="middle" x="140" y="-738.95" font-family="Times New Roman,serif" font-size="14.00">new S</text>
</g>
<!-- new9&#45;&gt;Start2 -->
<g id="edge2" class="edge">
<title>new9&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="green" d="M128.38,-756.06C130.74,-774.19 137.07,-801.28 154.09,-808.93"/>
-<polygon fill="green" stroke="green" points="153.5,-812.38 164,-811 154.93,-805.53 153.5,-812.38"/>
-<text text-anchor="middle" x="125.38" y="-758.66" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="green" d="M161.46,-758.23C173.32,-767.03 186.56,-779.76 191.11,-795.03"/>
+<polygon fill="green" stroke="green" points="187.59,-795.13 192.53,-804.5 194.51,-794.1 187.59,-795.13"/>
+<text text-anchor="middle" x="163.71" y="-760.38" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store10 -->
-<g id="node5" class="node">
+<g id="node6" class="node">
<title>Store10</title>
-<ellipse fill="none" stroke="black" cx="157" cy="-666" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="157" y="-662.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="166" cy="-672" rx="27" ry="18"/>
+<text text-anchor="middle" x="166" y="-666.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store10&#45;&gt;Start2 -->
<g id="edge3" class="edge">
<title>Store10&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M163.73,-683.93C167.57,-694.21 172.17,-707.69 175,-720 182.21,-751.38 184.54,-762.02 184.93,-789.85"/>
-<polygon fill="red" stroke="red" points="181.44,-790.02 185,-800 188.44,-789.98 181.44,-790.02"/>
-<text text-anchor="middle" x="160.73" y="-686.53" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M172.35,-689.96C175.97,-700.25 180.31,-713.73 183,-726 189.8,-757.02 192.21,-767.77 192.66,-794.78"/>
+<polygon fill="red" stroke="red" points="189.16,-794.51 192.74,-804.49 196.16,-794.46 189.16,-794.51"/>
+<text text-anchor="middle" x="170.1" y="-692.11" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store10&#45;&gt;Con_4 -->
<g id="edge6" class="edge">
<title>Store10&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M172.33,-681.5C182.82,-691.42 196.89,-704.74 208.63,-715.84"/>
-<polygon fill="black" stroke="black" points="206.27,-718.42 215.94,-722.75 211.08,-713.34 206.27,-718.42"/>
-<text text-anchor="middle" x="169.33" y="-684.1" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M180.77,-687.17C190.8,-696.78 204.26,-709.69 215.72,-720.68"/>
+<polygon fill="black" stroke="black" points="213.27,-723.17 222.91,-727.57 218.11,-718.12 213.27,-723.17"/>
+<text text-anchor="middle" x="178.52" y="-689.32" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store10&#45;&gt;new9 -->
<g id="edge5" class="edge">
<title>Store10&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M149.89,-683.59C146.43,-691.66 142.18,-701.57 138.29,-710.65"/>
-<polygon fill="black" stroke="black" points="134.99,-709.47 134.27,-720.04 141.42,-712.23 134.99,-709.47"/>
-<text text-anchor="middle" x="146.89" y="-686.19" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M159.71,-689.95C156.86,-697.6 153.43,-706.84 150.24,-715.44"/>
+<polygon fill="black" stroke="black" points="146.96,-714.2 146.76,-724.79 153.53,-716.64 146.96,-714.2"/>
+<text text-anchor="middle" x="157.46" y="-692.1" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Loop11 -->
-<g id="node6" class="node">
+<g id="node7" class="node">
<title>Loop11</title>
-<polygon fill="yellow" stroke="black" points="246,-612 192,-612 192,-576 246,-576 246,-612"/>
-<text text-anchor="middle" x="219" y="-590.3" font-family="Times,serif" font-size="14.00">Loop</text>
+<polygon fill="yellow" stroke="black" points="338,-618 284,-618 284,-582 338,-582 338,-618"/>
+<text text-anchor="middle" x="311" y="-594.95" font-family="Times New Roman,serif" font-size="14.00">Loop</text>
</g>
<!-- Loop11&#45;&gt;Start2 -->
<g id="edge7" class="edge">
<title>Loop11&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M232.6,-612.1C255.23,-642.79 295.45,-708.44 267,-756 247.84,-788.03 196.49,-764.41 186.65,-789.87"/>
-<polygon fill="red" stroke="red" points="183.15,-789.57 185,-800 190.06,-790.69 183.15,-789.57"/>
-<text text-anchor="middle" x="229.6" y="-614.7" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M311.62,-618.44C311.85,-650.26 308.1,-718.44 275,-762 252.66,-791.4 204.87,-770.45 194.68,-794.8"/>
+<polygon fill="red" stroke="red" points="191.26,-794.06 193.01,-804.51 198.16,-795.25 191.26,-794.06"/>
+<text text-anchor="middle" x="309.37" y="-620.59" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region32 -->
-<g id="node17" class="node">
+<g id="node18" class="node">
<title>Region32</title>
-<polygon fill="yellow" stroke="black" points="266,-124 200,-124 200,-88 266,-88 266,-124"/>
-<text text-anchor="middle" x="233" y="-102.3" font-family="Times,serif" font-size="14.00">Region</text>
+<polygon fill="yellow" stroke="black" points="215.5,-124 160.5,-124 160.5,-88 215.5,-88 215.5,-124"/>
+<text text-anchor="middle" x="188" y="-100.95" font-family="Times New Roman,serif" font-size="14.00">Region</text>
</g>
<!-- Loop11&#45;&gt;Region32 -->
<g id="edge8" class="edge">
<title>Loop11&#45;&gt;Region32</title>
-<path fill="none" stroke="red" d="M191.95,-583.41C149.79,-568.45 73.1,-541.12 72,-540 38.13,-505.5 37,-485.35 37,-437 37,-349 37,-349 37,-349 37,-292.45 45.93,-270.87 87,-232 121.01,-199.82 150.7,-226.76 186,-196 204.96,-179.48 217.45,-153.41 224.76,-133.74"/>
-<polygon fill="red" stroke="red" points="228.13,-134.72 228.12,-124.13 221.52,-132.42 228.13,-134.72"/>
-<text text-anchor="middle" x="188.95" y="-577.01" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M317.97,-581.54C334.1,-538.52 370.49,-424.48 342,-335 324.98,-281.54 311.59,-268.53 269,-232 241.84,-208.71 217.32,-225.45 197,-196 184.99,-178.59 183.21,-154.52 184.18,-135.8"/>
+<polygon fill="red" stroke="red" points="187.66,-136.16 185,-125.91 180.68,-135.58 187.66,-136.16"/>
+<text text-anchor="middle" x="315.72" y="-573.94" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_arg13 -->
-<g id="node7" class="node">
+<g id="node8" class="node">
<title>Phi_arg13</title>
-<ellipse fill="lightyellow" stroke="black" cx="321" cy="-594" rx="37.09" ry="18"/>
-<text text-anchor="middle" x="321" y="-590.3" font-family="Times,serif" font-size="14.00">φ_arg</text>
+<ellipse fill="lightyellow" stroke="black" cx="213" cy="-600" rx="32.93" ry="18"/>
+<text text-anchor="middle" x="213" y="-594.95" font-family="Times New Roman,serif" font-size="14.00">φ_arg</text>
</g>
<!-- Phi_arg13&#45;&gt;Start2 -->
<g id="edge10" class="edge">
-<title>Phi_arg13&#45;&gt;Start2:p1</title>
-<path fill="none" stroke="black" d="M319.63,-612.41C316.47,-643.6 306.42,-710.01 276,-756 261.03,-778.64 230.66,-771.56 222.86,-789.7"/>
-<polygon fill="black" stroke="black" points="219.33,-789.54 221,-800 226.22,-790.78 219.33,-789.54"/>
-<text text-anchor="middle" x="316.63" y="-615.01" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<title>Phi_arg13&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M224.02,-617.05C239.03,-639.99 265.16,-684.02 275,-726 278.65,-741.58 277.45,-746.19 275,-762 272.54,-777.84 265.38,-783.26 262.36,-794.66"/>
+<polygon fill="black" stroke="black" points="258.9,-794.15 261.18,-804.5 265.85,-794.99 258.9,-794.15"/>
+<text text-anchor="middle" x="221.77" y="-619.2" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_arg13&#45;&gt;Loop11 -->
<g id="edge9" class="edge">
<title>Phi_arg13&#45;&gt;Loop11</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M283.84,-594C274.6,-594 265.36,-594 256.12,-594"/>
-<polygon fill="black" stroke="black" points="256.09,-590.5 246.09,-594 256.09,-597.5 256.09,-590.5"/>
-<text text-anchor="middle" x="280.84" y="-587.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M246.3,-600C254.97,-600 263.64,-600 272.31,-600"/>
+<polygon fill="black" stroke="black" points="272.19,-603.5 282.19,-600 272.19,-596.5 272.19,-603.5"/>
+<text text-anchor="middle" x="248.55" y="-592.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Sub35 -->
-<g id="node19" class="node">
+<g id="node20" class="node">
<title>Sub35</title>
-<ellipse fill="none" stroke="black" cx="285" cy="-34" rx="27" ry="18"/>
-<text text-anchor="middle" x="285" y="-30.3" font-family="Times,serif" font-size="14.00">&#45;</text>
+<ellipse fill="none" stroke="black" cx="188" cy="-34" rx="27" ry="18"/>
+<text text-anchor="middle" x="188" y="-28.95" font-family="Times New Roman,serif" font-size="14.00">&#45;</text>
</g>
<!-- LT14 -->
-<g id="node8" class="node">
+<g id="node9" class="node">
<title>LT14</title>
-<ellipse fill="none" stroke="black" cx="265" cy="-522" rx="27" ry="18"/>
-<text text-anchor="middle" x="265" y="-518.3" font-family="Times,serif" font-size="14.00">&lt;</text>
+<ellipse fill="none" stroke="black" cx="265" cy="-528" rx="27" ry="18"/>
+<text text-anchor="middle" x="265" y="-522.95" font-family="Times New Roman,serif" font-size="14.00">&lt;</text>
</g>
<!-- LT14&#45;&gt;Con_4 -->
<g id="edge13" class="edge">
<title>LT14&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M263.48,-540.11C261.78,-558.07 258.78,-587.1 255,-612 249.83,-646.03 242.07,-684.92 236.78,-710.16"/>
-<polygon fill="black" stroke="black" points="233.33,-709.58 234.68,-720.09 240.17,-711.03 233.33,-709.58"/>
-<text text-anchor="middle" x="260.48" y="-542.71" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M263.12,-546.4C261.17,-564.35 257.99,-593.15 255,-618 251.03,-651.04 246.13,-688.95 242.8,-714.27"/>
+<polygon fill="black" stroke="black" points="239.34,-713.75 241.51,-724.12 246.28,-714.66 239.34,-713.75"/>
+<text text-anchor="middle" x="260.87" y="-548.55" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- LT14&#45;&gt;Loop11 -->
<g id="edge12" class="edge">
<title>LT14&#45;&gt;Loop11</title>
-<path fill="none" stroke="red" d="M254.56,-538.88C249.04,-547.28 242.13,-557.8 235.87,-567.33"/>
-<polygon fill="red" stroke="red" points="232.93,-565.43 230.36,-575.71 238.78,-569.27 232.93,-565.43"/>
-<text text-anchor="middle" x="251.56" y="-541.48" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M275.44,-544.88C280.73,-552.94 287.31,-562.95 293.36,-572.16"/>
+<polygon fill="red" stroke="red" points="290.39,-574.01 298.81,-580.44 296.24,-570.16 290.39,-574.01"/>
+<text text-anchor="middle" x="277.69" y="-547.03" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- LT14&#45;&gt;Phi_arg13 -->
<g id="edge14" class="edge">
<title>LT14&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M277.15,-538.19C284.36,-547.2 293.66,-558.82 301.84,-569.05"/>
-<polygon fill="black" stroke="black" points="299.11,-571.24 308.09,-576.87 304.58,-566.87 299.11,-571.24"/>
-<text text-anchor="middle" x="274.15" y="-540.79" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
-</g>
-<!-- If16 -->
-<g id="node9" class="node">
-<title>If16</title>
-<polygon fill="yellow" stroke="transparent" points="144,-439 144,-464 238,-464 238,-439 144,-439"/>
-<polygon fill="none" stroke="black" points="144,-439 144,-464 238,-464 238,-439 144,-439"/>
-<text text-anchor="start" x="185.5" y="-447.8" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="144,-408 144,-439 238,-439 238,-408 144,-408"/>
-<polygon fill="yellow" stroke="transparent" points="149,-413 149,-434 189,-434 189,-413 149,-413"/>
-<polygon fill="none" stroke="black" points="149,-413 149,-434 189,-434 189,-413 149,-413"/>
-<text text-anchor="start" x="152" y="-419.8" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="189,-413 189,-434 233,-434 233,-413 189,-413"/>
-<polygon fill="none" stroke="black" points="189,-413 189,-434 233,-434 233,-413 189,-413"/>
-<text text-anchor="start" x="192" y="-419.8" font-family="Times,serif" font-size="14.00">False</text>
+<path fill="none" stroke="black" d="M253.46,-544.54C247.02,-553.2 238.85,-564.21 231.53,-574.05"/>
+<polygon fill="black" stroke="black" points="228.92,-571.69 225.77,-581.81 234.54,-575.87 228.92,-571.69"/>
+<text text-anchor="middle" x="255.71" y="-546.69" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- If16&#45;&gt;Loop11 -->
<g id="edge15" class="edge">
<title>If16&#45;&gt;Loop11</title>
-<path fill="none" stroke="red" d="M196.6,-468.19C201.73,-496.77 209.24,-538.64 214.13,-565.86"/>
-<polygon fill="red" stroke="red" points="210.71,-566.63 215.92,-575.86 217.6,-565.4 210.71,-566.63"/>
-<text text-anchor="middle" x="193.6" y="-470.79" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M288.71,-473.68C293.31,-484.96 297.98,-497.84 301,-510 305.94,-529.86 308.44,-552.83 309.71,-570.45"/>
+<polygon fill="red" stroke="red" points="306.2,-570.42 310.31,-580.19 313.19,-569.99 306.2,-570.42"/>
+<text text-anchor="middle" x="286.46" y="-475.83" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- If16&#45;&gt;LT14 -->
<g id="edge16" class="edge">
<title>If16&#45;&gt;LT14</title>
-<path fill="none" stroke="black" d="M218.55,-468.28C227.33,-478.24 236.86,-489.05 244.99,-498.29"/>
-<polygon fill="black" stroke="black" points="242.49,-500.74 251.72,-505.93 247.74,-496.11 242.49,-500.74"/>
-<text text-anchor="middle" x="215.55" y="-470.88" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M270.6,-473.82C269.74,-481.99 268.82,-490.69 267.98,-498.65"/>
+<polygon fill="black" stroke="black" points="264.52,-498.15 266.95,-508.47 271.48,-498.89 264.52,-498.15"/>
+<text text-anchor="middle" x="268.35" y="-475.97" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Div21 -->
-<g id="node10" class="node">
+<g id="node11" class="node">
<title>Div21</title>
-<ellipse fill="none" stroke="black" cx="43" cy="-738" rx="27" ry="18"/>
-<text text-anchor="middle" x="43" y="-734.3" font-family="Times,serif" font-size="14.00">//</text>
+<ellipse fill="none" stroke="black" cx="61" cy="-744" rx="27" ry="18"/>
+<text text-anchor="middle" x="61" y="-738.95" font-family="Times New Roman,serif" font-size="14.00">//</text>
</g>
<!-- Div21&#45;&gt;Start2 -->
<g id="edge17" class="edge">
<title>Div21&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M56.68,-753.92C76,-773.4 113.45,-805.6 153.93,-810.4"/>
-<polygon fill="red" stroke="red" points="153.81,-813.89 164,-811 154.23,-806.91 153.81,-813.89"/>
-<text text-anchor="middle" x="53.68" y="-756.52" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M73.85,-760.18C91.84,-779.79 126.72,-812.07 165.38,-817.47"/>
+<polygon fill="red" stroke="red" points="164.64,-820.93 174.87,-818.14 165.14,-813.95 164.64,-820.93"/>
+<text text-anchor="middle" x="71.6" y="-762.33" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Div21&#45;&gt;Start2 -->
<g id="edge18" class="edge">
-<title>Div21&#45;&gt;Start2:p1</title>
-<path fill="none" stroke="black" d="M64.1,-749.57C68.94,-751.82 74.1,-754.1 79,-756 137.09,-778.59 211.95,-738.92 220.24,-789.82"/>
-<polygon fill="black" stroke="black" points="216.77,-790.29 221,-800 223.75,-789.77 216.77,-790.29"/>
-<text text-anchor="middle" x="61.1" y="-752.17" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<title>Div21&#45;&gt;Start2:p2</title>
+<path fill="none" stroke="black" d="M82.05,-755.71C86.89,-757.96 92.07,-760.19 97,-762 163.97,-786.57 250.88,-736.57 260.18,-794.78"/>
+<polygon fill="black" stroke="black" points="256.67,-794.77 260.89,-804.49 263.65,-794.26 256.67,-794.77"/>
+<text text-anchor="middle" x="84.3" y="-757.86" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Con_22 -->
-<g id="node11" class="node">
+<g id="node12" class="node">
<title>Con_22</title>
-<ellipse fill="none" stroke="black" cx="43" cy="-824" rx="27" ry="18"/>
-<text text-anchor="middle" x="43" y="-820.3" font-family="Times,serif" font-size="14.00">#3</text>
+<ellipse fill="none" stroke="black" cx="61" cy="-831.5" rx="27" ry="18"/>
+<text text-anchor="middle" x="61" y="-826.45" font-family="Times New Roman,serif" font-size="14.00">#3</text>
</g>
<!-- Div21&#45;&gt;Con_22 -->
<g id="edge19" class="edge">
<title>Div21&#45;&gt;Con_22</title>
-<path fill="none" stroke="black" d="M43,-756.4C43,-767.74 43,-782.77 43,-795.68"/>
-<polygon fill="black" stroke="black" points="39.5,-795.9 43,-805.9 46.5,-795.9 39.5,-795.9"/>
-<text text-anchor="middle" x="40" y="-759" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M61,-762.3C61,-773.66 61,-788.78 61,-801.9"/>
+<polygon fill="black" stroke="black" points="57.5,-801.71 61,-811.71 64.5,-801.71 57.5,-801.71"/>
+<text text-anchor="middle" x="58.75" y="-764.45" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- EQ23 -->
-<g id="node12" class="node">
+<g id="node13" class="node">
<title>EQ23</title>
-<ellipse fill="none" stroke="black" cx="284" cy="-350" rx="27" ry="18"/>
-<text text-anchor="middle" x="284" y="-346.3" font-family="Times,serif" font-size="14.00">==</text>
+<ellipse fill="none" stroke="black" cx="165" cy="-353" rx="27" ry="18"/>
+<text text-anchor="middle" x="165" y="-347.95" font-family="Times New Roman,serif" font-size="14.00">==</text>
</g>
<!-- EQ23&#45;&gt;Phi_arg13 -->
<g id="edge21" class="edge">
<title>EQ23&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M299.94,-365.01C309.81,-374.8 321.61,-388.81 327,-404 346.42,-458.77 336.12,-528.17 327.91,-565.78"/>
-<polygon fill="black" stroke="black" points="324.4,-565.41 325.57,-575.94 331.22,-566.98 324.4,-565.41"/>
-<text text-anchor="middle" x="296.94" y="-367.61" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M169.9,-371.1C172.77,-381.44 176.34,-394.92 179,-407 191.71,-464.72 202.9,-533.02 208.73,-570.62"/>
+<polygon fill="black" stroke="black" points="205.22,-570.85 210.2,-580.2 212.14,-569.78 205.22,-570.85"/>
+<text text-anchor="middle" x="167.65" y="-373.25" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- EQ23&#45;&gt;If16 -->
<g id="edge20" class="edge">
<title>EQ23&#45;&gt;If16:p0</title>
-<path fill="none" stroke="red" d="M259.89,-358.47C231.44,-367.9 186.29,-385 172.88,-402.37"/>
-<polygon fill="red" stroke="red" points="169.49,-401.42 169,-412 175.98,-404.03 169.49,-401.42"/>
-<text text-anchor="middle" x="256.89" y="-352.07" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M178.1,-368.82C192.8,-385.21 216.42,-410.75 230.4,-421.83"/>
+<polygon fill="red" stroke="red" points="228.25,-424.63 238.68,-426.51 231.7,-418.54 228.25,-424.63"/>
+<text text-anchor="middle" x="180.35" y="-370.97" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_24 -->
-<g id="node13" class="node">
+<g id="node14" class="node">
<title>Con_24</title>
-<ellipse fill="none" stroke="black" cx="291" cy="-436" rx="27" ry="18"/>
-<text text-anchor="middle" x="291" y="-432.3" font-family="Times,serif" font-size="14.00">#5</text>
+<ellipse fill="none" stroke="black" cx="143" cy="-440.5" rx="27" ry="18"/>
+<text text-anchor="middle" x="143" y="-435.45" font-family="Times New Roman,serif" font-size="14.00">#5</text>
</g>
<!-- EQ23&#45;&gt;Con_24 -->
<g id="edge22" class="edge">
<title>EQ23&#45;&gt;Con_24</title>
-<path fill="none" stroke="black" d="M285.42,-368C286.36,-379.31 287.62,-394.42 288.7,-407.43"/>
-<polygon fill="black" stroke="black" points="285.24,-408.06 289.56,-417.74 292.22,-407.48 285.24,-408.06"/>
-<text text-anchor="middle" x="282.42" y="-370.6" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M160.65,-370.89C157.69,-382.41 153.69,-397.94 150.25,-411.31"/>
+<polygon fill="black" stroke="black" points="146.89,-410.33 147.79,-420.88 153.67,-412.07 146.89,-410.33"/>
+<text text-anchor="middle" x="158.4" y="-373.04" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- If25 -->
-<g id="node14" class="node">
+<g id="node15" class="node">
<title>If25</title>
-<polygon fill="yellow" stroke="transparent" points="208,-267 208,-292 302,-292 302,-267 208,-267"/>
-<polygon fill="none" stroke="black" points="208,-267 208,-292 302,-292 302,-267 208,-267"/>
-<text text-anchor="start" x="249.5" y="-275.8" font-family="Times,serif" font-size="14.00">If</text>
-<polygon fill="none" stroke="black" points="208,-236 208,-267 302,-267 302,-236 208,-236"/>
-<polygon fill="yellow" stroke="transparent" points="213,-241 213,-262 253,-262 253,-241 213,-241"/>
-<polygon fill="none" stroke="black" points="213,-241 213,-262 253,-262 253,-241 213,-241"/>
-<text text-anchor="start" x="216" y="-247.8" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="253,-241 253,-262 297,-262 297,-241 253,-241"/>
-<polygon fill="none" stroke="black" points="253,-241 253,-262 297,-262 297,-241 253,-241"/>
-<text text-anchor="start" x="256" y="-247.8" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="104,-268.5 104,-295 180,-295 180,-268.5 104,-268.5"/>
+<polygon fill="none" stroke="black" points="104,-268.5 104,-295 180,-295 180,-268.5 104,-268.5"/>
+<text text-anchor="start" x="137.5" y="-276.7" font-family="Times New Roman,serif" font-size="14.00">If</text>
+<polygon fill="none" stroke="black" points="104,-236 104,-268.5 180,-268.5 180,-236 104,-236"/>
+<polygon fill="yellow" stroke="none" points="109,-241 109,-263.5 140.5,-263.5 140.5,-241 109,-241"/>
+<polygon fill="none" stroke="black" points="109,-241 109,-263.5 140.5,-263.5 140.5,-241 109,-241"/>
+<text text-anchor="start" x="112" y="-247.2" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="140.5,-241 140.5,-263.5 175,-263.5 175,-241 140.5,-241"/>
+<polygon fill="none" stroke="black" points="140.5,-241 140.5,-263.5 175,-263.5 175,-241 140.5,-241"/>
+<text text-anchor="start" x="143.5" y="-247.2" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- If25&#45;&gt;If16 -->
<g id="edge23" class="edge">
<title>If25&#45;&gt;If16:p0</title>
-<path fill="none" stroke="red" d="M234.4,-296.29C213.03,-329.21 181.43,-379.35 171.85,-402.21"/>
-<polygon fill="red" stroke="red" points="168.44,-401.42 169,-412 175.16,-403.38 168.44,-401.42"/>
-<text text-anchor="middle" x="231.4" y="-298.89" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M170.91,-298.68C180.72,-309.96 191.57,-322.85 201,-335 203.66,-338.43 237.81,-384.19 251.31,-405.07"/>
+<polygon fill="red" stroke="red" points="248.15,-406.58 256.02,-413.67 254.29,-403.22 248.15,-406.58"/>
+<text text-anchor="middle" x="168.66" y="-300.83" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- If25&#45;&gt;EQ23 -->
<g id="edge24" class="edge">
<title>If25&#45;&gt;EQ23</title>
-<path fill="none" stroke="black" d="M265.8,-296.28C268.78,-304.9 271.97,-314.17 274.85,-322.49"/>
-<polygon fill="black" stroke="black" points="271.58,-323.76 278.16,-332.07 278.2,-321.48 271.58,-323.76"/>
-<text text-anchor="middle" x="262.8" y="-298.88" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
-</g>
-<!-- Phi_230 -->
-<g id="node15" class="node">
-<title>Phi_230</title>
-<ellipse fill="lightyellow" stroke="black" cx="129" cy="-594" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="129" y="-590.3" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<path fill="none" stroke="black" d="M150.7,-298.82C152.92,-307.08 155.29,-315.9 157.45,-323.93"/>
+<polygon fill="black" stroke="black" points="154.05,-324.76 160.03,-333.51 160.81,-322.94 154.05,-324.76"/>
+<text text-anchor="middle" x="148.45" y="-300.97" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_230&#45;&gt;Store10 -->
<g id="edge26" class="edge">
<title>Phi_230&#45;&gt;Store10</title>
-<path fill="none" stroke="blue" d="M135.78,-611.95C139.01,-620.03 142.95,-629.88 146.56,-638.89"/>
-<polygon fill="blue" stroke="blue" points="143.32,-640.23 150.28,-648.21 149.82,-637.63 143.32,-640.23"/>
-<text text-anchor="middle" x="132.78" y="-614.55" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M122.51,-617.59C129.69,-626.41 138.66,-637.42 146.57,-647.14"/>
+<polygon fill="blue" stroke="blue" points="143.77,-649.24 152.8,-654.79 149.2,-644.82 143.77,-649.24"/>
+<text text-anchor="middle" x="120.26" y="-619.74" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_230&#45;&gt;Loop11 -->
<g id="edge25" class="edge">
<title>Phi_230&#45;&gt;Loop11</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M162.4,-594C168.78,-594 175.17,-594 181.55,-594"/>
-<polygon fill="black" stroke="black" points="181.58,-597.5 191.58,-594 181.58,-590.5 181.58,-597.5"/>
-<text text-anchor="middle" x="165.4" y="-587.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M133.84,-583.77C146.98,-576.14 163.74,-567.89 180,-564 215.01,-555.63 226.74,-552.95 261,-564 268.52,-566.43 275.87,-570.45 282.52,-574.95"/>
+<polygon fill="black" stroke="black" points="280.35,-577.71 290.47,-580.85 284.52,-572.08 280.35,-577.71"/>
+<text text-anchor="middle" x="131.59" y="-576.17" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Phi_233 -->
-<g id="node18" class="node">
+<g id="node19" class="node">
<title>Phi_233</title>
-<ellipse fill="lightyellow" stroke="black" cx="149" cy="-106" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="149" y="-102.3" font-family="Times,serif" font-size="14.00">φ_$2</text>
+<ellipse fill="lightyellow" stroke="black" cx="69" cy="-106" rx="52.89" ry="18"/>
+<text text-anchor="middle" x="69" y="-100.95" font-family="Times New Roman,serif" font-size="14.00">MemPhi_2</text>
</g>
<!-- Store31 -->
-<g id="node16" class="node">
+<g id="node17" class="node">
<title>Store31</title>
-<ellipse fill="none" stroke="black" cx="149" cy="-178" rx="27.9" ry="18"/>
-<text text-anchor="middle" x="149" y="-174.3" font-family="Times,serif" font-size="14.00">.f =</text>
+<ellipse fill="none" stroke="black" cx="58" cy="-178" rx="27" ry="18"/>
+<text text-anchor="middle" x="58" y="-172.95" font-family="Times New Roman,serif" font-size="14.00">.f =</text>
</g>
<!-- Store31&#45;&gt;new9 -->
<g id="edge30" class="edge">
<title>Store31&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M125.79,-188.29C107.7,-196.82 83.59,-211.3 71,-232 43.78,-276.74 57,-296.63 57,-349 57,-349 57,-349 57,-437 57,-506.9 72.18,-523.27 77,-593"/>
-<path fill="none" stroke="black" d="M77,-595C78.62,-637.52 98.4,-683.39 112.59,-711.15"/>
-<polygon fill="black" stroke="black" points="109.59,-712.96 117.34,-720.18 115.78,-709.7 109.59,-712.96"/>
-<text text-anchor="middle" x="122.79" y="-190.89" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M57,-354C19.45,-421.68 37,-449.6 37,-527 37,-527 37,-527 37,-601 37,-651.78 80.7,-696.66 111.17,-721.77"/>
+<polygon fill="black" stroke="black" points="108.95,-724.48 118.96,-727.98 113.32,-719.01 108.95,-724.48"/>
+<path fill="none" stroke="black" d="M57,-266.5C57.21,-285.5 66.47,-335.53 57,-352"/>
+<path fill="none" stroke="black" d="M57.56,-196.36C57.19,-213.63 56.74,-240.9 57,-264.5"/>
+<text text-anchor="middle" x="54.75" y="-346.4" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Store31&#45;&gt;Div21 -->
<g id="edge31" class="edge">
<title>Store31&#45;&gt;Div21</title>
-<path fill="none" stroke="black" d="M122.62,-184.31C96.9,-190.92 58.72,-204.83 38,-232 5.97,-274.01 17,-296.17 17,-349 17,-349 17,-349 17,-595 17,-635.67 27.45,-681.83 35.1,-710.19"/>
-<polygon fill="black" stroke="black" points="31.81,-711.44 37.86,-720.13 38.55,-709.56 31.81,-711.44"/>
-<text text-anchor="middle" x="119.62" y="-177.91" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
+<path fill="none" stroke="black" d="M51.23,-195.87C39.58,-226.46 17,-293.35 17,-352 17,-352 17,-352 17,-601 17,-641.11 18.86,-652.1 32,-690 35.19,-699.2 39.88,-708.69 44.56,-717.06"/>
+<polygon fill="black" stroke="black" points="41.52,-718.8 49.61,-725.64 47.56,-715.25 41.52,-718.8"/>
+<text text-anchor="middle" x="48.98" y="-198.02" font-family="Helvetica,sans-Serif" font-size="8.00">3</text>
</g>
<!-- Store31&#45;&gt;If25 -->
<g id="edge28" class="edge">
<title>Store31&#45;&gt;If25:p0</title>
-<path fill="none" stroke="red" d="M160.65,-194.62C172.83,-210.67 191.77,-234.77 203.47,-245.51"/>
-<polygon fill="red" stroke="red" points="201.7,-248.53 212,-251 205.49,-242.64 201.7,-248.53"/>
-<text text-anchor="middle" x="157.65" y="-197.22" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M61.66,-195.99C66.57,-214.42 77.07,-242.26 96.81,-250.12"/>
+<polygon fill="red" stroke="red" points="96.03,-253.53 106.51,-251.97 97.35,-246.66 96.03,-253.53"/>
+<text text-anchor="middle" x="59.41" y="-198.14" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Store31&#45;&gt;Phi_230 -->
<g id="edge29" class="edge">
<title>Store31&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M153.06,-196.07C155.31,-206.4 157.87,-219.88 159,-232 161.65,-260.32 160.57,-267.6 159,-296 157.22,-328.15 162.02,-337.75 151,-368 144.42,-386.07 132.57,-385.6 127,-404 118.76,-431.22 126.77,-439.56 127,-468 127.27,-501.46 127.94,-539.96 128.43,-565.29"/>
-<polygon fill="blue" stroke="blue" points="124.94,-565.68 128.63,-575.61 131.94,-565.54 124.94,-565.68"/>
-<text text-anchor="middle" x="150.06" y="-198.67" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M57,-529C56.5,-546.83 67.47,-563.07 79.46,-575.42"/>
+<polygon fill="blue" stroke="blue" points="77.03,-577.93 86.7,-582.27 81.85,-572.85 77.03,-577.93"/>
+<path fill="none" stroke="blue" d="M57,-266.5C69.32,-381.62 60.25,-411.27 57,-527"/>
+<text text-anchor="middle" x="54.75" y="-521.4" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Region32&#45;&gt;If25 -->
<g id="edge32" class="edge">
<title>Region32&#45;&gt;If25:p0</title>
-<path fill="none" stroke="red" d="M233,-124.22C233,-147.49 233,-190.58 233,-229.64"/>
-<polygon fill="red" stroke="red" points="229.5,-230 233,-240 236.5,-230 229.5,-230"/>
-<text text-anchor="middle" x="230" y="-126.82" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M173.65,-124.25C156.55,-146.45 129.75,-187.13 125.37,-228.59"/>
+<polygon fill="red" stroke="red" points="121.87,-228.31 124.83,-238.49 128.86,-228.69 121.87,-228.31"/>
+<text text-anchor="middle" x="171.4" y="-126.4" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+</g>
+<!-- Region32&#45;&gt;If25 -->
+<g id="edge33" class="edge">
+<title>Region32&#45;&gt;If25:p1</title>
+<path fill="none" stroke="red" d="M181.44,-124.35C173.32,-147.27 160.3,-189.33 158.08,-228.71"/>
+<polygon fill="red" stroke="red" points="154.59,-228.39 157.79,-238.49 161.58,-228.59 154.59,-228.39"/>
+<text text-anchor="middle" x="179.19" y="-126.5" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_233&#45;&gt;Phi_230 -->
<g id="edge36" class="edge">
<title>Phi_233&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M170.5,-129.96C185.43,-148.79 200.3,-175.58 186,-196 159.14,-234.35 113.86,-193.65 87,-232 70.68,-255.3 72.64,-271.45 87,-296 103.48,-324.17 134.52,-303.83 151,-332 159.08,-345.81 156.69,-353.04 151,-368 143.39,-388.01 126.61,-383.99 119,-404 98.19,-458.74 111.2,-528.88 121.03,-566.43"/>
-<polygon fill="blue" stroke="blue" points="173.07,-127.58 163.96,-122.17 167.71,-132.08 173.07,-127.58"/>
-<polygon fill="blue" stroke="blue" points="117.67,-567.4 123.69,-576.12 124.42,-565.55 117.67,-567.4"/>
-<text text-anchor="middle" x="160.96" y="-124.77" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="blue" d="M84.51,-133.96C88.4,-142.07 92.02,-151.16 94,-160 97.5,-175.61 98.33,-180.6 94,-196 88.92,-214.05 77.08,-213.95 72,-232 55.48,-290.7 59.98,-384.37 92,-546 93.66,-554.38 96.2,-563.28 98.81,-571.36"/>
+<polygon fill="blue" stroke="blue" points="87.75,-132.6 80.06,-125.32 81.53,-135.81 87.75,-132.6"/>
+<polygon fill="blue" stroke="blue" points="95.44,-572.31 101.98,-580.64 102.06,-570.05 95.44,-572.31"/>
+<text text-anchor="middle" x="77.12" y="-126.12" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Phi_233&#45;&gt;Store31 -->
<g id="edge35" class="edge">
<title>Phi_233&#45;&gt;Store31</title>
-<path fill="none" stroke="blue" d="M149,-124.3C149,-132.02 149,-141.29 149,-149.89"/>
-<polygon fill="blue" stroke="blue" points="145.5,-149.9 149,-159.9 152.5,-149.9 145.5,-149.9"/>
-<text text-anchor="middle" x="146" y="-126.9" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="blue" d="M66.28,-124.3C65.12,-131.68 63.74,-140.48 62.44,-148.75"/>
+<polygon fill="blue" stroke="blue" points="59.02,-147.98 60.92,-158.4 65.93,-149.07 59.02,-147.98"/>
+<text text-anchor="middle" x="64.03" y="-126.45" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Phi_233&#45;&gt;Region32 -->
<g id="edge34" class="edge">
<title>Phi_233&#45;&gt;Region32</title>
-<path fill="none" stroke="black" stroke-dasharray="1,5" d="M182.47,-106C184.91,-106 187.35,-106 189.8,-106"/>
-<polygon fill="black" stroke="black" points="189.84,-109.5 199.84,-106 189.84,-102.5 189.84,-109.5"/>
-<text text-anchor="middle" x="185.47" y="-99.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="black" stroke-dasharray="1,5" d="M121.99,-106C130.94,-106 139.88,-106 148.82,-106"/>
+<polygon fill="black" stroke="black" points="148.64,-109.5 158.64,-106 148.64,-102.5 148.64,-109.5"/>
+<text text-anchor="middle" x="124.24" y="-98.4" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Sub35&#45;&gt;Phi_arg13 -->
<g id="edge38" class="edge">
<title>Sub35&#45;&gt;Phi_arg13</title>
-<path fill="none" stroke="black" d="M287.31,-62.31C288.99,-79.97 291.57,-103.42 295,-124 303.09,-172.5 311.09,-183.47 319,-232 331.36,-307.86 331.84,-327.31 337,-404 339.98,-448.36 339.33,-459.54 340,-504 340.24,-520 342.74,-524.24 340,-540 338.44,-549 335.48,-558.49 332.36,-566.91"/>
-<polygon fill="black" stroke="black" points="290.77,-61.78 286.38,-52.14 283.8,-62.41 290.77,-61.78"/>
-<polygon fill="black" stroke="black" points="329.1,-565.63 328.7,-576.22 335.62,-568.2 329.1,-565.63"/>
-<text text-anchor="middle" x="283.38" y="-54.74" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M170.02,-59.56C163.96,-68.33 157.37,-78.41 152,-88 143.43,-103.32 90.69,-214.84 87,-232 73.48,-294.79 101.52,-461.34 107,-474 125.1,-515.81 162.03,-554.22 187.15,-577.13"/>
+<polygon fill="black" stroke="black" points="172.77,-61.74 175.68,-51.55 167.05,-57.7 172.77,-61.74"/>
+<polygon fill="black" stroke="black" points="184.57,-579.51 194.36,-583.56 189.22,-574.29 184.57,-579.51"/>
+<text text-anchor="middle" x="174.31" y="-52.47" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Sub35&#45;&gt;Region32 -->
<g id="edge37" class="edge">
<title>Sub35&#45;&gt;Region32</title>
-<path fill="none" stroke="red" d="M273.46,-50.54C267.16,-59.01 259.21,-69.71 252.03,-79.39"/>
-<polygon fill="red" stroke="red" points="249.12,-77.42 245.97,-87.54 254.74,-81.6 249.12,-77.42"/>
-<text text-anchor="middle" x="270.46" y="-53.14" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M188,-52.3C188,-59.59 188,-68.27 188,-76.46"/>
+<polygon fill="red" stroke="red" points="184.5,-76.38 188,-86.38 191.5,-76.38 184.5,-76.38"/>
+<text text-anchor="middle" x="185.75" y="-54.45" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Con_36 -->
-<g id="node20" class="node">
+<g id="node21" class="node">
<title>Con_36</title>
-<ellipse fill="none" stroke="black" cx="331" cy="-106" rx="27" ry="18"/>
-<text text-anchor="middle" x="331" y="-102.3" font-family="Times,serif" font-size="14.00">#1</text>
+<ellipse fill="none" stroke="black" cx="261" cy="-106" rx="27" ry="18"/>
+<text text-anchor="middle" x="261" y="-100.95" font-family="Times New Roman,serif" font-size="14.00">#1</text>
</g>
<!-- Sub35&#45;&gt;Con_36 -->
<g id="edge39" class="edge">
<title>Sub35&#45;&gt;Con_36</title>
-<path fill="none" stroke="black" d="M295.44,-50.88C301.2,-59.66 308.48,-70.74 314.96,-80.58"/>
-<polygon fill="black" stroke="black" points="312.19,-82.74 320.6,-89.18 318.04,-78.9 312.19,-82.74"/>
-<text text-anchor="middle" x="292.44" y="-53.48" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="black" d="M202.77,-49.17C212.8,-58.78 226.26,-71.69 237.72,-82.68"/>
+<polygon fill="black" stroke="black" points="235.27,-85.17 244.91,-89.57 240.11,-80.12 235.27,-85.17"/>
+<text text-anchor="middle" x="200.52" y="-51.32" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+</g>
+<!-- Return37&#45;&gt;MemMerge -->
+<g id="edge42" class="edge">
+<title>Return37&#45;&gt;MemMerge</title>
+<path fill="none" stroke="blue" d="M244.94,-283.8C253.18,-295.74 264.29,-311.84 273.64,-325.4"/>
+<polygon fill="blue" stroke="blue" points="270.66,-327.24 279.22,-333.48 276.42,-323.26 270.66,-327.24"/>
+<text text-anchor="middle" x="242.69" y="-285.95" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Return37&#45;&gt;new9 -->
<g id="edge41" class="edge">
<title>Return37&#45;&gt;new9</title>
-<path fill="none" stroke="black" d="M101.56,-368.35C89.32,-399.07 67.21,-465.09 77,-521"/>
-<path fill="none" stroke="black" d="M77,-523C81.47,-553.79 74.85,-561.96 77,-593"/>
-<text text-anchor="middle" x="98.56" y="-370.95" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M216.48,-283.78C210.69,-289.16 203.9,-294.79 197,-299 140.21,-333.67 89.27,-293.82 57,-352"/>
+<text text-anchor="middle" x="214.23" y="-285.93" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Return37&#45;&gt;If16 -->
<g id="edge40" class="edge">
<title>Return37&#45;&gt;If16:p1</title>
-<path fill="none" stroke="red" d="M142.12,-356.57C168.64,-362.93 202.56,-375.99 209.66,-401.87"/>
-<polygon fill="red" stroke="red" points="206.22,-402.55 211,-412 213.16,-401.63 206.22,-402.55"/>
-<text text-anchor="middle" x="145.12" y="-350.17" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
-</g>
-<!-- Return37&#45;&gt;Phi_230 -->
-<g id="edge42" class="edge">
-<title>Return37&#45;&gt;Phi_230</title>
-<path fill="none" stroke="blue" d="M77,-523C80.24,-541.52 92.58,-558.55 104.43,-571.18"/>
-<polygon fill="blue" stroke="blue" points="102.12,-573.82 111.65,-578.44 107.08,-568.88 102.12,-573.82"/>
-<text text-anchor="middle" x="74" y="-516.6" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M230.82,-283.79C228.88,-305.37 228.21,-342.88 242,-371 252.72,-392.86 279.35,-388.61 287.4,-404.08"/>
+<polygon fill="red" stroke="red" points="283.91,-404.48 289.43,-413.52 290.75,-403.01 283.91,-404.48"/>
+<text text-anchor="middle" x="228.57" y="-285.94" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
</g>
</svg>
diff --git a/chapter11/docs/graph8.gv b/chapter11/docs/graph8.gv
index 1a7b231d..431cef46 100644
--- a/chapter11/docs/graph8.gv
+++ b/chapter11/docs/graph8.gv
@@ -39,7 +39,7 @@ return 0;
Never18 -> Con_4[taillabel=1];
Stop3 -> Return21[taillabel=0 color=red];
Return21 -> Never18:p0[taillabel=0 color=red];
- Return21 -> Con_4[taillabel=1];
+ Return21 -> Con_4[taillabel=2];
Loop8 -> Start2:p0[taillabel=1 color=red];
Loop8 -> Never18:p1[taillabel=2 color=red constraint=false];
}
diff --git a/chapter11/docs/graph8.svg b/chapter11/docs/graph8.svg
index c577cf84..a89eeeb5 100644
--- a/chapter11/docs/graph8.svg
+++ b/chapter11/docs/graph8.svg
@@ -1,115 +1,115 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 2.43.0 (0)
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: chapter11 Pages: 1 -->
-<svg width="170pt" height="420pt"
- viewBox="0.00 0.00 170.00 420.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 416)">
+<svg width="166pt" height="426pt"
+ viewBox="0.00 0.00 166.00 426.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 422)">
<title>chapter11</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-416 166,-416 166,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-422 162,-422 162,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_Nodes</title>
-<polygon fill="none" stroke="black" points="8,-8 8,-404 154,-404 154,-8 8,-8"/>
+<polygon fill="none" stroke="black" points="8,-8 8,-410 150,-410 150,-8 8,-8"/>
</g>
<!-- Never18 -->
<g id="node1" class="node">
<title>Never18</title>
-<polygon fill="yellow" stroke="transparent" points="24,-195 24,-220 118,-220 118,-195 24,-195"/>
-<polygon fill="none" stroke="black" points="24,-195 24,-220 118,-220 118,-195 24,-195"/>
-<text text-anchor="start" x="49" y="-203.8" font-family="Times,serif" font-size="14.00">Never</text>
-<polygon fill="none" stroke="black" points="24,-164 24,-195 118,-195 118,-164 24,-164"/>
-<polygon fill="yellow" stroke="transparent" points="29,-169 29,-190 69,-190 69,-169 29,-169"/>
-<polygon fill="none" stroke="black" points="29,-169 29,-190 69,-190 69,-169 29,-169"/>
-<text text-anchor="start" x="32" y="-175.8" font-family="Times,serif" font-size="14.00">True</text>
-<polygon fill="yellow" stroke="transparent" points="69,-169 69,-190 113,-190 113,-169 69,-169"/>
-<polygon fill="none" stroke="black" points="69,-169 69,-190 113,-190 113,-169 69,-169"/>
-<text text-anchor="start" x="72" y="-175.8" font-family="Times,serif" font-size="14.00">False</text>
+<polygon fill="yellow" stroke="none" points="24,-196.5 24,-223 100,-223 100,-196.5 24,-196.5"/>
+<polygon fill="none" stroke="black" points="24,-196.5 24,-223 100,-223 100,-196.5 24,-196.5"/>
+<text text-anchor="start" x="45.5" y="-204.7" font-family="Times New Roman,serif" font-size="14.00">Never</text>
+<polygon fill="none" stroke="black" points="24,-164 24,-196.5 100,-196.5 100,-164 24,-164"/>
+<polygon fill="yellow" stroke="none" points="29,-169 29,-191.5 60.5,-191.5 60.5,-169 29,-169"/>
+<polygon fill="none" stroke="black" points="29,-169 29,-191.5 60.5,-191.5 60.5,-169 29,-169"/>
+<text text-anchor="start" x="32" y="-175.2" font-family="Times New Roman,serif" font-size="14.00">True</text>
+<polygon fill="yellow" stroke="none" points="60.5,-169 60.5,-191.5 95,-191.5 95,-169 60.5,-169"/>
+<polygon fill="none" stroke="black" points="60.5,-169 60.5,-191.5 95,-191.5 95,-169 60.5,-169"/>
+<text text-anchor="start" x="63.5" y="-175.2" font-family="Times New Roman,serif" font-size="14.00">False</text>
</g>
<!-- Con_4 -->
<g id="node4" class="node">
<title>Con_4</title>
-<ellipse fill="none" stroke="black" cx="119" cy="-278" rx="27" ry="18"/>
-<text text-anchor="middle" x="119" y="-274.3" font-family="Times,serif" font-size="14.00">#0</text>
+<ellipse fill="none" stroke="black" cx="115" cy="-281" rx="27" ry="18"/>
+<text text-anchor="middle" x="115" y="-275.95" font-family="Times New Roman,serif" font-size="14.00">#0</text>
</g>
<!-- Never18&#45;&gt;Con_4 -->
<g id="edge2" class="edge">
<title>Never18&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M88.87,-224.28C94.12,-233.46 99.78,-243.37 104.77,-252.1"/>
-<polygon fill="black" stroke="black" points="101.86,-254.06 109.86,-261.01 107.94,-250.59 101.86,-254.06"/>
-<text text-anchor="middle" x="85.87" y="-226.88" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M82.04,-226.82C87.68,-235.93 93.75,-245.71 99.11,-254.37"/>
+<polygon fill="black" stroke="black" points="95.99,-255.97 104.23,-262.63 101.94,-252.28 95.99,-255.97"/>
+<text text-anchor="middle" x="79.79" y="-228.97" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
<!-- Loop8 -->
<g id="node6" class="node">
<title>Loop8</title>
-<polygon fill="yellow" stroke="black" points="74,-296 20,-296 20,-260 74,-260 74,-296"/>
-<text text-anchor="middle" x="47" y="-274.3" font-family="Times,serif" font-size="14.00">Loop</text>
+<polygon fill="yellow" stroke="black" points="70,-299 16,-299 16,-263 70,-263 70,-299"/>
+<text text-anchor="middle" x="43" y="-275.95" font-family="Times New Roman,serif" font-size="14.00">Loop</text>
</g>
<!-- Never18&#45;&gt;Loop8 -->
<g id="edge1" class="edge">
<title>Never18&#45;&gt;Loop8</title>
-<path fill="none" stroke="red" d="M62.06,-224.28C59.66,-232.67 57.09,-241.68 54.76,-249.84"/>
-<polygon fill="red" stroke="red" points="51.35,-249.02 51.97,-259.6 58.09,-250.94 51.35,-249.02"/>
-<text text-anchor="middle" x="59.06" y="-226.88" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M54.82,-226.82C52.98,-235.08 51.02,-243.9 49.24,-251.93"/>
+<polygon fill="red" stroke="red" points="45.87,-250.97 47.11,-261.49 52.7,-252.49 45.87,-250.97"/>
+<text text-anchor="middle" x="52.57" y="-228.97" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Start2 -->
<g id="node2" class="node">
<title>Start2</title>
-<polygon fill="yellow" stroke="transparent" points="24,-367 24,-392 74,-392 74,-367 24,-367"/>
-<polygon fill="none" stroke="black" points="24,-367 24,-392 74,-392 74,-367 24,-367"/>
-<text text-anchor="start" x="30.5" y="-375.8" font-family="Times,serif" font-size="14.00">Start</text>
-<polygon fill="none" stroke="black" points="24,-336 24,-367 74,-367 74,-336 24,-336"/>
-<polygon fill="yellow" stroke="transparent" points="29,-341 29,-362 69,-362 69,-341 29,-341"/>
-<polygon fill="none" stroke="black" points="29,-341 29,-362 69,-362 69,-341 29,-341"/>
-<text text-anchor="start" x="32" y="-347.8" font-family="Times,serif" font-size="14.00">$ctrl</text>
+<polygon fill="yellow" stroke="none" points="23.62,-371.5 23.62,-398 64.38,-398 64.38,-371.5 23.62,-371.5"/>
+<polygon fill="none" stroke="black" points="23.62,-371.5 23.62,-398 64.38,-398 64.38,-371.5 23.62,-371.5"/>
+<text text-anchor="start" x="31.25" y="-379.7" font-family="Times New Roman,serif" font-size="14.00">Start</text>
+<polygon fill="none" stroke="black" points="23.62,-339 23.62,-371.5 64.38,-371.5 64.38,-339 23.62,-339"/>
+<polygon fill="yellow" stroke="none" points="28.62,-344 28.62,-366.5 59.38,-366.5 59.38,-344 28.62,-344"/>
+<polygon fill="none" stroke="black" points="28.62,-344 28.62,-366.5 59.38,-366.5 59.38,-344 28.62,-344"/>
+<text text-anchor="start" x="31.62" y="-350.2" font-family="Times New Roman,serif" font-size="14.00">$ctrl</text>
</g>
<!-- Stop3 -->
<g id="node3" class="node">
<title>Stop3</title>
-<polygon fill="yellow" stroke="black" points="108,-52 54,-52 54,-16 108,-16 108,-52"/>
-<text text-anchor="middle" x="81" y="-30.3" font-family="Times,serif" font-size="14.00">Stop</text>
+<polygon fill="yellow" stroke="black" points="107,-52 53,-52 53,-16 107,-16 107,-52"/>
+<text text-anchor="middle" x="80" y="-28.95" font-family="Times New Roman,serif" font-size="14.00">Stop</text>
</g>
<!-- Return21 -->
<g id="node5" class="node">
<title>Return21</title>
-<polygon fill="yellow" stroke="black" points="114,-124 48,-124 48,-88 114,-88 114,-124"/>
-<text text-anchor="middle" x="81" y="-102.3" font-family="Times,serif" font-size="14.00">Return</text>
+<polygon fill="yellow" stroke="black" points="107,-124 53,-124 53,-88 107,-88 107,-124"/>
+<text text-anchor="middle" x="80" y="-100.95" font-family="Times New Roman,serif" font-size="14.00">Return</text>
</g>
<!-- Stop3&#45;&gt;Return21 -->
<g id="edge3" class="edge">
<title>Stop3&#45;&gt;Return21</title>
-<path fill="none" stroke="red" d="M81,-52.3C81,-60.02 81,-69.29 81,-77.89"/>
-<polygon fill="red" stroke="red" points="77.5,-77.9 81,-87.9 84.5,-77.9 77.5,-77.9"/>
-<text text-anchor="middle" x="78" y="-54.9" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M80,-52.3C80,-59.59 80,-68.27 80,-76.46"/>
+<polygon fill="red" stroke="red" points="76.5,-76.38 80,-86.38 83.5,-76.38 76.5,-76.38"/>
+<text text-anchor="middle" x="77.75" y="-54.45" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Return21&#45;&gt;Never18 -->
<g id="edge4" class="edge">
<title>Return21&#45;&gt;Never18:p0</title>
-<path fill="none" stroke="red" d="M66.31,-124.18C59.67,-133.33 52.73,-145.27 50.1,-157.83"/>
-<polygon fill="red" stroke="red" points="46.6,-157.68 49,-168 53.56,-158.43 46.6,-157.68"/>
-<text text-anchor="middle" x="63.31" y="-126.78" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
+<path fill="none" stroke="red" d="M63.41,-124.45C56.41,-133.22 49.19,-144.55 46.19,-156.68"/>
+<polygon fill="red" stroke="red" points="42.73,-156.14 44.94,-166.5 49.68,-157.02 42.73,-156.14"/>
+<text text-anchor="middle" x="61.16" y="-126.6" font-family="Helvetica,sans-Serif" font-size="8.00">0</text>
</g>
<!-- Return21&#45;&gt;Con_4 -->
<g id="edge5" class="edge">
<title>Return21&#45;&gt;Con_4</title>
-<path fill="none" stroke="black" d="M105.93,-124.14C117.06,-133.33 129,-145.71 135,-160 147.36,-189.44 138.76,-226.37 130.12,-250.77"/>
-<polygon fill="black" stroke="black" points="126.74,-249.81 126.48,-260.41 133.29,-252.29 126.74,-249.81"/>
-<text text-anchor="middle" x="102.93" y="-126.74" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="black" d="M96.04,-124.15C104.01,-133.88 112.83,-146.73 117,-160 126.51,-190.23 124.01,-226.9 120.42,-251.69"/>
+<polygon fill="black" stroke="black" points="117,-250.9 118.86,-261.33 123.91,-252.02 117,-250.9"/>
+<text text-anchor="middle" x="93.79" y="-126.3" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Loop8&#45;&gt;Never18 -->
<g id="edge7" class="edge">
<title>Loop8&#45;&gt;Never18:p1</title>
-<path fill="none" stroke="red" d="M74.25,-262.42C94.74,-250.81 120.25,-234.78 126,-224 137.5,-202.43 143.04,-186.53 126,-169 118.29,-161.07 103.85,-156.04 96.15,-159.39"/>
-<polygon fill="red" stroke="red" points="93.13,-157.62 91,-168 99.14,-161.22 93.13,-157.62"/>
-<text text-anchor="middle" x="77.25" y="-256.02" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
+<path fill="none" stroke="red" d="M66.89,-262.62C77.59,-253.37 89.1,-241.02 95,-227 100.86,-213.08 109.7,-194.71 106.13,-185.7"/>
+<polygon fill="red" stroke="red" points="107.8,-182.63 97.33,-180.97 104.48,-188.79 107.8,-182.63"/>
+<text text-anchor="middle" x="64.64" y="-255.02" font-family="Helvetica,sans-Serif" font-size="8.00">2</text>
</g>
<!-- Loop8&#45;&gt;Start2 -->
<g id="edge6" class="edge">
<title>Loop8&#45;&gt;Start2:p0</title>
-<path fill="none" stroke="red" d="M47.86,-296.09C48.28,-305.54 48.73,-317.77 48.92,-329.68"/>
-<polygon fill="red" stroke="red" points="45.42,-330.03 49,-340 52.42,-329.97 45.42,-330.03"/>
-<text text-anchor="middle" x="44.86" y="-298.69" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
+<path fill="none" stroke="red" d="M43.44,-299.35C43.64,-308.51 43.85,-320.2 43.95,-331.69"/>
+<polygon fill="red" stroke="red" points="40.45,-331.5 43.99,-341.49 47.45,-331.47 40.45,-331.5"/>
+<text text-anchor="middle" x="41.19" y="-301.5" font-family="Helvetica,sans-Serif" font-size="8.00">1</text>
</g>
</g>
</svg>
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java b/chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
index 53f51f86..35b34576 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
@@ -146,7 +146,7 @@ public abstract class GlobalCodeMotion {
// Loads need their memory inputs' uses also done
if( n instanceof LoadNode ld )
for( Node memuse : ld.mem()._outputs )
- if( late[memuse._nid]==null && memuse._type instanceof TypeMem )
+ if( antiUse(ld,memuse) && late[memuse._nid]==null )
continue outer;
// All uses done, schedule
@@ -217,6 +217,17 @@ public abstract class GlobalCodeMotion {
best instanceof IfNode;
}
+ // Only a store or memory Phi covering this alias can constrain a load.
+ // MemMerge packages slices without overwriting them.
+ private static boolean antiUse(LoadNode load, Node use) {
+ return switch( use ) {
+ case StoreNode st -> st._alias==load._alias;
+ case MemPhiNode phi -> phi._alias==load._alias;
+ case BulkMemPhiNode phi -> !phi.isSplit(load._alias);
+ default -> false;
+ };
+ }
+
private static CFGNode find_anti_dep(CFGNode lca, LoadNode load, CFGNode early, CFGNode[] late, int[] anti) {
// We could skip final-field loads here.
// Walk LCA->early, flagging Load's block location choices
@@ -224,6 +235,7 @@ public abstract class GlobalCodeMotion {
anti[cfg._nid] = load._nid;
// Walk load->mem uses, looking for Stores causing an anti-dep
for( Node mem : load.mem()._outputs ) {
+ if( !antiUse(load,mem) ) continue;
switch( mem ) {
case StoreNode st:
lca = anti_dep(load,late[st._nid],st.cfg0(),lca,st,anti);
@@ -235,8 +247,6 @@ public abstract class GlobalCodeMotion {
if( phi.in(i)==load.mem() )
lca = anti_dep(load,phi.region().cfg(i),load.mem().cfg0(),lca,null,anti);
break;
- case LoadNode ld: break; // Loads do not cause anti-deps on other loads
- case ReturnNode ret: break; // Load must already be ahead of Return
default: throw Utils.TODO();
}
}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/Parser.java b/chapter11/src/main/java/com/seaofnodes/simple/Parser.java
index 5f4922f4..fb4dfdf8 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/Parser.java
@@ -36,6 +36,10 @@ public class Parser {
public StopNode STOP;
+ // Field identities are independent of the memory graph and Start's tuple.
+ private final HashMap<String,Integer> _aliases = new HashMap<>();
+ private int _alias = 2;
+
// Debugger Printing.
public static boolean SCHEDULED; // True if debug printer can use schedule info
@@ -96,7 +100,7 @@ public class Parser {
_lexer = new Lexer(source);
_scope = new ScopeNode();
_continueScope = _breakScope = null;
- START = new StartNode(new Type[]{ Type.CONTROL, arg });
+ START = new StartNode(new Type[]{ Type.CONTROL, TypeMem.BOT, arg });
STOP = new StopNode(source);
ZERO = new ConstantNode(TypeInteger.constant(0)).peephole().keep();
XCTRL= new XCtrlNode().peephole().keep();
@@ -123,7 +127,8 @@ public class Parser {
// Enter a new scope for the initial control and arguments
_scope.push();
_scope.define(ScopeNode.CTRL, Type.CONTROL , new CProjNode(START, 0, ScopeNode.CTRL).peephole());
- _scope.define(ScopeNode.ARG0, TypeInteger.BOT, new ProjNode(START, 1, ScopeNode.ARG0).peephole());
+ _scope.define(ScopeNode.ARG0, TypeInteger.BOT, new ProjNode(START, 2, ScopeNode.ARG0).peephole());
+ _scope.define("$mem", TypeMem.BOT, new ProjNode(START, 1, "$mem").peephole());
parseBlock();
if( ctrl()._type==Type.CONTROL )
STOP.addReturn(new ReturnNode(ctrl(), new ConstantNode(TypeInteger.constant(0)).peephole(), _scope).peephole());
@@ -211,7 +216,8 @@ public class Parser {
// Build and install the TypeStruct
TypeStruct ts = TypeStruct.make(typeName, fields);
OBJS.put(typeName, ts); // Insert the struct name in the collection of all struct names
- START.addMemProj(ts, _scope); // Insert memory edges
+ _aliases.put(typeName,_alias);
+ _alias += ts._fields.length;
return parseStatement();
}
@@ -599,21 +605,24 @@ public class Parser {
*/
private Node newStruct(TypeStruct obj) {
Node n = new NewNode(TypeMemPtr.make(obj), ctrl()).peephole().keep();
- int alias = START._aliasStarts.get(obj._name);
+ int alias = _aliases.get(obj._name);
for( Field field : obj._fields ) {
- memAlias(alias, new StoreNode(field._fname, alias, ctrl(), memAlias(alias), n, ZERO).peephole());
+ store(field._fname,alias,n,ZERO);
alias++;
}
return n.unkeep();
}
- // We set up memory aliases by inserting special vars in the scope these
- // variables are prefixed by $ so they cannot be referenced in Simple code.
- // Using vars has the benefit that all the existing machinery of scoping
- // and phis work as expected
- private Node memAlias(int alias ) { return _scope.lookup(memName(alias) ); }
- private Node memAlias(int alias, Node st) { return _scope.update(memName(alias), st); }
- public static String memName(int alias) { return ("$"+alias).intern(); }
+ // Memory is one hidden SSA variable, including across branches and loops.
+ private Node mem() { return _scope.lookup("$mem"); }
+ private Node mem(Node n) { return _scope.update("$mem",n); }
+
+ private void store(String name, int alias, Node ptr, Node val) {
+ Node prior = mem().keep();
+ Node st = new StoreNode(name,alias,ctrl(),prior,ptr,val).peephole();
+ mem(new MemMergeNode(prior,alias,st).peephole());
+ prior.unkeep();
+ }
/**
* Parse postfix expression. For now this is just a field
@@ -632,20 +641,20 @@ public class Parser {
String name = requireId().intern();
int idx = ptr._obj==null ? -1 : ptr._obj.find(name);
if( idx == -1 ) throw error("Accessing unknown field '" + name + "' from '" + ptr.str() + "'");
- int alias = START._aliasStarts.get(ptr._obj._name)+idx;
+ int alias = _aliases.get(ptr._obj._name)+idx;
if( match("=") ) {
// Disambiguate "obj.fld==x" boolean test from "obj.fld=x" field assignment
if( peek('=') ) _lexer._position--;
else {
Node val = parseExpression();
- memAlias(alias, new StoreNode(name, alias, ctrl(), memAlias(alias), expr, val).peephole());
+ store(name,alias,expr,val);
return expr; // "obj.a = expr" returns the expression while updating memory
}
}
Type declaredType = ptr._obj._fields[idx]._type;
- return parsePostfix(new LoadNode(name, alias, declaredType, memAlias(alias), expr).peephole());
+ return parsePostfix(new LoadNode(name, alias, declaredType, mem(), expr).peephole());
}
/**
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/BulkMemPhiNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/BulkMemPhiNode.java
new file mode 100644
index 00000000..8d512f21
--- /dev/null
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/BulkMemPhiNode.java
@@ -0,0 +1,237 @@
+package com.seaofnodes.simple.node;
+
+import com.seaofnodes.simple.IterPeeps;
+import com.seaofnodes.simple.type.Type;
+import com.seaofnodes.simple.type.TypeMem;
+import java.util.BitSet;
+
+/**
+ * A Phi for bulk memory. It covers all aliases except {@link #_aliases};
+ * those aliases must be represented by parallel precise MemPhis at the same
+ * program slice.
+ */
+public class BulkMemPhiNode extends PhiNode {
+
+ private static final BitSet EMPTY = new BitSet();
+
+ // Excluded Aliases; empty means NO exclusions.
+ // Each split clones the exclusions; published sets are never mutated.
+ public final BitSet _aliases;
+
+ public BulkMemPhiNode(String label, Node... inputs) {
+ this(label,EMPTY,inputs);
+ }
+
+ private BulkMemPhiNode(String label, BitSet aliases, Node... inputs) {
+ super(label,TypeMem.BOT,inputs);
+ _aliases = aliases;
+ }
+
+ public boolean isSplit(int alias) { return _aliases.get(alias); }
+
+ @Override public String label() { return "BulkPhi"+_aliases; }
+
+ @Override
+ public Type compute() {
+ Type t = super.compute();
+ return t instanceof TypeMem mem ? mem :
+ t==Type.BOTTOM ? TypeMem.BOT :
+ TypeMem.TOP;
+ }
+
+ @Override
+ public Node idealize() {
+ Node progress = super.idealize();
+ if( progress != null ) return progress;
+ if( ((RegionNode)region()).inProgress() || region().nIns()<=1 )
+ return null; // Input is in-progress
+
+ // "Peek through" a MemMerge that covers this alias set on its default
+ for( int i=1; i<nIns(); i++ )
+ if( in(i) instanceof MemMergeNode mmm && canPeek(mmm) ) {
+ setDef(i,IterPeeps.add(mmm.in(1)));
+ return this;
+ }
+
+ // If any input or output uses or defines a specific alias we cover,
+ // make a private MemPhi for it, and add it to the excluded list.
+ for( int i=1; i<nIns(); i++ ) {
+ int alias = inputAlias(in(i));
+ if( alias!=0 )
+ return slice(alias);
+ }
+
+ for( int i=0; i<_outputs.size(); i++ ) {
+ int alias = outputAlias(_outputs.get(i));
+ if( alias!=0 )
+ return slice(alias);
+ }
+
+ return null;
+ }
+
+ static public boolean checkMem(Node n, int alias) {
+ for( Node m : n._inputs )
+ // Bulk memory supplies this alias
+ if( m instanceof BulkMemPhiNode bulk ) {
+ if( bulk._aliases.get(alias) )
+ return false;
+ } else if( m instanceof MemMergeNode mmm &&
+ mmm.in(1) instanceof BulkMemPhiNode bulk &&
+ bulk._aliases.get(alias) &&
+ (alias >= mmm.nIns() || mmm.in(alias)==null) )
+ return false;
+ return true;
+ }
+
+
+ // True if the MemMerge has no precise slice still covered by this Phi.
+ private boolean canPeek(MemMergeNode mmm) {
+ return missingAlias(mmm,false)==0;
+ }
+
+ // Return an alias required by an input but still covered by this Phi, or 0.
+ private int inputAlias(Node n) {
+ return switch(n) {
+ case ProjNode proj -> 0;
+ case ConstantNode con -> 0;
+ case MemMergeNode mmm -> missingAlias(mmm,false);
+ case MemOpNode mem -> unsplit(mem._alias);
+ case BulkMemPhiNode bulk -> missingAlias(bulk);
+ default -> throw new AssertionError("Unexpected memory input "+n);
+ };
+ }
+
+ // Return an alias required by a user but still covered by this Phi, or 0.
+ private int outputAlias(Node use) {
+ // This decision depends backwards on an immediate user's alias/set.
+ // Normal graph-neighbor enqueueing flows from defs to uses, so retain
+ // an explicit forward dependency to revisit this Phi when the user
+ // sharpens.
+ use.addDepForwards(this);
+ return switch(use) {
+ case ScopeNode scope -> 0;
+ case MemMergeNode mmm -> missingAlias(mmm,true);
+ case BulkMemPhiNode bulk -> missingAlias(bulk);
+ case MemOpNode mem -> unsplit(mem._alias);
+ case MemPhiNode phi -> unsplit(phi._alias);
+ default -> {
+ assert use instanceof ReturnNode
+ : "Unexpected bulk-memory user "+use;
+ yield 0;
+ }
+ };
+ }
+
+ // Alias zero/one is bulk, and an already excluded precise alias cannot
+ // trigger another split of this Phi.
+ private int unsplit(int alias) {
+ if( alias <= 1 ) return 0;
+ assert !_aliases.get(alias);
+ return alias;
+ }
+
+ // First alias excluded by the neighboring bulk Phi but not by this one.
+ private int missingAlias(BulkMemPhiNode bulk) {
+ for( int alias = bulk._aliases.nextSetBit(0); alias >= 0; alias = bulk._aliases.nextSetBit(alias+1) )
+ if( !_aliases.get(alias) )
+ return alias;
+ return 0;
+ }
+
+ // First precise MemMerge slice still covered by this Phi. When inspecting
+ // a user, ignore slots which point back to this Phi.
+ private int missingAlias(MemMergeNode mmm, boolean user) {
+ for( int alias=2; alias<mmm.nIns(); alias++ )
+ if( mmm.in(alias)!=null &&
+ mmm.alias(alias)!=mmm.in(1) &&
+ !_aliases.get(alias) )
+ { assert (!user || mmm.in(alias)!=this); return alias; }
+ return 0;
+ }
+
+ // Slice out given alias
+ private MemMergeNode slice( int alias ) {
+ assert !_aliases.get(alias);
+ // Inputs are the same; MemPhi will sharpen his own inputs. If a
+ // parallel precise Phi already exists, reuse it instead of building a
+ // duplicate for the same Region/alias pair.
+ Node mem = precisePhi(alias);
+
+ BitSet aliases = ((BitSet)_aliases.clone());
+ aliases.set(alias);
+ BulkMemPhiNode bphi = new BulkMemPhiNode(_label,aliases);
+ for( int i=0; i<nIns(); i++ )
+ bphi.addDef(in(i));
+ // Installing bphi creates a new bulk user with a different exclusion
+ // set. Queue the original memory inputs before bphi itself can peep
+ // away and hide those neighbor relationships.
+ for( int i=1; i<bphi.nIns(); i++ )
+ IterPeeps.add(bphi.in(i));
+ // Do not peephole bphi here, as BulkMemPhi can recursively start a
+ // second bulk rewrite before this one has finished. Let the worklist
+ // discover any further splits
+ bphi.setType(TypeMem.BOT);
+ Node bulk = bphi;
+ IterPeeps.add(bulk);
+ IterPeeps.add(mem);
+ return aggregate(bulk,alias,mem);
+ }
+
+ // Build aggregate memory over a bulk Phi, preserving every precise slice
+ // which the bulk has already excluded. The named alias is newly supplied
+ // (or replaces its old slice).
+ MemMergeNode aggregate(Node bulk, int alias, Node precise) {
+ MemMergeNode mmm = new MemMergeNode(bulk);
+ for( int old = _aliases.nextSetBit(0); old >= 0; old = _aliases.nextSetBit(old+1) )
+ { assert old != alias; mmm.alias(old,precisePhi(old));}
+ mmm.alias(alias,precise);
+ assert checkMerge(mmm);
+ return mmm;
+ }
+
+ // Find or make the precise Phi parallel to this bulk Phi at the same merge.
+ private Node precisePhi(int alias) {
+ MemPhiNode mphi = _findPhi(alias);
+ if( mphi!=null ) return mphi;
+
+ mphi = new MemPhiNode("$"+alias,alias);
+ mphi.addDef(region());
+ // Due to cycles, must set before calling peephole
+ mphi.setType(TypeMem.make(alias));
+ for( int i=1; i<nIns(); i++ )
+ mphi.addDef(IterPeeps.add(preciseInput(in(i),alias)));
+ return IterPeeps.add(mphi);
+ }
+
+ MemPhiNode _findPhi(int alias) {
+ for( Node use : region()._outputs )
+ if( use instanceof MemPhiNode mphi && mphi._alias==alias )
+ return mphi;
+ return null;
+ }
+
+ // Select an alias already split out of a predecessor's bulk memory.
+ private Node preciseInput(Node mem, int alias) {
+ if( mem instanceof MemMergeNode mmm )
+ return mmm.alias(alias);
+ if( mem instanceof BulkMemPhiNode bulk && bulk.isSplit(alias) )
+ return bulk.precisePhi(alias);
+ return mem;
+ }
+
+ // Every alias excluded by a bulk default must be supplied explicitly.
+ static boolean checkMerge(MemMergeNode mmm) {
+ if( !(mmm.in(1) instanceof BulkMemPhiNode bulk) ) return true;
+ for( int alias = bulk._aliases.nextSetBit(0); alias >= 0; alias = bulk._aliases.nextSetBit(alias+1) )
+ if( alias >= mmm.nIns() || mmm.in(alias)==null )
+ return false;
+ return true;
+ }
+
+ @Override public boolean eq(Node n) {
+ return _aliases.equals(((BulkMemPhiNode)n)._aliases) && super.eq(n);
+ }
+
+ @Override int hash() { return _aliases.hashCode(); }
+}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index 39bbaff1..d057e5c9 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -1,6 +1,7 @@
package com.seaofnodes.simple.node;
import com.seaofnodes.simple.Utils;
+import com.seaofnodes.simple.IterPeeps;
import com.seaofnodes.simple.type.Type;
import com.seaofnodes.simple.type.Field;
@@ -38,10 +39,15 @@ public class LoadNode extends MemOpNode {
@Override
public Node idealize() {
+ if( mem() instanceof MemMergeNode merge ) {
+ setDef(1,IterPeeps.add(merge.alias(_alias)));
+ return this;
+ }
+
// Simple Load-after-Store on same address.
if( mem() instanceof StoreNode st &&
- ptr() == st.ptr() ) { // Must check same object
+ ptr() == st.ptr() && _alias==st._alias ) { // Must check same object
assert _name.equals(st._name); // Equiv class aliasing is perfect
return st.val();
}
@@ -53,7 +59,7 @@ public class LoadNode extends MemOpNode {
// if( pred ) ptr.x = e0; val = pred ? e0
// else ptr.x = e1; : e1;
// val = ptr.x; ptr.x = val;
- if( mem() instanceof PhiNode memphi && memphi.region()._type == Type.CONTROL && memphi.nIns()== 3 ) {
+ if( mem() instanceof MemPhiNode memphi && memphi.region()._type == Type.CONTROL && memphi.nIns()== 3 ) {
// Profit on RHS/Loop backedge
if( profit(memphi,2) ||
// Else must not be a loop to count profit on LHS.
@@ -70,6 +76,6 @@ public class LoadNode extends MemOpNode {
// Profitable if we find a matching Store on this Phi arm.
private boolean profit(PhiNode phi, int idx) {
Node px = phi.in(idx);
- return px!=null && px.addDep(this) instanceof StoreNode st1 && ptr()==st1.ptr();
+ return px!=null && px.addDep(this) instanceof StoreNode st1 && ptr()==st1.ptr() && _alias==st1._alias;
}
}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
new file mode 100644
index 00000000..d7fed402
--- /dev/null
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
@@ -0,0 +1,60 @@
+package com.seaofnodes.simple.node;
+
+import com.seaofnodes.simple.IterPeeps;
+import com.seaofnodes.simple.type.Type;
+import com.seaofnodes.simple.type.TypeMem;
+import java.util.BitSet;
+
+/** All memory: a default slice and explicit overrides for individual aliases. */
+public class MemMergeNode extends Node {
+ public MemMergeNode(Node bulk) { super(null,bulk); _type = TypeMem.BOT; }
+ public MemMergeNode(Node bulk, int alias, Node precise) {
+ this(bulk);
+ alias(alias,precise);
+ }
+
+ public Node alias(int alias) {
+ Node n = alias < nIns() ? in(alias) : null;
+ assert n!=null || !(in(1) instanceof BulkMemPhiNode bulk) || !bulk.isSplit(alias);
+ return n==null ? in(1) : n;
+ }
+
+ public void alias(int alias, Node mem) {
+ assert alias > 1;
+ while( nIns()<=alias ) addDef(null);
+ setDef(alias,mem);
+ }
+
+ @Override public String label() { return "MemMerge"; }
+ @Override public boolean isMem() { return true; }
+ @Override public Type compute() { return TypeMem.BOT; }
+ @Override StringBuilder _print1(StringBuilder sb, BitSet visited) {
+ sb.append("MEM[");
+ for( int i=1; i<nIns(); i++ )
+ if( in(i)!=null ) {
+ sb.append(i==1 ? "default:" : i+":");
+ in(i)._print0(sb,visited).append(" ");
+ }
+ return sb.append("]");
+ }
+
+ @Override public Node idealize() {
+ boolean progress=false, allDefault=true;
+ for( int i=2; i<nIns(); i++ ) {
+ if( in(i)==in(1) ) { setDef(i,null); progress=true; }
+ if( in(i)!=null ) allDefault=false;
+ }
+ if( allDefault ) return in(1);
+
+ if( in(1) instanceof MemMergeNode mem ) {
+ for( int i=2; i<mem.nIns(); i++ )
+ if( mem.in(i)!=null && (i>=nIns() || in(i)==null) )
+ alias(i,mem.in(i));
+ IterPeeps.add(mem.in(1));
+ setDef(1,mem.in(1));
+ return this;
+ }
+ assert BulkMemPhiNode.checkMerge(this);
+ return progress ? this : null;
+ }
+}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/MemPhiNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/MemPhiNode.java
new file mode 100644
index 00000000..c806bede
--- /dev/null
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/MemPhiNode.java
@@ -0,0 +1,36 @@
+package com.seaofnodes.simple.node;
+
+import com.seaofnodes.simple.IterPeeps;
+import com.seaofnodes.simple.type.Type;
+import com.seaofnodes.simple.type.TypeMem;
+
+/** A Phi for one field alias, parallel to a bulk Phi at the same Region. */
+public class MemPhiNode extends PhiNode {
+ public final int _alias;
+
+ public MemPhiNode(String label, int alias, Node... inputs) {
+ super(label,TypeMem.make(alias),inputs);
+ assert alias > 1;
+ _alias = alias;
+ }
+
+ @Override public String label() { return "MemPhi_"+_alias; }
+
+ @Override public Type compute() {
+ assert BulkMemPhiNode.checkMem(this,_alias);
+ Type t = super.compute();
+ return t==Type.TOP || t==TypeMem.TOP ? TypeMem.TOP : TypeMem.make(_alias);
+ }
+
+ @Override public Node idealize() {
+ for( int i=1; i<nIns(); i++ )
+ if( in(i) instanceof MemMergeNode mem ) {
+ setDef(i,IterPeeps.add(mem.alias(_alias)));
+ return this;
+ }
+ return super.idealize();
+ }
+
+ @Override boolean eq(Node n) { return _alias==((MemPhiNode)n)._alias && super.eq(n); }
+ @Override int hash() { return _alias; }
+}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter11/src/main/java/com/seaofnodes/simple/node/Node.java
index 67c82546..69605607 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -448,6 +448,14 @@ public abstract class Node implements OutNode {
* being added must benefit from this node being peepholed.
*/
Node addDep( Node dep ) {
+ return addDep(dep,false);
+ }
+
+ // A bulk Phi inspects its users' partitions. Def-to-use propagation does
+ // not revisit that producer when an immediate user's partition changes.
+ Node addDepForwards(Node dep) { return addDep(dep,true); }
+
+ private Node addDep(Node dep, boolean forwards) {
// Running peepholes during the big assert cannot have side effects
// like adding dependencies.
if( IterPeeps.midAssert() ) return this;
@@ -455,8 +463,8 @@ public abstract class Node implements OutNode {
if( obs != null ) obs.dep(this, dep);
if( _deps==null ) _deps = new ArrayList<>();
if( Utils.find(_deps ,dep) != -1 ) return this; // Already on list
- if( Utils.find(_inputs,dep) != -1 ) return this; // No need for deps on immediate neighbors
- if( Utils.find(_outputs,dep)!= -1 ) return this;
+ if( !forwards && Utils.find(_inputs,dep) != -1 ) return this;
+ if( !forwards && Utils.find(_outputs,dep)!= -1 ) return this;
_deps.add(dep);
return this;
}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/PhiNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/PhiNode.java
index 52f098fa..bbd19795 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/PhiNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/PhiNode.java
@@ -16,6 +16,10 @@ public class PhiNode extends Node {
public PhiNode(String label, Type declaredType, Node... inputs) { super(inputs); _label = label; assert declaredType!=null; _declaredType = declaredType; }
+ public static PhiNode make(String label, Type type, Node... inputs) {
+ return type instanceof TypeMem ? new BulkMemPhiNode(label,inputs) : new PhiNode(label,type,inputs);
+ }
+
@Override public String label() { return "Phi_"+_label; }
@Override
@@ -70,7 +74,7 @@ public class PhiNode extends Node {
// Phi(op(A,B),op(Q,R),op(X,Y)) becomes
// op(Phi(A,Q,X), Phi(B,R,Y)).
Node op = in(1);
- if( op.nIns()==3 && op.in(0)==null && !op.isCFG() && same_op() ) {
+ if( !isMem() && op.nIns()==3 && op.in(0)==null && !op.isCFG() && same_op() ) {
Node[] lhss = new Node[nIns()];
Node[] rhss = new Node[nIns()];
lhss[0] = rhss[0] = in(0); // Set Region
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
index 444b76a8..725c704f 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
@@ -4,32 +4,17 @@ import com.seaofnodes.simple.type.*;
import java.util.BitSet;
-/**
- * The Return node has two inputs. The first input is a control node and the
- * second is the data node that supplies the return value.
- * <p>
- * In this presentation, Return functions as a Stop node, since multiple <code>return</code> statements are not possible.
- * The Stop node will be introduced in Chapter 6 when we implement <code>if</code> statements.
- * <p>
- * The Return's output is the value from the data node.
- */
+/** Keeps all preceding memory effects and the return value alive: {ctrl, $mem, value}. */
public class ReturnNode extends CFGNode {
public ReturnNode(Node ctrl, Node data, ScopeNode scope) {
- super(ctrl, data);
- // We lookup memory slices by the naming convention that they start with $
- // We could also use implicit knowledge that all memory projects are at offset >= 2
- if( scope != null ) {
- String[] names = scope.reverseNames();
- for (String name: names) {
- if (!name.equals("$ctrl") && name.startsWith("$"))
- addDef(scope.lookup(name));
- }
- }
+ // A synthetic never-taken loop exit has no source scope.
+ super(ctrl, scope == null ? null : scope.lookup("$mem"), data);
}
public Node ctrl() { return in(0); }
- public Node expr() { return in(1); }
+ public Node mem () { return in(1); }
+ public Node expr() { return in(2); }
@Override
public String label() { return "Return"; }
@@ -43,7 +28,8 @@ public class ReturnNode extends CFGNode {
@Override
public Type compute() {
- return TypeTuple.make(ctrl()._type,expr()._type);
+ // Return exposes the complete memory state.
+ return TypeTuple.make(ctrl()._type,TypeMem.BOT,expr()._type);
}
@Override
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/ScopeNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
index 455f4b3a..b931e862 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
@@ -129,7 +129,7 @@ public class ScopeNode extends Node {
// Set real Phi in the loop head
// The phi takes its one input (no backedge yet) from a recursive
// lookup, which might have insert a Phi in every loop nest.
- : loop.setDef(idx,new PhiNode(name, lookupDeclaredType(name),loop.ctrl(),loop.update(name,null,nestingLevel),null).peephole());
+ : loop.setDef(idx,PhiNode.make(name, lookupDeclaredType(name),loop.ctrl(),loop.update(name,null,nestingLevel),null).peephole());
setDef(idx,old);
}
return n==null ? old : setDef(idx,n); // Not lazy, so this is the answer
@@ -207,7 +207,7 @@ public class ScopeNode extends Node {
if( in(i) != that.in(i) ) // No need for redundant Phis
// If we are in lazy phi mode we need to a lookup
// by name as it will trigger a phi creation
- setDef(i, new PhiNode(ns[i], this.lookupDeclaredType(ns[i]), r, this.lookup(ns[i]), that.lookup(ns[i])).peephole());
+ setDef(i, PhiNode.make(ns[i], this.lookupDeclaredType(ns[i]), r, this.lookup(ns[i]), that.lookup(ns[i])).peephole());
that.kill(); // Kill merged scope
IterPeeps.add(r);
return r.unkeep().peephole();
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/StartNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/StartNode.java
index 62fc8a6b..b4fa549b 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/StartNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/StartNode.java
@@ -1,59 +1,17 @@
package com.seaofnodes.simple.node;
-import com.seaofnodes.simple.Parser;
import com.seaofnodes.simple.type.*;
-import java.util.Arrays;
import java.util.BitSet;
-import java.util.HashMap;
import java.util.HashSet;
-/**
- * The Start node represents the start of the function.
- *
- * Start initially has 1 input (arg) from outside and the initial control.
- * In ch10 we also add mem aliases as structs get defined; each field in struct
- * adds a distinct alias to Start's tuple.
- */
+/** Start supplies control, whole memory, and the argument, in that order. */
public class StartNode extends CFGNode implements MultiNode {
- // This field is NOT final, because the tuple expands as we add memory aliases
- TypeTuple _args;
-
- // The alias number of the first field in the struct.
- //
- public final HashMap<String,Integer> _aliasStarts;
-
+ private final TypeTuple _args;
public StartNode(Type[] args) {
super();
- _args = TypeTuple.make(args);
- _type = _args;
- _aliasStarts = new HashMap<>();
- }
-
- /**
- * Creates a projection for each of the struct's fields, using the field alias
- * as the key.
- */
- public void addMemProj( TypeStruct ts, ScopeNode scope) {
- int len = _args._types.length;
- _aliasStarts.put(ts._name,len);
-
- // resize the tuple's type array to include all fields of the struct
- int max = len + ts._fields.length;
- Type[] args = Arrays.copyOf(_args._types, max);
-
- // The new members of the tuple get a mem type with an alias
- for( int alias = len; alias < max; alias++ )
- args[alias] = TypeMem.make(alias);
_type = _args = TypeTuple.make(args);
- // For each of the fields we now add a mem projection. Note that the
- // alias matches the slot of the field in the tuple
- for( int alias = len; alias < max; alias++ ) {
- String name = Parser.memName(alias);
- Node n = new ProjNode(this, alias, name).peephole();
- scope.define(name, args[alias], n);
- }
}
@Override
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java
index 5b30b3ec..b816762b 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java
@@ -1,6 +1,7 @@
package com.seaofnodes.simple.node;
import com.seaofnodes.simple.Utils;
+import com.seaofnodes.simple.IterPeeps;
import com.seaofnodes.simple.type.*;
import java.util.BitSet;
@@ -37,11 +38,16 @@ public class StoreNode extends MemOpNode {
@Override
public Node idealize() {
+ if( mem() instanceof MemMergeNode merge ) {
+ setDef(1,IterPeeps.add(merge.alias(_alias)));
+ return this;
+ }
+
// Simple store-after-store on same address. Should pick up the
// required init-store being stomped by a first user store.
if( mem() instanceof StoreNode st &&
- ptr()==st.ptr() && // Must check same object
+ ptr()==st.ptr() && _alias==st._alias && // Must check same object
ptr()._type instanceof TypeMemPtr && // No bother if weird dead pointers
// Must have exactly one use of "this" or you get weird
// non-serializable memory effects in the worse case.
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter04Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter04Test.java
index a3109ff7..14d31245 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter04Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter04Test.java
@@ -84,7 +84,10 @@ public class Chapter04Test {
StopNode stop = parser.parse();
ReturnNode ret = stop.ret();
assertTrue(ret.in(0) instanceof CProjNode);
- assertTrue(ret.in(1) instanceof ProjNode);
+ assertTrue(ret.in(1) instanceof ProjNode);
+ assertEquals(1, ((ProjNode)ret.in(1))._idx);
+ assertTrue(ret.in(2) instanceof ProjNode);
+ assertEquals(2, ((ProjNode)ret.in(2))._idx);
}
@Test
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter05Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter05Test.java
index 8d15493f..91efc3d6 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter05Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter05Test.java
@@ -22,7 +22,7 @@ else {
return a;""");
StopNode ret = parser.parse().iterate();
- assertEquals("return Phi(Region20,(arg+2),(arg-3));", ret.toString());
+ assertEquals("return Phi(Region21,(arg+2),(arg-3));", ret.toString());
}
@Test
@@ -37,7 +37,7 @@ if (arg == 1) {
}
return c;""", TypeInteger.BOT);
StopNode ret = parser.parse().iterate();
- assertEquals("return Phi(Region18,4,3);", ret.toString());
+ assertEquals("return Phi(Region19,4,3);", ret.toString());
}
@Test
@@ -65,7 +65,7 @@ else
b=a+1;
return a+b;""");
StopNode ret = parser.parse().iterate();
- assertEquals("return ((arg*2)+Phi(Region23,2,3));", ret.toString());
+ assertEquals("return ((arg*2)+Phi(Region24,2,3));", ret.toString());
}
@Test
@@ -80,7 +80,7 @@ else
a=b+1;
return a+b;""");
StopNode ret = parser.parse().iterate();
- assertEquals("return ((Phi(Region34,(arg*2),arg)+arg)+Phi(Region,4,5));", ret.toString());
+ assertEquals("return ((Phi(Region35,(arg*2),arg)+arg)+Phi(Region,4,5));", ret.toString());
}
@Test
@@ -100,7 +100,7 @@ else
return a;
""", TypeInteger.BOT);
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region38,Phi(Region24,2,3),Phi(Region36,4,5));", stop.toString());
+ assertEquals("return Phi(Region39,Phi(Region25,2,3),Phi(Region37,4,5));", stop.toString());
}
@Test
@@ -116,7 +116,7 @@ if( arg==0 )
return arg+a+b;
""", TypeInteger.BOT);
StopNode stop = parser.parse();
- assertEquals("return ((arg+Phi(Region15,1,0))+Phi(Region30,2,0));", stop.toString());
+ assertEquals("return ((arg+Phi(Region16,1,0))+Phi(Region31,2,0));", stop.toString());
}
@Test
@@ -130,7 +130,7 @@ if( arg==1 )
}
return a;""");
StopNode ret = parser.parse().iterate();
- assertEquals("return (arg==Phi(Region18,3,2));", ret.toString());
+ assertEquals("return (arg==Phi(Region19,3,2));", ret.toString());
}
@Test
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter06Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter06Test.java
index 7b11bc35..df0f2848 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter06Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter06Test.java
@@ -30,7 +30,7 @@ if (arg)
return (arg < a) < 3;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return ((arg<Phi(Region14,2,1))<3);", stop.toString());
+ assertEquals("return ((arg<Phi(Region15,2,1))<3);", stop.toString());
}
@Test
@@ -65,7 +65,7 @@ else
b=5;
return b;""", TypeInteger.BOT);
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region39,42,5);", stop.toString());
+ assertEquals("return Phi(Region40,42,5);", stop.toString());
}
@Test
@@ -84,7 +84,7 @@ else
b=5;
return b;""", TypeInteger.BOT);
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region32,2,5);", stop.toString());
+ assertEquals("return Phi(Region33,2,5);", stop.toString());
}
@Test
@@ -144,7 +144,7 @@ else
return a;
""", TypeInteger.BOT);
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region43,3,Phi(Region41,4,5));", stop.toString());
+ assertEquals("return Phi(Region44,3,Phi(Region42,4,5));", stop.toString());
}
@Test
@@ -200,7 +200,7 @@ if( arg ) {
return a+b;
""");
StopNode ret = parser.parse().iterate();
- assertEquals("return Phi(Region26,4,1);", ret.toString());
+ assertEquals("return Phi(Region27,4,1);", ret.toString());
}
@@ -251,7 +251,7 @@ if( arg ) {
return a+b+c;
""");
StopNode ret = parser.parse().iterate();
- assertEquals("return (Phi(Region38,Phi(Region25,2,3),0)+Phi(Region,3,1));", ret.toString());
+ assertEquals("return (Phi(Region39,Phi(Region26,2,3),0)+Phi(Region,3,1));", ret.toString());
}
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter07Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter07Test.java
index 177b54d1..222982e7 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter07Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter07Test.java
@@ -18,7 +18,7 @@ public class Chapter07Test {
return arg;
""");
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop8,arg,(Phi_arg+1));", stop.toString());
+ assertEquals("return Phi(Loop9,arg,(Phi_arg+1));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -35,7 +35,7 @@ if(arg){}else{
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region26,1,Phi(Loop15,1,(Phi_a+1)));", stop.toString());
+ assertEquals("return Phi(Region27,1,Phi(Loop16,1,(Phi_a+1)));", stop.toString());
}
@Test
@@ -55,7 +55,7 @@ while(i < arg) {
return sum;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop10,0,Phi(Loop22,Phi_sum,(Phi_sum+Phi(Loop,0,(Phi_j+1)))));", stop.toString());
+ assertEquals("return Phi(Loop11,0,Phi(Loop23,Phi_sum,(Phi_sum+Phi(Loop,0,(Phi_j+1)))));", stop.toString());
}
@Test
@@ -71,7 +71,7 @@ while(a < 10) {
return b;
""");
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop10,2,Phi(Region29,Phi_b,4));", stop.toString());
+ assertEquals("return Phi(Loop11,2,Phi(Region30,Phi_b,4));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -90,7 +90,7 @@ while(a < 10) {
return b;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop10,2,(Phi(Region29,Phi_b,4)+1));", stop.toString());
+ assertEquals("return Phi(Loop11,2,(Phi(Region30,Phi_b,4)+1));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -107,7 +107,7 @@ while(a < 10) {
return a;
""");
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop9,1,(Phi_a+3));", stop.toString());
+ assertEquals("return Phi(Loop10,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -123,7 +123,7 @@ while(a < 10) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop9,1,(Phi_a+3));", stop.toString());
+ assertEquals("return Phi(Loop10,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -136,7 +136,7 @@ while(arg) a = 2;
return a;
""");
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop9,1,2);", stop.toString());
+ assertEquals("return Phi(Loop10,1,2);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -149,7 +149,7 @@ while(arg) a = 2;
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop9,1,2);", stop.toString());
+ assertEquals("return Phi(Loop10,1,2);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -165,7 +165,7 @@ while(a < 10) {
return a;
""");
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop9,1,(Phi_a+3));", stop.toString());
+ assertEquals("return Phi(Loop10,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -181,7 +181,7 @@ while(a < 10) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop9,1,(Phi_a+3));", stop.toString());
+ assertEquals("return Phi(Loop10,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -198,7 +198,7 @@ while(a < 10) {
return a;
""");
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop10,1,(Phi_a+3));", stop.toString());
+ assertEquals("return Phi(Loop11,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -215,7 +215,7 @@ while(a < 10) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop10,1,(Phi_a+3));", stop.toString());
+ assertEquals("return Phi(Loop11,1,(Phi_a+3));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter08Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter08Test.java
index 98fd181b..8fcb29a0 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter08Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter08Test.java
@@ -24,7 +24,7 @@ while(arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region36,Phi(Region26,Phi(Loop8,arg,(Phi_arg+1)),Add),Add);", stop.toString());
+ assertEquals("return Phi(Region37,Phi(Region27,Phi(Loop9,arg,(Phi_arg+1)),Add),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
Assert.assertEquals(5L, Evaluator.evaluate(stop, 1));
Assert.assertEquals(10L, Evaluator.evaluate(stop, 6));
@@ -47,7 +47,7 @@ while(arg < 10) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop9,1,Phi(Region41,Phi_a,(Phi_a+1)));", stop.toString());
+ assertEquals("return Phi(Loop10,1,Phi(Region42,Phi_a,(Phi_a+1)));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -66,7 +66,7 @@ while(arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region34,Phi(Loop8,arg,(Phi_arg+1)),Add);", stop.toString());
+ assertEquals("return Phi(Region35,Phi(Loop9,arg,(Phi_arg+1)),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
}
@@ -82,7 +82,7 @@ while(arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region26,Phi(Loop8,arg,(Phi_arg+1)),Add);", stop.toString());
+ assertEquals("return Phi(Region27,Phi(Loop9,arg,(Phi_arg+1)),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
}
@@ -101,7 +101,7 @@ while(arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop8,arg,(Phi_arg+1));", stop.toString());
+ assertEquals("return Phi(Loop9,arg,(Phi_arg+1));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -118,7 +118,7 @@ while(arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop8,arg,(Phi_arg+1));", stop.toString());
+ assertEquals("return Phi(Loop9,arg,(Phi_arg+1));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -186,7 +186,7 @@ while(arg < 10) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region29,Phi(Loop9,1,(Phi_a+1)),Add);", stop.toString());
+ assertEquals("return Phi(Region30,Phi(Loop10,1,(Phi_a+1)),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
}
@@ -202,7 +202,7 @@ while(1) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return (Phi(Loop9,1,Add)+1);", stop.toString());
+ assertEquals("return (Phi(Loop10,1,Add)+1);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode prj && prj._idx==1 );
}
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter09Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter09Test.java
index 2abce3cb..7af2fa3d 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter09Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter09Test.java
@@ -70,7 +70,7 @@ while (arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop9,arg,(Phi_arg+2));", stop.toString());
+ assertEquals("return Phi(Loop10,arg,(Phi_arg+2));", stop.toString());
Assert.assertEquals(11L, Evaluator.evaluate(stop, 1));
}
@@ -87,7 +87,7 @@ while (arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop10,arg,(Phi_arg+4));", stop.toString());
+ assertEquals("return Phi(Loop11,arg,(Phi_arg+4));", stop.toString());
Assert.assertEquals(13L, Evaluator.evaluate(stop, 1));
}
@@ -116,7 +116,7 @@ while (arg) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop16,arg,(Phi_arg+1));", stop.toString());
+ assertEquals("return Phi(Loop17,arg,(Phi_arg+1));", stop.toString());
}
@Test
@@ -186,7 +186,7 @@ while(arg) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop11,0,(-(Phi_a+3)));", stop.toString());
+ assertEquals("return Phi(Loop12,0,(-(Phi_a+3)));", stop.toString());
}
@Test
@@ -284,7 +284,7 @@ return v1+v0;
public void testFuzz8() {
Parser parser = new Parser("while(arg) arg = arg - 1; return arg;");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop8,arg,(Phi_arg-1));", stop.toString());
+ assertEquals("return Phi(Loop9,arg,(Phi_arg-1));", stop.toString());
}
@Test
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter10Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter10Test.java
index 8dc489f0..be3db3e6 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter10Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter10Test.java
@@ -160,7 +160,7 @@ while (arg) {
return bar.a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop11,0,(Phi_a+2));", stop.toString());
+ assertEquals("return Phi(Loop12,0,(Phi_a+2));", stop.toString());
}
@Test
@@ -212,7 +212,7 @@ if( bar ) bar.a = 1;
return bar;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region16,null,new Bar);", stop.toString());
+ assertEquals("return Phi(Region17,null,new Bar);", stop.toString());
}
@Test
@@ -228,7 +228,7 @@ else bar.a = 1;
return rez;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region33,4,3);", stop.toString());
+ assertEquals("return Phi(Region35,4,3);", stop.toString());
}
@Test
@@ -282,7 +282,7 @@ while( i.x < i.len ) {
return sum;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop15,0,(Phi(Loop,0,(Phi_x+1))+Phi_sum));", stop.toString());
+ assertEquals("return Phi(Loop17,0,(Phi(Loop,0,(Phi_x+1))+Phi_sum));", stop.toString());
}
@@ -303,7 +303,7 @@ while(arg) {
return ret;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop11,new s0,Phi(Region31,new s0,Phi_ret));", stop.toString());
+ assertEquals("return Phi(Loop12,new s0,Phi(Region34,new s0,Phi_ret));", stop.toString());
}
@Test
@@ -321,7 +321,7 @@ while(arg) {
return ret;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop13,new s0,Phi(Region32,new s0,Phi_ret));", stop.toString());
+ assertEquals("return Phi(Loop15,new s0,Phi(Region35,new s0,Phi_ret));", stop.toString());
}
@@ -338,7 +338,7 @@ while(arg < 10) {
return ret;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop11,new s0,Phi(Region30,new s0,Phi_ret));", stop.toString());
+ assertEquals("return Phi(Loop12,new s0,Phi(Region32,new s0,Phi_ret));", stop.toString());
}
@Test
@@ -456,4 +456,64 @@ return 0;
assertEquals("return 0;", stop.toString());
}
+ @Test public void testReadBeforeStores() {
+ var stop = new Parser("""
+ struct S { int x; int y; }
+ S a = new S; S b = new S;
+ a.x = 11; b.x = 22;
+ S p = a; if (arg) p = b;
+ int before = p.x;
+ a.y = 55; b.y = 66;
+ a.x = 33; b.x = 44;
+ return before*100 + p.x;
+ """).parse().iterate();
+ assertEquals(1133L, com.seaofnodes.simple.evaluator.Evaluator.evaluate(stop,0));
+ assertEquals(2244L, com.seaofnodes.simple.evaluator.Evaluator.evaluate(stop,1));
+ }
+
+ static final String NESTED_MEMORY = """
+ struct S { int x; int y; int z; }
+ S s = new S;
+ s.x = 5; s.y = 7; s.z = 11;
+ while (arg > 0) {
+ s.x = s.x + 1;
+ int j = 3;
+ while (j > 0) {
+ j = j - 1;
+ if (j == 1) continue;
+ s.y = s.y + arg;
+ if (arg == 2) break;
+ s.z = s.z + 1;
+ }
+ arg = arg - 1;
+ }
+ return s;
+ """;
+
+ @Test public void testMemoryAcrossNestedLoops() {
+ var stop = new Parser(NESTED_MEMORY).parse().iterate();
+ for (int arg=0; arg<7; arg++) {
+ var obj = (com.seaofnodes.simple.evaluator.Evaluator.Obj)
+ com.seaofnodes.simple.evaluator.Evaluator.evaluate(stop,arg);
+ org.junit.Assert.assertArrayEquals(new Object[] {
+ 5L+arg, 7L+arg*(arg+1)-(arg>=2 ? 2 : 0), 11L+2*arg-(arg>=2 ? 2 : 0)
+ }, obj.fields());
+ }
+ }
+
+ @Test public void testMemoryAtEarlyReturns() {
+ var stop = new Parser("""
+ struct S { int x; int y; int z; }
+ S s = new S;
+ s.x = 3; s.y = 5; s.z = 7;
+ if (arg) { s.x = 11; s.z = 13; return s; }
+ s.y = 17;
+ return s;
+ """).parse().iterate();
+ for (int arg=0; arg<2; arg++) {
+ var obj = (com.seaofnodes.simple.evaluator.Evaluator.Obj)
+ com.seaofnodes.simple.evaluator.Evaluator.evaluate(stop,arg);
+ org.junit.Assert.assertArrayEquals(arg==0 ? new Object[]{3L,17L,7L} : new Object[]{11L,5L,13L}, obj.fields());
+ }
+ }
}
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter10bTest.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter10bTest.java
new file mode 100644
index 00000000..6f094cfb
--- /dev/null
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter10bTest.java
@@ -0,0 +1,64 @@
+package com.seaofnodes.simple;
+
+import com.seaofnodes.simple.node.*;
+import com.seaofnodes.simple.evaluator.Evaluator;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class Chapter10bTest {
+ @Test public void testIndependentField() {
+ var stop = new Parser("""
+ struct S { int x; int y; }
+ S s = new S;
+ s.x = 42;
+ while (arg > 0) { s.y = s.y + arg; arg = arg - 1; }
+ return s.x;
+ """).parse().iterate();
+ assertEquals("return 42;",stop.toString());
+ assertEquals(42L,Evaluator.evaluate(stop,5));
+ assertNull(stop.walk(n -> n instanceof LoadNode ? n : null));
+ }
+
+ @Test public void testParallelMemoryPhis() {
+ var stop = new Parser("""
+ struct S { int x; int y; int z; }
+ S a = new S; S b = new S;
+ S p = a; if (arg) p = b;
+ while (arg > 0) {
+ a.x = p.x + arg;
+ a.y = p.y + 2;
+ a.z = p.z + 3;
+ arg = arg - 1;
+ }
+ return a;
+ """).parse().iterate();
+ int[] phis = {0};
+ stop.walk(n -> {
+ if (n instanceof MemPhiNode) phis[0]++;
+ if (n instanceof MemMergeNode m && m.in(1) instanceof BulkMemPhiNode b)
+ for(int a=b._aliases.nextSetBit(0); a>=0; a=b._aliases.nextSetBit(a+1))
+ assertTrue(a<m.nIns() && m.in(a)!=null);
+ assertFalse(n instanceof PhiNode && n.isMem() &&
+ !(n instanceof MemPhiNode) && !(n instanceof BulkMemPhiNode));
+ return null;
+ });
+ assertTrue(phis[0]>=3);
+ assertArrayEquals(new Object[]{1L,2L,3L},((Evaluator.Obj)Evaluator.evaluate(stop,4)).fields());
+ }
+
+ @Test public void testLateSliceWorklist() throws ReflectiveOperationException {
+ // Seed 97 exposed a store selecting a bulk predecessor without queuing
+ // it. Keep both the worklist assertion and the final heap check.
+ for (int seed : new int[]{0,97,123,456}) {
+ var parser = new Parser(Chapter10Test.NESTED_MEMORY);
+ var field = IterPeeps.class.getDeclaredField("WORK");
+ field.setAccessible(true);
+ Object work = field.get(null);
+ field = work.getClass().getDeclaredField("_R");
+ field.setAccessible(true);
+ ((java.util.Random)field.get(work)).setSeed(seed);
+ var stop = parser.parse().iterate();
+ assertArrayEquals(new Object[]{9L,25L,17L},((Evaluator.Obj)Evaluator.evaluate(stop,4)).fields());
+ }
+ }
+}
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index 3e03d1f7..4c2b42f1 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -326,7 +326,7 @@ while( prime <= arg ) {
return primeCount;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("Stop[ return 0; return Phi(Loop19,1,Phi(Region81,Phi_primeCount,Phi(Region76,(Phi_primeCount+1),Phi_primeCount))); ]", stop.toString());
+ assertEquals("Stop[ return 0; return Phi(Loop20,1,Phi(Region82,Phi_primeCount,Phi(Region77,(Phi_primeCount+1),Phi_primeCount))); ]", stop.toString());
assertEquals(0L, Evaluator.evaluate(stop, 1)); // No primes 1 or below
assertEquals(1L, Evaluator.evaluate(stop, 2)); // 2
assertEquals(2L, Evaluator.evaluate(stop, 3)); // 2, 3
@@ -368,7 +368,7 @@ if (arg) {
return i;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region31,.f,0);", stop.toString());
+ assertEquals("return Phi(Region34,.f,0);", stop.toString());
}
@Test
@@ -474,7 +474,7 @@ while(arg) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop13,arg,Phi(Region35,.f,0));", stop.toString());
+ assertEquals("return Phi(Loop15,arg,Phi(Region39,.f,0));", stop.toString());
}
@Test
@@ -525,7 +525,7 @@ else if (arg == 1) s.f = 1;
return s.f;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region35,1,Phi(Region33,1,0));", stop.toString());
+ assertEquals("return Phi(Region41,1,Phi(Region36,1,0));", stop.toString());
assertEquals(1L, Evaluator.evaluate(stop, 0));
assertEquals(1L, Evaluator.evaluate(stop, 1));
assertEquals(0L, Evaluator.evaluate(stop, 2));
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java b/chapter11/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
index 4a405a3b..355d906b 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
@@ -138,6 +138,7 @@ public class Evaluator {
case CastNode cast -> val(cast.in(1));
case LoadNode load -> load(load);
case StoreNode store -> store(store);
+ case MemMergeNode merge -> MEMORY;
case NewNode alloc -> alloc(alloc);
case CProjNode cproj -> ((Object[])val(cproj.ctrl()))[cproj._idx];
case ProjNode proj -> ((Object[])val( proj.in(0) ))[ proj._idx];
@@ -151,8 +152,8 @@ public class Evaluator {
public Object evaluate(long parameter, int loops) {
if (start == null) return Status.TIMEOUT;
var s = new Object[start.compute()._types.length];
- s[1] = parameter;
- for(int i=2;i<s.length;i++) s[i] = MEMORY;
+ s[1] = MEMORY;
+ s[2] = parameter;
values[start._nid] = s;
int i=0;
Scheduler.Block block = this.startBlock;
@@ -163,7 +164,7 @@ public class Evaluator {
case null:
return Status.FALLTHROUGH;
case ReturnNode ret:
- return val(ret.in(1));
+ return val(ret.expr());
case IfNode ifn:
block = block.next()[isTrue(val(ifn.in(1))) ? 0 : 1];
if (block == null) return Status.FALLTHROUGH;
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java b/chapter11/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java
index 8b86d67a..d16f4300 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java
@@ -250,6 +250,12 @@ public class Scheduler {
// so do that now.
var mem = l.in(1);
for(var out : mem._outputs) {
+ // Aggregates describe partitions; they do not overwrite
+ // memory. Only users of this alias constrain the load.
+ if (out instanceof MemMergeNode || out instanceof ReturnNode) continue;
+ if (out instanceof StoreNode s && s._alias != l._alias) continue;
+ if (out instanceof MemPhiNode p && p._alias != l._alias) continue;
+ if (out instanceof BulkMemPhiNode p && p.isSplit(l._alias)) continue;
if (out instanceof PhiNode p) {
var r = p.in(0);
for (int i = 1; i < p.nIns(); i++) {
@@ -271,7 +277,7 @@ public class Scheduler {
// Store nodes have anti-deps to load nodes.
// So decrease the uses of these loads when the store is placed.
for (var out: s.in(1)._outputs) {
- if (out instanceof LoadNode) od(out).ifPresent(this::decUsers);
+ if (out instanceof LoadNode l && l._alias==s._alias) od(out).ifPresent(this::decUsers);
}
}
}
@@ -469,7 +475,8 @@ public class Scheduler {
var data = mem.pop();
node = data.node;
for(var out:node.in(1)._outputs) {
- if (out instanceof LoadNode) od(out).ifPresent(d->d.users++);
+ if (out instanceof LoadNode l && l._alias==((StoreNode)node)._alias)
+ od(out).ifPresent(d->d.users++);
}
}
}