On Thu, 3 Jan 2013, Jakub Jelinek wrote:
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?
Ok.
Thanks,
Richard.
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_EXPRx = 0 and
ABS_EXPRx 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.0 +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_EXPRx 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.0 +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
--
Richard Biener rguent...@suse.de
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend