Message ID | 393cebab-d163-4572-afa9-5c97e320b2bc@redhat.com |
---|---|
State | New |
Headers | show |
Series | tree-optimization/105276 - Retain existing range knowledge when prefilling statements. | expand |
On Thu, Apr 21, 2022 at 5:59 PM Andrew MacLeod <amacleod@redhat.com> wrote: > > When range_of_stmt was adjusted to avoid large recursion depth, I added > code to precalculate the dependencies without recursion. > > This patch adjusted that pre-fill code to intersect the current known > range with the newly calculated one before setting the global range. > this Is what range_of_stmt does, and was missed. > > Its running thru testing now, but I expect no issues with either > bootstrap nor testsuite regressions. > > Do you want me to check this when testing is complete, or hold off? OK if testing looks good. Richard. > Andrew
On 4/22/22 01:51, Richard Biener wrote: > On Thu, Apr 21, 2022 at 5:59 PM Andrew MacLeod <amacleod@redhat.com> wrote: >> When range_of_stmt was adjusted to avoid large recursion depth, I added >> code to precalculate the dependencies without recursion. >> >> This patch adjusted that pre-fill code to intersect the current known >> range with the newly calculated one before setting the global range. >> this Is what range_of_stmt does, and was missed. >> >> Its running thru testing now, but I expect no issues with either >> bootstrap nor testsuite regressions. >> >> Do you want me to check this when testing is complete, or hold off? > OK if testing looks good. > > Richard. > passed everything fine. committed. Andrew.
commit 035a365988628794311c2d706d0e20e39c5fd261 Author: Andrew MacLeod <amacleod@redhat.com> Date: Thu Apr 21 11:10:30 2022 -0400 Retain existing range knowledge when prefilling statements. When range_of_stmt was adjusted to avoid large recursion depth, we need to intersect the calculated range whth the any known range to avoid losing info. Range_of_stmt does this, but the new prefill code missed it. PR tree-optimization/105276 gcc/ * gimple-range.cc (gimple_ranger::prefill_stmt_dependencies): Include existing global range with calculated value. gcc/testsuite/ * g++.dg/pr105276.C: New. diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index f41a989d617..f5e9e77bc71 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -389,6 +389,10 @@ gimple_ranger::prefill_stmt_dependencies (tree ssa) // Fold and save the value for NAME. stmt = SSA_NAME_DEF_STMT (name); fold_range_internal (r, stmt, name); + // Make sure we don't lose any current global info. + int_range_max tmp; + m_cache.get_global_range (tmp, name); + r.intersect (tmp); m_cache.set_global_range (name, r); } continue; diff --git a/gcc/testsuite/g++.dg/pr105276.C b/gcc/testsuite/g++.dg/pr105276.C new file mode 100644 index 00000000000..ad0e9dd7e09 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr105276.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +bool +foo(unsigned i) +{ + bool result = true; + while (i) + { + i = i % 3; + i = i - (i == 2 ? 2 : i ? 1 : 0); + result = !result; + } + return result; +} + +/* We should be able to eliminate the i - operation. */ +/* { dg-final { scan-tree-dump-not "i_.* - " "optimized" } } */