diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d9f37e82e5ad5453186276411ebebdb625333cb0..f8a9aff6c15cec4bd176a58bc50dc1f9d9c0038b 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 a07270af87de748b69ecc8015eabe689fd4db352..3437101f9355c6f27b9383c03b18825fb024c9dd 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 0000000000000000000000000000000000000000..bac882156b552b0d25a35268c4a52a8fca7acfa5
--- /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 bca0e8473aeb347cb0624ff23b23d8d0f2cf1f1d..cddd2d1df58e68389f54b6415a133e6e30f240e8 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