This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
legitimate address changes for 'long double'
- From: gkeating at apple dot com (Geoffrey Keating)
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 8 Jan 2004 13:52:32 -0800 (PST)
- Subject: legitimate address changes for 'long double'
This patch fixes two bugs:
1. When flag_pic, on Darwin, many legitimate addresses were not being
described as such. I'm amazed this didn't cause trouble earlier.
2. There's an optimization in rs6000_legitimize_reload_address that
tries to add the low part of an constant pool address inside the load
instruction. This doesn't work for TFmode, since the low part is
not offsettable.
Bug (2) was visible in a testsuite run with -mlong-double-128 (it
caused ieee/conversion.c to ICE), and bug (1) is visible with the
fix to bug (2).
Bootstrapped & tested on powerpc-darwin, and an extra dejagnu run with
-mlong-double-128.
--
- Geoffrey Keating <geoffk@apple.com>
===File ~/patches/rs6000-longdouble-legit.patch=============
2004-01-08 Geoffrey Keating <geoffk@apple.com>
* config/rs6000/rs6000.c (legitimate_lo_sum_address_p): lo_sum
addresses are legitimate on Darwin even when flag_pic.
(rs6000_legitimize_reload_address) [TARGET_MACHO]: Don't create
non-offsettable addresses for loads of TFmode constants.
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.565
diff -u -p -u -p -r1.565 rs6000.c
--- config/rs6000/rs6000.c 31 Dec 2003 00:25:51 -0000 1.565
+++ config/rs6000/rs6000.c 8 Jan 2004 21:45:01 -0000
@@ -2528,7 +2528,7 @@ legitimate_lo_sum_address_p (enum machin
if (TARGET_ELF || TARGET_MACHO)
{
- if (DEFAULT_ABI != ABI_AIX && flag_pic)
+ if (DEFAULT_ABI != ABI_AIX && DEFAULT_ABI != ABI_DARWIN && flag_pic)
return false;
if (TARGET_TOC)
return false;
@@ -3019,36 +3019,30 @@ rs6000_legitimize_reload_address (rtx x,
if (GET_CODE (x) == SYMBOL_REF
&& DEFAULT_ABI == ABI_DARWIN
&& !ALTIVEC_VECTOR_MODE (mode)
- && flag_pic)
+ && (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
+ /* Don't do this for TFmode, since the result isn't offsettable. */
+ && mode != TFmode)
{
- /* Darwin load of floating point constant. */
- rtx offset = gen_rtx (CONST, Pmode,
- gen_rtx (MINUS, Pmode, x,
- gen_rtx (SYMBOL_REF, Pmode,
- machopic_function_base_name ())));
- x = gen_rtx (LO_SUM, GET_MODE (x),
- gen_rtx (PLUS, Pmode, pic_offset_table_rtx,
- gen_rtx (HIGH, Pmode, offset)), offset);
+ if (flag_pic)
+ {
+ rtx offset = gen_rtx_CONST (Pmode,
+ gen_rtx_MINUS (Pmode, x,
+ gen_rtx_SYMBOL_REF (Pmode,
+ machopic_function_base_name ())));
+ x = gen_rtx_LO_SUM (GET_MODE (x),
+ gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
+ gen_rtx_HIGH (Pmode, offset)), offset);
+ }
+ else
+ x = gen_rtx_LO_SUM (GET_MODE (x),
+ gen_rtx_HIGH (Pmode, x), x);
+
push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
- BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
- opnum, (enum reload_type)type);
+ BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
+ opnum, (enum reload_type)type);
*win = 1;
return x;
}
- if (GET_CODE (x) == SYMBOL_REF
- && DEFAULT_ABI == ABI_DARWIN
- && !ALTIVEC_VECTOR_MODE (mode)
- && MACHO_DYNAMIC_NO_PIC_P)
- {
- /* Darwin load of floating point constant. */
- x = gen_rtx (LO_SUM, GET_MODE (x),
- gen_rtx (HIGH, Pmode, x), x);
- push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
- BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
- opnum, (enum reload_type)type);
- *win = 1;
- return x;
- }
#endif
if (TARGET_TOC
&& constant_pool_expr_p (x)
============================================================