aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2013-11-07 15:28:57 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-11-07 15:28:57 +0100
commitd23c0a32ab98d6c170970bb1ee319c6fc967852d (patch)
tree37d8f2f72fa52335e8f3aedab00ddc0e57ef358a
parentfe79fc067e750e2e8a7e22861a088b8fde07ebbc (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp90.c36
-rw-r--r--gcc/testsuite/gcc.dg/unroll_1.c2
-rw-r--r--gcc/testsuite/gcc.dg/unroll_2.c2
-rw-r--r--gcc/testsuite/gcc.dg/unroll_3.c2
-rw-r--r--gcc/testsuite/gcc.dg/unroll_4.c2
-rw-r--r--gcc/tree-vrp.c28
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)
{