This should fix PR53616, loop distribution can change partition ordering when merging non-builtin partitions again, not honoring read-after-write dependences. The patch simply avoids any change in ordering.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2012-07-23 Richard Guenther <rguent...@suse.de> PR tree-optimization/53616 * tree-loop-distribution.c (ldist_gen): Do not change partition ordering when merging partitions. Index: gcc/tree-loop-distribution.c =================================================================== *** gcc/tree-loop-distribution.c (revision 189777) --- gcc/tree-loop-distribution.c (working copy) *************** ldist_gen (struct loop *loop, struct gra *** 1289,1304 **** nbp = 0; goto ldist_done; } ! for (i = 0; VEC_iterate (partition_t, partitions, i, into); ++i) ! if (!partition_builtin_p (into)) ! break; ! for (++i; VEC_iterate (partition_t, partitions, i, partition); ++i) ! if (!partition_builtin_p (partition)) ! { ! bitmap_ior_into (into->stmts, partition->stmts); ! VEC_ordered_remove (partition_t, partitions, i); ! i--; ! } } else { --- 1289,1313 ---- nbp = 0; goto ldist_done; } ! /* Only fuse adjacent non-builtin partitions, see PR53616. ! ??? Use dependence information to improve partition ordering. */ ! i = 0; ! do ! { ! for (; VEC_iterate (partition_t, partitions, i, into); ++i) ! if (!partition_builtin_p (into)) ! break; ! for (++i; VEC_iterate (partition_t, partitions, i, partition); ++i) ! if (!partition_builtin_p (partition)) ! { ! bitmap_ior_into (into->stmts, partition->stmts); ! VEC_ordered_remove (partition_t, partitions, i); ! i--; ! } ! else ! break; ! } ! while ((unsigned) i < VEC_length (partition_t, partitions)); } else {