aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;