(if (!HONOR_NANS (@0))
(op @0 @1))))
+/* min (a, b) <= max (a, b) -> true
+ max (a, b) >= min (a, b) -> true
+ min (a, b) > max (a, b) -> false
+ max (a, b) < min (a, b) -> false */
+(for legt (le gt)
+ (simplify
+ (legt:c (min @0 @1) (max @0 @1))
+ (if (!HONOR_NANS (@0))
+ { constant_boolean_node (legt == LE_EXPR, type); })))
+
+/* min (a, b) < max (a, b) -> a != b
+ max (a, b) > min (a, b) -> a != b
+ min (a, b) >= max (a, b) -> a == b
+ max (a, b) <= min (a, b) -> a == b */
+(for ltge (lt ge)
+ neeq (ne eq)
+ (simplify
+ (ltge:c (min @0 @1) (max @0 @1))
+ (if (!HONOR_NANS (@0))
+ (neeq @0 @1))))
+
/* Simplify min (&var[off0], &var[off1]) etc. depending on whether
the addresses are known to be less, equal or greater. */
(for minmax (min max)
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int
+f1 (int a, int b)
+{
+ int min = a < b ? a : b;
+ int max = a > b ? a : b;
+ return min <= max;
+}
+
+int
+f2 (int a, int b)
+{
+ int min = a < b ? a : b;
+ int max = a > b ? a : b;
+ return min > max;
+}
+
+int
+f3 (int a, int b)
+{
+ int max = a > b ? a : b;
+ int min = a < b ? a : b;
+ return max >= min;
+}
+
+int
+f4 (int a, int b)
+{
+ int max = a > b ? a : b;
+ int min = a < b ? a : b;
+ return max < min;
+}
+
+int
+f5 (int a, int b)
+{
+ int min = a < b ? a : b;
+ int max = a > b ? a : b;
+ return min < max;
+}
+
+int
+f6 (int a, int b)
+{
+ int min = a < b ? a : b;
+ int max = a > b ? a : b;
+ return min >= max;
+}
+
+int
+f7 (int a, int b)
+{
+ int max = a > b ? a : b;
+ int min = a < b ? a : b;
+ return max > min;
+}
+
+int
+f8 (int a, int b)
+{
+ int max = a > b ? a : b;
+ int min = a < b ? a : b;
+ return max <= min;
+}
+
+/* { dg-final { scan-tree-dump-not "MIN_EXPR" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "MAX_EXPR" "optimized" } } */