https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68576
bin.cheng <amker.cheng at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amker.cheng at gmail dot com --- Comment #4 from bin.cheng <amker.cheng at gmail dot com> --- Before parloops, the related dump code is as below: _469 = (unsigned long) stride.90_24; _468 = (unsigned long) _368; _467 = _469 * _468; //... _466 = _470 + _467; _370 = (integer(kind=8)) _466; //... _373 = _370 + _372; //... # i1_1 = PHI <1(16), i1_159(24)> _75 = (integer(kind=8)) i1_1; _76 = _75 + _373; *g3_77(D)[_76] = 0.0; When analyzing scev for _370, GCC needs to handle type conversion as: (integer(kind=8)){(unsigned long) stride.90_24 + _470, (unsigned long) stride.90_24} Currently GCC don't know if below scev overflows or not: {(integer(kind=8))(unsigned long) stride.90_24 + _470, (integer(kind=8))(unsigned long) stride.90_24} This no-overflow information may be provided by source code declaration: real*8 g1(f4,f3,f2,f1),g2(f4,f4,f3,f2,f1),g3(f4,f3,f2,f1) Because the stride comes from memory layout of array "g3". But I don't see how to compute this information and use it in SCEV. This leads to another problem: we may be able to avoid this type conversion here integer(kind=8) --> unsigned long --> integer(kind=8). They are first introduced by lim2, I will investigate why.