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

--- Comment #7 from amker at gcc dot gnu.org ---
(In reply to rguent...@suse.de from comment #6)
> On Mon, 5 Mar 2018, amker at gcc dot gnu.org wrote:
> 
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84650
> > 
> > --- Comment #5 from amker at gcc dot gnu.org ---
> > (In reply to rguent...@suse.de from comment #4)
> > > On Sat, 3 Mar 2018, amker at gcc dot gnu.org wrote:
> > > 
> > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84650
> > > > 
> > > > --- Comment #3 from amker at gcc dot gnu.org ---
> > > > So given below dump before sccp:
> > > > 
> > > >   <bb 2> [local count: 14598063]:
> > > > 
> > > >   <bb 3> [local count: 118111601]:
> > > >   # eu_19 = PHI <0(2), eu_13(7)>
> > > > 
> > > >   <bb 4> [local count: 955630224]:
> > > >   # dj.1_18 = PHI <0(3), _1(8)>
> > > >   _1 = dj.1_18 + 1;
> > > >   if (_1 <= 1)
> > > >     goto <bb 8>; [89.00%]
> > > >   else
> > > >     goto <bb 5>; [11.00%]
> > > > 
> > > >   <bb 8> [local count: 850510900]:
> > > >   goto <bb 4>; [100.00%]
> > > > 
> > > >   <bb 5> [local count: 118111601]:
> > > >   # _2 = PHI <_1(4)>
> > > >   _4 = _2 != 3;
> > > >   _5 = (unsigned int) _4;
> > > >   _15 = 1 - _5;
> > > >   eu_13 = _15 + eu_19;
> > > >   if (eu_13 <= 1)
> > > >     goto <bb 7>; [87.64%]
> > > >   else
> > > >     goto <bb 6>; [12.36%]
> > > > 
> > > >   <bb 7> [local count: 103513538]:
> > > >   goto <bb 3>; [100.00%]
> > > > 
> > > >   <bb 6> [local count: 14598063]:
> > > >   # _25 = PHI <_2(5)>
> > > >   dj = _25;
> > > >   return;
> > > > 
> > > > before sccp, e_13, _15 and e_19 was identified as:
> > > > e_13: {_15, _15}
> > > > _15 : _15
> > > > e_19: {0, _15}
> > > > 
> > > > During sccp, it proves _15 equals to 0 and thus:
> > > > e_13: 0
> > > > _15 : 0
> > > > e_19: {0, _15}
> > > > 
> > > > This information is cached and used in ivopts.
> > > 
> > > I see scev_reset () being called multiple times between
> > > sccp and ivopts so I doubt that.  The SCEV cache isn't
> > > reset between GRAPHITE and IVOPTs though and LIM after
> > > GRAPHITE moves some expressions.
> > Hmm, in this case the problem is in scev, which doesn't fold {0, _15} given 
> > _15
> > is known to be zero?
> 
> SCEV doesn't really do any folding but yeah, I'm not sure why _15
> isn't picked up as 0 here.  That would be worth investigating.
Ah, I kind of remember that in follow_ssa_edge_binary, it tries each operand of
add operation (a_13 = _15 + e_19;).  Here the case might be it finds out
impossible to follow _15 to halting phi, the function then tries e_19 instead
and keep _15 in its own form, thus {0, _15}.

> 
> Note that we don't really expect unfolded/unpropagated constants
> so it doesn't surprise me we see this kind of effects.

Reply via email to