re PR target/63534 (Bootstrap failure on x86_64/i686-linux)
authorEvgeny Stupachenko <evstupac@gmail.com>
Thu, 23 Oct 2014 16:52:11 +0000 (16:52 +0000)
committerIlya Verbin <iverbin@gcc.gnu.org>
Thu, 23 Oct 2014 16:52:11 +0000 (16:52 +0000)
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
gcc/cse.c
gcc/dce.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr63618.c [new file with mode: 0644]

index 92303ccb9840233d678acb6872ccaaf4e31346ad..70f6e0db9f50dc28e16254608f847338f6a62ab0 100644 (file)
@@ -1,3 +1,11 @@
+2014-10-23  Evgeny Stupachenko  <evstupac@gmail.com>
+
+       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  <avr@gjlay.de>
 
        * config/avr/avr.c: Fix GNU coding rules and typos.
index 8ad1eff8ba6f17a36c389d3580cc5393cd3604fe..80c43beccf1bbb6642419e2a55f80f6c203194a5 100644 (file)
--- 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.
index 5b7d36ee15671911190917b443058862a375b749..a52a59c604d4f7ff8f65bb1929a1486e84ea069c 100644 (file)
--- 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))
index 48ef70d78d66fa37af43f7e912915ce09b630756..e5105419355aa5fea5d7b129dd4bd10ceda3e0ad 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-23  Evgeny Stupachenko  <evstupac@gmail.com>
+
+       PR target/63618
+       * gcc.target/i386/pr63618.c: New test.
+
 2014-10-23  Marek Polacek  <polacek@redhat.com>
 
        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 (file)
index 0000000..70e1ee4
--- /dev/null
@@ -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);
+}