aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2015-10-27 11:56:18 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2015-10-27 11:56:18 +0000
commit4a334cbaf89552015039132e0016b003a5022e73 (patch)
tree7c355bb077f64ab4a548684c4a48eece27b439e5 /gcc
parent2f97d24cad349a09ee1beb3e20b636925aa9baa9 (diff)
downloadgcc-4a334cbaf89552015039132e0016b003a5022e73.zip
gcc-4a334cbaf89552015039132e0016b003a5022e73.tar.gz
gcc-4a334cbaf89552015039132e0016b003a5022e73.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c51
-rw-r--r--gcc/match.pd8
3 files changed, 14 insertions, 51 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 06b27fa..1066861 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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.
(fold_builtin_3): Handle constant fma arguments here.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index ffad732..e8ff1de 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -8073,49 +8073,6 @@ fold_truth_andor (location_t loc, enum tree_code code, tree type,
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
by changing CODE to reduce the magnitude of constants involved in
ARG0 of the comparison.
@@ -10426,15 +10383,7 @@ fold_binary_loc (location_t loc,
return NULL_TREE;
case MIN_EXPR:
- tem = fold_minmax (loc, MIN_EXPR, type, arg0, arg1);
- if (tem)
- return tem;
- goto associate;
-
case MAX_EXPR:
- tem = fold_minmax (loc, MAX_EXPR, type, arg0, arg1);
- if (tem)
- return tem;
goto associate;
case TRUTH_ANDIF_EXPR:
diff --git a/gcc/match.pd b/gcc/match.pd
index ca393e8..8de7987 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -1176,6 +1176,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(simplify
(minmax @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
(min @0 @1)
(if (INTEGRAL_TYPE_P (type)