re PR tree-optimization/45764 (wrong code -O2 vs -O3 (problem in vectorizer???))
2010-10-21 Richard Guenther <rguenther@suse.de> Michael Matz <matz@suse.de> PR tree-optimization/45764 * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Adjust initial misalignment for negative DR_STEP. (vect_find_same_alignment_drs): Two DRs with different DR_STEP do not have the same alignment over the whole iteration domain. * gcc.dg/torture/pr45764.c: New testcase. Co-Authored-By: Michael Matz <matz@suse.de> From-SVN: r165768
This commit is contained in:
parent
82c1834a6f
commit
46241ea9d1
4 changed files with 62 additions and 0 deletions
|
@ -1,3 +1,12 @@
|
|||
2010-10-21 Richard Guenther <rguenther@suse.de>
|
||||
Michael Matz <matz@suse.de>
|
||||
|
||||
PR tree-optimization/45764
|
||||
* tree-vect-data-refs.c (vect_compute_data_ref_alignment):
|
||||
Adjust initial misalignment for negative DR_STEP.
|
||||
(vect_find_same_alignment_drs): Two DRs with different DR_STEP
|
||||
do not have the same alignment over the whole iteration domain.
|
||||
|
||||
2010-10-21 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/46111
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2010-10-21 Richard Guenther <rguenther@suse.de>
|
||||
Michael Matz <matz@suse.de>
|
||||
|
||||
PR tree-optimization/45764
|
||||
* gcc.dg/torture/pr45764.c: New testcase.
|
||||
|
||||
2010-10-21 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/46111
|
||||
|
|
27
gcc/testsuite/gcc.dg/torture/pr45764.c
Normal file
27
gcc/testsuite/gcc.dg/torture/pr45764.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* { dg-do run } */
|
||||
|
||||
int result[64][16];
|
||||
|
||||
int main()
|
||||
{
|
||||
double dbuf[1000] = {0.0};
|
||||
int ibuf[900];
|
||||
int i, j;
|
||||
|
||||
double d1 = 0.0;
|
||||
double d2 = 0.0;
|
||||
for (i = 0; i < 900; ++i) {
|
||||
ibuf[i] = (int)(d2 - d1);
|
||||
d1 += dbuf[i];
|
||||
d2 += dbuf[i + 64];
|
||||
}
|
||||
|
||||
for (i = 0; i < 64; ++i) {
|
||||
for (j = 0; j < 8; ++j) {
|
||||
result[i][ j] = ibuf[64 - i + 64 * j];
|
||||
result[i][15 - j] = ibuf[ i + 64 * j];
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -900,6 +900,19 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
|
|||
|| (TREE_CODE (base) == VAR_DECL
|
||||
&& DECL_ALIGN (base) >= TYPE_ALIGN (vectype)));
|
||||
|
||||
/* If this is a backward running DR then first access in the larger
|
||||
vectype actually is N-1 elements before the address in the DR.
|
||||
Adjust misalign accordingly. */
|
||||
if (tree_int_cst_compare (DR_STEP (dr), size_zero_node) < 0)
|
||||
{
|
||||
tree offset = ssize_int (TYPE_VECTOR_SUBPARTS (vectype) - 1);
|
||||
/* DR_STEP(dr) is the same as -TYPE_SIZE of the scalar type,
|
||||
otherwise we wouldn't be here. */
|
||||
offset = fold_build2 (MULT_EXPR, ssizetype, offset, DR_STEP (dr));
|
||||
/* PLUS because DR_STEP was negative. */
|
||||
misalign = size_binop (PLUS_EXPR, misalign, offset);
|
||||
}
|
||||
|
||||
/* Modulo alignment. */
|
||||
misalign = size_binop (FLOOR_MOD_EXPR, misalign, alignment);
|
||||
|
||||
|
@ -1934,6 +1947,13 @@ vect_find_same_alignment_drs (struct data_dependence_relation *ddr,
|
|||
if (DDR_NUM_DIST_VECTS (ddr) == 0)
|
||||
return;
|
||||
|
||||
/* Data-dependence analysis reports a distance vector of zero
|
||||
for data-references that overlap only in the first iteration
|
||||
but have different sign step (see PR45764).
|
||||
So as a sanity check require equal DR_STEP. */
|
||||
if (!operand_equal_p (DR_STEP (dra), DR_STEP (drb), 0))
|
||||
return;
|
||||
|
||||
loop_depth = index_in_loop_nest (loop->num, DDR_LOOP_NEST (ddr));
|
||||
FOR_EACH_VEC_ELT (lambda_vector, DDR_DIST_VECTS (ddr), i, dist_v)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue