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
      {

Reply via email to