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

--- Comment #6 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #4)
> There is a missed optimization at the gimple level for sure.
> 
> 
>   if (d_11 > 1)
>     goto <bb 5>; [59.00%]
>   else
>     goto <bb 4>; [41.00%]
> 
>   <bb 4> [local count: 391808389]:
> 
>   <bb 5> [local count: 955630225]:
>   # iftmp.1_6 = PHI <0(3), 2(4)>
>   c = iftmp.1_6;
> 
> The store to c is removed by the time we get to fixup_cfg3 but the phi is
> around still:
> 
> In .mergephi2:
>   d_11 = (short unsigned int) a.4_5;
>   if (d_11 > 1)
>     goto <bb 5>; [59.00%]
>   else
>     goto <bb 4>; [41.00%]
> 
>   <bb 4> [local count: 391808389]:
> 
>   <bb 5> [local count: 955630225]:
>   # iftmp.1_6 = PHI <0(3), 2(4)>
>   _10 = a.4_5 & 65535;
>   if (_10 == 0)
>     goto <bb 6>; [50.00%]
>   else
>     goto <bb 8>; [50.00%]
> 
> 
> Then thread1 decides to thread based on the if statement for some unknown
> reason ....
> even if the first if statement was dead as the phi is dead.  Maybe we need a
> quick DCE sometime right after forwprop2?
> 
> But maybe jump threading should NOT happen here.

The thread in the thread1 pass is 3->5->6->7.  It is an attempt to fold d_11 !=
0 at the end of BB6:

  <bb 3> [local count: 955630225]:
  d_11 = (short unsigned int) a.4_5;
  if (d_11 > 1)
    goto <bb 5>; [59.00%]
  else
    goto <bb 4>; [41.00%]

  <bb 4> [local count: 391808389]:

  <bb 5> [local count: 955630225]:
  # iftmp.1_6 = PHI <0(3), 2(4)>
  _10 = a.4_5 & 65535;
  if (_10 == 0)
    goto <bb 6>; [50.00%]
  else
    goto <bb 8>; [50.00%]

  <bb 6> [local count: 477815112]:
  if (d_11 != 0)
    goto <bb 7>; [33.00%]
  else
    goto <bb 8>; [67.00%]

  <bb 7> [local count: 157678986]:
  foo ();


The only way it can fold d_11 != 0, is by chasing back to the 3->5 edge.  The
PHI in BB5 is irrelevant, as the conditional in it is a check against _10 not
the iftmp.1_6 PHI result.  What is useful is the 3->5 edge.

I don't understand why you think this thread is incorrect.

Reply via email to