summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-27 20:47:24 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-27 20:47:24 +0000
commitd2154397e1e24a7880808dfe1ababe1a45024776 (patch)
tree006d5c059049f9c0e6cad9983831e3959d447bc6
parent72e1a42b5d19652e77e37936ed5cdf619d76a08f (diff)
downloadgcc-d2154397e1e24a7880808dfe1ababe1a45024776.tar.gz
./:
PR middle-end/31710 * tree.c (build_distinct_type_copy): If TYPE_MIN_VALUE or TYPE_MAX_VALUE exist, convert them to the new type. testsuite/: PR middle-end/31710 * gcc.c-torture/compile/pr31710.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124237 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr31710.c6
-rw-r--r--gcc/tree.c9
4 files changed, 26 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b50c1aab5fc..9e1510b2f5e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-04-27 Ian Lance Taylor <iant@google.com>
+
+ PR middle-end/31710
+ * tree.c (build_distinct_type_copy): If TYPE_MIN_VALUE or
+ TYPE_MAX_VALUE exist, convert them to the new type.
+
2007-04-27 Zdenek Dvorak <dvorakz@suse.cz>
* tree-cfgcleanup.c (cleanup_tree_cfg): Verify dominance info
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 49ed2ba7f83..22726009746 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-04-27 Ian Lance Taylor <iant@google.com>
+
+ PR middle-end/31710
+ * gcc.c-torture/compile/pr31710.c: New test.
+
2007-04-27 Richard Guenther <rguenther@suse.de>
PR tree-optimization/30965
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr31710.c b/gcc/testsuite/gcc.c-torture/compile/pr31710.c
new file mode 100644
index 00000000000..0c8562dbcde
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr31710.c
@@ -0,0 +1,6 @@
+typedef short SHORT;
+struct v { SHORT i; };
+void f(struct v *pin, struct v *pout) {
+ if (pin->i == (-0x7fff)-1)
+ pout->i = -pin->i;
+}
diff --git a/gcc/tree.c b/gcc/tree.c
index 1f2e91919e8..626f8e447c0 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4174,6 +4174,15 @@ build_distinct_type_copy (tree type)
TYPE_MAIN_VARIANT (t) = t;
TYPE_NEXT_VARIANT (t) = 0;
+ /* VRP assumes that TREE_TYPE (TYPE_MIN_VALUE (type)) == type. */
+ if (INTEGRAL_TYPE_P (t) || SCALAR_FLOAT_TYPE_P (t))
+ {
+ if (TYPE_MIN_VALUE (t) != NULL_TREE)
+ TYPE_MIN_VALUE (t) = fold_convert (t, TYPE_MIN_VALUE (t));
+ if (TYPE_MAX_VALUE (t) != NULL_TREE)
+ TYPE_MAX_VALUE (t) = fold_convert (t, TYPE_MAX_VALUE (t));
+ }
+
return t;
}