[gcc r13-1935] Make range_of_ssa_name_with_loop_info type agnostic.
Aldy Hernandez
aldyh@gcc.gnu.org
Tue Aug 2 15:42:57 GMT 2022
https://gcc.gnu.org/g:6d41f7c39cff9fb5ccce8e60b6de1679a1dc092a
commit r13-1935-g6d41f7c39cff9fb5ccce8e60b6de1679a1dc092a
Author: Aldy Hernandez <aldyh@redhat.com>
Date: Tue Aug 2 13:27:16 2022 +0200
Make range_of_ssa_name_with_loop_info type agnostic.
gcc/ChangeLog:
* gimple-range-fold.cc (fold_using_range::range_of_phi): Remove
irange check.
(tree_lower_bound): New.
(tree_upper_bound): New.
(fold_using_range::range_of_ssa_name_with_loop_info): Convert to
vrange.
* gimple-range-fold.h (range_of_ssa_name_with_loop_info): Change
argument to vrange.
Diff:
---
gcc/gimple-range-fold.cc | 46 +++++++++++++++++++++++++++++++++++-----------
gcc/gimple-range-fold.h | 2 +-
2 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc
index 7665c954f2b..923094abd62 100644
--- a/gcc/gimple-range-fold.cc
+++ b/gcc/gimple-range-fold.cc
@@ -854,13 +854,12 @@ fold_using_range::range_of_phi (vrange &r, gphi *phi, fur_source &src)
// If SCEV is available, query if this PHI has any knonwn values.
if (scev_initialized_p ()
- && !POINTER_TYPE_P (TREE_TYPE (phi_def))
- && irange::supports_p (TREE_TYPE (phi_def)))
+ && !POINTER_TYPE_P (TREE_TYPE (phi_def)))
{
class loop *l = loop_containing_stmt (phi);
if (l && loop_outer (l))
{
- int_range_max loop_range;
+ Value_Range loop_range (type);
range_of_ssa_name_with_loop_info (loop_range, phi_def, l, phi, src);
if (!loop_range.varying_p ())
{
@@ -1330,10 +1329,32 @@ fold_using_range::range_of_cond_expr (vrange &r, gassign *s, fur_source &src)
return true;
}
+// Return the lower bound of R as a tree.
+
+static inline tree
+tree_lower_bound (const vrange &r, tree type)
+{
+ if (is_a <irange> (r))
+ return wide_int_to_tree (type, as_a <irange> (r).lower_bound ());
+ // ?? Handle floats when they contain endpoints.
+ return NULL;
+}
+
+// Return the upper bound of R as a tree.
+
+static inline tree
+tree_upper_bound (const vrange &r, tree type)
+{
+ if (is_a <irange> (r))
+ return wide_int_to_tree (type, as_a <irange> (r).upper_bound ());
+ // ?? Handle floats when they contain endpoints.
+ return NULL;
+}
+
// If SCEV has any information about phi node NAME, return it as a range in R.
void
-fold_using_range::range_of_ssa_name_with_loop_info (irange &r, tree name,
+fold_using_range::range_of_ssa_name_with_loop_info (vrange &r, tree name,
class loop *l, gphi *phi,
fur_source &src)
{
@@ -1341,24 +1362,27 @@ fold_using_range::range_of_ssa_name_with_loop_info (irange &r, tree name,
tree min, max, type = TREE_TYPE (name);
if (bounds_of_var_in_loop (&min, &max, src.query (), l, phi, name))
{
- if (TREE_CODE (min) != INTEGER_CST)
+ if (!is_gimple_constant (min))
{
if (src.query ()->range_of_expr (r, min, phi) && !r.undefined_p ())
- min = wide_int_to_tree (type, r.lower_bound ());
+ min = tree_lower_bound (r, type);
else
min = vrp_val_min (type);
}
- if (TREE_CODE (max) != INTEGER_CST)
+ if (!is_gimple_constant (max))
{
if (src.query ()->range_of_expr (r, max, phi) && !r.undefined_p ())
- max = wide_int_to_tree (type, r.upper_bound ());
+ max = tree_upper_bound (r, type);
else
max = vrp_val_max (type);
}
- r.set (min, max);
+ if (min && max)
+ {
+ r.set (min, max);
+ return;
+ }
}
- else
- r.set_varying (type);
+ r.set_varying (type);
}
// -----------------------------------------------------------------------
diff --git a/gcc/gimple-range-fold.h b/gcc/gimple-range-fold.h
index fbf66275f74..c2f381dffec 100644
--- a/gcc/gimple-range-fold.h
+++ b/gcc/gimple-range-fold.h
@@ -173,7 +173,7 @@ protected:
void range_of_builtin_ubsan_call (irange &r, gcall *call, tree_code code,
fur_source &src);
bool range_of_phi (vrange &r, gphi *phi, fur_source &src);
- void range_of_ssa_name_with_loop_info (irange &, tree, class loop *, gphi *,
+ void range_of_ssa_name_with_loop_info (vrange &, tree, class loop *, gphi *,
fur_source &src);
void relation_fold_and_or (irange& lhs_range, gimple *s, fur_source &src);
};
More information about the Gcc-cvs
mailing list