When using the private communication method I introduced for fold_stmt
to acquire context, we are suppose to be using the cache in read-only
mode. I didn't query it in that mode, so it was accidentally triggering
another lookup before finishing the original query, and that triggered
the safety trap. This patch makes sure we make the request in read-only
mode .
Bootstraps with no regressions on x86_64-pc-linux-gnu. Pushed.
Andrew
commit 0cd653bd2559701da9cc4c9bf51f22bdd68623b5
Author: Andrew MacLeod <amacl...@redhat.com>
Date: Mon Nov 8 09:32:42 2021 -0500
Don't calculate new values when using the private context callback.
When using rangers private callback mechanism to provide context
to fold_stmt calls, we are only suppose to be using the cache in read
only mode, never calculate new values.
gcc/
PR tree-optimization/103122
* gimple-range.cc (gimple_ranger::range_of_expr): Request the cache
entry with "calulate new values" set to false.
gcc/testsuite/
* g++.dg/pr103122.C: New.
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc
index e1177b1c5e8..87dba6e81d8 100644
--- a/gcc/gimple-range.cc
+++ b/gcc/gimple-range.cc
@@ -88,8 +88,8 @@ gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt)
if (!m_cache.get_global_range (r, expr))
r = gimple_range_global (expr);
// Pick up implied context information from the on-entry cache
- // if current_bb is set.
- if (current_bb && m_cache.block_range (tmp, current_bb, expr))
+ // if current_bb is set. Do not attempt any new calculations.
+ if (current_bb && m_cache.block_range (tmp, current_bb, expr, false))
{
r.intersect (tmp);
char str[80];
diff --git a/gcc/testsuite/g++.dg/pr103122.C b/gcc/testsuite/g++.dg/pr103122.C
new file mode 100644
index 00000000000..3465eade46b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr103122.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+unsigned a;
+int b;
+short c;
+void d(long) {
+ for (bool e = (bool)c - 1; e < (bool)b - 1; e += 0)
+ ;
+ if (a) {
+ for (char f = 0; f < 7; f = 7)
+ for (int g = 0; g < c; g += 10)
+ ;
+ d(-!c);
+ }
+}