diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 99a58708ceeecaa902b958b0da9c71336cc545ca..c2e1f701d0cb38157167faf1966cf67d56cf0c33 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-18  Roger Sayle  <roger@eyesopen.com>
+
+	* fold-const.c (fold_unary) <VIEW_CONVERT_EXPR>: Optimize away a
+	VIEW_CONVERT_EXPR to the same type as it's operand.
+
 2007-01-18  David Edelsohn  <edelsohn@gnu.org>
 
 	* config/rs6000/darwin-ldouble.c: Only build _SOFT_FLOAT if
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 2ae560fa3bdad65984f54658d472fc3cf0fc99ff..5588c37a7e32413bea7fe4ad32c11c4000dd68d5 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -7573,6 +7573,8 @@ fold_unary (enum tree_code code, tree type, tree op0)
       return tem ? tem : NULL_TREE;
 
     case VIEW_CONVERT_EXPR:
+      if (TREE_TYPE (op0) == type)
+	return op0;
       if (TREE_CODE (op0) == VIEW_CONVERT_EXPR)
 	return fold_build1 (VIEW_CONVERT_EXPR, type, TREE_OPERAND (op0, 0));
       return fold_view_convert_expr (type, op0);