1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Add section with details about DAGs.

This commit is contained in:
Paul C. Anagnostopoulos 2020-09-15 14:18:51 -04:00
parent 4abaadfc37
commit 3fb53046bc

View File

@ -285,10 +285,11 @@ wide range of records conveniently and compactly.
``dag``
This type represents a nestable directed acyclic graph (DAG) of nodes.
Each node has an operator and one or more operands. A operand can be
Each node has an operator and zero or more operands. A operand can be
another ``dag`` object, allowing an arbitrary tree of nodes and edges.
As an example, DAGs are used to represent code and patterns for use by
the code generator instruction selection algorithms.
As an example, DAGs are used to represent code patterns for use by
the code generator instruction selection algorithms. See `Directed
acyclic graphs (DAGs)`_ for more details;
:token:`ClassID`
Specifying a class name in a type context indicates
@ -374,6 +375,7 @@ sometimes not when the value is the empty list (``[]``).
This represents a DAG initializer (note the parentheses). The first
:token:`DagArg` is called the "operator" of the DAG and must be a record.
See `Directed acyclic graphs (DAGs)`_ for more details.
.. productionlist::
SimpleValue6: `TokIdentifier`
@ -582,7 +584,7 @@ in a ``bit<n>`` field.
The ``defvar`` form defines a variable whose value can be used in other
value expressions within the body. The variable is not a field: it does not
become a field of the class or record being defined. Variables are provided
to hold temporary values while processing the body. See `Defvar in Record
to hold temporary values while processing the body. See `Defvar in a Record
Body`_ for more details.
When class ``C2`` inherits from class ``C1``, it acquires all the field
@ -1129,7 +1131,7 @@ the next iteration. The following ``defvar`` will not work::
defvar i = !add(i, 1)
Variables can also be defined with ``defvar`` in a record body. See
`Defvar in Record Body`_ for more details.
`Defvar in a Record Body`_ for more details.
``foreach`` --- iterate over a sequence of statements
-----------------------------------------------------
@ -1193,7 +1195,7 @@ the usual way: in a case like ``if v1 then if v2 then {...} else {...}``, the
The :token:`IfBody` of the then and else arms of the ``if`` establish an
inner scope. Any ``defvar`` variables defined in the bodies go out of scope
when the bodies are finished (see `Defvar in Record Body`_ for more details).
when the bodies are finished (see `Defvar in a Record Body`_ for more details).
The ``if`` statement can also be used in a record :token:`Body`.
@ -1201,8 +1203,41 @@ The ``if`` statement can also be used in a record :token:`Body`.
Additional Details
==================
Defvar in record body
---------------------
Directed acyclic graphs (DAGs)
------------------------------
A directed acyclic graph can be represented directly in TableGen using the
``dag`` datatype. A DAG node consists of an operator and zero or more
operands. Each operand can be of any desired type. By using another DAG node
as an operand, an arbitrary graph of DAG nodes can be built.
The syntax of a ``dag`` instance is:
``(`` *operator* *operand1*\ ``,`` *operand2*\ ``,`` ... ``)``
The operator must be present and must be a record. There can be zero or more
operands, separated by commas. The operator and operands can have three
formats.
====================== =============================================
Format Meaning
====================== =============================================
*value* operand value
*value*\ ``:``\ *name* operand value and associated name
*name* operand name with unset (uninitialized) value
====================== =============================================
The *value* can be any TableGen value. The *name*, if present, must be a
:token:`TokVarName`, which starts with a dollar sign (``$``). The purpose of
a name is to tag an operator or operand in a DAG with a particular meaning,
or to associate an operand in one DAG with a like-named operand in another
DAG.
The following bang operators manipulate DAGs: ``!con``, ``!dag``, ``!foreach``,
``!getop``, ``!setop``.
Defvar in a record body
-----------------------
In addition to defining global variables, the ``defvar`` statement can
be used inside the :token:`Body` of a class or record definition to define