--- gcc/fold-const.c.jj	2012-12-06 15:35:35.000000000 +0100
+++ gcc/fold-const.c	2013-01-02 09:48:42.906797768 +0100
@@ -13519,7 +13519,9 @@ fold_binary_loc (location_t loc,
 				    "when simplifying comparison of "
 				    "absolute value and zero"),
 				   WARN_STRICT_OVERFLOW_CONDITIONAL);
-	  return omit_one_operand_loc (loc, type, integer_one_node, arg0);
+	  return omit_one_operand_loc (loc, type,
+				       constant_boolean_node (true, type),
+				       arg0);
 	}
 
       /* Convert ABS_EXPR<x> < 0 to false.  */
@@ -13533,7 +13535,9 @@ fold_binary_loc (location_t loc,
 				    "when simplifying comparison of "
 				    "absolute value and zero"),
 				   WARN_STRICT_OVERFLOW_CONDITIONAL);
-	  return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
+	  return omit_one_operand_loc (loc, type,
+				       constant_boolean_node (false, type),
+				       arg0);
 	}
 
       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
--- gcc/testsuite/gcc.c-torture/compile/pr55832.c.jj	2013-01-02 10:00:53.271626853 +0100
+++ gcc/testsuite/gcc.c-torture/compile/pr55832.c	2013-01-02 10:00:44.000000000 +0100
@@ -0,0 +1,23 @@
+/* PR tree-optimization/55832 */
+
+int g, b;
+
+void
+foo (void)
+{
+  union U { int i; unsigned short s; } a = { 0 };
+  unsigned char c;
+  unsigned short d = 0, *p = &a.s;
+
+  if (g)
+    a.i--;
+
+  if (b && a.i < (d = 1))
+    return;
+
+  for (; a.i < 15; a.i++)
+    b |= d <= c;
+
+  if (!*p)
+    g = 0;
+}
