This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 5)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>,Jakub Jelinek <jakub at redhat dot com>
- Cc: Jan Hubicka <hubicka at ucw dot cz>,gcc-patches at gcc dot gnu dot org
- Date: Thu, 09 Jan 2014 21:07:12 +0100
- Subject: Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 5)
- Authentication-results: sourceware.org; auth=none
- References: <20140109110935 dot GW892 at tucnak dot redhat dot com> <alpine dot LSU dot 2 dot 11 dot 1401091212180 dot 4623 at zhemvz dot fhfr dot qr> <20140109111854 dot GY892 at tucnak dot redhat dot com> <alpine dot LSU dot 2 dot 11 dot 1401091230240 dot 4623 at zhemvz dot fhfr dot qr> <20140109120657 dot GZ892 at tucnak dot redhat dot com> <alpine dot LSU dot 2 dot 11 dot 1401091329580 dot 4623 at zhemvz dot fhfr dot qr> <20140109123637 dot GB892 at tucnak dot redhat dot com> <alpine dot LSU dot 2 dot 11 dot 1401091408230 dot 4623 at zhemvz dot fhfr dot qr> <20140109132609 dot GD892 at tucnak dot redhat dot com> <alpine dot LSU dot 2 dot 11 dot 1401091426350 dot 4623 at zhemvz dot fhfr dot qr> <20140109182328 dot GK892 at tucnak dot redhat dot com>
Jakub Jelinek <jakub@redhat.com> wrote:
>On Thu, Jan 09, 2014 at 02:27:40PM +0100, Richard Biener wrote:
>> > Perhaps, if you don't like the !gimple_in_ssa_p (cfun) in the
>condition
>> > we can just drop the lhs always in that case, just doing what we do
>for
>> > __builtin_unreachable if lhs is SSA_NAME:
>> > tree var = create_tmp_var (TREE_TYPE (lhs), NULL);
>> > tree def = get_or_create_ssa_default_def (cfun, var);
>> > gsi_insert_after (gsi, gimple_build_assign (lhs, def),
>GSI_NEW_STMT);
>>
>> That works for me.
>
>So like this?
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok?
Ok,
Thanks.
>2014-01-09 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/59622
> * gimple-fold.c (gimple_fold_call): Fix a typo in message. For
> __builtin_unreachable replace the OBJ_TYPE_REF call with a call to
> __builtin_unreachable and add if needed a setter of the lhs SSA_NAME.
> Don't devirtualize for inplace at all. For targets.length () == 1,
> if the call is noreturn and cfun isn't in SSA form yet, clear lhs.
>
> * g++.dg/opt/pr59622-2.C: New test.
> * g++.dg/opt/pr59622-3.C: New test.
> * g++.dg/opt/pr59622-4.C: New test.
> * g++.dg/opt/pr59622-5.C: New test.
>
>--- gcc/gimple-fold.c.jj 2014-01-08 17:44:57.690582374 +0100
>+++ gcc/gimple-fold.c 2014-01-09 14:34:40.816149806 +0100
>@@ -1167,7 +1167,7 @@ gimple_fold_call (gimple_stmt_iterator *
> (OBJ_TYPE_REF_EXPR (callee)))))
> {
> fprintf (dump_file,
>- "Type inheritnace inconsistent devirtualization of ");
>+ "Type inheritance inconsistent devirtualization of ");
> print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
> fprintf (dump_file, " to ");
> print_generic_expr (dump_file, callee, TDF_SLIM);
>@@ -1177,24 +1177,45 @@ gimple_fold_call (gimple_stmt_iterator *
> gimple_call_set_fn (stmt, OBJ_TYPE_REF_EXPR (callee));
> changed = true;
> }
>- else if (flag_devirtualize && virtual_method_call_p (callee))
>+ else if (flag_devirtualize && !inplace && virtual_method_call_p
>(callee))
> {
> bool final;
> vec <cgraph_node *>targets
> = possible_polymorphic_call_targets (callee, &final);
> if (final && targets.length () <= 1)
> {
>+ tree lhs = gimple_call_lhs (stmt);
> if (targets.length () == 1)
> {
> gimple_call_set_fndecl (stmt, targets[0]->decl);
> changed = true;
>+ /* If the call becomes noreturn, remove the lhs. */
>+ if (lhs && (gimple_call_flags (stmt) & ECF_NORETURN))
>+ {
>+ if (TREE_CODE (lhs) == SSA_NAME)
>+ {
>+ tree var = create_tmp_var (TREE_TYPE (lhs), NULL);
>+ tree def = get_or_create_ssa_default_def (cfun, var);
>+ gimple new_stmt = gimple_build_assign (lhs, def);
>+ gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
>+ }
>+ gimple_call_set_lhs (stmt, NULL_TREE);
>+ }
> }
>- else if (!inplace)
>+ else
> {
> tree fndecl = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
> gimple new_stmt = gimple_build_call (fndecl, 0);
> gimple_set_location (new_stmt, gimple_location (stmt));
>- gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
>+ if (lhs && TREE_CODE (lhs) == SSA_NAME)
>+ {
>+ tree var = create_tmp_var (TREE_TYPE (lhs), NULL);
>+ tree def = get_or_create_ssa_default_def (cfun, var);
>+ gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
>+ update_call_from_tree (gsi, def);
>+ }
>+ else
>+ gsi_replace (gsi, new_stmt, true);
> return true;
> }
> }
>--- gcc/testsuite/g++.dg/opt/pr59622-2.C.jj 2014-01-09
>10:57:46.246694025 +0100
>+++ gcc/testsuite/g++.dg/opt/pr59622-2.C 2014-01-09 10:57:46.246694025
>+0100
>@@ -0,0 +1,21 @@
>+// PR tree-optimization/59622
>+// { dg-do compile }
>+// { dg-options "-O2" }
>+
>+namespace
>+{
>+ struct A
>+ {
>+ A () {}
>+ virtual A *bar (int) = 0;
>+ A *baz (int x) { return bar (x); }
>+ };
>+}
>+
>+A *a;
>+
>+void
>+foo ()
>+{
>+ a->baz (0);
>+}
>--- gcc/testsuite/g++.dg/opt/pr59622-3.C.jj 2014-01-09
>10:57:46.247694040 +0100
>+++ gcc/testsuite/g++.dg/opt/pr59622-3.C 2014-01-09 10:57:46.247694040
>+0100
>@@ -0,0 +1,21 @@
>+// PR tree-optimization/59622
>+// { dg-do compile }
>+// { dg-options "-O2" }
>+
>+struct C { int a; int b; };
>+
>+namespace
>+{
>+ struct A
>+ {
>+ virtual C foo ();
>+ C bar () { return foo (); }
>+ };
>+}
>+
>+C
>+baz ()
>+{
>+ A a;
>+ return a.bar ();
>+}
>--- gcc/testsuite/g++.dg/opt/pr59622-4.C.jj 2014-01-09
>10:57:46.247694040 +0100
>+++ gcc/testsuite/g++.dg/opt/pr59622-4.C 2014-01-09 10:57:46.247694040
>+0100
>@@ -0,0 +1,23 @@
>+// PR tree-optimization/59622
>+// { dg-do compile }
>+// { dg-options "-O2" }
>+
>+struct C { int a; int b; };
>+
>+namespace
>+{
>+ struct A
>+ {
>+ A () {}
>+ virtual C bar (int) = 0;
>+ C baz (int x) { return bar (x); }
>+ };
>+}
>+
>+A *a;
>+
>+C
>+foo ()
>+{
>+ return a->baz (0);
>+}
>--- gcc/testsuite/g++.dg/opt/pr59622-5.C.jj 2014-01-09
>11:06:11.862133398 +0100
>+++ gcc/testsuite/g++.dg/opt/pr59622-5.C 2014-01-09 10:54:04.000000000
>+0100
>@@ -0,0 +1,26 @@
>+// PR tree-optimization/59622
>+// { dg-do compile }
>+// { dg-options "-O2" }
>+
>+namespace
>+{
>+ struct A
>+ {
>+ A () {}
>+ virtual A *bar (int);
>+ A *baz (int x) { return bar (x); }
>+ };
>+
>+ __attribute__((noreturn)) A *A::bar (int)
>+ {
>+ __builtin_exit (0);
>+ }
>+}
>+
>+A *a;
>+
>+void
>+foo ()
>+{
>+ a->baz (0);
>+}
>
>
> Jakub
- References:
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- Re: [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 3)
- [PATCH] Fix devirtualization ICE (PR tree-optimization/59622, take 5)