[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