aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2023-02-01 11:46:18 -0500
committerAndrew MacLeod <amacleod@redhat.com>2023-02-03 14:42:46 -0500
commit093e2e1b201c0f324e0d8bfe6487aa2d470a13e7 (patch)
tree59daf97769e66402dfe7cbf4467c3e545cbf0864
parent27ac6a707e7438c3cec79c24f5d53de79493e2f8 (diff)
downloadgcc-093e2e1b201c0f324e0d8bfe6487aa2d470a13e7.zip
gcc-093e2e1b201c0f324e0d8bfe6487aa2d470a13e7.tar.gz
gcc-093e2e1b201c0f324e0d8bfe6487aa2d470a13e7.tar.bz2
Reset SCEV before removing unreachable globals.
SCEV should be reset in VRP before trying to remove unreachable globals to avoid triggering issues with it's cache. PR tree-optimization/107570 gcc/ * tree-vrp.cc (remove_and_update_globals): Reset SCEV. gcc/testsuite/ * gcc.dg/pr107570.c: New.
-rw-r--r--gcc/testsuite/gcc.dg/pr107570.c25
-rw-r--r--gcc/tree-vrp.cc4
2 files changed, 29 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr107570.c b/gcc/testsuite/gcc.dg/pr107570.c
new file mode 100644
index 0000000..ba5b535
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr107570.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+long int n;
+
+void
+foo (int *p, int x)
+{
+ for (;;)
+ {
+ for (*p = 0; *p < 1; ++*p)
+ {
+ n += *p < 0;
+ if (n < x)
+ {
+ while (x < 1)
+ ++x;
+
+ __builtin_unreachable ();
+ }
+ }
+
+ p = &x;
+ }
+}
diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
index 3c43176..95547e5 100644
--- a/gcc/tree-vrp.cc
+++ b/gcc/tree-vrp.cc
@@ -121,6 +121,10 @@ remove_unreachable::remove_and_update_globals (bool final_p)
if (m_list.length () == 0)
return false;
+ // Ensure the cache in SCEV has been cleared before processing
+ // globals to be removed.
+ scev_reset ();
+
bool change = false;
tree name;
unsigned i;