Commit 4a334cba by Richard Sandiford Committed by Richard Sandiford

Move min(max...) and max(min...) folds to match.pd

This handles both integer and floating-point arguments.  It's needed
for the follow-on patch to move fmin and fmax to match.pd.

Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi.

gcc/
	* fold-const.c (fold_minmax): Delete.
	(fold_binary_loc): Don't call it.
	* match.pd: Add rules previously handled by fold_minmax.

From-SVN: r229430
parent 2f97d24c
2015-10-27 Richard Sandiford <richard.sandiford@arm.com> 2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
* fold-const.c (fold_minmax): Delete.
(fold_binary_loc): Don't call it.
* match.pd: Add rules previously handled by fold_minmax.
2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
* builtins.c (fold_builtin_fma): Remove constant handling. * builtins.c (fold_builtin_fma): Remove constant handling.
(fold_builtin_3): Handle constant fma arguments here. (fold_builtin_3): Handle constant fma arguments here.
...@@ -8073,49 +8073,6 @@ fold_truth_andor (location_t loc, enum tree_code code, tree type, ...@@ -8073,49 +8073,6 @@ fold_truth_andor (location_t loc, enum tree_code code, tree type,
return NULL_TREE; return NULL_TREE;
} }
/* Fold a binary expression of code CODE and type TYPE with operands
OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
Return the folded expression if folding is successful. Otherwise,
return NULL_TREE. */
static tree
fold_minmax (location_t loc, enum tree_code code, tree type, tree op0, tree op1)
{
enum tree_code compl_code;
if (code == MIN_EXPR)
compl_code = MAX_EXPR;
else if (code == MAX_EXPR)
compl_code = MIN_EXPR;
else
gcc_unreachable ();
/* MIN (MAX (a, b), b) == b. */
if (TREE_CODE (op0) == compl_code
&& operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 0));
/* MIN (MAX (b, a), b) == b. */
if (TREE_CODE (op0) == compl_code
&& operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
&& reorder_operands_p (TREE_OPERAND (op0, 1), op1))
return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 1));
/* MIN (a, MAX (a, b)) == a. */
if (TREE_CODE (op1) == compl_code
&& operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
&& reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 1));
/* MIN (a, MAX (b, a)) == a. */
if (TREE_CODE (op1) == compl_code
&& operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
&& reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 0));
return NULL_TREE;
}
/* Helper that tries to canonicalize the comparison ARG0 CODE ARG1 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
by changing CODE to reduce the magnitude of constants involved in by changing CODE to reduce the magnitude of constants involved in
ARG0 of the comparison. ARG0 of the comparison.
...@@ -10426,15 +10383,7 @@ fold_binary_loc (location_t loc, ...@@ -10426,15 +10383,7 @@ fold_binary_loc (location_t loc,
return NULL_TREE; return NULL_TREE;
case MIN_EXPR: case MIN_EXPR:
tem = fold_minmax (loc, MIN_EXPR, type, arg0, arg1);
if (tem)
return tem;
goto associate;
case MAX_EXPR: case MAX_EXPR:
tem = fold_minmax (loc, MAX_EXPR, type, arg0, arg1);
if (tem)
return tem;
goto associate; goto associate;
case TRUTH_ANDIF_EXPR: case TRUTH_ANDIF_EXPR:
......
...@@ -1176,6 +1176,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) ...@@ -1176,6 +1176,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(simplify (simplify
(minmax @0 @0) (minmax @0 @0)
@0)) @0))
/* min(max(x,y),y) -> y. */
(simplify
(min:c (max:c @0 @1) @1)
@1)
/* max(min(x,y),y) -> y. */
(simplify
(max:c (min:c @0 @1) @1)
@1)
(simplify (simplify
(min @0 @1) (min @0 @1)
(if (INTEGRAL_TYPE_P (type) (if (INTEGRAL_TYPE_P (type)
......
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