re PR tree-optimization/46620 (32-bit structures containing bitfields are not copied...
authorAlexandre Oliva <aoliva@redhat.com>
Sat, 19 Feb 2011 21:02:35 +0000 (21:02 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Sat, 19 Feb 2011 21:02:35 +0000 (21:02 +0000)
PR tree-optimization/46620
* gcc.dg/pr46620.c: New.

From-SVN: r170325

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr46620.c [new file with mode: 0644]

index 0b9dc0c79eb28824c79275dc6297d9796a46854c..db9b51d32919125b46404ced5d41d9b5adb640d9 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-19  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR tree-optimization/46620
+       * gcc.dg/pr46620.c: New.
+
 2011-02-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/47809
diff --git a/gcc/testsuite/gcc.dg/pr46620.c b/gcc/testsuite/gcc.dg/pr46620.c
new file mode 100644 (file)
index 0000000..8cc71eb
--- /dev/null
@@ -0,0 +1,76 @@
+/* PR tree-optimization/46620 */
+/* SRA bitfield grouping used to lose track at padding bitfields in
+   the middle of a word.  */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+#include <stdlib.h>
+
+struct PCT
+{
+  unsigned char        pi1     : 4;
+  unsigned char        pi2     : 3;
+  unsigned char        pif     : 5;
+
+  unsigned char        sl      : 2;
+  unsigned char        uc      : 1;
+  unsigned char        st      : 1;
+
+  unsigned char        p       : 1;
+  unsigned char        cs      : 1;
+  unsigned char        ss      : 1;
+
+  unsigned char        pc      : 3;
+  unsigned char        dmv     : 4;
+  unsigned char        cv      : 4;
+};
+
+struct rt
+{
+  struct rt*           d;
+  void (*edo)(void * const);
+  short                        lId;
+  char          dac;
+};
+
+struct pedr
+{
+  struct rt re;
+  struct PCT pc;
+  unsigned char mid;
+} ;
+
+void __attribute__((__noinline__))
+rei(struct rt* const me, unsigned short anId, void *ad )
+{
+  asm volatile ("");
+}
+
+void __attribute__((__noinline__))
+pedrdo(void * const p)
+{
+  asm volatile ("");
+}
+
+void __attribute__((__noinline__))
+pedri (struct pedr* const  me, struct PCT ppc, unsigned char pmid)
+{
+  rei(&(me->re), 0x7604, 0);
+  me->pc = ppc;
+  me->mid = pmid;
+  (me)->re.edo = pedrdo;
+}
+
+int main()
+{
+  struct PCT ps;
+  struct pedr pm;
+
+  pm.pc.dmv = 0;
+  ps.dmv = 1;
+  pedri(&pm, ps, 32);
+
+  if (pm.pc.dmv != 1)
+    abort ();
+  exit (0);
+}