re PR tree-optimization/78224 (g++ ICE at -O2(-O1 on gcc6) and above in verify_loop_structure, at cfgloop.c:1646)

2016-11-08  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/78224
	* tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds):
	Split the fallthru edge in case its successor may have PHIs.
	Do not free dominance info.

	* g++.dg/torture/pr78224.C: New testcase.

From-SVN: r241955
This commit is contained in:
Richard Biener 2016-11-08 08:03:54 +00:00 committed by Richard Biener
parent 06658c6d05
commit ed053eb824
4 changed files with 72 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2016-11-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/78224
* tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds):
Split the fallthru edge in case its successor may have PHIs.
Do not free dominance info.
2016-11-07 Jakub Jelinek <jakub@redhat.com>
PR target/78229

View File

@ -1,3 +1,8 @@
2016-11-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/78224
* g++.dg/torture/pr78224.C: New testcase.
2016-11-08 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* gcc.dg/store_merging_1.c: Require store_merge.

View File

@ -0,0 +1,51 @@
// { dg-do compile }
extern "C"{
float sqrtf(float);
}
inline float squareroot(const float f)
{
return sqrtf(f);
}
inline int squareroot(const int f)
{
return static_cast<int>(sqrtf(static_cast<float>(f)));
}
template <class T>
class vector2d
{
public:
vector2d(T nx, T ny) : X(nx), Y(ny) {}
T getLength() const { return squareroot( X*X + Y*Y ); }
T X;
T Y;
};
vector2d<int> getMousePos();
class Client
{
public:
Client();
~Client();
};
void the_game(float turn_amount)
{
Client client;
bool first = true;
while (1) {
if (first) {
first = false;
} else {
int dx = getMousePos().X;
int dy = getMousePos().Y;
turn_amount = vector2d<float>(dx, dy).getLength();
}
}
}

View File

@ -807,15 +807,20 @@ shrink_wrap_one_built_in_call_with_conds (gcall *bi_call, vec <gimple *> conds,
can_guard_call_p. */
join_tgt_in_edge_from_call = find_fallthru_edge (bi_call_bb->succs);
gcc_assert (join_tgt_in_edge_from_call);
free_dominance_info (CDI_DOMINATORS);
/* We don't want to handle PHIs. */
if (EDGE_COUNT (join_tgt_in_edge_from_call->dest->preds) > 1)
join_tgt_bb = split_edge (join_tgt_in_edge_from_call);
else
join_tgt_bb = join_tgt_in_edge_from_call->dest;
}
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);
join_tgt_bb = join_tgt_in_edge_from_call->dest;
}
bi_call_bsi = gsi_for_stmt (bi_call);
join_tgt_bb = join_tgt_in_edge_from_call->dest;
/* Now it is time to insert the first conditional expression
into bi_call_bb and split this bb so that bi_call is
shrink-wrapped. */