[llvm] r270072 - [LAA] Check independence of strided accesses before forward case
Adam Nemet via llvm-commits
llvm-commits at lists.llvm.org
Thu May 19 10:07:06 PDT 2016
Thanks!
> On May 19, 2016, at 8:37 AM, Matthew Simpson via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: mssimpso
> Date: Thu May 19 10:37:19 2016
> New Revision: 270072
>
> URL: http://llvm.org/viewvc/llvm-project?rev=270072&view=rev
> Log:
> [LAA] Check independence of strided accesses before forward case
>
> This patch changes the order in which we attempt to prove the independence of
> strided accesses. We previously did this after we knew the dependence distance
> was positive. With this change, we check for independence before handling the
> negative distance case. The patch prevents LAA from reporting forward
> dependences for independent strided accesses.
>
> This change was requested in the review of D19984.
>
> Added:
> llvm/trunk/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll
> Modified:
> llvm/trunk/lib/Analysis/LoopAccessAnalysis.cpp
>
> Modified: llvm/trunk/lib/Analysis/LoopAccessAnalysis.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopAccessAnalysis.cpp?rev=270072&r1=270071&r2=270072&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/LoopAccessAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/LoopAccessAnalysis.cpp Thu May 19 10:37:19 2016
> @@ -1212,8 +1212,18 @@ MemoryDepChecker::isDependent(const MemA
> auto &DL = InnermostLoop->getHeader()->getModule()->getDataLayout();
> unsigned TypeByteSize = DL.getTypeAllocSize(ATy);
>
> - // Negative distances are not plausible dependencies.
> const APInt &Val = C->getAPInt();
> + int64_t Distance = Val.getSExtValue();
> + unsigned Stride = std::abs(StrideAPtr);
> +
> + // Attempt to prove strided accesses independent.
> + if (std::abs(Distance) > 0 && Stride > 1 && ATy == BTy &&
> + areStridedAccessesIndependent(std::abs(Distance), Stride, TypeByteSize)) {
> + DEBUG(dbgs() << "LAA: Strided accesses are independent\n");
> + return Dependence::NoDep;
> + }
> +
> + // Negative distances are not plausible dependencies.
> if (Val.isNegative()) {
> bool IsTrueDataDependence = (AIsWrite && !BIsWrite);
> if (IsTrueDataDependence && EnableForwardingConflictDetection &&
> @@ -1244,15 +1254,6 @@ MemoryDepChecker::isDependent(const MemA
> return Dependence::Unknown;
> }
>
> - unsigned Distance = (unsigned) Val.getZExtValue();
> -
> - unsigned Stride = std::abs(StrideAPtr);
> - if (Stride > 1 &&
> - areStridedAccessesIndependent(Distance, Stride, TypeByteSize)) {
> - DEBUG(dbgs() << "LAA: Strided accesses are independent\n");
> - return Dependence::NoDep;
> - }
> -
> // Bail out early if passed-in parameters make vectorization not feasible.
> unsigned ForcedFactor = (VectorizerParams::VectorizationFactor ?
> VectorizerParams::VectorizationFactor : 1);
>
> Added: llvm/trunk/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll?rev=270072&view=auto
> ==============================================================================
> --- llvm/trunk/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll (added)
> +++ llvm/trunk/test/Analysis/LoopAccessAnalysis/independent-interleaved.ll Thu May 19 10:37:19 2016
> @@ -0,0 +1,45 @@
> +; RUN: opt < %s -store-to-load-forwarding-conflict-detection=false -loop-accesses -analyze | FileCheck %s
> +
> +; This test checks that we prove the strided accesses to be independent before
> +; concluding that there is a forward dependence.
> +
> +; struct pair {
> +; int x;
> +; int y;
> +; };
> +;
> +; int independent_interleaved(struct pair *p, int z, int n) {
> +; int s = 0;
> +; for (int i = 0; i < n; i++) {
> +; p[i].y = z;
> +; s += p[i].x;
> +; }
> +; return s;
> +; }
> +
> +; CHECK: for.body:
> +; CHECK-NOT: Forward:
> +; CHECK-NOT: store i32 %z, i32* %p_i.y, align 8 ->
> +; CHECK-NOT: %0 = load i32, i32* %p_i.x, align 8
> +
> +%pair = type { i32, i32 }
> +define i32 @independent_interleaved(%pair *%p, i64 %n, i32 %z) {
> +entry:
> + br label %for.body
> +
> +for.body:
> + %i = phi i64 [ %i.next, %for.body ], [ 0, %entry ]
> + %s = phi i32 [ %1, %for.body ], [ 0, %entry ]
> + %p_i.x = getelementptr inbounds %pair, %pair* %p, i64 %i, i32 0
> + %p_i.y = getelementptr inbounds %pair, %pair* %p, i64 %i, i32 1
> + store i32 %z, i32* %p_i.y, align 8
> + %0 = load i32, i32* %p_i.x, align 8
> + %1 = add nsw i32 %0, %s
> + %i.next = add nuw nsw i64 %i, 1
> + %cond = icmp slt i64 %i.next, %n
> + br i1 %cond, label %for.body, label %for.end
> +
> +for.end:
> + %2 = phi i32 [ %1, %for.body ]
> + ret i32 %2
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list