From 821dbeef4b25d7ed5ad4f9bb507e3bd8579da3af Mon Sep 17 00:00:00 2001 From: Bin Cheng Date: Wed, 5 Jul 2017 11:52:24 +0000 Subject: [PATCH] tree-loop-distribution.c (enum fuse_type, [...]): New. * tree-loop-distribution.c (enum fuse_type, fuse_message): New. (partition_merge_into): New parameter. Dump reason for fusion. (distribute_loop): Update use of partition_merge_into. From-SVN: r249986 --- gcc/ChangeLog | 6 ++++ gcc/tree-loop-distribution.c | 66 +++++++++++++++++------------------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 49bacf55c1f..c3e3a4a60f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-07-05 Bin Cheng + + * tree-loop-distribution.c (enum fuse_type, fuse_message): New. + (partition_merge_into): New parameter. Dump reason for fusion. + (distribute_loop): Update use of partition_merge_into. + 2017-07-05 Bin Cheng * tree-loop-distribution.c (bb_top_order_index): New. diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 887e8702589..f409e946155 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -545,15 +545,42 @@ partition_reduction_p (partition *partition) return partition->reduction_p; } +/* Partitions are fused because of different reasons. */ +enum fuse_type +{ + FUSE_NON_BUILTIN = 0, + FUSE_REDUCTION = 1, + FUSE_SHARE_REF = 2, + FUSE_SAME_SCC = 3, + FUSE_FINALIZE = 4 +}; + +/* Description on different fusing reason. */ +static const char *fuse_message[] = { + "they are non-builtins", + "they have reductions", + "they have shared memory refs", + "they are in the same dependence scc", + "there is no point to distribute loop"}; + /* Merge PARTITION into the partition DEST. */ static void -partition_merge_into (partition *dest, partition *partition) +partition_merge_into (partition *dest, partition *partition, enum fuse_type ft) { dest->kind = PKIND_NORMAL; bitmap_ior_into (dest->stmts, partition->stmts); if (partition_reduction_p (partition)) dest->reduction_p = true; + + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "Fuse partitions because %s:\n", fuse_message[ft]); + fprintf (dump_file, " Part 1: "); + dump_bitmap (dump_file, dest->stmts); + fprintf (dump_file, " Part 2: "); + dump_bitmap (dump_file, partition->stmts); + } } @@ -1531,13 +1558,7 @@ distribute_loop (struct loop *loop, vec stmts, for (++i; partitions.iterate (i, &partition); ++i) if (!partition_builtin_p (partition)) { - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "fusing non-builtin partitions\n"); - dump_bitmap (dump_file, into->stmts); - dump_bitmap (dump_file, partition->stmts); - } - partition_merge_into (into, partition); + partition_merge_into (into, partition, FUSE_NON_BUILTIN); partitions.unordered_remove (i); partition_free (partition); i--; @@ -1553,14 +1574,7 @@ distribute_loop (struct loop *loop, vec stmts, for (i = i + 1; partitions.iterate (i, &partition); ++i) if (partition_reduction_p (partition)) { - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "fusing partitions\n"); - dump_bitmap (dump_file, into->stmts); - dump_bitmap (dump_file, partition->stmts); - fprintf (dump_file, "because they have reductions\n"); - } - partition_merge_into (into, partition); + partition_merge_into (into, partition, FUSE_REDUCTION); partitions.unordered_remove (i); partition_free (partition); i--; @@ -1578,15 +1592,7 @@ distribute_loop (struct loop *loop, vec stmts, { if (similar_memory_accesses (rdg, into, partition)) { - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "fusing partitions\n"); - dump_bitmap (dump_file, into->stmts); - dump_bitmap (dump_file, partition->stmts); - fprintf (dump_file, "because they have similar " - "memory accesses\n"); - } - partition_merge_into (into, partition); + partition_merge_into (into, partition, FUSE_SHARE_REF); partitions.unordered_remove (j); partition_free (partition); j--; @@ -1678,15 +1684,7 @@ distribute_loop (struct loop *loop, vec stmts, for (j = j + 1; partitions.iterate (j, &partition); ++j) if (pg->vertices[j].component == i) { - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "fusing partitions\n"); - dump_bitmap (dump_file, first->stmts); - dump_bitmap (dump_file, partition->stmts); - fprintf (dump_file, "because they are in the same " - "dependence SCC\n"); - } - partition_merge_into (first, partition); + partition_merge_into (first, partition, FUSE_SAME_SCC); partitions[j] = NULL; partition_free (partition); PGDATA (j)->partition = NULL;