[COMMITTED] tree-optimization/103022 - Don't calculate new values when using the private context, callback.

Message ID 646b175e-3092-3cc9-2198-703442769c10@redhat.com
State Committed
Headers
Series [COMMITTED] tree-optimization/103022 - Don't calculate new values when using the private context, callback. |

Commit Message

Andrew MacLeod Nov. 8, 2021, 5:49 p.m. UTC
  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
  

Patch

commit 0cd653bd2559701da9cc4c9bf51f22bdd68623b5
Author: Andrew MacLeod <amacleod@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);
+  }
+}