https://gcc.gnu.org/g:27c5036a82a64012eada494cb19d1ae646b2bcbf

commit r17-2427-g27c5036a82a64012eada494cb19d1ae646b2bcbf
Author: Andrew MacLeod <[email protected]>
Date:   Tue Jul 14 14:55:44 2026 -0400

    Update ranger timestamps for inferred ranges.
    
    If an inferred range is added for a name, mark the name as an updated
    range to allow the dependency processing to pick up the change.
    
            PR tree-optimization/126110
            gcc/
            * gimple-range-cache.cc (ranger_cache::mark_stale): Default defs
            get a new timestamp to make them stale.
            * gimple-range-infer.cc (infer_range_manager::add_range): When
            an inferred range is added, mark the name as updated.
    
            gcc/testsuite/
            * gcc.dg/pr126110.c: New.

Diff:
---
 gcc/gimple-range-cache.cc       | 15 +++++++++++----
 gcc/gimple-range-infer.cc       |  2 ++
 gcc/testsuite/gcc.dg/pr126110.c | 38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index fc5793ccf698..c5a19c866fb0 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -1116,10 +1116,17 @@ ranger_cache::get_global_range (vrange &r, tree name) 
const
 void
 ranger_cache::mark_stale (tree name)
 {
-  // Only mark it as stale if it has been processed. If it has no range
-  // it will be calculated at the next request anyway.
-  if (m_globals.has_range (name))
-    bitmap_set_bit (m_stale, SSA_NAME_VERSION (name));
+  if (SSA_NAME_IS_DEFAULT_DEF (name))
+    {
+      // Default defs have no DEF to recalculate, just create a new timestamp.
+      m_temporal->set_timestamp_stored (name);
+    }
+  else if (m_globals.has_range (name))
+    {
+      // Otherwise Only mark it as stale if it has been processed. If it has no
+      // range it will be calculated at the next request anyway.
+      bitmap_set_bit (m_stale, SSA_NAME_VERSION (name));
+    }
 }
 
 // Get the global range for NAME, and return in R.  Return false if the
diff --git a/gcc/gimple-range-infer.cc b/gcc/gimple-range-infer.cc
index 30b5917e4ede..ecd197cf8590 100644
--- a/gcc/gimple-range-infer.cc
+++ b/gcc/gimple-range-infer.cc
@@ -457,6 +457,8 @@ infer_range_manager::add_range (tree name, gimple *s, const 
vrange &r)
      fprintf (dump_file, "\n");
    }
 
+  get_range_query (cfun)->update_range_info (name);
+
   // If NAME already has a range, intersect them and done.
   exit_range *ptr = m_on_exit[bb->index].find_ptr (name);
   if (ptr)
diff --git a/gcc/testsuite/gcc.dg/pr126110.c b/gcc/testsuite/gcc.dg/pr126110.c
new file mode 100644
index 000000000000..278e53d02353
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr126110.c
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+struct rtx {
+  int code;
+};
+
+static inline void *zero ()
+{
+  return 0;
+}
+static inline int three ()
+{
+  return 3;
+}
+
+int
+can_combine_p (struct rtx *insn, struct rtx *elt)
+{
+  struct rtx *set;
+
+  set = zero ();
+  if (insn->code == three ())
+    set = insn;
+  else
+    {
+      set = elt;
+      if (set == zero ())
+        return 0;
+    }
+
+  return (set == zero ());
+
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "Global Exported: set_.*1," "evrp" } } */
+

Reply via email to