Commit 95f7d11b by Bin Cheng Committed by Bin Cheng

tree-loop-distribution.c (ref_base_address): Delete.

	* tree-loop-distribution.c (ref_base_address): Delete.
	(similar_memory_accesses): Rename ...
	(share_memory_accesses): ... to this.  Check if partitions access
	the same memory reference.
	(distribute_loop): Call share_memory_accesses.

	gcc/testsuite
	* gcc.dg/tree-ssa/ldist-6.c: XFAIL.

From-SVN: r249990
parent a7a44c07
2017-07-05 Bin Cheng <bin.cheng@arm.com> 2017-07-05 Bin Cheng <bin.cheng@arm.com>
* tree-loop-distribution.c (ref_base_address): Delete.
(similar_memory_accesses): Rename ...
(share_memory_accesses): ... to this. Check if partitions access
the same memory reference.
(distribute_loop): Call share_memory_accesses.
2017-07-05 Bin Cheng <bin.cheng@arm.com>
* tree-loop-distribution.c (struct partition): New field recording * tree-loop-distribution.c (struct partition): New field recording
its data reference. its data reference.
(partition_alloc, partition_free): Init and release data refs. (partition_alloc, partition_free): Init and release data refs.
......
2017-07-05 Bin Cheng <bin.cheng@arm.com>
* gcc.dg/tree-ssa/ldist-6.c: XFAIL.
2017-07-04 Uros Bizjak <ubizjak@gmail.com> 2017-07-04 Uros Bizjak <ubizjak@gmail.com>
PR target/81300 PR target/81300
......
...@@ -34,4 +34,4 @@ int loop1 (int k) ...@@ -34,4 +34,4 @@ int loop1 (int k)
return a[1000-2] + b[1000-1] + c[1000-2] + d[1000-2]; return a[1000-2] + b[1000-1] + c[1000-2] + d[1000-2];
} }
/* { dg-final { scan-tree-dump-times "distributed: split to 2 loops" 0 "ldist" } } */ /* { dg-final { scan-tree-dump-times "distributed: split to 2 loops" 0 "ldist" { xfail *-*-* } } } */
...@@ -1268,30 +1268,16 @@ classify_partition (loop_p loop, struct graph *rdg, partition *partition) ...@@ -1268,30 +1268,16 @@ classify_partition (loop_p loop, struct graph *rdg, partition *partition)
} }
} }
/* For a data reference REF, return the declaration of its base /* Returns true when PARTITION1 and PARTITION2 access the same memory
address or NULL_TREE if the base is not determined. */ object in RDG. */
static tree
ref_base_address (data_reference_p dr)
{
tree base_address = DR_BASE_ADDRESS (dr);
if (base_address
&& TREE_CODE (base_address) == ADDR_EXPR)
return TREE_OPERAND (base_address, 0);
return base_address;
}
/* Returns true when PARTITION1 and PARTITION2 have similar memory
accesses in RDG. */
static bool static bool
similar_memory_accesses (struct graph *rdg, partition *partition1, share_memory_accesses (struct graph *rdg,
partition *partition2) partition *partition1, partition *partition2)
{ {
unsigned i, j, k, l; unsigned i, j;
bitmap_iterator bi, bj; bitmap_iterator bi, bj;
data_reference_p ref1, ref2; data_reference_p dr1, dr2;
/* First check whether in the intersection of the two partitions are /* First check whether in the intersection of the two partitions are
any loads or stores. Common loads are the situation that happens any loads or stores. Common loads are the situation that happens
...@@ -1301,20 +1287,27 @@ similar_memory_accesses (struct graph *rdg, partition *partition1, ...@@ -1301,20 +1287,27 @@ similar_memory_accesses (struct graph *rdg, partition *partition1,
|| RDG_MEM_READS_STMT (rdg, i)) || RDG_MEM_READS_STMT (rdg, i))
return true; return true;
/* Then check all data-references against each other. */ /* Then check whether the two partitions access the same memory object. */
EXECUTE_IF_SET_IN_BITMAP (partition1->stmts, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (partition1->datarefs, 0, i, bi)
if (RDG_MEM_WRITE_STMT (rdg, i)
|| RDG_MEM_READS_STMT (rdg, i))
EXECUTE_IF_SET_IN_BITMAP (partition2->stmts, 0, j, bj)
if (RDG_MEM_WRITE_STMT (rdg, j)
|| RDG_MEM_READS_STMT (rdg, j))
{ {
FOR_EACH_VEC_ELT (RDG_DATAREFS (rdg, i), k, ref1) dr1 = datarefs_vec[i];
if (!DR_BASE_ADDRESS (dr1)
|| !DR_OFFSET (dr1) || !DR_INIT (dr1) || !DR_STEP (dr1))
continue;
EXECUTE_IF_SET_IN_BITMAP (partition2->datarefs, 0, j, bj)
{ {
tree base1 = ref_base_address (ref1); dr2 = datarefs_vec[j];
if (base1)
FOR_EACH_VEC_ELT (RDG_DATAREFS (rdg, j), l, ref2) if (!DR_BASE_ADDRESS (dr2)
if (base1 == ref_base_address (ref2)) || !DR_OFFSET (dr2) || !DR_INIT (dr2) || !DR_STEP (dr2))
continue;
if (operand_equal_p (DR_BASE_ADDRESS (dr1), DR_BASE_ADDRESS (dr2), 0)
&& operand_equal_p (DR_OFFSET (dr1), DR_OFFSET (dr2), 0)
&& operand_equal_p (DR_INIT (dr1), DR_INIT (dr2), 0)
&& operand_equal_p (DR_STEP (dr1), DR_STEP (dr2), 0))
return true; return true;
} }
} }
...@@ -1654,7 +1647,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, ...@@ -1654,7 +1647,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
for (int j = i + 1; for (int j = i + 1;
partitions.iterate (j, &partition); ++j) partitions.iterate (j, &partition); ++j)
{ {
if (similar_memory_accesses (rdg, into, partition)) if (share_memory_accesses (rdg, into, partition))
{ {
partition_merge_into (into, partition, FUSE_SHARE_REF); partition_merge_into (into, partition, FUSE_SHARE_REF);
partitions.unordered_remove (j); partitions.unordered_remove (j);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment