This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
fix gcc.dg/tls/opt-7.c
- From: Richard Henderson <rth at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 6 Jul 2004 15:42:16 -0700
- Subject: fix gcc.dg/tls/opt-7.c
I'm not sure whose patch started this test failing, but it's a
latent i386 backend bug. We weren't handling the combination
of pic + tls properly in ix86_expand_move.
r~
* config/i386/i386.c (legitimize_pic_address): Make static.
(legitimize_address): Handle CONST with TLS operand.
(ix86_expand_move): Don't call legitimize_pic_address directly.
* config/i386/i386-protos.h (legitimize_pic_address): Remove.
Index: i386-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/i386/i386-protos.h,v
retrieving revision 1.111
diff -u -p -r1.111 i386-protos.h
--- i386-protos.h 7 May 2004 05:38:15 -0000 1.111
+++ i386-protos.h 6 Jul 2004 22:37:13 -0000
@@ -104,7 +104,6 @@ extern bool constant_address_p (rtx);
extern bool legitimate_pic_operand_p (rtx);
extern int legitimate_pic_address_disp_p (rtx);
extern int legitimate_address_p (enum machine_mode, rtx, int);
-extern rtx legitimize_pic_address (rtx, rtx);
extern rtx legitimize_address (rtx, rtx, enum machine_mode);
extern void print_reg (rtx, int, FILE*);
Index: i386.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.c,v
retrieving revision 1.679
diff -u -p -r1.679 i386.c
--- i386.c 23 Jun 2004 02:27:22 -0000 1.679
+++ i386.c 6 Jul 2004 22:37:14 -0000
@@ -6293,7 +6293,7 @@ ix86_GOT_alias_set (void)
GO_IF_LEGITIMATE_ADDRESS rejects symbolic references unless the PIC
reg also appears in the address. */
-rtx
+static rtx
legitimize_pic_address (rtx orig, rtx reg)
{
rtx addr = orig;
@@ -6623,6 +6623,13 @@ legitimize_address (rtx x, rtx oldx ATTR
log = tls_symbolic_operand (x, mode);
if (log)
return legitimize_tls_address (x, log, false);
+ if (GET_CODE (x) == CONST
+ && GET_CODE (XEXP (x, 0)) == PLUS
+ && (log = tls_symbolic_operand (XEXP (XEXP (x, 0), 0), Pmode)))
+ {
+ rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0), log, false);
+ return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
+ }
if (flag_pic && SYMBOLIC_CONST (x))
return legitimize_pic_address (x, 0);
@@ -8416,15 +8423,7 @@ ix86_expand_move (enum machine_mode mode
if (GET_CODE (op0) == MEM)
op1 = force_reg (Pmode, op1);
else
- {
- rtx temp = op0;
- if (GET_CODE (temp) != REG)
- temp = gen_reg_rtx (Pmode);
- temp = legitimize_pic_address (op1, temp);
- if (temp == op0)
- return;
- op1 = temp;
- }
+ op1 = legitimize_address (op1, op1, Pmode);
#endif /* TARGET_MACHO */
}
else