Relax VIEW_CONVERT_EXPR - CONVERT_EXPR combination
authorMarc Glisse <marc.glisse@inria.fr>
Thu, 25 May 2017 08:50:54 +0000 (10:50 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Thu, 25 May 2017 08:50:54 +0000 (08:50 +0000)
2017-05-25  Marc Glisse  <marc.glisse@inria.fr>

gcc/
* match.pd (view_convert (convert@0 @1)): Handle zero-extension.

gcc/testsuite/
* gcc.dg/tree-ssa/vce-1.c: New file.

From-SVN: r248449

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/vce-1.c [new file with mode: 0644]

index cf75376b851b9cb78e63aca55ffe16a41a248905..1da0405e8b03644735089e21f3e90971e1e2f183 100644 (file)
@@ -1,3 +1,7 @@
+2017-05-25  Marc Glisse  <marc.glisse@inria.fr>
+
+       * match.pd (view_convert (convert@0 @1)): Handle zero-extension.
+
 2017-05-25  Marc Glisse  <marc.glisse@inria.fr>
 
        * match.pd ((A +- CST1) +- CST2): Allow some conversions.
index 77271a016198a58fc5411f2e056207166d96a92b..b5e5a98770e4dbd729a3a44f65245d395e119413 100644 (file)
@@ -1856,13 +1856,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (@0)))
    (convert @0)))
 
-/* Strip inner integral conversions that do not change precision or size.  */
+/* Strip inner integral conversions that do not change precision or size, or
+   zero-extend while keeping the same size (for bool-to-char).  */
 (simplify
   (view_convert (convert@0 @1))
   (if ((INTEGRAL_TYPE_P (TREE_TYPE (@0)) || POINTER_TYPE_P (TREE_TYPE (@0)))
        && (INTEGRAL_TYPE_P (TREE_TYPE (@1)) || POINTER_TYPE_P (TREE_TYPE (@1)))
-       && (TYPE_PRECISION (TREE_TYPE (@0)) == TYPE_PRECISION (TREE_TYPE (@1)))
-       && (TYPE_SIZE (TREE_TYPE (@0)) == TYPE_SIZE (TREE_TYPE (@1))))
+       && TYPE_SIZE (TREE_TYPE (@0)) == TYPE_SIZE (TREE_TYPE (@1))
+       && (TYPE_PRECISION (TREE_TYPE (@0)) == TYPE_PRECISION (TREE_TYPE (@1))
+          || (TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (TREE_TYPE (@1))
+              && TYPE_UNSIGNED (TREE_TYPE (@1)))))
    (view_convert @1)))
 
 /* Re-association barriers around constants and other re-association
index efe1dcb14f84ebd531ebdd81718a1d22358887a3..bb658182cfa2f23cb736d52835d3024e9d3428b9 100644 (file)
@@ -1,3 +1,7 @@
+2017-05-25  Marc Glisse  <marc.glisse@inria.fr>
+
+       * gcc.dg/tree-ssa/vce-1.c: New file.
+
 2017-05-25  Marc Glisse  <marc.glisse@inria.fr>
 
        * gcc.dg/tree-ssa/addadd.c: New file.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vce-1.c b/gcc/testsuite/gcc.dg/tree-ssa/vce-1.c
new file mode 100644 (file)
index 0000000..dbaf02e
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+typedef struct { _Bool b; } A;
+_Bool f(double u){
+  A a;
+  if(u==0)
+    a.b=1;
+  else
+    a.b=0;
+  return a.b;
+}
+
+/* { dg-final { scan-tree-dump-not "VIEW_CONVERT_EXPR" "optimized" } } */