diff options
author | Jeff Law <law@redhat.com> | 2016-01-14 19:45:44 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2016-01-14 19:45:44 -0700 |
commit | 54e32f9d2fac5e8147c1e266229e838f7b122233 (patch) | |
tree | 11920a5ccbf0db329177863f74c5da9fcadba8d3 /gcc/tree-ssa-dom.c | |
parent | 3f18cd8253cf88a6312580956c72bcd3ada7d2ac (diff) | |
download | gcc-54e32f9d2fac5e8147c1e266229e838f7b122233.zip gcc-54e32f9d2fac5e8147c1e266229e838f7b122233.tar.gz gcc-54e32f9d2fac5e8147c1e266229e838f7b122233.tar.bz2 |
re PR tree-optimization/69270 (DOM should exploit range information to create more equivalences)
PR tree-optimization/69270
* tree-ssa-dom.c (ssa_name_has_boolean_range): If the type has a
single bit of precision, verify it's also unsigned.
(record_edge_info): Use constant_boolean_node rather than fold_convert
to convert boolean_true/boolean_false to the right type.
From-SVN: r232399
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index da4faca..f2257b3 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -319,8 +319,8 @@ record_conditions (struct edge_info *edge_info, tree cond, tree inverted) /* Return TRUE is OP, an SSA_NAME has a range of values [0..1], false otherwise. - This can be because it is a boolean type, any type with - a single bit of precision, or has known range of [0..1] + This can be because it is a boolean type, any unsigned integral + type with a single bit of precision, or has known range of [0..1] via VRP analysis. */ static bool @@ -332,6 +332,7 @@ ssa_name_has_boolean_range (tree op) /* An integral type with a single bit of precision. */ if (INTEGRAL_TYPE_P (TREE_TYPE (op)) + && TYPE_UNSIGNED (TREE_TYPE (op)) && TYPE_PRECISION (TREE_TYPE (op)) == 1) return true; @@ -425,10 +426,9 @@ record_edge_info (basic_block bb) && ssa_name_has_boolean_range (op0) && is_gimple_min_invariant (op1)) { - tree true_val = fold_convert (TREE_TYPE (op0), - boolean_true_node); - tree false_val = fold_convert (TREE_TYPE (op0), - boolean_false_node); + tree true_val = constant_boolean_node (true, TREE_TYPE (op0)); + tree false_val = constant_boolean_node (false, TREE_TYPE (op0)); + if (code == EQ_EXPR) { edge_info = allocate_edge_info (true_edge); |