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