2016-04-21 Marc Glisse <marc.glisse@inria.fr>
+ * match.pd (min(-x, -y), max(-x, -y), min(~x, ~y), max(~x, ~y)):
+ New transformations.
+
+2016-04-21 Marc Glisse <marc.glisse@inria.fr>
+
* match.pd (min(int_max, x), max(int_min, x)): New transformations.
2016-04-20 Jan Hubicka <jh@suse.cz>
(simplify
(FMAX @0 @1)
(max @0 @1)))
+/* min (-A, -B) -> -max (A, B) */
+(for minmax (min max FMIN FMAX)
+ maxmin (max min FMAX FMIN)
+ (simplify
+ (minmax (negate:s@2 @0) (negate:s@3 @1))
+ (if (FLOAT_TYPE_P (TREE_TYPE (@0))
+ || (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))))
+ (negate (maxmin @0 @1)))))
+/* MIN (~X, ~Y) -> ~MAX (X, Y)
+ MAX (~X, ~Y) -> ~MIN (X, Y) */
+(for minmax (min max)
+ maxmin (max min)
+ (simplify
+ (minmax (bit_not:s@2 @0) (bit_not:s@3 @1))
+ (bit_not (maxmin @0 @1))))
/* Simplifications of shift and rotates. */
2016-04-21 Marc Glisse <marc.glisse@inria.fr>
+ * gcc.dg/tree-ssa/minmax-2.c: New testcase.
+
+2016-04-21 Marc Glisse <marc.glisse@inria.fr>
+
* gcc.dg/tree-ssa/minmax-1.c: New testcase.
2016-04-20 Jan Hubicka <jh@suse.cz>
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -fstrict-overflow -fdump-tree-optimized" } */
+
+static int max(int a,int b){return (a<b)?b:a;}
+int f(int x,int y){return max(-x,-y);}
+int g(int x,int y){return max(~x,~y);}
+double h(double x,double y){return __builtin_fmax(-x,-y);}
+
+/* { dg-final { scan-tree-dump-times "MIN_EXPR" 2 "optimized" } } */
+/* { dg-final { scan-tree-dump "__builtin_fmin" "optimized" } } */