The following removes a premature optimization/canonicalization from fold-const.c which is now done by reassoc. This avoids doing this when sincos is not run (at -Og). The reassoc pass now does this transform (and in a more generic way by using powi).
I suspect there are a few missed simplifications regarding to mixing powi and pow, so for the branches guarding the folding with !optimize_debug is more appropriate. Still on trunk we're now getting additional mult/add reassoc features and should revisit pow[i] handling there. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2016-04-28 Richard Biener <rguent...@suse.de> PR middle-end/70777 * fold-const.c (fold_binary_loc): Remove x*x to pow(x,2.0) canonicalization. Index: gcc/fold-const.c =================================================================== --- gcc/fold-const.c (revision 235510) +++ gcc/fold-const.c (working copy) @@ -10033,24 +10033,6 @@ fold_binary_loc (location_t loc, && TREE_CODE (arg1) == CONJ_EXPR && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)) return fold_mult_zconjz (loc, type, arg0); - - if (flag_unsafe_math_optimizations) - { - - /* Canonicalize x*x as pow(x,2.0), which is expanded as x*x. */ - if (!in_gimple_form - && optimize - && operand_equal_p (arg0, arg1, 0)) - { - tree powfn = mathfn_built_in (type, BUILT_IN_POW); - - if (powfn) - { - tree arg = build_real (type, dconst2); - return build_call_expr_loc (loc, powfn, 2, arg0, arg); - } - } - } } goto associate;