summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorAdam Nemet <anemet@apple.com>2016-03-29 23:45:52 +0000
committerAdam Nemet <anemet@apple.com>2016-03-29 23:45:52 +0000
commit1428d41f9a8a9dfed10b12b756a8a78a9d38a572 (patch)
treeb0a48e16e7aad6738ea0b4c3774e4356669d369d /llvm
parent1a470b6f7cc2530db8ef28222e5b094f7fdc8825 (diff)
downloadbcm5719-llvm-1428d41f9a8a9dfed10b12b756a8a78a9d38a572.tar.gz
bcm5719-llvm-1428d41f9a8a9dfed10b12b756a8a78a9d38a572.zip
[LoopDataPrefetch] Centralize the tuning cl::opts under the pass
This is effectively NFC, minus the renaming of the options (-cyclone-prefetch-distance -> -prefetch-distance). The change was requested by Tim in D17943. llvm-svn: 264806
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp27
-rw-r--r--llvm/lib/Transforms/Scalar/LoopDataPrefetch.cpp39
-rw-r--r--llvm/test/Transforms/LoopDataPrefetch/AArch64/large-stride.ll2
3 files changed, 42 insertions, 26 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
index 2b3fae958f4..87f96f80040 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
@@ -20,24 +20,6 @@ using namespace llvm;
#define DEBUG_TYPE "aarch64tti"
-static cl::opt<unsigned> CyclonePrefetchDistance(
- "cyclone-prefetch-distance",
- cl::desc("Number of instructions to prefetch ahead for Cyclone"),
- cl::init(280), cl::Hidden);
-
-// The HW prefetcher handles accesses with strides up to 2KB.
-static cl::opt<unsigned> CycloneMinPrefetchStride(
- "cyclone-min-prefetch-stride",
- cl::desc("Min stride to add prefetches for Cyclone"),
- cl::init(2048), cl::Hidden);
-
-// Be conservative for now and don't prefetch ahead too much since the loop
-// may terminate early.
-static cl::opt<unsigned> CycloneMaxPrefetchIterationsAhead(
- "cyclone-max-prefetch-iters-ahead",
- cl::desc("Max number of iterations to prefetch ahead on Cyclone"),
- cl::init(3), cl::Hidden);
-
/// \brief Calculate the cost of materializing a 64-bit value. This helper
/// method might only calculate a fraction of a larger immediate. Therefore it
/// is valid to return a cost of ZERO.
@@ -600,18 +582,21 @@ unsigned AArch64TTIImpl::getCacheLineSize() {
unsigned AArch64TTIImpl::getPrefetchDistance() {
if (ST->isCyclone())
- return CyclonePrefetchDistance;
+ return 280;
return BaseT::getPrefetchDistance();
}
unsigned AArch64TTIImpl::getMinPrefetchStride() {
if (ST->isCyclone())
- return CycloneMinPrefetchStride;
+ // The HW prefetcher handles accesses with strides up to 2KB.
+ return 2048;
return BaseT::getMinPrefetchStride();
}
unsigned AArch64TTIImpl::getMaxPrefetchIterationsAhead() {
if (ST->isCyclone())
- return CycloneMaxPrefetchIterationsAhead;
+ // Be conservative for now and don't prefetch ahead too much since the loop
+ // may terminate early.
+ return 3;
return BaseT::getMaxPrefetchIterationsAhead();
}
diff --git a/llvm/lib/Transforms/Scalar/LoopDataPrefetch.cpp b/llvm/lib/Transforms/Scalar/LoopDataPrefetch.cpp
index 82af46e393c..d6a8f48b5f6 100644
--- a/llvm/lib/Transforms/Scalar/LoopDataPrefetch.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopDataPrefetch.cpp
@@ -43,6 +43,19 @@ static cl::opt<bool>
PrefetchWrites("loop-prefetch-writes", cl::Hidden, cl::init(false),
cl::desc("Prefetch write addresses"));
+static cl::opt<unsigned>
+ PrefetchDistance("prefetch-distance",
+ cl::desc("Number of instructions to prefetch ahead"),
+ cl::Hidden);
+
+static cl::opt<unsigned>
+ MinPrefetchStride("min-prefetch-stride",
+ cl::desc("Min stride to add prefetches"), cl::Hidden);
+
+static cl::opt<unsigned> MaxPrefetchIterationsAhead(
+ "max-prefetch-iters-ahead",
+ cl::desc("Max number of iterations to prefetch ahead"), cl::Hidden);
+
STATISTIC(NumPrefetches, "Number of prefetches inserted");
namespace llvm {
@@ -79,6 +92,24 @@ namespace {
/// warrant a prefetch.
bool isStrideLargeEnough(const SCEVAddRecExpr *AR);
+ unsigned getMinPrefetchStride() {
+ if (MinPrefetchStride.getNumOccurrences() > 0)
+ return MinPrefetchStride;
+ return TTI->getMinPrefetchStride();
+ }
+
+ unsigned getPrefetchDistance() {
+ if (PrefetchDistance.getNumOccurrences() > 0)
+ return PrefetchDistance;
+ return TTI->getPrefetchDistance();
+ }
+
+ unsigned getMaxPrefetchIterationsAhead() {
+ if (MaxPrefetchIterationsAhead.getNumOccurrences() > 0)
+ return MaxPrefetchIterationsAhead;
+ return TTI->getMaxPrefetchIterationsAhead();
+ }
+
AssumptionCache *AC;
LoopInfo *LI;
ScalarEvolution *SE;
@@ -100,7 +131,7 @@ INITIALIZE_PASS_END(LoopDataPrefetch, "loop-data-prefetch",
FunctionPass *llvm::createLoopDataPrefetchPass() { return new LoopDataPrefetch(); }
bool LoopDataPrefetch::isStrideLargeEnough(const SCEVAddRecExpr *AR) {
- unsigned TargetMinStride = TTI->getMinPrefetchStride();
+ unsigned TargetMinStride = getMinPrefetchStride();
// No need to check if any stride goes.
if (TargetMinStride <= 1)
return true;
@@ -125,7 +156,7 @@ bool LoopDataPrefetch::runOnFunction(Function &F) {
// If PrefetchDistance is not set, don't run the pass. This gives an
// opportunity for targets to run this pass for selected subtargets only
// (whose TTI sets PrefetchDistance).
- if (TTI->getPrefetchDistance() == 0)
+ if (getPrefetchDistance() == 0)
return false;
assert(TTI->getCacheLineSize() && "Cache line size is not set for target");
@@ -168,11 +199,11 @@ bool LoopDataPrefetch::runOnLoop(Loop *L) {
if (!LoopSize)
LoopSize = 1;
- unsigned ItersAhead = TTI->getPrefetchDistance() / LoopSize;
+ unsigned ItersAhead = getPrefetchDistance() / LoopSize;
if (!ItersAhead)
ItersAhead = 1;
- if (ItersAhead > TTI->getMaxPrefetchIterationsAhead())
+ if (ItersAhead > getMaxPrefetchIterationsAhead())
return MadeChange;
DEBUG(dbgs() << "Prefetching " << ItersAhead
diff --git a/llvm/test/Transforms/LoopDataPrefetch/AArch64/large-stride.ll b/llvm/test/Transforms/LoopDataPrefetch/AArch64/large-stride.ll
index 437d9415f56..d585367c563 100644
--- a/llvm/test/Transforms/LoopDataPrefetch/AArch64/large-stride.ll
+++ b/llvm/test/Transforms/LoopDataPrefetch/AArch64/large-stride.ll
@@ -1,4 +1,4 @@
-; RUN: opt -mcpu=cyclone -mtriple=arm64-apple-ios -loop-data-prefetch -cyclone-max-prefetch-iters-ahead=100 -S < %s | FileCheck %s --check-prefix=LARGE_PREFETCH --check-prefix=ALL
+; RUN: opt -mcpu=cyclone -mtriple=arm64-apple-ios -loop-data-prefetch -max-prefetch-iters-ahead=100 -S < %s | FileCheck %s --check-prefix=LARGE_PREFETCH --check-prefix=ALL
; RUN: opt -mcpu=cyclone -mtriple=arm64-apple-ios -loop-data-prefetch -S < %s | FileCheck %s --check-prefix=NO_LARGE_PREFETCH --check-prefix=ALL
; RUN: opt -mcpu=generic -mtriple=arm64-apple-ios -loop-data-prefetch -S < %s | FileCheck %s --check-prefix=NO_LARGE_PREFETCH --check-prefix=ALL
OpenPOWER on IntegriCloud