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
This commit is contained in:
Jakub Jelinek 2013-12-31 12:57:39 +01:00 committed by Jakub Jelinek
parent c1618f8254
commit cf3e5a89ae
4 changed files with 44 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2013-12-31 Jakub Jelinek <jakub@redhat.com>
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 <alexander.ivchenko@intel.com>
Maxim Kuznetsov <maxim.kuznetsov@intel.com>
Sergey Lega <sergey.s.lega@intel.com>

View File

@ -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;
}
}
}
}

View File

@ -1,3 +1,8 @@
2013-12-31 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/59622
* g++.dg/opt/pr59622.C: New test.
2013-12-31 Alexander Ivchenko <alexander.ivchenko@intel.com>
Maxim Kuznetsov <maxim.kuznetsov@intel.com>
Sergey Lega <sergey.s.lega@intel.com>

View File

@ -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 ();
}