+2016-05-30 Alexander Monakov <amonakov@ispras.ru>
+ Marc Glisse <marc.glisse@inria.fr>
+
+ PR tree-optimization/71289
+ * match.pd (-1 / B < A, A > -1 / B): New transformations.
+
2016-05-30 Jan Hubicka <hubicka@ucw.cz>
* tree-vect-loop.c (vect_transform_loop): Update likely bounds.
&& types_match (TREE_TYPE (@0), TREE_TYPE (@1)))
(out (imagpart @2) { build_zero_cst (TREE_TYPE (@0)); }))))
+/* For unsigned operands, A > -1 / B checks whether A * B would overflow.
+ Simplify it to __builtin_mul_overflow (A, B, <unused>). */
+/* -1 / B < A */
+(for cmp (lt ge)
+ out (ne eq)
+ (simplify
+ (cmp (trunc_div:s integer_all_onesp @1) @0)
+ (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0)))
+ (with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); }
+ (out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); })))))
+
+/* A > -1 / B */
+(for cmp (gt le)
+ out (ne eq)
+ (simplify
+ (cmp @0 (trunc_div:s integer_all_onesp @1))
+ (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0)))
+ (with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); }
+ (out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); })))))
/* Simplification of math builtins. These rules must all be optimizations
as well as IL simplifications. If there is a possibility that the new
+2016-05-30 Alexander Monakov <amonakov@ispras.ru>
+
+ PR tree-optimization/71289
+ * gcc.dg/pr71289.c: New test.
+
2016-05-30 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/71269
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized-raw" } */
+
+int f(unsigned a, unsigned b, unsigned *c)
+{
+ if (a > -1 / b)
+ return -1;
+ *c = a * b;
+ return 0;
+}
+
+void g(unsigned long long a, unsigned long long b, unsigned long long *c)
+{
+ if (a <= -1 / b)
+ *c = a * b;
+}
+
+/* { dg-final { scan-tree-dump-not "trunc_div_expr" "optimized" } } */