From 88081d38bd82562b6e2d6a4a275e7f6f2aac3422 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Thu, 18 Mar 2021 16:05:27 +0100 Subject: 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. --- gcc/value-range.cc | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'gcc/value-range.cc') 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); -- cgit v1.1