From 5562e26eafb432c644b924b79166a0dedb8a2f89 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 21 Aug 2013 06:36:36 -0600 Subject: [PATCH] tree-vrp.c (simplify_stmt_for_jump_threading): Try to simplify assignments too. * tree-vrp.c (simplify_stmt_for_jump_threading): Try to simplify assignments too. If the RHS collapses to a singleton range, then return the value for the range. * gcc.dg/tree-ssa/ssa-vrp-thread-1.c: New test. From-SVN: r201898 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 4 +++ .../gcc.dg/tree-ssa/ssa-vrp-thread-1.c | 31 +++++++++++++++++++ gcc/tree-vrp.c | 28 ++++++++++++----- 4 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b20b9fa4e51..d98dc5fa555 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-08-21 Jeff Law + + * tree-vrp.c (simplify_stmt_for_jump_threading): Try to + simplify assignments too. If the RHS collapses to a singleton + range, then return the value for the range. + 2013-08-21 Kirill Yukhin * config/i386/sse.md (V16): Rename to... diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9802c29f488..e0fb86111ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-08-21 Jeff Law + + * gcc.dg/tree-ssa/ssa-vrp-thread-1.c: New test. + 2013-08-21 Paolo Carlini PR c++/56134 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c new file mode 100644 index 00000000000..9d9473e7f31 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1-details" } */ + + +struct basic_block_def; +typedef struct basic_block_def *basic_block; +enum gimple_code +{ + LAST_AND_UNUSED_GIMPLE_CODE +}; +struct omp_region +{ + struct omp_region *outer; + basic_block cont; +}; +void +build_omp_regions_1 (basic_block bb, struct omp_region *parent, + unsigned char single_tree, enum gimple_code code) +{ + if (code == 25) + parent = parent->outer; + else if (code == 42) + parent->cont = bb; + if (single_tree && !parent) + return; + oof (); +} + +/* { dg-final { scan-tree-dump-times "Threaded" 1 "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ + diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index ff82591f5f4..48b9f7a072c 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -9273,15 +9273,27 @@ static vec equiv_stack; static tree simplify_stmt_for_jump_threading (gimple stmt, gimple within_stmt) { - /* We only use VRP information to simplify conditionals. This is - overly conservative, but it's unclear if doing more would be - worth the compile time cost. */ - if (gimple_code (stmt) != GIMPLE_COND) - return NULL; + if (gimple_code (stmt) == GIMPLE_COND) + return vrp_evaluate_conditional (gimple_cond_code (stmt), + gimple_cond_lhs (stmt), + gimple_cond_rhs (stmt), within_stmt); + + if (gimple_code (stmt) == GIMPLE_ASSIGN) + { + value_range_t new_vr = VR_INITIALIZER; + tree lhs = gimple_assign_lhs (stmt); + + if (TREE_CODE (lhs) == SSA_NAME + && (INTEGRAL_TYPE_P (TREE_TYPE (lhs)) + || POINTER_TYPE_P (TREE_TYPE (lhs)))) + { + extract_range_from_assignment (&new_vr, stmt); + if (range_int_cst_singleton_p (&new_vr)) + return new_vr.min; + } + } - return vrp_evaluate_conditional (gimple_cond_code (stmt), - gimple_cond_lhs (stmt), - gimple_cond_rhs (stmt), within_stmt); + return NULL_TREE; } /* Blocks which have more than one predecessor and more than -- 2.30.2