Commit 731458a4 by Eric Botcazou Committed by Eric Botcazou

re PR target/8366 ([sparc-sun-solaris2.7] C testsuite failure w/-m64 -fpic -O in execute/loop-2d.c)

	PR optimization/8366
	* config/sparc/sparc.h: (SYMBOLIC_CONST): New macro.
	(GO_IF_LEGITIMATE_ADDRESS): Use it. Reject the form
	PIC+SYMBOLIC_CONST in other modes than Pmode.
	(GO_IF_MODE_DEPENDENT_ADDRESS): Use it. Mark
	the form PIC+SYMBOLIC_CONST as mode dependent.

Co-Authored-By: Richard Henderson <rth@redhat.com>

From-SVN: r64657
parent 30b3f142
2003-03-21 Eric Botcazou <ebotcazou@libertysurf.fr>
Richard Henderson <rth@redhat.com>
PR optimization/8366
* config/sparc/sparc.h: (SYMBOLIC_CONST): New macro.
(GO_IF_LEGITIMATE_ADDRESS): Use it. Reject the form
PIC+SYMBOLIC_CONST in other modes than Pmode.
(GO_IF_MODE_DEPENDENT_ADDRESS): Use it. Mark
the form PIC+SYMBOLIC_CONST as mode dependent.
2003-03-21 DJ Delorie <dj@redhat.com> 2003-03-21 DJ Delorie <dj@redhat.com>
* config/stormy16/stormy16.c (xstormy16_expand_arith): Make * config/stormy16/stormy16.c (xstormy16_expand_arith): Make
......
...@@ -2180,6 +2180,8 @@ do { \ ...@@ -2180,6 +2180,8 @@ do { \
If you change this, execute "rm explow.o recog.o reload.o". */ If you change this, execute "rm explow.o recog.o reload.o". */
#define SYMBOLIC_CONST(X) symbolic_operand (X, VOIDmode)
#define RTX_OK_FOR_BASE_P(X) \ #define RTX_OK_FOR_BASE_P(X) \
((GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) \ ((GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) \
|| (GET_CODE (X) == SUBREG \ || (GET_CODE (X) == SUBREG \
...@@ -2213,6 +2215,8 @@ do { \ ...@@ -2213,6 +2215,8 @@ do { \
&& GET_CODE (op1) != REG \ && GET_CODE (op1) != REG \
&& GET_CODE (op1) != LO_SUM \ && GET_CODE (op1) != LO_SUM \
&& GET_CODE (op1) != MEM \ && GET_CODE (op1) != MEM \
&& (! SYMBOLIC_CONST (op1) \
|| MODE == Pmode) \
&& (GET_CODE (op1) != CONST_INT \ && (GET_CODE (op1) != CONST_INT \
|| SMALL_INT (op1))) \ || SMALL_INT (op1))) \
goto ADDR; \ goto ADDR; \
...@@ -2300,6 +2304,34 @@ do { \ ...@@ -2300,6 +2304,34 @@ do { \
else if (GET_CODE (X) == CONST_INT && SMALL_INT (X)) \ else if (GET_CODE (X) == CONST_INT && SMALL_INT (X)) \
goto ADDR; \ goto ADDR; \
} }
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for.
In PIC mode,
(mem:HI [%l7+a])
is not equivalent to
(mem:QI [%l7+a]) (mem:QI [%l7+a+1])
because [%l7+a+1] is interpreted as the address of (a+1). */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \
{ \
if (flag_pic == 1) \
{ \
if (GET_CODE (ADDR) == PLUS) \
{ \
rtx op0 = XEXP (ADDR, 0); \
rtx op1 = XEXP (ADDR, 1); \
if (op0 == pic_offset_table_rtx \
&& SYMBOLIC_CONST (op1)) \
goto LABEL; \
} \
} \
}
/* Try machine-dependent ways of modifying an illegitimate address /* Try machine-dependent ways of modifying an illegitimate address
to be legitimate. If we find one, return the new, valid address. to be legitimate. If we find one, return the new, valid address.
...@@ -2377,12 +2409,6 @@ do { \ ...@@ -2377,12 +2409,6 @@ do { \
} \ } \
/* ??? 64-bit reloads. */ \ /* ??? 64-bit reloads. */ \
} while (0) } while (0)
/* Go to LABEL if ADDR (a legitimate address expression)
has an effect that depends on the machine mode it is used for.
On the SPARC this is never true. */
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
/* Specify the machine mode that this machine uses /* Specify the machine mode that this machine uses
for the index in the tablejump instruction. */ for the index in the tablejump instruction. */
......
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