[RISCV] Regenerate autogen test to remove spurious diff
[llvm-project.git] / llvm / docs / ConvergenceAndUniformity.rst
blob0e97595508f9b19e943d05b4ec9d7b0ec2ae118c
1 .. _convergence-and-uniformity:
3 ==========================
4 Convergence And Uniformity
5 ==========================
7 .. contents::
8    :local:
10 Introduction
11 ============
13 Some parallel environments execute threads in groups that allow
14 communication within the group using special primitives called
15 *convergent* operations. The outcome of a convergent operation is
16 sensitive to the set of threads that executes it "together", i.e.,
17 convergently.
19 A value is said to be *uniform* across a set of threads if it is the
20 same across those threads, and *divergent* otherwise. Correspondingly,
21 a branch is said to be a uniform branch if its condition is uniform,
22 and it is a divergent branch otherwise.
24 Whether threads are *converged* or not depends on the paths they take
25 through the control flow graph. Threads take different outgoing edges
26 at a *divergent branch*. Divergent branches constrain
27 program transforms such as changing the CFG or moving a convergent
28 operation to a different point of the CFG. Performing these
29 transformations across a divergent branch can change the sets of
30 threads that execute convergent operations convergently. While these
31 constraints are out of scope for this document, the described
32 *uniformity analysis* allows these transformations to identify
33 uniform branches where these constraints do not hold.
35 Convergence and
36 uniformity are inter-dependent: When threads diverge at a divergent
37 branch, they may later *reconverge* at a common program point.
38 Subsequent operations are performed convergently, but the inputs may
39 be non-uniform, thus producing divergent outputs.
41 Uniformity is also useful by itself on targets that execute threads in
42 groups with shared execution resources (e.g. waves, warps, or
43 subgroups):
45 - Uniform outputs can potentially be computed or stored on shared
46   resources.
47 - These targets must "linearize" a divergent branch to ensure that
48   each side of the branch is followed by the corresponding threads in
49   the same group. But linearization is unnecessary at uniform
50   branches, since the whole group of threads follows either one side
51   of the branch or the other.
53 This document presents a definition of convergence that is reasonable
54 for real targets and is compatible with the currently implicit
55 semantics of convergent operations in LLVM IR. This is accompanied by
56 a *uniformity analysis* that extends previous work on divergence analysis
57 [DivergenceSPMD]_ to cover irreducible control-flow.
59 .. [DivergenceSPMD] Julian Rosemann, Simon Moll, and Sebastian
60    Hack. 2021. An Abstract Interpretation for SPMD Divergence on
61    Reducible Control Flow Graphs. Proc. ACM Program. Lang. 5, POPL,
62    Article 31 (January 2021), 35 pages.
63    https://doi.org/10.1145/3434312
65 Terminology
66 ===========
68 Cycles
69    Described in :ref:`cycle-terminology`.
71 Closed path
72    Described in :ref:`cycle-closed-path`.
74 Disjoint paths
75    Two paths in a CFG are said to be disjoint if the only nodes common
76    to both are the start node or the end node, or both.
78 Join node
79    A join node of a branch is a node reachable along disjoint paths
80    starting from that branch.
82 Diverged path
83    A diverged path is a path that starts from a divergent branch and
84    either reaches a join node of the branch or reaches the end of the
85    function without passing through any join node of the branch.
87 .. _convergence-dynamic-instances:
89 Threads and Dynamic Instances
90 =============================
92 Each occurrence of an instruction in the program source is called a
93 *static instance*. When a thread executes a program, each execution of
94 a static instance produces a distinct *dynamic instance* of that
95 instruction.
97 Each thread produces a unique sequence of dynamic instances:
99 - The sequence is generated along branch decisions and loop
100   traversals.
101 - Starts with a dynamic instance of a "first" instruction.
102 - Continues with dynamic instances of successive "next"
103   instructions.
105 Threads are independent; some targets may choose to execute them in
106 groups in order to share resources when possible.
108 .. figure:: convergence-natural-loop.png
109    :name: convergence-natural-loop
111 .. table::
112    :name: convergence-thread-example
113    :align: left
115    +----------+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
116    |          |        | 1   | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   |      |
117    +----------+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
118    | Thread 1 | Entry1 | H1  | B1  | L1  | H3  |     | L3  |     |     |     | Exit |
119    +----------+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
120    | Thread 2 | Entry1 | H2  |     | L2  | H4  | B2  | L4  | H5  | B3  | L5  | Exit |
121    +----------+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
123 In the above table, each row is a different thread, listing the
124 dynamic instances produced by that thread from left to right. Each
125 thread executes the same program that starts with an ``Entry`` node
126 and ends with an ``Exit`` node, but different threads may take
127 different paths through the control flow of the program. The columns
128 are numbered merely for convenience, and empty cells have no special
129 meaning. Dynamic instances listed in the same column are converged.
131 .. _convergence-definition:
133 Convergence
134 ===========
136 *Converged-with* is a transitive symmetric relation over dynamic
137 instances produced by *different threads* for the *same static
138 instance*. Informally, two threads that produce converged dynamic
139 instances are said to be *converged*, and they are said to execute
140 that static instance *convergently*, at that point in the execution.
142 *Convergence-before* is a strict partial order over dynamic instances
143 that is defined as the transitive closure of:
145 1. If dynamic instance ``P`` is executed strictly before ``Q`` in the
146    same thread, then ``P`` is *convergence-before* ``Q``.
147 2. If dynamic instance ``P`` is executed strictly before ``Q1`` in the
148    same thread, and ``Q1`` is *converged-with* ``Q2``, then ``P`` is
149    *convergence-before* ``Q2``.
150 3. If dynamic instance ``P1`` is *converged-with* ``P2``, and ``P2``
151    is executed strictly before ``Q`` in the same thread, then ``P1``
152    is *convergence-before* ``Q``.
154 .. table::
155    :name: convergence-order-example
156    :align: left
158    +----------+-------+-----+-----+-----+-----+-----+-----+-----+------+
159    |          | 1     | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9    |
160    +----------+-------+-----+-----+-----+-----+-----+-----+-----+------+
161    | Thread 1 | Entry | ... |     |     |     | S2  | T   | ... | Exit |
162    +----------+-------+-----+-----+-----+-----+-----+-----+-----+------+
163    | Thread 2 | Entry | ... |     | Q2  | R   | S1  |     | ... | Exit |
164    +----------+-------+-----+-----+-----+-----+-----+-----+-----+------+
165    | Thread 3 | Entry | ... | P   | Q1  |     |     |     | ... |      |
166    +----------+-------+-----+-----+-----+-----+-----+-----+-----+------+
168 The above table shows partial sequences of dynamic instances from
169 different threads. Dynamic instances in the same column are assumed
170 to be converged (i.e., related to each other in the converged-with
171 relation). The resulting convergence order includes the edges ``P ->
172 Q2``, ``Q1 -> R``, ``P -> R``, ``P -> T``, etc.
174 The fact that *convergence-before* is a strict partial order is a
175 constraint on the *converged-with* relation. It is trivially satisfied
176 if different dynamic instances are never converged. It is also
177 trivially satisfied for all known implementations for which
178 convergence plays some role.
180 .. _convergence-note-convergence:
182 .. note::
184    1. The convergence-before relation is not
185       directly observable. Program transforms are in general free to
186       change the order of instructions, even though that obviously
187       changes the convergence-before relation.
189    2. Converged dynamic instances need not be executed at the same
190       time or even on the same resource. Converged dynamic instances
191       of a convergent operation may appear to do so but that is an
192       implementation detail.
194    3. The fact that ``P`` is convergence-before
195       ``Q`` does not automatically imply that ``P`` happens-before
196       ``Q`` in a memory model sense.
198 .. _convergence-maximal:
200 Maximal Convergence
201 -------------------
203 This section defines a constraint that may be used to
204 produce a *maximal converged-with* relation without violating the
205 strict *convergence-before* order. This maximal converged-with
206 relation is reasonable for real targets and is compatible with
207 convergent operations.
209 The maximal converged-with relation is defined in terms of cycle
210 headers, with the assumption that threads converge at the header on every
211 "iteration" of the cycle. Informally, two threads execute the same iteration of
212 a cycle if they both previously executed the cycle header the same number of
213 times after they entered that cycle. In general, this needs to account for the
214 iterations of parent cycles as well.
216    **Maximal converged-with:**
218    Dynamic instances ``X1`` and ``X2`` produced by different threads
219    for the same static instance ``X`` are converged in the maximal
220    converged-with relation if and only if for every cycle ``C`` with
221    header ``H`` that contains ``X``:
223    - every dynamic instance ``H1`` of ``H`` that precedes ``X1`` in
224      the respective thread is convergence-before ``X2``, and,
225    - every dynamic instance ``H2`` of ``H`` that precedes ``X2`` in
226      the respective thread is convergence-before ``X1``,
227    - without assuming that ``X1`` is converged with ``X2``.
229 .. note::
231    Cycle headers may not be unique to a given CFG if it is irreducible. Each
232    cycle hierarchy for the same CFG results in a different maximal
233    converged-with relation.
235    For brevity, the rest of the document restricts the term
236    *converged* to mean "related under the maximal converged-with
237    relation for the given cycle hierarchy".
239 Maximal convergence can now be demonstrated in the earlier example as follows:
241 .. table::
242    :align: left
244    +----------+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
245    |          |        | 1   | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   |      |
246    +----------+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
247    | Thread 1 | Entry1 | H1  | B1  | L1  | H3  |     | L3  |     |     |     | Exit |
248    +----------+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
249    | Thread 2 | Entry2 | H2  |     | L2  | H4  | B2  | L4  | H5  | B3  | L5  | Exit |
250    +----------+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
252 - ``Entry1`` and ``Entry2`` are converged.
253 - ``H1`` and ``H2`` are converged.
254 - ``B1`` and ``B2`` are not converged due to ``H4`` which is not
255   convergence-before ``B1``.
256 - ``H3`` and ``H4`` are converged.
257 - ``H3`` is not converged with ``H5`` due to ``H4`` which is not
258   convergence-before ``H3``.
259 - ``L1`` and ``L2`` are converged.
260 - ``L3`` and ``L4`` are converged.
261 - ``L3`` is not converged with ``L5`` due to ``H5`` which is not
262   convergence-before ``L3``.
264 .. _convergence-cycle-headers:
266 Dependence on Cycles Headers
267 ----------------------------
269 Contradictions in *convergence-before* are possible only between two
270 nodes that are inside some cycle. The dynamic instances of such nodes
271 may be interleaved in the same thread, and this interleaving may be
272 different for different threads.
274 When a thread executes a node ``X`` once and then executes it again,
275 it must have followed a closed path in the CFG that includes ``X``.
276 Such a path must pass through the header of at least one cycle --- the
277 smallest cycle that includes the entire closed path. In a given
278 thread, two dynamic instances of ``X`` are either separated by the
279 execution of at least one cycle header, or ``X`` itself is a cycle
280 header.
282 In reducible cycles (natural loops), each execution of the header is
283 equivalent to the start of a new iteration of the cycle. But this
284 analogy breaks down in the presence of explicit constraints on the
285 converged-with relation, such as those described in :ref:`future
286 work<convergence-note-convergence>`. Instead, cycle headers should be
287 treated as implicit *points of convergence* in a maximal
288 converged-with relation.
290 Consider a sequence of nested cycles ``C1``, ``C2``, ..., ``Ck`` such
291 that ``C1`` is the outermost cycle and ``Ck`` is the innermost cycle,
292 with headers ``H1``, ``H2``, ..., ``Hk`` respectively. When a thread
293 enters the cycle ``Ck``, any of the following is possible:
295 1. The thread directly entered cycle ``Ck`` without having executed
296    any of the headers ``H1`` to ``Hk``.
298 2. The thread executed some or all of the nested headers one or more
299    times.
301 The maximal converged-with relation captures the following intuition
302 about cycles:
304 1. When two threads enter a top-level cycle ``C1``, they execute
305    converged dynamic instances of every node that is a :ref:`child
306    <cycle-parent-block>` of ``C1``.
308 2. When two threads enter a nested cycle ``Ck``, they execute
309    converged dynamic instances of every node that is a child of
310    ``Ck``, until either thread exits ``Ck``, if and only if they
311    executed converged dynamic instances of the last nested header that
312    either thread encountered.
314    Note that when a thread exits a nested cycle ``Ck``, it must follow
315    a closed path outside ``Ck`` to reenter it. This requires executing
316    the header of some outer cycle, as described earlier.
318 Consider two dynamic instances ``X1`` and ``X2`` produced by threads ``T1``
319 and ``T2`` for a node ``X`` that is a child of nested cycle ``Ck``.
320 Maximal convergence relates ``X1`` and ``X2`` as follows:
322 1. If neither thread executed any header from ``H1`` to ``Hk``, then
323    ``X1`` and ``X2`` are converged.
325 2. Otherwise, if there are no converged dynamic instances ``Q1`` and
326    ``Q2`` of any header ``Q`` from ``H1`` to ``Hk`` (where ``Q`` is
327    possibly the same as ``X``), such that ``Q1`` precedes ``X1`` and
328    ``Q2`` precedes ``X2`` in the respective threads, then ``X1`` and
329    ``X2`` are not converged.
331 3. Otherwise, consider the pair ``Q1`` and ``Q2`` of converged dynamic
332    instances of a header ``Q`` from ``H1`` to ``Hk`` that occur most
333    recently before ``X1`` and ``X2`` in the respective threads. Then
334    ``X1`` and ``X2`` are converged if and only if there is no dynamic
335    instance of any header from ``H1`` to ``Hk`` that occurs between
336    ``Q1`` and ``X1`` in thread ``T1``, or between ``Q2`` and ``X2`` in
337    thread ``T2``. In other words, ``Q1`` and ``Q2`` represent the last
338    point of convergence, with no other header being executed before
339    executing ``X``.
341 **Example:**
343 .. figure:: convergence-both-diverged-nested.png
344    :name: convergence-both-diverged-nested
346 The above figure shows two nested irreducible cycles with headers
347 ``R`` and ``S``. The nodes ``Entry`` and ``Q`` have divergent
348 branches. The table below shows the convergence between three threads
349 taking different paths through the CFG. Dynamic instances listed in
350 the same column are converged.
352    .. table::
353       :align: left
355       +---------+-------+-----+-----+-----+-----+-----+-----+-----+------+
356       |         | 1     | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 10   |
357       +---------+-------+-----+-----+-----+-----+-----+-----+-----+------+
358       | Thread1 | Entry | P1  | Q1  | S1  | P3  | Q3  | R1  | S2  | Exit |
359       +---------+-------+-----+-----+-----+-----+-----+-----+-----+------+
360       | Thread2 | Entry | P2  | Q2  |     |     |     | R2  | S3  | Exit |
361       +---------+-------+-----+-----+-----+-----+-----+-----+-----+------+
362       | Thread3 | Entry |     |     |     |     |     | R3  | S4  | Exit |
363       +---------+-------+-----+-----+-----+-----+-----+-----+-----+------+
365 - ``P2`` and ``P3`` are not converged due to ``S1``
366 - ``Q2`` and ``Q3`` are not converged due to ``S1``
367 - ``S1`` and ``S3`` are not converged due to ``R2``
368 - ``S1`` and ``S4`` are not converged due to ``R3``
370 Informally, ``T1`` and ``T2`` execute the inner cycle a different
371 number of times, without executing the header of the outer cycle. All
372 threads converge in the outer cycle when they first execute the header
373 of the outer cycle.
375 .. _convergence-uniformity:
377 Uniformity
378 ==========
380 1. The output of two converged dynamic instances is uniform if and
381    only if it compares equal for those two dynamic instances.
382 2. The output of a static instance ``X`` is uniform *for a given set
383    of threads* if and only if it is uniform for every pair of
384    converged dynamic instances of ``X`` produced by those threads.
386 A non-uniform value is said to be *divergent*.
388 For a set ``S`` of threads, the uniformity of each output of a static
389 instance is determined as follows:
391 1. The semantics of the instruction may specify the output to be
392    uniform.
393 2. Otherwise, the output is divergent if the static instance is not
394    :ref:`m-converged <convergence-m-converged>`.
395 3. Otherwise, if the static instance is m-converged:
397    1. If it is a PHI node, its output is uniform if and only
398       if for every pair of converged dynamic instances produced by all
399       threads in ``S``:
401       a. Both instances choose the same output from converged
402          dynamic instances, and,
403       b. That output is uniform for all threads in ``S``.
404    2. Otherwise, the output is uniform if and only if the input
405       operands are uniform for all threads in ``S``.
407 Divergent Cycle Exits
408 ---------------------
410 When a divergent branch occurs inside a cycle, it is possible that a
411 diverged path continues to an exit of the cycle. This is called a
412 divergent cycle exit. If the cycle is irreducible, the diverged path
413 may re-enter and eventually reach a join within the cycle. Such a join
414 should be examined for the :ref:`diverged entry
415 <convergence-diverged-entry>` criterion.
417 Nodes along the diverged path that lie outside the cycle experience
418 *temporal divergence*, when two threads executing convergently inside
419 the cycle produce uniform values, but exit the cycle along the same
420 divergent path after executing the header a different number of times
421 (informally, on different iterations of the cycle). For a node ``N``
422 inside the cycle the outputs may be uniform for the two threads, but
423 any use ``U`` outside the cycle receives a value from non-converged
424 dynamic instances of ``N``. An output of ``U`` may be divergent,
425 depending on the semantics of the instruction.
427 .. _uniformity-analysis:
429 Static Uniformity Analysis
430 ==========================
432 Irreducible control flow results in different cycle hierarchies
433 depending on the choice of headers during depth-first traversal. As a
434 result, a static analysis cannot always determine the convergence of
435 nodes in irreducible cycles, and any uniformity analysis is limited to
436 those static instances whose convergence is independent of the cycle
437 hierarchy:
439 .. _convergence-m-converged:
441   **m-converged static instances:**
443   A static instance ``X`` is *m-converged* for a given CFG if and only
444   if the maximal converged-with relation for its dynamic instances is
445   the same in every cycle hierarchy that can be constructed for that CFG.
447   .. note::
449    In other words, two dynamic instances ``X1`` and ``X2`` of an
450    m-converged static instance ``X`` are converged in some cycle
451    hierarchy if and only if they are also converged in every other
452    cycle hierarchy for the same CFG.
454    As noted earlier, for brevity, we restrict the term *converged* to
455    mean "related under the maximal converged-with relation for a given
456    cycle hierarchy".
459 Each node ``X`` in a given CFG is reported to be m-converged if and
460 only if every cycle that contains ``X`` satisfies the following necessary
461 conditions:
463   1. Every divergent branch inside the cycle satisfies the
464      :ref:`diverged entry criterion<convergence-diverged-entry>`, and,
465   2. There are no :ref:`diverged paths reaching the
466      cycle<convergence-diverged-outside>` from a divergent branch
467      outside it.
469 .. note::
471    A reducible cycle :ref:`trivially satisfies
472    <convergence-reducible-cycle>` the above conditions. In particular,
473    if the whole CFG is reducible, then all nodes in the CFG are
474    m-converged.
476 The uniformity of each output of a static instance
477 is determined using the criteria
478 :ref:`described earlier <convergence-uniformity>`. The discovery of
479 divergent outputs may cause their uses (including branches) to also
480 become divergent. The analysis propagates this divergence until a
481 fixed point is reached.
483 The convergence inferred using these criteria is a safe subset of the
484 maximal converged-with relation for any cycle hierarchy. In
485 particular, it is sufficient to determine if a static instance is
486 m-converged for a given cycle hierarchy ``T``, even if that fact is
487 not detected when examining some other cycle hierarchy ``T'``.
489 This property allows compiler transforms to use the uniformity
490 analysis without being affected by DFS choices made in the underlying
491 cycle analysis. When two transforms use different instances of the
492 uniformity analysis for the same CFG, a "divergent value" result in
493 one analysis instance cannot contradict a "uniform value" result in
494 the other.
496 Generic transforms such as SimplifyCFG, CSE, and loop transforms
497 commonly change the program in ways that change the maximal
498 converged-with relations. This also means that a value that was
499 previously uniform can become divergent after such a transform.
500 Uniformity has to be recomputed after such transforms.
502 Divergent Branch inside a Cycle
503 -------------------------------
505 .. figure:: convergence-divergent-inside.png
506    :name: convergence-divergent-inside
508 The above figure shows a divergent branch ``Q`` inside an irreducible
509 cyclic region. When two threads diverge at ``Q``, the convergence of
510 dynamic instances within the cyclic region depends on the cycle
511 hierarchy chosen:
513 1. In an implementation that detects a single cycle ``C`` with header
514    ``P``, convergence inside the cycle is determined by ``P``.
516 2. In an implementation that detects two nested cycles with headers
517    ``R`` and ``S``, convergence inside those cycles is determined by
518    their respective headers.
520 .. _convergence-diverged-entry:
522 A conservative approach would be to simply report all nodes inside
523 irreducible cycles as having divergent outputs. But it is desirable to
524 recognize m-converged nodes in the CFG in order to maximize
525 uniformity. This section describes one such pattern of nodes derived
526 from *closed paths*, which are a property of the CFG and do not depend
527 on the cycle hierarchy.
529   **Diverged Entry Criterion:**
531   The dynamic instances of all the nodes in a closed path ``P`` are
532   m-converged only if for every divergent branch ``B`` and its
533   join node ``J`` that lie on ``P``, there is no entry to ``P`` which
534   lies on a diverged path from ``B`` to ``J``.
536 .. figure:: convergence-closed-path.png
537    :name: convergence-closed-path
539 Consider the closed path ``P -> Q -> R -> S`` in the above figure.
540 ``P`` and ``R`` are :ref:`entries to the closed
541 path<cycle-closed-path>`. ``Q`` is a divergent branch and ``S`` is a
542 join for that branch, with diverged paths ``Q -> R -> S`` and ``Q ->
543 S``.
545 - If a diverged entry ``R`` exists, then in some cycle hierarchy,
546   ``R`` is the header of the smallest cycle ``C`` containing the
547   closed path and a :ref:`child cycle<cycle-definition>` ``C'``
548   exists in the set ``C - R``, containing both branch ``Q`` and join
549   ``S``. When threads diverge at ``Q``, one subset ``M`` continues
550   inside cycle ``C'``, while the complement ``N`` exits ``C'`` and
551   reaches ``R``. Dynamic instances of ``S`` executed by threads in set
552   ``M`` are not converged with those executed in set ``N`` due to the
553   presence of ``R``. Informally, threads that diverge at ``Q``
554   reconverge in the same iteration of the outer cycle ``C``, but they
555   may have executed the inner cycle ``C'`` differently.
557   .. table::
558      :align: left
560      +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
561      |         | 1     | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   | 10  | 11   |
562      +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
563      | Thread1 | Entry | P1  | Q1  |     |     |     | R1  | S1  | P3  | ... | Exit |
564      +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
565      | Thread2 | Entry | P2  | Q2  | S2  | P4  | Q4  | R2  | S4  |     |     | Exit |
566      +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
568   In the table above, ``S2`` is not converged with ``S1`` due to ``R1``.
572 - If ``R`` does not exist, or if any node other than ``R`` is the
573   header of ``C``, then no such child cycle ``C'`` is detected.
574   Threads that diverge at ``Q`` execute converged dynamic instances of
575   ``S`` since they do not encounter the cycle header on any path from
576   ``Q`` to ``S``. Informally, threads that diverge at ``Q``
577   reconverge at ``S`` in the same iteration of ``C``.
579   .. table::
580      :align: left
582      +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+------+
583      |         | 1     | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   | 10   |
584      +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+------+
585      | Thread1 | Entry | P1  | Q1  | R1  | S1  | P3  | Q3  | R3  | S3  | Exit |
586      +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+------+
587      | Thread2 | Entry | P2  | Q2  |     | S2  | P4  | Q4  | R2  | S4  | Exit |
588      +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+------+
592   .. note::
594      In general, the cycle ``C`` in the above statements is not
595      expected to be the same cycle for different headers. Cycles and
596      their headers are tightly coupled; for different headers in the
597      same outermost cycle, the child cycles detected may be different.
598      The property relevant to the above examples is that for every
599      closed path, there is a cycle ``C`` that contains the path and
600      whose header is on that path.
602 The diverged entry criterion must be checked for every closed path
603 passing through a divergent branch ``B`` and its join ``J``. Since
604 :ref:`every closed path passes through the header of some
605 cycle<cycle-closed-path-header>`, this amounts to checking every cycle
606 ``C`` that contains ``B`` and ``J``. When the header of ``C``
607 dominates the join ``J``, there can be no entry to any path from the
608 header to ``J``, which includes any diverged path from ``B`` to ``J``.
609 This is also true for any closed paths passing through the header of
610 an outer cycle that contains ``C``.
612 Thus, the diverged entry criterion can be conservatively simplified
613 as follows:
615   For a divergent branch ``B`` and its join node ``J``, the nodes in a
616   cycle ``C`` that contains both ``B`` and ``J`` are m-converged only
617   if:
619   - ``B`` strictly dominates ``J``, or,
620   - The header ``H`` of ``C`` strictly dominates ``J``, or,
621   - Recursively, there is cycle ``C'`` inside ``C`` that satisfies the
622     same condition.
624 When ``J`` is the same as ``H`` or ``B``, the trivial dominance is
625 insufficient to make any statement about entries to diverged paths.
627 .. _convergence-diverged-outside:
629 Diverged Paths reaching a Cycle
630 -------------------------------
632 .. figure:: convergence-divergent-outside.png
633    :name: convergence-divergent-outside
635 The figure shows two cycle hierarchies with a divergent branch in
636 ``Entry`` instead of ``Q``. For two threads that enter the closed path
637 ``P -> Q -> R -> S`` at ``P`` and ``R`` respectively, the convergence
638 of dynamic instances generated along the path depends on whether ``P``
639 or ``R`` is the header.
641 -  Convergence when ``P`` is the header.
643    .. table::
644       :align: left
646       +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
647       |         | 1     | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   | 10  | 11  | 12  | 13   |
648       +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
649       | Thread1 | Entry |     |     |     | P1  | Q1  | R1  | S1  | P3  | Q3  |     | S3  | Exit |
650       +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
651       | Thread2 | Entry |     | R2  | S2  | P2  | Q2  |     | S2  | P4  | Q4  | R3  | S4  | Exit |
652       +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
654    |
656 -  Convergence when ``R`` is the header.
658    .. table::
659       :align: left
661       +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
662       |         | 1     | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   | 10  | 11  | 12   |
663       +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
664       | Thread1 | Entry |     | P1  | Q1  | R1  | S1  | P3  | Q3  | S3  |     |     | Exit |
665       +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
666       | Thread2 | Entry |     |     |     | R2  | S2  | P2  | Q2  | S2  | P4  | ... | Exit |
667       +---------+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
669    |
671 Thus, when diverged paths reach different entries of an irreducible
672 cycle from outside the cycle, the static analysis conservatively
673 reports every node in the cycle as not m-converged.
675 .. _convergence-reducible-cycle:
677 Reducible Cycle
678 ---------------
680 If ``C`` is a reducible cycle with header ``H``, then in any DFS,
681 ``H`` :ref:`must be the header of some cycle<cycle-reducible-headers>`
682 ``C'`` that contains ``C``. Independent of the DFS, there is no entry
683 to the subgraph ``C`` other than ``H`` itself. Thus, we have the
684 following:
686 1. The diverged entry criterion is trivially satisfied for a divergent
687    branch and its join, where both are inside subgraph ``C``.
688 2. When diverged paths reach the subgraph ``C`` from outside, their
689    convergence is always determined by the same header ``H``.
691 Clearly, this can be determined only in a cycle hierarchy ``T`` where
692 ``C`` is detected as a reducible cycle. No such conclusion can be made
693 in a different cycle hierarchy ``T'`` where ``C`` is part of a larger
694 cycle ``C'`` with the same header, but this does not contradict the
695 conclusion in ``T``.
697 Controlled Convergence
698 ======================
700 :ref:`Convergence control tokens <dynamic_instances_and_convergence_tokens>`
701 provide an explicit semantics for determining which threads are converged at a
702 given point in the program. The impact of this is incorporated in a
703 :ref:`controlled maximal converged-with <controlled_maximal_converged_with>`
704 relation over dynamic instances and a :ref:`controlled m-converged
705 <controlled_m_converged>` property of static instances. The :ref:`uniformity
706 analysis <uniformity-analysis>` implemented in LLVM includes this for targets
707 that support convergence control tokens.