[PATCH] Fix PR69823
Richard Biener
rguenther@suse.de
Wed Feb 8 14:34:00 GMT 2017
The following fixes walking the SESE region when determining if it is
valid.
Bootstrap and regtest running on x86_64-unknown-linux-gnu.
Will commit as obvious once that passed.
Thanks,
Richard.
2017-02-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/69823
* graphite-scop-detection.c (scop_detection::harmful_loop_in_region):
Properly enumerate all BBs in the region. Use auto_vec/auto_bitmap.
* gcc.dg/graphite/pr69823.c: New testcase.
Index: gcc/graphite-scop-detection.c
===================================================================
--- gcc/graphite-scop-detection.c (revision 245276)
+++ gcc/graphite-scop-detection.c (working copy)
@@ -1062,35 +1062,18 @@ scop_detection::harmful_loop_in_region (
print_sese (dump_file, scop));
gcc_assert (dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb));
- int depth = bb_dom_dfs_in (CDI_DOMINATORS, exit_bb)
- - bb_dom_dfs_in (CDI_DOMINATORS, entry_bb);
+ auto_vec<basic_block> worklist;
+ auto_bitmap loops;
- gcc_assert (depth > 0);
-
- vec<basic_block> dom
- = get_dominated_to_depth (CDI_DOMINATORS, entry_bb, depth);
- int i;
- basic_block bb;
- bitmap loops = BITMAP_ALLOC (NULL);
- FOR_EACH_VEC_ELT (dom, i, bb)
+ worklist.safe_push (entry_bb);
+ while (! worklist.is_empty ())
{
+ basic_block bb = worklist.pop ();
DEBUG_PRINT (dp << "Visiting bb_" << bb->index << "\n");
- /* We don't want to analyze any bb outside sese. */
- if (!dominated_by_p (CDI_POST_DOMINATORS, bb, exit_bb))
- continue;
-
- /* Basic blocks dominated by the scop->exit are not in the scop. */
- if (bb != exit_bb && dominated_by_p (CDI_DOMINATORS, bb, exit_bb))
- continue;
-
/* The basic block should not be part of an irreducible loop. */
if (bb->flags & BB_IRREDUCIBLE_LOOP)
- {
- dom.release ();
- BITMAP_FREE (loops);
- return true;
- }
+ return true;
/* Check for unstructured control flow: CFG not generated by structured
if-then-else. */
@@ -1114,13 +1097,14 @@ scop_detection::harmful_loop_in_region (
any loop fully contained in the scop: other bbs are checked below
in loop_is_valid_in_scop. */
if (harmful_stmt_in_bb (scop, bb))
- {
- dom.release ();
- BITMAP_FREE (loops);
- return true;
- }
+ return true;
}
+ if (bb != exit_bb)
+ for (basic_block dom = first_dom_son (CDI_DOMINATORS, bb);
+ dom;
+ dom = next_dom_son (CDI_DOMINATORS, dom))
+ worklist.safe_push (dom);
}
/* Go through all loops and check that they are still valid in the combined
@@ -1133,15 +1117,9 @@ scop_detection::harmful_loop_in_region (
gcc_assert (loop->num == (int) j);
if (!loop_is_valid_in_scop (loop, scop))
- {
- dom.release ();
- BITMAP_FREE (loops);
- return true;
- }
+ return true;
}
- dom.release ();
- BITMAP_FREE (loops);
return false;
}
Index: gcc/testsuite/gcc.dg/graphite/pr69823.c
===================================================================
--- gcc/testsuite/gcc.dg/graphite/pr69823.c (nonexistent)
+++ gcc/testsuite/gcc.dg/graphite/pr69823.c (working copy)
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -floop-nest-optimize" } */
+
+void
+foo (int c, int *p, int *a1, int *a2, int *a3)
+{
+ int i;
+
+ if (c)
+ {
+ for (i = 0; i < 8; i++)
+ a1[i] = 1;
+
+ if (*p)
+ *a2 = 0;
+ }
+
+ for (i = 0; i < 8; i++)
+ a3[i] = 0;
+}
More information about the Gcc-patches
mailing list