tree-vect-loop.c (vect_analyze_loop_operations): Skip virtual phi in the tail of outer-loop.
gcc/ * tree-vect-loop.c (vect_analyze_loop_operations): Skip virtual phi in the tail of outer-loop. gcc/testsuite/ * gcc.dg/vect/vect-outer-simd-3.c: New test. From-SVN: r228601
This commit is contained in:
parent
a5220d61fa
commit
25a2c75d49
4 changed files with 89 additions and 0 deletions
|
@ -1,3 +1,8 @@
|
|||
2015-10-08 Yuri Rumyantsev <ysrumyan@gmail.com>
|
||||
|
||||
* tree-vect-loop.c (vect_analyze_loop_operations): Skip virtual phi
|
||||
in the tail of outer-loop.
|
||||
|
||||
2015-10-08 David Edelsohn <dje.gcc@gmail.com>
|
||||
|
||||
* config/rs6000/rs6000.c (rs6000_xcoff_debug_unwind_info): Always
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2015-10-08 Yuri Rumyantsev <ysrumyan@gmail.com>
|
||||
|
||||
* gcc.dg/vect/vect-outer-simd-3.c: New test.
|
||||
|
||||
2015-10-08 Yuri Rumyantsev <ysrumyan@gmail.com>
|
||||
|
||||
* gcc.dg/loop-unswitch-2.c: New test.
|
||||
|
|
78
gcc/testsuite/gcc.dg/vect/vect-outer-simd-3.c
Normal file
78
gcc/testsuite/gcc.dg/vect/vect-outer-simd-3.c
Normal file
|
@ -0,0 +1,78 @@
|
|||
/* { dg-require-effective-target vect_simd_clones } */
|
||||
/* { dg-additional-options "-O3 -fopenmp-simd -ffast-math" } */
|
||||
#include <stdlib.h>
|
||||
#include "tree-vect.h"
|
||||
#define N 64
|
||||
|
||||
float *px, *py;
|
||||
float *tx, *ty;
|
||||
float *x1, *z1, *t1, *t2;
|
||||
int bound[N];
|
||||
|
||||
static void inline bar(const float cx, float cy,
|
||||
float *vx, float *vy, int n)
|
||||
{
|
||||
int j;
|
||||
for (j = 0; j < n; ++j)
|
||||
{
|
||||
const float dx = cx - px[j];
|
||||
const float dy = cy - py[j];
|
||||
*vx -= dx * tx[j];
|
||||
*vy -= dy * ty[j];
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((noinline, noclone)) void foo1 ()
|
||||
{
|
||||
int i;
|
||||
int n = bound[63];
|
||||
#pragma omp simd
|
||||
for (i=0; i<N; i++)
|
||||
bar(px[i], py[i], x1+i, z1+i, n);
|
||||
}
|
||||
|
||||
__attribute__((noinline, noclone)) void foo2 ()
|
||||
{
|
||||
volatile int i;
|
||||
int n = bound[63];
|
||||
for (i=0; i<N; i++)
|
||||
bar(px[i], py[i], x1+i, z1+i, n);
|
||||
}
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
float *X = (float*)malloc(N * 8 * sizeof (float));
|
||||
int i;
|
||||
/* check_vect (); */
|
||||
px = &X[0];
|
||||
py = &X[N * 1];
|
||||
tx = &X[N * 2];
|
||||
ty = &X[N * 3];
|
||||
x1 = &X[N * 4];
|
||||
z1 = &X[N * 5];
|
||||
t1 = &X[N * 6];
|
||||
t2 = &X[N * 7];
|
||||
|
||||
for (i=0; i<N; i++)
|
||||
{
|
||||
px[i] = (float) (i+2);
|
||||
tx[i] = (float) (i+1);
|
||||
py[i] = (float) (i+4);
|
||||
ty[i] = (float) (i+3);
|
||||
x1[i] = z1[i] = 1.0f;
|
||||
bound[i] = i + 1;
|
||||
}
|
||||
foo1 (); /* vector variant. */
|
||||
for (i=0; i<N;i++)
|
||||
{
|
||||
t1[i] = x1[i]; x1[i] = 1.0f;
|
||||
t2[i] = z1[i]; z1[i] = 1.0f;
|
||||
}
|
||||
foo2 (); /* scalar variant. */
|
||||
for (i=0; i<N; i++)
|
||||
if (x1[i] != t1[i] || z1[i] != t2[i])
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
/* { dg-final { scan-tree-dump "OUTER LOOP VECTORIZED" "vect" } } */
|
|
@ -1463,6 +1463,8 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo)
|
|||
dump_gimple_stmt (MSG_NOTE, TDF_SLIM, phi, 0);
|
||||
dump_printf (MSG_NOTE, "\n");
|
||||
}
|
||||
if (virtual_operand_p (gimple_phi_result (phi)))
|
||||
continue;
|
||||
|
||||
/* Inner-loop loop-closed exit phi in outer-loop vectorization
|
||||
(i.e., a phi in the tail of the outer-loop). */
|
||||
|
|
Loading…
Add table
Reference in a new issue