Predicate Relation Scope Exceptions

There are some exceptions to the scope rules:

  The parallel compare instruction preserves and strengthens predicate relations when there
    are several coexisting conditions.

  The instruction cmp.rel.or does not delete imply relations when the destination
  register is the target of the imply relation. In the following example, the imply relation is
  generated in the first compare instruction, such that p1 implies p3 and p2 implies p3.
  The instruction cmp.eq.or does not delete these relations; p3 is the destination register.

  (p3) cmp.eq p1,p2 = r1, r2 ; p1 implies p3

  cmp.eq.or p3,p4 = r5, r6

  (p1) mov r4 = 2

  (p3) br.cond.sptk L        ; Imply still exists

  mov r4 = 7                 ; No write-after-write on r4

  The instruction cmp.rel.and does not delete mutex relations and imply relations when
  the destination register is the source of the imply relation. The following example shows
  the instruction and parallel compare. The mutex relation is generated in the user
  annotation (p1 mutually excludes p2), and the instruction cmp.ne.and does not delete
  this relation:

  .pred.rel “mutex“,p1,p2

  cmp.ne.and p4,p1 = r5,r0   ; Mutex still exists

  (p1) mov r4 = 2

  (p2) mov r4 = 5            ; No write-after-write on r4

  The instruction cmp.rel.or.andcm p1, p2 = . . . recreates the mutex
  relations between the same predicates p1 and p2, and doesn’t erase the imply relations
  when p1 is the source of the imply relation, and doesn’t erase imply relations when p2
  is the target of the imply relation.

  IAS does not build a control flow graph (CFG); therefore, all known relations are deleted
  from the database upon any entry point to a hyperblock, whether a label or a branch
  target. However, the path across conditional branches (fallthrough) is analyzed according
  to the scope of the first instruction. In the following example, IAS finds no dependency
  violation on register r4, yet it reports a dependency violation on register r5 because the
  execution path can branch to L, in which case IAS is unsure of the new relation between
  p3 and p4:

  cmp.eq p1, p2 = r1, r2

  cmp.eq p3, p4 = r3, r0

  (p1) mov r4 = 2

  L:

  (p2) mov r4 = 5

  (p3) mov r5 = r7

  (p4) mov r5 = r8

If you know that the predicate relation should hold even under these conditions, inform the assembler using annotation.