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>
* 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
its data reference.
(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>
PR target/81300
......
......@@ -34,4 +34,4 @@ int loop1 (int k)
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)
}
}
/* For a data reference REF, return the declaration of its base
address or NULL_TREE if the base is not determined. */
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. */
/* Returns true when PARTITION1 and PARTITION2 access the same memory
object in RDG. */
static bool
similar_memory_accesses (struct graph *rdg, partition *partition1,
partition *partition2)
share_memory_accesses (struct graph *rdg,
partition *partition1, partition *partition2)
{
unsigned i, j, k, l;
unsigned i, j;
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
any loads or stores. Common loads are the situation that happens
......@@ -1301,23 +1287,30 @@ similar_memory_accesses (struct graph *rdg, partition *partition1,
|| RDG_MEM_READS_STMT (rdg, i))
return true;
/* Then check all data-references against each other. */
EXECUTE_IF_SET_IN_BITMAP (partition1->stmts, 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)
{
tree base1 = ref_base_address (ref1);
if (base1)
FOR_EACH_VEC_ELT (RDG_DATAREFS (rdg, j), l, ref2)
if (base1 == ref_base_address (ref2))
return true;
}
}
/* Then check whether the two partitions access the same memory object. */
EXECUTE_IF_SET_IN_BITMAP (partition1->datarefs, 0, i, bi)
{
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)
{
dr2 = datarefs_vec[j];
if (!DR_BASE_ADDRESS (dr2)
|| !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 false;
}
......@@ -1654,7 +1647,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
for (int j = i + 1;
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);
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