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