re PR tree-optimization/63168 (loop header copying fails - not vectorized: latch block not empty)

2014-10-16  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/63168
	* tree-cfg.c (gimple_can_merge_blocks_p): Only protect
	latches if after merging they are no longer simple.
	* cfghooks.c (merge_blocks): Handle merging a latch block
	into another block.

	* gcc.dg/tree-ssa/loop-40.c: New testcase.

From-SVN: r216304
This commit is contained in:
Richard Biener 2014-10-16 10:13:52 +00:00 committed by Richard Biener
parent 0c49f2ed83
commit 93a95abe92
5 changed files with 38 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2014-10-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/63168
* tree-cfg.c (gimple_can_merge_blocks_p): Only protect
latches if after merging they are no longer simple.
* cfghooks.c (merge_blocks): Handle merging a latch block
into another block.
2014-10-16 Alexander Ivchenko <alexander.ivchenko@intel.com>
Maxim Kuznetsov <maxim.kuznetsov@intel.com>
Anna Tikhonova <anna.tikhonova@intel.com>

View File

@ -766,6 +766,11 @@ merge_blocks (basic_block a, basic_block b)
add_bb_to_loop (a, b->loop_father);
a->loop_father->header = a;
}
/* If we merge a loop latch into its predecessor, update the loop
structure. */
if (b->loop_father->latch
&& b->loop_father->latch == b)
b->loop_father->latch = a;
remove_bb_from_loops (b);
}

View File

@ -1,3 +1,8 @@
2014-10-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/63168
* gcc.dg/tree-ssa/loop-40.c: New testcase.
2014-10-16 Andreas Schwab <schwab@suse.de>
* gcc.target/m68k/crash1.c: Fix implicit declaration.

View File

@ -0,0 +1,14 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-ch-details" } */
int mymax2(int *it, int *end)
{
int max = *it;
while (++it != end)
if (*it > max)
max = *it;
return max;
}
/* { dg-final { scan-tree-dump "Duplicating header" "ch" } } */
/* { dg-final { cleanup-tree-dump "ch" } } */

View File

@ -1674,8 +1674,12 @@ gimple_can_merge_blocks_p (basic_block a, basic_block b)
return false;
}
/* Protect the loop latches. */
if (current_loops && b->loop_father->latch == b)
/* Protect simple loop latches. We only want to avoid merging
the latch with the loop header in this case. */
if (current_loops
&& b->loop_father->latch == b
&& loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES)
&& b->loop_father->header == a)
return false;
/* It must be possible to eliminate all phi nodes in B. If ssa form