match.pd ((convert1 (minmax ((convert2 (x) c)))) -> minmax (x c)): New pattern.
authorBin Cheng <bin.cheng@arm.com>
Thu, 27 Oct 2016 08:31:01 +0000 (08:31 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Thu, 27 Oct 2016 08:31:01 +0000 (08:31 +0000)
* match.pd ((convert1 (minmax ((convert2 (x) c)))) -> minmax (x c)):
New pattern.

gcc/testsuite
* gcc.dg/fold-convmaxconv-1.c: New test.
* gcc.dg/fold-convminconv-1.c: New test.

From-SVN: r241612

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-convmaxconv-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/fold-convminconv-1.c [new file with mode: 0644]

index d8bdeee..ee733cf 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-27  Bin Cheng  <bin.cheng@arm.com>
+
+       * match.pd ((convert1 (minmax ((convert2 (x) c)))) -> minmax (x c)):
+       New pattern.
+
 2016-10-26  Kelvin Nilsen  <kelvin@gcc.gnu.org>
 
        PR target/78056
index 767d23a..73bee34 100644 (file)
@@ -1337,6 +1337,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && TYPE_MIN_VALUE (type)
        && operand_equal_p (@1, TYPE_MIN_VALUE (type), OEP_ONLY_CONST))
    @0)))
+
+/* (convert (minmax ((convert (x) c)))) -> minmax (x c) if x is promoted
+   and the outer convert demotes the expression back to x's type.  */
+(for minmax (min max)
+ (simplify
+  (convert (minmax@0 (convert @1) INTEGER_CST@2))
+  (if (types_match (@1, type) && int_fits_type_p (@2, type)
+       && TYPE_SIGN (TREE_TYPE (@0)) == TYPE_SIGN (type)
+       && TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (type))
+   (minmax @1 (convert @2)))))
+
 (for minmax (FMIN FMAX)
  /* If either argument is NaN, return the other one.  Avoid the
     transformation if we get (and honor) a signalling NaN.  */
index ac9901b..512e9a6 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-27  Bin Cheng  <bin.cheng@arm.com>
+
+       * gcc.dg/fold-convmaxconv-1.c: New test.
+       * gcc.dg/fold-convminconv-1.c: New test.
+
 2016-10-26  Steven G. Kargl <kargl@gcc.gnu.org>
 
        PR fortran/78092
diff --git a/gcc/testsuite/gcc.dg/fold-convmaxconv-1.c b/gcc/testsuite/gcc.dg/fold-convmaxconv-1.c
new file mode 100644 (file)
index 0000000..3ffff8b
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+int foo (short a[], int x)
+{
+  unsigned int i;
+  for (i = 0; i < 1000; i++)
+    {
+      x = a[i];
+      a[i] = (x <= 0 ? 0 : x);
+    }
+  return x;
+}
+
+/* { dg-final { scan-tree-dump-not " = MAX_EXPR <x_\[0-9\]*" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/fold-convminconv-1.c b/gcc/testsuite/gcc.dg/fold-convminconv-1.c
new file mode 100644 (file)
index 0000000..f4a048e
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+int foo (unsigned short a[], unsigned int x)
+{
+  unsigned int i;
+  for (i = 0; i < 1000; i++)
+    {
+      x = a[i];
+      a[i] = (x >= 255 ? 255 : x);
+    }
+  return x;
+}
+
+/* { dg-final { scan-tree-dump-not " = MIN_EXPR <x_\[0-9\]*" "optimized" } } */