diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cf75376b851b9cb78e63aca55ffe16a41a248905..1da0405e8b03644735089e21f3e90971e1e2f183 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/match.pd b/gcc/match.pd
index 77271a016198a58fc5411f2e056207166d96a92b..b5e5a98770e4dbd729a3a44f65245d395e119413 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index efe1dcb14f84ebd531ebdd81718a1d22358887a3..bb658182cfa2f23cb736d52835d3024e9d3428b9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000000000000000000000000000000000000..dbaf02e49ca47a7638f5dd4788a585fccf182680
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vce-1.c
@@ -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" } } */