aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2011-10-18 16:36:16 +0400
committerAlexander Monakov <amonakov@gcc.gnu.org>2011-10-18 16:36:16 +0400
commitea3f6aa86222070d219f0c70a60c2eda779ba306 (patch)
treed81160bdc6decd0db9c1c8ba11fe91db4af9dcda
parent748c5114543cb803cdb494105510217046d20513 (diff)
downloadgcc-ea3f6aa86222070d219f0c70a60c2eda779ba306.zip
gcc-ea3f6aa86222070d219f0c70a60c2eda779ba306.tar.gz
gcc-ea3f6aa86222070d219f0c70a60c2eda779ba306.tar.bz2
re PR rtl-optimization/50205 (ICE: in code_motion_path_driver, at sel-sched.c:6581 with -fselective-scheduling2 and custom flags)
PR rtl-optimization/50205 * sel-sched.c (count_occurrences_1): Simplify on the assumption that p->x is a register. Forbid substitution when the same register is found in a different mode. (count_occurrences_equiv): Assert that 'what' is a register. * gcc.dg/pr50205.c: New. From-SVN: r180135
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/sel-sched.c20
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr50205.c13
4 files changed, 33 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d026022..674d905 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2011-10-18 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/50205
+ * sel-sched.c (count_occurrences_1): Simplify on the assumption that
+ p->x is a register. Forbid substitution when the same register is
+ found in a different mode.
+ (count_occurrences_equiv): Assert that 'what' is a register.
+
2011-10-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/50767
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index f11faca..2af01ae 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -813,18 +813,12 @@ count_occurrences_1 (rtx *cur_rtx, void *arg)
{
rtx_search_arg_p p = (rtx_search_arg_p) arg;
- /* The last param FOR_GCSE is true, because otherwise it performs excessive
- substitutions like
- r8 = r33
- r16 = r33
- for the last insn it presumes r33 equivalent to r8, so it changes it to
- r33. Actually, there's no change, but it spoils debugging. */
- if (exp_equiv_p (*cur_rtx, p->x, 0, true))
- {
- /* Bail out if we occupy more than one register. */
- if (REG_P (*cur_rtx)
- && HARD_REGISTER_P (*cur_rtx)
- && hard_regno_nregs[REGNO(*cur_rtx)][GET_MODE (*cur_rtx)] > 1)
+ if (REG_P (*cur_rtx) && REGNO (*cur_rtx) == REGNO (p->x))
+ {
+ /* Bail out if mode is different or more than one register is used. */
+ if (GET_MODE (*cur_rtx) != GET_MODE (p->x)
+ || (HARD_REGISTER_P (*cur_rtx)
+ && hard_regno_nregs[REGNO(*cur_rtx)][GET_MODE (*cur_rtx)] > 1))
{
p->n = 0;
return 1;
@@ -837,7 +831,6 @@ count_occurrences_1 (rtx *cur_rtx, void *arg)
}
if (GET_CODE (*cur_rtx) == SUBREG
- && REG_P (p->x)
&& (!REG_P (SUBREG_REG (*cur_rtx))
|| REGNO (SUBREG_REG (*cur_rtx)) == REGNO (p->x)))
{
@@ -859,6 +852,7 @@ count_occurrences_equiv (rtx what, rtx where)
{
struct rtx_search_arg arg;
+ gcc_assert (REG_P (what));
arg.x = what;
arg.n = 0;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 411f63e..a883aa5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-10-18 Alexander Monakov <amonakov@ispras.ru>
+
+ PR rtl-optimization/50205
+ * gcc.dg/pr50205.c: New.
+
2011-10-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/50767
diff --git a/gcc/testsuite/gcc.dg/pr50205.c b/gcc/testsuite/gcc.dg/pr50205.c
new file mode 100644
index 0000000..ff523d0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr50205.c
@@ -0,0 +1,13 @@
+/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -fno-cprop-registers -fno-dce -fno-forward-propagate -fselective-scheduling2 -funroll-loops -fno-web" } */
+extern int a[];
+
+void foo (void)
+{
+ int i;
+ for (i = 0; i < 199; i++)
+ {
+ if (a[i] != i)
+ __builtin_abort ();
+ }
+}