mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-01 07:44:05 +08:00
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:
parent
9982752346
commit
82567e3386
@ -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>
|
2009-01-07 Nathan Froyd <froydnj@codesourcery.com>
|
||||||
Alan Modra <amodra@bigpond.net.au>
|
Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
@ -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>
|
2009-01-07 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR c++/38725
|
PR c++/38725
|
||||||
|
28
gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-pr37194.c
Normal file
28
gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-pr37194.c
Normal 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" } } */
|
||||||
|
|
@ -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)
|
|||||||
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)
|
|||||||
"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)
|
|||||||
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)
|
|||||||
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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user