------- Comment #6 from jakub at gcc dot gnu dot org 2010-05-05 18:00 ------- Created an attachment (id=20566) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=20566&action=view) gcc46-pr43994.patch
I must say I don't understand why this happens, but in this case DF_REF_REAL_REG is a (reg:DI 112 r32) while *DF_REF_REAL_LOC is (reg/v:SI 112 r32 [orig:369 up ] [369]) (perhaps a subreg has been simplified or something). Alex' code uses DF_REF_REAL_REG to find the largest reg's mode (that's not wrong in this case as DF_REAL_REG's mode is larger) but also that mode when deciding whether to create a subreg or not. So we end up with debug_insn containing var_location for SImode D#2 set from DImode D#3. The attached patch cures it, but is otherwise untested. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43994