Summary: | ICE (spill_failure): unable to find a register to spill in class 'AREG' with -O -fschedule-insns -fselective-scheduling | ||
---|---|---|---|
Product: | gcc | Reporter: | Zdenek Sojka <zsojka> |
Component: | rtl-optimization | Assignee: | Andrey Belevantsev <abel> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | abel, izamyatin |
Priority: | P3 | Keywords: | ice-on-valid-code |
Version: | 4.8.0 | ||
Target Milestone: | --- | ||
Host: | x86_64-pc-linux-gnu | Target: | x86_64-pc-linux-gnu |
Build: | Known to work: | ||
Known to fail: | 4.4.7, 4.5.4, 4.6.4, 4.7.2, 4.8.0 | Last reconfirmed: | 2012-10-04 00:00:00 |
Attachments: | reduced testcase |
Description
Zdenek Sojka
2012-09-03 18:04:23 UTC
This is the problem with scheduler, where insns involving hard registers are moved around. This part should be fixed by the WIP patch at [1]. [1] http://gcc.gnu.org/ml/gcc-patches/2012-08/msg00810.html 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? (In reply to comment #2) > 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). (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? (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; } } Have you managed to check the patch? (In reply to comment #6) > Have you managed to check the patch? The patch does the right thing for sets and clobbers, but the uses case should be amended, too, judging from the sched-deps.c code. Sorry, I was too busy to send the patch, now, I'll try doing this on the next week. Author: abel Date: Fri Nov 9 12:28:21 2012 New Revision: 193358 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=193358 Log: PR rtl-optimization/54472 * sel-sched-ir.c (has_dependence_note_reg_set): Handle implicit sets. (has_dependence_note_reg_clobber, has_dependence_note_reg_use): Likewise. * gcc.dg/pr54472.c: New test. Added: trunk/gcc/testsuite/gcc.dg/pr54472.c Modified: trunk/gcc/ChangeLog trunk/gcc/sel-sched-ir.c trunk/gcc/testsuite/ChangeLog Fixed on trunk, backports to 4.7/4.6 are needed. So are we going to backport this one? (In reply to comment #10) > So are we going to backport this one? Sorry, I've missed this one when backporting other stuff. I can do this tomorrow, the patch is safe. However, the branch is frozen now, we need to ask Richi for approval to squeeze it into the next 4.7 release. 4.7 is not maintained anymore. |