aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-dom.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2013-04-03 13:18:09 -0600
committerJeff Law <law@gcc.gnu.org>2013-04-03 13:18:09 -0600
commitbe672e08bbe0d9f210285ec6f3eccf4ff0469d0e (patch)
tree0a355e4712ab8548abe7e365aa96c85ecd240ec6 /gcc/tree-ssa-dom.c
parent9eb85f272426b21e010a3ca433348fc7efc88eaa (diff)
downloadgcc-be672e08bbe0d9f210285ec6f3eccf4ff0469d0e.zip
gcc-be672e08bbe0d9f210285ec6f3eccf4ff0469d0e.tar.gz
gcc-be672e08bbe0d9f210285ec6f3eccf4ff0469d0e.tar.bz2
re PR tree-optimization/56799 (Runfail after r197060+r197082.)
PR tree-optimization/56799 * tree-ssa-dom.c (record_equivalences_from_incoming_edge): Bring back test for widening conversion erroneously dropped in prior change. PR tree-optimization/56799 * gcc.c-torture/execute/pr56799.c: New test. From-SVN: r197453
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r--gcc/tree-ssa-dom.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 29d2bb4..d98a646 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -1151,9 +1151,15 @@ record_equivalences_from_incoming_edge (basic_block bb)
{
tree old_rhs = gimple_assign_rhs1 (defstmt);
- /* If the constant is in the range of the type of OLD_RHS,
- then convert the constant and record the equivalence. */
+ /* If the conversion widens the original value and
+ the constant is in the range of the type of OLD_RHS,
+ then convert the constant and record the equivalence.
+
+ Note that int_fits_type_p does not check the precision
+ if the upper and lower bounds are OK. */
if (INTEGRAL_TYPE_P (TREE_TYPE (old_rhs))
+ && (TYPE_PRECISION (TREE_TYPE (lhs))
+ > TYPE_PRECISION (TREE_TYPE (old_rhs)))
&& int_fits_type_p (rhs, TREE_TYPE (old_rhs)))
{
tree newval = fold_convert (TREE_TYPE (old_rhs), rhs);