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>
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>
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)
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. */
......@@ -245,7 +236,6 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo)
not known. Hence guards remain the same. */
peel_guard_costs += 2 * (TARG_COND_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. */
......
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