]> gcc.gnu.org Git - gcc.git/commitdiff
re PR debug/43972 (ICE in loc_cmp)
authorJakub Jelinek <jakub@redhat.com>
Mon, 3 May 2010 15:42:43 +0000 (17:42 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 3 May 2010 15:42:43 +0000 (17:42 +0200)
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

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/debug/pr43972.c [new file with mode: 0644]

index 3390faec5979c56cb078274632099366bacacc4d..e62e9ab3d3bcffecb2bc8c27117eca4bb0e7df4a 100644 (file)
@@ -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
index 10aac6e4e7be706119f58762883ac31471c93d54..e05d3cc08c46c23a9f49e51323fb93f675889547 100644 (file)
@@ -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;
 }
 
index 8eaae92a975efbc2b1347cc6fd86ec39f2b93a15..5fe4b1d8616133068d12fa6558f5e160f5579860 100644 (file)
@@ -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 (file)
index 0000000..5fcf1e0
--- /dev/null
@@ -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);
+      }
+    }
+}
This page took 0.140614 seconds and 5 git commands to generate.