[PARCH 2/2, x86, PR63534] Fix darwin bootstrap
Evgeny Stupachenko
evstupac@gmail.com
Wed Oct 22 15:58:00 GMT 2014
There is a test for Linux x86 that also fails without the changes in the patch:
ChangeLog:
2014-10-22 Evgeny Stupachenko <evstupac@gmail.com>
PR rtl-optimization/63618
* gcc.target/i386/pr63618.c: New.
diff --git a/gcc/testsuite/gcc.target/i386/pr63618.c
b/gcc/testsuite/gcc.target/i386/pr63618.c
new file mode 100644
index 0000000..cf10a2b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr63618.c
@@ -0,0 +1,34 @@
+/* PR rtl-optimization/63618 */
+/* { dg-do run } */
+/* { dg-require-effective-target sse4 } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-options "-O2 -msse4.2 -mtune=corei7 -fno-inline -fPIC" } */
+
+static const __float128 cf = 0.1E+10Q;
+
+__float128
+f128_square(__float128 x)
+{
+ return x * x;
+}
+
+__float128
+f128_p3(__float128 x)
+{
+ return x * x * x;
+}
+
+__float128
+cond_f128_square (__float128 x, int p)
+{
+ x = f128_p3 (x);
+ if (p)
+ x = f128_square(cf);
+ return x;
+}
+
+int main()
+{
+ __float128 x = cond_f128_square (cf, 1);
+ return (int)(x < cf);
+}
On Fri, Oct 17, 2014 at 6:16 PM, Evgeny Stupachenko <evstupac@gmail.com> wrote:
> Hi,
>
> Some instructions (like one in PR63534) could have hidden use of PIC register.
> Therefore we need to leave SET_GOT not deleted till reload completed.
> The patch prevents SET_GOT from deleting while PIC register is pseudo.
>
> Is it ok?
>
> ChangeLog:
>
> 2014-10-17 Evgeny Stupachenko <evstupac@gmail.com>
>
> PR target/63534
> * cse.c (delete_trivially_dead_insns): Consider PIC register is used
> while it is pseudo.
> * dse.c (deletable_insn_p): Likewise.
>
> diff --git a/gcc/cse.c b/gcc/cse.c
> index be2f31b..062ba45 100644
> --- a/gcc/cse.c
> +++ b/gcc/cse.c
> @@ -6953,6 +6953,11 @@ delete_trivially_dead_insns (rtx_insn *insns, int nreg)
> /* If no debug insns can be present, COUNTS is just an array
> which counts how many times each pseudo is used. */
> }
> + /* Pseudo PIC register should be considered as used due to possible
> + new usages generated. */
> + if (pic_offset_table_rtx
> + && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
> + counts[REGNO (pic_offset_table_rtx)]++;
> /* Go from the last insn to the first and delete insns that only set unused
> registers or copy a register to itself. As we delete an insn, remove
> usage counts for registers it uses.
> diff --git a/gcc/dce.c b/gcc/dce.c
> index 5b7d36e..a52a59c 100644
> --- a/gcc/dce.c
> +++ b/gcc/dce.c
> @@ -127,6 +127,10 @@ deletable_insn_p (rtx_insn *insn, bool fast,
> bitmap arg_stores)
> if (HARD_REGISTER_NUM_P (DF_REF_REGNO (def))
> && global_regs[DF_REF_REGNO (def)])
> return false;
> + /* Initialization of pseudo PIC register should never be removed. */
> + else if (DF_REF_REG (def) == pic_offset_table_rtx
> + && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
> + return false;
>
> body = PATTERN (insn);
> switch (GET_CODE (body))
More information about the Gcc-patches
mailing list