Commit 82567e33 by Ira Rosen Committed by Ira Rosen

re PR tree-optimization/37194 (Autovectorization of small constant iteration…

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
parent 99827523
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> 2009-01-07 Nathan Froyd <froydnj@codesourcery.com>
Alan Modra <amodra@bigpond.net.au> Alan Modra <amodra@bigpond.net.au>
......
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> 2009-01-07 Jakub Jelinek <jakub@redhat.com>
PR c++/38725 PR c++/38725
......
/* { 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" } } */
...@@ -122,7 +122,6 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) ...@@ -122,7 +122,6 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
int vec_outside_cost = 0; int vec_outside_cost = 0;
int scalar_single_iter_cost = 0; int scalar_single_iter_cost = 0;
int scalar_outside_cost = 0; int scalar_outside_cost = 0;
bool runtime_test = false;
int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo); int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo); struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo); basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
...@@ -141,15 +140,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) ...@@ -141,15 +140,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
return 0; 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. */ /* Requires loop versioning tests to handle misalignment. */
if (VEC_length (gimple, LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo))) if (VEC_length (gimple, LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo)))
{ {
/* FIXME: Make cost depend on complexity of individual check. */ /* FIXME: Make cost depend on complexity of individual check. */
...@@ -240,12 +231,11 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) ...@@ -240,12 +231,11 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
"peeling for alignment is unknown ."); "peeling for alignment is unknown .");
/* If peeled iterations are unknown, count a taken branch and a not taken /* If peeled iterations are unknown, count a taken branch and a not taken
branch per peeled loop. Even if scalar loop iterations are known, branch per peeled loop. Even if scalar loop iterations are known,
vector iterations are not known since peeled prologue iterations are vector iterations are not known since peeled prologue iterations are
not known. Hence guards remain the same. */ not known. Hence guards remain the same. */
peel_guard_costs += 2 * (TARG_COND_TAKEN_BRANCH_COST peel_guard_costs += 2 * (TARG_COND_TAKEN_BRANCH_COST
+ TARG_COND_NOT_TAKEN_BRANCH_COST); + TARG_COND_NOT_TAKEN_BRANCH_COST);
} }
else else
{ {
...@@ -337,7 +327,12 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo) ...@@ -337,7 +327,12 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
conditions/branch directions. Change the estimates below to conditions/branch directions. Change the estimates below to
something more reasonable. */ 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. */ /* Cost model check occurs at versioning. */
if (VEC_length (gimple, LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo)) 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) ...@@ -345,8 +340,8 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
scalar_outside_cost += TARG_COND_NOT_TAKEN_BRANCH_COST; scalar_outside_cost += TARG_COND_NOT_TAKEN_BRANCH_COST;
else else
{ {
/* Cost model occurs at prologue generation. */ /* Cost model check occurs at prologue generation. */
if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)) if (LOOP_PEELING_FOR_ALIGNMENT (loop_vinfo) < 0)
scalar_outside_cost += 2 * TARG_COND_TAKEN_BRANCH_COST scalar_outside_cost += 2 * TARG_COND_TAKEN_BRANCH_COST
+ TARG_COND_NOT_TAKEN_BRANCH_COST; + TARG_COND_NOT_TAKEN_BRANCH_COST;
/* Cost model check occurs at epilogue generation. */ /* Cost model check occurs at epilogue generation. */
......
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