This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, PR rtl-optimization/71148] Avoid cleanup_cfg called with invalidated dominance info
- From: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 18 May 2016 19:17:03 +0300
- Subject: [PATCH, PR rtl-optimization/71148] Avoid cleanup_cfg called with invalidated dominance info
- Authentication-results: sourceware.org; auth=none
Hi,
This patch resolves PR71148 by releasing dominance info before
cleanup_cfg calls to avoid attempts to fixup invalid dominance
info.
Dominance info handling in cleanup_cfg looks weird though. It
tries to fix it but can invalidate it at the same time (PR71084).
We should probably do something with that.
Tracker is P1 and this patch may be OK solution for now.
Bootstrapped and regtested on x86_64-pc-linux-gnu. Ok for trunk?
Thanks,
Ilya
--
gcc/
2016-05-18 Ilya Enkovich <ilya.enkovich@intel.com>
PR rtl-optimization/71148
* cse.c (rest_of_handle_cse): Free dominance info
before cleanup_cfg call if required.
(rest_of_handle_cse2): Likewise.
(rest_of_handle_cse_after_global_opts): Likewise.
gcc/testsuite/
2016-05-18 Ilya Enkovich <ilya.enkovich@intel.com>
PR rtl-optimization/71148
* gcc.dg/pr71148.c: New test.
diff --git a/gcc/cse.c b/gcc/cse.c
index 322e352..4aa4443 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -7558,6 +7558,12 @@ rest_of_handle_cse (void)
expecting CSE to be run. But always rerun it in a cheap mode. */
cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
+ /* Check if we need to free dominance info before cleanup_cfg
+ because it may become really slow in case of invalid
+ dominance info. */
+ if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+ free_dominance_info (CDI_DOMINATORS);
+
if (tem == 2)
{
timevar_push (TV_JUMP);
@@ -7630,6 +7636,12 @@ rest_of_handle_cse2 (void)
delete_trivially_dead_insns (get_insns (), max_reg_num ());
+ /* Check if we need to free dominance info before cleanup_cfg
+ because it may become really slow in case of invalid
+ dominance info. */
+ if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+ free_dominance_info (CDI_DOMINATORS);
+
if (tem == 2)
{
timevar_push (TV_JUMP);
@@ -7706,6 +7718,12 @@ rest_of_handle_cse_after_global_opts (void)
cse_not_expected = !flag_rerun_cse_after_loop;
+ /* Check if we need to free dominance info before cleanup_cfg
+ because it may become really slow in case of invalid
+ dominance info. */
+ if (cse_cfg_altered && dom_info_available_p (CDI_DOMINATORS))
+ free_dominance_info (CDI_DOMINATORS);
+
/* If cse altered any jumps, rerun jump opts to clean things up. */
if (tem == 2)
{
diff --git a/gcc/testsuite/gcc.dg/pr71148.c b/gcc/testsuite/gcc.dg/pr71148.c
new file mode 100644
index 0000000..6aa4920
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr71148.c
@@ -0,0 +1,46 @@
+/* PR rtl-optimization/71148 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -funroll-loops" } */
+
+int rh, ok, kq, fu;
+
+void
+js (int cs)
+{
+ rh = fu;
+ if (fu != 0)
+ {
+ cs /= 3;
+ if (cs <= 0)
+ {
+ int z9;
+ for (z9 = 0; z9 < 2; ++z9)
+ {
+ z9 += cs;
+ ok += z9;
+ fu += ok;
+ }
+ }
+ }
+}
+
+void
+vy (int s3)
+{
+ int yo, g2 = 0;
+ sd:
+ js (g2);
+ for (yo = 0; yo < 2; ++yo)
+ {
+ if (fu != 0)
+ goto sd;
+ kq += (s3 != (g2 ? s3 : 0));
+ for (s3 = 0; s3 < 72; ++s3)
+ g2 *= (~0 - 1);
+ g2 -= yo;
+ }
+ for (fu = 0; fu < 18; ++fu)
+ for (yo = 0; yo < 17; ++yo)
+ if (g2 < 0)
+ goto sd;
+}