From 450b058445ffb0a1ffbdec08732d4267f03a8ce5 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Wed, 1 Feb 2023 11:46:18 -0500 Subject: [PATCH] Reset SCEV after folding in VRP. SCEV needs to be reset to processing array bounds in VRP, but it should also be reset before trying to remove unreachable globals so it's cache doesn't cause issues. PR tree-optimization/107570 gcc/ * tree-vrp.cc (execute_ranger_vrp): Reset SCEV after folding. gcc/testsuite/ gcc.dg/pr107570.c: New. --- gcc/testsuite/gcc.dg/pr107570.c | 25 +++++++++++++++++++++++++ gcc/tree-vrp.cc | 6 +++++- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr107570.c diff --git a/gcc/testsuite/gcc.dg/pr107570.c b/gcc/testsuite/gcc.dg/pr107570.c new file mode 100644 index 00000000000..ba5b535a867 --- /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 3c431760a16..0b69374adba 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -1096,6 +1096,11 @@ execute_ranger_vrp (struct function *fun, bool warn_array_bounds_p, gimple_ranger *ranger = enable_ranger (fun, false); rvrp_folder folder (ranger); folder.substitute_and_fold (); + + // SCEV needs to be reset for array bounds, and we do not wish to trigger + // any SCEV lookups when removing unreachable globals, so reset it here. + scev_reset (); + // Remove tagged builtin-unreachable and maybe update globals. folder.m_unreachable.remove_and_update_globals (final_p); if (dump_file && (dump_flags & TDF_DETAILS)) @@ -1116,7 +1121,6 @@ execute_ranger_vrp (struct function *fun, bool warn_array_bounds_p, else e->flags |= EDGE_EXECUTABLE; } - scev_reset (); array_bounds_checker array_checker (fun, ranger); array_checker.check (); } -- 2.39.0