aboutsummaryrefslogtreecommitdiff
path: root/gcc/vr-values.c
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2020-10-06 12:53:09 -0400
committerAndrew MacLeod <amacleod@redhat.com>2020-10-06 13:03:13 -0400
commitfcae5121154d1c3382b056bcc2c563cedac28e74 (patch)
tree7f1a992410f82963ee9df115586cf45e39a53583 /gcc/vr-values.c
parent90e88fd376bb9ad6223a1f5ccd803d1bd9539b05 (diff)
downloadgcc-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.c31
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