summaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-17 11:32:12 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-17 11:32:12 +0000
commit26c558e1db46a23fc6fb2421bc2189aa912cdf5d (patch)
tree3ee115ae4945ecb152e39f0551068a6a35454a92 /gcc/fold-const.c
parente3668db5075b12cedb96b5d84358b21623257fb5 (diff)
downloadgcc-26c558e1db46a23fc6fb2421bc2189aa912cdf5d.tar.gz
2014-10-17 Richard Biener <rguenther@suse.de>
* fold-const.c (fold_comparison): Remove redundant constant folding and operand swapping. (fold_binary_loc): Do comparison operand swapping here. (fold_ternary_loc): Canonicalize operand order for commutative ternary operations. * tree.c (commutative_ternary_tree_code): Add DOT_PROD_EXPR and FMA_EXPR. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@216394 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 9f1bc098ed3..1e7e9322d17 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -8721,14 +8721,6 @@ fold_comparison (location_t loc, enum tree_code code, tree type,
STRIP_SIGN_NOPS (arg0);
STRIP_SIGN_NOPS (arg1);
- tem = fold_relational_const (code, type, arg0, arg1);
- if (tem != NULL_TREE)
- return tem;
-
- /* If one arg is a real or integer constant, put it last. */
- if (tree_swap_operands_p (arg0, arg1, true))
- return fold_build2_loc (loc, swap_tree_comparison (code), type, op1, op0);
-
/* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 -+ C1. */
if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
&& (equality_code || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)))
@@ -9915,6 +9907,12 @@ fold_binary_loc (location_t loc,
&& tree_swap_operands_p (arg0, arg1, true))
return fold_build2_loc (loc, code, type, op1, op0);
+ /* Likewise if this is a comparison, and ARG0 is a constant, move it
+ to ARG1 to reduce the number of tests below. */
+ if (kind == tcc_comparison
+ && tree_swap_operands_p (arg0, arg1, true))
+ return fold_build2_loc (loc, swap_tree_comparison (code), type, op1, op0);
+
/* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
First check for cases where an arithmetic operation is applied to a
@@ -13799,6 +13797,12 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
gcc_assert (IS_EXPR_CODE_CLASS (kind)
&& TREE_CODE_LENGTH (code) == 3);
+ /* If this is a commutative operation, and OP0 is a constant, move it
+ to OP1 to reduce the number of tests below. */
+ if (commutative_ternary_tree_code (code)
+ && tree_swap_operands_p (op0, op1, true))
+ return fold_build3_loc (loc, code, type, op1, op0, op2);
+
/* Strip any conversions that don't change the mode. This is safe
for every expression, except for a comparison expression because
its signedness is derived from its operands. So, in the latter