aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2016-01-14 19:45:44 -0700
committerJeff Law <law@gcc.gnu.org>2016-01-14 19:45:44 -0700
commit54e32f9d2fac5e8147c1e266229e838f7b122233 (patch)
tree11920a5ccbf0db329177863f74c5da9fcadba8d3
parent3f18cd8253cf88a6312580956c72bcd3ada7d2ac (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-ssa-dom.c12
2 files changed, 14 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 790662511..6f9c6a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-01-14 Jeff Law <law@redhat.com>
+
+ 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.
+
2016-01-14 Richard Henderson <rth@redhat.com>
PR rtl-opt/69014
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);