Commit 4e4452b6 by Ira Rosen Committed by Ira Rosen

tree-data-ref.c (dr_analyze_innermost): Add new argument.


        * 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.
        (stmt_with_adjacent_zero_store_dr_p, ref_base_address):
        Likewise.
        * tree-loop-distribution.c (generate_memset_zero): Likewise.
        * tree-predcom.c (find_looparound_phi): Likewise.
        * tree-data-ref.h (dr_analyze_innermost): Add new argument.

From-SVN: r179161
parent 10b859c0
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.
(stmt_with_adjacent_zero_store_dr_p, ref_base_address): Likewise.
* tree-loop-distribution.c (generate_memset_zero): Likewise.
* tree-predcom.c (find_looparound_phi): Likewise.
* tree-data-ref.h (dr_analyze_innermost): Add new argument.
2011-09-24 David S. Miller <davem@davemloft.net> 2011-09-24 David S. Miller <davem@davemloft.net>
* config/sparc/sparc.h (FIRST_PSEUDO_REGISTER): Bump to 103. * config/sparc/sparc.h (FIRST_PSEUDO_REGISTER): Bump to 103.
2011-09-25 Ira Rosen <ira.rosen@linaro.org>
* gcc.dg/vect/bb-slp-24.c: New.
2011-09-24 Jason Merrill <jason@redhat.com> 2011-09-24 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/nsdmi-eh1.C: New. * g++.dg/cpp0x/nsdmi-eh1.C: New.
......
/* { dg-require-effective-target vect_int } */
#include <stdarg.h>
#include "tree-vect.h"
#define A 3
#define N 256
short src[N], dst[N];
void foo (short * __restrict__ dst, short * __restrict__ src, int h,
int stride, int dummy)
{
int i;
h /= 8;
for (i = 0; i < h; i++)
{
dst[0] += A*src[0];
dst[1] += A*src[1];
dst[2] += A*src[2];
dst[3] += A*src[3];
dst[4] += A*src[4];
dst[5] += A*src[5];
dst[6] += A*src[6];
dst[7] += A*src[7];
dst += stride;
src += stride;
if (dummy == 32)
abort ();
}
}
int main (void)
{
int i;
check_vect ();
for (i = 0; i < N; i++)
{
dst[i] = 0;
src[i] = i;
}
foo (dst, src, N, 8, 0);
for (i = 0; i < N; i++)
{
if (dst[i] != A * i)
abort ();
}
return 0;
}
/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp" { target vect_element_align } } } */
/* { dg-final { cleanup-tree-dump "slp" } } */
...@@ -722,11 +722,11 @@ canonicalize_base_object_address (tree addr) ...@@ -722,11 +722,11 @@ canonicalize_base_object_address (tree addr)
} }
/* Analyzes the behavior of the memory reference DR in the innermost loop or /* Analyzes the behavior of the memory reference DR in the innermost loop or
basic block that contains it. Returns true if analysis succeed or false basic block that contains it. Returns true if analysis succeed or false
otherwise. */ otherwise. */
bool bool
dr_analyze_innermost (struct data_reference *dr) dr_analyze_innermost (struct data_reference *dr, struct loop *nest)
{ {
gimple stmt = DR_STMT (dr); gimple stmt = DR_STMT (dr);
struct loop *loop = loop_containing_stmt (stmt); struct loop *loop = loop_containing_stmt (stmt);
...@@ -769,14 +769,25 @@ dr_analyze_innermost (struct data_reference *dr) ...@@ -769,14 +769,25 @@ dr_analyze_innermost (struct data_reference *dr)
} }
else else
base = build_fold_addr_expr (base); base = build_fold_addr_expr (base);
if (in_loop) if (in_loop)
{ {
if (!simple_iv (loop, loop_containing_stmt (stmt), base, &base_iv, if (!simple_iv (loop, loop_containing_stmt (stmt), base, &base_iv,
false)) false))
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (nest)
fprintf (dump_file, "failed: evolution of base is not affine.\n"); {
return false; if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "failed: evolution of base is not"
" affine.\n");
return false;
}
else
{
base_iv.base = base;
base_iv.step = ssize_int (0);
base_iv.no_overflow = true;
}
} }
} }
else else
...@@ -801,10 +812,18 @@ dr_analyze_innermost (struct data_reference *dr) ...@@ -801,10 +812,18 @@ dr_analyze_innermost (struct data_reference *dr)
else if (!simple_iv (loop, loop_containing_stmt (stmt), else if (!simple_iv (loop, loop_containing_stmt (stmt),
poffset, &offset_iv, false)) poffset, &offset_iv, false))
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (nest)
fprintf (dump_file, "failed: evolution of offset is not" {
" affine.\n"); if (dump_file && (dump_flags & TDF_DETAILS))
return false; fprintf (dump_file, "failed: evolution of offset is not"
" affine.\n");
return false;
}
else
{
offset_iv.base = poffset;
offset_iv.step = ssize_int (0);
}
} }
} }
...@@ -972,7 +991,7 @@ create_data_ref (loop_p nest, loop_p loop, tree memref, gimple stmt, ...@@ -972,7 +991,7 @@ create_data_ref (loop_p nest, loop_p loop, tree memref, gimple stmt,
DR_REF (dr) = memref; DR_REF (dr) = memref;
DR_IS_READ (dr) = is_read; DR_IS_READ (dr) = is_read;
dr_analyze_innermost (dr); dr_analyze_innermost (dr, nest);
dr_analyze_indices (dr, nest, loop); dr_analyze_indices (dr, nest, loop);
dr_analyze_alias (dr); dr_analyze_alias (dr);
...@@ -5150,7 +5169,7 @@ stmt_with_adjacent_zero_store_dr_p (gimple stmt) ...@@ -5150,7 +5169,7 @@ stmt_with_adjacent_zero_store_dr_p (gimple stmt)
DR_STMT (dr) = stmt; DR_STMT (dr) = stmt;
DR_REF (dr) = op0; DR_REF (dr) = op0;
res = dr_analyze_innermost (dr) res = dr_analyze_innermost (dr, loop_containing_stmt (stmt))
&& stride_of_unit_type_p (DR_STEP (dr), TREE_TYPE (op0)); && stride_of_unit_type_p (DR_STEP (dr), TREE_TYPE (op0));
free_data_ref (dr); free_data_ref (dr);
...@@ -5190,7 +5209,7 @@ ref_base_address (gimple stmt, data_ref_loc *ref) ...@@ -5190,7 +5209,7 @@ ref_base_address (gimple stmt, data_ref_loc *ref)
DR_STMT (dr) = stmt; DR_STMT (dr) = stmt;
DR_REF (dr) = *ref->pos; DR_REF (dr) = *ref->pos;
dr_analyze_innermost (dr); dr_analyze_innermost (dr, loop_containing_stmt (stmt));
base_address = DR_BASE_ADDRESS (dr); base_address = DR_BASE_ADDRESS (dr);
if (!base_address) if (!base_address)
......
...@@ -386,7 +386,7 @@ DEF_VEC_O (data_ref_loc); ...@@ -386,7 +386,7 @@ DEF_VEC_O (data_ref_loc);
DEF_VEC_ALLOC_O (data_ref_loc, heap); DEF_VEC_ALLOC_O (data_ref_loc, heap);
bool get_references_in_stmt (gimple, VEC (data_ref_loc, heap) **); bool get_references_in_stmt (gimple, VEC (data_ref_loc, heap) **);
bool dr_analyze_innermost (struct data_reference *); bool dr_analyze_innermost (struct data_reference *, struct loop *);
extern bool compute_data_dependences_for_loop (struct loop *, bool, extern bool compute_data_dependences_for_loop (struct loop *, bool,
VEC (loop_p, heap) **, VEC (loop_p, heap) **,
VEC (data_reference_p, heap) **, VEC (data_reference_p, heap) **,
......
...@@ -268,7 +268,7 @@ generate_memset_zero (gimple stmt, tree op0, tree nb_iter, ...@@ -268,7 +268,7 @@ generate_memset_zero (gimple stmt, tree op0, tree nb_iter,
DR_STMT (dr) = stmt; DR_STMT (dr) = stmt;
DR_REF (dr) = op0; DR_REF (dr) = op0;
res = dr_analyze_innermost (dr); res = dr_analyze_innermost (dr, loop_containing_stmt (stmt));
gcc_assert (res && stride_of_unit_type_p (DR_STEP (dr), TREE_TYPE (op0))); gcc_assert (res && stride_of_unit_type_p (DR_STEP (dr), TREE_TYPE (op0)));
nb_bytes = build_size_arg_loc (loc, nb_iter, op0, &stmt_list); nb_bytes = build_size_arg_loc (loc, nb_iter, op0, &stmt_list);
......
...@@ -1116,7 +1116,7 @@ find_looparound_phi (struct loop *loop, dref ref, dref root) ...@@ -1116,7 +1116,7 @@ find_looparound_phi (struct loop *loop, dref ref, dref root)
memset (&init_dr, 0, sizeof (struct data_reference)); memset (&init_dr, 0, sizeof (struct data_reference));
DR_REF (&init_dr) = init_ref; DR_REF (&init_dr) = init_ref;
DR_STMT (&init_dr) = phi; DR_STMT (&init_dr) = phi;
if (!dr_analyze_innermost (&init_dr)) if (!dr_analyze_innermost (&init_dr, loop))
return NULL; return NULL;
if (!valid_initializer_p (&init_dr, ref->distance + 1, root->ref)) if (!valid_initializer_p (&init_dr, ref->distance + 1, root->ref))
......
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