aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-range.h
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-07-31 13:43:36 +0200
committerAldy Hernandez <aldyh@redhat.com>2022-08-01 08:16:03 +0200
commit3f05605364f6f17b84842a8a5960d465b4448bae (patch)
treef74fe9fd71c1f3bf256bd602b38066909f26ba26 /gcc/value-range.h
parent7e029e067d81f714419cd196fdd506b06881e0c9 (diff)
downloadgcc-3f05605364f6f17b84842a8a5960d465b4448bae.zip
gcc-3f05605364f6f17b84842a8a5960d465b4448bae.tar.gz
gcc-3f05605364f6f17b84842a8a5960d465b4448bae.tar.bz2
Cleanups to frange.
These are some assorted cleanups to the frange class to make it easier to drop in an implementation with FP endpoints: * frange::set() had some asserts limiting the type of arguments passed. There's no reason why we can't handle all the variants. Worse comes to worse, we can always return a VARYING which is conservative and correct. * frange::normalize_kind() now returns a boolean that can be used in union and intersection to indicate that the range changed. * Implement vrp_val_max and vrp_val_min for floats. Also, move them earlier in the header file so frange can use them. Tested on x86-64 Linux. gcc/ChangeLog: * value-range.cc (tree_compare): New. (frange::set): Make more general. (frange::normalize_kind): Cleanup and return bool. (frange::union_): Use normalize_kind return value. (frange::intersect): Same. (frange::verify_range): Remove unnecessary else. * value-range.h (vrp_val_max): Move before frange class. (vrp_val_min): Same. (frange::frange): Remove set to m_type.
Diffstat (limited to 'gcc/value-range.h')
-rw-r--r--gcc/value-range.h70
1 files changed, 40 insertions, 30 deletions
diff --git a/gcc/value-range.h b/gcc/value-range.h
index c6ab955..390fcb8 100644
--- a/gcc/value-range.h
+++ b/gcc/value-range.h
@@ -359,7 +359,7 @@ public:
FRANGE_PROP_ACCESSOR(ninf)
private:
void verify_range ();
- void normalize_kind ();
+ bool normalize_kind ();
frange_props m_props;
tree m_type;
@@ -1010,6 +1010,45 @@ irange::normalize_kind ()
}
}
+// Return the maximum value for TYPE.
+
+inline tree
+vrp_val_max (const_tree type)
+{
+ if (INTEGRAL_TYPE_P (type))
+ return TYPE_MAX_VALUE (type);
+ if (POINTER_TYPE_P (type))
+ {
+ wide_int max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
+ return wide_int_to_tree (const_cast<tree> (type), max);
+ }
+ if (frange::supports_p (type))
+ {
+ REAL_VALUE_TYPE real;
+ real_inf (&real);
+ return build_real (const_cast <tree> (type), real);
+ }
+ return NULL_TREE;
+}
+
+// Return the minimum value for TYPE.
+
+inline tree
+vrp_val_min (const_tree type)
+{
+ if (INTEGRAL_TYPE_P (type))
+ return TYPE_MIN_VALUE (type);
+ if (POINTER_TYPE_P (type))
+ return build_zero_cst (const_cast<tree> (type));
+ if (frange::supports_p (type))
+ {
+ REAL_VALUE_TYPE real, real_ninf;
+ real_inf (&real);
+ real_ninf = real_value_negate (&real);
+ return build_real (const_cast <tree> (type), real_ninf);
+ }
+ return NULL_TREE;
+}
// Supporting methods for frange.
@@ -1039,7 +1078,6 @@ inline
frange::frange ()
{
m_discriminator = VR_FRANGE;
- m_type = nullptr;
set_undefined ();
}
@@ -1072,32 +1110,4 @@ frange::set_undefined ()
m_props.set_undefined ();
}
-
-// Return the maximum value for TYPE.
-
-inline tree
-vrp_val_max (const_tree type)
-{
- if (INTEGRAL_TYPE_P (type))
- return TYPE_MAX_VALUE (type);
- if (POINTER_TYPE_P (type))
- {
- wide_int max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
- return wide_int_to_tree (const_cast<tree> (type), max);
- }
- return NULL_TREE;
-}
-
-// Return the minimum value for TYPE.
-
-inline tree
-vrp_val_min (const_tree type)
-{
- if (INTEGRAL_TYPE_P (type))
- return TYPE_MIN_VALUE (type);
- if (POINTER_TYPE_P (type))
- return build_zero_cst (const_cast<tree> (type));
- return NULL_TREE;
-}
-
#endif // GCC_VALUE_RANGE_H