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

--- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> ---
Created attachment 41993
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41993&action=edit
Patch to reduce the problem

Can be reduced by given patch. The function is called for following loop:

  <bb 45>:
  # b_118 = PHI <b_424(28), b_75(56)>
  # count.30_122 = PHI <count.30_38(28), count.30_76(56)>
  c = 0.0;
  if (le.52_14 <= 0)
    goto <bb 37>;
  else
    goto <bb 29>;

  <bb 29>:
  _253 = le.52_14 + -1;
  if (le.52_14 < _253)
    goto <bb 37>;
  else
    goto <bb 30>;

  <bb 30>:
  _256 = le.52_14 * 2;
  if (_256 < -1)
    goto <bb 37>;
  else
    goto <bb 31>;

  <bb 31>:
  k2_262 = le.52_14 + 1;
  _269 = _253 + k2_262;
  j02_270 = _269 + 1;
  j04_275 = _269 + 2;
  M.0_403 = MIN_EXPR <_253, 0>;
  mo_278 = M.0_403 + 1;
  M.1_391 = MIN_EXPR <k2_262, 0>;
  if (k2_262 < 0)
    goto <bb 32>;
  else
    goto <bb 33>;

  <bb 32>:
  m_280 = 1 - M.1_391;

  <bb 33>:
  # m_281 = PHI <1(31), m_280(32)>
  if (mo_278 < m_281)
    goto <bb 37>;
  else
    goto <bb 34>;

  <bb 34>:
  _284 = fak[0];
  _285 = _284 - 2.99573230743408203125e+0;
  _286 = (integer(kind=8)) j02_270;
  _287 = _286 + -1;
  _288 = fak[_287];
  _289 = _285 + _288;
  _293 = _284 + _289;
  _294 = (integer(kind=8)) j04_275;
  _295 = _294 + -1;
  _296 = fak[_295];
  del_297 = _293 - _296;
  j6_299 = le.52_14 + 2;
  j7_301 = le.52_14 + 2;
  _308 = _284 + del_297;
  _313 = _284 + _308;
  _315 = (integer(kind=8)) le.52_14;
  _316 = _315 + -1;
  _317 = fak[_316];
  _318 = _313 + _317;
  _319 = (integer(kind=8)) j6_299;
  _320 = _319 + -1;
  _321 = fak[_320];
  _322 = _318 + _321;
  _323 = (integer(kind=8)) j7_301;
  _324 = _323 + -1;
  _325 = fak[_324];
  _326 = _322 + _325;
  _330 = _317 + _326;
  _331 = ((_330));
  sym_332 = _331 * 5.0e-1;

  <bb 35>:
  # k_333 = PHI <m_281(34), k_369(57)>
  j2_335 = k2_262 + k_333;
  _336 = -k_333;
  j3_337 = 2 - k_333;
  j4_339 = 2 - k_333;
  _340 = _253 - k_333;
  j5_341 = _340 + 2;
  _342 = (integer(kind=8)) k_333;
  _343 = _342 + -1;
  _344 = fak[_343];
  _345 = sym_332 - _344;
  _349 = _345 - _344;
  _350 = (integer(kind=8)) j2_335;
  _351 = _350 + -1;
  _352 = fak[_351];
  _353 = _349 - _352;
  _354 = (integer(kind=8)) j3_337;
  _355 = _354 + -1;
  _356 = fak[_355];
  _357 = _353 - _356;
  _358 = (integer(kind=8)) j4_339;
  _359 = _358 + -1;
  _360 = fak[_359];
  _361 = _357 - _360;
  _362 = (integer(kind=8)) j5_341;
  _363 = _362 + -1;
  _364 = fak[_363];
  _365 = _361 - _364;
  _366 = __builtin_expf (_365);
  _367 = c;
  _368 = _366 - _367;
  c = _368;
  k_369 = k_333 + 1;
  if (mo_278 == k_333)
    goto <bb 36>;
  else
    goto <bb 57>;

  <bb 57>:
  goto <bb 35>;

  <bb 36>:
  _370 = _253 + k_333;
  _371 = _370 + 1;
  _372 = _371 << 1;
  _373 = _372 & 2;
  _374 = 1 - _373;
  _375 = (real(kind=4)) _374;
  _377 = _368 * _375;
  c = _377;

  <bb 37>:
  c.58_18 = c;
  b_75 = c.58_18 + b_118;
  count.30_76 = count.30_122 + -1;
  if (count.30_76 <= 0)
    goto <bb 38>;
  else
    goto <bb 56>;

  <bb 56>:
  goto <bb 45>;

where we return true for 'c'. The function's comment:

 /* Returns true if REF is independent on all other memory references in
   LOOP.  */

which is probably wrong as there are various memory references that influence
value of the 'c'.
I have very small experience in loop optimizations, thus leaving to somebody
more skilled.

Reply via email to