[PATCH] Fix PR69291, RTL if-conversion bug

Bernd Schmidt bschmidt@redhat.com
Wed Feb 10 13:30:00 GMT 2016


On 02/10/2016 02:04 PM, Richard Biener wrote:
> where noce_try_store_flag_constants identifies
>
> (plus:SI (reg/v:SI 160 [ mod_tlen ])
>           (reg/v:SI 224 [ <retval> ]))
>
> as "common" and then tries to detect the case where setting the
> result would clobber that value.  It doesn't seem to expect
> anything else than regs that can be equal to the destination though
> which is clearly an oversight.

>         /* If we have x := test ? x + 3 : x + 4 then move the original
>   	 x out of the way while we store flags.  */
> -      if (common && rtx_equal_p (common, if_info->x))
> +      if (common && reg_mentioned_p (if_info->x, common))
>   	{
> -	  common = gen_reg_rtx (mode);
> -	  noce_emit_move_insn (common, if_info->x);
> +	  rtx tem = gen_reg_rtx (mode);
> +	  noce_emit_move_insn (tem, common);
> +	  common = tem;
>   	}

I'm not so sure noce_emit_move_insn will reliably handle an arbitrary 
expression. I think a more conservative fix would be to disable this 
transform if common is not a reg.


Bernd



More information about the Gcc-patches mailing list