diff options
| author | Sebastian Pop <sebastian.pop@amd.com> | 2008-05-16 16:02:02 +0000 | 
|---|---|---|
| committer | Sebastian Pop <spop@gcc.gnu.org> | 2008-05-16 16:02:02 +0000 | 
| commit | b3924be9712d2b49b59048aff6ba5d288227c40c (patch) | |
| tree | 3a23f8dccec8694c7100a8d3bb896105dd71f2a5 /gcc/tree-data-ref.c | |
| parent | 5b7971f01cf2b0709995c7249e6c21a38acc5f7b (diff) | |
| download | gcc-b3924be9712d2b49b59048aff6ba5d288227c40c.zip gcc-b3924be9712d2b49b59048aff6ba5d288227c40c.tar.gz gcc-b3924be9712d2b49b59048aff6ba5d288227c40c.tar.bz2  | |
re PR tree-optimization/36228 (redundant runtime check while vectorizing)
2008-05-16  Sebastian Pop  <sebastian.pop@amd.com>
	    Jan Sjodin  <jan.sjodin@amd.com>
	PR tree-optimization/36228
	* tree-data-ref.c (initialize_data_dependence_relation): Fast dependence
	test when the references are the same, call compute_self_dependence.
	* tree-data-ref.h (struct data_dependence_relation): Add self_reference_p.
	(DDR_SELF_REFERENCE): New.
	* testsuite/gcc.dg/vect/pr36228.c: New.
Co-Authored-By: Jan Sjodin <jan.sjodin@amd.com>
From-SVN: r135426
Diffstat (limited to 'gcc/tree-data-ref.c')
| -rw-r--r-- | gcc/tree-data-ref.c | 20 | 
1 files changed, 19 insertions, 1 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 90ce7e9..7e9c99f 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -1265,6 +1265,8 @@ dr_may_alias_p (const struct data_reference *a, const struct data_reference *b)    return true;  } +static void compute_self_dependence (struct data_dependence_relation *); +  /* Initialize a data dependence relation between data accesses A and     B.  NB_LOOPS is the number of loops surrounding the references: the     size of the classic distance/direction vectors.  */ @@ -1299,6 +1301,20 @@ initialize_data_dependence_relation (struct data_reference *a,        return res;      } +  /* When the references are exactly the same, don't spend time doing +     the data dependence tests, just initialize the ddr and return.  */ +  if (operand_equal_p (DR_REF (a), DR_REF (b), 0)) +    { +      DDR_AFFINE_P (res) = true; +      DDR_ARE_DEPENDENT (res) = NULL_TREE; +      DDR_SUBSCRIPTS (res) = VEC_alloc (subscript_p, heap, DR_NUM_DIMENSIONS (a)); +      DDR_LOOP_NEST (res) = loop_nest; +      DDR_INNER_LOOP (res) = 0; +      DDR_SELF_REFERENCE (res) = true; +      compute_self_dependence (res); +      return res; +    } +    /* If the references do not access the same object, we do not know       whether they alias or not.  */    if (!operand_equal_p (DR_BASE_OBJECT (a), DR_BASE_OBJECT (b), 0)) @@ -1324,6 +1340,7 @@ initialize_data_dependence_relation (struct data_reference *a,    DDR_SUBSCRIPTS (res) = VEC_alloc (subscript_p, heap, DR_NUM_DIMENSIONS (a));    DDR_LOOP_NEST (res) = loop_nest;    DDR_INNER_LOOP (res) = 0; +  DDR_SELF_REFERENCE (res) = false;    for (i = 0; i < DR_NUM_DIMENSIONS (a); i++)      { @@ -3798,7 +3815,8 @@ compute_affine_dependence (struct data_dependence_relation *ddr,      }    /* Analyze only when the dependence relation is not yet known.  */ -  if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE) +  if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE +      && !DDR_SELF_REFERENCE (ddr))      {        dependence_stats.num_dependence_tests++;  | 
