aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJie Zhang <jie@codesourcery.com>2010-10-23 00:38:13 +0000
committerJie Zhang <jiez@gcc.gnu.org>2010-10-23 00:38:13 +0000
commit646e6f415ca6b02142132ebb82c8b11f08d2464f (patch)
treef19a82621c5689bbcd86c5c3323f03caa5df1ea5
parent61a796b1698be252fa2834f1da96bbc55da05b22 (diff)
downloadgcc-646e6f415ca6b02142132ebb82c8b11f08d2464f.zip
gcc-646e6f415ca6b02142132ebb82c8b11f08d2464f.tar.gz
gcc-646e6f415ca6b02142132ebb82c8b11f08d2464f.tar.bz2
re PR rtl-optimization/37360 (ICE in haifa-sched.c when compiling __popcountsi2 from libgcc)
PR rtl-optimization/37360 * config/mips/mips.c (cached_can_issue_more): New local variable. (mips_sched_reorder_1): New. (mips_sched_reorder): Use mips_sched_reorder_1. (mips_sched_reorder2): New. (mips_variable_issue): Set cached_can_issue_more. (TARGET_SCHED_REORDER2): Define to mips_sched_reorder2 instead of mips_sched_reorder. Revert 2008-09-09 Andrey Belevantsev <abel@ispras.ru> PR rtl-optimization/37360 * haifa-sched.c (max_issue): Do not assert that we never issue more insns than issue_rate. Add comment. testsuite/ PR rtl-optimization/37360 * gcc.dg/pr37360.c: New test. From-SVN: r165880
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/config/mips/mips.c33
-rw-r--r--gcc/haifa-sched.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr37360.c21
5 files changed, 72 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 42e4c07..d42ef04 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,20 @@
+2010-10-23 Jie Zhang <jie@codesourcery.com>
+
+ PR rtl-optimization/37360
+ * config/mips/mips.c (cached_can_issue_more): New local variable.
+ (mips_sched_reorder_1): New.
+ (mips_sched_reorder): Use mips_sched_reorder_1.
+ (mips_sched_reorder2): New.
+ (mips_variable_issue): Set cached_can_issue_more.
+ (TARGET_SCHED_REORDER2): Define to mips_sched_reorder2
+ instead of mips_sched_reorder.
+
+ Revert
+ 2008-09-09 Andrey Belevantsev <abel@ispras.ru>
+ PR rtl-optimization/37360
+ * haifa-sched.c (max_issue): Do not assert that we never issue more
+ insns than issue_rate. Add comment.
+
2010-10-22 Eric Botcazou <ebotcazou@adacore.com>
* gimplify.c (gimplify_variable_sized_compare): Preserve the source
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 881bb78..3dfc59e 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -589,6 +589,10 @@ static const char *mips_hi_relocs[NUM_SYMBOL_TYPES];
/* Target state for MIPS16. */
struct target_globals *mips16_globals;
+/* Cached value of can_issue_more. This is cached in mips_variable_issue hook
+ and returned from mips_sched_reorder2. */
+static int cached_can_issue_more;
+
/* Index R is the smallest register class that contains register R. */
const enum reg_class mips_regno_to_class[FIRST_PSEUDO_REGISTER] = {
LEA_REGS, LEA_REGS, M16_REGS, V1_REG,
@@ -12436,11 +12440,11 @@ mips_sched_init (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
mips_ls2.falu1_turn_p = true;
}
-/* Implement TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2. */
+/* Subroutine used by TARGET_SCHED_REORDER and TARGET_SCHED_REORDER2. */
-static int
-mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
- rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
+static void
+mips_sched_reorder_1 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
+ rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
{
if (!reload_completed
&& TUNE_MACC_CHAINS
@@ -12455,10 +12459,28 @@ mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
if (TUNE_74K)
mips_74k_agen_reorder (ready, *nreadyp);
+}
+/* Implement TARGET_SCHED_REORDER. */
+
+static int
+mips_sched_reorder (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
+ rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
+{
+ mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
return mips_issue_rate ();
}
+/* Implement TARGET_SCHED_REORDER2. */
+
+static int
+mips_sched_reorder2 (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
+ rtx *ready, int *nreadyp, int cycle ATTRIBUTE_UNUSED)
+{
+ mips_sched_reorder_1 (file, verbose, ready, nreadyp, cycle);
+ return cached_can_issue_more;
+}
+
/* Update round-robin counters for ALU1/2 and FALU1/2. */
static void
@@ -12516,6 +12538,7 @@ mips_variable_issue (FILE *file ATTRIBUTE_UNUSED, int verbose ATTRIBUTE_UNUSED,
|| recog_memoized (insn) < 0
|| get_attr_type (insn) != TYPE_MULTI);
+ cached_can_issue_more = more;
return more;
}
@@ -16417,7 +16440,7 @@ mips_shift_truncation_mask (enum machine_mode mode)
#undef TARGET_SCHED_REORDER
#define TARGET_SCHED_REORDER mips_sched_reorder
#undef TARGET_SCHED_REORDER2
-#define TARGET_SCHED_REORDER2 mips_sched_reorder
+#define TARGET_SCHED_REORDER2 mips_sched_reorder2
#undef TARGET_SCHED_VARIABLE_ISSUE
#define TARGET_SCHED_VARIABLE_ISSUE mips_variable_issue
#undef TARGET_SCHED_ADJUST_COST
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index 40f125d..889e3bf 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -2479,14 +2479,7 @@ max_issue (struct ready_list *ready, int privileged_n, state_t state,
/* Init max_points. */
max_points = 0;
more_issue = issue_rate - cycle_issued_insns;
-
- /* ??? We used to assert here that we never issue more insns than issue_rate.
- However, some targets (e.g. MIPS/SB1) claim lower issue rate than can be
- achieved to get better performance. Until these targets are fixed to use
- scheduler hooks to manipulate insns priority instead, the assert should
- be disabled.
-
- gcc_assert (more_issue >= 0); */
+ gcc_assert (more_issue >= 0);
for (i = 0; i < n_ready; i++)
if (!ready_try [i])
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 58bfe38..0d9dabd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-23 Jie Zhang <jie@codesourcery.com>
+
+ PR rtl-optimization/37360
+ * gcc.dg/pr37360.c: New test.
+
2010-10-22 Michael Meissner <meissner@linux.vnet.ibm.com>
* gcc.target/powerpc/ehreturn.c: Fix regexp in dg-final.
diff --git a/gcc/testsuite/gcc.dg/pr37360.c b/gcc/testsuite/gcc.dg/pr37360.c
new file mode 100644
index 0000000..d2ca7f3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr37360.c
@@ -0,0 +1,21 @@
+/* PR rtl-optimization/37360 */
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O3 -fPIC" } */
+
+typedef unsigned int UQItype __attribute__ ((mode (QI)));
+typedef unsigned int USItype __attribute__ ((mode (SI)));
+
+extern const UQItype __popcount_tab[256];
+extern int __popcountsi2 (USItype);
+
+int
+__popcountsi2 (USItype x)
+{
+ int i, ret = 0;
+
+ for (i = 0; i < (4 * 8); i += 8)
+ ret += __popcount_tab[(x >> i) & 0xff];
+
+ return ret;
+}
+