This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/54472] ICE (spill_failure): unable to find a register to spill in class 'AREG' with -O -fschedule-insns -fselective-scheduling
- From: "abel at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 04 Oct 2012 12:43:36 +0000
- Subject: [Bug rtl-optimization/54472] ICE (spill_failure): unable to find a register to spill in class 'AREG' with -O -fschedule-insns -fselective-scheduling
- Auto-submitted: auto-generated
- References: <bug-54472-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54472
Andrey Belevantsev <abel at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2012-10-04
AssignedTo|unassigned at gcc dot |abel at gcc dot gnu.org
|gnu.org |
Ever Confirmed|0 |1
--- Comment #5 from Andrey Belevantsev <abel at gcc dot gnu.org> 2012-10-04 12:43:36 UTC ---
(In reply to comment #4)
> (In reply to comment #3)
> > > For some reason, -fselective-scheduling is moving
> > >
> > > (insn 19 16 22 2 (use (reg/i:SI 0 ax)) testcase.c:6 -1
> > > (nil))
> > >
> > > around. This insn marks function return, so IMO should be at the function exit
> > > all the time. -fschedule-insns (without -fselective-scheduling) leaves the insn
> > > at the function exit. Is it OK to move this marker around?
> >
> > I will take a look but I'm out of office until Friday at least (maybe Monday).
>
> Any progress on this?
Sorry Uros, I forgot about this. I took a look, the reason is actually in
selective scheduler not handling implicit_sets (we miss dependencies between
implicit_sets register sets and other sets/clobbers). In this example, we miss
a dependency between insns 9 and 16 and thus schedule insn #16 earlier than
insn #9 and then its dependent insn #19 earlier than insn #9. Thus we are
moving the return mark before the actual function code.
The below patch fixes the test case for me. I need to double-check whether I
have caught all cases of implicit_sets generating dependencies in sched-deps.c
and then I will submit the patch for review.
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index e7ca3f1..0fbfdbe 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -3185,7 +3185,7 @@ has_dependence_note_reg_set (int regno)
|| reg_last->clobbers != NULL)
*dsp = (*dsp & ~SPECULATIVE) | DEP_OUTPUT;
- if (reg_last->uses)
+ if (reg_last->uses || reg_last->implicit_sets)
*dsp = (*dsp & ~SPECULATIVE) | DEP_ANTI;
}
}
@@ -3205,7 +3205,7 @@ has_dependence_note_reg_clobber (int regno)
if (reg_last->sets)
*dsp = (*dsp & ~SPECULATIVE) | DEP_OUTPUT;
- if (reg_last->uses)
+ if (reg_last->uses || reg_last->implicit_sets)
*dsp = (*dsp & ~SPECULATIVE) | DEP_ANTI;
}
}