aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-range.cc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2021-03-18 16:05:27 +0100
committerAldy Hernandez <aldyh@redhat.com>2021-03-23 02:57:41 -0400
commit88081d38bd82562b6e2d6a4a275e7f6f2aac3422 (patch)
treeaaa780bc5eedd443151939c953fff9d6047b2858 /gcc/value-range.cc
parent441e1980cea7265c340868468cd63ea8c046ddec (diff)
downloadgcc-88081d38bd82562b6e2d6a4a275e7f6f2aac3422.zip
gcc-88081d38bd82562b6e2d6a4a275e7f6f2aac3422.tar.gz
gcc-88081d38bd82562b6e2d6a4a275e7f6f2aac3422.tar.bz2
Handle setting of 1-bit anti-ranges uniformly.
PR tree-optimization/99296 * value-range.cc (irange::irange_set_1bit_anti_range): New. (irange::irange_set_anti_range): Call irange_set_1bit_anti_range * value-range.h (irange::irange_set_1bit_anti_range): New.
Diffstat (limited to 'gcc/value-range.cc')
-rw-r--r--gcc/value-range.cc31
1 files changed, 31 insertions, 0 deletions
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index 9c42f82..cd21f75 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -185,11 +185,42 @@ irange::irange_set (tree min, tree max)
}
void
+irange::irange_set_1bit_anti_range (tree min, tree max)
+{
+ tree type = TREE_TYPE (min);
+ gcc_checking_assert (TYPE_PRECISION (type) == 1);
+
+ if (operand_equal_p (min, max))
+ {
+ // Since these are 1-bit quantities, they can only be [MIN,MIN]
+ // or [MAX,MAX].
+ if (vrp_val_is_min (min))
+ min = max = vrp_val_max (type);
+ else
+ min = max = vrp_val_min (type);
+ set (min, max);
+ }
+ else
+ {
+ // The only alternative is [MIN,MAX], which is the empty range.
+ set_undefined ();
+ }
+ if (flag_checking)
+ verify_range ();
+}
+
+void
irange::irange_set_anti_range (tree min, tree max)
{
gcc_checking_assert (!POLY_INT_CST_P (min));
gcc_checking_assert (!POLY_INT_CST_P (max));
+ if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
+ {
+ irange_set_1bit_anti_range (min, max);
+ return;
+ }
+
// set an anti-range
tree type = TREE_TYPE (min);
signop sign = TYPE_SIGN (type);