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

Jeffrey A. Law <law at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Blocks|                            |19794
           Assignee|unassigned at gcc dot gnu.org      |law at redhat dot com

--- Comment #11 from Jeffrey A. Law <law at redhat dot com> ---
Ultimately this is a missed jump thread.  In vrp1 after insertion of
ASSERT_EXPRs we have:

;;   basic block 2, loop depth 0, count 0, freq 1005, maybe hot
;;    prev block 0, next block 11, flags: (NEW, REACHABLE, VISITED)
;;    pred:       ENTRY [100.0%]  (FALLTHRU,EXECUTABLE)
  if (flag_6(D) == 0)
    goto <bb 3>; [33.00%]
  else
    goto <bb 11>; [67.00%]
;;    succ:       3 [33.0%]  (TRUE_VALUE,EXECUTABLE)
;;                11 [67.0%]  (FALSE_VALUE,EXECUTABLE)

;;   basic block 11, loop depth 0, count 0, freq 673, maybe hot
;;    prev block 2, next block 3, flags: (NEW)
;;    pred:       2 [67.0%]  (FALSE_VALUE,EXECUTABLE)
  flag_14 = ASSERT_EXPR <flag_6(D), flag_6(D) != 0>;
  goto <bb 4>; [100.00%]
;;    succ:       4 [100.0%]  (FALLTHRU)

;;   basic block 3, loop depth 0, count 0, freq 332, maybe hot
;;    prev block 11, next block 4, flags: (NEW, REACHABLE, VISITED)
;;    pred:       2 [33.0%]  (TRUE_VALUE,EXECUTABLE)
  flag_13 = ASSERT_EXPR <flag_6(D), flag_6(D) == 0>;
  value_10 = get_value ();
;;    succ:       4 [100.0%]  (FALLTHRU,EXECUTABLE)

;;   basic block 4, loop depth 0, count 0, freq 1005, maybe hot
;;    prev block 3, next block 5, flags: (NEW, REACHABLE, VISITED)
;;    pred:       3 [100.0%]  (FALLTHRU,EXECUTABLE)
;;                11 [100.0%]  (FALLTHRU)
  # value_12 = PHI <value_10(3), value_7(D)(11)>
;;    succ:       5 [100.0%]  (FALLTHRU,EXECUTABLE)

;;   basic block 5, loop depth 1, count 0, freq 6700, maybe hot
;;    prev block 4, next block 8, flags: (NEW, REACHABLE, VISITED)
;;    pred:       4 [100.0%]  (FALLTHRU,EXECUTABLE)
;;                9 [100.0%]  (FALLTHRU,DFS_BACK,EXECUTABLE)
;;    succ:       8 [100.0%]  (FALLTHRU,EXECUTABLE)

;;   basic block 8, loop depth 2, count 0, freq 10000, maybe hot
;;    prev block 5, next block 10, flags: (NEW)
;;    pred:       5 [100.0%]  (FALLTHRU,EXECUTABLE)
;;                10 [100.0%]  (FALLTHRU,DFS_BACK,EXECUTABLE)
  _1 = flag_6(D) == 0;
  _2 = value_12 != 0;
  _3 = _1 & _2;
  if (_3 != 0)
    goto <bb 10>; [33.00%]
  else
    goto <bb 6>; [67.00%]

The key is to realize that the path 2->11->8 will always then transfer control
to 6 (because _3 will always have the value zero).  If we were to thread that
jump, then the uninitialized use of value_7 would disappear.

I've got some code that I think would pick this up, but I haven't installed it
because it was developed after stage1 close and does not fix any known
regressions.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=19794
[Bug 19794] [meta-bug] Jump threading related bugs

Reply via email to