re PR tree-optimization/65494 (Loop is not vectorized because of operand canonicalization.)
2015-03-23 Richard Biener <rguenther@suse.de> PR tree-optimization/65494 * tree-vect-slp.c (vect_build_slp_tree): Do not (re-)allocate matches here. (vect_analyze_slp_instance): But do that here, always and once. * gcc.dg/vect/pr65494.c: New testcase. From-SVN: r221592
This commit is contained in:
parent
c61928d098
commit
89d390e57a
4 changed files with 44 additions and 8 deletions
|
@ -1,3 +1,10 @@
|
|||
2015-03-23 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/65494
|
||||
* tree-vect-slp.c (vect_build_slp_tree): Do not (re-)allocate
|
||||
matches here.
|
||||
(vect_analyze_slp_instance): But do that here, always and once.
|
||||
|
||||
2015-03-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* expmed.c (synth_mult): Fix comment about multiplying by T-1 and
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2015-03-23 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/65494
|
||||
* gcc.dg/vect/pr65494.c: New testcase.
|
||||
|
||||
2015-03-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR preprocessor/65238
|
||||
|
|
28
gcc/testsuite/gcc.dg/vect/pr65494.c
Normal file
28
gcc/testsuite/gcc.dg/vect/pr65494.c
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-additional-options "-Ofast -funroll-loops" } */
|
||||
|
||||
typedef unsigned char uchar;
|
||||
typedef struct rgb_ {uchar r; uchar g; uchar b;} rgb;
|
||||
#define N 512
|
||||
rgb in[N], out[N];
|
||||
float c[N];
|
||||
void foo(int n)
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < n; i++) //in and out are RGB byte arrays
|
||||
{
|
||||
float r = 0, g = 0, b = 0;
|
||||
for (j = 0; j < 5; j++)
|
||||
{
|
||||
r += (float)in[i + j].r * c[j];
|
||||
g += (float)in[i + j].g * c[j];
|
||||
b += (float)in[i + j].b * c[j];
|
||||
}
|
||||
out[i].r = (uchar)r;
|
||||
out[i].g = (uchar)g;
|
||||
out[i].b = (uchar)b;
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" { target { vect_float && vect_intfloat_cvt } } } } */
|
||||
/* { dg-final { cleanup-tree-dump "vect" } } */
|
|
@ -926,14 +926,9 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
|
|||
bool *matches, unsigned *npermutes, unsigned *tree_size,
|
||||
unsigned max_tree_size)
|
||||
{
|
||||
unsigned nops, i, this_npermutes = 0, this_tree_size = 0;
|
||||
unsigned nops, i, this_tree_size = 0;
|
||||
gimple stmt;
|
||||
|
||||
if (!matches)
|
||||
matches = XALLOCAVEC (bool, group_size);
|
||||
if (!npermutes)
|
||||
npermutes = &this_npermutes;
|
||||
|
||||
matches[0] = false;
|
||||
|
||||
stmt = SLP_TREE_SCALAR_STMTS (*node)[0];
|
||||
|
@ -1012,7 +1007,6 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
|
|||
return false;
|
||||
}
|
||||
|
||||
bool *matches = XALLOCAVEC (bool, group_size);
|
||||
if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &child,
|
||||
group_size, max_nunits, loads,
|
||||
vectorization_factor, matches,
|
||||
|
@ -1637,9 +1631,11 @@ vect_analyze_slp_instance (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
|
|||
loads.create (group_size);
|
||||
|
||||
/* Build the tree for the SLP instance. */
|
||||
bool *matches = XALLOCAVEC (bool, group_size);
|
||||
unsigned npermutes = 0;
|
||||
if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &node, group_size,
|
||||
&max_nunits, &loads,
|
||||
vectorization_factor, NULL, NULL, NULL,
|
||||
vectorization_factor, matches, &npermutes, NULL,
|
||||
max_tree_size))
|
||||
{
|
||||
/* Calculate the unrolling factor based on the smallest type. */
|
||||
|
|
Loading…
Add table
Reference in a new issue