predicates.md (general_movsrc_operand): Return 0 for memory and memory subreg of...
authorKaz Kojima <kkojima@gcc.gnu.org>
Thu, 2 Jun 2011 22:26:42 +0000 (22:26 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Thu, 2 Jun 2011 22:26:42 +0000 (22:26 +0000)
* config/sh/predicates.md (general_movsrc_operand): Return 0
for memory and memory subreg of which address is an invalid
indexed address for QI and HImode.
(general_movdst_operand): Likewise.
* gcc.c-torture/compile/pr49163.c: New.

From-SVN: r174586

gcc/ChangeLog
gcc/config/sh/predicates.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr49163.c [new file with mode: 0644]

index 4533f582d9b8f9b4b60bca4549bf7ba6b215a163..a6fd4de01bcd78a11c89e87ea0927dc20e9bd6ce 100644 (file)
@@ -1,3 +1,11 @@
+2011-06-02  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       PR target/49163
+       * config/sh/predicates.md (general_movsrc_operand): Return 0
+       for memory and memory subreg of which address is an invalid
+       indexed address for QI and HImode.
+       (general_movdst_operand): Likewise.
+
 2011-06-02  Eric Botcazou  <ebotcazou@adacore.com>
 
        * cse.c (cse_find_path): Refine change to exclude EDGE_ABNORMAL_CALL
index b6508b70d6877e1e3113f7d3a23f51586cfea28c..20354588d99291398b8a6b18f7a144b4904c23e1 100644 (file)
        return 0;
     }
 
+  if ((mode == QImode || mode == HImode)
+      && (MEM_P (op)
+         || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))))
+    {
+      rtx x = XEXP ((MEM_P (op) ? op : SUBREG_REG (op)), 0);
+
+      if (GET_CODE (x) == PLUS
+         && REG_P (XEXP (x, 0))
+         && CONST_INT_P (XEXP (x, 1)))
+       return sh_legitimate_index_p (mode, XEXP (x, 1));
+    }
+
   if (TARGET_SHMEDIA
       && (GET_CODE (op) == PARALLEL || GET_CODE (op) == CONST_VECTOR)
       && sh_rep_vec (op, mode))
       && ! (high_life_started || reload_completed))
     return 0;
 
+  if ((mode == QImode || mode == HImode)
+      && (MEM_P (op)
+         || (GET_CODE (op) == SUBREG && MEM_P (SUBREG_REG (op)))))
+    {
+      rtx x = XEXP ((MEM_P (op) ? op : SUBREG_REG (op)), 0);
+
+      if (GET_CODE (x) == PLUS
+         && REG_P (XEXP (x, 0))
+         && CONST_INT_P (XEXP (x, 1)))
+       return sh_legitimate_index_p (mode, XEXP (x, 1));
+    }
+
   return general_operand (op, mode);
 })
 
index 135087c8a4583900ebc4403a0e7f0d674c9519ff..7c9adb1ae6b02f492dc58c14483a953b2108d7f8 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-02  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       PR target/49163
+       * gcc.c-torture/compile/pr49163.c: New.
+
 2011-06-02  Asher Langton  <langton2@llnl.gov>
 
        PR fortran/49268
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr49163.c b/gcc/testsuite/gcc.c-torture/compile/pr49163.c
new file mode 100644 (file)
index 0000000..f14ab15
--- /dev/null
@@ -0,0 +1,35 @@
+/* PR target/49163 */
+struct S1
+{
+ unsigned f0:18;
+ int f1;
+} __attribute__ ((packed));
+
+struct S2
+{
+  volatile long long f0;
+  int f1;
+};
+
+struct S1 s1;
+struct S2 s2;
+const struct S2 s2array[2][1] = { };
+
+struct S2 **sptr;
+
+extern int bar (char a, long long b, int * c, long long d, long long e);
+extern int baz (void);
+
+int i;
+int *ptr;
+
+void
+foo (int *arg)
+{
+  for (i = 0; i < 1; i = baz())
+    {
+      *arg = *(int *)sptr;
+      *ptr = bar (*arg, s2.f1, ptr,
+                 bar (s2array[1][0].f0, *arg, ptr, s1.f1, *ptr), *arg);
+    }
+}