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

            Bug ID: 69882
           Summary: [6 regression] Excessive reduction statements
                    generated by SLP
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kyukhin at gcc dot gnu.org
  Target Milestone: ---

Created attachment 37743
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=37743&action=edit
Reproducer

Hello,
Attached test case emits wrong reduction statements.

Compile:
$ trunk/64/20160220/bin/gfortran -o repro -static -m64 -Ofast -mavx repro.f90

Execution ABORTs

Works fine when compiled w/ -O0

Extract from vectorizer dump:
  <bb 49>:
  # k_239 = PHI <k.4_11(48), k_266(56)>
  # c_I_lsm.10_241 = PHI <c_I_lsm.10_48(48), M.0_249(56)>
  # c_I_lsm.11_242 = PHI <c_I_lsm.11_3(48), M.0_252(56)>
  # vectp_a.47_406 = PHI <vectp_a.48_402(48), vectp_a.47_407(56)>
  # vect_M.50_410 = PHI <vect_cst__412(48), vect_M.50_411(56)>
  # ivtmp_420 = PHI <0(48), ivtmp_421(56)>
  _245 = (integer(kind=8)) k_239;
  _246 = _245 * 4;
  _247 = _246 + -4;
  _248 = *a_22(D)[_247];
  M.0_249 = MAX_EXPR <_248, c_I_lsm.10_241>;
  _250 = _246 + -3;
  vect__248.49_408 = MEM[(real(kind=8) *)vectp_a.47_406]; <-- SLP
  vectp_a.47_409 = vectp_a.47_406 + 32;
  _251 = *a_22(D)[_250];
  vect_M.50_411 = MAX_EXPR <vect__248.49_408, vect_M.50_410>; <-- SLP
  M.0_252 = MAX_EXPR <_251, c_I_lsm.11_242>;
  k_266 = k_239 + 1;
  vectp_a.47_407 = vectp_a.47_409 + 32; < -- SLP
  ivtmp_421 = ivtmp_420 + 1;
  if (ivtmp_421 >= bnd.44_361)
    goto <bb 52>;
  else
    goto <bb 56>;

  <bb 50>:
  ... # REMAINDER
  k_377 = k_365 + 1;
  if (k_365 == 26)
    goto <bb 54>;
  else
    goto <bb 51>;

  <bb 51>:
  goto <bb 50>;

  <bb 52>:
  # k_381 = PHI <k_266(49)>
  # c_I_lsm.10_384 = PHI <M.0_249(49)>
  # c_I_lsm.11_386 = PHI <M.0_252(49)>
  # c_I_lsm.13_389 = PHI <c_I_lsm.13_84(49)>
  # c_I_lsm.12_392 = PHI <c_I_lsm.12_13(49)>
  # vect_M.50_413 = PHI <vect_M.50_411(49)>
  stmp_M.51_414 = BIT_FIELD_REF <vect_M.50_413, 64, 0>;
  stmp_M.51_415 = BIT_FIELD_REF <vect_M.50_413, 64, 64>;
  stmp_M.51_416 = BIT_FIELD_REF <vect_M.50_413, 64, 128>;
  stmp_M.51_417 = BIT_FIELD_REF <vect_M.50_413, 64, 192>;
  stmp_M.51_418 = MAX_EXPR <stmp_M.51_414, stmp_M.51_416>;  # <-- WHOAAAAT??
  stmp_M.51_419 = MAX_EXPR <stmp_M.51_415, stmp_M.51_417>;  # <-- DITTO.
  _401 = (integer(kind=4)) ratio_mult_vf.45_364;
  tmp.46_400 = k.4_11 + _401;
  if (niters.42_358 == ratio_mult_vf.45_364)
    goto <bb 55>;
  else
    goto <bb 53>;

Those 2 SSA names are then stored to 1st and 2nd array elements

Reply via email to