Skip to content

Commit 283feb4

Browse files
authored
[polly] Make reduction detection checks more robust - part 2 (#80721)
Existing reduction detection algorithm does two types of memory checks before marking a load store pair as reduction. Second check is to verify there is no other memory access in ScopStmt overlapping with the memory of load and store that forms the reduction. Existing check misses cases where there could be probable overlap such as A[V] += A[P]; In the above case there is chance of overlap between A[V] and A[P] which is missed. This commit addresses this by removing the parameter from space before checking for compatible space. Part 1 of this patch : [75297](#75297)
1 parent fcef407 commit 283feb4

File tree

4 files changed

+14
-10
lines changed

4 files changed

+14
-10
lines changed

polly/lib/Analysis/ScopBuilder.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2516,15 +2516,19 @@ bool hasIntersectingAccesses(isl::set AllAccs, MemoryAccess *LoadMA,
25162516
MemoryAccess *StoreMA, isl::set Domain,
25172517
SmallVector<MemoryAccess *, 8> &MemAccs) {
25182518
bool HasIntersectingAccs = false;
2519+
auto AllAccsNoParams = AllAccs.project_out_all_params();
2520+
25192521
for (MemoryAccess *MA : MemAccs) {
25202522
if (MA == LoadMA || MA == StoreMA)
25212523
continue;
2524+
auto AccRel = MA->getAccessRelation().intersect_domain(Domain);
2525+
auto Accs = AccRel.range();
2526+
auto AccsNoParams = Accs.project_out_all_params();
25222527

2523-
isl::map AccRel = MA->getAccessRelation().intersect_domain(Domain);
2524-
isl::set Accs = AccRel.range();
2528+
bool CompatibleSpace = AllAccsNoParams.has_equal_space(AccsNoParams);
25252529

2526-
if (AllAccs.has_equal_space(Accs)) {
2527-
isl::set OverlapAccs = Accs.intersect(AllAccs);
2530+
if (CompatibleSpace) {
2531+
auto OverlapAccs = Accs.intersect(AllAccs);
25282532
bool DoesIntersect = !OverlapAccs.is_empty();
25292533
HasIntersectingAccs |= DoesIntersect;
25302534
}

polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_2.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@
4444
; INNERMOST-NEXT: [p_0, p_1, p_2] -> { Stmt_bb16[i0] -> MemRef_A[p_1] };
4545
; INNERMOST-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
4646
; INNERMOST-NEXT: [p_0, p_1, p_2] -> { Stmt_bb16[i0] -> MemRef_A[p_2] };
47-
; INNERMOST-NEXT: ReadAccess := [Reduction Type: +] [Scalar: 0]
47+
; INNERMOST-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
4848
; INNERMOST-NEXT: [p_0, p_1, p_2] -> { Stmt_bb16[i0] -> MemRef_A[p_0 + i0] };
49-
; INNERMOST-NEXT: MustWriteAccess := [Reduction Type: +] [Scalar: 0]
49+
; INNERMOST-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
5050
; INNERMOST-NEXT: [p_0, p_1, p_2] -> { Stmt_bb16[i0] -> MemRef_A[p_0 + i0] };
5151
; INNERMOST-NEXT: Stmt_bb26
5252
; INNERMOST-NEXT: Domain :=

polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_3.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@
4444
; INNERMOST-NEXT: [p_0, p_1, p_2] -> { Stmt_bb16[i0] -> MemRef_A[p_1] };
4545
; INNERMOST-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
4646
; INNERMOST-NEXT: [p_0, p_1, p_2] -> { Stmt_bb16[i0] -> MemRef_A[p_2] };
47-
; INNERMOST-NEXT: ReadAccess := [Reduction Type: +] [Scalar: 0]
47+
; INNERMOST-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
4848
; INNERMOST-NEXT: [p_0, p_1, p_2] -> { Stmt_bb16[i0] -> MemRef_A[i0] };
49-
; INNERMOST-NEXT: MustWriteAccess := [Reduction Type: +] [Scalar: 0]
49+
; INNERMOST-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
5050
; INNERMOST-NEXT: [p_0, p_1, p_2] -> { Stmt_bb16[i0] -> MemRef_A[i0] };
5151
; INNERMOST-NEXT: Stmt_bb26
5252
; INNERMOST-NEXT: Domain :=

polly/test/ScopInfo/int2ptr_ptr2int.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
;
1212
; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
1313
; CHECK-NEXT: [val, ptr] -> { Stmt_for_body[i0] -> MemRef_A[9 + val] };
14-
; CHECK-NEXT: ReadAccess := [Reduction Type: +] [Scalar: 0]
14+
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
1515
; CHECK-NEXT: [val, ptr] -> { Stmt_for_body[i0] -> MemRef_A[9 + ptr] };
16-
; CHECK-NEXT: MustWriteAccess := [Reduction Type: +] [Scalar: 0]
16+
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
1717
; CHECK-NEXT: [val, ptr] -> { Stmt_for_body[i0] -> MemRef_A[9 + ptr] };
1818
;
1919
; IR: entry:

0 commit comments

Comments
 (0)