summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-10 00:38:46 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-10 00:38:46 +0000
commit675f18129007fbd8230f84b786c5a4f6d9d0e155 (patch)
treee7b9077f8f868d6c3e6d9f22b17e5ffca21cfd6d
parentcaa5e7fd6922adeb19ffea66e98e9e8dd1bb1b49 (diff)
downloadlinaro-gcc-675f18129007fbd8230f84b786c5a4f6d9d0e155.tar.gz
linaro-gcc-675f18129007fbd8230f84b786c5a4f6d9d0e155.tar.bz2
linaro-gcc-675f18129007fbd8230f84b786c5a4f6d9d0e155.zip
PR ipa/64978
* ipa-cp.c (gather_caller_stats): Skip thunks. (propagate_constants_topo): Skip aliases. * g++.dg/torture/pr64978.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220557 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-cp.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr64978.C30
4 files changed, 43 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5981be87a1d..47574709f40 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-09 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/64978
+ * ipa-cp.c (gather_caller_stats): Skip thunks.
+ (propagate_constants_topo): Skip aliases.
+
2015-02-09 Kaz Kojima <kkojima@gcc.gnu.org>
PR target/64761
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 0c540eb61c7..440ced4900c 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -560,10 +560,7 @@ gather_caller_stats (struct cgraph_node *node, void *data)
struct cgraph_edge *cs;
for (cs = node->callers; cs; cs = cs->next_caller)
- if (cs->caller->thunk.thunk_p)
- cs->caller->call_for_symbol_thunks_and_aliases (gather_caller_stats,
- stats, false);
- else
+ if (!cs->caller->thunk.thunk_p)
{
stats->count_sum += cs->count;
stats->freq_sum += cs->frequency;
@@ -2643,7 +2640,7 @@ propagate_constants_topo (struct ipa_topo_info *topo)
for (cs = v->callees; cs; cs = cs->next_callee)
if (ipa_edge_within_scc (cs)
&& propagate_constants_accross_call (cs))
- push_node_to_stack (topo, cs->callee);
+ push_node_to_stack (topo, cs->callee->function_symbol ());
v = pop_node_from_stack (topo);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 67f1e8e5355..f34de6ed35d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-02-08 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/64978
+ * g++.dg/torture/pr64978.C: New testcase.
+
2015-02-09 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/64981
diff --git a/gcc/testsuite/g++.dg/torture/pr64978.C b/gcc/testsuite/g++.dg/torture/pr64978.C
new file mode 100644
index 00000000000..a9ac49f8e12
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr64978.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+class A {
+public:
+ A(int, int);
+};
+class B {
+public:
+ void m_fn1(bool, const int *, int &);
+ unsigned m_fn2();
+};
+namespace {
+class C {
+ B &VTables;
+ void m_fn3(A, unsigned, const int *, int &);
+
+public:
+ int VFTableBuilder_VisitedBases;
+ B VFTableBuilder_VTables;
+ C() : VTables(VFTableBuilder_VTables) {
+ m_fn3(A(0, 0), 0, 0, VFTableBuilder_VisitedBases);
+ }
+};
+}
+int a;
+void C::m_fn3(A, unsigned, const int *, int &) {
+ for (;;)
+ 1 ? VTables.m_fn2() : 0;
+}
+void B::m_fn1(bool, const int *, int &) { C(); }
+unsigned B::m_fn2() { m_fn1(0, 0, a); }