On Mon, May 14, 2018 at 03:07:54PM +0200, Jakub Jelinek wrote:
> On Mon, May 14, 2018 at 02:54:18PM +0200, Uros Bizjak wrote:
> > > --- gcc/config/i386/i386.md.jj  2018-05-11 18:44:32.000000000 +0200
> > > +++ gcc/config/i386/i386.md     2018-05-14 13:50:28.100482520 +0200
> > > @@ -19397,11 +19397,11 @@
> > >               (set (match_dup 0) (match_dup 2))])
> > >     (set (match_dup 1) (match_dup 0))]
> > >    "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
> > > +   && GET_CODE (operands[2]) != MINUS
> > 
> > && COMMUTATIVE_ARITH_P (operands[2])
> 
> That works, but then we should change the peephole2 above it as well.
> MINUS is the only non-commutative plusminuslogic_operator, so it doesn't
> change any behavior.
> 
> BTW, wonder if we shouldn't allow giving peephole2's a name, it is too hard
> to refer to them...
 
It might be too late but I've regtested/bootstrapped this patch on x86_64-linux.

> 2018-05-14  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR target/85756
>       * config/i386/i386.md: Disallow non-commutative arithmetics in
>       last twpeephole for mem {+,-,&,|,^}= x; mem != 0 after cmpelim
>       optimization.  Use COMMUTATIVE_ARITH_P test rather than != MINUS
>       in the peephole2 before it.
> 
>       * gcc.c-torture/execute/pr85756.c: New test.
> 
> --- gcc/config/i386/i386.md.jj        2018-05-11 18:44:32.000000000 +0200
> +++ gcc/config/i386/i386.md   2018-05-14 15:02:48.363662960 +0200
> @@ -19367,7 +19367,7 @@ (define_peephole2
>     (set (match_dup 1) (match_dup 0))
>     (set (reg FLAGS_REG) (compare (match_dup 0) (const_int 0)))]
>    "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
> -   && GET_CODE (operands[2]) != MINUS
> +   && COMMUTATIVE_ARITH_P (operands[2])
>     && peep2_reg_dead_p (3, operands[0])
>     && !reg_overlap_mentioned_p (operands[0], operands[1])
>     && ix86_match_ccmode (peep2_next_insn (2),
> @@ -19397,11 +19397,11 @@ (define_peephole2
>             (set (match_dup 0) (match_dup 2))])
>     (set (match_dup 1) (match_dup 0))]
>    "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
> +   && COMMUTATIVE_ARITH_P (operands[2])
>     && peep2_reg_dead_p (2, operands[0])
>     && !reg_overlap_mentioned_p (operands[0], operands[1])
>     && ix86_match_ccmode (peep2_next_insn (0),
> -                      (GET_CODE (operands[2]) == PLUS
> -                       || GET_CODE (operands[2]) == MINUS)
> +                      GET_CODE (operands[2]) == PLUS
>                        ? CCGOCmode : CCNOmode)"
>    [(parallel [(set (match_dup 3) (match_dup 5))
>             (set (match_dup 1) (match_dup 4))])]
> --- gcc/testsuite/gcc.c-torture/execute/pr85756.c.jj  2018-05-14 
> 13:50:44.384307289 +0200
> +++ gcc/testsuite/gcc.c-torture/execute/pr85756.c     2018-05-14 
> 13:48:17.000000000 +0200
> @@ -0,0 +1,50 @@
> +/* PR target/85756 */
> +
> +#if __CHAR_BIT__ == 8 && __SIZEOF_SHORT__ == 2 && __SIZEOF_INT__ == 4
> +int a, c, *e, f, h = 10;
> +short b;
> +unsigned int p;
> +
> +__attribute__((noipa)) void
> +bar (int a)
> +{
> +  asm volatile ("" : : "r" (a) : "memory");
> +}
> +
> +void
> +foo ()
> +{
> +  unsigned j = 1, m = 430523;
> +  int k, n = 1, *l = &h;
> +lab:
> +  p = m;
> +  m = -((~65535U | j) - n);
> +  f = b << ~(n - 8);
> +  n = (m || b) ^ f;
> +  j = p;
> +  if (p < m)
> +    *l = k < 3;
> +  if (!n)
> +    l = &k;
> +  if (c)
> +    {
> +      bar (a);
> +      goto lab;
> +    }
> +  if (!*l)
> +    *e = 1;
> +}
> +
> +int
> +main ()
> +{
> +  foo ();
> +  return 0;
> +}
> +#else
> +int
> +main ()
> +{
> +  return 0;
> +}
> +#endif
> 
> 
>       Jakub

        Marek

Reply via email to