]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
expmed.c (extract_bit_field): Always use adjust_address for MEM.
authorDaniel Jacobowitz <dan@codesourcery.com>
Thu, 6 Mar 2008 20:26:48 +0000 (20:26 +0000)
committerDaniel Jacobowitz <drow@gcc.gnu.org>
Thu, 6 Mar 2008 20:26:48 +0000 (20:26 +0000)
* expmed.c (extract_bit_field): Always use adjust_address for MEM.

* gcc.c-torture/execute/20080222-1.c: New test.

From-SVN: r132990

gcc/ChangeLog
gcc/expmed.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20080222-1.c [new file with mode: 0644]

index 0c3c1a94ba6107a19b59b82ce66d634d4b082eca..07c0564b046f15f8035bea7bee31e57fb51a76e3 100644 (file)
@@ -1,3 +1,7 @@
+2008-03-06  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * expmed.c (extract_bit_field): Always use adjust_address for MEM.
+
 2008-03-05  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        Backport:
index 26e4cd48338b3d4c68f386e7ea4213e98aa1b9e5..d392197d8e94a5fd4f40820d9a7eab8fa69e6a4d 100644 (file)
@@ -1260,18 +1260,15 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
                  || (offset * BITS_PER_UNIT % bitsize == 0
                      && MEM_ALIGN (op0) % bitsize == 0)))))
     {
-      if (mode1 != GET_MODE (op0))
+      if (MEM_P (op0))
+       op0 = adjust_address (op0, mode1, offset);
+      else if (mode1 != GET_MODE (op0))
        {
-         if (MEM_P (op0))
-           op0 = adjust_address (op0, mode1, offset);
-         else
-           {
-             rtx sub = simplify_gen_subreg (mode1, op0, GET_MODE (op0),
-                                            byte_offset);
-             if (sub == NULL)
-               goto no_subreg_mode_swap;
-             op0 = sub;
-           }
+         rtx sub = simplify_gen_subreg (mode1, op0, GET_MODE (op0),
+                                        byte_offset);
+         if (sub == NULL)
+           goto no_subreg_mode_swap;
+         op0 = sub;
        }
       if (mode1 != mode)
        return convert_to_mode (tmode, op0, unsignedp);
index 63e8ec67140d0a2a2ab3cab8e0f11a6655cb4933..10b5a150d4c2a0a1c6129d544c4397e63ad30a69 100644 (file)
@@ -1,3 +1,7 @@
+2008-03-06  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * gcc.c-torture/execute/20080222-1.c: New test.
+
 2008-03-03  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.dg/vect/vect-99.c: Include stdlib.h and tree-vect.h.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20080222-1.c b/gcc/testsuite/gcc.c-torture/execute/20080222-1.c
new file mode 100644 (file)
index 0000000..6db83cc
--- /dev/null
@@ -0,0 +1,22 @@
+extern void abort (void);
+
+struct container
+{
+  unsigned char data[1];
+};
+
+unsigned char space[6] = {1, 2, 3, 4, 5, 6};
+
+int
+foo (struct container *p)
+{
+  return p->data[4];
+}
+
+int
+main ()
+{
+  if (foo ((struct container *) space) != 5)
+    abort ();
+  return 0;
+}