aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-01-08 09:33:43 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-01-08 09:33:43 +0100
commit5f4e6de31f84daa0bcaf1c8e388b6eee9bf359b1 (patch)
treef190aae31de304afb5679e09bf3ee921fb35dab5 /gcc
parentf3ef18ffa0d5facc961caab9c0244b6390e66096 (diff)
downloadgcc-5f4e6de31f84daa0bcaf1c8e388b6eee9bf359b1.zip
gcc-5f4e6de31f84daa0bcaf1c8e388b6eee9bf359b1.tar.gz
gcc-5f4e6de31f84daa0bcaf1c8e388b6eee9bf359b1.tar.bz2
re PR middle-end/54120 (FAIL: gfortran.fortran-torture/execute/random_2.f90 execution)
PR tree-optimization/54120 * tree-vrp.c (range_fits_type_p): Don't allow src_precision < precision from signed vr to unsigned_p if vr->min or vr->max is negative. (simplify_float_conversion_using_ranges): Test can_float_p against CODE_FOR_nothing. From-SVN: r195007
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-vrp.c10
2 files changed, 15 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 25e60e3..379de4d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,13 @@
2013-01-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/54120
+ * tree-vrp.c (range_fits_type_p): Don't allow
+ src_precision < precision from signed vr to unsigned_p
+ if vr->min or vr->max is negative.
+ (simplify_float_conversion_using_ranges): Test can_float_p
+ against CODE_FOR_nothing.
+
+2013-01-08 Jakub Jelinek <jakub@redhat.com>
Richard Biener <rguenther@suse.de>
PR middle-end/55851
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 6b8cbf3..f6b1517 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -1,5 +1,5 @@
/* Support routines for Value Range Propagation (VRP).
- Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
Free Software Foundation, Inc.
Contributed by Diego Novillo <dnovillo@redhat.com>.
@@ -8753,9 +8753,11 @@ range_fits_type_p (value_range_t *vr, unsigned precision, bool unsigned_p)
&& !POINTER_TYPE_P (src_type))
return false;
- /* An extension is always fine, so is an identity transform. */
+ /* An extension is fine unless VR is signed and unsigned_p,
+ and so is an identity transform. */
src_precision = TYPE_PRECISION (TREE_TYPE (vr->min));
- if (src_precision < precision
+ if ((src_precision < precision
+ && !(unsigned_p && !TYPE_UNSIGNED (src_type)))
|| (src_precision == precision
&& TYPE_UNSIGNED (src_type) == unsigned_p))
return true;
@@ -8813,7 +8815,7 @@ simplify_float_conversion_using_ranges (gimple_stmt_iterator *gsi, gimple stmt)
mode = TYPE_MODE (TREE_TYPE (rhs1));
/* If we can do the conversion in the current input mode do nothing. */
else if (can_float_p (fltmode, TYPE_MODE (TREE_TYPE (rhs1)),
- TYPE_UNSIGNED (TREE_TYPE (rhs1))))
+ TYPE_UNSIGNED (TREE_TYPE (rhs1))) != CODE_FOR_nothing)
return false;
/* Otherwise search for a mode we can use, starting from the narrowest
integer mode available. */