summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-18 08:46:23 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-18 08:46:23 +0000
commit5dbdbadce9abd166b3e176fb9752352e3bc25027 (patch)
tree79596190e659803867abccc985dbf62d3ac38592 /gcc
parentf6c9396c3cbca6b6c1050d5027019ebb2c21461c (diff)
downloadgcc-5dbdbadce9abd166b3e176fb9752352e3bc25027.tar.gz
2007-09-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/33340 * tree-ssa-sccvn.c (set_ssa_val_to): Do not set values to SSA_NAMEs that occur in abnormal PHI nodes. * g++.dg/torture/pr33340.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128571 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr33340.C27
-rw-r--r--gcc/tree-ssa-sccvn.c5
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d9f37e82e5a..f8a9aff6c15 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-18 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/33340
+ * tree-ssa-sccvn.c (set_ssa_val_to): Do not set values to
+ SSA_NAMEs that occur in abnormal PHI nodes.
+
2007-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* tree-cfg.c (is_ctrl_altering_stmt, tree_block_ends_with_call_p):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a07270af87d..3437101f935 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-09-18 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/33340
+ * g++.dg/torture/pr33340.C: New testcase.
+
2007-09-18 Tobias Burnus <burnus@net-b.de>
PR fortran/33231
diff --git a/gcc/testsuite/g++.dg/torture/pr33340.C b/gcc/testsuite/g++.dg/torture/pr33340.C
new file mode 100644
index 00000000000..bac882156b5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr33340.C
@@ -0,0 +1,27 @@
+void* operator new(__SIZE_TYPE__, void* __p) { }
+
+struct auto_ptr {
+ int* p;
+ ~auto_ptr() { delete p; }
+};
+
+typedef void* T;
+struct vector {
+ void push_back(const T& __x) {
+ ::new(0) T(__x);
+ insert(__x);
+ }
+ void insert(const T& __x);
+} v;
+
+void g();
+void f() {
+ auto_ptr ap;
+ if (ap.p) {
+ ap.p = new int();
+ }
+ g();
+ int* tmp = ap.p;
+ ap.p = 0;
+ v.push_back(tmp);
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index bca0e8473ae..cddd2d1df58 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1022,6 +1022,11 @@ set_ssa_val_to (tree from, tree to)
{
tree currval;
+ if (from != to
+ && TREE_CODE (to) == SSA_NAME
+ && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (to))
+ to = from;
+
/* The only thing we allow as value numbers are VN_TOP, ssa_names
and invariants. So assert that here. */
gcc_assert (to != NULL_TREE