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

--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Mircea Namolaru from comment #7)
> Graphite generates MAX/MIN expressions.
> 
> I've modified Graphite to use the original types of "n" and "mid" in MIN and
> MAX, and to not generate the casts of "n" and "mid" to a longer signed INT
> before MIN/MAX, and the vectorization succeeded.
> 
> It seems that it is not a Graphite problem but a scalar evolution one.
> Scalar evolution is not able to handle MIN/MAX expressions in the presence
> of casts. Beside vectorization also further unrolling is prevented.

Can you share a patch with that modification?  I'd like to look at the
differences it makes with respect to SCEV / niter analysis.  Note that
neither SCEV nor niter analysis handle MIN/MAX_EXPRs explicitely.  It might
be that

  <bb 2>:
  if (n_5(D) > 0)
    goto <bb 4>;
...
  <bb 4>:
  _28 = (signed long) n_5(D);
  _29 = (signed long) mid_6(D);
  _30 = MIN_EXPR <_28, _29>;
  _31 = _30 > 0;
  if (_31 != 0)

can be simplified to mid_6(D) > 0 by expansion/folding in some way though
if there are no casts in the way.  Not sure.  I suppose ISL doesn't get to
know that n > 0 if the loop enters (and doesn't exploit that knowledge)?

Reply via email to