Hi,
The attached patch moves pattern a * (1 << b) -> a << b.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
OK for trunk if testing passes ?
Thank you,
Prathamesh
2015-07-06 Prathamesh Kulkarni <[email protected]>
* fold-const.c (fold_binary_loc): Remove pattern a * 1 << b -> a << b.
* match.pd (a * 1 << b -> a << b): New pattern.
testsuite/
* gcc.dg/tree-ssa/fold-shiftmult.c: New test-case.
Index: fold-const.c
===================================================================
--- fold-const.c (revision 225473)
+++ fold-const.c (working copy)
@@ -10175,16 +10175,6 @@
negate_expr (arg0)),
tem);
- /* (a * (1 << b)) is (a << b) */
- if (TREE_CODE (arg1) == LSHIFT_EXPR
- && integer_onep (TREE_OPERAND (arg1, 0)))
- return fold_build2_loc (loc, LSHIFT_EXPR, type, op0,
- TREE_OPERAND (arg1, 1));
- if (TREE_CODE (arg0) == LSHIFT_EXPR
- && integer_onep (TREE_OPERAND (arg0, 0)))
- return fold_build2_loc (loc, LSHIFT_EXPR, type, op1,
- TREE_OPERAND (arg0, 1));
-
/* (A + A) * C -> A * 2 * C */
if (TREE_CODE (arg0) == PLUS_EXPR
&& TREE_CODE (arg1) == INTEGER_CST
Index: match.pd
===================================================================
--- match.pd (revision 225473)
+++ match.pd (working copy)
@@ -854,6 +854,12 @@
&& tree_expr_nonnegative_p (@1))
@0))
+/* a * (1 << b) -> a << b */
+(simplify
+ (mult:c @a (lshift integer_onep @b))
+ (if (!FLOAT_TYPE_P (type))
+ (lshift @a @b)))
+
(for shiftrotate (lrotate rrotate lshift rshift)
(simplify
(shiftrotate @0 integer_zerop)
Index: testsuite/gcc.dg/tree-ssa/fold-shiftmult.c
===================================================================
--- testsuite/gcc.dg/tree-ssa/fold-shiftmult.c (revision 0)
+++ testsuite/gcc.dg/tree-ssa/fold-shiftmult.c (working copy)
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-forwprop-details" } */
+
+int f1(int a, int b)
+{
+ int t1 = 1 << b;
+ int f1_val = a * t1;
+ return f1_val;
+}
+/* { dg-final { scan-tree-dump "gimple_simplified to f1_val_\\d\+ =
a_\\d\+\\(D\\) << b_\\d\+\\(D\\)" "forwprop1" } } */
+
+int f2(int a, int b)
+{
+ int t1 = 1 << b;
+ int f2_val = t1 * a;
+ return f2_val;
+}
+
+/* { dg-final { scan-tree-dump "gimple_simplified to f2_val_\\d\+ =
a_\\d\+\\(D\\) << b_\\d\+\\(D\\)" "forwprop1" } } */