On 23/06/15 01:09, Richard Biener wrote:
> On Sat, Jun 20, 2015 at 9:12 AM, Kugan
> <kugan.vivekanandara...@linaro.org> wrote:
>> As discussed in PR64130, this patch improves the VRP value ranges for
>> unsigned division.
>>
>> Bootstrapped and regression tested on x86_64-linux-gnu and regression
>> tested on arm-none-linux-gnu with no new regression.
>>
>> Is this OK for trunk?
> 
> Hum, the patch is at least incomplete not covering the
> cmp == -1 case in the max value computation, no?

Thanks for the review. Attached patch adds this as well.

> 
> Also I wonder if we have two VR_RANGEs as you require
> the code using extract_range_from_multiplicative_op_1 isn't
> better suited and already handles the case properly?
>

I tried with this approach. But, for value range of vr1 where min or max
is zero,  extract_range_from_multiplicative_op_1 will not be able to
infer range.

If we check for vr1 having zero before calling
extract_range_from_multiplicative_op_1, then it is not going get the
value range for the test case in PR (which is  2305843009213693951 / a
 where a has a range [0, 4294967295])


Thanks,
Kugan



> Richard.
> 
>> Thanks,
>> Kugan
>>
>> gcc/ChangeLog:
>>
>> 2015-06-20  Kugan Vivekanandarajah  <kug...@linaro.org>
>>
>>         PR middle-end/64130
>>         * tree-vrp.c (extract_range_from_binary_expr_1): For unsigned
>>         division, compute minimum when value ranges for dividend and
>>         divisor are available.
>>
>>
>> gcc/testsuite/ChangeLog:
>>
>> 2015-06-20  Kugan Vivekanandarajah  <kug...@linaro.org>
>>
>>         PR middle-end/64130
>>         * gcc.dg/tree-ssa/pr64130.c: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c
index e69de29..9e96abb 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c
@@ -0,0 +1,11 @@
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1" } */
+
+int funsigned(unsigned a)
+{
+  return 0x1ffffffffL / a == 0;
+}
+
+/* { dg-final { scan-tree-dump ": \\\[2, 8589934591\\\]" "vrp1" } } */
+
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index b517363..0b8fb31 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3151,14 +3151,33 @@ extract_range_from_binary_expr_1 (value_range_t *vr,
                 and all numbers from min to 0 for negative min.  */
              cmp = compare_values (vr0.max, zero);
              if (cmp == -1)
-               max = zero;
+               {
+                 /* When vr0.max < 0, vr1.min != 0 and value
+                    ranges for dividend and divisor are available.  */
+                 if (vr1.type == VR_RANGE
+                     && !symbolic_range_p (&vr0)
+                     && !symbolic_range_p (&vr1)
+                     && !compare_values (vr1.min, zero))
+                   max = int_const_binop (code, vr0.max, vr1.min);
+                 else
+                   max = zero;
+               }
              else if (cmp == 0 || cmp == 1)
                max = vr0.max;
              else
                type = VR_VARYING;
              cmp = compare_values (vr0.min, zero);
              if (cmp == 1)
-               min = zero;
+               {
+                 /* For unsigned division when value ranges for dividend
+                    and divisor are available.  */
+                 if (vr1.type == VR_RANGE
+                     && !symbolic_range_p (&vr0)
+                     && !symbolic_range_p (&vr1))
+                   min = int_const_binop (code, vr0.min, vr1.max);
+                 else
+                   min = zero;
+               }
              else if (cmp == 0 || cmp == -1)
                min = vr0.min;
              else

Reply via email to