predicates.md (general_movsrc_operand): Return 0 for memory and memory subreg of which address is an invalid indexed...

* 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
This commit is contained in:
Kaz Kojima 2011-06-02 22:26:42 +00:00
parent 76015c34a9
commit a700b5f073
4 changed files with 72 additions and 0 deletions

View 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

View file

@ -394,6 +394,18 @@
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))
@ -419,6 +431,18 @@
&& ! (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);
})

View 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

View file

@ -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);
}
}