[Bug tree-optimization/91178] [9/10 Regression] Infinite recursion in split_constant_offset in slp after r260289
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Jul 16 09:17:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91178
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
The main issue is that loop vectorization creates a chain of increments
# vectp_f.21_116 = PHI <vectp_f.21_117(7), vectp_f.22_115(9)>
vect__16.23_118 = MEM <vector(4) int> [(int *)vectp_f.21_116];
vectp_f.21_119 = vectp_f.21_116 + 16;
vectp_f.21_121 = vectp_f.21_119 + 16;
vectp_f.21_123 = vectp_f.21_121 + 16;
vectp_f.21_125 = vectp_f.21_123 + 16;
...
vectp_f.21_182363 = vectp_f.21_182361 + 16;
vectp_f.21_182365 = vectp_f.21_182363 + 16;
vectp_f.21_182367 = vectp_f.21_182365 + 16;
vect__16.91149_182369 = VEC_PERM_EXPR <vect__16.23_118, vect__16.23_118, { 0,
0, 0, 0 }>;
vect__16.91150_182370 = VEC_PERM_EXPR <vect__16.23_118, vect__16.23_118, { 0,
0, 0, 0 }>;
vect__16.91151_182371 = VEC_PERM_EXPR <vect__16.23_118, vect__16.22804_45680,
{ 0, 6, 6, 6 }>;
vect__16.91152_182372 = VEC_PERM_EXPR <vect__16.22804_45680,
vect__16.22804_45680, { 2, 2, 2, 2 }>;
vect__16.91153_182373 = VEC_PERM_EXPR <vect__16.22804_45680,
vect__16.45586_91244, { 2, 2, 4, 4 }>;
vect__16.91154_182374 = VEC_PERM_EXPR <vect__16.45586_91244,
vect__16.45586_91244, { 0, 0, 0, 0 }>;
vect__16.91155_182375 = VEC_PERM_EXPR <vect__16.45586_91244,
vect__16.68367_136806, { 0, 0, 0, 6 }>;
vect__16.91156_182376 = VEC_PERM_EXPR <vect__16.68367_136806,
vect__16.68367_136806, { 2, 2, 2, 2 }>;
vect__16.91157_182377 = VEC_PERM_EXPR <vect__16.68367_136806,
vect__16.68367_136806, { 2, 2, 2, 2 }>;
vect__73.91158_182378 = vect__73.20_106 - vect__16.91149_182369;
vect__73.91158_182379 = vect__73.20_107 - vect__16.91150_182370;
vect__73.91158_182380 = vect__73.20_108 - vect__16.91151_182371;
vect__73.91158_182381 = vect__73.20_109 - vect__16.91152_182372;
vect__73.91158_182382 = vect__73.20_110 - vect__16.91153_182373;
vect__73.91158_182383 = vect__73.20_111 - vect__16.91154_182374;
vect__73.91158_182384 = vect__73.20_112 - vect__16.91155_182375;
vect__73.91158_182385 = vect__73.20_113 - vect__16.91156_182376;
vect__73.91158_182386 = vect__73.20_114 - vect__16.91157_182377;
vectp_f.21_117 = vectp_f.21_182367 + 16;
ivtmp_182463 = ivtmp_182462 + 1;
if (ivtmp_182463 < bnd.17_102)
goto <bb 7>; [0.00%]
else
goto <bb 11>; [100.00%]
where it first generates one load for each of the increments and then
the permutation makes most of them dead. For interleaving we have some
cut-off to avoid this kind of code-gen but for SLP we don't.
DR group size is 91126 here and gap 91125 (aka single element interleaving).
More information about the Gcc-bugs
mailing list