aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2013-08-21 06:36:36 -0600
committerJeff Law <law@gcc.gnu.org>2013-08-21 06:36:36 -0600
commit5562e26eafb432c644b924b79166a0dedb8a2f89 (patch)
tree8f3794ff3241e02fc16ea5cc1405d408ed1e2fc6 /gcc
parent8724cfdd3b26fc13de09fe84785acf383b7cee93 (diff)
downloadgcc-5562e26eafb432c644b924b79166a0dedb8a2f89.zip
gcc-5562e26eafb432c644b924b79166a0dedb8a2f89.tar.gz
gcc-5562e26eafb432c644b924b79166a0dedb8a2f89.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c31
-rw-r--r--gcc/tree-vrp.c28
4 files changed, 61 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b20b9fa..d98dc5f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-21 Jeff Law <law@redhat.com>
+
+ * 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 <kirill.yukhin@intel.com>
* config/i386/sse.md (V16): Rename to...
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9802c29..e0fb861 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2013-08-21 Jeff Law <law@redhat.com>
+
+ * gcc.dg/tree-ssa/ssa-vrp-thread-1.c: New test.
+
2013-08-21 Paolo Carlini <paolo.carlini@oracle.com>
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 0000000..9d9473e
--- /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 ff82591..48b9f7a 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -9273,15 +9273,27 @@ static vec<tree> 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