[PATCH] D68281: [LoopDataPrefetch] Don't prefetch past a known total trip count
Jonas Paulsson via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 1 09:39:14 PDT 2019
jonpa created this revision.
jonpa added reviewers: uweigand, hfinkel, anemet, jfb.
Herald added a subscriber: dexonsmith.
Compare iterations ahead against a constant trip count and do not emit any prefetches in case it seems that they address memory not accessed in the loop.
https://reviews.llvm.org/D68281
Files:
lib/Transforms/Scalar/LoopDataPrefetch.cpp
test/CodeGen/SystemZ/prefetch-02.ll
Index: test/CodeGen/SystemZ/prefetch-02.ll
===================================================================
--- /dev/null
+++ test/CodeGen/SystemZ/prefetch-02.ll
@@ -0,0 +1,33 @@
+; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -prefetch-distance=100 \
+; RUN: -stop-after=loop-data-prefetch | FileCheck %s -check-prefix=FAR-PREFETCH
+; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -prefetch-distance=50 \
+; RUN: -stop-after=loop-data-prefetch | FileCheck %s -check-prefix=NEAR-PREFETCH
+;
+; Check that prefetches are not emitted when the known constant trip count of
+; the loop is smaller than the estimated "iterations ahead" of the prefetch.
+;
+; FAR-PREFETCH-LABEL: fun
+; FAR-PREFETCH-NOT: call void @llvm.prefetch
+
+; NEAR-PREFETCH-LABEL: fun
+; NEAR-PREFETCH: call void @llvm.prefetch
+
+
+define void @fun(i32* nocapture %Src, i32* nocapture readonly %Dst) {
+entry:
+ br label %for.body
+
+for.cond.cleanup: ; preds = %for.body
+ ret void
+
+for.body: ; preds = %for.body, %entry
+ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.9, %for.body ]
+ %arrayidx = getelementptr inbounds i32, i32* %Dst, i64 %indvars.iv
+ %0 = load i32, i32* %arrayidx, align 4
+ %arrayidx2 = getelementptr inbounds i32, i32* %Src, i64 %indvars.iv
+ store i32 %0, i32* %arrayidx2, align 4
+ %indvars.iv.next.9 = add nuw nsw i64 %indvars.iv, 1600
+ %cmp.9 = icmp ult i64 %indvars.iv.next.9, 11200
+ br i1 %cmp.9, label %for.body, label %for.cond.cleanup
+}
+
Index: lib/Transforms/Scalar/LoopDataPrefetch.cpp
===================================================================
--- lib/Transforms/Scalar/LoopDataPrefetch.cpp
+++ lib/Transforms/Scalar/LoopDataPrefetch.cpp
@@ -243,6 +243,10 @@
if (ItersAhead > getMaxPrefetchIterationsAhead())
return MadeChange;
+ unsigned LoopConstantTripCount = SE->getSmallConstantTripCount(L);
+ if (LoopConstantTripCount && LoopConstantTripCount < ItersAhead)
+ return MadeChange;
+
LLVM_DEBUG(dbgs() << "Prefetching " << ItersAhead
<< " iterations ahead (loop size: " << LoopSize << ") in "
<< L->getHeader()->getParent()->getName() << ": " << *L);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68281.222640.patch
Type: text/x-patch
Size: 2241 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191001/5f67dca6/attachment.bin>
More information about the llvm-commits
mailing list