https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88784

--- Comment #11 from Qi Feng <ffengqi at gcc dot gnu.org> ---
I tried 2 patterns for the following test

  /* 1. x >  y  &&  x != 0     -->     x > y  */
  /* 2. y <  x  &&  x != 0     -->     y < x  */
  /* 3. x != 0  &&  x >  y     -->     x > y  */
  /* 4. x != 0  &&  y <  x     -->     y < x  */

  _Bool f1 (unsigned x, unsigned y)
  {
    return x >  y  &&  x != 0;
  }

  _Bool f2 (unsigned x, unsigned y)
  {
    return y <  x  &&  x != 0;
  }

  _Bool f3 (unsigned x, unsigned y)
  {
    return x != 0  &&  x >  y;
  }

  _Bool f4 (unsigned x, unsigned y)
  {
    return x != 0  &&  y <  x;
  }

The first one is

  (for and (truth_and bit_and)
    (simplify
     (and:c (gt:c@2 @0 @1) (ne @0 integer_zerop))
      (if (INTEGRAL_TYPE_P (TREE_TYPE(@0)) && TYPE_UNSIGNED (TREE_TYPE(@0))
           && INTEGRAL_TYPE_P (TREE_TYPE(@1)) && TYPE_UNSIGNED (TREE_TYPE(@1)))
       @2)))

The transformations did not happen as I checked the dump files of
-fdump-tree-{original,optimized}.

And the second one is

  (simplify
   (truth_andif:C (gt:c@2 @0 @1) (ne @0 integer_zerop))
    (if (INTEGRAL_TYPE_P (TREE_TYPE(@0)) && TYPE_UNSIGNED (TREE_TYPE(@0))
         && INTEGRAL_TYPE_P (TREE_TYPE(@1)) && TYPE_UNSIGNED (TREE_TYPE(@1)))
     @2))

The transformations did happen for all the 4 functions. And the dump of
-fdump-tree-original showes they already happened, so I guess the pattern is
matched before the process get to GIMPLE.

Reply via email to