diff options
author | Richard Biener <rguenther@suse.de> | 2020-08-06 12:18:24 +0200 |
---|---|---|
committer | Giuliano Belinassi <giuliano.belinassi@usp.br> | 2020-08-17 15:07:43 -0300 |
commit | a48beec959cc35276f558ec2bee31249607dd71c (patch) | |
tree | 97a3b3da9ca104c1b04399ae2690285d3454680d | |
parent | 7e44801a2cb93236e9069861b0877d82b0855d8f (diff) | |
download | gcc-a48beec959cc35276f558ec2bee31249607dd71c.zip gcc-a48beec959cc35276f558ec2bee31249607dd71c.tar.gz gcc-a48beec959cc35276f558ec2bee31249607dd71c.tar.bz2 |
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.
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr96491.c | 29 | ||||
-rw-r--r-- | gcc/tree-ssa-sink.c | 3 |
2 files changed, 31 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr96491.c b/gcc/testsuite/gcc.dg/torture/pr96491.c new file mode 100644 index 0000000..784559f --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr96491.c @@ -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 (); +} diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c index 962ad07..4cc5195 100644 --- a/gcc/tree-ssa-sink.c +++ b/gcc/tree-ssa-sink.c @@ -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 |