aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-09-18 11:38:25 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-09-18 11:38:25 +0000
commita9db10d4aa286aa482d3305e71a3b3a14ae4360d (patch)
tree9ab1c7cb41385ab68e81963d8e7e89884da2e64a /gcc
parent5d3b14bd9ac79db3f2b957752b41bd0641f49829 (diff)
downloadgcc-a9db10d4aa286aa482d3305e71a3b3a14ae4360d.zip
gcc-a9db10d4aa286aa482d3305e71a3b3a14ae4360d.tar.gz
gcc-a9db10d4aa286aa482d3305e71a3b3a14ae4360d.tar.bz2
re PR tree-optimization/45709 (internal compiler error: in add_phi_arg, at tree-phinodes.c:395)
2010-09-18 Richard Guenther <rguenther@suse.de> PR tree-optimization/45709 * tree-inline.c (copy_phis_for_bb): Fixup new_edge when we splitted it. * g++.dg/torture/pr45709.C: New testcase. From-SVN: r164390
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/torture/pr45709.C19
-rw-r--r--gcc/tree-inline.c5
3 files changed, 29 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3e51ca8..9b0679e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-09-18 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/45709
+ * tree-inline.c (copy_phis_for_bb): Fixup new_edge when
+ we splitted it.
+
2010-09-17 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (dot_deps): Add DEBUG_FUNCTION.
diff --git a/gcc/testsuite/g++.dg/torture/pr45709.C b/gcc/testsuite/g++.dg/torture/pr45709.C
new file mode 100644
index 0000000..1584ec7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr45709.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+struct Region {
+ int storage[4];
+ int count;
+};
+static inline Region subtract(int lhs)
+{
+ Region reg;
+ int* storage = reg.storage;
+ if (lhs > 0)
+ storage++;
+ reg.count = storage - reg.storage;
+ return reg;
+}
+void bar(int a)
+{
+ const Region copyBack(subtract(a));
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 2d3958f..32cd852 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -2021,8 +2021,11 @@ copy_phis_for_bb (basic_block bb, copy_body_data *id)
&& !is_gimple_val (new_arg))
{
gimple_seq stmts = NULL;
+ basic_block tem;
new_arg = force_gimple_operand (new_arg, &stmts, true, NULL);
- gsi_insert_seq_on_edge_immediate (new_edge, stmts);
+ tem = gsi_insert_seq_on_edge_immediate (new_edge, stmts);
+ if (tem)
+ new_edge = single_succ_edge (tem);
}
add_phi_arg (new_phi, new_arg, new_edge,
gimple_phi_arg_location_from_edge (phi, old_edge));