From: Jakub Jelinek Date: Tue, 31 Dec 2013 11:57:39 +0000 (+0100) Subject: re PR tree-optimization/59622 (internal compiler error: verify_gimple failed) X-Git-Tag: upstream/12.2.0~65696 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cf3e5a89aecd15ead7177517b7f3b6e3c4c66645;p=platform%2Fupstream%2Fgcc.git re PR tree-optimization/59622 (internal compiler error: verify_gimple failed) PR tree-optimization/59622 * gimple-fold.c (gimple_fold_call): Don't replace OBJ_TYPE_REF call fndecl with 0 possible targets with BUILT_IN_UNREACHABLE, instead only for !inplace add a __builtin_unreachable () call before the call. * g++.dg/opt/pr59622.C: New test. From-SVN: r206264 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ce8001..73c4762 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-12-31 Jakub Jelinek + + PR tree-optimization/59622 + * gimple-fold.c (gimple_fold_call): Don't replace OBJ_TYPE_REF + call fndecl with 0 possible targets with BUILT_IN_UNREACHABLE, + instead only for !inplace add a __builtin_unreachable () call + before the call. + 2013-12-31 Alexander Ivchenko Maxim Kuznetsov Sergey Lega diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 3b6fc57..1d9d824 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -1184,13 +1184,19 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace) = possible_polymorphic_call_targets (callee, &final); if (final && targets.length () <= 1) { - tree fndecl; if (targets.length () == 1) - fndecl = targets[0]->decl; - else - fndecl = builtin_decl_implicit (BUILT_IN_UNREACHABLE); - gimple_call_set_fndecl (stmt, fndecl); - changed = true; + { + gimple_call_set_fndecl (stmt, targets[0]->decl); + changed = true; + } + else if (!inplace) + { + 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); + return true; + } } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 46d5c13..1ad8186 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-31 Jakub Jelinek + + PR tree-optimization/59622 + * g++.dg/opt/pr59622.C: New test. + 2013-12-31 Alexander Ivchenko Maxim Kuznetsov Sergey Lega diff --git a/gcc/testsuite/g++.dg/opt/pr59622.C b/gcc/testsuite/g++.dg/opt/pr59622.C new file mode 100644 index 0000000..1d8e998 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr59622.C @@ -0,0 +1,19 @@ +// PR tree-optimization/59622 +// { dg-do compile } +// { dg-options "-O2" } + +namespace +{ + struct A + { + virtual int foo (); + int bar () { return foo (); } + }; +} + +int +baz () +{ + A a; + return a.bar (); +}