[PATCH] add VRP for bitwise OR and AND: v3

Richard Guenther richard.guenther@gmail.com
Sat Aug 12 14:51:00 GMT 2006


On 8/12/06, Denis Vlasenko <vda.linux@googlemail.com> wrote:
> * tree-vrp.c (extract_range_from_binary_expr):
>   add value range propagation for bitwise AND/OR
>
> Patch is against gcc-4.2-20060805.
> Since unmodified gcc-4.2-20060805 snapshot does not bootstrap
> for me, I only verified that "make all-gcc" build
> of gcc-4.2-20060805 on i386-pc-linux-gnu
> with this patch succeeds.
>
> However, I successfully bootstrapped gcc-4.1.1 with this patch.

+/* Combines MIN and MAX as follows:
+   MIN =   01010010101001010010
+   MAX =   01010010100000010010
+   result: 01010010100000000000.  */
+
+static tree
+find_common_set_bits (tree min, tree max)

You should document these with an english sentence do clarify
what this function (and find_common_unset_bits) does.  Certainly
the function name doesn't match the workings if I apply my own
common sense.

+static int
+integer_nonnegative_range (value_range_t *vr)
+{
+  return (vr->type == VR_RANGE
+      && TREE_CODE (vr->min) == INTEGER_CST
+      && tree_expr_nonnegative_p (vr->min)
+      && TREE_CODE (vr->max) == INTEGER_CST);
+}

What about ~[TYPE_MIN_VALUE, n] with n >= -1?  I don't think
we do any canonicalization of ranges and anti-ranges.

You can combine the cases for BIT_AND_EXPR and BIT_IOR_EXPR
by using 'code' in place of BIT_AND_EXPR and BIT_IOR_EXPR
in the implementation.

Also the patch lacks testcases, both for correctness and testing
transformations (like why negative ranges are excluded, or
signed types for the BIT_IOR_EXPR transformations).

Richard.



More information about the Gcc-patches mailing list