On Tue, 17 Nov 2015, Hurugalawadi, Naveen wrote:

Please find attached the patch that moves some more division optimizations
from fold-const using match and simplify.

First, note that we are in stage 3, so this all may have to wait until sometime around March or April next year unless it is fixing some bug.

+/* Simplify A / (B << N) where A and B are positive and B is a power of 2,
+   to A >> (N + log2(B)).  */
+(simplify
+ (floor_div (convert? @0) (lshift @1 INTEGER_CST@2))

I don't think the fold-const code was asking for @2 to be a constant. You will never see (lshift cst1 cst2) in match.pd, it has already been folded to a constant.

+ (if ((TYPE_UNSIGNED (type)
+       || tree_expr_nonnegative_warnv_p (@0, NULL))
+      && integer_pow2p (@1)

Note that you can write integer_pow2p@1 in the pattern directly if you want.

+      && tree_int_cst_sgn (@1) > 0
+      && tree_nop_conversion_p (type, TREE_TYPE (@0)))
+  (with
+   { tree pow2 = build_int_cst (TREE_TYPE (@2), wi::exact_log2 (@1));
+     tree temp = const_binop (PLUS_EXPR, TREE_TYPE (@2), @2, pow2); }

Hmm, maybe you could do the log and plus using wi and only build a single tree at the end, for a slight economy?

+   (rshift (convert @0) { temp; }))))
+
+/* Convert A/B to A/B  */
+(for div (CEIL_DIV_EXPR FLOOR_DIV_EXPR)
+ (simplify
+  (div (convert? @0) (convert? @1))
+  (if (wi::multiple_of_p (@0, @1, TYPE_SIGN (type)))
+   (exact_div (convert @0) (convert @1)))))

Sorry, using wi::multiple_of_p makes no sense here. It can only work on constants, but for constants we have constant propagation.

--
Marc Glisse

Reply via email to