[llvm-commits] [PATCH] Restructure a part of SimplifyCFG

Chris Lattner clattner at apple.com
Fri May 16 08:08:30 PDT 2008


On May 16, 2008, at 7:14 AM, Matthijs Kooijman wrote:
> However, in my patch I've restructured the  
> CanPropagatePredecessorsForPHIs
> function to look a lot more similar to the code that actually  
> performs the
> merge. Both functions now look at the same phi nodes in about the  
> same order.
> Any conflicts (phi nodes with different values for the same source)  
> that could
> arise from merging or moving phi nodes are detected. If no conflicts  
> are
> found, the merge can happen.

Very nice, you're right that the old code is quite gross :)

> Apart from only restructuring the checks, two main changes in  
> functionality
> happened.
>
> Firstly, the old code rejected blocks with common predecessors in  
> most cases.
> The new code performs some extra checks so common predecessors can  
> be handled
> in a lot of cases. Wherever common predecessors still pose problems,  
> the
> blocks are left untouched.
>
> Secondly, the old code rejected the merge when values (phi nodes)  
> from BB were
> used in any other place than Succ. However, after giving this some  
> extensive
> thought, I cannot think of any situation that would require this  
> check. Even
> more, I think this can be proven.
>
> Consider that BB is a block containing of a single phi node "%a" and  
> a branch
> to Succ. Now, since the definition of %a will dominate all of its  
> uses, BB
> will dominate all blocks that use %a. Furthermore, since the branch  
> from BB to
> Succ is unconditional, Succ will also dominate all uses of %a.
>
> Now, assume that one predecessor of Succ is not dominated by BB (and  
> thus not
> dominated by Succ). Since at least one use of %a (but in reality all  
> of them)
> is reachable from Succ, you could end up at a use of %a without  
> passing
> through it's definition in BB (by coming from X through Succ). This  
> is a
> contradiction, meaning that our original assumption is wrong. Thus,  
> all
> predecessors of Succ must also be dominated by BB (and thus also by  
> Succ).
>
> This means that moving the phi node %a from BB to Succ does not pose  
> any
> problems when the two blocks are merged, and any use checks are not  
> needed.
>
> I'm also working on a few testcases to properly illustrate the  
> changes by this
> patch, I will send them in a seperate email later today.

The patch looks great to me, if it passes tests, please apply.

-Chris



More information about the llvm-commits mailing list