diff options
author | Richard Biener <rguenther@suse.de> | 2015-06-30 08:35:30 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-06-30 08:35:30 +0000 |
commit | 4fe651724763ce1a438b5497621510a4185e069e (patch) | |
tree | 2344fd3df8305ad2564d66c8eba8cc201a431665 | |
parent | dc6bcf52ebcc487d78060c22df62367732370881 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 38 |
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); } } |