This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

ICE in propagate_one_insn. Bug in my port?


I get an ICE at propagate_one_insn for the following reason:

My port is 32-bit.

GCC creates a DI pseudo.

All moves to/from DI are broken into SI moves in the define_expand for "movdi".

Accesses to the pieces of the DI pseudo occur through SI subregs.  

As optimization progresses, subreg 0 (most-significant) is discarded
as it is unused, leaving subreg 1 (least significant), which is used.

global_alloc>reload>mark_home_live marks the DI pseudo as live, and
thus both hard subregs allocated to the DI are marked as live.

My port's expand_prologue sees non-zero `regs_ever_live [x]' for both
SI hard subregs allocated to the DI.

life_analysis notes that the first SI hard reg is unused, so tries
to delete the prologue insn that saves it on the stack, but aborts
on the assertion in propagate_one_insn because there's no
REG_MAYBE_DEAD note on the unused SI subreg 0.

A brute force fix would be to mark all prologue register saves with
REG_MAYBE_DEAD.  What might be a fix with finesse?

Greg


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]