OSDN Git Service

Fix PR46036.
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Nov 2010 19:23:43 +0000 (19:23 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Nov 2010 19:23:43 +0000 (19:23 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166508 138bc75d-0d04-0410-961f-82ee72b054a4

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

index d41cabc..dbf4ef6 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 82fd56b..5517521 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 642dbda..17b6672 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));