aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-06-30 08:35:30 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-06-30 08:35:30 +0000
commit4fe651724763ce1a438b5497621510a4185e069e (patch)
tree2344fd3df8305ad2564d66c8eba8cc201a431665
parentdc6bcf52ebcc487d78060c22df62367732370881 (diff)
downloadgcc-4fe651724763ce1a438b5497621510a4185e069e.zip
gcc-4fe651724763ce1a438b5497621510a4185e069e.tar.gz
gcc-4fe651724763ce1a438b5497621510a4185e069e.tar.bz2
tree-vrp.c (register_edge_assert_for_2): Also register asserts for dominating conversion results.
2015-06-30 Richard Biener <rguenther@suse.de> * tree-vrp.c (register_edge_assert_for_2): Also register asserts for dominating conversion results. From-SVN: r225161
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-vrp.c38
2 files changed, 29 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 96f4f8d..00954b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2015-06-30 Richard Biener <rguenther@suse.de>
+
+ * tree-vrp.c (register_edge_assert_for_2): Also register
+ asserts for dominating conversion results.
+
2015-06-30 Bin Cheng <bin.cheng@arm.com>
* tree-ssa-loop-ivopts.c (record_sub_use): Don't reset ssa_name
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index ec6d2c3..db1df37 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -5359,7 +5359,9 @@ register_edge_assert_for_2 (tree name, edge e, gimple_stmt_iterator bsi,
/* In the case of post-in/decrement tests like if (i++) ... and uses
of the in/decremented value on the edge the extra name we want to
assert for is not on the def chain of the name compared. Instead
- it is in the set of use stmts. */
+ it is in the set of use stmts.
+ Similar cases happen for conversions that were simplified through
+ fold_{sign_changed,widened}_comparison. */
if ((comp_code == NE_EXPR
|| comp_code == EQ_EXPR)
&& TREE_CODE (val) == INTEGER_CST)
@@ -5368,29 +5370,37 @@ register_edge_assert_for_2 (tree name, edge e, gimple_stmt_iterator bsi,
gimple use_stmt;
FOR_EACH_IMM_USE_STMT (use_stmt, ui, name)
{
- /* Cut off to use-stmts that are in the predecessor. */
- if (gimple_bb (use_stmt) != e->src)
- continue;
-
if (!is_gimple_assign (use_stmt))
continue;
- enum tree_code code = gimple_assign_rhs_code (use_stmt);
- if (code != PLUS_EXPR
- && code != MINUS_EXPR)
+ /* Cut off to use-stmts that are dominating the predecessor. */
+ if (!dominated_by_p (CDI_DOMINATORS, e->src, gimple_bb (use_stmt)))
continue;
- tree cst = gimple_assign_rhs2 (use_stmt);
- if (TREE_CODE (cst) != INTEGER_CST)
+ tree name2 = gimple_assign_lhs (use_stmt);
+ if (TREE_CODE (name2) != SSA_NAME
+ || !live_on_edge (e, name2))
continue;
- tree name2 = gimple_assign_lhs (use_stmt);
- if (live_on_edge (e, name2))
+ enum tree_code code = gimple_assign_rhs_code (use_stmt);
+ tree cst;
+ if (code == PLUS_EXPR
+ || code == MINUS_EXPR)
{
+ cst = gimple_assign_rhs2 (use_stmt);
+ if (TREE_CODE (cst) != INTEGER_CST)
+ continue;
cst = int_const_binop (code, val, cst);
- register_new_assert_for (name2, name2, comp_code, cst,
- NULL, e, bsi);
}
+ else if (CONVERT_EXPR_CODE_P (code))
+ cst = fold_convert (TREE_TYPE (name2), val);
+ else
+ continue;
+
+ if (TREE_OVERFLOW_P (cst))
+ cst = drop_tree_overflow (cst);
+ register_new_assert_for (name2, name2, comp_code, cst,
+ NULL, e, bsi);
}
}