Commit 8e19f5a1 by Ira Rosen Committed by Ira Rosen

tree-vect-slp.c (vect_slp_analyze_bb_1): Split out core part of vect_analyze_bb here.


        * tree-vect-slp.c (vect_slp_analyze_bb_1): Split out core part
        of vect_analyze_bb here.
        (vect_analyze_bb): Loop over vector sizes calling
        vect_analyze_bb_1.

From-SVN: r179164
parent 13ec1cca
2011-09-25 Ira Rosen <ira.rosen@linaro.org>
* tree-vect-slp.c (vect_slp_analyze_bb_1): Split out core part
of vect_analyze_bb here.
(vect_analyze_bb): Loop over vector sizes calling vect_analyze_bb_1.
2011-09-25 Ira Rosen <ira.rosen@linaro.org>
* tree-data-ref.c (dr_analyze_innermost): Add new argument.
Allow not simple iv if analyzing basic block.
(create_data_ref): Update call to dr_analyze_innermost.
2011-09-25 Ira Rosen <ira.rosen@linaro.org>
* lib/target-supports.exp (check_effective_target_vect64): New.
* gcc.dg/vect/bb-slp-11.c: Expect the error message twice in case
of multiple vector sizes.
* gcc.dg/vect/bb-slp-26.c: New.
2011-09-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50280
......
......@@ -49,6 +49,7 @@ int main (void)
}
/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 0 "slp" } } */
/* { dg-final { scan-tree-dump-times "SLP with multiple types" 1 "slp" } } */
/* { dg-final { scan-tree-dump-times "SLP with multiple types" 1 "slp" { xfail vect_multiple_sizes } } } */
/* { dg-final { scan-tree-dump-times "SLP with multiple types" 2 "slp" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "slp" } } */
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define A 3
#define B 4
#define N 256
char src[N], dst[N];
void foo (char * __restrict__ dst, char * __restrict__ src, int h,
int stride, int dummy)
{
int i;
h /= 16;
for (i = 0; i < h; i++)
{
dst[0] += A*src[0] + src[stride];
dst[1] += A*src[1] + src[1+stride];
dst[2] += A*src[2] + src[2+stride];
dst[3] += A*src[3] + src[3+stride];
dst[4] += A*src[4] + src[4+stride];
dst[5] += A*src[5] + src[5+stride];
dst[6] += A*src[6] + src[6+stride];
dst[7] += A*src[7] + src[7+stride];
dst += 8;
src += 8;
if (dummy == 32)
abort ();
}
}
int main (void)
{
int i;
check_vect ();
for (i = 0; i < N; i++)
{
dst[i] = 0;
src[i] = i/8;
}
foo (dst, src, N, 8, 0);
for (i = 0; i < N/2; i++)
{
if (dst[i] != A * src[i] + src[i+8])
abort ();
}
return 0;
}
/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp" { target vect64 } } } */
/* { dg-final { cleanup-tree-dump "slp" } } */
......@@ -3393,6 +3393,24 @@ proc check_effective_target_vect_multiple_sizes { } {
return $et_vect_multiple_sizes_saved
}
# Return 1 if the target supports vectors of 64 bits.
proc check_effective_target_vect64 { } {
global et_vect64
if [info exists et_vect64_saved] {
verbose "check_effective_target_vect64: using cached result" 2
} else {
set et_vect64_saved 0
if { ([istarget arm*-*-*] && [check_effective_target_arm_neon_ok]) } {
set et_vect64_saved 1
}
}
verbose "check_effective_target_vect64: returning $et_vect64_saved" 2
return $et_vect64_saved
}
# Return 1 if the target supports section-anchors
proc check_effective_target_section_anchors { } {
......
......@@ -1694,42 +1694,18 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo)
/* Check if the basic block can be vectorized. */
bb_vec_info
vect_slp_analyze_bb (basic_block bb)
static bb_vec_info
vect_slp_analyze_bb_1 (basic_block bb)
{
bb_vec_info bb_vinfo;
VEC (ddr_p, heap) *ddrs;
VEC (slp_instance, heap) *slp_instances;
slp_instance instance;
int i, insns = 0;
gimple_stmt_iterator gsi;
int i;
int min_vf = 2;
int max_vf = MAX_VECTORIZATION_FACTOR;
bool data_dependence_in_bb = false;
current_vector_size = 0;
if (vect_print_dump_info (REPORT_DETAILS))
fprintf (vect_dump, "===vect_slp_analyze_bb===\n");
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple stmt = gsi_stmt (gsi);
if (!is_gimple_debug (stmt)
&& !gimple_nop_p (stmt)
&& gimple_code (stmt) != GIMPLE_LABEL)
insns++;
}
if (insns > PARAM_VALUE (PARAM_SLP_MAX_INSNS_IN_BB))
{
if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
fprintf (vect_dump, "not vectorized: too many instructions in basic "
"block.\n");
return NULL;
}
bb_vinfo = new_bb_vec_info (bb);
if (!bb_vinfo)
return NULL;
......@@ -1849,6 +1825,61 @@ vect_slp_analyze_bb (basic_block bb)
}
bb_vec_info
vect_slp_analyze_bb (basic_block bb)
{
bb_vec_info bb_vinfo;
int insns = 0;
gimple_stmt_iterator gsi;
unsigned int vector_sizes;
if (vect_print_dump_info (REPORT_DETAILS))
fprintf (vect_dump, "===vect_slp_analyze_bb===\n");
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple stmt = gsi_stmt (gsi);
if (!is_gimple_debug (stmt)
&& !gimple_nop_p (stmt)
&& gimple_code (stmt) != GIMPLE_LABEL)
insns++;
}
if (insns > PARAM_VALUE (PARAM_SLP_MAX_INSNS_IN_BB))
{
if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
fprintf (vect_dump, "not vectorized: too many instructions in basic "
"block.\n");
return NULL;
}
/* Autodetect first vector size we try. */
current_vector_size = 0;
vector_sizes = targetm.vectorize.autovectorize_vector_sizes ();
while (1)
{
bb_vinfo = vect_slp_analyze_bb_1 (bb);
if (bb_vinfo)
return bb_vinfo;
destroy_bb_vec_info (bb_vinfo);
vector_sizes &= ~current_vector_size;
if (vector_sizes == 0
|| current_vector_size == 0)
return NULL;
/* Try the next biggest vector size. */
current_vector_size = 1 << floor_log2 (vector_sizes);
if (vect_print_dump_info (REPORT_DETAILS))
fprintf (vect_dump, "***** Re-trying analysis with "
"vector size %d\n", current_vector_size);
}
}
/* SLP costs are calculated according to SLP instance unrolling factor (i.e.,
the number of created vector stmts depends on the unrolling factor).
However, the actual number of vector stmts for every SLP node depends on
......
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