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

--- Comment #6 from Andrew Macleod <amacleod at redhat dot com> ---
(In reply to Richard Biener from comment #5)
> I tried get_range_query (cfun)->range_of_expr (vr, niter->niter, stmt) with
> (unsigned int) M_9(D) - (unsigned int) k_24 and an enabled ranger
> but that indeed returns [irange] unsigned int [0, 1024][4294966273, +INF]
> and not a singleton as expected.
> It seems to look for ranges of M_9 and k_24 and fold_range with the
> minus op rather than trying to use relations to simplify the subtraction.
> The ranges of the first and 2nd op are [1, 1025] and [1, 1024] respectively,
> basically [1, INF] for our purpose (the constant array bound bounds them).
> 
> We'd also miss a way to inject niter->assumptions and niter->may_be_zero
> as conditions known true for the purpose of simplifying (in this case
> those don't add anything).

It will always use ranges, and utilize any known relation in addition to that.
range-op.cc :  minus_op1_op2_relation_effect () is used for that purpose, but
if can only adjust something to a known subrange, ie  if m_9 > k_24, then it
will limit whatever the calculated range is to  [1, +INF], so we can trim out
any negatives.

What singleton are you expecting?  (and where?)    I hacked a VRP pass right
after loop interchange and after the loop I see:

=========== BB 16 ============
M_9(D)  [irange] int [2, 1024]
Relational : (k_12 >= M_9(D))
    <bb 16> [local count: 67276368]:
    goto <bb 15>; [100.00%]

but IM not sure how we use relations to come up with a singleton constant?
The loop backedge has:

=========== BB 8 ============
k_12    [irange] int [2, 1024]
Relational : (M_9(D) > k_15)
Relational : (k_12 < M_9(D))
    <bb 8> [local count: 544326978]:
    goto <bb 3>; [100.00%]

so we always know also M_9 > either k, 'mm just not sure how that helps  OR are
we talking about the second loop?  Im having difficulty seeing where I might
find a singleton?

Reply via email to