[PATCH] D75233: [LoopTerminology] LCSSA Form

Michael Kruse via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Mar 28 18:16:18 PDT 2020


Meinersbur added a comment.

In D75233#1944176 <https://reviews.llvm.org/D75233#1944176>, @baziotis wrote:

> Yes. Could you explain the part about dominator nodes ? I understand how dominators help in the identification
>  of loops and how dominance frontiers help in the placement of normal PHI nodes (i.e. when 2 or more paths converge). But I don't see how dominators
>  help with the placement of LCSSA phi nodes.


It is simple if the loop has just a single exit, but much more involved with multiple exits. Example CFG:

  Header:
    %val = ...
  
  Header->{Latch1,Latch2,Latch3}->Header
  
  Header->Latch1->Exit1
  Header->Latch2->Exit2
  Header->Latch3->Exit3
  
  Exit->Successor1
  
  Successor1->SharedSucc
  Exit2->SharedSucc
  
  SharedSucc->CommonSucc
  Exit3->CommonSucc
  
  CommonSucc:
    use(%val)

Header dominates all other BBs in this example, hence without LCSSA, this is well-formed. However, with LCSSA we have to insert phis into Exit1,Exit2,Exit3 such that the end result has to look like:

  Exit1:
    %lcssa1 = phi [%val, %Latch1]
  
  Exit2:
    %lcssa2 = phi [%val, %Latch2]
  
  Exit3:
    %lcssa3 = phi [%val, %Latch3]
  
  SharedSucc:
    %sharedval = phi [%lcssa1 , %Exit1], [%lcssa2, %Exit2]
  
  CommonSucc:
    %commonval = phi [%lcssa3 , %Exit3], [%sharedval , %SharedSucc]
    use(%commonval)

For computing %sharedval and %commonval, DominanceFrontier is needed again, hence LCSSA is not less complicated that SSA itself.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D75233/new/

https://reviews.llvm.org/D75233





More information about the llvm-commits mailing list