diff mbox series

Revert one more symbol_summary::get to ::get_create (PR ipa/86529).

Message ID 481a14c1-0668-d370-5006-1d3f67d3525f@suse.cz
State New
Headers show
Series Revert one more symbol_summary::get to ::get_create (PR ipa/86529). | expand

Commit Message

Martin Liška July 16, 2018, 1:31 p.m. UTC
Hi.

This is one more revert related to symbol_summary.
Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
I'm going to install the patch.

Martin

gcc/ChangeLog:

2018-07-16  Martin Liska  <mliska@suse.cz>

        PR ipa/86529
	* ipa-pure-const.c (malloc_candidate_p): Revert ::get
        to ::get_create.

gcc/testsuite/ChangeLog:

2018-07-16  Martin Liska  <mliska@suse.cz>

        PR ipa/86529
	* g++.dg/ipa/pr86529.C: New test.
---
 gcc/ipa-pure-const.c               |  3 +-
 gcc/testsuite/g++.dg/ipa/pr86529.C | 44 ++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/ipa/pr86529.C
diff mbox series

Patch

diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
index dede783bd5f..a9a8863d907 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -958,8 +958,7 @@  malloc_candidate_p (function *fun, bool ipa)
 	      cgraph_edge *cs = node->get_edge (call_stmt);
 	      if (cs)
 		{
-		  ipa_call_summary *es = ipa_call_summaries->get (cs);
-		  gcc_assert (es);
+		  ipa_call_summary *es = ipa_call_summaries->get_create (cs);
 		  es->is_return_callee_uncaptured = true;
 		}
 	    }
diff --git a/gcc/testsuite/g++.dg/ipa/pr86529.C b/gcc/testsuite/g++.dg/ipa/pr86529.C
new file mode 100644
index 00000000000..d753295b0a4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr86529.C
@@ -0,0 +1,44 @@ 
+// { dg-do compile }
+// { dg-options "-fipa-pure-const -std=c++11" }
+
+namespace std {
+class type_info {
+public:
+  bool operator==(type_info);
+};
+class c {
+public:
+  c(int) {}
+  type_info b;
+  virtual void *d() {
+    if (b == typeid(int))
+      return e();
+    return nullptr;
+  }
+  int *e() noexcept;
+};
+class h {
+public:
+  template <typename g, typename f> h(g, f j) { new c(j); }
+};
+class k {
+protected:
+  int n;
+  k() : i(0, n) {}
+  h i;
+};
+class F : k {
+  public:
+  F(int, int) {}
+  template <typename, typename f, typename...> friend F l(const f &);
+};
+template <typename, typename f, typename...> F l(const f &p1) { F x(int(), p1); return x; }
+template <typename> F m() { l<int>(int()); return F(0, 0); }
+class D {
+  F p;
+
+public:
+  D() : p(m<int>()) {}
+};
+} // namespace std
+std::D a;