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

--- Comment #9 from Andrew Macleod <amacleod at redhat dot com> ---
(In reply to Andrew Macleod from comment #2)
> I think this is a duplicate of PR106379 .   At the VRP2 stage I see:
> 
>   <bb 2> [local count: 1073741824]:
>   if (c_6(D) == s_7(D))
>     goto <bb 3>; [34.00%]
>   else
>     goto <bb 5>; [66.00%]
> 
>   <bb 3> [local count: 365072224]:
>   _1 = ~c_6(D);
>   _2 = _1 & s_7(D);
>   if (_2 != 0)
>     goto <bb 4>; [75.00%]
>   else
>     goto <bb 5>; [25.00%]
> 
>   <bb 4> [local count: 628138969]:
>   DCEMarker0_ ();
> 
>   <bb 5> [local count: 1073741824]:
>   return;
> 
> Which is basically the identical sequence.. it just took longer to get to it
> :-)  We aren't removing this yet with ranger as I need to get to integrate
> rangers relation oracle with the simplifier so that it will see that  _2 =
> ~s_7 & s_7.

Indeed.  Even in EVRP at -O2 I see:

c_14(D) [irange] _Bool VARYING
s_15(D) [irange] _Bool VARYING
Equivalence set : [c_14(D), s_15(D)]
    <bb 3> :
    _4 = ~c_14(D);
    _5 = _4 & s_15(D);
    if (_5 != 0)
      goto <bb 6>; [INV]
    else
      goto <bb 4>; [INV]

so when evaluating _4 & s_15(D), we know c_14 and s_15 are in an equivalence
set, so a relation query from simplification would indicate VREL_EQUAL, and _5
could be recognized as  (~A & A) set to 0 and everything goes away.

Reply via email to