re PR tree-optimization/37194 (Autovectorization of small constant iteration loop degrades performance)

PR tree-optimization/37194
	* tree-vect-transform.c (vect_estimate_min_profitable_iters):
	Don't add the cost of cost model guard in prologue to scalar 
	outside cost in case of known number of iterations.

From-SVN: r143183
This commit is contained in:
Ira Rosen 2009-01-08 07:59:40 +00:00 committed by Ira Rosen
parent 9982752346
commit 82567e3386
4 changed files with 52 additions and 17 deletions

View File

@ -1,3 +1,10 @@
2009-01-08 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/37194
* tree-vect-transform.c (vect_estimate_min_profitable_iters):
Don't add the cost of cost model guard in prologue to scalar
outside cost in case of known number of iterations.
2009-01-07 Nathan Froyd <froydnj@codesourcery.com>
Alan Modra <amodra@bigpond.net.au>

View File

@ -1,3 +1,8 @@
2009-01-08 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/37194
* gcc.dg/vect/costmodel/ppc/costmodel-pr37194.c: New test.
2009-01-07 Jakub Jelinek <jakub@redhat.com>
PR c++/38725

View File

@ -0,0 +1,28 @@
/* { dg-require-effective-target vect_float } */
/* { dg-do compile } */
#include <stdlib.h>
#include "../../tree-vect.h"
__attribute__ ((noinline)) void
ggSpectrum_Set8(float * data, float d)
{
int i;
for (i = 0; i < 8; i++)
data[i] = d;
}
__attribute__ ((noinline)) void
ggSpectrum_Set20(float * data, float d)
{
int i;
for (i = 0; i < 20; i++)
data[i] = d;
}
/* { dg-final { scan-tree-dump-times "vectorization not profitable" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */

View File

@ -122,7 +122,6 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
int vec_outside_cost = 0;
int scalar_single_iter_cost = 0;
int scalar_outside_cost = 0;
bool runtime_test = false;
int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
@ -141,15 +140,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
return 0;
}
/* If the number of iterations is unknown, or the
peeling-for-misalignment amount is unknown, we will have to generate
a runtime test to test the loop count against the threshold. */
if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
|| (byte_misalign < 0))
runtime_test = true;
/* Requires loop versioning tests to handle misalignment. */
if (VEC_length (gimple, LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo)))
{
/* FIXME: Make cost depend on complexity of individual check. */
@ -240,12 +231,11 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
"peeling for alignment is unknown .");
/* If peeled iterations are unknown, count a taken branch and a not taken
branch per peeled loop. Even if scalar loop iterations are known,
vector iterations are not known since peeled prologue iterations are
not known. Hence guards remain the same. */
branch per peeled loop. Even if scalar loop iterations are known,
vector iterations are not known since peeled prologue iterations are
not known. Hence guards remain the same. */
peel_guard_costs += 2 * (TARG_COND_TAKEN_BRANCH_COST
+ TARG_COND_NOT_TAKEN_BRANCH_COST);
+ TARG_COND_NOT_TAKEN_BRANCH_COST);
}
else
{
@ -337,7 +327,12 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
conditions/branch directions. Change the estimates below to
something more reasonable. */
if (runtime_test)
/* If the number of iterations is known and we do not do versioning, we can
decide whether to vectorize at compile time. Hence the scalar version
do not carry cost model guard costs. */
if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
|| VEC_length (gimple, LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo))
|| VEC_length (ddr_p, LOOP_VINFO_MAY_ALIAS_DDRS (loop_vinfo)))
{
/* Cost model check occurs at versioning. */
if (VEC_length (gimple, LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo))
@ -345,8 +340,8 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
scalar_outside_cost += TARG_COND_NOT_TAKEN_BRANCH_COST;
else
{
/* Cost model occurs at prologue generation. */
if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
/* Cost model check occurs at prologue generation. */
if (LOOP_PEELING_FOR_ALIGNMENT (loop_vinfo) < 0)
scalar_outside_cost += 2 * TARG_COND_TAKEN_BRANCH_COST
+ TARG_COND_NOT_TAKEN_BRANCH_COST;
/* Cost model check occurs at epilogue generation. */