diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-01-31 09:33:36 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-01-31 09:33:36 +0100 |
commit | b6dae84928a112b2f176ad168d8c5b7e0ecdd5cb (patch) | |
tree | 4e48957da84e536c6dd21300b0f28f58c8e79ec8 /gcc | |
parent | 40fb9c89e1599b2f13d1403820a9e0fb2c1129c1 (diff) | |
download | gcc-b6dae84928a112b2f176ad168d8c5b7e0ecdd5cb.zip gcc-b6dae84928a112b2f176ad168d8c5b7e0ecdd5cb.tar.gz gcc-b6dae84928a112b2f176ad168d8c5b7e0ecdd5cb.tar.bz2 |
re PR c++/79267 (internal compiler error with -O3 or -O2 -finline-functions)
PR tree-optimization/79267
* value-prof.c (gimple_ic): Only drop lhs for noreturn calls
if should_remove_lhs_p is true.
* g++.dg/opt/pr79267.C: New test.
From-SVN: r245053
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr79267.C | 69 | ||||
-rw-r--r-- | gcc/value-prof.c | 3 |
4 files changed, 82 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eed607a..8916373 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8210eae..96b25d6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/testsuite/g++.dg/opt/pr79267.C b/gcc/testsuite/g++.dg/opt/pr79267.C new file mode 100644 index 0000000..177eee6 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr79267.C @@ -0,0 +1,69 @@ +// 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); +} diff --git a/gcc/value-prof.c b/gcc/value-prof.c index d4da8c4..097e409 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -1358,7 +1358,8 @@ gimple_ic (gcall *icall_stmt, struct cgraph_node *direct_call, 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); |