aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-09-17 07:47:49 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-09-17 07:47:49 +0000
commitdeb6c11a73e8d651d367950b5ea35ee5f60c3a85 (patch)
tree5503f1fa8c1ef7d6aec0b94ebada2f7c4bcb7308 /gcc
parentc068654bb158dbe4c7d43a2841789b6b0c543a27 (diff)
downloadgcc-deb6c11a73e8d651d367950b5ea35ee5f60c3a85.zip
gcc-deb6c11a73e8d651d367950b5ea35ee5f60c3a85.tar.gz
gcc-deb6c11a73e8d651d367950b5ea35ee5f60c3a85.tar.bz2
re PR tree-optimization/58432 (ICE: in insert_value_copy_on_edge, at tree-outof-ssa.c:233)
2013-09-17 Richard Biener <rguenther@suse.de> PR tree-optimization/58432 * tree-loop-distribution.c (tree_loop_distribution): Also scan PHIs for outside loop uses and seed a partition from them. * gcc.dg/pr58432.c: New testcase. From-SVN: r202644
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr58432.c17
-rw-r--r--gcc/tree-loop-distribution.c11
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ebb3564..6c75db0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-09-17 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/58432
+ * tree-loop-distribution.c (tree_loop_distribution): Also
+ scan PHIs for outside loop uses and seed a partition from them.
+
2013-09-17 Bin Cheng <bin.cheng@arm.com>
* gimple-ssa-strength-reduction.c (backtrace_base_for_ref): New.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fedd457..050e220 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-09-17 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/58432
+ * gcc.dg/pr58432.c: New testcase.
+
2013-09-17 Bin Cheng <bin.cheng@arm.com>
* gcc.dg/tree-ssa/slsr-39.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr58432.c b/gcc/testsuite/gcc.dg/pr58432.c
new file mode 100644
index 0000000..22a720f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr58432.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-require-profiling "-fprofile-generate" } */
+/* { dg-options "-O3 -fprofile-generate" } */
+
+struct {
+ int prefix;
+ int dir_idx;
+} *a;
+int b;
+void fn1() {
+ int *c, *d;
+ for (; b; b++)
+ if (d[b]) {
+ c[b] = d[b];
+ a[0].dir_idx = 0;
+ }
+}
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index e3e4e12..7482d8c 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -1676,6 +1676,17 @@ tree_loop_distribution (void)
for (i = 0; i < loop->num_nodes; ++i)
{
gimple_stmt_iterator gsi;
+ for (gsi = gsi_start_phis (bbs[i]); !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gimple phi = gsi_stmt (gsi);
+ if (virtual_operand_p (gimple_phi_result (phi)))
+ continue;
+ /* Distribute stmts which have defs that are used outside of
+ the loop. */
+ if (!stmt_has_scalar_dependences_outside_loop (loop, phi))
+ continue;
+ work_list.safe_push (phi);
+ }
for (gsi = gsi_start_bb (bbs[i]); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple stmt = gsi_stmt (gsi);