diff options
author | Adam Nemet <anemet@apple.com> | 2015-11-03 20:13:43 +0000 |
---|---|---|
committer | Adam Nemet <anemet@apple.com> | 2015-11-03 20:13:43 +0000 |
commit | d7037c56d3faa38eb9870abfb181a339e5532a13 (patch) | |
tree | 47cdc1aa82ca57d80079494a20a56ae4e85dbffc /llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll | |
parent | b45516e875f5398418cf7e89f20bd41707b52358 (diff) | |
download | bcm5719-llvm-d7037c56d3faa38eb9870abfb181a339e5532a13.tar.gz bcm5719-llvm-d7037c56d3faa38eb9870abfb181a339e5532a13.zip |
[LAA] LLE 2/6: Fix a NoDep case that should be a Forward dependence
Summary:
When the dependence distance in zero then we have a loop-independent
dependence from the earlier to the later access.
No current client of LAA uses forward dependences so other than
potentially hitting the MaxDependences threshold earlier, this change
shouldn't affect anything right now.
This and the previous patch were tested together for compile-time
regression. None found in LNT/SPEC.
Reviewers: hfinkel
Subscribers: rengolin, llvm-commits
Differential Revision: http://reviews.llvm.org/D13255
llvm-svn: 251973
Diffstat (limited to 'llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll')
-rw-r--r-- | llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll b/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll new file mode 100644 index 00000000000..c5573aee579 --- /dev/null +++ b/llvm/test/Analysis/LoopAccessAnalysis/forward-loop-independent.ll @@ -0,0 +1,64 @@ +; RUN: opt -loop-accesses -analyze < %s | FileCheck %s + +; Check that loop-indepedent forward dependences are discovered properly. +; +; FIXME: This does not actually always work which is pretty confusing. Right +; now there is hack in LAA that tries to figure out loop-indepedent forward +; dependeces *outside* of the MemoryDepChecker logic (i.e. proper dependence +; analysis). +; +; Therefore if there is only loop-independent dependences for an array +; (i.e. the same index is used), we don't discover the forward dependence. +; So, at ***, we add another non-I-based access of A to trigger +; MemoryDepChecker analysis for accesses of A. +; +; for (unsigned i = 0; i < 100; i++) { +; A[i + 1] = B[i] + 1; // *** +; A[i] = B[i] + 2; +; C[i] = A[i] * 2; +; } + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" + +define void @f(i32* noalias %A, i32* noalias %B, i32* noalias %C, i64 %N) { + +; CHECK: Interesting Dependences: +; CHECK-NEXT: Forward: +; CHECK-NEXT: store i32 %b_p1, i32* %Aidx, align 4 -> +; CHECK-NEXT: %a = load i32, i32* %Aidx, align 4 +; CHECK: ForwardButPreventsForwarding: +; CHECK-NEXT: store i32 %b_p2, i32* %Aidx_next, align 4 -> +; CHECK-NEXT: %a = load i32, i32* %Aidx, align 4 +; CHECK: Forward: +; CHECK-NEXT: store i32 %b_p2, i32* %Aidx_next, align 4 -> +; CHECK-NEXT: store i32 %b_p1, i32* %Aidx, align 4 + +entry: + br label %for.body + +for.body: ; preds = %for.body, %entry + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + + %Bidx = getelementptr inbounds i32, i32* %B, i64 %indvars.iv + %Cidx = getelementptr inbounds i32, i32* %C, i64 %indvars.iv + %Aidx_next = getelementptr inbounds i32, i32* %A, i64 %indvars.iv.next + %Aidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv + + %b = load i32, i32* %Bidx, align 4 + %b_p2 = add i32 %b, 1 + store i32 %b_p2, i32* %Aidx_next, align 4 + + %b_p1 = add i32 %b, 2 + store i32 %b_p1, i32* %Aidx, align 4 + + %a = load i32, i32* %Aidx, align 4 + %c = mul i32 %a, 2 + store i32 %c, i32* %Cidx, align 4 + + %exitcond = icmp eq i64 %indvars.iv.next, %N + br i1 %exitcond, label %for.end, label %for.body + +for.end: ; preds = %for.body + ret void +} |