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

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Seems during cunroll we end up with:
y_8 = PHI <y_29(20), y_29(13)>
...
y_29 = PHI <y_37(5)>
...
y_37 = PHI <y_8(11), y_37(14)>

where all 3 PHIs are degenerate and thus:
1539    static tree
1540    follow_copies_to_constant (tree var)
1541    {
1542      tree res = var;
1543      while (TREE_CODE (res) == SSA_NAME)
1544        {
1545          gimple *def = SSA_NAME_DEF_STMT (res);
1546          if (gphi *phi = dyn_cast <gphi *> (def))
1547            {
1548              if (tree rhs = degenerate_phi_result (phi))
1549                res = rhs;
1550              else
1551                break;
1552            }
1553          else if (gimple_assign_single_p (def))
1554            /* Will exit loop if not an SSA_NAME.  */
1555            res = gimple_assign_rhs1 (def);
1556          else
1557            break;
1558        }

loops on that forever, with res being ... y_37, y_8, y_29, y_37, ...
emergency_dump_function at the point of looping:

foo (int x, int y, int z)
{
  int c;
  int * b;
  int a;
  unsigned int ivtmp_1;
  unsigned int ivtmp_2;
  int _4;
  unsigned int ivtmp_6;
  unsigned int ivtmp_13;
  unsigned int ivtmp_14;
  unsigned int ivtmp_16;
  unsigned int ivtmp_24;
  unsigned int ivtmp_27;

;;   basic block 2, loop depth 0
;;    pred:       ENTRY
;;    succ:       15

;;   basic block 15, loop depth 0
;;    pred:       2
  # y_25 = PHI <y_20(D)(2)>
  # a_3 = PHI <0(2)>
  # ivtmp_16 = PHI <2(2)>
  ivtmp_14 = ivtmp_27 - 1;
  if (ivtmp_24 != 0)
    goto <bb 16>; [100.00%]
  else
    goto <bb 7>; [0.00%]
;;    succ:       16
;;                7

;;   basic block 16, loop depth 0
;;    pred:       15
;;    succ:       17

;;   basic block 17, loop depth 1
;;    pred:       16
;;                19
  # y_10 = PHI <y_8(16), y_37(19)>
  # a_17 = PHI <0(16), a_28(19)>
  # ivtmp_13 = PHI <36(16), ivtmp_2(19)>
  if (y_8 <= 0)
    goto <bb 10>; [89.00%]
  else
    goto <bb 18>; [11.00%]
;;    succ:       10
;;                18

;;   basic block 18, loop depth 1
;;    pred:       17
  a_9 = a_38 + 1;
  ivtmp_6 = ivtmp_1 - 1;
  if (ivtmp_2 != 0)
    goto <bb 19>; [97.23%]
  else
    goto <bb 20>; [2.77%]
;;    succ:       19
;;                20

;;   basic block 19, loop depth 1
;;    pred:       18
  goto <bb 17>; [100.00%]
;;    succ:       17

;;   basic block 20, loop depth 0
;;    pred:       18
  # y_5 = PHI <y_37(18)>
  goto <bb 6>; [100.00%]
;;    succ:       6

;;   basic block 11, loop depth 1
;;    pred:       6
;;    succ:       3

;;   basic block 3, loop depth 2
;;    pred:       11
;;                14
  # y_37 = PHI <y_8(11), y_37(14)>
  # a_38 = PHI <0(11), a_28(14)>
  # ivtmp_1 = PHI <36(11), ivtmp_2(14)>
  if (y_8 <= 0)
    goto <bb 10>; [89.00%]
  else
    goto <bb 5>; [11.00%]
;;    succ:       10
;;                5

;;   basic block 10, loop depth 0
;;    pred:       3
;;                17
;;    succ:       4

;;   basic block 4, loop depth 1
;;    pred:       10
;;                12
;;    succ:       12

;;   basic block 12, loop depth 1
;;    pred:       4
  goto <bb 4>; [100.00%]
;;    succ:       4

;;   basic block 5, loop depth 2
;;    pred:       3
  a_28 = a_38 + 1;
  ivtmp_2 = ivtmp_1 - 1;
  if (ivtmp_2 != 0)
    goto <bb 14>; [97.23%]
  else
    goto <bb 13>; [2.77%]
;;    succ:       14
;;                13

;;   basic block 14, loop depth 2
;;    pred:       5
  goto <bb 3>; [100.00%]
;;    succ:       3

;;   basic block 13, loop depth 1
;;    pred:       5
  # y_29 = PHI <y_37(5)>
;;    succ:       6

;;   basic block 6, loop depth 1
;;    pred:       20
;;                13
  # y_8 = PHI <y_29(20), y_29(13)>
  # a_12 = PHI <36(20), 36(13)>
  # ivtmp_27 = PHI <ivtmp_24(20), ivtmp_24(13)>
  ivtmp_24 = ivtmp_27 - 1;
  if (0 != 0)
    goto <bb 11>; [0.00%]
  else
    goto <bb 7>; [100.00%]
;;    succ:       11
;;                7

;;   basic block 7, loop depth 0
;;    pred:       6
;;                15
  if (z_21(D) <= 32)
    goto <bb 8>; [94.50%]
  else
    goto <bb 9>; [5.50%]
;;    succ:       8
;;                9

;;   basic block 8, loop depth 0
;;    pred:       7
  _4 ={v} MEM[(int *)0B];
  __builtin_trap ();
;;    succ:      

;;   basic block 9, loop depth 0
;;    pred:       7
  return;
;;    succ:       EXIT

}

Reply via email to