re PR middle-end/57286 (infinite recursion in fold-const.c:10037)
authorMarc Glisse <marc.glisse@inria.fr>
Thu, 16 May 2013 10:26:51 +0000 (12:26 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Thu, 16 May 2013 10:26:51 +0000 (10:26 +0000)
2013-05-16  Marc Glisse  <marc.glisse@inria.fr>

PR middle-end/57286
gcc/
* fold-const.c (fold_ternary_loc) <VEC_COND_EXPR>: Disable some
transformations to avoid an infinite loop.

gcc/testsuite/
* gcc.dg/pr57286.c: New testcase.
* gcc.dg/vector-shift-2.c: Don't assume int has size 4.
* g++.dg/ext/vector22.C: Comment out transformations not
performed anymore.

From-SVN: r198964

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/vector22.C
gcc/testsuite/gcc.dg/pr57286.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vector-shift-2.c

index a54dceca35c3cd49dc9589a380aca408d450464e..3a0929cd122e3db475c14c146cd7f29f8871e7fb 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-16  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR middle-end/57286
+       * fold-const.c (fold_ternary_loc) <VEC_COND_EXPR>: Disable some
+       transformations to avoid an infinite loop.
+
 2013-05-16  Marek Polacek  <polacek@redhat.com>
 
        * tree-scalar-evolution.c (scev_const_prop): Add more dumps.
index e02f0c60d9aa29def819d81a423bd4527e09a62e..97b5216eb7115b032d8a2c6f3983b55aca96b346 100644 (file)
@@ -14211,6 +14211,12 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
                                    fold_convert_loc (loc, type,
                                                      TREE_OPERAND (arg0, 0)));
 
+      /* Disable the transformations below for vectors, since
+        fold_binary_op_with_conditional_arg may undo them immediately,
+        yielding an infinite loop.  */
+      if (code == VEC_COND_EXPR)
+       return NULL_TREE;
+
       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
       if (integer_zerop (op2)
          && truth_value_p (TREE_CODE (arg0))
index e608612d2d16cd828e781ef1c973bb5683fc73d8..6ec937c4ad5a04934bd2ea428246ef31dfc79f27 100644 (file)
@@ -1,3 +1,11 @@
+2013-05-16  Marc Glisse  <marc.glisse@inria.fr>
+
+       PR middle-end/57286
+       * gcc.dg/pr57286.c: New testcase.
+       * gcc.dg/vector-shift-2.c: Don't assume int has size 4.
+       * g++.dg/ext/vector22.C: Comment out transformations not
+       performed anymore.
+
 2013-05-15  Richard Sandiford  <rdsandiford@googlemail.com>
 
        PR target/57260
index ab569c7dffad5d5333b649c4b19ead98ad65c80a..47f64e7e7a7f30fe0e450ef27ea77ce9ac289e9f 100644 (file)
@@ -3,13 +3,15 @@
 
 typedef unsigned vec __attribute__((vector_size(4*sizeof(int))));
 
+/* Disabled after PR57286
 void f(vec*a,vec*b){
   *a=(*a)?-1:(*b<10);
   *b=(*b)?(*a<10):0;
 }
+*/
 void g(vec*a,vec*b){
   *a=(*a)?(*a<*a):-1;
-  *b=(*b)?-1:(*b<*b);
+// *b=(*b)?-1:(*b<*b);
 }
 void h(vec*a){
   *a=(~*a==5);
diff --git a/gcc/testsuite/gcc.dg/pr57286.c b/gcc/testsuite/gcc.dg/pr57286.c
new file mode 100644 (file)
index 0000000..c6f4530
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+typedef int vec __attribute__ ((vector_size (4*sizeof(int))));
+void f (vec *x){
+    *x = (*x < 0) | 1;
+}
index 14fff121c5e5656e6a61aa88ff3786cd7e829c29..380f2dfb3074aee3e3d2a56b8619705a062b7897 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-O -fdump-tree-ccp1" } */
 
-typedef unsigned vec __attribute__ ((vector_size (16)));
+typedef unsigned vec __attribute__ ((vector_size (4*sizeof(int))));
 void
 f (vec *a)
 {