diff mbox

Fix PR69291, RTL if-conversion bug

Message ID alpine.LSU.2.11.1602101502410.31122@t29.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Feb. 10, 2016, 2:03 p.m. UTC
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.

Comments

Bernd Schmidt Feb. 11, 2016, 3:06 p.m. UTC | #1
On 02/10/2016 03:03 PM, Richard Biener wrote:
>
> 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.

Ok if it passed.


Bernd
Richard Sandiford Feb. 15, 2016, 6:44 p.m. UTC | #2
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
Richard Biener Feb. 16, 2016, 8:35 a.m. UTC | #3
On Mon, 15 Feb 2016, Richard Sandiford wrote:

> 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.

Whoops, yes.  Testing fix.

Richard.
diff mbox

Patch

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)
     {
       common = XEXP (a, 0);