[Bug tree-optimization/126724] New: The check for SIDE EFFECTS on match patterns should be using expr_no_side_effects_p instead

"pinskia at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126724

            Bug ID: 126724
           Summary: The check for SIDE EFFECTS on match patterns should be
                    using expr_no_side_effects_p  instead
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: internal-improvement, missed-optimization, wrong-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

So the patterns like:
(simplify
 (plus:c @0 (mult:c (minus @1 @0) zero_one_valued_p@2))
 (if (INTEGRAL_TYPE_P (type)
      && (GIMPLE || !TREE_SIDE_EFFECTS (@1)))
  (cond (convert:boolean_type_node @2) @1 @0)))

Checks TREE_SIDE_EFFECTS but those should be expr_no_side_effects_p instead.

The reason is TREE_SIDE_EFFECTS does not handle trapping instructions.
So in this case we start with an unconditional trapping instruction and make it
conditional.



Note there are 3 uses of TREE_SIDE_EFFECTS which is not needed at all:
```
/* (X ^ -(X < 0)) + (X < 0) -> abs (X) */
(simplify
 (plus:c (bit_xor:c @0 (negate (convert@1 (lt @0 integer_zerop)))) @1)
 (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
      && !TYPE_UNSIGNED (TREE_TYPE (@0))
      && !TYPE_SATURATING (TREE_TYPE (@0))
      && (GIMPLE || !TREE_SIDE_EFFECTS (@0)))
  (abs @0)))
...
/* popcount(rotate(X Y)) is popcount(X).  */
(for popcount (POPCOUNT)
  (for rot (lrotate rrotate)
    (simplify
      (popcount (convert?@0 (rot:s@1 @2 @3)))
      (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
           && INTEGRAL_TYPE_P (TREE_TYPE (@1))
           && (GIMPLE || !TREE_SIDE_EFFECTS (@3)))
        (with { tree type0 = TREE_TYPE (@0);
                tree type1 = TREE_TYPE (@1);
                unsigned int prec0 = TYPE_PRECISION (type0);
                unsigned int prec1 = TYPE_PRECISION (type1); }
          (if (prec0 == prec1 || (prec0 > prec1 && TYPE_UNSIGNED (type1)))
            (popcount (convert:type0 @2))))))))

/* parity(rotate(X Y)) is parity(X).  */
(for parity (PARITY)
  (for rot (lrotate rrotate)
    (simplify
      (parity (convert?@0 (rot:s@1 @2 @3)))
      (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
           && INTEGRAL_TYPE_P (TREE_TYPE (@1))
           && (GIMPLE || !TREE_SIDE_EFFECTS (@3))
           && TYPE_PRECISION (TREE_TYPE (@0))
              >= TYPE_PRECISION (TREE_TYPE (@1)))
        (with { tree type0 = TREE_TYPE (@0); }
          (parity (convert:type0 @2)))))))
```

The last 2 seems like they had them because of the removal of @3 but genmatch
has code already to handle that case correctly.So they can be safely removed.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.