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

--- Comment #9 from Andrew Macleod <amacleod at redhat dot com> ---
Created attachment 51735
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51735&action=edit
patch for the undefined bit

(In reply to Richard Biener from comment #7)
> =========== BB 2 ============
> Imports: b.0_1  t_4(D)
> Exports: b.0_1  t_4(D)  _6
>          _6 : b.0_1(I)  t_4(D)(I)
> t_4(D)  UNDEFINED
>     <bb 2> [local count: 176285970]:
>     b.0_1 = b;
>     _6 = b.0_1 | t_4(D);
>     if (_6 != 0)
>       goto <bb 3>; [34.00%]
>     else
>       goto <bb 7>; [66.00%]
> 
> 2->3  (T) b.0_1 :       UNDEFINED
> 2->3  (T) t_4(D) :      UNDEFINED
> 2->3  (T) _6 :  int [-INF, -1][1, +INF]
> 
> I think 2->3 (T) b.0_1 : UNDEFINED is wrong.  if b.0_1 is 1 then 1 | UNDEF
> is still 1 and there's nothing "undefined" in evaluating if (1 | UNDEF !+ 0).

yeah looks like gori calculations just assumes an undefined argument makes
everything undefined..  we should probably just left the op1/op2_range routines
handle it.
We can't actually know b.0_1 if the branch is taken because of the undefined,
so it'll get calculated as varying. With the untested patch, we now get

2->3  (T) t_4(D) :      UNDEFINED
2->3  (T) _6 :  int [-INF, -1][1, +INF]
2->7  (F) b.0_1 :       int [0, 0]
2->7  (F) t_4(D) :      UNDEFINED
2->7  (F) _6 :  int [0, 0] 

we do know that b.0_1 is 0 on the false side...

Reply via email to