]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/50340 (Fails to build SPEC 2000 176.gcc)
authorAlexander Monakov <amonakov@gcc.gnu.org>
Wed, 19 Oct 2011 12:46:44 +0000 (16:46 +0400)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Wed, 19 Oct 2011 12:46:44 +0000 (16:46 +0400)
2011-10-19  Andrey Belevantsev  <abel@ispras.ru>

PR rtl-optimization/50340
* sel-sched-ir.c (update_target_availability): LHS register
availability is not known if the unavailable LHS of the other
expression is a different register.

* gcc.dg/pr50340.c: New.

From-SVN: r180186

gcc/ChangeLog
gcc/sel-sched-ir.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr50340.c [new file with mode: 0644]

index 115c5d920c191cfb5449d6c332c070a364d8debf..4a3bc7502748d797cd4b90cfcb507b84a1f48006 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-19  Andrey Belevantsev  <abel@ispras.ru>
+
+       PR rtl-optimization/50340
+       * sel-sched-ir.c (update_target_availability): LHS register
+       availability is not known if the unavailable LHS of the other
+       expression is a different register.
+
 2011-10-19  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        PR target/50310
index 4878460f8824a089d0d834c747787e01834e0611..dacee0b9e9bd5ccf98f671e8f911a6ed52c386c0 100644 (file)
@@ -1745,6 +1745,11 @@ update_target_availability (expr_t to, expr_t from, insn_t split_point)
           else
             EXPR_TARGET_AVAILABLE (to) = -1;
         }
+      else if (EXPR_TARGET_AVAILABLE (from) == 0
+              && EXPR_LHS (from)
+              && REG_P (EXPR_LHS (from))
+              && REGNO (EXPR_LHS (to)) != REGNO (EXPR_LHS (from)))
+       EXPR_TARGET_AVAILABLE (to) = -1;
       else
         EXPR_TARGET_AVAILABLE (to) &= EXPR_TARGET_AVAILABLE (from);
     }
index 2ed54293ab43873748908b916fdadd3c810643e3..72c85cdebaedfd84cc8660a8d03ee3c85fc4244a 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-19  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR rtl-optimization/50340
+       * gcc.dg/pr50340.c: New.
+
 2011-10-18  Andrew Stubbs  <ams@codesourcery.com>
 
        PR tree-optimization/50717
diff --git a/gcc/testsuite/gcc.dg/pr50340.c b/gcc/testsuite/gcc.dg/pr50340.c
new file mode 100644 (file)
index 0000000..1843036
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O3 -fselective-scheduling2 -funroll-loops" } */
+extern int mode_size[];
+typedef unsigned HARD_REG_SET[ ((64 + 32 - 1) / 32) ];
+enum reload_type {
+  RELOAD_FOR_INPUT,
+  RELOAD_FOR_OUTPUT,
+  RELOAD_FOR_INSN,
+  RELOAD_FOR_INPUT_ADDRESS,
+  RELOAD_FOR_OUTPUT_ADDRESS,
+  RELOAD_FOR_OPERAND_ADDRESS,
+  RELOAD_FOR_OPADDR_ADDR,
+  RELOAD_OTHER,
+  RELOAD_FOR_OTHER_ADDRESS
+};
+static HARD_REG_SET reload_reg_used;
+static HARD_REG_SET reload_reg_used_in_input_addr[10];
+static HARD_REG_SET reload_reg_used_in_output_addr[10];
+static HARD_REG_SET reload_reg_used_in_input[10];
+static HARD_REG_SET reload_reg_used_in_output[10];
+static HARD_REG_SET reload_reg_used_in_op_addr;
+static HARD_REG_SET reload_reg_used_in_op_addr_reload;
+static HARD_REG_SET reload_reg_used_in_insn;
+static HARD_REG_SET reload_reg_used_in_other_addr;
+static HARD_REG_SET reload_reg_used_at_all;
+void __attribute__((cold)) mark_reload_reg_in_use (regno, opnum, type, mode)
+{
+  int nregs = regno ? 1 : mode_size[mode];
+  int i;
+  for (i = regno; i < nregs + regno; i++)
+  {
+    switch (type)
+    {
+      case RELOAD_OTHER: reload_reg_used[i / 32u] |= 1 << i % 32u; break;
+      case RELOAD_FOR_INPUT_ADDRESS: reload_reg_used_in_input_addr[opnum][i / 32u] |= 1 << i % 32u; break;
+      case RELOAD_FOR_OUTPUT_ADDRESS: reload_reg_used_in_output_addr[opnum][i / 32u] |= 1 << i % 32u; break;
+      case RELOAD_FOR_OPERAND_ADDRESS: reload_reg_used_in_op_addr[i / 32u] |= 1 << i % 32u; break;
+      case RELOAD_FOR_OPADDR_ADDR: reload_reg_used_in_op_addr_reload[i / 32u] |= 1 << i % 32u; break;
+      case RELOAD_FOR_OTHER_ADDRESS: reload_reg_used_in_other_addr[i / 32u] |= 1; break;
+      case RELOAD_FOR_INPUT: reload_reg_used_in_input[opnum][i / 32u] |= 1 << i % 32u; break;
+      case RELOAD_FOR_OUTPUT: reload_reg_used_in_output[opnum][i / 32u] |= 1 << i % 32u; break;
+      case RELOAD_FOR_INSN: reload_reg_used_in_insn[i / 32u] |= 1 << i % 32u;
+    }
+    reload_reg_used_at_all[i / 32u] |= 1 << i;
+  }
+}