aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-05-03 17:42:43 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-05-03 17:42:43 +0200
commitc4e26da143564e081c6c68ae5a7e32647fbea8ac (patch)
tree064998e2e6ce5bd8a2620920fa96c470d556c47d /gcc
parent43f9f5210fb3a0d3f0301acfabdd6a50950a528b (diff)
downloadgcc-c4e26da143564e081c6c68ae5a7e32647fbea8ac.zip
gcc-c4e26da143564e081c6c68ae5a7e32647fbea8ac.tar.gz
gcc-c4e26da143564e081c6c68ae5a7e32647fbea8ac.tar.bz2
re PR debug/43972 (ICE in loc_cmp)
PR debug/43972 * config/i386/i386.c (ix86_delegitimize_address): Make sure the result mode matches original rtl mode. * gcc.dg/debug/pr43972.c: New test. From-SVN: r158989
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/debug/pr43972.c29
4 files changed, 46 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3390fae..e62e9ab 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-05-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/43972
+ * config/i386/i386.c (ix86_delegitimize_address): Make sure the
+ result mode matches original rtl mode.
+
2010-05-03 Dave Korn <dave.korn.cygwin@gmail.com>
PR target/43888
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 10aac6e..e05d3cc 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -11014,7 +11014,10 @@ ix86_delegitimize_address (rtx x)
|| XINT (XEXP (x, 0), 1) != UNSPEC_GOTPCREL
|| !MEM_P (orig_x))
return orig_x;
- return XVECEXP (XEXP (x, 0), 0, 0);
+ x = XVECEXP (XEXP (x, 0), 0, 0);
+ if (GET_MODE (orig_x) != Pmode)
+ return simplify_gen_subreg (GET_MODE (orig_x), x, Pmode, 0);
+ return x;
}
if (GET_CODE (x) != PLUS
@@ -11081,6 +11084,8 @@ ix86_delegitimize_address (rtx x)
else
return orig_x;
}
+ if (GET_MODE (orig_x) != Pmode && MEM_P (orig_x))
+ return simplify_gen_subreg (GET_MODE (orig_x), result, Pmode, 0);
return result;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8eaae92..5fe4b1d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-05-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/43972
+ * gcc.dg/debug/pr43972.c: New test.
+
2010-05-02 Uros Bizjak <ubizjak@gmail.com>
PR testsuite/43963
diff --git a/gcc/testsuite/gcc.dg/debug/pr43972.c b/gcc/testsuite/gcc.dg/debug/pr43972.c
new file mode 100644
index 0000000..5fcf1e0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/pr43972.c
@@ -0,0 +1,29 @@
+/* PR debug/43972 */
+/* { dg-do compile } */
+/* { dg-options "-g -w" } */
+/* { dg-options "-g -fpic -w" { target fpic } } */
+
+struct { int *b1; } *f1 ();
+short v1[1];
+struct S { int b2; };
+void
+foo (struct S *a1, union { char *b3; unsigned *b4; int *b5; } *a2)
+{
+ int d;
+ switch (d)
+ {
+ case 0:
+ {
+ int c = a1->b2, i;
+ if (f1 () == 0)
+ *a2->b3++ = 2;
+ else if (((long) (f1 () - f1 ())) ^ ((long) f1 ()->b1 - ((long) f1 () & 8)))
+ *a2->b3++ = (long) f1 - ((long) f1 () & 0xff);
+ else
+ *a2->b4++ = (long) f1;
+ for (i = 0; i < c; i++)
+ *a2->b5++ = (long) v1;
+ foo (a1, a2);
+ }
+ }
+}