diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-11-07 15:28:57 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-11-07 15:28:57 +0100 |
commit | d23c0a32ab98d6c170970bb1ee319c6fc967852d (patch) | |
tree | 37d8f2f72fa52335e8f3aedab00ddc0e57ef358a | |
parent | fe79fc067e750e2e8a7e22861a088b8fde07ebbc (diff) | |
download | gcc-d23c0a32ab98d6c170970bb1ee319c6fc967852d.zip gcc-d23c0a32ab98d6c170970bb1ee319c6fc967852d.tar.gz gcc-d23c0a32ab98d6c170970bb1ee319c6fc967852d.tar.bz2 |
tree-vrp.c (find_assert_locations): Pre-seed live bitmaps for loop latches from header PHI arguments from the latch...
* tree-vrp.c (find_assert_locations): Pre-seed live bitmaps for loop
latches from header PHI arguments from the latch edge.
* gcc.dg/unroll_1.c: Add -fno-tree-vrp to dg-options.
* gcc.dg/unroll_2.c: Likewise.
* gcc.dg/unroll_3.c: Likewise.
* gcc.dg/unroll_4.c: Likewise.
* gcc.dg/vrp90.c: New test.
From-SVN: r204515
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/vrp90.c | 36 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/unroll_1.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/unroll_2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/unroll_3.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/unroll_4.c | 2 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 28 |
8 files changed, 82 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5679435..2dbbfef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-11-07 Richard Biener <rguenther@suse.de> + Jakub Jelinek <jakub@redhat.com> + + * tree-vrp.c (find_assert_locations): Pre-seed live bitmaps for loop + latches from header PHI arguments from the latch edge. + 2013-11-07 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58176 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b45c8f4..643d156 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-11-07 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/unroll_1.c: Add -fno-tree-vrp to dg-options. + * gcc.dg/unroll_2.c: Likewise. + * gcc.dg/unroll_3.c: Likewise. + * gcc.dg/unroll_4.c: Likewise. + * gcc.dg/vrp90.c: New test. + 2013-11-07 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58176 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp90.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp90.c new file mode 100644 index 0000000..836c335 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp90.c @@ -0,0 +1,36 @@ +/* { dg-do link } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ +/* { dg-final { scan-tree-dump-not "link_error" "vrp1"} } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ + +extern void link_error (void); + +__attribute__((noinline, noclone)) int +foo (unsigned int n, int r) +{ + int i; + if (n > 0) + { + asm (""); + if (n < 10) + { + asm (""); + do + { + --n; + r *= 2; + if (n >= 9) + link_error (); + } + while (n > 0); + } + } + return r + n; +} + +int +main () +{ + foo (7, 2); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/unroll_1.c b/gcc/testsuite/gcc.dg/unroll_1.c index 154c78e..378f819 100644 --- a/gcc/testsuite/gcc.dg/unroll_1.c +++ b/gcc/testsuite/gcc.dg/unroll_1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-rtl-loop2_unroll=stderr -fno-peel-loops -fdisable-tree-cunroll -fdisable-tree-cunrolli -fenable-rtl-loop2_unroll" } */ +/* { dg-options "-O2 -fdump-rtl-loop2_unroll=stderr -fno-peel-loops -fno-tree-vrp -fdisable-tree-cunroll -fdisable-tree-cunrolli -fenable-rtl-loop2_unroll" } */ unsigned a[100], b[100]; inline void bar() diff --git a/gcc/testsuite/gcc.dg/unroll_2.c b/gcc/testsuite/gcc.dg/unroll_2.c index 601b387..2322a49 100644 --- a/gcc/testsuite/gcc.dg/unroll_2.c +++ b/gcc/testsuite/gcc.dg/unroll_2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-rtl-loop2_unroll -fno-peel-loops -fdisable-tree-cunroll=foo -fdisable-tree-cunrolli=foo -fenable-rtl-loop2_unroll" } */ +/* { dg-options "-O2 -fdump-rtl-loop2_unroll -fno-peel-loops -fno-tree-vrp -fdisable-tree-cunroll=foo -fdisable-tree-cunrolli=foo -fenable-rtl-loop2_unroll" } */ unsigned a[100], b[100]; inline void bar() diff --git a/gcc/testsuite/gcc.dg/unroll_3.c b/gcc/testsuite/gcc.dg/unroll_3.c index 1f4216b..310bf06 100644 --- a/gcc/testsuite/gcc.dg/unroll_3.c +++ b/gcc/testsuite/gcc.dg/unroll_3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-rtl-loop2_unroll -fno-peel-loops -fdisable-tree-cunroll -fdisable-tree-cunrolli -fenable-rtl-loop2_unroll=foo" } */ +/* { dg-options "-O2 -fdump-rtl-loop2_unroll -fno-peel-loops -fno-tree-vrp -fdisable-tree-cunroll -fdisable-tree-cunrolli -fenable-rtl-loop2_unroll=foo" } */ unsigned a[100], b[100]; inline void bar() diff --git a/gcc/testsuite/gcc.dg/unroll_4.c b/gcc/testsuite/gcc.dg/unroll_4.c index 33d6ede..fbffbb0 100644 --- a/gcc/testsuite/gcc.dg/unroll_4.c +++ b/gcc/testsuite/gcc.dg/unroll_4.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-rtl-loop2_unroll -fno-peel-loops -fdisable-tree-cunroll -fdisable-tree-cunrolli -fenable-rtl-loop2_unroll=foo2" } */ +/* { dg-options "-O2 -fdump-rtl-loop2_unroll -fno-peel-loops -fno-tree-vrp -fdisable-tree-cunroll -fdisable-tree-cunrolli -fenable-rtl-loop2_unroll=foo2" } */ unsigned a[100], b[100]; inline void bar() diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 9b26f17..c1ff475 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -5904,6 +5904,34 @@ find_assert_locations (void) for (i = 0; i < rpo_cnt; ++i) bb_rpo[rpo[i]] = i; + /* Pre-seed loop latch liveness from loop header PHI nodes. Due to + the order we compute liveness and insert asserts we otherwise + fail to insert asserts into the loop latch. */ + loop_p loop; + loop_iterator li; + FOR_EACH_LOOP (li, loop, 0) + { + i = loop->latch->index; + unsigned int j = single_succ_edge (loop->latch)->dest_idx; + for (gimple_stmt_iterator gsi = gsi_start_phis (loop->header); + !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple phi = gsi_stmt (gsi); + if (virtual_operand_p (gimple_phi_result (phi))) + continue; + tree arg = gimple_phi_arg_def (phi, j); + if (TREE_CODE (arg) == SSA_NAME) + { + if (live[i] == NULL) + { + live[i] = sbitmap_alloc (num_ssa_names); + bitmap_clear (live[i]); + } + bitmap_set_bit (live[i], SSA_NAME_VERSION (arg)); + } + } + } + need_asserts = false; for (i = rpo_cnt - 1; i >= 0; --i) { |