re PR tree-optimization/65063 (gcc.dg/vect/vect-double-reduc-6.c FAILs with -O3 -fno-tree-loop-ivcanon -fno-tree-vectorize)

2015-02-18  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/65063
	* tree-predcom.c (determine_unroll_factor): Return 1 if we
	have replaced looparound PHIs.

	* gcc.dg/pr65063.c: New testcase.

From-SVN: r220788
This commit is contained in:
Richard Biener 2015-02-18 13:08:58 +00:00 committed by Richard Biener
parent 0c28944fc0
commit 8039a35df1
4 changed files with 57 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2015-02-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/65063
* tree-predcom.c (determine_unroll_factor): Return 1 if we
have replaced looparound PHIs.
2015-02-18 Martin Liska <mliska@suse.cz>
* lto-streamer.c (lto_streamer_init): Encapsulate

View File

@ -1,3 +1,8 @@
2015-02-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/65063
* gcc.dg/pr65063.c: New testcase.
2015-02-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/62217

View File

@ -0,0 +1,33 @@
/* { dg-do run } */
/* { dg-options "-O3 -fno-tree-loop-ivcanon -fno-tree-vectorize" } */
static int in[8][4];
static int out[4];
static const int check_result[] = {0, 16, 256, 4096};
static inline void foo ()
{
int sum;
int i, j, k;
for (k = 0; k < 4; k++)
{
sum = 1;
for (j = 0; j < 4; j++)
for (i = 0; i < 4; i++)
sum *= in[i + k][j];
out[k] = sum;
}
}
int main ()
{
int i, j, k;
for (i = 0; i < 8; i++)
for (j = 0; j < 4; j++)
in[i][j] = (i + 2) / 3;
foo ();
for (k = 0; k < 4; k++)
if (out[k] != check_result[k])
__builtin_abort ();
return 0;
}

View File

@ -1775,9 +1775,21 @@ determine_unroll_factor (vec<chain_p> chains)
FOR_EACH_VEC_ELT (chains, i, chain)
{
if (chain->type == CT_INVARIANT || chain->combined)
if (chain->type == CT_INVARIANT)
continue;
if (chain->combined)
{
/* For combined chains, we can't handle unrolling if we replace
looparound PHIs. */
dref a;
unsigned j;
for (j = 1; chain->refs.iterate (j, &a); j++)
if (gimple_code (a->stmt) == GIMPLE_PHI)
return 1;
continue;
}
/* The best unroll factor for this chain is equal to the number of
temporary variables that we create for it. */
af = chain->length;