aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-04-03 10:49:14 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-04-03 10:49:14 +0200
commit8a1da634352052e0094ae44c31360e3976239542 (patch)
tree6a0fe81981a99e6ecad3a8b44a0a72dfcf8f7bbd /gcc
parent1d3aa4665083eb2bcd1d394f935afc2aa4c34666 (diff)
downloadgcc-8a1da634352052e0094ae44c31360e3976239542.zip
gcc-8a1da634352052e0094ae44c31360e3976239542.tar.gz
gcc-8a1da634352052e0094ae44c31360e3976239542.tar.bz2
re PR middle-end/52835 (-O3 wrongly optimizes loop __builtin_memcpy away)
PR tree-optimization/52835 * tree-data-ref.c (build_rdg): Return NULL if compute_data_dependences_for_loop failed. * gfortran.dg/pr52835.f90: New test. From-SVN: r186101
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr52835.f9016
-rw-r--r--gcc/tree-data-ref.c11
4 files changed, 32 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 96bcc5c..72e14f4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-04-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/52835
+ * tree-data-ref.c (build_rdg): Return NULL if
+ compute_data_dependences_for_loop failed.
+
2012-04-03 Eric Botcazou <ebotcazou@adacore.com>
* varasm.c (initializer_constant_valid_for_bitfield_p): Return true
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5a5ee57..7fe8a18 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-04-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/52835
+ * gfortran.dg/pr52835.f90: New test.
+
2012-04-03 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/aggr5.ads: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr52835.f90 b/gcc/testsuite/gfortran.dg/pr52835.f90
new file mode 100644
index 0000000..a72951a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr52835.f90
@@ -0,0 +1,16 @@
+! PR tree-optimization/52835
+! { dg-do compile }
+! { dg-options "-O3 -fdump-tree-optimized" }
+
+subroutine foo (x, y, z, n)
+ integer :: n, i
+ real :: x(n), y(n), z(n)
+ do i = 1, n
+ z(i) = 0.0
+ y(i) = 0.0
+ call bar (y(i), z(i), x(i))
+ end do
+end subroutine
+
+! { dg-final { scan-tree-dump "bar " "optimized" } }
+! { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index 5dcafd3..6fb0d23 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -5109,20 +5109,19 @@ build_rdg (struct loop *loop,
VEC (data_reference_p, heap) **datarefs)
{
struct graph *rdg = NULL;
- VEC (gimple, heap) *stmts = VEC_alloc (gimple, heap, 10);
- compute_data_dependences_for_loop (loop, false, loop_nest, datarefs,
- dependence_relations);
-
- if (known_dependences_p (*dependence_relations))
+ if (compute_data_dependences_for_loop (loop, false, loop_nest, datarefs,
+ dependence_relations)
+ && known_dependences_p (*dependence_relations))
{
+ VEC (gimple, heap) *stmts = VEC_alloc (gimple, heap, 10);
stmts_from_loop (loop, &stmts);
rdg = build_empty_rdg (VEC_length (gimple, stmts));
create_rdg_vertices (rdg, stmts);
create_rdg_edges (rdg, *dependence_relations);
+ VEC_free (gimple, heap, stmts);
}
- VEC_free (gimple, heap, stmts);
return rdg;
}