Hi!

While omit_one_operand_loc fold_converts the value to the right type,
when type is vector, it is not possible to convert that way
integer_one_node.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2013-01-03  Jakub Jelinek  <ja...@redhat.com>
            Marc Glisse  <marc.gli...@inria.fr>

        PR tree-optimization/55832
        * fold-const.c (fold_binary_loc): For ABS_EXPR<x> >= 0 and
        ABS_EXPR<x> < 0 folding use constant_boolean_node instead of
        integer_{one,zero}_node.

        * gcc.c-torture/compile/pr55832.c: New test.

--- 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;
+}

        Jakub

Reply via email to