aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2023-05-24 09:52:26 -0400
committerAndrew MacLeod <amacleod@redhat.com>2023-05-24 16:40:11 -0400
commit1cd5bc387c453126fdb4c9400096180484ecddee (patch)
tree1e6b283f595756c7bf6ac904fba8674ef5be4ead /gcc/tree-vrp.cc
parent04859bda7730f9f0cc3dc02b1df865bd7d20d388 (diff)
downloadgcc-1cd5bc387c453126fdb4c9400096180484ecddee.zip
gcc-1cd5bc387c453126fdb4c9400096180484ecddee.tar.gz
gcc-1cd5bc387c453126fdb4c9400096180484ecddee.tar.bz2
Gimple range PHI analyzer and testcases
Provide a PHI analyzer framework to provive better initial values for PHI nodes which formk groups with initial values and single statements which modify the PHI values in some predicatable way. PR tree-optimization/107822 PR tree-optimization/107986 gcc/ * Makefile.in (OBJS): Add gimple-range-phi.o. * gimple-range-cache.h (ranger_cache::m_estimate): New phi_analyzer pointer member. * gimple-range-fold.cc (fold_using_range::range_of_phi): Use phi_analyzer if no loop info is available. * gimple-range-phi.cc: New file. * gimple-range-phi.h: New file. * tree-vrp.cc (execute_ranger_vrp): Utililze a phi_analyzer. gcc/testsuite/ * gcc.dg/pr107822.c: New. * gcc.dg/pr107986-1.c: New.
Diffstat (limited to 'gcc/tree-vrp.cc')
-rw-r--r--gcc/tree-vrp.cc7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
index 7f03f54..c52e997 100644
--- a/gcc/tree-vrp.cc
+++ b/gcc/tree-vrp.cc
@@ -994,11 +994,15 @@ execute_ranger_vrp (struct function *fun, bool warn_array_bounds_p,
set_all_edges_as_executable (fun);
gimple_ranger *ranger = enable_ranger (fun, false);
rvrp_folder folder (ranger);
+ phi_analysis_initialize (ranger->const_query ());
folder.substitute_and_fold ();
// Remove tagged builtin-unreachable and maybe update globals.
folder.m_unreachable.remove_and_update_globals (final_p);
if (dump_file && (dump_flags & TDF_DETAILS))
- ranger->dump (dump_file);
+ {
+ phi_analysis ().dump (dump_file);
+ ranger->dump (dump_file);
+ }
if ((warn_array_bounds || warn_strict_flex_arrays) && warn_array_bounds_p)
{
@@ -1020,6 +1024,7 @@ execute_ranger_vrp (struct function *fun, bool warn_array_bounds_p,
array_checker.check ();
}
+ phi_analysis_finalize ();
disable_ranger (fun);
scev_finalize ();
loop_optimizer_finalize ();