aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2022-11-02 21:37:49 -0400
committerAndrew MacLeod <amacleod@redhat.com>2022-11-03 12:46:03 -0400
commit6fd485d15c1a2c427c39bcd45e03bed8cde689e6 (patch)
tree3856fbe882fca42a03b7cebcc2b3b1dd2f9f582e /gcc/gimple-range.cc
parent00d7c8ff16e6838273cea808ffbe22e98104f9d5 (diff)
downloadgcc-6fd485d15c1a2c427c39bcd45e03bed8cde689e6.zip
gcc-6fd485d15c1a2c427c39bcd45e03bed8cde689e6.tar.gz
gcc-6fd485d15c1a2c427c39bcd45e03bed8cde689e6.tar.bz2
Update range query cache when a statement is updated.
Add an update_stmt interface to range query, and hook into it with the ssa statement update call. gcc/ * gimple-range.cc (gimple_ranger::update_stmt): New. * gimple-range.h (gimple_ranger::update_stmt): New prototype. * tree-ssa-operands.cc (update_stmt_operands): Notify range query that stmt has changed. * value-query.h (range_query::update_stmt): New. gcc/testsuite/ * gcc.dg/tree-ssa/vrp-update.c: New.
Diffstat (limited to 'gcc/gimple-range.cc')
-rw-r--r--gcc/gimple-range.cc34
1 files changed, 34 insertions, 0 deletions
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc
index 110cf57..8063869 100644
--- a/gcc/gimple-range.cc
+++ b/gcc/gimple-range.cc
@@ -482,6 +482,40 @@ gimple_ranger::register_inferred_ranges (gimple *s)
m_cache.apply_inferred_ranges (s);
}
+// When a statement S has changed since the result was cached, re-evaluate
+// and update the global cache.
+
+void
+gimple_ranger::update_stmt (gimple *s)
+{
+ tree lhs = gimple_get_lhs (s);
+ if (!lhs || !gimple_range_ssa_p (lhs))
+ return;
+ Value_Range r (TREE_TYPE (lhs));
+ // Only update if it already had a value.
+ if (m_cache.get_global_range (r, lhs))
+ {
+ // Re-calculate a new value using just cache values.
+ Value_Range tmp (TREE_TYPE (lhs));
+ fold_using_range f;
+ fur_depend src (s, &(gori ()), &m_cache);
+ f.fold_stmt (tmp, s, src, lhs);
+
+ // Combine the new value with the old value to check for a change.
+ if (r.intersect (tmp))
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ print_generic_expr (dump_file, lhs, TDF_SLIM);
+ fprintf (dump_file, " : global value re-evaluated to ");
+ r.dump (dump_file);
+ fputc ('\n', dump_file);
+ }
+ m_cache.set_global_range (lhs, r);
+ }
+ }
+}
+
// This routine will export whatever global ranges are known to GCC
// SSA_RANGE_NAME_INFO and SSA_NAME_PTR_INFO fields.