aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-05-06 14:02:58 +0000
committerJakub Jelinek <jakub@redhat.com>2011-05-06 14:02:58 +0000
commit2c7dfc612bd6119b1b27ba54608edbc49cffd927 (patch)
treef277e3afe6199d2e9d455f47ad439ec130bf78cc
parentcf1e64fb325b3f8e632910bc800cf07275bd2d07 (diff)
svn merge -r171251:171252 svn+ssh://gcc.gnu.org/svn/gcc/trunkredhat/gcc-4_5-branch
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/redhat/gcc-4_5-branch@173487 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-common.c14
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr42544.c14
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr48197.c25
5 files changed, 67 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6cb0417dda8..98564527c4d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-03-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/42544
+ PR c/48197
+ * c-common.c (shorten_compare): If primopN is first sign-extended
+ to opN and then zero-extended to result type, set primopN to opN.
+
2011-05-05 Julian Brown <julian@codesourcery.com>
* config/arm/neon.md (vec_set<mode>_internal): Fix misplaced
diff --git a/gcc/c-common.c b/gcc/c-common.c
index d27fc29fb4e..dc3bfed48c9 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -3435,6 +3435,20 @@ shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
primop0 = get_narrower (op0, &unsignedp0);
primop1 = get_narrower (op1, &unsignedp1);
+ /* If primopN is first sign-extended from primopN's precision to opN's
+ precision, then zero-extended from opN's precision to
+ *restype_ptr precision, shortenings might be invalid. */
+ if (TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (TREE_TYPE (op0))
+ && TYPE_PRECISION (TREE_TYPE (op0)) < TYPE_PRECISION (*restype_ptr)
+ && !unsignedp0
+ && TYPE_UNSIGNED (TREE_TYPE (op0)))
+ primop0 = op0;
+ if (TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (TREE_TYPE (op1))
+ && TYPE_PRECISION (TREE_TYPE (op1)) < TYPE_PRECISION (*restype_ptr)
+ && !unsignedp1
+ && TYPE_UNSIGNED (TREE_TYPE (op1)))
+ primop1 = op1;
+
/* Handle the case that OP0 does not *contain* a conversion
but it *requires* conversion to FINAL_TYPE. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 71dfabe059e..5a98ac1bf51 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2011-03-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/42544
+ PR c/48197
+ * gcc.c-torture/execute/pr42544.c: New test.
+ * gcc.c-torture/execute/pr48197.c: New test.
+
2011-05-05 Julian Brown <julian@codesourcery.com>
* gcc.target/arm/neon-vset_lanes8.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr42544.c b/gcc/testsuite/gcc.c-torture/execute/pr42544.c
new file mode 100644
index 00000000000..c5951b06a17
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr42544.c
@@ -0,0 +1,14 @@
+/* PR c/42544 */
+
+extern void abort (void);
+
+int
+main ()
+{
+ signed short s = -1;
+ if (sizeof (long long) == sizeof (unsigned int))
+ return 0;
+ if ((unsigned int) s >= 0x100000000ULL)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr48197.c b/gcc/testsuite/gcc.c-torture/execute/pr48197.c
new file mode 100644
index 00000000000..37812c07b0c
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr48197.c
@@ -0,0 +1,25 @@
+/* PR c/48197 */
+
+extern void abort (void);
+static int y = 0x8000;
+
+int
+main ()
+{
+ unsigned int x = (short)y;
+ if (sizeof (0LL) == sizeof (0U))
+ return 0;
+ if (0LL > (0U ^ (short)-0x8000))
+ abort ();
+ if (0LL > (0U ^ x))
+ abort ();
+ if (0LL > (0U ^ (short)y))
+ abort ();
+ if ((0U ^ (short)-0x8000) < 0LL)
+ abort ();
+ if ((0U ^ x) < 0LL)
+ abort ();
+ if ((0U ^ (short)y) < 0LL)
+ abort ();
+ return 0;
+}