re PR tree-optimization/46036 (verify_ssa failed: definition in block 3 follows the...
authorSebastian Pop <sebastian.pop@amd.com>
Tue, 9 Nov 2010 19:23:43 +0000 (19:23 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Tue, 9 Nov 2010 19:23:43 +0000 (19:23 +0000)
Fix PR46036.

2010-11-09  Sebastian Pop  <sebastian.pop@amd.com>

PR tree-optimization/46036
* tree-if-conv.c (predicate_bbs): Call unshare_expr before
add_to_dst_predicate_list.

* gfortran.dg/lto/pr46036_0.f90: New.

From-SVN: r166508

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/lto/pr46036_0.f90 [new file with mode: 0644]
gcc/tree-if-conv.c

index d41cabca05dd9cdf5daf8d942955e901cfdb2f17..dbf4ef6ab1da8a5998c968226fc5a25c4bee191d 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-09  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR tree-optimization/46036
+       * tree-if-conv.c (predicate_bbs): Call unshare_expr before
+       add_to_dst_predicate_list.
+
 2010-11-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/46171
index 82fd56bbed62a37832f8a82fe1c91cd6198aea40..5517521f6711594d4c7f3da2354a4ae5a8dfe74f 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-09  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR tree-optimization/46036
+       * gfortran.dg/lto/pr46036_0.f90: New.
+
 2010-10-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/45663
diff --git a/gcc/testsuite/gfortran.dg/lto/pr46036_0.f90 b/gcc/testsuite/gfortran.dg/lto/pr46036_0.f90
new file mode 100644 (file)
index 0000000..558c7ed
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-lto-do link }
+! { dg-lto-options {{ -O -flto -ftree-vectorize }} }
+
+function no_of_edges(self) result(res)
+  integer(kind=kind(1)) :: edge_bit_string
+  integer(kind=kind(1)) :: res
+  integer(kind=kind(1)) :: e
+  do e = 0, 11
+     if (.not. btest(edge_bit_string,e)) cycle
+     res = res + 1
+  end do
+end function no_of_edges
+
+end program
index 642dbda24cb6041c2c85b9e96df281980146ba48..17b66721e5d25b3227643037fb1290c1af9f509c 100644 (file)
@@ -928,7 +928,7 @@ predicate_bbs (loop_p loop)
                                                     &true_edge, &false_edge);
 
                /* If C is true, then TRUE_EDGE is taken.  */
-               add_to_dst_predicate_list (loop, true_edge, cond, c);
+               add_to_dst_predicate_list (loop, true_edge, cond, unshare_expr (c));
 
                /* If C is false, then FALSE_EDGE is taken.  */
                c2 = invert_truthvalue_loc (loc, unshare_expr (c));