Skip to content

Commit 17139f3

Browse files
committed
[LAA] Check HasSameSize before couldPreventStoreLoadForward.
After 9645267, TypeByteSize is 0 if both access do not have the same size (i.e. HasSameSize will be false). This can cause an infinite loop in couldPreventStoreLoadForward, if HasSameSize is not checked first. So check HasSameSize first instead of after couldPreventStoreLoadForward. Checking HasSameSize first is also cheaper.
1 parent 0e86d3e commit 17139f3

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

llvm/lib/Analysis/LoopAccessAnalysis.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,8 +2009,8 @@ MemoryDepChecker::Dependence::DepType MemoryDepChecker::isDependent(
20092009
// couldPreventStoreLoadForward, even if it changed MinDepDistBytes,
20102010
// since a forward dependency will allow vectorization using any width.
20112011
if (IsTrueDataDependence && EnableForwardingConflictDetection &&
2012-
(couldPreventStoreLoadForward(Val.abs().getZExtValue(), TypeByteSize) ||
2013-
!HasSameSize)) {
2012+
(!HasSameSize || couldPreventStoreLoadForward(Val.abs().getZExtValue(),
2013+
TypeByteSize))) {
20142014
LLVM_DEBUG(dbgs() << "LAA: Forward but may prevent st->ld forwarding\n");
20152015
return Dependence::ForwardButPreventsForwarding;
20162016
}

llvm/test/Analysis/LoopAccessAnalysis/forward-loop-carried.ll

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,49 @@ for.body: ; preds = %for.body, %entry
5353
for.end: ; preds = %for.body
5454
ret void
5555
}
56+
57+
%struct = type { i8, [3 x i8], i32 }
58+
59+
define void @forward_different_access_sizes(ptr readnone %end, ptr %start) {
60+
; CHECK-LABEL: 'forward_different_access_sizes'
61+
; CHECK-NEXT: loop:
62+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
63+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
64+
; CHECK-NEXT: Dependences:
65+
; CHECK-NEXT: Forward:
66+
; CHECK-NEXT: %l = load i24, ptr %gep.1, align 1 ->
67+
; CHECK-NEXT: store i24 %l, ptr %ptr.iv, align 1
68+
; CHECK-EMPTY:
69+
; CHECK-NEXT: ForwardButPreventsForwarding:
70+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
71+
; CHECK-NEXT: %l = load i24, ptr %gep.1, align 1
72+
; CHECK-EMPTY:
73+
; CHECK-NEXT: Forward:
74+
; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 ->
75+
; CHECK-NEXT: store i24 %l, ptr %ptr.iv, align 1
76+
; CHECK-EMPTY:
77+
; CHECK-NEXT: Run-time memory checks:
78+
; CHECK-NEXT: Grouped accesses:
79+
; CHECK-EMPTY:
80+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
81+
; CHECK-NEXT: SCEV assumptions:
82+
; CHECK-EMPTY:
83+
; CHECK-NEXT: Expressions re-written:
84+
;
85+
entry:
86+
br label %loop
87+
88+
loop:
89+
%ptr.iv = phi ptr [ %start, %entry ], [ %next, %loop ]
90+
%gep.2 = getelementptr %struct, ptr %ptr.iv, i64 0, i32 2
91+
store i32 0, ptr %gep.2, align 4
92+
%gep.1 = getelementptr %struct, ptr %ptr.iv, i64 0, i32 1
93+
%l = load i24, ptr %gep.1, align 1
94+
store i24 %l, ptr %ptr.iv, align 1
95+
%next = getelementptr inbounds %struct, ptr %ptr.iv, i64 1
96+
%ec = icmp eq ptr %ptr.iv, %end
97+
br i1 %ec, label %exit, label %loop
98+
99+
exit:
100+
ret void
101+
}

0 commit comments

Comments
 (0)