[PATCH] Fix vector ABS_EXPR x = 0 folding (PR tree-optimization/55832)

2013-01-03 Thread Jakub Jelinek
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_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.c2013-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.jj2013-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


Re: [PATCH] Fix vector ABS_EXPR x = 0 folding (PR tree-optimization/55832)

2013-01-03 Thread Richard Biener
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