diff options
author | Devang Patel <dpatel@apple.com> | 2006-04-18 17:44:05 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2006-04-18 17:44:05 +0000 |
commit | b4154e4fff391f3000e08027ff968da8fcce3a28 (patch) | |
tree | 3ab55fbd28dc8c366965db276295ef01f85da87e | |
parent | 817428304d9249368db2b258b0e9779d19cefc06 (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-ppc | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog.apple-ppc | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/R4475058.C | 54 | ||||
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 3 |
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); |