From cb596fd43667f92c4cb037a4ee8b2061c393ba60 Mon Sep 17 00:00:00 2001
From: Andrew MacLeod <amacleod@redhat.com>
Date: Thu, 28 Oct 2021 13:31:17 -0400
Subject: [PATCH] Perform on-entry propagation after range_of_stmt on a gcond.
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 | 4 ++--
gcc/gimple-range.cc | 12 +++++++++++-
gcc/testsuite/gcc.dg/pr102983.c | 21 +++++++++++++++++++++
3 files changed, 34 insertions(+), 3 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/pr102983.c
@@ -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;
@@ -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.
new file mode 100644
@@ -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" } } */
--
2.17.2