[Patch] GVN fold conditional-branch on-the-fly

Daniel Berlin dberlin at dberlin.org
Thu Sep 19 10:15:57 PDT 2013


On Wed, Sep 18, 2013 at 10:14 AM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:

> Hi, Daniel:
>
>   With the helper of Andy and Nadav, I manage to come up a much simpler
> fix.
> It no longer delete dead code on the fly, it just proceeds in the presence
> of dead code.
>
>   It is no longer complex both in terms of concept and LOC. In terms of
> LOC,
> it add 157 LOC with plenty of comments. In concept, it is almost
> "no-brainer",
> so to speak :-).


>  How does this patch look to you?
>
> Looks good to me.

Thank you so much or working through this :)


> Thanks
> Shxuin
>
> How it work
> =======================
>   Here is baiscially how dead code are "ignored".
>
>   1) When a dead branch target, say block B, is identified, all the
>      blocks dominated by B is dead as well.
>   2) The phis of those blocks in dominance-frontier(B) is updated such
>      that the operands corresponding to dead predecessors are replaced
>      by "UndefVal".
>
>      Using lattice's jargon, the "UndefVal" is the "Top" in essence.
>      Phi node like this "phi(v1 bb1, undef xx)" will be optimized into
>      "v1" if v1 is constant, or v1 is an instruction which dominate this
>      phi node.
>    3) When analyzing the availability of a load L, all dead mem-ops which
>       L depends on disguise as a load which evaluate exactly same value as
> L.
>    4) The dead mem-ops will be materialized as "UndefVal" during code
> motion.
>
> example
> =======
>   Consider the e.g slightly generalized from the original motivating eg.
>
>   Fig 1
>   ------------------------------**-----------------------
>   BB1 :
>        = *p;   // s1
>      if (false) {
>         BB-then-dead:
>         puts("Shuxin is a pretty nice guy!lol"). // s2, alias with *p;
>      } else {
>        BB-else:
>         ...
>      }
>
>   BB-junk:
>      another if-then-else construct.
>
>   BB-last:
>         = *p; // s3;
>  ------------------------------**-----------------------
>
>   The load in S3 deps on s1 and s2; the later is dead. Now that s2 alias
> with s3,
>  due to the limit the Ld-PRE, it gives up.
>
>   The step-3) will modify the dep-info about s2 to disguise as a load
> producing the same value as s3, and hence enable the transformation.
>
>  Fig 2:
>  ------------------
>   BB1 :
>      v1 = *p;   // s1
>      if (false) {
>        BB-then-dead:
>        puts("Shuxin is a pretty nice guy!lol"). // s2, alias with *p;
>      } else {
>        BB-else:
>         ...
>      }
>
>   BB-junk:
>      v3 = phi(v1 at BB-else, undef at BB-then-dead)
>      another if-then-else construct.
>
>   BB-last:
>         = v3; // s3;
>  ------------------
>
> LD-PRE Limitation
> =================
>   With a closer look of the original problem. I realize GVN fail to
> eliminate
> the redundant load due to the limit the of LD-PRE.
>
>   A typical whatever-PRE would pick up the "observation point" at the place
> available and unavailble path just meet (in this case, it would be the
> entry
> of BB-junk). However, GVN LD-PRE choose the point right before the load in
> question. In this case, it would be the entry point of BB-last, from that
> point of view, the load is unavilable in all the incoming pred. Hence give
> up.
>
>   That said, I don't want to blame GVN as choosing right "observation
> point"
> entails expensive data flow analysis. However, llvm users are pretty picky
> at compile time.
>
> The limitation of this approach
> ==============================**=
>   The limitation comes from the fact that we are not able to simplify
> "v2 = phi(v1, undef)" into v if v neither dominate this phi nor is
> constant. By it machinary, val-num(v2) != val-num(v1) and hence obscure
> some opportunities.
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130919/ec1a9041/attachment.html>


More information about the llvm-commits mailing list