Perform on-entry propagation after range_of_stmt on a gcond.
authorAndrew MacLeod <amacleod@redhat.com>
Thu, 28 Oct 2021 17:31:17 +0000 (13:31 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Fri, 29 Oct 2021 14:31:56 +0000 (10:31 -0400)
Propagation is automatically done by the temporal cache when defs are
out of date from the names on the RHS, but a gcond has no LHS, and any
updates on the RHS are never propagated.  Always propagate them.

gcc/
PR tree-optimization/102983
* gimple-range-cache.h (propagate_updated_value): Make public.
* gimple-range.cc (gimple_ranger::range_of_stmt): Propagate exports
when processing gcond stmts.

gcc/testsuite/
* gcc.dg/pr102983.c: New.

gcc/gimple-range-cache.h
gcc/gimple-range.cc
gcc/testsuite/gcc.dg/pr102983.c [new file with mode: 0644]

index 4937a0b..7510500 100644 (file)
@@ -103,6 +103,8 @@ public:
   bool get_non_stale_global_range (irange &r, tree name);
   void set_global_range (tree name, const irange &r);
 
+  void propagate_updated_value (tree name, basic_block bb);
+
   non_null_ref m_non_null;
   gori_compute m_gori;
 
@@ -120,8 +122,6 @@ private:
   void entry_range (irange &r, tree expr, basic_block bb);
   void exit_range (irange &r, tree expr, basic_block bb);
 
-  void propagate_updated_value (tree name, basic_block bb);
-
   bitmap m_propfail;
   vec<basic_block> m_workback;
   vec<basic_block> m_update_list;
index 91bacda..2c9715a 100644 (file)
@@ -256,7 +256,17 @@ gimple_ranger::range_of_stmt (irange &r, gimple *s, tree name)
 
   // If no name, simply call the base routine.
   if (!name)
-    res = fold_range_internal (r, s, NULL_TREE);
+    {
+      res = fold_range_internal (r, s, NULL_TREE);
+      if (res && is_a <gcond *> (s))
+       {
+         // Update any exports in the cache if this is a gimple cond statement.
+         tree exp;
+         basic_block bb = gimple_bb (s);
+         FOR_EACH_GORI_EXPORT_NAME (m_cache.m_gori, bb, exp)
+           m_cache.propagate_updated_value (exp, bb);
+       }
+    }
   else if (!gimple_range_ssa_p (name))
     res = get_tree_range (r, name, NULL);
   // Check if the stmt has already been processed, and is not stale.
diff --git a/gcc/testsuite/gcc.dg/pr102983.c b/gcc/testsuite/gcc.dg/pr102983.c
new file mode 100644 (file)
index 0000000..ef58af6
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+void foo(void);
+
+static int a = 1;
+
+int main() {
+  int c = 0;
+  for (int b = 0; b <= 0; b++) {
+    if (!a)
+      foo();
+    if (b > c){
+      if (c)
+        continue;
+      a = 0;
+    }
+    c = 1;
+  }
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate c_.* to 1" 1 "evrp" } } */