PR target/52882
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Apr 2012 21:47:16 +0000 (21:47 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Apr 2012 21:47:16 +0000 (21:47 +0000)
* config/i386/i386.c (ix86_decompose_address): Allow VOIDmode
CONST_INT operands, zero-extended with AND.

testsuite/ChangeLog:

PR target/52882
* gcc.target/i386/pr52882.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186170 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr52882.c [new file with mode: 0644]

index e24e0d2..0df25cf 100644 (file)
@@ -1,10 +1,16 @@
+2012-04-05  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/52882
+       * config/i386/i386.c (ix86_decompose_address): Allow VOIDmode
+       CONST_INT operands, zero-extended with AND.
+
 2012-04-05  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/50751
        * config/sh/sh.c (sh_find_mov_disp_adjust): Take machine_mode as the
        first argument instead of mode size.  Move displacement calculations
        to ...
-       (mov_insn_size, max_mov_insn_displacement, mov_insn_alignment_mask): 
+       (mov_insn_size, max_mov_insn_displacement, mov_insn_alignment_mask):
        ... these new functions.
        (disp_adjust): Remove max_mov_disp field.
        (sh_legitimate_index_p): Use max_mov_insn_displacement and
index d58dafc..c959113 100644 (file)
@@ -11510,7 +11510,7 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
            addr = SUBREG_REG (addr);
          else if (GET_MODE (addr) == DImode)
            addr = gen_rtx_SUBREG (SImode, addr, 0);
-         else
+         else if (GET_MODE (addr) != VOIDmode)
            return 0;
        }
     }
index c4e4ecb..cde30ef 100644 (file)
@@ -1,3 +1,8 @@
+2012-04-05  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/52882
+       * gcc.target/i386/pr52882.c: New test.
+
 2012-04-05  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
            Dominique D'Humieures  <dominiq@lps.ens.fr>
 
diff --git a/gcc/testsuite/gcc.target/i386/pr52882.c b/gcc/testsuite/gcc.target/i386/pr52882.c
new file mode 100644 (file)
index 0000000..5f0f12a
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+struct S1 {
+  int f0;
+  int f1;
+};
+
+int fn1 ();
+void fn2 (struct S1);
+
+void
+fn3 () {
+  struct S1 a = { 1, 0 };
+  if (fn1 ())
+    fn2 (a);
+  for (; a.f1;) {
+  }
+}