xref: /llvm-project/llvm/docs/CycleTerminology.rst (revision 475ce4c200ca640f1d6ccd097b167a04f009cb18)
11d0244aeSSameer Sahasrabuddhe.. _cycle-terminology:
21d0244aeSSameer Sahasrabuddhe
31d0244aeSSameer Sahasrabuddhe======================
41d0244aeSSameer SahasrabuddheLLVM Cycle Terminology
51d0244aeSSameer Sahasrabuddhe======================
61d0244aeSSameer Sahasrabuddhe
71d0244aeSSameer Sahasrabuddhe.. contents::
81d0244aeSSameer Sahasrabuddhe   :local:
91d0244aeSSameer Sahasrabuddhe
10*475ce4c2SSameer Sahasrabuddhe.. _cycle-definition:
11*475ce4c2SSameer Sahasrabuddhe
121d0244aeSSameer SahasrabuddheCycles
131d0244aeSSameer Sahasrabuddhe======
141d0244aeSSameer Sahasrabuddhe
151d0244aeSSameer SahasrabuddheCycles are a generalization of LLVM :ref:`loops <loop-terminology>`,
161d0244aeSSameer Sahasrabuddhedefined recursively as follows [HavlakCycles]_:
171d0244aeSSameer Sahasrabuddhe
18d0bfebdaSJannik Silvanus1. In a directed graph G that is a function CFG or a subgraph of it, a *cycle*
19d0bfebdaSJannik Silvanus   is a maximal strongly connected region with at least one internal edge.
20d0bfebdaSJannik Silvanus   (Informational note --- The requirement for at least one internal edge
21d0bfebdaSJannik Silvanus   ensures that a single basic block is a cycle only if there is an edge
22d0bfebdaSJannik Silvanus   that goes back to the same basic block.)
23d0bfebdaSJannik Silvanus2. A basic block in a cycle that can be reached from the entry of
241d0244aeSSameer Sahasrabuddhe   the function along a path that does not visit any other basic block
25d0bfebdaSJannik Silvanus   in the cycle is called an *entry* of the cycle.
26d0bfebdaSJannik Silvanus   A cycle can have multiple entries.
27d0bfebdaSJannik Silvanus3. For a given depth-first search starting from the entry of the function, the
28d0bfebdaSJannik Silvanus   first node of a cycle to be visited is called the *header* of this cycle
29d0bfebdaSJannik Silvanus   with respect to this particular DFS. The header is always an entry node.
30d0bfebdaSJannik Silvanus4. In any depth-first search starting from the entry, the set of cycles
31d0bfebdaSJannik Silvanus   found in the CFG is the same. These are the *top-level cycles*
32d0bfebdaSJannik Silvanus   that do not themselves have a parent.
33d0bfebdaSJannik Silvanus5. The *child cycles* (or simply cycles) nested inside a cycle C with
34d0bfebdaSJannik Silvanus   header H are the cycles in the subgraph induced on the set of nodes (C - H).
35d0bfebdaSJannik Silvanus   C is said to be the *parent* of these cycles.
361d0244aeSSameer Sahasrabuddhe
371d0244aeSSameer SahasrabuddheThus, cycles form an implementation-defined forest where each cycle C is
38d0bfebdaSJannik Silvanusthe parent of any child cycles nested inside C. The tree closely
391d0244aeSSameer Sahasrabuddhefollows the nesting of loops in the same function. The unique entry of
401d0244aeSSameer Sahasrabuddhea reducible cycle (an LLVM loop) L dominates all its other nodes, and
411d0244aeSSameer Sahasrabuddheis always chosen as the header of some cycle C regardless of the DFS
421d0244aeSSameer Sahasrabuddhetree used. This cycle C is a superset of the loop L. For an
431d0244aeSSameer Sahasrabuddheirreducible cycle, no one entry dominates the nodes of the cycle. One
441d0244aeSSameer Sahasrabuddheof the entries is chosen as header of the cycle, in an
451d0244aeSSameer Sahasrabuddheimplementation-defined way.
461d0244aeSSameer Sahasrabuddhe
471d0244aeSSameer Sahasrabuddhe.. _cycle-irreducible:
481d0244aeSSameer Sahasrabuddhe
491d0244aeSSameer SahasrabuddheA cycle is *irreducible* if it has multiple entries and it is
501d0244aeSSameer Sahasrabuddhe*reducible* otherwise.
511d0244aeSSameer Sahasrabuddhe
521d0244aeSSameer Sahasrabuddhe.. _cycle-parent-block:
531d0244aeSSameer Sahasrabuddhe
541d0244aeSSameer SahasrabuddheA cycle C is said to be the *parent* of a basic block B if B occurs in
551d0244aeSSameer SahasrabuddheC but not in any child cycle of C. Then B is also said to be a *child*
561d0244aeSSameer Sahasrabuddheof cycle C.
571d0244aeSSameer Sahasrabuddhe
58*475ce4c2SSameer Sahasrabuddhe.. _cycle-toplevel-block:
59*475ce4c2SSameer Sahasrabuddhe
60*475ce4c2SSameer SahasrabuddheA block B is said to be a *top-level block* if it is not the child of
61*475ce4c2SSameer Sahasrabuddheany cycle.
62*475ce4c2SSameer Sahasrabuddhe
631d0244aeSSameer Sahasrabuddhe.. _cycle-sibling:
641d0244aeSSameer Sahasrabuddhe
651d0244aeSSameer SahasrabuddheA basic block or cycle X is a *sibling* of another basic block or
661d0244aeSSameer Sahasrabuddhecycle Y if they both have no parent or both have the same parent.
671d0244aeSSameer Sahasrabuddhe
681d0244aeSSameer SahasrabuddheInformational notes:
691d0244aeSSameer Sahasrabuddhe
701d0244aeSSameer Sahasrabuddhe- Non-header entry blocks of a cycle can be contained in child cycles.
711d0244aeSSameer Sahasrabuddhe- If the CFG is reducible, the cycles are exactly the natural loops and
721d0244aeSSameer Sahasrabuddhe  every cycle has exactly one entry block.
731d0244aeSSameer Sahasrabuddhe- Cycles are well-nested (by definition).
741d0244aeSSameer Sahasrabuddhe- The entry blocks of a cycle are siblings in the dominator tree.
751d0244aeSSameer Sahasrabuddhe
761d0244aeSSameer Sahasrabuddhe.. [HavlakCycles] Paul Havlak, "Nesting of reducible and irreducible
771d0244aeSSameer Sahasrabuddhe                  loops." ACM Transactions on Programming Languages
781d0244aeSSameer Sahasrabuddhe                  and Systems (TOPLAS) 19.4 (1997): 557-567.
791d0244aeSSameer Sahasrabuddhe
801d0244aeSSameer Sahasrabuddhe.. _cycle-examples:
811d0244aeSSameer Sahasrabuddhe
821d0244aeSSameer SahasrabuddheExamples of Cycles
831d0244aeSSameer Sahasrabuddhe==================
841d0244aeSSameer Sahasrabuddhe
851d0244aeSSameer SahasrabuddheIrreducible cycle enclosing natural loops
861d0244aeSSameer Sahasrabuddhe-----------------------------------------
871d0244aeSSameer Sahasrabuddhe
881d0244aeSSameer Sahasrabuddhe.. Graphviz source; the indented blocks below form a comment.
891d0244aeSSameer Sahasrabuddhe
901d0244aeSSameer Sahasrabuddhe  ///     |   |
911d0244aeSSameer Sahasrabuddhe  ///   />A] [B<\
921d0244aeSSameer Sahasrabuddhe  ///   |  \ /  |
931d0244aeSSameer Sahasrabuddhe  ///   ^---C---^
941d0244aeSSameer Sahasrabuddhe  ///       |
951d0244aeSSameer Sahasrabuddhe
961d0244aeSSameer Sahasrabuddhe  strict digraph {
971d0244aeSSameer Sahasrabuddhe    { rank=same; A B}
981d0244aeSSameer Sahasrabuddhe    Entry -> A
991d0244aeSSameer Sahasrabuddhe    Entry -> B
1001d0244aeSSameer Sahasrabuddhe    A -> A
1011d0244aeSSameer Sahasrabuddhe    A -> C
1021d0244aeSSameer Sahasrabuddhe    B -> B
1031d0244aeSSameer Sahasrabuddhe    B -> C
1041d0244aeSSameer Sahasrabuddhe    C -> A
1051d0244aeSSameer Sahasrabuddhe    C -> B
1061d0244aeSSameer Sahasrabuddhe    C -> Exit
1071d0244aeSSameer Sahasrabuddhe  }
1081d0244aeSSameer Sahasrabuddhe
1091d0244aeSSameer Sahasrabuddhe.. image:: cycle-1.png
1101d0244aeSSameer Sahasrabuddhe
1111d0244aeSSameer SahasrabuddheThe self-loops of ``A`` and ``B`` give rise to two single-block
1121d0244aeSSameer Sahasrabuddhenatural loops. A possible hierarchy of cycles is::
1131d0244aeSSameer Sahasrabuddhe
1141d0244aeSSameer Sahasrabuddhe    cycle: {A, B, C} entries: {A, B} header: A
1151d0244aeSSameer Sahasrabuddhe    - cycle: {B, C}  entries: {B, C} header: C
1161d0244aeSSameer Sahasrabuddhe      - cycle: {B}   entries: {B}    header: B
1171d0244aeSSameer Sahasrabuddhe
1181d0244aeSSameer SahasrabuddheThis hierarchy arises when DFS visits the blocks in the order ``A``,
1191d0244aeSSameer Sahasrabuddhe``C``, ``B`` (in preorder).
1201d0244aeSSameer Sahasrabuddhe
1211d0244aeSSameer SahasrabuddheIrreducible union of two natural loops
1221d0244aeSSameer Sahasrabuddhe--------------------------------------
1231d0244aeSSameer Sahasrabuddhe
1241d0244aeSSameer Sahasrabuddhe.. Graphviz source; the indented blocks below form a comment.
1251d0244aeSSameer Sahasrabuddhe
1261d0244aeSSameer Sahasrabuddhe  ///     |   |
1271d0244aeSSameer Sahasrabuddhe  ///     A<->B
1281d0244aeSSameer Sahasrabuddhe  ///     ^   ^
1291d0244aeSSameer Sahasrabuddhe  ///     |   |
1301d0244aeSSameer Sahasrabuddhe  ///     v   v
1311d0244aeSSameer Sahasrabuddhe  ///     C   D
1321d0244aeSSameer Sahasrabuddhe  ///     |   |
1331d0244aeSSameer Sahasrabuddhe
1341d0244aeSSameer Sahasrabuddhe  strict digraph {
1351d0244aeSSameer Sahasrabuddhe    { rank=same; A B}
1361d0244aeSSameer Sahasrabuddhe    { rank=same; C D}
1371d0244aeSSameer Sahasrabuddhe    Entry -> A
1381d0244aeSSameer Sahasrabuddhe    Entry -> B
1391d0244aeSSameer Sahasrabuddhe    A -> B
1401d0244aeSSameer Sahasrabuddhe    B -> A
1411d0244aeSSameer Sahasrabuddhe    A -> C
1421d0244aeSSameer Sahasrabuddhe    C -> A
1431d0244aeSSameer Sahasrabuddhe    B -> D
1441d0244aeSSameer Sahasrabuddhe    D -> B
1451d0244aeSSameer Sahasrabuddhe    C -> Exit
1461d0244aeSSameer Sahasrabuddhe    D -> Exit
1471d0244aeSSameer Sahasrabuddhe  }
1481d0244aeSSameer Sahasrabuddhe
1491d0244aeSSameer Sahasrabuddhe.. image:: cycle-2.png
1501d0244aeSSameer Sahasrabuddhe
1511d0244aeSSameer SahasrabuddheThere are two natural loops: ``{A, C}`` and ``{B, D}``. A possible
1521d0244aeSSameer Sahasrabuddhehierarchy of cycles is::
1531d0244aeSSameer Sahasrabuddhe
1541d0244aeSSameer Sahasrabuddhe    cycle: {A, B, C, D} entries: {A, B} header: A
1551d0244aeSSameer Sahasrabuddhe    - cycle: {B, D}     entries: {B}    header: B
1561d0244aeSSameer Sahasrabuddhe
1571d0244aeSSameer SahasrabuddheIrreducible cycle without natural loops
1581d0244aeSSameer Sahasrabuddhe---------------------------------------
1591d0244aeSSameer Sahasrabuddhe
1601d0244aeSSameer Sahasrabuddhe.. Graphviz source; the indented blocks below form a comment.
1611d0244aeSSameer Sahasrabuddhe
1621d0244aeSSameer Sahasrabuddhe  ///     |   |
1631d0244aeSSameer Sahasrabuddhe  ///   />A   B<\
1641d0244aeSSameer Sahasrabuddhe  ///   | |\ /| |
1651d0244aeSSameer Sahasrabuddhe  ///   | | x | |
1661d0244aeSSameer Sahasrabuddhe  ///   | |/ \| |
1671d0244aeSSameer Sahasrabuddhe  ///   ^-C   D-^
1681d0244aeSSameer Sahasrabuddhe  ///     |   |
1691d0244aeSSameer Sahasrabuddhe  ///
1701d0244aeSSameer Sahasrabuddhe
1711d0244aeSSameer Sahasrabuddhe  strict digraph {
1721d0244aeSSameer Sahasrabuddhe    { rank=same; A B}
1731d0244aeSSameer Sahasrabuddhe    { rank=same; C D}
1741d0244aeSSameer Sahasrabuddhe    Entry -> A
1751d0244aeSSameer Sahasrabuddhe    Entry -> B
1761d0244aeSSameer Sahasrabuddhe    A -> C
1771d0244aeSSameer Sahasrabuddhe    A -> D
1781d0244aeSSameer Sahasrabuddhe    B -> C
1791d0244aeSSameer Sahasrabuddhe    B -> D
1801d0244aeSSameer Sahasrabuddhe    C -> A
1811d0244aeSSameer Sahasrabuddhe    D -> B
1821d0244aeSSameer Sahasrabuddhe    C -> Exit
1831d0244aeSSameer Sahasrabuddhe    D -> Exit
1841d0244aeSSameer Sahasrabuddhe  }
1851d0244aeSSameer Sahasrabuddhe
1861d0244aeSSameer Sahasrabuddhe.. image:: cycle-3.png
1871d0244aeSSameer Sahasrabuddhe
1881d0244aeSSameer SahasrabuddheThis graph does not contain any natural loops --- the nodes ``A``,
1891d0244aeSSameer Sahasrabuddhe``B``, ``C`` and ``D`` are siblings in the dominator tree. A possible
1901d0244aeSSameer Sahasrabuddhehierarchy of cycles is::
1911d0244aeSSameer Sahasrabuddhe
1921d0244aeSSameer Sahasrabuddhe    cycle: {A, B, C, D} entries: {A, B} header: A
1931d0244aeSSameer Sahasrabuddhe    - cycle: {B, D}     entries: {B, D} header: D
1941d0244aeSSameer Sahasrabuddhe
1951d0244aeSSameer Sahasrabuddhe.. _cycle-closed-path:
1961d0244aeSSameer Sahasrabuddhe
1971d0244aeSSameer SahasrabuddheClosed Paths and Cycles
1981d0244aeSSameer Sahasrabuddhe=======================
1991d0244aeSSameer Sahasrabuddhe
2001d0244aeSSameer SahasrabuddheA *closed path* in a CFG is a connected sequence of nodes and edges in
201d0bfebdaSJannik Silvanusthe CFG whose start and end nodes are the same, and whose remaining
202d0bfebdaSJannik Silvanus(inner) nodes are distinct.
2031d0244aeSSameer Sahasrabuddhe
204*475ce4c2SSameer SahasrabuddheAn *entry* to a closed path ``P`` is a node on ``P`` that is reachable
205*475ce4c2SSameer Sahasrabuddhefrom the function entry without passing through any other node on ``P``.
206*475ce4c2SSameer Sahasrabuddhe
2071d0244aeSSameer Sahasrabuddhe1. If a node D dominates one or more nodes in a closed path P and P
2081d0244aeSSameer Sahasrabuddhe   does not contain D, then D dominates every node in P.
2091d0244aeSSameer Sahasrabuddhe
2101d0244aeSSameer Sahasrabuddhe   **Proof:** Let U be a node in P that is dominated by D. If there
2111d0244aeSSameer Sahasrabuddhe   was a node V in P not dominated by D, then U would be reachable
2121d0244aeSSameer Sahasrabuddhe   from the function entry node via V without passing through D, which
2131d0244aeSSameer Sahasrabuddhe   contradicts the fact that D dominates U.
2141d0244aeSSameer Sahasrabuddhe
2151d0244aeSSameer Sahasrabuddhe2. If a node D dominates one or more nodes in a closed path P and P
2161d0244aeSSameer Sahasrabuddhe   does not contain D, then there exists a cycle C that contains P but
2171d0244aeSSameer Sahasrabuddhe   not D.
2181d0244aeSSameer Sahasrabuddhe
2191d0244aeSSameer Sahasrabuddhe   **Proof:** From the above property, D dominates all the nodes in P.
2201d0244aeSSameer Sahasrabuddhe   For any nesting of cycles discovered by the implementation-defined
2211d0244aeSSameer Sahasrabuddhe   DFS, consider the smallest cycle C which contains P. For the sake
2221d0244aeSSameer Sahasrabuddhe   of contradiction, assume that D is in C. Then the header H of C
2231d0244aeSSameer Sahasrabuddhe   cannot be in P, since the header of a cycle cannot be dominated by
2241d0244aeSSameer Sahasrabuddhe   any other node in the cycle. Thus, P is in the set (C-H), and there
2251d0244aeSSameer Sahasrabuddhe   must be a smaller cycle C' in C which also contains P, but that
2261d0244aeSSameer Sahasrabuddhe   contradicts how we chose C.
2271d0244aeSSameer Sahasrabuddhe
2281d0244aeSSameer Sahasrabuddhe3. If a closed path P contains nodes U1 and U2 but not their
2291d0244aeSSameer Sahasrabuddhe   dominators D1 and D2 respectively, then there exists a cycle C that
2301d0244aeSSameer Sahasrabuddhe   contains U1 and U2 but neither of D1 and D2.
2311d0244aeSSameer Sahasrabuddhe
2321d0244aeSSameer Sahasrabuddhe   **Proof:** From the above properties, each D1 and D2 separately
2331d0244aeSSameer Sahasrabuddhe   dominate every node in P. There exists a cycle C1 (respectively,
2341d0244aeSSameer Sahasrabuddhe   C2) that contains P but not D1 (respectively, D2). Either C1 and C2
2351d0244aeSSameer Sahasrabuddhe   are the same cycle, or one of them is nested inside the other.
2361d0244aeSSameer Sahasrabuddhe   Hence there is always a cycle that contains U1 and U2 but neither
2371d0244aeSSameer Sahasrabuddhe   of D1 and D2.
238*475ce4c2SSameer Sahasrabuddhe
239*475ce4c2SSameer Sahasrabuddhe.. _cycle-closed-path-header:
240*475ce4c2SSameer Sahasrabuddhe
241*475ce4c2SSameer Sahasrabuddhe4. In any cycle hierarchy, the header ``H`` of the smallest cycle
242*475ce4c2SSameer Sahasrabuddhe   ``C`` containing a closed path ``P`` itself lies on ``P``.
243*475ce4c2SSameer Sahasrabuddhe
244*475ce4c2SSameer Sahasrabuddhe   **Proof:** If ``H`` is not in ``P``, then there is a smaller cycle
245*475ce4c2SSameer Sahasrabuddhe   ``C'`` in the set ``C - H`` containing ``P``, thus contradicting
246*475ce4c2SSameer Sahasrabuddhe   the claim that ``C`` is the smallest such cycle.
247*475ce4c2SSameer Sahasrabuddhe
248*475ce4c2SSameer Sahasrabuddhe.. _cycle-reducible-headers:
249*475ce4c2SSameer Sahasrabuddhe
250*475ce4c2SSameer SahasrabuddheReducible Cycle Headers
251*475ce4c2SSameer Sahasrabuddhe=======================
252*475ce4c2SSameer Sahasrabuddhe
253*475ce4c2SSameer SahasrabuddheAlthough the cycle hierarchy depends on the DFS chosen, reducible
254*475ce4c2SSameer Sahasrabuddhecycles satisfy the following invariant:
255*475ce4c2SSameer Sahasrabuddhe
256*475ce4c2SSameer Sahasrabuddhe  If a reducible cycle ``C`` with header ``H`` is discovered in any
257*475ce4c2SSameer Sahasrabuddhe  DFS, then there exists a cycle ``C'`` in every DFS with header
258*475ce4c2SSameer Sahasrabuddhe  ``H``, that contains ``C``.
259*475ce4c2SSameer Sahasrabuddhe
260*475ce4c2SSameer Sahasrabuddhe**Proof:** For a closed path ``P`` in ``C`` that passes through ``H``,
261*475ce4c2SSameer Sahasrabuddheevery cycle hierarchy has a smallest cycle ``C'`` containing ``P`` and
262*475ce4c2SSameer Sahasrabuddhewhose header is in ``P``. Since ``H`` is the only entry to ``P``,
263*475ce4c2SSameer Sahasrabuddhe``H`` must be the header of ``C'``. Since headers uniquely define
264*475ce4c2SSameer Sahasrabuddhecycles, ``C'`` contains every such closed path ``P``, and hence ``C'``
265*475ce4c2SSameer Sahasrabuddhecontains ``C``.
266