[PATCH] Fix PR69291, RTL if-conversion bug
Richard Sandiford
rdsandiford@googlemail.com
Mon Feb 15 18:44:00 GMT 2016
Richard Biener <rguenther@suse.de> writes:
> On Wed, 10 Feb 2016, Bernd Schmidt wrote:
>
>> On 02/10/2016 02:50 PM, Richard Biener wrote:
>> > On Wed, 10 Feb 2016, Bernd Schmidt wrote:
>> >
>> > > On 02/10/2016 02:35 PM, Richard Biener wrote:
>> > >
>> > > > Index: gcc/ifcvt.c
>> > > > ===================================================================
>> > > > --- gcc/ifcvt.c (revision 233262)
>> > > > +++ gcc/ifcvt.c (working copy)
>> > > > @@ -1274,7 +1274,8 @@ noce_try_store_flag_constants (struct no
>> > > > && CONST_INT_P (XEXP (a, 1))
>> > > > && CONST_INT_P (XEXP (b, 1))
>> > > > && rtx_equal_p (XEXP (a, 0), XEXP (b, 0))
>> > > > - && noce_operand_ok (XEXP (a, 0))
>> > > > + && (REG_P (XEXP (a, 0))
>> > > > + || ! reg_mentioned_p (if_info->x, XEXP (a, 0)))
>> > >
>> > > I guess that would also work. Could maybe use a brief comment.
>> >
>> > Ok. I'm testing that. I wonder if we need to use reg_overlap_mentioned_p
>> > here (hard-reg pairs?) or if reg_mentioned_p is safe.
>>
>> Let's go with reg_overlap_mentioned_p. I kind of forgot about that once I
>> thought of possible issues with emitting a move :-(
>
> Ok, the following is in testing now.
>
> Ok?
>
> Thanks,
> Richard.
>
> 2016-02-10 Richard Biener <rguenther@suse.de>
>
> PR rtl-optimization/69291
> * ifcvt.c (noce_try_store_flag_constants): Do not allow
> subexpressions affected by changing the result.
>
> Index: gcc/ifcvt.c
> ===================================================================
> --- gcc/ifcvt.c (revision 233262)
> +++ gcc/ifcvt.c (working copy)
> @@ -1274,7 +1274,10 @@ noce_try_store_flag_constants (struct no
> && CONST_INT_P (XEXP (a, 1))
> && CONST_INT_P (XEXP (b, 1))
> && rtx_equal_p (XEXP (a, 0), XEXP (b, 0))
> - && noce_operand_ok (XEXP (a, 0))
> + /* Allow expressions that are not using the result or plain
> + registers where we handle overlap below. */
> + && (REG_P (XEXP (a, 0))
> + || ! reg_overlap_mentioned_p (if_info->x, XEXP (a, 0)))
> && if_info->branch_cost >= 2)
Sorry if this has already been covered, but shouldn't we be adding
to the noce_operand_ok check rather than replacing it? I think we
still want to check side_effects_p and may_trap_p.
Thanks,
Richard
More information about the Gcc-patches
mailing list