[Bug tree-optimization/59303] [4.9 Regression] uninit-pred-8_b.c and uninit-pred-9_b.c fail after better optimizations
davidxl at google dot com
gcc-bugzilla@gcc.gnu.org
Sat Dec 21 19:58:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59303
--- Comment #11 from davidxl at google dot com ---
The false negative bug introduced in the patch is fixed. Will submit the patch
for review soon.
(In reply to davidxl from comment #10)
> My patch does this.
> 1) it first does aggressive simplification iteratively (more rules can be
> added later).
> 2) it then does normalization by building up larger predicate trees by
> following ud chain and bitwise or/and operations. It handles simple PHIs
> including also degenerated phis.
>
> The new dump reports:
>
> in foo,
>
> predicate for def:
>
> m_7(D) > 100
> (.OR.)
> n_5(D) <= 9
> (.OR.)
> l_12(D) != 0
> (.OR.)
> r_10(D) <= 19
>
> use1:
>
> m_7(D) > 100
> (.OR.)
> n_5(D) <= 9
> (.OR.)
> r_10(D) <= 9
>
> use2:
>
> m_7(D) > 100
> (.OR.)
> n_5(D) <= 9
> (.OR.)
> r_10(D) <= 19
>
>
> For foo2, the predicates are properly built, but the patch has a bug in
> predicate set inclusion testing leading to a false negative.
>
> David
>
> (In reply to Jakub Jelinek from comment #9)
> > Created attachment 31496 [details]
> > cleanups
> >
> > I had also a brief look at this recently, but haven't made progress beyond
> > attached formatting/cleanup patch so far (plus only dumping details with
> > *-details, otherwise the dumps are pretty much inconsistent).
> > My conclusion has also been that to fix this up the predicates would need to
> > be normalized before comparison, and simplified, at least if the initial
> > subset check fails. On uninit-pred-8_b.c there has been additional
> > complication because PRE decides to change the IL and we end up with:
> > <bb 3>:
> > pretmp_24 = r_10(D) <= 19;
> > goto <bb 5>;
> >
> > <bb 4>:
> > _11 = r_10(D) <= 19;
> > _13 = l_12(D) != 0;
> > _14 = _11 | _13;
> > if (_14 != 0)
> > goto <bb 14>;
> > else
> > goto <bb 15>;
> >
> > <bb 14>:
> > goto <bb 3>;
> >
> > <bb 15>:
> >
> > <bb 5>:
> > # v_1 = PHI <v_15(D)(15), r_10(D)(3)>
> > # prephitmp_30 = PHI <0(15), pretmp_24(3)>
> > if (m_7(D) != 0)
> > goto <bb 6>;
> > else
> > goto <bb 7>;
> >
> > <bb 6>:
> > g.0_17 = g;
> > g.1_18 = g.0_17 + 1;
> > g = g.1_18;
> > goto <bb 8>;
> >
> > <bb 7>:
> > bar ();
> >
> > <bb 8>:
> > _3 = prephitmp_30 | _9;
> > if (_3 != 0)
> > so the prephitmp_30 would need to be canonicalized into _14 != 0 && r_10(D)
> > <= 19 aka (r_10(D) <= 19 || l_12(D) != 0) && r_10(D) <= 19 and from there to
> > r_10(D) <= 19.
More information about the Gcc-bugs
mailing list