re PR tree-optimization/79034 (error: missing PHI def in verify_gimple_in_cfg)

2016-01-10  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/79034
	* tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds):
	Propagate out degenerate PHIs in the joiner.

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

From-SVN: r244274
This commit is contained in:
Richard Biener 2017-01-10 14:50:32 +00:00 committed by Richard Biener
parent a0843aedb8
commit aae23693f8
4 changed files with 75 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2016-01-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/79034
* tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds):
Propagate out degenerate PHIs in the joiner.
2017-01-10 Martin Liska <mliska@suse.cz>
* ipa-icf.c (sort_sem_items_by_decl_uid): New function.

View File

@ -1,3 +1,8 @@
2016-01-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/79034
* g++.dg/torture/pr79034.C: New testcase.
2017-01-10 Martin Liska <mliska@suse.cz>
* gcc.dg/ipa/ipa-icf-1.c: Change scanned pattern.

View File

@ -0,0 +1,52 @@
/* { dg-do compile } */
extern "C" {
float sqrtf(float);
}
class T {
public:
float floats[1];
inline float length() const {
return sqrtf(floats[0]);
}
};
void destruct(void *);
class Container {
T Ts[1];
public:
~Container() {
destruct((void *)Ts);
}
T& operator[](int n) {
return Ts[0];
}
};
void fill(Container&);
void doit()
{
Container data;
float max = 10;
int i, j, k;
for (i = 0; i < 10; i++) {
for (j = 1; j < 10; j++) {
if (max < 5)
break;
fill( data);
max = data[0].length();
for (k = 1; k < j; k++) {
max = 5;
}
}
}
}

View File

@ -811,7 +811,18 @@ shrink_wrap_one_built_in_call_with_conds (gcall *bi_call, vec <gimple *> conds,
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;
{
join_tgt_bb = join_tgt_in_edge_from_call->dest;
/* We may have degenerate PHIs in the destination. Propagate
those out. */
for (gphi_iterator i = gsi_start_phis (join_tgt_bb); !gsi_end_p (i);)
{
gphi *phi = i.phi ();
replace_uses_by (gimple_phi_result (phi),
gimple_phi_arg_def (phi, 0));
remove_phi_node (&i, true);
}
}
}
else
{