http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55889
Andrey Belevantsev <abel at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |vmakarov at gcc dot gnu.org
--- Comment #21 from Andrey Belevantsev <abel at gcc dot gnu.org> 2013-01-23
11:11:22 UTC ---
Thanks again folks, it's much simpler with gdb. So the reason of the
difference that shows up in the ICE is the ira_implicitly_set_insn_hard_regs
function. Recall that we have insns 23 and 24 like this:
23: r148:SI=[unspec[`*LC..2',%2:SI] 44]
24: %3:SI=[unspec[`*LCM..2',%2:SI] 44]
and insn 17 like this:
17: {%3:SI=unspec[%3:SI,%4:SI] 25;clobber %0:SI;clobber %4:SI;clobber
%5:SI;clobber %11:SI;clobber %0:CC;clobber lr:SI;}
The dependency between insns 23 and 17 is because insn 17 clobbers reg 65 (I
guess it is lr in the dump). When analyzing insn 23,
ira_implicitly_set_insn_hard_regs is called and it notices we have a pseudo-reg
148. The function attempts to restrict the insn movement by marking the
registers that might be required by the "strict" alternatives of the insn as
implicit clobbers. For insn 23 it marks reg 65 from LINK_REGS ('l' constraint)
and reg 66 from CTR_REGS ('c' constraint AFAIR). Now we have an
anti-dependency via clobbering reg 65 with insn 17.
Insn 24 already has the hard register assigned (%3), so the above logic does
not apply and we don't get the implicit clobbers on this insn and thus a
dependency with insn 17.
In short, the implicit clobbers thing disagrees with the assumption sel-sched
mades: that renaming a hard register to a pseudo is always possible given that
the resulting insn is recognized and will never create extra dependencies.
So the choices we have are as follows:
1) make the if (! reload_completed) at sched-deps.c:2805 also conditional on
-fsched-pressure and make sel-sched incompatible with -fsched-pressure by
disallowing to specify both options at the same time. That is,
-fselective-scheduling will disable -fsched-pressure with a note to the user.
2) make the selective scheduler account for the situation when renaming a hard
register to a pseudo register before reload with sched-pressure enabled might
create extra dependencies, then insn 24 will never be considered for renaming
and the problem will be fixed.
I can do either 1 or 2, no problem with any of those given enough time until
4.8.
Thoughts?