[LLVMdev] A small pass to constant fold branch conditions in destination blocks

Nick Lewycky nicholas at mxc.ca
Tue Feb 8 00:54:22 PST 2011


Duncan Sands wrote:
> Here is a new and improved version that also does the following: if the
> condition for a conditional branch has the form "A && B" then A, B and the
> condition are all replaced with "true" in the true destination (similarly
> for || conditions in the false destination). Also, if the condition has
> the form "X == Y" then X is replaced by Y everywhere in the true
> destination
> (likewise if it is "X != Y" then X is replaced by Y everywhere in the false
> destination). Completely untested for correctness!

Not to discourage you, but you're reinventing predsimplify.

What PS did was find branches (or switches) where the target block was 
uniquely dominated by a single case, then assign %cond = true/false (or 
%switchval = const) and then walk up propagating that condition upwards 
(ie., if %cond = and i1 %a, %b then %a and %b are true, and if %a = icmp 
eq i32 %a, i32 0 then PS would immediately find all uses of %a dominated 
by that branch and replace them with 0 on the spot). After walking up, 
you would walk down again with what you learned; for example you may 
have done %A = add %X, %Y way early on and know in this lower branch 
that %Y is 0, now %A = %X. PS had a full comparison lattice (not-equals, 
signed-lessthan-unsigned-greaterthan) and also grew constant range 
analysis (x < y implies x != -1 and y != 0).

While I know PS removed tons of code from the .ll I was never really 
able to detect a runtime performance improvement; my guess is that while 
I was killing off lots of dead code it didn't impact the performance of 
the live code much or at all.

Nick

> Scheduling this pass after -correlated-propagation results for example in
> 5759 lines of bitcode being removed from 403.gcc.
>
> Ciao, Duncan.
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list