Commit a700b5f0 by Kaz Kojima

predicates.md (general_movsrc_operand): Return 0 for memory and memory subreg of…

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
parent 76015c34
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
......
......@@ -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);
})
......
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
......
/* 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);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment