[4.1] Fix PR rtl-optimization/29329
Richard Sandiford
richard@codesourcery.com
Wed Jan 24 08:27:00 GMT 2007
Eric Botcazou <ebotcazou@libertysurf.fr> writes:
> This is yet another ICE related to REG_NOTES handling in the combiner, a
> regression present at -O2 on the 4.1 branch for the ARM architecture.
>
> The combiner is passed
>
> (insn 55 54 102 6 (set (reg/v:SI 107 [ j ])
> (plus:SI (reg/v:SI 107 [ j ])
> (const_int 1 [0x1]))) 4 {*arm_addsi3} (nil)
> (expr_list:REG_EQUAL (const_int 3 [0x3])
> (nil)))
>
> (insn 102 55 115 6 (set (reg:SI 124)
> (ashift:SI (reg/v:SI 107 [ j ])
> (const_int 2 [0x2]))) 98 {*arm_shiftsi3} (insn_list:REG_DEP_TRUE
> 55 (nil))
> (expr_list:REG_DEAD (reg/v:SI 107 [ j ])
> (expr_list:REG_EQUAL (const_int 12 [0xc])
> (nil))))
>
> It will first try to directly replace the source of insn 102 by the
> destination of insn 55, but the result fails to validate. Then it will
> try again, after having replaced the source of insn 55 by the contents of the
> REG_EQUAL note, and the result this time validates.
>
> Things go awry when distribute_notes is asked to find a new position for the
> REG_DEAD note because (reg/v:SI 107) is considered the eliminated register so
> the note is ditched without further ado. Now (reg/v:SI 107) was formally
> live on entry of the basic block and life2 expects it to be still live after
> combine, so it stops the compiler.
>
> This REG_EQUAL + REG_DEAD game has been already "studied" by Richard S. and me
> and we agreed that the best solution is implemented by
>
> 2007-01-06 Richard Sandiford <richard@codesourcery.com>
>
> Backport from mainline:
> 2006-05-23 Richard Sandiford <richard@codesourcery.com>
>
> PR rtl-optimization/27736
> * combine.c (replaced_rhs_value): New variable.
> (combine_instructions): Set it.
> (distribute_notes): When distributing a note in replaced_rhs_insn,
> check whether the value was used in replaced_rhs_value.
>
> 2006-05-22 Richard Sandiford <richard@codesourcery.com>
>
> PR rtl-optimization/25514
> * combine.c (replaced_rhs_insn): New variable.
> (combine_instructions): Set replaced_rhs_insn when trying to replace
> a SET_SRC with a REG_EQUAL note.
> (distribute_notes): Use replaced_rhs_insn when determining the live
> range of a REG_DEAD register.
>
> that Richard recently backported to the 4.1 branch. Therefore the fix
> builds on Richard's work to avoid ditching REG_DEAD notes when they
> pertain to the source of the insn to which the REG_EQUAL note is
> attached.
I'm probably misunderstanding something here, but doesn't that mean you
end up with a REG_DEAD note for register 107 attached to an insn that
doesn't actually use register 107? If so, that seems wrong. I thought
the correct fix would be to cause the life info to be updated.
Richard
More information about the Gcc-patches
mailing list