From: Andrew MacLeod Date: Thu, 28 Oct 2021 17:31:17 +0000 (-0400) Subject: Perform on-entry propagation after range_of_stmt on a gcond. X-Git-Tag: basepoints/gcc-13~3525 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb596fd43667f92c4cb037a4ee8b2061c393ba60;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/gimple-range-cache.h b/gcc/gimple-range-cache.h index 4937a0b305a5..751050083385 100644 --- a/gcc/gimple-range-cache.h +++ b/gcc/gimple-range-cache.h @@ -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 m_workback; vec m_update_list; diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index 91bacda6dd0f..2c9715a6f2c1 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -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 (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 index 000000000000..ef58af6def08 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr102983.c @@ -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" } } */