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

            Bug ID: 117193
           Summary: Missing (a < b) < (b < a) transformation at gimple
                    level
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: pinskia at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

Found via PR 117186.

Basically `bool0 < bool1` is `!bool0 & bool1` So `(a < b) < (a > b)` becomes
`(a >= b) & (a > b)` which becomes `(a > b)` .

Note this will make PR 117186 go latent.

We already have:
/* Convert (X OP1 CST1) && (X OP2 CST2).
   Convert (X OP1 Y) && (X OP2 Y).  */
(for code1 (lt le gt ge)
 (for code2 (lt le gt ge)

Which we could do for </<= too.

Something like:
(for cmp1 (lt le gt ge)
 (for cmp2 (lt le gt ge)
  (simplify (lt:c (cmp1:c @0 @1) (cmp2:c @0 @1))
   /* a < a -> false.  */
   (if (cmp1 == cmp2)
    { constant_boolean_node (false, type); }
   /* a < !a -> true.  */
   (if (cmp1 == invert_tree_comparison (cmp2, TREE_TYPE (@0)))
...

Reply via email to