This is a regression present on mainline and 9/8 branches: there is a segfault
in one of the tests of the GMP testsuite when the compiler is configured with
PIE by default. The bug only affects a test, i.e. not the library itself, and
has been introduced when the PIC register was turned into a pseudo-register.
Bootstrapped/regtested on SPARC64/Linux, applied on mainline and 9/8 branches.
2019-09-01 Eric Botcazou <ebotca...@adacore.com>
PR target/91472
* config/sparc/sparc.c (sparc_cannot_force_const_mem): Return true
during LRA/reload in PIC mode if the PIC register hasn't been used yet.
(sparc_pic_register_p): Test reload_in_progress for consistency's sake.
2019-09-01 Eric Botcazou <ebotca...@adacore.com>
* gcc.c-torture/execute/20190901-1.c: New test.
--
Eric Botcazou
/* PR target/91472 */
/* Reported by John Paul Adrian Glaubitz <glaub...@physik.fu-berlin.de> */
typedef unsigned int gmp_uint_least32_t;
union ieee_double_extract
{
struct
{
gmp_uint_least32_t sig:1;
gmp_uint_least32_t exp:11;
gmp_uint_least32_t manh:20;
gmp_uint_least32_t manl:32;
} s;
double d;
};
double __attribute__((noipa))
tests_infinity_d (void)
{
union ieee_double_extract x;
x.s.exp = 2047;
x.s.manl = 0;
x.s.manh = 0;
x.s.sig = 0;
return x.d;
}
int
main (void)
{
double x = tests_infinity_d ();
if (x == 0.0)
__builtin_abort ();
return 0;
}
Index: config/sparc/sparc.c
===================================================================
--- config/sparc/sparc.c (revision 275068)
+++ config/sparc/sparc.c (working copy)
@@ -4201,6 +4201,13 @@ eligible_for_sibcall_delay (rtx_insn *tr
static bool
sparc_cannot_force_const_mem (machine_mode mode, rtx x)
{
+ /* After IRA has run in PIC mode, it is too late to put anything into the
+ constant pool if the PIC register hasn't already been initialized. */
+ if ((lra_in_progress || reload_in_progress)
+ && flag_pic
+ && !crtl->uses_pic_offset_table)
+ return true;
+
switch (GET_CODE (x))
{
case CONST_INT:
@@ -4450,7 +4457,7 @@ sparc_pic_register_p (rtx x)
return true;
if (!HARD_REGISTER_P (pic_offset_table_rtx)
- && (HARD_REGISTER_P (x) || lra_in_progress)
+ && (HARD_REGISTER_P (x) || lra_in_progress || reload_in_progress)
&& ORIGINAL_REGNO (x) == REGNO (pic_offset_table_rtx))
return true;