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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|jakub at gcc dot gnu.org           |unassigned at gcc dot 
gnu.org
             Status|ASSIGNED                    |NEW

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
This looks like an ivopts bug and I'm unfortunately not familiar enough with
that pass.
Before ivopts we have:
  <bb 3> [local count: 8687547547]:
  # i_2 = PHI <i_10(5), 0(2)>
  # ivtmp_19 = PHI <ivtmp_11(5), 5(2)>
  saved_stack.2_4 = __builtin_stack_save ();
  foo ();
  _6 = (sizetype) i_2;
  _7 = _6 * 4;
  y.1_8 = __builtin_alloca_with_align (_7, 32);
  MEM <int[1][0:D.2027]> [(int[1][0:D.1996] *)y.1_8][5]{lb: 0 sz: _6 * 4}[i_2]
= 0;
  __builtin_stack_restore (saved_stack.2_4);
  i_10 = i_2 + 1;
  ivtmp_11 = ivtmp_19 - 1;
  if (ivtmp_11 != 0)
    goto <bb 5>; [89.00%]
  else
    goto <bb 4>; [11.00%]

  <bb 5> [local count: 7731917322]:
  goto <bb 3>; [100.00%]
loop and ivopts decides to create a new unsigned long ivtmp.9 IV going from
0 with step 1.  But it doesn't properly adjust the ARRAY_REF with sz:, so it
keeps referencing a freed SSA_NAME _6:
  <bb 3> [local count: 8687547547]:
  # ivtmp.9_5 = PHI <ivtmp.9_9(5), 0(2)>
  _20 = (unsigned int) ivtmp.9_5;
  i_2 = (int) _20;
  saved_stack.2_4 = __builtin_stack_save ();
  foo ();
  _3 = ivtmp.9_5 * 4;
  _7 = _3;
  y.1_8 = __builtin_alloca_with_align (_7, 32);
  MEM <int[1][0:D.2027]> [(int[1][0:D.1996] *)y.1_8][5]{lb: 0 sz: <<< error
>>>}[i_2] = 0;
  __builtin_stack_restore (saved_stack.2_4);
  ivtmp.9_9 = ivtmp.9_5 + 1;
  if (ivtmp.9_9 != 5)
    goto <bb 5>; [89.00%]
  else
    goto <bb 4>; [11.00%]

  <bb 5> [local count: 7731917322]:
  goto <bb 3>; [100.00%]
I believe it should use ivtmp.9_5 (printed as ivtmp.9_5 * 4).

Reply via email to