Commit ea3f6aa8 by Alexander Monakov Committed by Alexander Monakov

re PR rtl-optimization/50205 (ICE: in code_motion_path_driver, at…

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
parent 748c5114
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
......@@ -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;
......
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
......
/* { 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 ();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment