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 <prathamesh.kulka...@linaro.org> * 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" } } */