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.
--- /dev/null
+/* { 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 ();
+}
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