tree-optimization/96491 - avoid store commoning across abnormal edges

This avoids store commoning across abnormal edges since that easily
can disrupt abnormal coalescing because it might create overlapping
lifetime of variables.

2020-08-06  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/96491
	* tree-ssa-sink.c (sink_common_stores_to_bb): Avoid
	sinking across abnormal edges.

	* gcc.dg/torture/pr96491.c: New testcase.
This commit is contained in:
Richard Biener 2020-08-06 12:18:24 +02:00
parent 1f4c8afa1b
commit 89b84cd794
2 changed files with 31 additions and 1 deletions

View file

@ -0,0 +1,29 @@
/* { dg-do compile } */
int rj;
void __attribute__ ((returns_twice))
da (void)
{
rj = 1;
}
void
c5 (void)
{
for (;;)
++rj;
}
void
ls (int kz)
{
if (kz == 0)
{
rj = 0;
c5 ();
}
da ();
c5 ();
}

View file

@ -503,7 +503,8 @@ sink_common_stores_to_bb (basic_block bb)
tree arg = gimple_phi_arg_def (phi, i);
gimple *def = SSA_NAME_DEF_STMT (arg);
if (! is_gimple_assign (def)
|| stmt_can_throw_internal (cfun, def))
|| stmt_can_throw_internal (cfun, def)
|| (gimple_phi_arg_edge (phi, i)->flags & EDGE_ABNORMAL))
{
/* ??? We could handle some cascading with the def being
another PHI. We'd have to insert multiple PHIs for