recog.c (mode_dependent_address_p): Identify pre-increment...

gcc/
	* recog.c (mode_dependent_address_p): Identify pre-increment,
	pre-decrement, post-increment and post-decrement addressing as always
	being mode-dependent.
	* config/m32c/m32c.c (m32c_mode_dependent_address): Delete.
	* config/m32c/m32c.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/m32c/m32c-protos.h (m32c_mode_dependent_address): Delete.
	* config/m32r/m32r.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete PRE_DEC,
	PRE_INC and POST_INC checks.
	* config/i386/i386.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/sh/sh.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/pdp11/pdp11.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/avr/avr.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/c4x/c4x.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete PRE_DEC,
	PRE_INC, POST_DEC and POST_INC cases.
	* config/stormy16/stormy16.c (xstormy16_mode_dependent_address_p):
	Delete POST_INC and PRE_DEC cases.
	* config/m68hc11/m68hc11.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to
	no-op.
	* config/cris/cris.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/mn10300/mn10300.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to
	no-op.
	* config/ia64/ia64.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/m68k/m68k.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/rs6000/rs6000.c (rs6000_mode_dependent_address): Delete
	PRE_INC and PRE_DEC cases.
	* config/arc/arc.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/mcore/mcore.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/arm/arm.h (ARM_GO_IF_MODE_DEPENDENT_ADDRESS): Delete.
	(GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/pa/pa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	* config/vax/vax.c (vax_mode_dependent_address_p): Delete
	auto-increment cases.
	* config/h8300/h8300.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete
	auto-increment cases.
	* config/bfin/bfin.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
	
	gcc/testsuite/
	* gcc.c-torture/execute/mode-dependent-address.c: New test.

From-SVN: r119660
This commit is contained in:
Mark Shinwell 2006-12-08 16:37:42 +00:00 committed by Mark Shinwell
parent 00509c04ee
commit b9a76028a2
27 changed files with 133 additions and 111 deletions

View File

@ -1,3 +1,41 @@
2006-12-08 Mark Shinwell <shinwell@codesourcery.com>
* recog.c (mode_dependent_address_p): Identify pre-increment,
pre-decrement, post-increment and post-decrement addressing as always
being mode-dependent.
* config/m32c/m32c.c (m32c_mode_dependent_address): Delete.
* config/m32c/m32c.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/m32c/m32c-protos.h (m32c_mode_dependent_address): Delete.
* config/m32r/m32r.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete PRE_DEC,
PRE_INC and POST_INC checks.
* config/i386/i386.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/sh/sh.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/pdp11/pdp11.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/avr/avr.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/c4x/c4x.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete PRE_DEC,
PRE_INC, POST_DEC and POST_INC cases.
* config/stormy16/stormy16.c (xstormy16_mode_dependent_address_p):
Delete POST_INC and PRE_DEC cases.
* config/m68hc11/m68hc11.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to
no-op.
* config/cris/cris.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/mn10300/mn10300.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to
no-op.
* config/ia64/ia64.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/m68k/m68k.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/rs6000/rs6000.c (rs6000_mode_dependent_address): Delete
PRE_INC and PRE_DEC cases.
* config/arc/arc.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/mcore/mcore.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/arm/arm.h (ARM_GO_IF_MODE_DEPENDENT_ADDRESS): Delete.
(GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/pa/pa.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
* config/vax/vax.c (vax_mode_dependent_address_p): Delete
auto-increment cases.
* config/h8300/h8300.h (GO_IF_MODE_DEPENDENT_ADDRESS): Delete
auto-increment cases.
* config/bfin/bfin.h (GO_IF_MODE_DEPENDENT_ADDRESS): Change to no-op.
2006-12-08 Andrew MacLeod <amacleod@redhat.com>
* Makefile.in: Add new file tree-ssa-ter.c.

View File

@ -799,12 +799,7 @@ do { \
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
{ if (GET_CODE (ADDR) == PRE_DEC) \
goto LABEL; \
if (GET_CODE (ADDR) == PRE_INC) \
goto LABEL; \
}
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
return the mode to be used for the comparison. */

View File

@ -423,9 +423,7 @@ do { \
} \
} while(0)
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC) \
goto LABEL
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
#define LEGITIMATE_CONSTANT_P(X) 1

View File

@ -827,13 +827,7 @@ do { \
You may assume that ADDR is a valid address for the machine.
*/
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
do { \
if (GET_CODE (ADDR) == POST_INC \
|| GET_CODE (ADDR) == POST_DEC \
|| GET_CODE (ADDR) == PRE_DEC) \
goto LABEL; \
} while (0)
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
#define NOTICE_UPDATE_CC(EXPR, INSN) 0

View File

@ -1156,13 +1156,8 @@ CUMULATIVE_ARGS;
}
/* No mode-dependent addresses on the C4x are autoincrements. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
if (GET_CODE (ADDR) == PRE_DEC \
|| GET_CODE (ADDR) == POST_DEC \
|| GET_CODE (ADDR) == PRE_INC \
|| GET_CODE (ADDR) == POST_INC \
|| GET_CODE (ADDR) == POST_MODIFY \
if (GET_CODE (ADDR) == POST_MODIFY \
|| GET_CODE (ADDR) == PRE_MODIFY) \
goto LABEL

View File

@ -1065,14 +1065,9 @@ struct cum_args {int regs;};
while (0)
/* In CRIS, only the postincrement address mode depends thus,
since the increment depends on the size of the operand. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
do \
{ \
if (GET_CODE (ADDR) == POST_INC) \
goto LABEL; \
} \
while (0)
since the increment depends on the size of the operand. This is now
treated generically within recog.c. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
#define LEGITIMATE_CONSTANT_P(X) 1

View File

@ -405,11 +405,7 @@ struct cumulative_args
}
#endif /* REG_OK_STRICT */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
{ \
if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == POST_DEC) \
goto LABEL; \
}
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
#define LEGITIMATE_CONSTANT_P(X) 1

View File

@ -939,11 +939,6 @@ struct cum_arg
(the amount of decrement or increment being the length of the operand). */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
if (GET_CODE (ADDR) == POST_INC \
|| GET_CODE (ADDR) == POST_DEC \
|| GET_CODE (ADDR) == PRE_INC \
|| GET_CODE (ADDR) == PRE_DEC) \
goto LABEL; \
if (GET_CODE (ADDR) == PLUS \
&& h8300_get_index (XEXP (ADDR, 0), VOIDmode, 0) != XEXP (ADDR, 0)) \
goto LABEL;

View File

@ -1767,13 +1767,9 @@ do { \
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for.
On the 80386, only postdecrement and postincrement address depend thus
(the amount of decrement or increment being the length of the operand). */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
do { \
if (GET_CODE (ADDR) == POST_INC \
|| GET_CODE (ADDR) == POST_DEC) \
goto LABEL; \
} while (0)
(the amount of decrement or increment being the length of the operand).
These are now caught in recog.c. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
/* Max number of args passed in registers. If this is more than 3, we will
have problems with ebx (register #4), since it is a caller save register and

View File

@ -1406,9 +1406,7 @@ do { \
on the machine mode of the memory reference it is used for or if the address
is valid for some modes but not others. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
if (GET_CODE (ADDR) == POST_DEC || GET_CODE (ADDR) == POST_INC) \
goto LABEL;
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
/* A C expression that is nonzero if X is a legitimate constant for an
immediate operand on the target machine. */

View File

@ -84,7 +84,6 @@ int m32c_legitimize_reload_address (rtx *, MM, int, int, int);
rtx m32c_libcall_value (MM);
int m32c_limit_reload_class (MM, int);
int m32c_memory_move_cost (MM, int, int);
int m32c_mode_dependent_address (rtx);
int m32c_modes_tieable_p (MM, MM);
bool m32c_mov_ok (rtx *, MM);
char * m32c_output_compare (rtx, rtx *);

View File

@ -2018,15 +2018,6 @@ m32c_legitimize_reload_address (rtx * x,
return 0;
}
/* Used in GO_IF_MODE_DEPENDENT_ADDRESS. */
int
m32c_mode_dependent_address (rtx addr)
{
if (GET_CODE (addr) == POST_INC || GET_CODE (addr) == PRE_DEC)
return 1;
return 0;
}
/* Implements LEGITIMATE_CONSTANT_P. We split large constants anyway,
so we can allow anything. */
int

View File

@ -568,9 +568,7 @@ typedef struct m32c_cumulative_args
if (m32c_legitimize_reload_address(&(X),MODE,OPNUM,TYPE,IND_LEVELS)) \
goto win;
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
if (m32c_mode_dependent_address (ADDR)) \
goto LABEL;
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
#define LEGITIMATE_CONSTANT_P(X) m32c_legitimate_constant_p (X)

View File

@ -1267,10 +1267,7 @@ L2: .word STATIC
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
do \
{ \
if ( GET_CODE (ADDR) == PRE_DEC \
|| GET_CODE (ADDR) == PRE_INC \
|| GET_CODE (ADDR) == POST_INC \
|| GET_CODE (ADDR) == LO_SUM) \
if (GET_CODE (ADDR) == LO_SUM) \
goto LABEL; \
} \
while (0)

View File

@ -1239,12 +1239,7 @@ extern unsigned char m68hc11_reg_valid_for_index[FIRST_PSEUDO_REGISTER];
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
{ \
if (GET_CODE (ADDR) == PRE_DEC || GET_CODE (ADDR) == POST_DEC \
|| GET_CODE (ADDR) == PRE_INC || GET_CODE (ADDR) == POST_INC) \
goto LABEL; \
}
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
/* Nonzero if the constant value X is a legitimate general operand.
It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */

View File

@ -845,9 +845,9 @@ __transfer_from_trampoline () \
goto WIN; }}}
/* On the 68000, only predecrement and postincrement address depend thus
(the amount of decrement or increment being the length of the operand). */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC) goto LABEL
(the amount of decrement or increment being the length of the operand).
These are now treated generically in recog.c. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
#define CASE_VECTOR_MODE HImode
#define CASE_VECTOR_PC_RELATIVE 1

View File

@ -786,12 +786,7 @@ extern const enum reg_class reg_class_from_letter[];
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
{ \
if ( GET_CODE (ADDR) == PRE_DEC || GET_CODE (ADDR) == POST_DEC \
|| GET_CODE (ADDR) == PRE_INC || GET_CODE (ADDR) == POST_INC) \
goto LABEL; \
}
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
/* Specify the machine mode that this machine uses
for the index in the tablejump instruction. */

View File

@ -779,9 +779,7 @@ while (0)
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
if (GET_CODE (ADDR) == POST_INC) \
goto LABEL
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
/* Nonzero if the constant value X is a legitimate general operand.
It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */

View File

@ -1560,12 +1560,7 @@ do { \
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
if (GET_CODE (ADDR) == PRE_DEC \
|| GET_CODE (ADDR) == POST_DEC \
|| GET_CODE (ADDR) == PRE_INC \
|| GET_CODE (ADDR) == POST_INC) \
goto LABEL
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
#define TARGET_ASM_SELECT_SECTION pa_select_section

View File

@ -760,12 +760,10 @@ extern int may_call_alloca;
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for.
On the pdp this is for predec/postinc */
On the pdp this is for predec/postinc, and this is now treated
generically in recog.c. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
{ if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC) \
goto LABEL; \
}
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
/* Specify the machine mode that this machine uses

View File

@ -3766,9 +3766,7 @@ rs6000_mode_dependent_address (rtx addr)
case LO_SUM:
return true;
case PRE_INC:
case PRE_DEC:
return TARGET_UPDATE;
/* Auto-increment cases are now treated generically in recog.c. */
default:
break;

View File

@ -2802,13 +2802,11 @@ struct sh_args {
??? Strictly speaking, we should also include all indexed addressing,
because the index scale factor is the length of the operand.
However, the impact of GO_IF_MODE_DEPENDENT_ADDRESS would be to
high if we did that. So we rely on reload to fix things up. */
high if we did that. So we rely on reload to fix things up.
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
{ \
if (GET_CODE(ADDR) == PRE_DEC || GET_CODE(ADDR) == POST_INC) \
goto LABEL; \
}
Auto-increment addressing is now treated in recog.c. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
/* Specify the machine mode that this machine uses
for the index in the tablejump instruction. */

View File

@ -707,9 +707,7 @@ xstormy16_mode_dependent_address_p (rtx x)
if (GET_CODE (x) == PLUS)
x = XEXP (x, 0);
if (GET_CODE (x) == POST_INC
|| GET_CODE (x) == PRE_DEC)
return 1;
/* Auto-increment addresses are now treated generically in recog.c. */
return 0;
}

View File

@ -1306,8 +1306,8 @@ vax_mode_dependent_address_p (rtx x)
{
rtx xfoo0, xfoo1;
if (GET_CODE (x) == POST_INC || GET_CODE (x) == PRE_DEC)
return 1;
/* Auto-increment cases are now dealt with generically in recog.c. */
if (GET_CODE (x) != PLUS)
return 0;

View File

@ -1983,8 +1983,17 @@ offsettable_address_p (int strictp, enum machine_mode mode, rtx y)
because the amount of the increment depends on the mode. */
int
mode_dependent_address_p (rtx addr ATTRIBUTE_UNUSED /* Maybe used in GO_IF_MODE_DEPENDENT_ADDRESS. */)
mode_dependent_address_p (rtx addr)
{
/* Auto-increment addressing with anything other than post_modify
or pre_modify always introduces a mode dependency. Catch such
cases now instead of deferring to the target. */
if (GET_CODE (addr) == PRE_INC
|| GET_CODE (addr) == POST_INC
|| GET_CODE (addr) == PRE_DEC
|| GET_CODE (addr) == POST_DEC)
return 1;
GO_IF_MODE_DEPENDENT_ADDRESS (addr, win);
return 0;
/* Label `win' might (not) be used via GO_IF_MODE_DEPENDENT_ADDRESS. */

View File

@ -1,3 +1,7 @@
2006-12-08 Mark Shinwell <shinwell@codesourcery.com>
* gcc.c-torture/execute/mode-dependent-address.c: New test.
2006-12-08 Tobias Burnus <burnus@net-b.de>
PR fortran/27546

View File

@ -0,0 +1,49 @@
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
void f883b (int8_t * result,
int16_t * __restrict arg1,
uint32_t * __restrict arg2,
uint64_t * __restrict arg3,
uint8_t * __restrict arg4)
{
int idx;
for (idx=0;idx<96;idx += 1) {
result[idx] = (((((((((((-27 + 2+1)>>1) || arg4[idx]) < arg1[idx])
? (((-27 + 2+1)>>1) || arg4[idx])
: arg1[idx])
>> (arg2[idx] & 31)) ^ 1) - -32)>>7) | -5) & arg3[idx]);
}
}
int8_t result[96];
int16_t arg1[96];
uint32_t arg2[96];
uint64_t arg3[96];
uint8_t arg4[96];
int main (void)
{
int i;
int correct[] = {0x0,0x1,0x2,0x3,0x0,0x1,0x2,0x3,0x8,0x9,0xa,0xb,0x8,0x9,
0xa,0xb,0x10,0x11,0x12,0x13,0x10,0x11,0x12,0x13,
0x18,0x19,0x1a,0x1b,0x18,0x19,0x1a,0x1b,0x20,0x21,0x22,
0x23,0x20,0x21,0x22,0x23,0x28,0x29,0x2a,
0x2b,0x28,0x29,0x2a,0x2b,0x30,0x31,0x32,0x33,
0x30,0x31,0x32,0x33,0x38,0x39,0x3a,0x3b,0x38,0x39,0x3a,
0x3b,0x40,0x41,0x42,0x43,0x40,0x41,0x42,0x43,0x48,0x49,
0x4a,0x4b,0x48,0x49,0x4a,0x4b,0x50,0x51,
0x52,0x53,0x50,0x51,0x52,0x53,0x58,0x59,0x5a,0x5b,
0x58,0x59,0x5a,0x5b};
for (i=0; i < 96; i++)
arg3[i] = arg2[i] = arg1[i] = arg4[i] = i;
f883b(result, arg1, arg2, arg3, arg4);
for (i=0; i < 96; i++)
if (result[i] != correct[i]) abort();
return 0;
}