1ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===-------- PPCLoopDataPrefetch.cpp - Loop Data Prefetching Pass --------===// 2ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 3ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// The LLVM Compiler Infrastructure 4ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 5ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This file is distributed under the University of Illinois Open Source 6ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// License. See LICENSE.TXT for details. 7ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 8ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===// 9ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 10ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This file implements a Loop Data Prefetching Pass. 11ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 12ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===// 13ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 14ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#define DEBUG_TYPE "ppc-loop-data-prefetch" 15ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "PPC.h" 16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Transforms/Scalar.h" 172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include "llvm/ADT/DepthFirstIterator.h" 18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/ADT/Statistic.h" 19ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/AssumptionCache.h" 20ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/CodeMetrics.h" 21ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/InstructionSimplify.h" 22ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/LoopInfo.h" 23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/ScalarEvolution.h" 24ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/ScalarEvolutionExpander.h" 25ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/ScalarEvolutionExpressions.h" 26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/TargetTransformInfo.h" 27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/ValueTracking.h" 28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/CFG.h" 29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Dominators.h" 30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Function.h" 31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/IntrinsicInst.h" 32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Module.h" 33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/CommandLine.h" 34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/Debug.h" 35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Transforms/Utils/BasicBlockUtils.h" 36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Transforms/Utils/Local.h" 37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Transforms/Utils/ValueMapper.h" 38ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesusing namespace llvm; 39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// By default, we limit this to creating 16 PHIs (which is a little over half 41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// of the allocatable register set). 42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic cl::opt<bool> 43ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesPrefetchWrites("ppc-loop-prefetch-writes", cl::Hidden, cl::init(false), 44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::desc("Prefetch write addresses")); 45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This seems like a reasonable default for the BG/Q (this pass is enabled, by 47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// default, only on the BG/Q). 48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic cl::opt<unsigned> 49ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesPrefDist("ppc-loop-prefetch-distance", cl::Hidden, cl::init(300), 50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::desc("The loop prefetch distance")); 51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic cl::opt<unsigned> 53ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesCacheLineSize("ppc-loop-prefetch-cache-line", cl::Hidden, cl::init(64), 54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines cl::desc("The loop prefetch cache line size")); 55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesnamespace llvm { 57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void initializePPCLoopDataPrefetchPass(PassRegistry&); 58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesnamespace { 61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines class PPCLoopDataPrefetch : public FunctionPass { 63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines public: 64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines static char ID; // Pass ID, replacement for typeid 65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines PPCLoopDataPrefetch() : FunctionPass(ID) { 66ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines initializePPCLoopDataPrefetchPass(*PassRegistry::getPassRegistry()); 67ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 68ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines AU.addRequired<AssumptionCacheTracker>(); 71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines AU.addPreserved<DominatorTreeWrapperPass>(); 72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines AU.addRequired<LoopInfoWrapperPass>(); 73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines AU.addPreserved<LoopInfoWrapperPass>(); 74ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines AU.addRequired<ScalarEvolution>(); 75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // FIXME: For some reason, preserving SE here breaks LSR (even if 76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // this pass changes nothing). 77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // AU.addPreserved<ScalarEvolution>(); 78ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines AU.addRequired<TargetTransformInfoWrapperPass>(); 79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool runOnFunction(Function &F) override; 82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool runOnLoop(Loop *L); 83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 84ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines private: 85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines AssumptionCache *AC; 86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines LoopInfo *LI; 87ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ScalarEvolution *SE; 88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const TargetTransformInfo *TTI; 89ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const DataLayout *DL; 90ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines }; 91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 93ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineschar PPCLoopDataPrefetch::ID = 0; 94ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesINITIALIZE_PASS_BEGIN(PPCLoopDataPrefetch, "ppc-loop-data-prefetch", 95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines "PPC Loop Data Prefetch", false, false) 96ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesINITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) 97ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesINITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass) 98ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesINITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) 99ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesINITIALIZE_PASS_DEPENDENCY(ScalarEvolution) 100ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesINITIALIZE_PASS_END(PPCLoopDataPrefetch, "ppc-loop-data-prefetch", 101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines "PPC Loop Data Prefetch", false, false) 102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 103ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesFunctionPass *llvm::createPPCLoopDataPrefetchPass() { return new PPCLoopDataPrefetch(); } 104ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool PPCLoopDataPrefetch::runOnFunction(Function &F) { 106ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); 107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SE = &getAnalysis<ScalarEvolution>(); 1084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar DL = &F.getParent()->getDataLayout(); 109ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); 110ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines TTI = &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F); 111ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 112ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool MadeChange = false; 113ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 1142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (auto I = LI->begin(), IE = LI->end(); I != IE; ++I) 1152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar for (auto L = df_begin(*I), LE = df_end(*I); L != LE; ++L) 1162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar MadeChange |= runOnLoop(*L); 117ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 118ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return MadeChange; 119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 121ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool PPCLoopDataPrefetch::runOnLoop(Loop *L) { 122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool MadeChange = false; 123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Only prefetch in the inner-most loop 125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!L->empty()) 126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return MadeChange; 127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SmallPtrSet<const Value *, 32> EphValues; 129ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CodeMetrics::collectEphemeralValues(L, AC, EphValues); 130ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 131ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Calculate the number of iterations ahead to prefetch 132ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CodeMetrics Metrics; 133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines for (Loop::block_iterator I = L->block_begin(), IE = L->block_end(); 134ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines I != IE; ++I) { 135ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 136ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // If the loop already has prefetches, then assume that the user knows 137ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // what he or she is doing and don't add any more. 138ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines for (BasicBlock::iterator J = (*I)->begin(), JE = (*I)->end(); 139ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines J != JE; ++J) 140ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (CallInst *CI = dyn_cast<CallInst>(J)) 141ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (Function *F = CI->getCalledFunction()) 142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (F->getIntrinsicID() == Intrinsic::prefetch) 143ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return MadeChange; 144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Metrics.analyzeBasicBlock(*I, *TTI, EphValues); 146ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 147ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned LoopSize = Metrics.NumInsts; 148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!LoopSize) 149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines LoopSize = 1; 150ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 151ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned ItersAhead = PrefDist/LoopSize; 152ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!ItersAhead) 153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ItersAhead = 1; 154ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 155ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SmallVector<std::pair<Instruction *, const SCEVAddRecExpr *>, 16> PrefLoads; 156ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines for (Loop::block_iterator I = L->block_begin(), IE = L->block_end(); 157ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines I != IE; ++I) { 158ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines for (BasicBlock::iterator J = (*I)->begin(), JE = (*I)->end(); 159ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines J != JE; ++J) { 160ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Value *PtrValue; 161ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Instruction *MemI; 162ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 163ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (LoadInst *LMemI = dyn_cast<LoadInst>(J)) { 164ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines MemI = LMemI; 165ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines PtrValue = LMemI->getPointerOperand(); 166ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } else if (StoreInst *SMemI = dyn_cast<StoreInst>(J)) { 167ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!PrefetchWrites) continue; 168ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines MemI = SMemI; 169ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines PtrValue = SMemI->getPointerOperand(); 170ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } else continue; 171ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 172ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned PtrAddrSpace = PtrValue->getType()->getPointerAddressSpace(); 173ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (PtrAddrSpace) 174ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines continue; 175ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 176ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (L->isLoopInvariant(PtrValue)) 177ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines continue; 178ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 179ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const SCEV *LSCEV = SE->getSCEV(PtrValue); 180ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const SCEVAddRecExpr *LSCEVAddRec = dyn_cast<SCEVAddRecExpr>(LSCEV); 181ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!LSCEVAddRec) 182ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines continue; 183ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 184ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // We don't want to double prefetch individual cache lines. If this load 185ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // is known to be within one cache line of some other load that has 186ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // already been prefetched, then don't prefetch this one as well. 187ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool DupPref = false; 188ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines for (SmallVector<std::pair<Instruction *, const SCEVAddRecExpr *>, 189ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 16>::iterator K = PrefLoads.begin(), KE = PrefLoads.end(); 190ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines K != KE; ++K) { 191ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const SCEV *PtrDiff = SE->getMinusSCEV(LSCEVAddRec, K->second); 192ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (const SCEVConstant *ConstPtrDiff = 193ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines dyn_cast<SCEVConstant>(PtrDiff)) { 1944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar int64_t PD = std::abs(ConstPtrDiff->getValue()->getSExtValue()); 195ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (PD < (int64_t) CacheLineSize) { 196ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DupPref = true; 197ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines break; 198ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 199ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 200ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 201ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (DupPref) 202ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines continue; 203ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 204ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const SCEV *NextLSCEV = SE->getAddExpr(LSCEVAddRec, SE->getMulExpr( 205ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SE->getConstant(LSCEVAddRec->getType(), ItersAhead), 206ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines LSCEVAddRec->getStepRecurrence(*SE))); 207ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!isSafeToExpand(NextLSCEV, *SE)) 208ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines continue; 209ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 210ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines PrefLoads.push_back(std::make_pair(MemI, LSCEVAddRec)); 211ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 212ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Type *I8Ptr = Type::getInt8PtrTy((*I)->getContext(), PtrAddrSpace); 2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SCEVExpander SCEVE(*SE, J->getModule()->getDataLayout(), "prefaddr"); 214ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Value *PrefPtrValue = SCEVE.expandCodeFor(NextLSCEV, I8Ptr, MemI); 215ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 216ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines IRBuilder<> Builder(MemI); 217ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Module *M = (*I)->getParent()->getParent(); 218ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Type *I32 = Type::getInt32Ty((*I)->getContext()); 219ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Value *PrefetchFunc = Intrinsic::getDeclaration(M, Intrinsic::prefetch); 220ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Builder.CreateCall4(PrefetchFunc, PrefPtrValue, 221ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ConstantInt::get(I32, MemI->mayReadFromMemory() ? 0 : 1), 222ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ConstantInt::get(I32, 3), ConstantInt::get(I32, 1)); 223ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 224ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines MadeChange = true; 225ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 226ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 227ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 228ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return MadeChange; 229ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 230ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 231