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

Andrew Macleod <amacleod at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |amacleod at redhat dot com

--- Comment #7 from Andrew Macleod <amacleod at redhat dot com> ---
(In reply to Martin Sebor from comment #5)
> I can reproduce the warning.  It triggers for the store to *_23 in BB 13
> below (dumped by debug_ranger()), where _23 is the result of the alloca()
> call in BB 4 plus some offset.  In BB 4, ranger sees two ranges for the
> alloca argument _4: [0, 0][2, +INF] on the edge 4->16, and [1, 1] on 4->12. 
> 4->12 dead-ends in BB 14 with a call to fancy_abort(), so the edge that
> leads to BB 13 is 4->16.  But when we ask in BB 4 for _4's range we get
> VR_RANGE [1, 1].  That doesn't seem right.  Without any guidance as to which
> edge I'm interested in I'd expect to either get the union of the two ranges,
> [0, +INF].
> 

BB4 doesn't "see" 2 ranges for _4.   It calculates _4 as varying, since _1 is
varying.  You see at the bottom it shows what the value of _4 is on each
outgoing edge.. its [1,1] on edge 4->12 and [0,0][2, +INF] on edge 4->16.  so
if you ask for the range of _4 in any block dominated by one of those edges you
will see the appropriate range.  

Where are you getting VR_RANGE [1,1] from?    If you ask for
  range_of_expr (r, _4, alloca_stmt) 
You should be getting varying.  Thats all it knows at that point.  

Im not sure what you mean by "without any guidance as to  which edge"?  Either
you are asking for the range on an edge, or on a stmt.

If you ask for the range of _4 somewhere in BB13, you should be seeing unsigned
int [0, 0][2, +INF] since thats the value out 4->16 that eventually reaches
BB13.


> =========== BB 4 ============
> Imports: _1  
> Exports: _1  
> _1    unsigned int VARYING
> Equivalence set : [_1, _2]
> Relational : (_4 != _1)
>     <bb 4> [local count: 118111600]:
>     _4 = _1 + 1;
>     grp_name_37 = __builtin_alloca (_4);
>     p_38 = _32->identifier.id.str;
>     q_39 = _35->identifier.id.str;
>     if (_1 != 0)
>       goto <bb 16>; [89.00%]
>     else
>       goto <bb 12>; [11.00%]
> 
> grp_name_37 : char * [1B, +INF]
> 4->16  (T) _1 :       unsigned int [1, +INF]
> 4->16  (T) _4 :       unsigned int [0, 0][2, +INF]
> 4->12  (F) _1 :       unsigned int [0, 0]
> 4->12  (F) _4 :       unsigned int [1, 1]
> 
> =========== BB 13 ============
> Imports: diff_seen_24  
> Exports: diff_seen_24  
> diff_seen_24  bool VARYING
> idx_47        size_t [1, +INF]
> Relational : (_22 <= idx_47)
>     <bb 13> [local count: 105119324]:
>     _23 = grp_name_37 + idx_47;
>     *_23 = 0;
>     if (diff_seen_24 != 0)
>       goto <bb 15>; [100.00%]
>     else
>       goto <bb 14>; [0.00%]
> 
> _23 : char * [1B, +INF]
> 13->14  (F) diff_seen_24 :    bool [0, 0]
> 13->15  (T) diff_seen_24 :    bool [1, 1]

Reply via email to