diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2020-10-06 12:53:09 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2020-10-06 13:03:13 -0400 |
commit | fcae5121154d1c3382b056bcc2c563cedac28e74 (patch) | |
tree | 7f1a992410f82963ee9df115586cf45e39a53583 /gcc/vr-values.c | |
parent | 90e88fd376bb9ad6223a1f5ccd803d1bd9539b05 (diff) | |
download | gcc-fcae5121154d1c3382b056bcc2c563cedac28e74.zip gcc-fcae5121154d1c3382b056bcc2c563cedac28e74.tar.gz gcc-fcae5121154d1c3382b056bcc2c563cedac28e74.tar.bz2 |
Hybrid EVRP and testcases
Provide a hybrid EVRP pass which uses legacy EVRP and adds additonal
enhancements from the new ranger infrastructure.
A New option is also provided, -fevrp-mode=
And adjust testcases
gcc/ChangeLog:
2020-10-06 Andrew MacLeod <amacleod@redhat.com>
* flag-types.h (enum evrp_mode): New enumerated type EVRP_MODE_*.
* common.opt (fevrp-mode): New undocumented flag.
* gimple-ssa-evrp.c: Include gimple-range.h
(class rvrp_folder): EVRP folding using ranger exclusively.
(rvrp_folder::rvrp_folder): New.
(rvrp_folder::~rvrp_folder): New.
(rvrp_folder::value_of_expr): New. Use rangers value_of_expr.
(rvrp_folder::value_on_edge): New. Use rangers value_on_edge.
(rvrp_folder::value_of_Stmt): New. Use rangers value_of_stmt.
(rvrp_folder::fold_stmt): New. Call the simplifier.
(class hybrid_folder): EVRP folding using both engines.
(hybrid_folder::hybrid_folder): New.
(hybrid_folder::~hybrid_folder): New.
(hybrid_folder::fold_stmt): New. Simplify with one engne, then the
other.
(hybrid_folder::value_of_expr): New. Use both value routines.
(hybrid_folder::value_on_edge): New. Use both value routines.
(hybrid_folder::value_of_stmt): New. Use both value routines.
(hybrid_folder::choose_value): New. Choose between range_analzyer and
rangers values.
(execute_early_vrp): Choose a folder based on flag_evrp_mode.
* vr-values.c (simplify_using_ranges::fold_cond): Try range_of_stmt
first to see if it returns a value.
(simplify_using_ranges::simplify_switch_using_ranges): Return true if
any changes were made to the switch.
gcc/testsuite/ChangeLog:
2020-10-06 Andrew MacLeod <amacleod@redhat.com>
* gcc.dg/pr81192.c: Disable EVRP pass.
* gcc.dg/tree-ssa/pr77445-2.c: Ditto.
* gcc.dg/tree-ssa/ssa-dom-thread-6.c: Adjust.
* gcc.dg/tree-ssa/ssa-dom-thread-7.c: Ditto.
Diffstat (limited to 'gcc/vr-values.c')
-rw-r--r-- | gcc/vr-values.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/gcc/vr-values.c b/gcc/vr-values.c index 4d7dfd0..88aa672 100644 --- a/gcc/vr-values.c +++ b/gcc/vr-values.c @@ -3606,6 +3606,35 @@ simplify_using_ranges::fold_cond (gcond *cond) some point we should merge all variants of this code. */ edge taken_edge; vrp_visit_cond_stmt (cond, &taken_edge); + + int_range_max r; + if (query->range_of_stmt (r, cond) && r.singleton_p ()) + { + // COND has already been folded if arguments are constant. + if (TREE_CODE (gimple_cond_lhs (cond)) != SSA_NAME + && TREE_CODE (gimple_cond_rhs (cond)) != SSA_NAME) + return false; + + if (r.zero_p ()) + { + gcc_checking_assert (!taken_edge + || taken_edge->flags & EDGE_FALSE_VALUE); + if (dump_file && (dump_flags & TDF_DETAILS) && !taken_edge) + fprintf (dump_file, "\nPredicate evaluates to: 0\n"); + gimple_cond_make_false (cond); + } + else + { + gcc_checking_assert (!taken_edge + || taken_edge->flags & EDGE_TRUE_VALUE); + if (dump_file && (dump_flags & TDF_DETAILS) && !taken_edge) + fprintf (dump_file, "\nPredicate evaluates to: 1\n"); + gimple_cond_make_true (cond); + } + update_stmt (cond); + return true; + } + if (taken_edge) { if (taken_edge->flags & EDGE_TRUE_VALUE) @@ -3947,7 +3976,7 @@ simplify_using_ranges::simplify_switch_using_ranges (gswitch *stmt) su.stmt = stmt; su.vec = vec2; to_update_switch_stmts.safe_push (su); - return false; + return true; } void |