The following makes tree_swap_operands_p put all constants 2nd place, also looks through sign-changes when considering further canonicalzations and removes the odd -Os guard for those. That was put in with https://gcc.gnu.org/ml/gcc-patches/2003-10/msg01208.html just motivated by CSiBE numbers - but rather than disabling canonicalization this should have disabled the actual harmful transforms.
Bootstrap and regtest ongoing on x86_64-unknown-linux-gnu. Richard. 2014-08-15 Richard Biener <rguent...@suse.de> * fold-const.c (tree_swap_operands_p): Put all constants last, also strip sign-changing NOPs when considering further canonicalization. Canonicalize also when optimizing for size. Index: gcc/fold-const.c =================================================================== --- gcc/fold-const.c (revision 214007) +++ gcc/fold-const.c (working copy) @@ -6642,37 +6650,19 @@ reorder_operands_p (const_tree arg0, con bool tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder) { - STRIP_SIGN_NOPS (arg0); - STRIP_SIGN_NOPS (arg1); - - if (TREE_CODE (arg1) == INTEGER_CST) + if (CONSTANT_CLASS_P (arg1) == INTEGER_CST) return 0; - if (TREE_CODE (arg0) == INTEGER_CST) + if (CONSTANT_CLASS_P (arg0) == INTEGER_CST) return 1; - if (TREE_CODE (arg1) == REAL_CST) - return 0; - if (TREE_CODE (arg0) == REAL_CST) - return 1; - - if (TREE_CODE (arg1) == FIXED_CST) - return 0; - if (TREE_CODE (arg0) == FIXED_CST) - return 1; - - if (TREE_CODE (arg1) == COMPLEX_CST) - return 0; - if (TREE_CODE (arg0) == COMPLEX_CST) - return 1; + STRIP_NOPS (arg0); + STRIP_NOPS (arg1); if (TREE_CONSTANT (arg1)) return 0; if (TREE_CONSTANT (arg0)) return 1; - if (optimize_function_for_size_p (cfun)) - return 0; - if (reorder && flag_evaluation_order && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1))) return 0;