Commit 10b70b8e by Richard Biener Committed by Richard Biener

re PR tree-optimization/77283 (Revision 238005 disables loop unrolling)

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

	PR tree-optimization/77283
	* gimple-ssa-split-paths.c: Include gimple-ssa.h, tree-phinodes.h
	and ssa-iterators.h.
	(is_feasible_trace): Implement a cost model based on joiner
	PHI node uses.

	* gcc.dg/tree-ssa/split-path-7.c: Adjust.
	* gcc.dg/tree-ssa/split-path-8.c: New testcase.
	* gcc.dg/tree-ssa/split-path-9.c: Likewise.

From-SVN: r244392
parent 53b586f2
......@@ -32,6 +32,9 @@ along with GCC; see the file COPYING3. If not see
#include "tracer.h"
#include "predict.h"
#include "params.h"
#include "gimple-ssa.h"
#include "tree-phinodes.h"
#include "ssa-iterators.h"
/* Given LATCH, the latch block in a loop, see if the shape of the
path reaching LATCH is suitable for being split by duplication.
......@@ -200,6 +203,58 @@ is_feasible_trace (basic_block bb)
}
}
/* If the joiner has no PHIs with useful uses there is zero chance
of CSE/DCE/jump-threading possibilities exposed by duplicating it. */
bool found_useful_phi = false;
for (gphi_iterator si = gsi_start_phis (bb); ! gsi_end_p (si);
gsi_next (&si))
{
gphi *phi = si.phi ();
use_operand_p use_p;
imm_use_iterator iter;
FOR_EACH_IMM_USE_FAST (use_p, iter, gimple_phi_result (phi))
{
gimple *stmt = USE_STMT (use_p);
if (is_gimple_debug (stmt))
continue;
/* If there's a use in the joiner this might be a CSE/DCE
opportunity. */
if (gimple_bb (stmt) == bb)
{
found_useful_phi = true;
break;
}
/* If the use is on a loop header PHI and on one path the
value is unchanged this might expose a jump threading
opportunity. */
if (gimple_code (stmt) == GIMPLE_PHI
&& gimple_bb (stmt) == bb->loop_father->header
/* But for memory the PHI alone isn't good enough. */
&& ! virtual_operand_p (gimple_phi_result (stmt)))
{
for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i)
if (gimple_phi_arg_def (phi, i) == gimple_phi_result (stmt))
{
found_useful_phi = true;
break;
}
if (found_useful_phi)
break;
}
}
if (found_useful_phi)
break;
}
if (! found_useful_phi)
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file,
"Block %d is a join that does not expose CSE/DCE/jump-thread "
"opportunities when duplicated.\n",
bb->index);
return false;
}
/* We may want something here which looks at dataflow and tries
to guess if duplication of BB is likely to result in simplification
of instructions in BB in either the original or the duplicate. */
......
2017-01-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/77283
* gcc.dg/tree-ssa/split-path-7.c: Adjust.
* gcc.dg/tree-ssa/split-path-8.c: New testcase.
* gcc.dg/tree-ssa/split-path-9.c: Likewise.
2017-01-12 Sandra Loosemore <sandra@codesourcery.com>
* gcc.dg/pr77862.c: Require fpic target.
......
......@@ -91,4 +91,4 @@ linit ()
}
}
}
/* { dg-final { scan-tree-dump-times "Duplicating join block" 2 "split-paths" } } */
/* { dg-final { scan-tree-dump-times "Duplicating join block" 0 "split-paths" } } */
/* PR77283 */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-split-paths-details" } */
void
foo (double *x, double *a, double *b, long n, double limit)
{
long i;
for (i=0; i < n; i++)
if (a[i] < limit)
x[i] = b[i];
}
/* { dg-final { scan-tree-dump-times "Duplicating join block" 0 "split-paths" } } */
/* PR77366 */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-split-paths-details" } */
void
foo(unsigned int size, unsigned int *state)
{
unsigned int i;
for(i = 0; i < size; i++)
{
if(*state & 1)
*state ^= 1;
}
}
/* { dg-final { scan-tree-dump-times "Duplicating join block" 0 "split-paths" } } */
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