Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pull] master from phate:master #185

Merged
merged 57 commits into from
Sep 28, 2024
Merged

[pull] master from phate:master #185

merged 57 commits into from
Sep 28, 2024

Conversation

pull[bot]
Copy link

@pull pull bot commented Aug 8, 2024

See Commits and Changes for more details.


Created by pull[bot]

Can you help keep this open source service alive? 💖 Please sponsor : )

phate and others added 30 commits August 8, 2024 07:56
This PR adds support for annotations to region trees. Here is an example
of how it will look like:

```
RootRegion
-STRUCTURAL_TEST_NODE
--Region[0]
--Region[1]
---STRUCTURAL_TEST_NODE
----Region[0]
----Region[1]
----Region[2] NumNodes:0 NumArguments:0
```

The plan is to use this for introducing a pass that enables the printing
of RVSDG properties for debugging as well as metric gathering for pass
evaluations.

---------

Co-authored-by: Magnus Sjalander <[email protected]>
I was having an issue where tests of the command parser would fail due
to some MLIR option, even when neither `--enable-mlir` nor
`--enable-hls` are passed to `configure.sh`. That is a separate issue
that should be fixed, but I thought it was about time I got MLIR and
CIRCT running on my own machine anyway.

These changes should make the build scripts work no matter where LLVM is
installed.

This is as a draft PR for now, to check that these changes do not break
CI.

PS: Some `.cpp` files used symbols imported from the standard library
indirectly, so I had to add some `#include <>` to make it work. I am on
arch (btw), but I am guessing these changes will become necessary on
Ubuntu eventually as well.
A test was failing when compiling without `--enable-mlir`, due to
`--output-format mlir` being unknown when `ENABLE_MLIR` is not defined.

This issue could have been fixed in a different location, such as not
defining the `Mlir` value in the `OutputFormat` enum at all, but that
would have created some additional situations where `#ifdef`s would have
to be added.

I think it is nice to use as few `#ifdef`s as possible, to avoid
situations like this where tests fail in specific `#ifdef`
configurations. I would not be opposed to including the `--output-format
mlir` option in all builds, but possibly making it invisible in the
help-text.
If `OutputFormat::Mlir` is selected without being enabled in the build,
it eventually triggers a `JLM_UNREACHABLE` that informs you that jlm has
been compiled without the MLIR dialect. I think this is much more
user-friendly than just denying that there ever was an output format
called `mlir`.
This change simplifies a helper function in
`TestJlcCommandLineParser.cpp` and `TestJlmOptCommandLineParser.cpp` by
using `c_str()`. It is safe to do this as the strings owning the
underlying data live longer than the vector of `const char *` (and the
strings are never modified).

To make this change legal, some `const` had to be added, but only in
places where no mutation is happening.

The `const char * const *` is necessary, as `char **` can not be cast to
`const char **`.
I had to google this to [understand
why](https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion).
Makes it possible to manually change the size of a pointer by changing
GetPointerSizeInBits() in base-hls.cpp.
Duplicates the cne optimization found in the llvm backend for the hls backend with the addition of supporting the hls::loop_op.
The argument constructor did not check whether the type of the provided
input is the same as the handed in type. In the future, the constructor
should be refactored such that we either hand in an input or a simple
type, but not both at the same time. This would avoid this check
altogether.

Closes #555
The result constructors did not check whether the type of the provided
output is the same as the handed in type. In the future, these
constructors should be refactored such that we either hand in an output
or a simple type, but not both at the same time. This would avoid this
check altogether.

Closes #556
…w double checking is performed (#570)

This PR is the first step towards getting all the Andersen techniques
into main.

It makes a couple of changes, without adding any new techniques:
 - Configurations have a text representation
- Configurations are not specified via environment variable, but there
is instead a function for getting all possible configurations.
- Double-checking against a different configuration is cleaner and
faster. `PointerObjectSet`s are cloned, solved separately, and compared
directly after solving.
- The template stuff used to invoke the worklist solver uses
`std::visit` now, making dispatch much nicer.
 - Some additional statistics have been added
- Re-orders some of the existing operations in the worklist solver. This
is the order they ended up in in the final code when all techniques are
added.
- Added `Erase` to `HashSet`, which is a thin wrapper around
`std::unordered_set::erase()`.
 - Register tests in `TestAndersen.cpp` individually.
This PR does the following:

1. Introduces a Copy() method to the argument class.
2. The introduced method enables us to fix a bug in the copy() method of
the region. Previously, arguments were not copied according to their
argument subtypes, but simply a new instance of argument was created.
3. Add unit test.

This PR is a necessary step to get rid off ports.
Adds Hybrid Cycle Detection from Hardekopf 2007. The implementation is
quite simple, but requires some extra info to be kept from the Offline
Variable Substitution.
This PR does the following:

1. Introduces the GraphImport class and its subclasses to model external
entities to the module. These classes serve as a replacement for the old
impport classes.
2. Replaces all usages of impport with GraphImport
3. Removes old impport classes.

This is one of the steps necessary in order to completely remove ports
from the code base.
This PR does the following:

1. Introduces a Copy() method to the result class.
2. The introduced method enables us to fix a bug in the copy() method of
the region. Previously, results were not copied according to their
result subtypes, but simply a new instance of result was created.
3. Extend unit test.

This PR is a necessary step to get rid off ports.
…for Andersen (#581)

When propagating along the edge a->b, it is because a has something new.
If b already has everything a has, that might indicate that there is a
path from b to a. Lazy cycle detection looks for such a path using a DFS
from b, and unifies everything that is on such a path b->*->a. It tries
at most once per edge.
This PR does the following:

1. Introduces the GraphExport class and its subclasses to model the
export
of internal entities from the module. These classes serve as a
replacement for the old
expport class.
2. Replaces all usages of expport with GraphExport
3. Removes old expport classes.

This is one of the steps necessary in order to completely remove ports
from the code base.
Adds difference propagation, which is one of the more "invasive"
techniques, as it needs to intercept modifications to the points-to
sets. When iterating over a points-to set, you sometimes only need the
set of pointees that have been added since last visit, while you other
times need all pointees.

For the flags, we get away with not intercepting the setting of them.
Difference propagation can just remember if the flag was set the last
time the work item was visited, which only takes up 2 bits per
PointerObject.
The title says it all...
Clang format seems to have caused some files to be formatted
differently, which makes the diff larger than necessary.
We forgot to bump the LLVM version to 18.
… MLIR install paths in configure.sh (#591)

This PR started as a fix of formatting that changed with clang-format
18. I also noticed that the constructor had an unnecessary `const`, so I
fixed that.

Looking into why this was not caught by the ClangFormat workflow, I saw
that the `configure.sh` script's `--enable-mlir` "consumed" the
`--enable-hls`, causing hls to not be enabled, which affects the set of
files found by `make format-dry-run`.

In an attempt to make this not happen in the future, I made
`configure.sh` complain and fail if the path you pass to `--enable-mlir`
or `--enable-hls` is not a folder that exists. This forces the user to
set up the folder first, but it should be helpful in preventing this
type of mistake.

Formatting is a bit of a special case, as we want to "enable" hls and
mlir without needing to install either, so I passed in `/usr` as the
path, since that is a folder we know exists.
)

Adds the dummy worklist, which only remembers if /anything/ has been
pushed.

When given this "worklist", the solver instead performs topological
sweeps across all work items.
This PR adds an argument subclass for the entry arguments of the HLS
loop. This is necessary in order to make the `rvsdg::argument` class
abstract.

Co-authored-by: HKrogstie <[email protected]>
1. Replaces all usages of `argument::create()` with
`TestGraphArgument::Create()` in the unit tests.
2. Makes the argument class abstract
3. Minor clean ups in the argument class
4. Add documentation to argument class
Add class for representing the predicate result of a theta node.
phate and others added 27 commits August 28, 2024 19:11
This pass enables the printing of the RVSDG tree between optimizations.

Intended usage: `jlm-opt --RvsdgTreePrinter --DeadNodeElimination
--RvsdgTreePrinter -s /tmp input.ll`

This will write the files `input-rvsdgTree-0` and `input-rvsdgTree-1` to
`/tmp`, containing the RVSDG tree from before applying dead node
elimination and from after dead node elimination, respectively.

The plan is to extend this pass with support for annotations to the
RVSDG tree. Moreover, the pass can also be generalized to print not just
RVSDG tree, but also the ASCII version of the RVSDG or other debug
output.
1. Add the ExitResult class for representing result values before the
HLS loop terminates
2. Replaces respective `result::create()` with `ExitResult::Create()`
usages
1. Replaces all usages of `result::create()` in the unit tests with the
appropriate subclasses.
2. Makes the result class abstract
3. Minor clean ups in the result class
4. Add documentation to result class
This PR does the following:
1. Adds support for annotating the number of RVSDG nodes to the RVSDG
tree in the RvsdgTreePrinter pass.
2. Adds support for controlling the annotations from jlm-opt
3. Adds a unit test for the printing of the introduced annotation

Usage: `jlm-opt --RvsdgTreePrinter -s /tmp --annotations=NumRvsdgNodes
input.ll`

Example output:
```
RootRegion NumRvsdgNodes:2
-STRUCTURAL_TEST_NODE NumRvsdgNodes:2
--Region[0] NumRvsdgNodes:1
--Region[1] NumRvsdgNodes:1
```

---------

Co-authored-by: Magnus Sjalander <[email protected]>
…VM phi instructions (#598)

As detailed in #597, the `::llvm::ReversePostOrderTraversal` does not
visit unreachable LLVM basic blocks.

As these BBs are never reached at runtime, and do not exist in our tac,
this PR makes phi nodes ignore all operands from these basic blocks. If
a phi node is left with only none operand, it is not converted to a
`phi_op`, but instead uses the value directly.

Fixes #597, (the minimal example given there now compiles), but there
are still issues with the SPEC benchmark `577.xz`.

---------

Co-authored-by: Magnus Sjalander <[email protected]>
Co-authored-by: Håvard Krogstie <[email protected]>
PR #593 made optimizations dynamically configurable, but also screwed up
the invariant that an optimization was only created once. This PR
restores this invariant and moves the optimization creation from the
JlmOptCommandLineOptions class to JlmOptCommand class.

---------

Co-authored-by: HKrogstie <[email protected]>
Tests involving the long double type would fail on ARM processors,
because of a discrepancy in bit-length. A new fpsize is now added for
ARM.

---------

Co-authored-by: Håvard Krogstie <[email protected]>
Co-authored-by: Magnus Sjalander <[email protected]>
Co-authored-by: Nico Reissmann <[email protected]>
1. Cleans up the basic block conversion in the LLVM backend
2. Assigns name "bb[0...]" to the basic block in the output

This PR is required for #586 in order to better follow the output. It is
also part of the effort in #529.

Example output:

```
; Function Attrs: noinline nounwind optnone uwtable
define i64 @fac(i64 noundef %0) #0 {
bb0:
  %1 = alloca i64, align 8
  %2 = alloca i64, align 8
  store i64 %0, ptr %2, align 8
  store i64 1, ptr %1, align 8
  br label %bb1

bb1:                                              ; preds = %bb4, %bb0
  %3 = load i64, ptr %1, align 8
  %4 = load i64, ptr %2, align 8
  %5 = icmp ugt i64 %4, 1
  br i1 %5, label %bb3, label %bb2

bb2:                                              ; preds = %bb1
  br label %bb4

bb3:                                              ; preds = %bb1
  %6 = mul i64 %3, %4
  store i64 %6, ptr %1, align 8
  %7 = load i64, ptr %2, align 8
  %8 = add i64 %7, -1
  store i64 %8, ptr %2, align 8
  br label %bb4

bb4:                                              ; preds = %bb3, %bb2
  %9 = phi i1 [ false, %bb2 ], [ true, %bb3 ]
  br i1 %9, label %bb1, label %bb5

bb5:                                              ; preds = %bb4
  %10 = load i64, ptr %1, align 8
  ret i64 %10
}
```
Adds the command line option `--output-format=dot`, which causes the
final RVSDG to be dumped as the GraphViz dot format.

One non-standard thing about the output is that each region becomes a
separate graph, but with globally unique ids. This is done to make it
easier to focus on parts of the RVSDG at a time, but it requires a
renderer that expects multiple graphs in a single file.

I have made a webapp that takes concatenated graphs as input, and
creates a tree based on which graphs are referenced as subgraphs in
other graphs. Selecting a node, edge or port will show all its
properties, and highlight other nodes/edges they reference. The viewer
should also work with any other GraphViz you may have.

See the webapp [here](https://dot-tree-viz.vercel.app/).
Repo for webapp [here](https://github.com/haved/dot-tree-viz).

The webapp needs more polish to make it pleasant to work with complex
graphs (resizing views, rendering subgraphs inside graphs, rendering \n
properly).

<details>
<summary>Example output (long)</summary>

```
digraph graph0 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  label="Type graph"
  
  node0 [label=ptr tooltip="5e0edd496b28" ];
  node1 [label=iostate tooltip="5e0edd496b38" ];
  node2 [label=mem tooltip="5e0edd496b40" ];
  node3 [label=bit32 tooltip="5e0edd496e80" ];
  node4 [label="ctl(2)" tooltip="5e0edd499200" ];
  node5 [label="ctl(3)" tooltip="5e0edd499210" ];
  node6 [label=bit1 tooltip="5e0edd496c90" ];
}
digraph graph1 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  label="RVSDG root graph"
  tooltip="5e0f07188b80" 
  node7 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">LAMBDA[lzma_decode]</TD></TR>
                        <TR><TD>
                                <TABLE BORDER="0" CELLSPACING="4" CELLPADDING="2"><TR>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph2">graph2</TD>
                                </TR></TABLE>
                        </TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o0" type="node0" BGCOLOR="#FFFFFF" tooltip="5e0f071a73f0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f0718e890" ];
  {
    rank=sink;
    r13 [label=r13 tooltip="5e0f0719eec0" ];
  }
  node7:o0:s -> r13[id=edge48 ];
}
digraph graph2 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f07184ac0" 
  {
    rank=source;
    a0 [label=a0 type=node1 tooltip="5e0f071a0b00" ];
    a1 [label=a1 type=node2 tooltip="5e0f071a0c80" ];
    a0 -> a1[style=invis];
  }
  node8 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BITS32(2)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o1" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a3110"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a70c0" ];
  node9 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">undef</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o2" type="node4" BGCOLOR="#FFFFFF" tooltip="5e0f071a21b0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a20e0" ];
  node10 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BITS32(1)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o3" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a1600"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f0718f7d0" ];
  node11 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BITS32(1)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o4" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a0f10"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f0718e420" ];
  node12 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">undef</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o5" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a0370"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f0718e9c0" ];
  node13 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i0" BGCOLOR="#FFFFFF" tooltip="5e0f0719cb00"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">ALLOCA[bit32]</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o6" type="node0" BGCOLOR="#FFFFFF" tooltip="5e0f071a10d0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o7" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a1160"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f0718f710" ];
  node14 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i1" BGCOLOR="#FFFFFF" tooltip="5e0f0719c8e0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i2" BGCOLOR="#FFFFFF" tooltip="5e0f0719c520"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">MemoryStateMerge</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o8" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a1550"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f0718e760" ];
  node15 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i3" BGCOLOR="#FFFFFF" tooltip="5e0f071a1710"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i4" BGCOLOR="#FFFFFF" tooltip="5e0f071a17e0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i5" BGCOLOR="#FFFFFF" tooltip="5e0f071a18d0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">Store</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o9" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a1980"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f07192640" ];
  node16 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i6" BGCOLOR="#FFFFFF" tooltip="5e0f071a1a80"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i7" BGCOLOR="#FFFFFF" tooltip="5e0f071a1ae0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">Load</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o10" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a1bd0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o11" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a1c40"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071926d0" ];
  node17 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i8" BGCOLOR="#FFFFFF" tooltip="5e0f071a1f20"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">MATCH[1 -&gt; 1, 0 -&gt; 0, 2]</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o12" type="node5" BGCOLOR="#FFFFFF" tooltip="5e0f071a2010"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a1da0" ];
  node18 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i9" BGCOLOR="#FFFFFF" tooltip="5e0f071a03e0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">GAMMA</TD></TR>
                        <TR><TD>
                                <TABLE BORDER="0" CELLSPACING="4" CELLPADDING="2"><TR>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph3">graph3</TD>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph4">graph4</TD>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph5">graph5</TD>
                                </TR></TABLE>
                        </TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o13" type="node4" BGCOLOR="#FFFFFF" tooltip="5e0f071a2bf0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f0718e590" ];
  node22 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i10" BGCOLOR="#FFFFFF" tooltip="5e0f0719a8e0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i11" BGCOLOR="#FFFFFF" tooltip="5e0f0718b2d0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i12" BGCOLOR="#FFFFFF" tooltip="5e0f071a3180"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">GAMMA</TD></TR>
                        <TR><TD>
                                <TABLE BORDER="0" CELLSPACING="4" CELLPADDING="2"><TR>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph6">graph6</TD>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph7">graph7</TD>
                                </TR></TABLE>
                        </TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o17" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a3560"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071924c0" ];
  {
    rank=sink;
    r10 [label=r10 tooltip="5e0f071a72d0" ];
    r11 [label=r11 tooltip="5e0f071a7320" ];
    r10 -> r11[style=invis];
    r12 [label=r12 tooltip="5e0f071a7370" ];
    r11 -> r12[style=invis];
  }
  node11:o4:s -> node13:i0:n[id=edge32 ];
  node13:o7:s -> node14:i1:n[id=edge33 color="#FF0000" ];
  a1 -> node14:i2:n[id=edge34 color="#FF0000" ];
  node13:o6:s -> node15:i3:n[id=edge35 ];
  node10:o3:s -> node15:i4:n[id=edge36 ];
  node14:o8:s -> node15:i5:n[id=edge37 color="#FF0000" ];
  node13:o6:s -> node16:i6:n[id=edge38 ];
  node15:o9:s -> node16:i7:n[id=edge39 color="#FF0000" ];
  node16:o10:s -> node17:i8:n[id=edge40 ];
  node17:o12:s -> node18:i9:n[id=edge41 ];
  node18:o13:s -> node22:i10:n[id=edge42 ];
  node13:o6:s -> node22:i11:n[id=edge43 ];
  node16:o11:s -> node22:i12:n[id=edge44 color="#FF0000" ];
  node8:o1:s -> r10[id=edge45 ];
  a0 -> r11[id=edge46 color="#00FF00" ];
  node22:o17:s -> r12[id=edge47 color="#FF0000" ];
}
digraph graph3 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f071a2260" 
  node19 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">CTL(1)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o14" type="node4" BGCOLOR="#FFFFFF" tooltip="5e0f071a26a0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a25c0" ];
  {
    rank=sink;
    r0 [label=r0 tooltip="5e0f071a2c80" ];
  }
  node19:o14:s -> r0[id=edge0 ];
}
digraph graph4 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f071a2320" 
  node20 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">CTL(1)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o15" type="node4" BGCOLOR="#FFFFFF" tooltip="5e0f071a2770"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a28a0" ];
  {
    rank=sink;
    r1 [label=r1 tooltip="5e0f071a2cd0" ];
  }
  node20:o15:s -> r1[id=edge1 ];
}
digraph graph5 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f071a23e0" 
  node21 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">CTL(0)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o16" type="node4" BGCOLOR="#FFFFFF" tooltip="5e0f071a29c0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a2a50" ];
  {
    rank=sink;
    r2 [label=r2 tooltip="5e0f071a2dd0" ];
  }
  node21:o16:s -> r2[id=edge2 ];
}
digraph graph6 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f071a2ef0" 
  {
    rank=source;
    a2 [label=a2 type=node0 tooltip="5e0f0719c1c0" ];
    a3 [label=a3 type=node2 tooltip="5e0f0719aac0" ];
    a2 -> a3[style=invis];
  }
  {
    rank=sink;
    r3 [label=r3 tooltip="5e0f071a35f0" ];
  }
  a3 -> r3[id=edge3 color="#FF0000" ];
}
digraph graph7 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f071a2fb0" 
  {
    rank=source;
    a4 [label=a4 type=node0 tooltip="5e0f0719c2b0" ];
    a5 [label=a5 type=node2 tooltip="5e0f0719ae60" ];
    a4 -> a5[style=invis];
  }
  node23 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i13" BGCOLOR="#FFFFFF" tooltip="5e0f071a3810"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i14" BGCOLOR="#FFFFFF" tooltip="5e0f071a3bf0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">THETA</TD></TR>
                        <TR><TD>
                                <TABLE BORDER="0" CELLSPACING="4" CELLPADDING="2"><TR>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph8">graph8</TD>
                                </TR></TABLE>
                        </TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o18" type="node0" BGCOLOR="#FFFFFF" tooltip="5e0f071a3920"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o19" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a3d00"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a33b0" ];
  {
    rank=sink;
    r9 [label=r9 tooltip="5e0f071a7070" ];
  }
  a4 -> node23:i13:n[id=edge29 ];
  a5 -> node23:i14:n[id=edge30 color="#FF0000" ];
  node23:o19:s -> r9[id=edge31 color="#FF0000" ];
}
digraph graph8 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f071a3480" 
  {
    rank=source;
    a6 [label=a6 type=node0 tooltip="5e0f07195020" ];
    a7 [label=a7 type=node2 tooltip="5e0f0719ab40" ];
    a6 -> a7[style=invis];
  }
  node24 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i15" BGCOLOR="#FFFFFF" tooltip="5e0f071a4020"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i16" BGCOLOR="#FFFFFF" tooltip="5e0f071a4080"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">Load</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o20" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a4100"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o21" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a4170"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a3ee0" ];
  node25 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BITS32(5)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o22" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a67b0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a6690" ];
  node26 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BITS32(10)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o23" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a4360"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a4240" ];
  node27 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i17" BGCOLOR="#FFFFFF" tooltip="5e0f071a4670"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i18" BGCOLOR="#FFFFFF" tooltip="5e0f071a4760"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BitSlt32</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o24" type="node6" BGCOLOR="#FFFFFF" tooltip="5e0f071a4850"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a4550" ];
  node28 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i19" BGCOLOR="#FFFFFF" tooltip="5e0f071a4a20"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">MATCH[1 -&gt; 1, 0]</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o25" type="node4" BGCOLOR="#FFFFFF" tooltip="5e0f071a4b10"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a48e0" ];
  node29 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i20" BGCOLOR="#FFFFFF" tooltip="5e0f071a4df0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i21" BGCOLOR="#FFFFFF" tooltip="5e0f071a4ee0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i22" BGCOLOR="#FFFFFF" tooltip="5e0f071a5030"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">GAMMA</TD></TR>
                        <TR><TD>
                                <TABLE BORDER="0" CELLSPACING="4" CELLPADDING="2"><TR>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph9">graph9</TD>
                                        <TD BORDER="1" STYLE="ROUNDED" WIDTH="40" BGCOLOR="white" SUBGRAPH="graph10">graph10</TD>
                                </TR></TABLE>
                        </TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o26" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a6320"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a4be0" ];
  node34 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i30" BGCOLOR="#FFFFFF" tooltip="5e0f071a5150"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i31" BGCOLOR="#FFFFFF" tooltip="5e0f071a65a0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">Load</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o32" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a52e0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o33" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a65e0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a64c0" ];
  node35 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i32" BGCOLOR="#FFFFFF" tooltip="5e0f071a69a0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i33" BGCOLOR="#FFFFFF" tooltip="5e0f071a6a90"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BitSlt32</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o34" type="node6" BGCOLOR="#FFFFFF" tooltip="5e0f071a6b80"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a6880" ];
  node36 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i34" BGCOLOR="#FFFFFF" tooltip="5e0f071a6dd0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">MATCH[1 -&gt; 1, 0]</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o35" type="node4" BGCOLOR="#FFFFFF" tooltip="5e0f071a6ec0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a6c10" ];
  {
    rank=sink;
    r6 [label=r6 tooltip="5e0f071a3710" ];
    r7 [label=r7 tooltip="5e0f071a39f0" ];
    r6 -> r7[style=invis];
    r8 [label=r8 tooltip="5e0f071a3d90" ];
    r7 -> r8[style=invis];
  }
  a6 -> node24:i15:n[id=edge13 ];
  a7 -> node24:i16:n[id=edge14 color="#FF0000" ];
  node24:o20:s -> node27:i17:n[id=edge15 ];
  node26:o23:s -> node27:i18:n[id=edge16 ];
  node27:o24:s -> node28:i19:n[id=edge17 ];
  node28:o25:s -> node29:i20:n[id=edge18 ];
  a6 -> node29:i21:n[id=edge19 ];
  node24:o21:s -> node29:i22:n[id=edge20 color="#FF0000" ];
  a6 -> node34:i30:n[id=edge21 ];
  node29:o26:s -> node34:i31:n[id=edge22 color="#FF0000" ];
  node34:o32:s -> node35:i32:n[id=edge23 ];
  node25:o22:s -> node35:i33:n[id=edge24 ];
  node35:o34:s -> node36:i34:n[id=edge25 ];
  node36:o35:s -> r6[id=edge26 ];
  a6 -> r7[id=edge27 ];
  node34:o33:s -> r8[id=edge28 color="#FF0000" ];
}
digraph graph9 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f071a4c90" 
  {
    rank=source;
    a8 [label=a8 type=node0 tooltip="5e0f0719c140" ];
    a9 [label=a9 type=node2 tooltip="5e0f0719b190" ];
    a8 -> a9[style=invis];
  }
  {
    rank=sink;
    r4 [label=r4 tooltip="5e0f071a63b0" ];
  }
  a9 -> r4[id=edge4 color="#FF0000" ];
}
digraph graph10 {
  node[shape=box style=filled fillcolor=white];
  penwidth=6;
  tooltip="5e0f071a4d30" 
  {
    rank=source;
    a10 [label=a10 type=node0 tooltip="5e0f0719af20" ];
    a11 [label=a11 type=node2 tooltip="5e0f0719c4a0" ];
    a10 -> a11[style=invis];
  }
  node30 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i23" BGCOLOR="#FFFFFF" tooltip="5e0f071a54c0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i24" BGCOLOR="#FFFFFF" tooltip="5e0f071a5590"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">Load</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o27" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a5680"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o28" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a56f0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a53b0" ];
  node31 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BITS32(1)</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o29" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a58e0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a57c0" ];
  node32 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i25" BGCOLOR="#FFFFFF" tooltip="5e0f071a5c80"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i26" BGCOLOR="#FFFFFF" tooltip="5e0f071a5d70"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">BitAdd32</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o30" type="node3" BGCOLOR="#FFFFFF" tooltip="5e0f071a5e60"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a5b60" ];
  node33 [shape=plain style=solid label=<
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i27" BGCOLOR="#FFFFFF" tooltip="5e0f071a6040"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i28" BGCOLOR="#FFFFFF" tooltip="5e0f071a60a0"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="10"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="i29" BGCOLOR="#FFFFFF" tooltip="5e0f071a6190"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="1" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0" BGCOLOR="#FFFFFF" >
                        <TR><TD CELLPADDING="1">Store</TD></TR>
                </TABLE>
        </TD></TR>
        <TR><TD>
                <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR>
                        <TD WIDTH="20"></TD>
                        <TD BORDER="1" CELLPADDING="1" PORT="o31" type="node2" BGCOLOR="#FFFFFF" tooltip="5e0f071a6270"  WIDTH="8" HEIGHT="5" FIXEDSIZE="true"></TD>
                        <TD WIDTH="20"></TD>
                </TR></TABLE>
        </TD></TR>
</TABLE>
  > tooltip="5e0f071a5f20" ];
  {
    rank=sink;
    r5 [label=r5 tooltip="5e0f071a6400" ];
  }
  a10 -> node30:i23:n[id=edge5 ];
  a11 -> node30:i24:n[id=edge6 color="#FF0000" ];
  node30:o27:s -> node32:i25:n[id=edge7 ];
  node31:o29:s -> node32:i26:n[id=edge8 ];
  a10 -> node33:i27:n[id=edge9 ];
  node32:o30:s -> node33:i28:n[id=edge10 ];
  node30:o28:s -> node33:i29:n[id=edge11 color="#FF0000" ];
  node33:o31:s -> r5[id=edge12 color="#FF0000" ];
}

```
</details>

---------

Co-authored-by: Håvard Krogstie <[email protected]>
make target for header consistency checking

Provide a "check-headers" target that verifies whether all header files
are correctly correctly declared for the build system. This avoids cases
when a header is used, but not declared in any library build rule.

In principle, the build system should always be aware of every single
file
used during build. Otherwise, this can cause problems, e.g. when a
library
is built but the "install" rule misses headers that should go without,
hence publishing a broken package.

The present checking does not verify if the header is "assigned" to the
library
that "uses" it (or some dependent library) -- that is difficult to
express
in "make", but this check should be sufficient for the purposes of
manually
rectifying any oversight.

Fix missing headers detected by check-headers target

Add all headers detected missing by the build target to declarations
in the makefiles.
1. Extends the structural test node with an interface for adding
inputs/outputs/arguments/results
2. Add support for printing of memory state typed inputs/outputs to
RvsdgTreePrinter class
3. Adds support for this annotation to jlm-opt
1. Moves all the gamma tests of the RVSDG to CFG pass into a single file
2. Cleans them up a bit
3. Fix indentation of test files in Makefile

This is part of the fix for #586.
The ascii output for the control flow graph is not easily readable. This
is the first PR on improving it. It does the following:

1. Moves the functions for converting a CFG to ascii to the cfg class
2. Adds a unit test for the conversion of three address codes

In order to add a unit test for the CFG conversion, I first need to make
the output more deterministic. This will happen in a follow up PR. This
PR is part of issue #586
@pull pull bot merged commit 54449da into EECS-NTNU:master Sep 28, 2024
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants