From 56873e134278518a658a25bb928b473a51f57b95 Mon Sep 17 00:00:00 2001 From: Evgeny Stupachenko Date: Thu, 23 Oct 2014 16:52:11 +0000 Subject: [PATCH] re PR target/63534 (Bootstrap failure on x86_64/i686-linux) PR target/63534 PR target/63618 gcc/ * cse.c (delete_trivially_dead_insns): Consider PIC register is used while it is pseudo. * dse.c (deletable_insn_p): Likewise. gcc/testsuite/ * gcc.target/i386/pr63618.c: New test. From-SVN: r216596 --- gcc/ChangeLog | 8 ++++++ gcc/cse.c | 6 +++++ gcc/dce.c | 4 +++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.target/i386/pr63618.c | 34 +++++++++++++++++++++++++ 5 files changed, 57 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr63618.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 92303ccb984..70f6e0db9f5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2014-10-23 Evgeny Stupachenko + + PR target/63534 + PR target/63618 + * cse.c (delete_trivially_dead_insns): Consider PIC register is used + while it is pseudo. + * dse.c (deletable_insn_p): Likewise. + 2014-10-23 Georg-Johann Lay * config/avr/avr.c: Fix GNU coding rules and typos. diff --git a/gcc/cse.c b/gcc/cse.c index 8ad1eff8ba6..80c43beccf1 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -6957,6 +6957,12 @@ 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 (!reload_completed + && 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 5b7d36ee156..a52a59c604d 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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 48ef70d78d6..e5105419355 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-10-23 Evgeny Stupachenko + + PR target/63618 + * gcc.target/i386/pr63618.c: New test. + 2014-10-23 Marek Polacek PR c/63626 diff --git a/gcc/testsuite/gcc.target/i386/pr63618.c b/gcc/testsuite/gcc.target/i386/pr63618.c new file mode 100644 index 00000000000..70e1ee4b057 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr63618.c @@ -0,0 +1,34 @@ +/* PR target/63618 */ +/* { dg-do run } */ +/* { dg-options "-O2 -mtune=corei7 -fno-inline" } */ +/* { dg-additional-options "-msse4.2" { target sse4 } } */ +/* { dg-additional-options "-fpic" { target 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); +} -- 2.30.2