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

--- Comment #6 from Jeffrey A. Law <law at redhat dot com> ---
THe whole point of that change is to not require a dominating load if the
object comes from the stack.

We conditionally load from the same location, then have a PHI which selects
that loaded value or "1" and we store the result.  That's precisely what is
supposed to be happening.

The loop in question looks like:

;;   basic block 3, loop depth 1
;;    pred:       2
;;                6
  # ivtmp.13_9 = PHI <0(2), ivtmp.13_7(6)>
  _4 = MEM[base: in_21(D), index: ivtmp.13_9, step: 8, offset: 0B];
  if (_4 == 0B)
    goto <bb 13>; [5.50%]
  else
    goto <bb 4>; [94.50%]
;;    succ:       13
;;                4

;;   basic block 4, loop depth 1
;;    pred:       3
  if (ivtmp.13_9 != 2)
    goto <bb 6>; [28.10%]
  else
    goto <bb 5>; [71.90%]
;;    succ:       6
;;                5

;;   basic block 5, loop depth 1
;;    pred:       4
  cstore_32 = MEM[symbol: arr, index: ivtmp.13_9, step: 4, offset: 0B];
;;    succ:       6

;;   basic block 6, loop depth 1
;;    pred:       5
;;                4
  # cstore_31 = PHI <cstore_32(5), 1(4)>
  MEM[symbol: arr, index: ivtmp.13_9, step: 4, offset: 0B] = cstore_31;
  _40 = (unsigned int) ivtmp.13_9;
  _38 = _40 + 1;
  _37 = (int) _38;
  ivtmp.13_7 = ivtmp.13_9 + 1;
  sum_a_27 = (int) ivtmp.13_7;
  if (n_16(D) > sum_a_27)
    goto <bb 3>; [94.50%]
  else
    goto <bb 7>; [5.50%]
;;    succ:       3
;;                7

You can see the load from the same stock slot in bb5, the selecting PHI in bb6
and the store in bb6.

THe test in bb4 looks weird and is the source of the problem I believe.

Reply via email to