[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
Fri Oct 18 08:01:00 PDT 2019


jonpa updated this revision to Diff 225623.
jonpa added reviewers: efriedma, fhahn.
jonpa added a comment.

Use getSmallConstantMaxTripCount() instead of getSmallConstantTripCount() to catch a few more cases.

As discussed before, it seems that the call to SE->getSmallConstantTripCount(L) changes data structures which affects later passes like LSR. I wonder if this would have to stop us from committing this patch? If the call to getSmallConstantTripCount() causes SE to update itself, then LSR would actually make better decisions, or?

(On SPEC 2006, 8 files change with getSmallConstantTripCount(), and with getSmallConstantMaxTripCount() 2 more (10 in total). This is just making the call without changing anything else.)

With this patch I see 15 less prefetch instructions emitted on SPEC 2006 / SystemZ.

We could also check if LoopConstantTripCount == 1, and return if that's the case, but I'm not sure if that's useful. It might help avoid the problem encountered at https://bugs.llvm.org/show_bug.cgi?id=43679.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D68281/new/

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->getSmallConstantMaxTripCount(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.225623.patch
Type: text/x-patch
Size: 2244 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191018/be01a795/attachment.bin>


More information about the llvm-commits mailing list