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

            Bug ID: 118565
           Summary: match.pd patterns with non-leaf useless conversions
                    result in SSA copies
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

In PR117875 we can see that patterns like

/* A >= B ? A : B -> max (A, B) and friends.  The code is still
   in fold_cond_expr_with_comparison for GENERIC folding with
   some extra constraints.  */
(for cmp (eq ne le lt unle unlt ge gt unge ungt uneq ltgt)
 (simplify
  (cond (cmp:c (nop_convert1?@c0 @0) (nop_convert2?@c1 @1))
        (convert3? @0) (convert4? @1))
...
     (if (!HONOR_NANS (type))
      (if (VECTOR_TYPE_P (type))
       (view_convert (max @c0 @c1))
       (convert (max @c0 @c1)))))

can end up doing the following via VN done after if-conversion before
vectorization:

Value numbering stmt = _ifc__350 = _1287 ? _ifc__348 : _ifc__349;
Applying pattern match.pd:6569, gimple-match-3.cc:47593
Setting value number of _ifc__350 to _ifc__350 (changed)
Applying pattern match.pd:5271, gimple-match-4.cc:7879
Applying pattern match.pd:6365, gimple-match-5.cc:6177
Applying pattern match.pd:6569, gimple-match-3.cc:47593
gimple_simplified to _1750 = MAX_EXPR <_1359, -987654321>;
_ifc__350 = _1750;
Making available beyond BB58 _ifc__350 for value _ifc__350

where the SSA copy is redundant caused by pushing (max ..) to 'seq'
before simplifying the (convert ..).  Also VN elimination does
fold substituted into stmts with allowing multiple replacement stmts
but it does not (when not iterating) value-number those which would
have eliminated the copy.

It's best to not create such copies, thus for a fix in genmatch.

Reply via email to