Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit e382bb9

Browse files
committed
[LV/LoopAccesses] Backward dependences are not safe just because the
accesses are via different types Noticed this while generalizing the code for loop distribution. I confirmed with Arnold that this was indeed a bug and managed to create a testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230647 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 89e4328 commit e382bb9

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

lib/Analysis/LoopAccessAnalysis.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -794,11 +794,10 @@ bool MemoryDepChecker::isDependent(const MemAccessInfo &A, unsigned AIdx,
794794

795795
assert(Val.isStrictlyPositive() && "Expect a positive value");
796796

797-
// Positive distance bigger than max vectorization factor.
798797
if (ATy != BTy) {
799798
DEBUG(dbgs() <<
800799
"LAA: ReadWrite-Write positive dependency with different types\n");
801-
return false;
800+
return true;
802801
}
803802

804803
unsigned Distance = (unsigned) Val.getZExtValue();
@@ -820,6 +819,7 @@ bool MemoryDepChecker::isDependent(const MemAccessInfo &A, unsigned AIdx,
820819
return true;
821820
}
822821

822+
// Positive distance bigger than max vectorization factor.
823823
MaxSafeDepDistBytes = Distance < MaxSafeDepDistBytes ?
824824
Distance : MaxSafeDepDistBytes;
825825

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
; RUN: opt -loop-accesses -analyze < %s | FileCheck %s
2+
3+
; In this loop just because we access A through different types (int, float)
4+
; we still have a dependence cycle:
5+
;
6+
; for (i = 0; i < n; i++) {
7+
; A_float = (float *) A;
8+
; A_float[i + 1] = A[i] * B[i];
9+
; }
10+
11+
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
12+
target triple = "x86_64-apple-macosx10.10.0"
13+
14+
; CHECK: Report: unsafe dependent memory operations in loop
15+
; CHECK-NOT: Memory dependences are safe
16+
17+
@n = global i32 20, align 4
18+
@B = common global i32* null, align 8
19+
@A = common global i32* null, align 8
20+
21+
define void @f() {
22+
entry:
23+
%a = load i32** @A, align 8
24+
%b = load i32** @B, align 8
25+
br label %for.body
26+
27+
for.body: ; preds = %for.body, %entry
28+
%storemerge3 = phi i64 [ 0, %entry ], [ %add, %for.body ]
29+
30+
%arrayidxA = getelementptr inbounds i32* %a, i64 %storemerge3
31+
%loadA = load i32* %arrayidxA, align 2
32+
33+
%arrayidxB = getelementptr inbounds i32* %b, i64 %storemerge3
34+
%loadB = load i32* %arrayidxB, align 2
35+
36+
%mul = mul i32 %loadB, %loadA
37+
38+
%add = add nuw nsw i64 %storemerge3, 1
39+
40+
%a_float = bitcast i32* %a to float*
41+
%arrayidxA_plus_2 = getelementptr inbounds float* %a_float, i64 %add
42+
%mul_float = sitofp i32 %mul to float
43+
store float %mul_float, float* %arrayidxA_plus_2, align 2
44+
45+
%exitcond = icmp eq i64 %add, 20
46+
br i1 %exitcond, label %for.end, label %for.body
47+
48+
for.end: ; preds = %for.body
49+
ret void
50+
}

0 commit comments

Comments
 (0)