[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