re PR tree-optimization/59038 (r204398 causes 186.crafty init.c to be miscompiled)

2013-11-08  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/59038
	PR tree-optimization/58955
	* tree-loop-distribution.c (pg_add_dependence_edges): Revert
	previous change.  Handle known dependences correctly.

	* gcc.dg/torture/pr59038.c: New testcase.

From-SVN: r204561
This commit is contained in:
Richard Biener 2013-11-08 08:44:02 +00:00 committed by Richard Biener
parent 7d6c5039bb
commit 2cf19e2664
3 changed files with 43 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2013-11-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/59038
PR tree-optimization/58955
* tree-loop-distribution.c (pg_add_dependence_edges): Revert
previous change. Handle known dependences correctly.
2013-11-08 Tom de Vries <tom@codesourcery.com>
* config/rs6000/t-xilinx: Remove duplicate contents.

View File

@ -0,0 +1,25 @@
/* { dg-do run } */
extern void abort (void);
unsigned char first_ones_8bit[256];
unsigned char connected_passed[256];
int
main ()
{
int i, j;
for (i=0;i<256;i++){
connected_passed[i]=0;
first_ones_8bit[i]=0;
for (j=7;j>0;j--){
if ((i & (3<<(7-j))) == (3<<(7-j))){
connected_passed[i]=j;
break;
}
}
}
if (connected_passed[3] != 7)
abort ();
return 0;
}

View File

@ -1324,7 +1324,7 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
for (int ii = 0; drs1.iterate (ii, &dr1); ++ii)
for (int jj = 0; drs2.iterate (jj, &dr2); ++jj)
{
int this_dir = -1;
int this_dir = 1;
ddr_p ddr;
/* Re-shuffle data-refs to be in dominator order. */
if (rdg_vertex_for_stmt (rdg, DR_STMT (dr1))
@ -1350,8 +1350,17 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
}
/* Known dependences can still be unordered througout the
iteration space, see gcc.dg/tree-ssa/ldist-16.c. */
if (DDR_NUM_DIST_VECTS (ddr) == 0)
if (DDR_NUM_DIST_VECTS (ddr) != 1)
this_dir = 2;
/* If the overlap is exact preserve stmt order. */
else if (lambda_vector_zerop (DDR_DIST_VECT (ddr, 0), 1))
;
else
{
/* Else as the distance vector is lexicographic positive
swap the dependence direction. */
this_dir = -this_dir;
}
}
else
this_dir = 0;