aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2009-06-03 13:56:05 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2009-06-03 13:56:05 +0200
commit9961eb45689d012c3c4f129bb15a30d12eed8888 (patch)
tree0742db283bbfcef77a7275dca113b22c33b05371 /gcc
parentcdaa0e0b8c1cd7569b50ab50819401f7d399983b (diff)
downloadgcc-9961eb45689d012c3c4f129bb15a30d12eed8888.zip
gcc-9961eb45689d012c3c4f129bb15a30d12eed8888.tar.gz
gcc-9961eb45689d012c3c4f129bb15a30d12eed8888.tar.bz2
re PR tree-optimization/40323 (compiling just takes forever and doesn't really process)
2009-06-03 Martin Jambor <mjambor@suse.cz> PR tree-optimization/40323 * ipa-prop.c (get_ssa_def_if_simple_copy): Break if not single assignment. * testsuite/g++.dg/torture/pr40323.C: New file. From-SVN: r148126
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-prop.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/torture/pr40323.C68
4 files changed, 80 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b289d6c..b8392d2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-06-03 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/40323
+ * ipa-prop.c (get_ssa_def_if_simple_copy): Break if not single
+ assignment.
+
2009-06-03 Richard Guenther <rguenther@suse.de>
* tree-ssa-sccvn.c (copy_reference_ops_from_ref): Use DECL_SIZE
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 6f5e26b..a376f45 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -440,6 +440,8 @@ get_ssa_def_if_simple_copy (tree rhs)
if (gimple_assign_single_p (def_stmt))
rhs = gimple_assign_rhs1 (def_stmt);
+ else
+ break;
}
return rhs;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 981a891..2fe13e1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-06-03 Martin Jambor <mjambor@suse.cz>
+
+ * g++.dg/torture/pr40323.C: New file.
+
2009-06-03 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/root.ads: New test.
diff --git a/gcc/testsuite/g++.dg/torture/pr40323.C b/gcc/testsuite/g++.dg/torture/pr40323.C
new file mode 100644
index 0000000..adecf7f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr40323.C
@@ -0,0 +1,68 @@
+/* Testcase for PR 40323. */
+/* { dg-do compile } */
+/* { dg-options "-fno-early-inlining" } */
+/* { dg-options "-fno-early-inlining -fpie" { target { ! nonpic } } } */
+
+extern void do_something (const char *, int);
+
+class Parent
+{
+private:
+ const char *data;
+
+public:
+ Parent (const char *d) : data(d)
+ {}
+
+ int funcOne (int delim) const;
+};
+
+class AnotherParent
+{
+private:
+ double d;
+public:
+ AnotherParent (void) : d(0)
+ {}
+};
+
+
+class Child : public AnotherParent, Parent
+{
+private:
+ int zzz;
+public:
+ Child (const char *d) : Parent(d)
+ {}
+};
+
+
+int Parent::funcOne (int delim) const
+{
+ int i;
+ for (i = 0; i < delim; i++)
+ do_something(data, i);
+
+ return 1;
+}
+
+int docalling (int (Child::* f)(int delim) const)
+{
+ Child S ("muhehehe");
+
+ return (S.*f)(4);
+}
+
+typedef int (Parent::* my_mp_type)(int delim);
+
+int main (int argc, char *argv[])
+{
+ int i;
+ int (Parent::* f)(int ) const;
+ int (Child::* g)(int ) const;
+
+ f = &Parent::funcOne;
+ g = (int (Child::* )(int) const) f;
+ i = docalling (g);
+ return i;
+}