Commit a3423260 by Richard Biener Committed by Richard Biener

fold-const.c (fold_comparison): Remove redundant constant folding and operand swapping.

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.

From-SVN: r216394
parent 73049af5
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.
2014-10-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/63464
......@@ -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
......
......@@ -7385,6 +7385,8 @@ commutative_ternary_tree_code (enum tree_code code)
{
case WIDEN_MULT_PLUS_EXPR:
case WIDEN_MULT_MINUS_EXPR:
case DOT_PROD_EXPR:
case FMA_EXPR:
return true;
default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment