aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2016-04-21 11:32:32 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2016-04-21 09:32:32 +0000
commit2c2870a1b16c867b9ef0ea6cf0a8eb16af4c1b2d (patch)
tree1ee36064cb859fba2a08608c049082bd1282c2cd /gcc
parentbbe008b6e975f3afc971a990f70e78d25fbc3180 (diff)
downloadgcc-2c2870a1b16c867b9ef0ea6cf0a8eb16af4c1b2d.zip
gcc-2c2870a1b16c867b9ef0ea6cf0a8eb16af4c1b2d.tar.gz
gcc-2c2870a1b16c867b9ef0ea6cf0a8eb16af4c1b2d.tar.bz2
max(INT_MIN, x) -> x
2016-04-21 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd (min(int_max, x), max(int_min, x)): New transformations. gcc/testsuite/ * gcc.dg/tree-ssa/minmax-1.c: New testcase. From-SVN: r235323
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/match.pd26
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/minmax-1.c9
4 files changed, 35 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d2a345c..26d1861 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2016-04-21 Marc Glisse <marc.glisse@inria.fr>
+
+ * match.pd (min(int_max, x), max(int_min, x)): New transformations.
+
2016-04-20 Jan Hubicka <jh@suse.cz>
* ipa-inline.c (can_inline_edge_p): Pass caller info to
diff --git a/gcc/match.pd b/gcc/match.pd
index 75aa601..3819321 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -1192,16 +1192,26 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
@1)
(simplify
(min @0 @1)
- (if (INTEGRAL_TYPE_P (type)
- && TYPE_MIN_VALUE (type)
- && operand_equal_p (@1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
- @1))
+ (switch
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_MIN_VALUE (type)
+ && operand_equal_p (@1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
+ @1)
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_MAX_VALUE (type)
+ && operand_equal_p (@1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
+ @0)))
(simplify
(max @0 @1)
- (if (INTEGRAL_TYPE_P (type)
- && TYPE_MAX_VALUE (type)
- && operand_equal_p (@1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
- @1))
+ (switch
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_MAX_VALUE (type)
+ && operand_equal_p (@1, TYPE_MAX_VALUE (type), OEP_ONLY_CONST))
+ @1)
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_MIN_VALUE (type)
+ && operand_equal_p (@1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
+ @0)))
(for minmax (FMIN FMAX)
/* If either argument is NaN, return the other one. Avoid the
transformation if we get (and honor) a signalling NaN. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eb47876..98db7d0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-04-21 Marc Glisse <marc.glisse@inria.fr>
+
+ * gcc.dg/tree-ssa/minmax-1.c: New testcase.
+
2016-04-20 Jan Hubicka <jh@suse.cz>
PR ipa/70018
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-1.c b/gcc/testsuite/gcc.dg/tree-ssa/minmax-1.c
new file mode 100644
index 0000000..dfd7ed2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/minmax-1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+static int min(int a,int b){return (a<b)?a:b;}
+static int max(int a,int b){return (a<b)?b:a;}
+int f(int x){return max(x,-__INT_MAX__-1);}
+int g(int x){return min(x,__INT_MAX__);}
+
+/* { dg-final { scan-tree-dump-times "return x_\[0-9\]+.D.;" 2 "optimized" } } */