https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101466

--- Comment #12 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #11)
> With some hand-waving we could generate
> 
> void square(unsigned t, int *tt)
> {
>     if (t<=4)  __builtin_abort();
>     tt[0] = 0;
>     tt[1] = 0;
>     tt[2] = 0;
>     tt[3] = 0;
>     tt[4] = 0;
> }
> 
> but I don't see how it fits any existing transform?  The "hand-waving"
> would be that __builtin_abort () since it's a known function cannot
> observe the dropped side-effects like tt[0] = 0 when t > 0.

That is, we'd sink the stores across the abort ()s because they are
not uses of them, then we arrive at

    if (t<=0)  __builtin_abort();
    if (t<=1)  __builtin_abort();
    if (t<=2)  __builtin_abort();
    if (t<=3)  __builtin_abort();
    if (t<=4)  __builtin_abort();
    tt[0] = 0;
    tt[1] = 0;
    tt[2] = 0;
    tt[3] = 0;
    tt[4] = 0;

where we'd somehow "thread" to a single condition (PRE tail merging
merges the abort () blocks and reassoc way after it manages to merge
the controlling conditions).

Reply via email to