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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rsandifo at gcc dot gnu.org

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
So we're now doing a EXTRACT_LAST_REDUCTION with multiple stmt copies which
is disallowed for non-SLP (by accident?).  It shows it of course doesn't
work since we end up removing the scalar reduction stmt multiple times.

  <bb 3> [local count: 860067202]:
  # j_12 = PHI <j_2(8), j_5(D)(28)>
  # i_14 = PHI <i_9(8), i_6(D)(28)>
  # vect_vec_iv_.9_45 = PHI <_46(8), _47(28)>
  _46 = vect_vec_iv_.9_45 + { 16, 16, 16, 16 };
  _48 = vect_vec_iv_.9_45 + { 4, 4, 4, 4 };
  _49 = _48 + { 4, 4, 4, 4 };
  _50 = _49 + { 4, 4, 4, 4 };
  vect__1.10_51 = (vector(4) float) vect_vec_iv_.9_45;
  vect__1.10_52 = (vector(4) float) _48;
  vect__1.10_53 = (vector(4) float) _49;
  vect__1.10_54 = (vector(4) float) _50;
  mask__3.11_55 = vect__1.10_51 < { 0.0, 0.0, 0.0, 0.0 };
  mask__3.11_56 = vect__1.10_52 < { 0.0, 0.0, 0.0, 0.0 };
  mask__3.11_57 = vect__1.10_53 < { 0.0, 0.0, 0.0, 0.0 };
  mask__3.11_58 = vect__1.10_54 < { 0.0, 0.0, 0.0, 0.0 };
  j_2 = .FOLD_EXTRACT_LAST (j_12, mask__3.11_55, vect_vec_iv_.9_45);

and we removed the old

  j_2 = _3 ? i_14 : j_12;

we are about to insert

  j_2 = .FOLD_EXTRACT_LAST (j_12, mask__3.11_56, _48);

I think correct would be

  j_59 = .FOLD_EXTRACT_LAST (j_12, mask__3.11_55, vect_vec_iv_.9_45);
  j_60 = .FOLD_EXTRACT_LAST (j_59, mask__3.11_56, _48);
  j_61 = .FOLD_EXTRACT_LAST (j_60, mask__3.11_57, _49);
  j_2 = .FOLD_EXTRACT_LAST (j_61, mask__3.11_58, _50);

I'm testing a patch.

Reply via email to