re PR regression/58165 (internal compiler error: verify_flow_info)

PR tree-optimization/58165
	* tree-call-cdce.c (shrink_wrap_one_built_in_call): If
	bi_call must be the last stmt in a bb, don't split_block, instead
	use fallthru edge from it and give up if there is none.
	Release conds vector when returning early.

	* g++.dg/opt/pr58165.C: New test.

From-SVN: r201780
This commit is contained in:
Jakub Jelinek 2013-08-16 10:57:29 +02:00 committed by Jakub Jelinek
parent a23d240db0
commit 7a46059462
4 changed files with 45 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2013-08-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/58165
* tree-call-cdce.c (shrink_wrap_one_built_in_call): If
bi_call must be the last stmt in a bb, don't split_block, instead
use fallthru edge from it and give up if there is none.
Release conds vector when returning early.
2013-08-14 Xinliang David Li <davidxl@google.com>
* config/i386/i386.c (ix86_option_override_internal):

View File

@ -1,3 +1,8 @@
2013-08-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/58165
* g++.dg/opt/pr58165.C: New test.
2013-08-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51912

View File

@ -0,0 +1,14 @@
// PR tree-optimization/58165
// { dg-do compile }
// { dg-options "-O2" }
extern "C" float sqrtf (float);
struct A { A (); ~A (); };
void
foo (double d)
{
A a;
sqrtf (d);
}

View File

@ -726,15 +726,28 @@ shrink_wrap_one_built_in_call (gimple bi_call)
return false and do not do any transformation for
the call. */
if (nconds == 0)
return false;
{
conds.release ();
return false;
}
bi_call_bb = gimple_bb (bi_call);
/* Now find the join target bb -- split
bi_call_bb if needed. */
bi_call_bsi = gsi_for_stmt (bi_call);
/* Now find the join target bb -- split bi_call_bb if needed. */
if (stmt_ends_bb_p (bi_call))
{
/* If the call must be the last in the bb, don't split the block,
it could e.g. have EH edges. */
join_tgt_in_edge_from_call = find_fallthru_edge (bi_call_bb->succs);
if (join_tgt_in_edge_from_call == NULL)
{
conds.release ();
return false;
}
}
else
join_tgt_in_edge_from_call = split_block (bi_call_bb, bi_call);
join_tgt_in_edge_from_call = split_block (bi_call_bb, bi_call);
bi_call_bsi = gsi_for_stmt (bi_call);
join_tgt_bb = join_tgt_in_edge_from_call->dest;