+2017-01-31 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/79267
+ * value-prof.c (gimple_ic): Only drop lhs for noreturn calls
+ if should_remove_lhs_p is true.
+
2017-01-30 Alexandre Oliva <aoliva@redhat.com>
PR debug/63238
+2017-01-31 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/79267
+ * g++.dg/opt/pr79267.C: New test.
+
2017-01-30 Alexandre Oliva <aoliva@redhat.com>
PR debug/63238
--- /dev/null
+// PR tree-optimization/79267
+// { dg-do compile }
+// { dg-options "-O3" }
+
+struct A { A (int); };
+struct B
+{
+ virtual void av () = 0;
+ void aw ();
+ void h () { av (); aw (); }
+};
+template <class T> struct G : B
+{
+ T ba;
+ G (int, T) : ba (0) {}
+ void av () { ba (0); }
+};
+struct I
+{
+ B *bc;
+ template <class j, class T> I (j, T) try { G<T> (0, 0); } catch (...) {}
+ ~I () { bc->h (); }
+};
+template <class M> struct C { typedef M *i; };
+template <class M> struct J
+{
+ J ();
+ template <class O, class T> J (O, T p2) : be (0, p2) {}
+ typename C<M>::i operator-> ();
+ I be;
+};
+struct H : A { H () : A (0) {} };
+struct D { J<int> d; void q (); };
+template <typename = int> class bs;
+int z;
+
+void
+foo (int p1, int *, int)
+{
+ if (p1 == 0)
+ throw H ();
+}
+
+D bar ();
+template <typename T> struct L
+{
+ struct K { K (int); void operator() (int *) { bar ().q (); } };
+ static J<T> bp () { bq (0); }
+ template <typename br> static void bq (br) { J<T> (0, K (0)); }
+};
+struct F
+{
+ virtual J<int> x (int) { foo (0, 0, 0); J<bs<> > (L<bs<> >::bp ()); }
+};
+
+void
+baz ()
+{
+ if (z)
+ {
+ J<F> d, e;
+ d->x (0);
+ e->x (0);
+ }
+ J<F> v, i, j;
+ v->x (0);
+ i->x (0);
+ j->x (0);
+}
dcall_stmt = as_a <gcall *> (gimple_copy (icall_stmt));
gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
dflags = flags_from_decl_or_type (direct_call->decl);
- if ((dflags & ECF_NORETURN) != 0)
+ if ((dflags & ECF_NORETURN) != 0
+ && should_remove_lhs_p (gimple_call_lhs (dcall_stmt)))
gimple_call_set_lhs (dcall_stmt, NULL_TREE);
gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);