Commit 34e5c511 by Richard Biener Committed by Richard Biener

tree-ssa-pre.c (print_pre_expr): Handle NULL expr.

2017-08-01  Richard Biener  <rguenther@suse.de>

	* tree-ssa-pre.c (print_pre_expr): Handle NULL expr.
	(compute_antic): Seed worklist with exit block predecessors.
	* cfganal.c (dfs_find_deadend): For a cycle return the source
	of the edge closing it.

	* gcc.dg/tree-ssa/ssa-dce-3.c: Adjust.
	* gcc.dg/tree-ssa/split-path-5.c: Remove case with just dead
	endless loop.
	* gcc.dg/uninit-23.c: Adjust.

From-SVN: r250767
parent 35c38fa6
2017-08-01 Richard Biener <rguenther@suse.de>
* tree-ssa-pre.c (print_pre_expr): Handle NULL expr.
(compute_antic): Seed worklist with exit block predecessors.
* cfganal.c (dfs_find_deadend): For a cycle return the source
of the edge closing it.
2017-08-01 Tamar Christina <tamar.christina@arm.com> 2017-08-01 Tamar Christina <tamar.christina@arm.com>
* config/aarch64/aarch64.c * config/aarch64/aarch64.c
......
...@@ -737,23 +737,24 @@ post_order_compute (int *post_order, bool include_entry_exit, ...@@ -737,23 +737,24 @@ post_order_compute (int *post_order, bool include_entry_exit,
basic_block basic_block
dfs_find_deadend (basic_block bb) dfs_find_deadend (basic_block bb)
{ {
bitmap visited = BITMAP_ALLOC (NULL); auto_bitmap visited;
basic_block next = bb;
for (;;) for (;;)
{ {
if (EDGE_COUNT (bb->succs) == 0 if (EDGE_COUNT (next->succs) == 0)
|| ! bitmap_set_bit (visited, bb->index)) return next;
{
BITMAP_FREE (visited); if (! bitmap_set_bit (visited, next->index))
return bb; return bb;
}
bb = next;
/* If we are in an analyzed cycle make sure to try exiting it. /* If we are in an analyzed cycle make sure to try exiting it.
Note this is a heuristic only and expected to work when loop Note this is a heuristic only and expected to work when loop
fixup is needed as well. */ fixup is needed as well. */
if (! bb->loop_father if (! bb->loop_father
|| ! loop_outer (bb->loop_father)) || ! loop_outer (bb->loop_father))
bb = EDGE_SUCC (bb, 0)->dest; next = EDGE_SUCC (bb, 0)->dest;
else else
{ {
edge_iterator ei; edge_iterator ei;
...@@ -761,7 +762,7 @@ dfs_find_deadend (basic_block bb) ...@@ -761,7 +762,7 @@ dfs_find_deadend (basic_block bb)
FOR_EACH_EDGE (e, ei, bb->succs) FOR_EACH_EDGE (e, ei, bb->succs)
if (loop_exit_edge_p (bb->loop_father, e)) if (loop_exit_edge_p (bb->loop_father, e))
break; break;
bb = e ? e->dest : EDGE_SUCC (bb, 0)->dest; next = e ? e->dest : EDGE_SUCC (bb, 0)->dest;
} }
} }
......
2017-08-01 Richard Biener <rguenther@suse.de>
* gcc.dg/tree-ssa/ssa-dce-3.c: Adjust.
* gcc.dg/tree-ssa/split-path-5.c: Remove case with just dead
endless loop.
* gcc.dg/uninit-23.c: Adjust.
2017-08-01 Bin Cheng <bin.cheng@arm.com> 2017-08-01 Bin Cheng <bin.cheng@arm.com>
* gcc.dg/no-strict-overflow-7.c: Revise comment and test string. * gcc.dg/no-strict-overflow-7.c: Revise comment and test string.
......
...@@ -41,20 +41,4 @@ bmhi_init (const char *pattern) ...@@ -41,20 +41,4 @@ bmhi_init (const char *pattern)
} }
} }
char * /* { dg-final { scan-tree-dump-times "Duplicating join block" 1 "split-paths" } } */
bmhi_search (const char *string, const int stringlen)
{
int i, j;
char *s;
for (;;)
{
while (--j >= 0 && (
{
__typeof__ (s[j]) __x = (s[j]);
((((__ctype_ptr__ +
sizeof (""[__x]))[(int) (__x)]) &
(01 | 02)) ==
02) ? (int) __x - 'a' +
'A' : (int) __x;}) == pat[j]);
}}
/* { dg-final { scan-tree-dump-times "Duplicating join block" 2 "split-paths" } } */
...@@ -26,9 +26,6 @@ int main(void) ...@@ -26,9 +26,6 @@ int main(void)
by marking the j % 7 condition as useful. See PR45178. */ by marking the j % 7 condition as useful. See PR45178. */
/* We should eliminate the inner condition, but the loop must be preserved /* We should eliminate the inner condition, but the loop must be preserved
as it is infinite. Therefore there should be just one phi node (for i): */ as it is infinite. Therefore there should be just one goto and no PHI. */
/* { dg-final { scan-tree-dump-times "PHI " 1 "cddce1" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "PHI " 0 "cddce1" } } */
/* { dg-final { scan-tree-dump-times "goto" 1 "cddce1" } } */
/* And one if (for the exit condition of the loop): */
/* { dg-final { scan-tree-dump-times "if " 1 "cddce1" } } */
...@@ -15,10 +15,10 @@ ql (void) ...@@ -15,10 +15,10 @@ ql (void)
for (;;) for (;;)
{ {
int *go; int *go;
int *t4 = go; int *t4 = go; /* { dg-warning "is used uninitialized" } */
l1: l1:
*t4 = (*t4 != 0) ? 0 : 2; /* { dg-warning "may be used uninitialized" } */ *t4 = (*t4 != 0) ? 0 : 2;
} }
if (ij != 0) if (ij != 0)
......
...@@ -837,7 +837,7 @@ bitmap_set_and (bitmap_set_t dest, bitmap_set_t orig) ...@@ -837,7 +837,7 @@ bitmap_set_and (bitmap_set_t dest, bitmap_set_t orig)
} }
} }
/* Subtract all values and expressions contained in ORIG from DEST. */ /* Subtract all expressions contained in ORIG from DEST. */
static bitmap_set_t static bitmap_set_t
bitmap_set_subtract (bitmap_set_t dest, bitmap_set_t orig) bitmap_set_subtract (bitmap_set_t dest, bitmap_set_t orig)
...@@ -859,7 +859,7 @@ bitmap_set_subtract (bitmap_set_t dest, bitmap_set_t orig) ...@@ -859,7 +859,7 @@ bitmap_set_subtract (bitmap_set_t dest, bitmap_set_t orig)
return result; return result;
} }
/* Subtract all the values in bitmap set B from bitmap set A. */ /* Subtract all values in bitmap set B from bitmap set A. */
static void static void
bitmap_set_subtract_values (bitmap_set_t a, bitmap_set_t b) bitmap_set_subtract_values (bitmap_set_t a, bitmap_set_t b)
...@@ -987,6 +987,11 @@ bitmap_value_insert_into_set (bitmap_set_t set, pre_expr expr) ...@@ -987,6 +987,11 @@ bitmap_value_insert_into_set (bitmap_set_t set, pre_expr expr)
static void static void
print_pre_expr (FILE *outfile, const pre_expr expr) print_pre_expr (FILE *outfile, const pre_expr expr)
{ {
if (! expr)
{
fprintf (outfile, "NULL");
return;
}
switch (expr->kind) switch (expr->kind)
{ {
case CONSTANT: case CONSTANT:
...@@ -2418,7 +2423,9 @@ compute_antic (void) ...@@ -2418,7 +2423,9 @@ compute_antic (void)
inverted_post_order_compute (&postorder); inverted_post_order_compute (&postorder);
auto_sbitmap worklist (last_basic_block_for_fn (cfun) + 1); auto_sbitmap worklist (last_basic_block_for_fn (cfun) + 1);
bitmap_ones (worklist); bitmap_clear (worklist);
FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
bitmap_set_bit (worklist, e->src->index);
while (changed) while (changed)
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment