aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2006-04-18 17:44:05 +0000
committerDevang Patel <dpatel@apple.com>2006-04-18 17:44:05 +0000
commitb4154e4fff391f3000e08027ff968da8fcce3a28 (patch)
tree3ab55fbd28dc8c366965db276295ef01f85da87e
parent817428304d9249368db2b258b0e9779d19cefc06 (diff)
Radar 4475058apple/gcc-5335
* tree-ssa-forwprop.c (all_uses_are_replacable): Processing of one worklist stmt may remove casts from another worklist item. * g++.dg/R4475058.C: New. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/apple-local-200502-branch@113052 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog.apple-ppc6
-rw-r--r--gcc/testsuite/ChangeLog.apple-ppc5
-rw-r--r--gcc/testsuite/g++.dg/R4475058.C54
-rw-r--r--gcc/tree-ssa-forwprop.c3
4 files changed, 68 insertions, 0 deletions
diff --git a/gcc/ChangeLog.apple-ppc b/gcc/ChangeLog.apple-ppc
index c7507c488a1..a60d479b24d 100644
--- a/gcc/ChangeLog.apple-ppc
+++ b/gcc/ChangeLog.apple-ppc
@@ -1,3 +1,9 @@
+2006-04-18 Devang Patel <dpatel@apple.com>
+
+ Radar 4475058
+ * tree-ssa-forwprop.c (all_uses_are_replacable): Processing of one
+ worklist stmt may remove casts from another worklist item.
+
2006-04-17 Devang Patel <dpatel@apple.com>
Radar 4499790
diff --git a/gcc/testsuite/ChangeLog.apple-ppc b/gcc/testsuite/ChangeLog.apple-ppc
index 7d22b382ece..862280b59a9 100644
--- a/gcc/testsuite/ChangeLog.apple-ppc
+++ b/gcc/testsuite/ChangeLog.apple-ppc
@@ -1,3 +1,8 @@
+2006-04-18 Devang Patel <dpatel@apple.com>
+
+ Radar 4475058
+ * g++.dg/R4475058.C: New.
+
2006-04-17 Devang Patel <dpatel@apple.com>
Radar 4499790
diff --git a/gcc/testsuite/g++.dg/R4475058.C b/gcc/testsuite/g++.dg/R4475058.C
new file mode 100644
index 00000000000..5454b16edc1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/R4475058.C
@@ -0,0 +1,54 @@
+/* APPLE LOCAL file Radar 4475058 */
+/* { dg-compile } */
+/* { dg-options "-O" } */
+
+struct C1
+{
+};
+
+template <class T> class T1
+{
+private:
+ T * _p;
+public:
+ T * operator -> () { return _p; }
+};
+
+class C2 : public C1
+{
+};
+
+class C3
+{
+public:
+ C1 * _c3f1(C2 *k, C1 *v);
+ C2 * c3f1(C2 *k, C2 *v) { return (C2 *)_c3f1(k, v); }
+};
+
+typedef T1<C3> RC3;
+class C4
+{
+public:
+ void c4f1( C4 * p);
+protected:
+ RC3 _pN;
+};
+
+C2 *foo (C2 **p)
+{
+ return *p;
+}
+
+class C5 : public C2
+{
+};
+
+void C4::c4f1( C4 * p)
+{
+ C2 * k;
+ C5 * n;
+
+ while ( ( n = (static_cast<C5*>(foo (&k)))))
+ _pN->c3f1( k, n);
+}
+
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index d74df297f82..71f32bcf24a 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -574,6 +574,9 @@ all_uses_are_replacable (tree stmt, bool replace)
int j, num_uses;
bool replacable = true;
+ if (!cast_conversion_assignment_p (stmt))
+ return false;
+
/* Now compute the immediate uses of TEST_VAR. */
df = get_immediate_uses (stmt);
num_uses = num_immediate_uses (df);