3196 lines · cpp
1//===- LoopAccessAnalysis.cpp - Loop Access Analysis Implementation --------==//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// The implementation for the loop memory dependence that was originally10// developed for the loop vectorizer.11//12//===----------------------------------------------------------------------===//13 14#include "llvm/Analysis/LoopAccessAnalysis.h"15#include "llvm/ADT/APInt.h"16#include "llvm/ADT/DenseMap.h"17#include "llvm/ADT/EquivalenceClasses.h"18#include "llvm/ADT/PointerIntPair.h"19#include "llvm/ADT/STLExtras.h"20#include "llvm/ADT/SetVector.h"21#include "llvm/ADT/SmallPtrSet.h"22#include "llvm/ADT/SmallSet.h"23#include "llvm/ADT/SmallVector.h"24#include "llvm/Analysis/AliasAnalysis.h"25#include "llvm/Analysis/AliasSetTracker.h"26#include "llvm/Analysis/AssumeBundleQueries.h"27#include "llvm/Analysis/AssumptionCache.h"28#include "llvm/Analysis/LoopAnalysisManager.h"29#include "llvm/Analysis/LoopInfo.h"30#include "llvm/Analysis/LoopIterator.h"31#include "llvm/Analysis/MemoryLocation.h"32#include "llvm/Analysis/OptimizationRemarkEmitter.h"33#include "llvm/Analysis/ScalarEvolution.h"34#include "llvm/Analysis/ScalarEvolutionExpressions.h"35#include "llvm/Analysis/ScalarEvolutionPatternMatch.h"36#include "llvm/Analysis/TargetLibraryInfo.h"37#include "llvm/Analysis/TargetTransformInfo.h"38#include "llvm/Analysis/ValueTracking.h"39#include "llvm/Analysis/VectorUtils.h"40#include "llvm/IR/BasicBlock.h"41#include "llvm/IR/Constants.h"42#include "llvm/IR/DataLayout.h"43#include "llvm/IR/DebugLoc.h"44#include "llvm/IR/DerivedTypes.h"45#include "llvm/IR/DiagnosticInfo.h"46#include "llvm/IR/Dominators.h"47#include "llvm/IR/Function.h"48#include "llvm/IR/InstrTypes.h"49#include "llvm/IR/Instruction.h"50#include "llvm/IR/Instructions.h"51#include "llvm/IR/IntrinsicInst.h"52#include "llvm/IR/PassManager.h"53#include "llvm/IR/Type.h"54#include "llvm/IR/Value.h"55#include "llvm/IR/ValueHandle.h"56#include "llvm/Support/Casting.h"57#include "llvm/Support/CommandLine.h"58#include "llvm/Support/Debug.h"59#include "llvm/Support/ErrorHandling.h"60#include "llvm/Support/raw_ostream.h"61#include <algorithm>62#include <cassert>63#include <cstdint>64#include <iterator>65#include <utility>66#include <variant>67#include <vector>68 69using namespace llvm;70using namespace llvm::SCEVPatternMatch;71 72#define DEBUG_TYPE "loop-accesses"73 74static cl::opt<unsigned, true>75VectorizationFactor("force-vector-width", cl::Hidden,76 cl::desc("Sets the SIMD width. Zero is autoselect."),77 cl::location(VectorizerParams::VectorizationFactor));78unsigned VectorizerParams::VectorizationFactor;79 80static cl::opt<unsigned, true>81VectorizationInterleave("force-vector-interleave", cl::Hidden,82 cl::desc("Sets the vectorization interleave count. "83 "Zero is autoselect."),84 cl::location(85 VectorizerParams::VectorizationInterleave));86unsigned VectorizerParams::VectorizationInterleave;87 88static cl::opt<unsigned, true> RuntimeMemoryCheckThreshold(89 "runtime-memory-check-threshold", cl::Hidden,90 cl::desc("When performing memory disambiguation checks at runtime do not "91 "generate more than this number of comparisons (default = 8)."),92 cl::location(VectorizerParams::RuntimeMemoryCheckThreshold), cl::init(8));93unsigned VectorizerParams::RuntimeMemoryCheckThreshold;94 95/// The maximum iterations used to merge memory checks96static cl::opt<unsigned> MemoryCheckMergeThreshold(97 "memory-check-merge-threshold", cl::Hidden,98 cl::desc("Maximum number of comparisons done when trying to merge "99 "runtime memory checks. (default = 100)"),100 cl::init(100));101 102/// Maximum SIMD width.103const unsigned VectorizerParams::MaxVectorWidth = 64;104 105/// We collect dependences up to this threshold.106static cl::opt<unsigned>107 MaxDependences("max-dependences", cl::Hidden,108 cl::desc("Maximum number of dependences collected by "109 "loop-access analysis (default = 100)"),110 cl::init(100));111 112/// This enables versioning on the strides of symbolically striding memory113/// accesses in code like the following.114/// for (i = 0; i < N; ++i)115/// A[i * Stride1] += B[i * Stride2] ...116///117/// Will be roughly translated to118/// if (Stride1 == 1 && Stride2 == 1) {119/// for (i = 0; i < N; i+=4)120/// A[i:i+3] += ...121/// } else122/// ...123static cl::opt<bool> EnableMemAccessVersioning(124 "enable-mem-access-versioning", cl::init(true), cl::Hidden,125 cl::desc("Enable symbolic stride memory access versioning"));126 127/// Enable store-to-load forwarding conflict detection. This option can128/// be disabled for correctness testing.129static cl::opt<bool> EnableForwardingConflictDetection(130 "store-to-load-forwarding-conflict-detection", cl::Hidden,131 cl::desc("Enable conflict detection in loop-access analysis"),132 cl::init(true));133 134static cl::opt<unsigned> MaxForkedSCEVDepth(135 "max-forked-scev-depth", cl::Hidden,136 cl::desc("Maximum recursion depth when finding forked SCEVs (default = 5)"),137 cl::init(5));138 139static cl::opt<bool> SpeculateUnitStride(140 "laa-speculate-unit-stride", cl::Hidden,141 cl::desc("Speculate that non-constant strides are unit in LAA"),142 cl::init(true));143 144static cl::opt<bool, true> HoistRuntimeChecks(145 "hoist-runtime-checks", cl::Hidden,146 cl::desc(147 "Hoist inner loop runtime memory checks to outer loop if possible"),148 cl::location(VectorizerParams::HoistRuntimeChecks), cl::init(true));149bool VectorizerParams::HoistRuntimeChecks;150 151bool VectorizerParams::isInterleaveForced() {152 return ::VectorizationInterleave.getNumOccurrences() > 0;153}154 155const SCEV *llvm::replaceSymbolicStrideSCEV(PredicatedScalarEvolution &PSE,156 const DenseMap<Value *, const SCEV *> &PtrToStride,157 Value *Ptr) {158 const SCEV *OrigSCEV = PSE.getSCEV(Ptr);159 160 // If there is an entry in the map return the SCEV of the pointer with the161 // symbolic stride replaced by one.162 const SCEV *StrideSCEV = PtrToStride.lookup(Ptr);163 if (!StrideSCEV)164 // For a non-symbolic stride, just return the original expression.165 return OrigSCEV;166 167 // Note: This assert is both overly strong and overly weak. The actual168 // invariant here is that StrideSCEV should be loop invariant. The only169 // such invariant strides we happen to speculate right now are unknowns170 // and thus this is a reasonable proxy of the actual invariant.171 assert(isa<SCEVUnknown>(StrideSCEV) && "shouldn't be in map");172 173 ScalarEvolution *SE = PSE.getSE();174 const SCEV *CT = SE->getOne(StrideSCEV->getType());175 PSE.addPredicate(*SE->getEqualPredicate(StrideSCEV, CT));176 const SCEV *Expr = PSE.getSCEV(Ptr);177 178 LLVM_DEBUG(dbgs() << "LAA: Replacing SCEV: " << *OrigSCEV179 << " by: " << *Expr << "\n");180 return Expr;181}182 183RuntimeCheckingPtrGroup::RuntimeCheckingPtrGroup(184 unsigned Index, const RuntimePointerChecking &RtCheck)185 : High(RtCheck.Pointers[Index].End), Low(RtCheck.Pointers[Index].Start),186 AddressSpace(RtCheck.Pointers[Index]187 .PointerValue->getType()188 ->getPointerAddressSpace()),189 NeedsFreeze(RtCheck.Pointers[Index].NeedsFreeze) {190 Members.push_back(Index);191}192 193/// Returns \p A + \p B, if it is guaranteed not to unsigned wrap. Otherwise194/// return nullptr. \p A and \p B must have the same type.195static const SCEV *addSCEVNoOverflow(const SCEV *A, const SCEV *B,196 ScalarEvolution &SE) {197 if (!SE.willNotOverflow(Instruction::Add, /*IsSigned=*/false, A, B))198 return nullptr;199 return SE.getAddExpr(A, B);200}201 202/// Returns \p A * \p B, if it is guaranteed not to unsigned wrap. Otherwise203/// return nullptr. \p A and \p B must have the same type.204static const SCEV *mulSCEVOverflow(const SCEV *A, const SCEV *B,205 ScalarEvolution &SE) {206 if (!SE.willNotOverflow(Instruction::Mul, /*IsSigned=*/false, A, B))207 return nullptr;208 return SE.getMulExpr(A, B);209}210 211/// Return true, if evaluating \p AR at \p MaxBTC cannot wrap, because \p AR at212/// \p MaxBTC is guaranteed inbounds of the accessed object.213static bool evaluatePtrAddRecAtMaxBTCWillNotWrap(214 const SCEVAddRecExpr *AR, const SCEV *MaxBTC, const SCEV *EltSize,215 ScalarEvolution &SE, const DataLayout &DL, DominatorTree *DT,216 AssumptionCache *AC,217 std::optional<ScalarEvolution::LoopGuards> &LoopGuards) {218 auto *PointerBase = SE.getPointerBase(AR->getStart());219 auto *StartPtr = dyn_cast<SCEVUnknown>(PointerBase);220 if (!StartPtr)221 return false;222 const Loop *L = AR->getLoop();223 bool CheckForNonNull, CheckForFreed;224 Value *StartPtrV = StartPtr->getValue();225 uint64_t DerefBytes = StartPtrV->getPointerDereferenceableBytes(226 DL, CheckForNonNull, CheckForFreed);227 228 if (DerefBytes && (CheckForNonNull || CheckForFreed))229 return false;230 231 const SCEV *Step = AR->getStepRecurrence(SE);232 Type *WiderTy = SE.getWiderType(MaxBTC->getType(), Step->getType());233 const SCEV *DerefBytesSCEV = SE.getConstant(WiderTy, DerefBytes);234 235 // Check if we have a suitable dereferencable assumption we can use.236 Instruction *CtxI = &*L->getHeader()->getFirstNonPHIIt();237 if (BasicBlock *LoopPred = L->getLoopPredecessor()) {238 if (isa<BranchInst>(LoopPred->getTerminator()))239 CtxI = LoopPred->getTerminator();240 }241 RetainedKnowledge DerefRK;242 getKnowledgeForValue(StartPtrV, {Attribute::Dereferenceable}, *AC,243 [&](RetainedKnowledge RK, Instruction *Assume, auto) {244 if (!isValidAssumeForContext(Assume, CtxI, DT))245 return false;246 if (StartPtrV->canBeFreed() &&247 !willNotFreeBetween(Assume, CtxI))248 return false;249 DerefRK = std::max(DerefRK, RK);250 return true;251 });252 if (DerefRK) {253 DerefBytesSCEV =254 SE.getUMaxExpr(DerefBytesSCEV, SE.getSCEV(DerefRK.IRArgValue));255 }256 257 if (DerefBytesSCEV->isZero())258 return false;259 260 bool IsKnownNonNegative = SE.isKnownNonNegative(Step);261 if (!IsKnownNonNegative && !SE.isKnownNegative(Step))262 return false;263 264 Step = SE.getNoopOrSignExtend(Step, WiderTy);265 MaxBTC = SE.getNoopOrZeroExtend(MaxBTC, WiderTy);266 267 // For the computations below, make sure they don't unsigned wrap.268 if (!SE.isKnownPredicate(CmpInst::ICMP_UGE, AR->getStart(), StartPtr))269 return false;270 const SCEV *StartOffset = SE.getNoopOrZeroExtend(271 SE.getMinusSCEV(AR->getStart(), StartPtr), WiderTy);272 273 if (!LoopGuards)274 LoopGuards.emplace(ScalarEvolution::LoopGuards::collect(AR->getLoop(), SE));275 MaxBTC = SE.applyLoopGuards(MaxBTC, *LoopGuards);276 277 const SCEV *OffsetAtLastIter =278 mulSCEVOverflow(MaxBTC, SE.getAbsExpr(Step, /*IsNSW=*/false), SE);279 if (!OffsetAtLastIter) {280 // Re-try with constant max backedge-taken count if using the symbolic one281 // failed.282 MaxBTC = SE.getConstantMaxBackedgeTakenCount(AR->getLoop());283 if (isa<SCEVCouldNotCompute>(MaxBTC))284 return false;285 MaxBTC = SE.getNoopOrZeroExtend(286 MaxBTC, WiderTy);287 OffsetAtLastIter =288 mulSCEVOverflow(MaxBTC, SE.getAbsExpr(Step, /*IsNSW=*/false), SE);289 if (!OffsetAtLastIter)290 return false;291 }292 293 const SCEV *OffsetEndBytes = addSCEVNoOverflow(294 OffsetAtLastIter, SE.getNoopOrZeroExtend(EltSize, WiderTy), SE);295 if (!OffsetEndBytes)296 return false;297 298 if (IsKnownNonNegative) {299 // For positive steps, check if300 // (AR->getStart() - StartPtr) + (MaxBTC * Step) + EltSize <= DerefBytes,301 // while making sure none of the computations unsigned wrap themselves.302 const SCEV *EndBytes = addSCEVNoOverflow(StartOffset, OffsetEndBytes, SE);303 if (!EndBytes)304 return false;305 306 DerefBytesSCEV = SE.applyLoopGuards(DerefBytesSCEV, *LoopGuards);307 return SE.isKnownPredicate(CmpInst::ICMP_ULE, EndBytes, DerefBytesSCEV);308 }309 310 // For negative steps check if311 // * StartOffset >= (MaxBTC * Step + EltSize)312 // * StartOffset <= DerefBytes.313 assert(SE.isKnownNegative(Step) && "must be known negative");314 return SE.isKnownPredicate(CmpInst::ICMP_SGE, StartOffset, OffsetEndBytes) &&315 SE.isKnownPredicate(CmpInst::ICMP_ULE, StartOffset, DerefBytesSCEV);316}317 318std::pair<const SCEV *, const SCEV *> llvm::getStartAndEndForAccess(319 const Loop *Lp, const SCEV *PtrExpr, Type *AccessTy, const SCEV *BTC,320 const SCEV *MaxBTC, ScalarEvolution *SE,321 DenseMap<std::pair<const SCEV *, Type *>,322 std::pair<const SCEV *, const SCEV *>> *PointerBounds,323 DominatorTree *DT, AssumptionCache *AC,324 std::optional<ScalarEvolution::LoopGuards> &LoopGuards) {325 std::pair<const SCEV *, const SCEV *> *PtrBoundsPair;326 if (PointerBounds) {327 auto [Iter, Ins] = PointerBounds->insert(328 {{PtrExpr, AccessTy},329 {SE->getCouldNotCompute(), SE->getCouldNotCompute()}});330 if (!Ins)331 return Iter->second;332 PtrBoundsPair = &Iter->second;333 }334 335 const SCEV *ScStart;336 const SCEV *ScEnd;337 338 auto &DL = Lp->getHeader()->getDataLayout();339 Type *IdxTy = DL.getIndexType(PtrExpr->getType());340 const SCEV *EltSizeSCEV = SE->getStoreSizeOfExpr(IdxTy, AccessTy);341 if (SE->isLoopInvariant(PtrExpr, Lp)) {342 ScStart = ScEnd = PtrExpr;343 } else if (auto *AR = dyn_cast<SCEVAddRecExpr>(PtrExpr)) {344 ScStart = AR->getStart();345 if (!isa<SCEVCouldNotCompute>(BTC))346 // Evaluating AR at an exact BTC is safe: LAA separately checks that347 // accesses cannot wrap in the loop. If evaluating AR at BTC wraps, then348 // the loop either triggers UB when executing a memory access with a349 // poison pointer or the wrapping/poisoned pointer is not used.350 ScEnd = AR->evaluateAtIteration(BTC, *SE);351 else {352 // Evaluating AR at MaxBTC may wrap and create an expression that is less353 // than the start of the AddRec due to wrapping (for example consider354 // MaxBTC = -2). If that's the case, set ScEnd to -(EltSize + 1). ScEnd355 // will get incremented by EltSize before returning, so this effectively356 // sets ScEnd to the maximum unsigned value for the type. Note that LAA357 // separately checks that accesses cannot not wrap, so unsigned max358 // represents an upper bound.359 if (evaluatePtrAddRecAtMaxBTCWillNotWrap(AR, MaxBTC, EltSizeSCEV, *SE, DL,360 DT, AC, LoopGuards)) {361 ScEnd = AR->evaluateAtIteration(MaxBTC, *SE);362 } else {363 ScEnd = SE->getAddExpr(364 SE->getNegativeSCEV(EltSizeSCEV),365 SE->getSCEV(ConstantExpr::getIntToPtr(366 ConstantInt::get(EltSizeSCEV->getType(), -1), AR->getType())));367 }368 }369 const SCEV *Step = AR->getStepRecurrence(*SE);370 371 // For expressions with negative step, the upper bound is ScStart and the372 // lower bound is ScEnd.373 if (const auto *CStep = dyn_cast<SCEVConstant>(Step)) {374 if (CStep->getValue()->isNegative())375 std::swap(ScStart, ScEnd);376 } else {377 // Fallback case: the step is not constant, but we can still378 // get the upper and lower bounds of the interval by using min/max379 // expressions.380 ScStart = SE->getUMinExpr(ScStart, ScEnd);381 ScEnd = SE->getUMaxExpr(AR->getStart(), ScEnd);382 }383 } else384 return {SE->getCouldNotCompute(), SE->getCouldNotCompute()};385 386 assert(SE->isLoopInvariant(ScStart, Lp) && "ScStart needs to be invariant");387 assert(SE->isLoopInvariant(ScEnd, Lp) && "ScEnd needs to be invariant");388 389 // Add the size of the pointed element to ScEnd.390 ScEnd = SE->getAddExpr(ScEnd, EltSizeSCEV);391 392 std::pair<const SCEV *, const SCEV *> Res = {ScStart, ScEnd};393 if (PointerBounds)394 *PtrBoundsPair = Res;395 return Res;396}397 398/// Calculate Start and End points of memory access using399/// getStartAndEndForAccess.400void RuntimePointerChecking::insert(Loop *Lp, Value *Ptr, const SCEV *PtrExpr,401 Type *AccessTy, bool WritePtr,402 unsigned DepSetId, unsigned ASId,403 PredicatedScalarEvolution &PSE,404 bool NeedsFreeze) {405 const SCEV *SymbolicMaxBTC = PSE.getSymbolicMaxBackedgeTakenCount();406 const SCEV *BTC = PSE.getBackedgeTakenCount();407 const auto &[ScStart, ScEnd] = getStartAndEndForAccess(408 Lp, PtrExpr, AccessTy, BTC, SymbolicMaxBTC, PSE.getSE(),409 &DC.getPointerBounds(), DC.getDT(), DC.getAC(), LoopGuards);410 assert(!isa<SCEVCouldNotCompute>(ScStart) &&411 !isa<SCEVCouldNotCompute>(ScEnd) &&412 "must be able to compute both start and end expressions");413 Pointers.emplace_back(Ptr, ScStart, ScEnd, WritePtr, DepSetId, ASId, PtrExpr,414 NeedsFreeze);415}416 417bool RuntimePointerChecking::tryToCreateDiffCheck(418 const RuntimeCheckingPtrGroup &CGI, const RuntimeCheckingPtrGroup &CGJ) {419 // If either group contains multiple different pointers, bail out.420 // TODO: Support multiple pointers by using the minimum or maximum pointer,421 // depending on src & sink.422 if (CGI.Members.size() != 1 || CGJ.Members.size() != 1)423 return false;424 425 const PointerInfo *Src = &Pointers[CGI.Members[0]];426 const PointerInfo *Sink = &Pointers[CGJ.Members[0]];427 428 // If either pointer is read and written, multiple checks may be needed. Bail429 // out.430 if (!DC.getOrderForAccess(Src->PointerValue, !Src->IsWritePtr).empty() ||431 !DC.getOrderForAccess(Sink->PointerValue, !Sink->IsWritePtr).empty())432 return false;433 434 ArrayRef<unsigned> AccSrc =435 DC.getOrderForAccess(Src->PointerValue, Src->IsWritePtr);436 ArrayRef<unsigned> AccSink =437 DC.getOrderForAccess(Sink->PointerValue, Sink->IsWritePtr);438 // If either pointer is accessed multiple times, there may not be a clear439 // src/sink relation. Bail out for now.440 if (AccSrc.size() != 1 || AccSink.size() != 1)441 return false;442 443 // If the sink is accessed before src, swap src/sink.444 if (AccSink[0] < AccSrc[0])445 std::swap(Src, Sink);446 447 const SCEVConstant *Step;448 const SCEV *SrcStart;449 const SCEV *SinkStart;450 const Loop *InnerLoop = DC.getInnermostLoop();451 if (!match(Src->Expr,452 m_scev_AffineAddRec(m_SCEV(SrcStart), m_SCEVConstant(Step),453 m_SpecificLoop(InnerLoop))) ||454 !match(Sink->Expr,455 m_scev_AffineAddRec(m_SCEV(SinkStart), m_scev_Specific(Step),456 m_SpecificLoop(InnerLoop))))457 return false;458 459 SmallVector<Instruction *, 4> SrcInsts =460 DC.getInstructionsForAccess(Src->PointerValue, Src->IsWritePtr);461 SmallVector<Instruction *, 4> SinkInsts =462 DC.getInstructionsForAccess(Sink->PointerValue, Sink->IsWritePtr);463 Type *SrcTy = getLoadStoreType(SrcInsts[0]);464 Type *DstTy = getLoadStoreType(SinkInsts[0]);465 if (isa<ScalableVectorType>(SrcTy) || isa<ScalableVectorType>(DstTy))466 return false;467 468 const DataLayout &DL = InnerLoop->getHeader()->getDataLayout();469 unsigned AllocSize =470 std::max(DL.getTypeAllocSize(SrcTy), DL.getTypeAllocSize(DstTy));471 472 // Only matching constant steps matching the AllocSize are supported at the473 // moment. This simplifies the difference computation. Can be extended in the474 // future.475 if (Step->getAPInt().abs() != AllocSize)476 return false;477 478 IntegerType *IntTy =479 IntegerType::get(Src->PointerValue->getContext(),480 DL.getPointerSizeInBits(CGI.AddressSpace));481 482 // When counting down, the dependence distance needs to be swapped.483 if (Step->getValue()->isNegative())484 std::swap(SinkStart, SrcStart);485 486 const SCEV *SinkStartInt = SE->getPtrToIntExpr(SinkStart, IntTy);487 const SCEV *SrcStartInt = SE->getPtrToIntExpr(SrcStart, IntTy);488 if (isa<SCEVCouldNotCompute>(SinkStartInt) ||489 isa<SCEVCouldNotCompute>(SrcStartInt))490 return false;491 492 // If the start values for both Src and Sink also vary according to an outer493 // loop, then it's probably better to avoid creating diff checks because494 // they may not be hoisted. We should instead let llvm::addRuntimeChecks495 // do the expanded full range overlap checks, which can be hoisted.496 if (HoistRuntimeChecks && InnerLoop->getParentLoop() &&497 isa<SCEVAddRecExpr>(SinkStartInt) && isa<SCEVAddRecExpr>(SrcStartInt)) {498 auto *SrcStartAR = cast<SCEVAddRecExpr>(SrcStartInt);499 auto *SinkStartAR = cast<SCEVAddRecExpr>(SinkStartInt);500 const Loop *StartARLoop = SrcStartAR->getLoop();501 if (StartARLoop == SinkStartAR->getLoop() &&502 StartARLoop == InnerLoop->getParentLoop() &&503 // If the diff check would already be loop invariant (due to the504 // recurrences being the same), then we prefer to keep the diff checks505 // because they are cheaper.506 SrcStartAR->getStepRecurrence(*SE) !=507 SinkStartAR->getStepRecurrence(*SE)) {508 LLVM_DEBUG(dbgs() << "LAA: Not creating diff runtime check, since these "509 "cannot be hoisted out of the outer loop\n");510 return false;511 }512 }513 514 LLVM_DEBUG(dbgs() << "LAA: Creating diff runtime check for:\n"515 << "SrcStart: " << *SrcStartInt << '\n'516 << "SinkStartInt: " << *SinkStartInt << '\n');517 DiffChecks.emplace_back(SrcStartInt, SinkStartInt, AllocSize,518 Src->NeedsFreeze || Sink->NeedsFreeze);519 return true;520}521 522SmallVector<RuntimePointerCheck, 4> RuntimePointerChecking::generateChecks() {523 SmallVector<RuntimePointerCheck, 4> Checks;524 525 for (unsigned I = 0; I < CheckingGroups.size(); ++I) {526 for (unsigned J = I + 1; J < CheckingGroups.size(); ++J) {527 const RuntimeCheckingPtrGroup &CGI = CheckingGroups[I];528 const RuntimeCheckingPtrGroup &CGJ = CheckingGroups[J];529 530 if (needsChecking(CGI, CGJ)) {531 CanUseDiffCheck = CanUseDiffCheck && tryToCreateDiffCheck(CGI, CGJ);532 Checks.emplace_back(&CGI, &CGJ);533 }534 }535 }536 return Checks;537}538 539void RuntimePointerChecking::generateChecks(540 MemoryDepChecker::DepCandidates &DepCands, bool UseDependencies) {541 assert(Checks.empty() && "Checks is not empty");542 groupChecks(DepCands, UseDependencies);543 Checks = generateChecks();544}545 546bool RuntimePointerChecking::needsChecking(547 const RuntimeCheckingPtrGroup &M, const RuntimeCheckingPtrGroup &N) const {548 for (const auto &I : M.Members)549 for (const auto &J : N.Members)550 if (needsChecking(I, J))551 return true;552 return false;553}554 555/// Compare \p I and \p J and return the minimum.556/// Return nullptr in case we couldn't find an answer.557static const SCEV *getMinFromExprs(const SCEV *I, const SCEV *J,558 ScalarEvolution *SE) {559 std::optional<APInt> Diff = SE->computeConstantDifference(J, I);560 if (!Diff)561 return nullptr;562 return Diff->isNegative() ? J : I;563}564 565bool RuntimeCheckingPtrGroup::addPointer(566 unsigned Index, const RuntimePointerChecking &RtCheck) {567 return addPointer(568 Index, RtCheck.Pointers[Index].Start, RtCheck.Pointers[Index].End,569 RtCheck.Pointers[Index].PointerValue->getType()->getPointerAddressSpace(),570 RtCheck.Pointers[Index].NeedsFreeze, *RtCheck.SE);571}572 573bool RuntimeCheckingPtrGroup::addPointer(unsigned Index, const SCEV *Start,574 const SCEV *End, unsigned AS,575 bool NeedsFreeze,576 ScalarEvolution &SE) {577 assert(AddressSpace == AS &&578 "all pointers in a checking group must be in the same address space");579 580 // Compare the starts and ends with the known minimum and maximum581 // of this set. We need to know how we compare against the min/max582 // of the set in order to be able to emit memchecks.583 const SCEV *Min0 = getMinFromExprs(Start, Low, &SE);584 if (!Min0)585 return false;586 587 const SCEV *Min1 = getMinFromExprs(End, High, &SE);588 if (!Min1)589 return false;590 591 // Update the low bound expression if we've found a new min value.592 if (Min0 == Start)593 Low = Start;594 595 // Update the high bound expression if we've found a new max value.596 if (Min1 != End)597 High = End;598 599 Members.push_back(Index);600 this->NeedsFreeze |= NeedsFreeze;601 return true;602}603 604void RuntimePointerChecking::groupChecks(605 MemoryDepChecker::DepCandidates &DepCands, bool UseDependencies) {606 // We build the groups from dependency candidates equivalence classes607 // because:608 // - We know that pointers in the same equivalence class share609 // the same underlying object and therefore there is a chance610 // that we can compare pointers611 // - We wouldn't be able to merge two pointers for which we need612 // to emit a memcheck. The classes in DepCands are already613 // conveniently built such that no two pointers in the same614 // class need checking against each other.615 616 // We use the following (greedy) algorithm to construct the groups617 // For every pointer in the equivalence class:618 // For each existing group:619 // - if the difference between this pointer and the min/max bounds620 // of the group is a constant, then make the pointer part of the621 // group and update the min/max bounds of that group as required.622 623 CheckingGroups.clear();624 625 // If we need to check two pointers to the same underlying object626 // with a non-constant difference, we shouldn't perform any pointer627 // grouping with those pointers. This is because we can easily get628 // into cases where the resulting check would return false, even when629 // the accesses are safe.630 //631 // The following example shows this:632 // for (i = 0; i < 1000; ++i)633 // a[5000 + i * m] = a[i] + a[i + 9000]634 //635 // Here grouping gives a check of (5000, 5000 + 1000 * m) against636 // (0, 10000) which is always false. However, if m is 1, there is no637 // dependence. Not grouping the checks for a[i] and a[i + 9000] allows638 // us to perform an accurate check in this case.639 //640 // In the above case, we have a non-constant distance and an Unknown641 // dependence between accesses to the same underlying object, and could retry642 // with runtime checks. Therefore UseDependencies is false. In this case we643 // will use the fallback path and create separate checking groups for all644 // pointers.645 646 // If we don't have the dependency partitions, construct a new647 // checking pointer group for each pointer. This is also required648 // for correctness, because in this case we can have checking between649 // pointers to the same underlying object.650 if (!UseDependencies) {651 for (unsigned I = 0; I < Pointers.size(); ++I)652 CheckingGroups.emplace_back(I, *this);653 return;654 }655 656 unsigned TotalComparisons = 0;657 658 DenseMap<Value *, SmallVector<unsigned>> PositionMap;659 for (unsigned Index = 0; Index < Pointers.size(); ++Index)660 PositionMap[Pointers[Index].PointerValue].push_back(Index);661 662 // We need to keep track of what pointers we've already seen so we663 // don't process them twice.664 SmallSet<unsigned, 2> Seen;665 666 // Go through all equivalence classes, get the "pointer check groups"667 // and add them to the overall solution. We use the order in which accesses668 // appear in 'Pointers' to enforce determinism.669 for (unsigned I = 0; I < Pointers.size(); ++I) {670 // We've seen this pointer before, and therefore already processed671 // its equivalence class.672 if (Seen.contains(I))673 continue;674 675 MemoryDepChecker::MemAccessInfo Access(Pointers[I].PointerValue,676 Pointers[I].IsWritePtr);677 678 SmallVector<RuntimeCheckingPtrGroup, 2> Groups;679 680 // Because DepCands is constructed by visiting accesses in the order in681 // which they appear in alias sets (which is deterministic) and the682 // iteration order within an equivalence class member is only dependent on683 // the order in which unions and insertions are performed on the684 // equivalence class, the iteration order is deterministic.685 for (auto M : DepCands.members(Access)) {686 auto PointerI = PositionMap.find(M.getPointer());687 // If we can't find the pointer in PositionMap that means we can't688 // generate a memcheck for it.689 if (PointerI == PositionMap.end())690 continue;691 for (unsigned Pointer : PointerI->second) {692 bool Merged = false;693 // Mark this pointer as seen.694 Seen.insert(Pointer);695 696 // Go through all the existing sets and see if we can find one697 // which can include this pointer.698 for (RuntimeCheckingPtrGroup &Group : Groups) {699 // Don't perform more than a certain amount of comparisons.700 // This should limit the cost of grouping the pointers to something701 // reasonable. If we do end up hitting this threshold, the algorithm702 // will create separate groups for all remaining pointers.703 if (TotalComparisons > MemoryCheckMergeThreshold)704 break;705 706 TotalComparisons++;707 708 if (Group.addPointer(Pointer, *this)) {709 Merged = true;710 break;711 }712 }713 714 if (!Merged)715 // We couldn't add this pointer to any existing set or the threshold716 // for the number of comparisons has been reached. Create a new group717 // to hold the current pointer.718 Groups.emplace_back(Pointer, *this);719 }720 }721 722 // We've computed the grouped checks for this partition.723 // Save the results and continue with the next one.724 llvm::append_range(CheckingGroups, Groups);725 }726}727 728bool RuntimePointerChecking::arePointersInSamePartition(729 const SmallVectorImpl<int> &PtrToPartition, unsigned PtrIdx1,730 unsigned PtrIdx2) {731 return (PtrToPartition[PtrIdx1] != -1 &&732 PtrToPartition[PtrIdx1] == PtrToPartition[PtrIdx2]);733}734 735bool RuntimePointerChecking::needsChecking(unsigned I, unsigned J) const {736 const PointerInfo &PointerI = Pointers[I];737 const PointerInfo &PointerJ = Pointers[J];738 739 // No need to check if two readonly pointers intersect.740 if (!PointerI.IsWritePtr && !PointerJ.IsWritePtr)741 return false;742 743 // Only need to check pointers between two different dependency sets.744 if (PointerI.DependencySetId == PointerJ.DependencySetId)745 return false;746 747 // Only need to check pointers in the same alias set.748 return PointerI.AliasSetId == PointerJ.AliasSetId;749}750 751/// Assign each RuntimeCheckingPtrGroup pointer an index for stable UTC output.752static DenseMap<const RuntimeCheckingPtrGroup *, unsigned>753getPtrToIdxMap(ArrayRef<RuntimeCheckingPtrGroup> CheckingGroups) {754 DenseMap<const RuntimeCheckingPtrGroup *, unsigned> PtrIndices;755 for (const auto &[Idx, CG] : enumerate(CheckingGroups))756 PtrIndices[&CG] = Idx;757 return PtrIndices;758}759 760void RuntimePointerChecking::printChecks(761 raw_ostream &OS, const SmallVectorImpl<RuntimePointerCheck> &Checks,762 unsigned Depth) const {763 unsigned N = 0;764 auto PtrIndices = getPtrToIdxMap(CheckingGroups);765 for (const auto &[Check1, Check2] : Checks) {766 const auto &First = Check1->Members, &Second = Check2->Members;767 OS.indent(Depth) << "Check " << N++ << ":\n";768 OS.indent(Depth + 2) << "Comparing group GRP" << PtrIndices.at(Check1)769 << ":\n";770 for (unsigned K : First)771 OS.indent(Depth + 2) << *Pointers[K].PointerValue << "\n";772 OS.indent(Depth + 2) << "Against group GRP" << PtrIndices.at(Check2)773 << ":\n";774 for (unsigned K : Second)775 OS.indent(Depth + 2) << *Pointers[K].PointerValue << "\n";776 }777}778 779void RuntimePointerChecking::print(raw_ostream &OS, unsigned Depth) const {780 781 OS.indent(Depth) << "Run-time memory checks:\n";782 printChecks(OS, Checks, Depth);783 784 OS.indent(Depth) << "Grouped accesses:\n";785 auto PtrIndices = getPtrToIdxMap(CheckingGroups);786 for (const auto &CG : CheckingGroups) {787 OS.indent(Depth + 2) << "Group GRP" << PtrIndices.at(&CG) << ":\n";788 OS.indent(Depth + 4) << "(Low: " << *CG.Low << " High: " << *CG.High789 << ")\n";790 for (unsigned Member : CG.Members) {791 OS.indent(Depth + 6) << "Member: " << *Pointers[Member].Expr << "\n";792 }793 }794}795 796namespace {797 798/// Analyses memory accesses in a loop.799///800/// Checks whether run time pointer checks are needed and builds sets for data801/// dependence checking.802class AccessAnalysis {803public:804 /// Read or write access location.805 typedef PointerIntPair<Value *, 1, bool> MemAccessInfo;806 typedef SmallVector<MemAccessInfo, 8> MemAccessInfoList;807 808 AccessAnalysis(const Loop *TheLoop, AAResults *AA, const LoopInfo *LI,809 DominatorTree &DT, MemoryDepChecker::DepCandidates &DA,810 PredicatedScalarEvolution &PSE,811 SmallPtrSetImpl<MDNode *> &LoopAliasScopes)812 : TheLoop(TheLoop), BAA(*AA), AST(BAA), LI(LI), DT(DT), DepCands(DA),813 PSE(PSE), LoopAliasScopes(LoopAliasScopes) {814 // We're analyzing dependences across loop iterations.815 BAA.enableCrossIterationMode();816 }817 818 /// Register a load and whether it is only read from.819 void addLoad(const MemoryLocation &Loc, Type *AccessTy, bool IsReadOnly) {820 Value *Ptr = const_cast<Value *>(Loc.Ptr);821 AST.add(adjustLoc(Loc));822 Accesses[MemAccessInfo(Ptr, false)].insert(AccessTy);823 if (IsReadOnly)824 ReadOnlyPtr.insert(Ptr);825 }826 827 /// Register a store.828 void addStore(const MemoryLocation &Loc, Type *AccessTy) {829 Value *Ptr = const_cast<Value *>(Loc.Ptr);830 AST.add(adjustLoc(Loc));831 Accesses[MemAccessInfo(Ptr, true)].insert(AccessTy);832 }833 834 /// Check if we can emit a run-time no-alias check for \p Access.835 ///836 /// Returns true if we can emit a run-time no alias check for \p Access.837 /// If we can check this access, this also adds it to a dependence set and838 /// adds a run-time to check for it to \p RtCheck. If \p Assume is true,839 /// we will attempt to use additional run-time checks in order to get840 /// the bounds of the pointer.841 bool createCheckForAccess(RuntimePointerChecking &RtCheck,842 MemAccessInfo Access, Type *AccessTy,843 const DenseMap<Value *, const SCEV *> &Strides,844 DenseMap<Value *, unsigned> &DepSetId,845 Loop *TheLoop, unsigned &RunningDepId,846 unsigned ASId, bool Assume);847 848 /// Check whether we can check the pointers at runtime for849 /// non-intersection.850 ///851 /// Returns true if we need no check or if we do and we can generate them852 /// (i.e. the pointers have computable bounds). A return value of false means853 /// we couldn't analyze and generate runtime checks for all pointers in the854 /// loop, but if \p AllowPartial is set then we will have checks for those855 /// pointers we could analyze.856 bool canCheckPtrAtRT(RuntimePointerChecking &RtCheck, Loop *TheLoop,857 const DenseMap<Value *, const SCEV *> &Strides,858 Value *&UncomputablePtr, bool AllowPartial);859 860 /// Goes over all memory accesses, checks whether a RT check is needed861 /// and builds sets of dependent accesses.862 void buildDependenceSets() {863 processMemAccesses();864 }865 866 /// Initial processing of memory accesses determined that we need to867 /// perform dependency checking.868 ///869 /// Note that this can later be cleared if we retry memcheck analysis without870 /// dependency checking (i.e. ShouldRetryWithRuntimeChecks).871 bool isDependencyCheckNeeded() const { return !CheckDeps.empty(); }872 873 /// We decided that no dependence analysis would be used. Reset the state.874 void resetDepChecks(MemoryDepChecker &DepChecker) {875 CheckDeps.clear();876 DepChecker.clearDependences();877 }878 879 const MemAccessInfoList &getDependenciesToCheck() const { return CheckDeps; }880 881private:882 typedef MapVector<MemAccessInfo, SmallSetVector<Type *, 1>> PtrAccessMap;883 884 /// Adjust the MemoryLocation so that it represents accesses to this885 /// location across all iterations, rather than a single one.886 MemoryLocation adjustLoc(MemoryLocation Loc) const {887 // The accessed location varies within the loop, but remains within the888 // underlying object.889 Loc.Size = LocationSize::beforeOrAfterPointer();890 Loc.AATags.Scope = adjustAliasScopeList(Loc.AATags.Scope);891 Loc.AATags.NoAlias = adjustAliasScopeList(Loc.AATags.NoAlias);892 return Loc;893 }894 895 /// Drop alias scopes that are only valid within a single loop iteration.896 MDNode *adjustAliasScopeList(MDNode *ScopeList) const {897 if (!ScopeList)898 return nullptr;899 900 // For the sake of simplicity, drop the whole scope list if any scope is901 // iteration-local.902 if (any_of(ScopeList->operands(), [&](Metadata *Scope) {903 return LoopAliasScopes.contains(cast<MDNode>(Scope));904 }))905 return nullptr;906 907 return ScopeList;908 }909 910 /// Go over all memory access and check whether runtime pointer checks911 /// are needed and build sets of dependency check candidates.912 void processMemAccesses();913 914 /// Map of all accesses. Values are the types used to access memory pointed to915 /// by the pointer.916 PtrAccessMap Accesses;917 918 /// The loop being checked.919 const Loop *TheLoop;920 921 /// List of accesses that need a further dependence check.922 MemAccessInfoList CheckDeps;923 924 /// Set of pointers that are read only.925 SmallPtrSet<Value*, 16> ReadOnlyPtr;926 927 /// Batched alias analysis results.928 BatchAAResults BAA;929 930 /// An alias set tracker to partition the access set by underlying object and931 //intrinsic property (such as TBAA metadata).932 AliasSetTracker AST;933 934 /// The LoopInfo of the loop being checked.935 const LoopInfo *LI;936 937 /// The dominator tree of the function.938 DominatorTree &DT;939 940 /// Sets of potentially dependent accesses - members of one set share an941 /// underlying pointer. The set "CheckDeps" identfies which sets really need a942 /// dependence check.943 MemoryDepChecker::DepCandidates &DepCands;944 945 /// Initial processing of memory accesses determined that we may need946 /// to add memchecks. Perform the analysis to determine the necessary checks.947 ///948 /// Note that, this is different from isDependencyCheckNeeded. When we retry949 /// memcheck analysis without dependency checking950 /// (i.e. ShouldRetryWithRuntimeChecks), isDependencyCheckNeeded is951 /// cleared while this remains set if we have potentially dependent accesses.952 bool IsRTCheckAnalysisNeeded = false;953 954 /// The SCEV predicate containing all the SCEV-related assumptions.955 PredicatedScalarEvolution &PSE;956 957 DenseMap<Value *, SmallVector<const Value *, 16>> UnderlyingObjects;958 959 /// Alias scopes that are declared inside the loop, and as such not valid960 /// across iterations.961 SmallPtrSetImpl<MDNode *> &LoopAliasScopes;962};963 964} // end anonymous namespace965 966/// Try to compute a constant stride for \p AR. Used by getPtrStride and967/// isNoWrap.968static std::optional<int64_t>969getStrideFromAddRec(const SCEVAddRecExpr *AR, const Loop *Lp, Type *AccessTy,970 Value *Ptr, PredicatedScalarEvolution &PSE) {971 if (isa<ScalableVectorType>(AccessTy)) {972 LLVM_DEBUG(dbgs() << "LAA: Bad stride - Scalable object: " << *AccessTy973 << "\n");974 return std::nullopt;975 }976 977 // The access function must stride over the innermost loop.978 if (Lp != AR->getLoop()) {979 LLVM_DEBUG({980 dbgs() << "LAA: Bad stride - Not striding over innermost loop ";981 if (Ptr)982 dbgs() << *Ptr << " ";983 984 dbgs() << "SCEV: " << *AR << "\n";985 });986 return std::nullopt;987 }988 989 // Check the step is constant.990 const SCEV *Step = AR->getStepRecurrence(*PSE.getSE());991 992 // Calculate the pointer stride and check if it is constant.993 const APInt *APStepVal;994 if (!match(Step, m_scev_APInt(APStepVal))) {995 LLVM_DEBUG({996 dbgs() << "LAA: Bad stride - Not a constant strided ";997 if (Ptr)998 dbgs() << *Ptr << " ";999 dbgs() << "SCEV: " << *AR << "\n";1000 });1001 return std::nullopt;1002 }1003 1004 const auto &DL = Lp->getHeader()->getDataLayout();1005 TypeSize AllocSize = DL.getTypeAllocSize(AccessTy);1006 int64_t Size = AllocSize.getFixedValue();1007 1008 // Huge step value - give up.1009 std::optional<int64_t> StepVal = APStepVal->trySExtValue();1010 if (!StepVal)1011 return std::nullopt;1012 1013 // Strided access.1014 return *StepVal % Size ? std::nullopt : std::make_optional(*StepVal / Size);1015}1016 1017/// Check whether \p AR is a non-wrapping AddRec. If \p Ptr is not nullptr, use1018/// informating from the IR pointer value to determine no-wrap.1019static bool isNoWrap(PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR,1020 Value *Ptr, Type *AccessTy, const Loop *L, bool Assume,1021 const DominatorTree &DT,1022 std::optional<int64_t> Stride = std::nullopt) {1023 // FIXME: This should probably only return true for NUW.1024 if (AR->getNoWrapFlags(SCEV::NoWrapMask))1025 return true;1026 1027 if (Ptr && PSE.hasNoOverflow(Ptr, SCEVWrapPredicate::IncrementNUSW))1028 return true;1029 1030 // An nusw getelementptr that is an AddRec cannot wrap. If it would wrap,1031 // the distance between the previously accessed location and the wrapped1032 // location will be larger than half the pointer index type space. In that1033 // case, the GEP would be poison and any memory access dependent on it would1034 // be immediate UB when executed.1035 if (auto *GEP = dyn_cast_if_present<GetElementPtrInst>(Ptr);1036 GEP && GEP->hasNoUnsignedSignedWrap()) {1037 // For the above reasoning to apply, the pointer must be dereferenced in1038 // every iteration.1039 if (L->getHeader() == L->getLoopLatch() ||1040 any_of(GEP->users(), [L, &DT, GEP](User *U) {1041 if (getLoadStorePointerOperand(U) != GEP)1042 return false;1043 BasicBlock *UserBB = cast<Instruction>(U)->getParent();1044 return !LoopAccessInfo::blockNeedsPredication(UserBB, L, &DT);1045 }))1046 return true;1047 }1048 1049 if (!Stride)1050 Stride = getStrideFromAddRec(AR, L, AccessTy, Ptr, PSE);1051 if (Stride) {1052 // If the null pointer is undefined, then a access sequence which would1053 // otherwise access it can be assumed not to unsigned wrap. Note that this1054 // assumes the object in memory is aligned to the natural alignment.1055 unsigned AddrSpace = AR->getType()->getPointerAddressSpace();1056 if (!NullPointerIsDefined(L->getHeader()->getParent(), AddrSpace) &&1057 (Stride == 1 || Stride == -1))1058 return true;1059 }1060 1061 if (Ptr && Assume) {1062 PSE.setNoOverflow(Ptr, SCEVWrapPredicate::IncrementNUSW);1063 LLVM_DEBUG(dbgs() << "LAA: Pointer may wrap:\n"1064 << "LAA: Pointer: " << *Ptr << "\n"1065 << "LAA: SCEV: " << *AR << "\n"1066 << "LAA: Added an overflow assumption\n");1067 return true;1068 }1069 1070 return false;1071}1072 1073static void visitPointers(Value *StartPtr, const Loop &InnermostLoop,1074 function_ref<void(Value *)> AddPointer) {1075 SmallPtrSet<Value *, 8> Visited;1076 SmallVector<Value *> WorkList;1077 WorkList.push_back(StartPtr);1078 1079 while (!WorkList.empty()) {1080 Value *Ptr = WorkList.pop_back_val();1081 if (!Visited.insert(Ptr).second)1082 continue;1083 auto *PN = dyn_cast<PHINode>(Ptr);1084 // SCEV does not look through non-header PHIs inside the loop. Such phis1085 // can be analyzed by adding separate accesses for each incoming pointer1086 // value.1087 if (PN && InnermostLoop.contains(PN->getParent()) &&1088 PN->getParent() != InnermostLoop.getHeader()) {1089 llvm::append_range(WorkList, PN->incoming_values());1090 } else1091 AddPointer(Ptr);1092 }1093}1094 1095// Walk back through the IR for a pointer, looking for a select like the1096// following:1097//1098// %offset = select i1 %cmp, i64 %a, i64 %b1099// %addr = getelementptr double, double* %base, i64 %offset1100// %ld = load double, double* %addr, align 81101//1102// We won't be able to form a single SCEVAddRecExpr from this since the1103// address for each loop iteration depends on %cmp. We could potentially1104// produce multiple valid SCEVAddRecExprs, though, and check all of them for1105// memory safety/aliasing if needed.1106//1107// If we encounter some IR we don't yet handle, or something obviously fine1108// like a constant, then we just add the SCEV for that term to the list passed1109// in by the caller. If we have a node that may potentially yield a valid1110// SCEVAddRecExpr then we decompose it into parts and build the SCEV terms1111// ourselves before adding to the list.1112static void findForkedSCEVs(1113 ScalarEvolution *SE, const Loop *L, Value *Ptr,1114 SmallVectorImpl<PointerIntPair<const SCEV *, 1, bool>> &ScevList,1115 unsigned Depth) {1116 // If our Value is a SCEVAddRecExpr, loop invariant, not an instruction, or1117 // we've exceeded our limit on recursion, just return whatever we have1118 // regardless of whether it can be used for a forked pointer or not, along1119 // with an indication of whether it might be a poison or undef value.1120 const SCEV *Scev = SE->getSCEV(Ptr);1121 if (isa<SCEVAddRecExpr>(Scev) || L->isLoopInvariant(Ptr) ||1122 !isa<Instruction>(Ptr) || Depth == 0) {1123 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));1124 return;1125 }1126 1127 Depth--;1128 1129 auto UndefPoisonCheck = [](PointerIntPair<const SCEV *, 1, bool> S) {1130 return get<1>(S);1131 };1132 1133 auto GetBinOpExpr = [&SE](unsigned Opcode, const SCEV *L, const SCEV *R) {1134 switch (Opcode) {1135 case Instruction::Add:1136 return SE->getAddExpr(L, R);1137 case Instruction::Sub:1138 return SE->getMinusSCEV(L, R);1139 default:1140 llvm_unreachable("Unexpected binary operator when walking ForkedPtrs");1141 }1142 };1143 1144 Instruction *I = cast<Instruction>(Ptr);1145 unsigned Opcode = I->getOpcode();1146 switch (Opcode) {1147 case Instruction::GetElementPtr: {1148 auto *GEP = cast<GetElementPtrInst>(I);1149 Type *SourceTy = GEP->getSourceElementType();1150 // We only handle base + single offset GEPs here for now.1151 // Not dealing with preexisting gathers yet, so no vectors.1152 if (I->getNumOperands() != 2 || SourceTy->isVectorTy()) {1153 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(GEP));1154 break;1155 }1156 SmallVector<PointerIntPair<const SCEV *, 1, bool>, 2> BaseScevs;1157 SmallVector<PointerIntPair<const SCEV *, 1, bool>, 2> OffsetScevs;1158 findForkedSCEVs(SE, L, I->getOperand(0), BaseScevs, Depth);1159 findForkedSCEVs(SE, L, I->getOperand(1), OffsetScevs, Depth);1160 1161 // See if we need to freeze our fork...1162 bool NeedsFreeze = any_of(BaseScevs, UndefPoisonCheck) ||1163 any_of(OffsetScevs, UndefPoisonCheck);1164 1165 // Check that we only have a single fork, on either the base or the offset.1166 // Copy the SCEV across for the one without a fork in order to generate1167 // the full SCEV for both sides of the GEP.1168 if (OffsetScevs.size() == 2 && BaseScevs.size() == 1)1169 BaseScevs.push_back(BaseScevs[0]);1170 else if (BaseScevs.size() == 2 && OffsetScevs.size() == 1)1171 OffsetScevs.push_back(OffsetScevs[0]);1172 else {1173 ScevList.emplace_back(Scev, NeedsFreeze);1174 break;1175 }1176 1177 Type *IntPtrTy = SE->getEffectiveSCEVType(GEP->getPointerOperandType());1178 1179 // Find the size of the type being pointed to. We only have a single1180 // index term (guarded above) so we don't need to index into arrays or1181 // structures, just get the size of the scalar value.1182 const SCEV *Size = SE->getSizeOfExpr(IntPtrTy, SourceTy);1183 1184 for (auto [B, O] : zip(BaseScevs, OffsetScevs)) {1185 const SCEV *Base = get<0>(B);1186 const SCEV *Offset = get<0>(O);1187 1188 // Scale up the offsets by the size of the type, then add to the bases.1189 const SCEV *Scaled =1190 SE->getMulExpr(Size, SE->getTruncateOrSignExtend(Offset, IntPtrTy));1191 ScevList.emplace_back(SE->getAddExpr(Base, Scaled), NeedsFreeze);1192 }1193 break;1194 }1195 case Instruction::Select: {1196 SmallVector<PointerIntPair<const SCEV *, 1, bool>, 2> ChildScevs;1197 // A select means we've found a forked pointer, but we currently only1198 // support a single select per pointer so if there's another behind this1199 // then we just bail out and return the generic SCEV.1200 findForkedSCEVs(SE, L, I->getOperand(1), ChildScevs, Depth);1201 findForkedSCEVs(SE, L, I->getOperand(2), ChildScevs, Depth);1202 if (ChildScevs.size() == 2)1203 append_range(ScevList, ChildScevs);1204 else1205 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));1206 break;1207 }1208 case Instruction::PHI: {1209 SmallVector<PointerIntPair<const SCEV *, 1, bool>, 2> ChildScevs;1210 // A phi means we've found a forked pointer, but we currently only1211 // support a single phi per pointer so if there's another behind this1212 // then we just bail out and return the generic SCEV.1213 if (I->getNumOperands() == 2) {1214 findForkedSCEVs(SE, L, I->getOperand(0), ChildScevs, Depth);1215 findForkedSCEVs(SE, L, I->getOperand(1), ChildScevs, Depth);1216 }1217 if (ChildScevs.size() == 2)1218 append_range(ScevList, ChildScevs);1219 else1220 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));1221 break;1222 }1223 case Instruction::Add:1224 case Instruction::Sub: {1225 SmallVector<PointerIntPair<const SCEV *, 1, bool>> LScevs;1226 SmallVector<PointerIntPair<const SCEV *, 1, bool>> RScevs;1227 findForkedSCEVs(SE, L, I->getOperand(0), LScevs, Depth);1228 findForkedSCEVs(SE, L, I->getOperand(1), RScevs, Depth);1229 1230 // See if we need to freeze our fork...1231 bool NeedsFreeze =1232 any_of(LScevs, UndefPoisonCheck) || any_of(RScevs, UndefPoisonCheck);1233 1234 // Check that we only have a single fork, on either the left or right side.1235 // Copy the SCEV across for the one without a fork in order to generate1236 // the full SCEV for both sides of the BinOp.1237 if (LScevs.size() == 2 && RScevs.size() == 1)1238 RScevs.push_back(RScevs[0]);1239 else if (RScevs.size() == 2 && LScevs.size() == 1)1240 LScevs.push_back(LScevs[0]);1241 else {1242 ScevList.emplace_back(Scev, NeedsFreeze);1243 break;1244 }1245 1246 for (auto [L, R] : zip(LScevs, RScevs))1247 ScevList.emplace_back(GetBinOpExpr(Opcode, get<0>(L), get<0>(R)),1248 NeedsFreeze);1249 break;1250 }1251 default:1252 // Just return the current SCEV if we haven't handled the instruction yet.1253 LLVM_DEBUG(dbgs() << "ForkedPtr unhandled instruction: " << *I << "\n");1254 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));1255 break;1256 }1257}1258 1259bool AccessAnalysis::createCheckForAccess(1260 RuntimePointerChecking &RtCheck, MemAccessInfo Access, Type *AccessTy,1261 const DenseMap<Value *, const SCEV *> &StridesMap,1262 DenseMap<Value *, unsigned> &DepSetId, Loop *TheLoop,1263 unsigned &RunningDepId, unsigned ASId, bool Assume) {1264 Value *Ptr = Access.getPointer();1265 ScalarEvolution *SE = PSE.getSE();1266 assert(SE->isSCEVable(Ptr->getType()) && "Value is not SCEVable!");1267 1268 SmallVector<PointerIntPair<const SCEV *, 1, bool>> RTCheckPtrs;1269 findForkedSCEVs(SE, TheLoop, Ptr, RTCheckPtrs, MaxForkedSCEVDepth);1270 assert(!RTCheckPtrs.empty() &&1271 "Must have some runtime-check pointer candidates");1272 1273 // RTCheckPtrs must have size 2 if there are forked pointers. Otherwise, there1274 // are no forked pointers; replaceSymbolicStridesSCEV in this case.1275 auto IsLoopInvariantOrAR =1276 [&SE, &TheLoop](const PointerIntPair<const SCEV *, 1, bool> &P) {1277 return SE->isLoopInvariant(P.getPointer(), TheLoop) ||1278 isa<SCEVAddRecExpr>(P.getPointer());1279 };1280 if (RTCheckPtrs.size() == 2 && all_of(RTCheckPtrs, IsLoopInvariantOrAR)) {1281 LLVM_DEBUG(dbgs() << "LAA: Found forked pointer: " << *Ptr << "\n";1282 for (const auto &[Idx, Q] : enumerate(RTCheckPtrs)) dbgs()1283 << "\t(" << Idx << ") " << *Q.getPointer() << "\n");1284 } else {1285 RTCheckPtrs = {{replaceSymbolicStrideSCEV(PSE, StridesMap, Ptr), false}};1286 }1287 1288 /// Check whether all pointers can participate in a runtime bounds check. They1289 /// must either be invariant or non-wrapping affine AddRecs.1290 for (auto &P : RTCheckPtrs) {1291 // The bounds for loop-invariant pointer is trivial.1292 if (SE->isLoopInvariant(P.getPointer(), TheLoop))1293 continue;1294 1295 const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(P.getPointer());1296 if (!AR && Assume)1297 AR = PSE.getAsAddRec(Ptr);1298 if (!AR || !AR->isAffine())1299 return false;1300 1301 // If there's only one option for Ptr, look it up after bounds and wrap1302 // checking, because assumptions might have been added to PSE.1303 if (RTCheckPtrs.size() == 1) {1304 AR =1305 cast<SCEVAddRecExpr>(replaceSymbolicStrideSCEV(PSE, StridesMap, Ptr));1306 P.setPointer(AR);1307 }1308 1309 if (!isNoWrap(PSE, AR, RTCheckPtrs.size() == 1 ? Ptr : nullptr, AccessTy,1310 TheLoop, Assume, DT))1311 return false;1312 }1313 1314 for (const auto &[PtrExpr, NeedsFreeze] : RTCheckPtrs) {1315 // The id of the dependence set.1316 unsigned DepId;1317 1318 if (isDependencyCheckNeeded()) {1319 Value *Leader = DepCands.getLeaderValue(Access).getPointer();1320 unsigned &LeaderId = DepSetId[Leader];1321 if (!LeaderId)1322 LeaderId = RunningDepId++;1323 DepId = LeaderId;1324 } else1325 // Each access has its own dependence set.1326 DepId = RunningDepId++;1327 1328 bool IsWrite = Access.getInt();1329 RtCheck.insert(TheLoop, Ptr, PtrExpr, AccessTy, IsWrite, DepId, ASId, PSE,1330 NeedsFreeze);1331 LLVM_DEBUG(dbgs() << "LAA: Found a runtime check ptr:" << *Ptr << '\n');1332 }1333 1334 return true;1335}1336 1337bool AccessAnalysis::canCheckPtrAtRT(1338 RuntimePointerChecking &RtCheck, Loop *TheLoop,1339 const DenseMap<Value *, const SCEV *> &StridesMap, Value *&UncomputablePtr,1340 bool AllowPartial) {1341 // Find pointers with computable bounds. We are going to use this information1342 // to place a runtime bound check.1343 bool CanDoRT = true;1344 1345 bool MayNeedRTCheck = false;1346 if (!IsRTCheckAnalysisNeeded) return true;1347 1348 bool IsDepCheckNeeded = isDependencyCheckNeeded();1349 1350 // We assign a consecutive id to access from different alias sets.1351 // Accesses between different groups doesn't need to be checked.1352 unsigned ASId = 0;1353 for (const auto &AS : AST) {1354 int NumReadPtrChecks = 0;1355 int NumWritePtrChecks = 0;1356 bool CanDoAliasSetRT = true;1357 ++ASId;1358 auto ASPointers = AS.getPointers();1359 1360 // We assign consecutive id to access from different dependence sets.1361 // Accesses within the same set don't need a runtime check.1362 unsigned RunningDepId = 1;1363 DenseMap<Value *, unsigned> DepSetId;1364 1365 SmallVector<std::pair<MemAccessInfo, Type *>, 4> Retries;1366 1367 // First, count how many write and read accesses are in the alias set. Also1368 // collect MemAccessInfos for later.1369 SmallVector<MemAccessInfo, 4> AccessInfos;1370 for (const Value *ConstPtr : ASPointers) {1371 Value *Ptr = const_cast<Value *>(ConstPtr);1372 bool IsWrite = Accesses.contains(MemAccessInfo(Ptr, true));1373 if (IsWrite)1374 ++NumWritePtrChecks;1375 else1376 ++NumReadPtrChecks;1377 AccessInfos.emplace_back(Ptr, IsWrite);1378 }1379 1380 // We do not need runtime checks for this alias set, if there are no writes1381 // or a single write and no reads.1382 if (NumWritePtrChecks == 0 ||1383 (NumWritePtrChecks == 1 && NumReadPtrChecks == 0)) {1384 assert((ASPointers.size() <= 1 ||1385 all_of(ASPointers,1386 [this](const Value *Ptr) {1387 MemAccessInfo AccessWrite(const_cast<Value *>(Ptr),1388 true);1389 return !DepCands.contains(AccessWrite);1390 })) &&1391 "Can only skip updating CanDoRT below, if all entries in AS "1392 "are reads or there is at most 1 entry");1393 continue;1394 }1395 1396 for (auto &Access : AccessInfos) {1397 for (const auto &AccessTy : Accesses[Access]) {1398 if (!createCheckForAccess(RtCheck, Access, AccessTy, StridesMap,1399 DepSetId, TheLoop, RunningDepId, ASId,1400 false)) {1401 LLVM_DEBUG(dbgs() << "LAA: Can't find bounds for ptr:"1402 << *Access.getPointer() << '\n');1403 Retries.emplace_back(Access, AccessTy);1404 CanDoAliasSetRT = false;1405 }1406 }1407 }1408 1409 // Note that this function computes CanDoRT and MayNeedRTCheck1410 // independently. For example CanDoRT=false, MayNeedRTCheck=false means that1411 // we have a pointer for which we couldn't find the bounds but we don't1412 // actually need to emit any checks so it does not matter.1413 //1414 // We need runtime checks for this alias set, if there are at least 21415 // dependence sets (in which case RunningDepId > 2) or if we need to re-try1416 // any bound checks (because in that case the number of dependence sets is1417 // incomplete).1418 bool NeedsAliasSetRTCheck = RunningDepId > 2 || !Retries.empty();1419 1420 // We need to perform run-time alias checks, but some pointers had bounds1421 // that couldn't be checked.1422 if (NeedsAliasSetRTCheck && !CanDoAliasSetRT) {1423 // Reset the CanDoSetRt flag and retry all accesses that have failed.1424 // We know that we need these checks, so we can now be more aggressive1425 // and add further checks if required (overflow checks).1426 CanDoAliasSetRT = true;1427 for (const auto &[Access, AccessTy] : Retries) {1428 if (!createCheckForAccess(RtCheck, Access, AccessTy, StridesMap,1429 DepSetId, TheLoop, RunningDepId, ASId,1430 /*Assume=*/true)) {1431 CanDoAliasSetRT = false;1432 UncomputablePtr = Access.getPointer();1433 if (!AllowPartial)1434 break;1435 }1436 }1437 }1438 1439 CanDoRT &= CanDoAliasSetRT;1440 MayNeedRTCheck |= NeedsAliasSetRTCheck;1441 ++ASId;1442 }1443 1444 // If the pointers that we would use for the bounds comparison have different1445 // address spaces, assume the values aren't directly comparable, so we can't1446 // use them for the runtime check. We also have to assume they could1447 // overlap. In the future there should be metadata for whether address spaces1448 // are disjoint.1449 unsigned NumPointers = RtCheck.Pointers.size();1450 for (unsigned i = 0; i < NumPointers; ++i) {1451 for (unsigned j = i + 1; j < NumPointers; ++j) {1452 // Only need to check pointers between two different dependency sets.1453 if (RtCheck.Pointers[i].DependencySetId ==1454 RtCheck.Pointers[j].DependencySetId)1455 continue;1456 // Only need to check pointers in the same alias set.1457 if (RtCheck.Pointers[i].AliasSetId != RtCheck.Pointers[j].AliasSetId)1458 continue;1459 1460 Value *PtrI = RtCheck.Pointers[i].PointerValue;1461 Value *PtrJ = RtCheck.Pointers[j].PointerValue;1462 1463 unsigned ASi = PtrI->getType()->getPointerAddressSpace();1464 unsigned ASj = PtrJ->getType()->getPointerAddressSpace();1465 if (ASi != ASj) {1466 LLVM_DEBUG(1467 dbgs() << "LAA: Runtime check would require comparison between"1468 " different address spaces\n");1469 return false;1470 }1471 }1472 }1473 1474 if (MayNeedRTCheck && (CanDoRT || AllowPartial))1475 RtCheck.generateChecks(DepCands, IsDepCheckNeeded);1476 1477 LLVM_DEBUG(dbgs() << "LAA: We need to do " << RtCheck.getNumberOfChecks()1478 << " pointer comparisons.\n");1479 1480 // If we can do run-time checks, but there are no checks, no runtime checks1481 // are needed. This can happen when all pointers point to the same underlying1482 // object for example.1483 RtCheck.Need = CanDoRT ? RtCheck.getNumberOfChecks() != 0 : MayNeedRTCheck;1484 1485 bool CanDoRTIfNeeded = !RtCheck.Need || CanDoRT;1486 assert(CanDoRTIfNeeded == (CanDoRT || !MayNeedRTCheck) &&1487 "CanDoRTIfNeeded depends on RtCheck.Need");1488 if (!CanDoRTIfNeeded && !AllowPartial)1489 RtCheck.reset();1490 return CanDoRTIfNeeded;1491}1492 1493void AccessAnalysis::processMemAccesses() {1494 // We process the set twice: first we process read-write pointers, last we1495 // process read-only pointers. This allows us to skip dependence tests for1496 // read-only pointers.1497 1498 LLVM_DEBUG(dbgs() << "LAA: Processing memory accesses...\n");1499 LLVM_DEBUG(dbgs() << " AST: "; AST.dump());1500 LLVM_DEBUG(dbgs() << "LAA: Accesses(" << Accesses.size() << "):\n");1501 LLVM_DEBUG({1502 for (const auto &[A, _] : Accesses)1503 dbgs() << "\t" << *A.getPointer() << " ("1504 << (A.getInt()1505 ? "write"1506 : (ReadOnlyPtr.contains(A.getPointer()) ? "read-only"1507 : "read"))1508 << ")\n";1509 });1510 1511 // The AliasSetTracker has nicely partitioned our pointers by metadata1512 // compatibility and potential for underlying-object overlap. As a result, we1513 // only need to check for potential pointer dependencies within each alias1514 // set.1515 for (const auto &AS : AST) {1516 // Note that both the alias-set tracker and the alias sets themselves used1517 // ordered collections internally and so the iteration order here is1518 // deterministic.1519 auto ASPointers = AS.getPointers();1520 1521 bool SetHasWrite = false;1522 1523 // Map of (pointer to underlying objects, accessed address space) to last1524 // access encountered.1525 typedef DenseMap<std::pair<const Value *, unsigned>, MemAccessInfo>1526 UnderlyingObjToAccessMap;1527 UnderlyingObjToAccessMap ObjToLastAccess;1528 1529 // Set of access to check after all writes have been processed.1530 PtrAccessMap DeferredAccesses;1531 1532 // Iterate over each alias set twice, once to process read/write pointers,1533 // and then to process read-only pointers.1534 for (int SetIteration = 0; SetIteration < 2; ++SetIteration) {1535 bool UseDeferred = SetIteration > 0;1536 PtrAccessMap &S = UseDeferred ? DeferredAccesses : Accesses;1537 1538 for (const Value *ConstPtr : ASPointers) {1539 Value *Ptr = const_cast<Value *>(ConstPtr);1540 1541 // For a single memory access in AliasSetTracker, Accesses may contain1542 // both read and write, and they both need to be handled for CheckDeps.1543 for (const auto &[AC, _] : S) {1544 if (AC.getPointer() != Ptr)1545 continue;1546 1547 bool IsWrite = AC.getInt();1548 1549 // If we're using the deferred access set, then it contains only1550 // reads.1551 bool IsReadOnlyPtr = ReadOnlyPtr.contains(Ptr) && !IsWrite;1552 if (UseDeferred && !IsReadOnlyPtr)1553 continue;1554 // Otherwise, the pointer must be in the PtrAccessSet, either as a1555 // read or a write.1556 assert(((IsReadOnlyPtr && UseDeferred) || IsWrite ||1557 S.contains(MemAccessInfo(Ptr, false))) &&1558 "Alias-set pointer not in the access set?");1559 1560 MemAccessInfo Access(Ptr, IsWrite);1561 DepCands.insert(Access);1562 1563 // Memorize read-only pointers for later processing and skip them in1564 // the first round (they need to be checked after we have seen all1565 // write pointers). Note: we also mark pointer that are not1566 // consecutive as "read-only" pointers (so that we check1567 // "a[b[i]] +="). Hence, we need the second check for "!IsWrite".1568 if (!UseDeferred && IsReadOnlyPtr) {1569 // We only use the pointer keys, the types vector values don't1570 // matter.1571 DeferredAccesses.insert({Access, {}});1572 continue;1573 }1574 1575 // If this is a write - check other reads and writes for conflicts. If1576 // this is a read only check other writes for conflicts (but only if1577 // there is no other write to the ptr - this is an optimization to1578 // catch "a[i] = a[i] + " without having to do a dependence check).1579 if ((IsWrite || IsReadOnlyPtr) && SetHasWrite) {1580 CheckDeps.push_back(Access);1581 IsRTCheckAnalysisNeeded = true;1582 }1583 1584 if (IsWrite)1585 SetHasWrite = true;1586 1587 // Create sets of pointers connected by a shared alias set and1588 // underlying object.1589 SmallVector<const Value *, 16> &UOs = UnderlyingObjects[Ptr];1590 UOs = {};1591 ::getUnderlyingObjects(Ptr, UOs, LI);1592 LLVM_DEBUG(dbgs()1593 << "Underlying objects for pointer " << *Ptr << "\n");1594 for (const Value *UnderlyingObj : UOs) {1595 // nullptr never alias, don't join sets for pointer that have "null"1596 // in their UnderlyingObjects list.1597 if (isa<ConstantPointerNull>(UnderlyingObj) &&1598 !NullPointerIsDefined(1599 TheLoop->getHeader()->getParent(),1600 UnderlyingObj->getType()->getPointerAddressSpace()))1601 continue;1602 1603 auto [It, Inserted] = ObjToLastAccess.try_emplace(1604 {UnderlyingObj,1605 cast<PointerType>(Ptr->getType())->getAddressSpace()},1606 Access);1607 if (!Inserted) {1608 DepCands.unionSets(Access, It->second);1609 It->second = Access;1610 }1611 1612 LLVM_DEBUG(dbgs() << " " << *UnderlyingObj << "\n");1613 }1614 }1615 }1616 }1617 }1618}1619 1620/// Check whether the access through \p Ptr has a constant stride.1621std::optional<int64_t>1622llvm::getPtrStride(PredicatedScalarEvolution &PSE, Type *AccessTy, Value *Ptr,1623 const Loop *Lp, const DominatorTree &DT,1624 const DenseMap<Value *, const SCEV *> &StridesMap,1625 bool Assume, bool ShouldCheckWrap) {1626 const SCEV *PtrScev = replaceSymbolicStrideSCEV(PSE, StridesMap, Ptr);1627 if (PSE.getSE()->isLoopInvariant(PtrScev, Lp))1628 return 0;1629 1630 assert(Ptr->getType()->isPointerTy() && "Unexpected non-ptr");1631 1632 const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PtrScev);1633 if (Assume && !AR)1634 AR = PSE.getAsAddRec(Ptr);1635 1636 if (!AR) {1637 LLVM_DEBUG(dbgs() << "LAA: Bad stride - Not an AddRecExpr pointer " << *Ptr1638 << " SCEV: " << *PtrScev << "\n");1639 return std::nullopt;1640 }1641 1642 std::optional<int64_t> Stride =1643 getStrideFromAddRec(AR, Lp, AccessTy, Ptr, PSE);1644 if (!ShouldCheckWrap || !Stride)1645 return Stride;1646 1647 if (isNoWrap(PSE, AR, Ptr, AccessTy, Lp, Assume, DT, Stride))1648 return Stride;1649 1650 LLVM_DEBUG(1651 dbgs() << "LAA: Bad stride - Pointer may wrap in the address space "1652 << *Ptr << " SCEV: " << *AR << "\n");1653 return std::nullopt;1654}1655 1656std::optional<int64_t> llvm::getPointersDiff(Type *ElemTyA, Value *PtrA,1657 Type *ElemTyB, Value *PtrB,1658 const DataLayout &DL,1659 ScalarEvolution &SE,1660 bool StrictCheck, bool CheckType) {1661 assert(PtrA && PtrB && "Expected non-nullptr pointers.");1662 1663 // Make sure that A and B are different pointers.1664 if (PtrA == PtrB)1665 return 0;1666 1667 // Make sure that the element types are the same if required.1668 if (CheckType && ElemTyA != ElemTyB)1669 return std::nullopt;1670 1671 unsigned ASA = PtrA->getType()->getPointerAddressSpace();1672 unsigned ASB = PtrB->getType()->getPointerAddressSpace();1673 1674 // Check that the address spaces match.1675 if (ASA != ASB)1676 return std::nullopt;1677 unsigned IdxWidth = DL.getIndexSizeInBits(ASA);1678 1679 APInt OffsetA(IdxWidth, 0), OffsetB(IdxWidth, 0);1680 const Value *PtrA1 = PtrA->stripAndAccumulateConstantOffsets(1681 DL, OffsetA, /*AllowNonInbounds=*/true);1682 const Value *PtrB1 = PtrB->stripAndAccumulateConstantOffsets(1683 DL, OffsetB, /*AllowNonInbounds=*/true);1684 1685 std::optional<int64_t> Val;1686 if (PtrA1 == PtrB1) {1687 // Retrieve the address space again as pointer stripping now tracks through1688 // `addrspacecast`.1689 ASA = cast<PointerType>(PtrA1->getType())->getAddressSpace();1690 ASB = cast<PointerType>(PtrB1->getType())->getAddressSpace();1691 // Check that the address spaces match and that the pointers are valid.1692 if (ASA != ASB)1693 return std::nullopt;1694 1695 IdxWidth = DL.getIndexSizeInBits(ASA);1696 OffsetA = OffsetA.sextOrTrunc(IdxWidth);1697 OffsetB = OffsetB.sextOrTrunc(IdxWidth);1698 1699 OffsetB -= OffsetA;1700 Val = OffsetB.trySExtValue();1701 } else {1702 // Otherwise compute the distance with SCEV between the base pointers.1703 const SCEV *PtrSCEVA = SE.getSCEV(PtrA);1704 const SCEV *PtrSCEVB = SE.getSCEV(PtrB);1705 std::optional<APInt> Diff =1706 SE.computeConstantDifference(PtrSCEVB, PtrSCEVA);1707 if (!Diff)1708 return std::nullopt;1709 Val = Diff->trySExtValue();1710 }1711 1712 if (!Val)1713 return std::nullopt;1714 1715 int64_t Size = DL.getTypeStoreSize(ElemTyA);1716 int64_t Dist = *Val / Size;1717 1718 // Ensure that the calculated distance matches the type-based one after all1719 // the bitcasts removal in the provided pointers.1720 if (!StrictCheck || Dist * Size == Val)1721 return Dist;1722 return std::nullopt;1723}1724 1725bool llvm::sortPtrAccesses(ArrayRef<Value *> VL, Type *ElemTy,1726 const DataLayout &DL, ScalarEvolution &SE,1727 SmallVectorImpl<unsigned> &SortedIndices) {1728 assert(llvm::all_of(1729 VL, [](const Value *V) { return V->getType()->isPointerTy(); }) &&1730 "Expected list of pointer operands.");1731 // Walk over the pointers, and map each of them to an offset relative to1732 // first pointer in the array.1733 Value *Ptr0 = VL[0];1734 1735 using DistOrdPair = std::pair<int64_t, unsigned>;1736 auto Compare = llvm::less_first();1737 std::set<DistOrdPair, decltype(Compare)> Offsets(Compare);1738 Offsets.emplace(0, 0);1739 bool IsConsecutive = true;1740 for (auto [Idx, Ptr] : drop_begin(enumerate(VL))) {1741 std::optional<int64_t> Diff =1742 getPointersDiff(ElemTy, Ptr0, ElemTy, Ptr, DL, SE,1743 /*StrictCheck=*/true);1744 if (!Diff)1745 return false;1746 1747 // Check if the pointer with the same offset is found.1748 int64_t Offset = *Diff;1749 auto [It, IsInserted] = Offsets.emplace(Offset, Idx);1750 if (!IsInserted)1751 return false;1752 // Consecutive order if the inserted element is the last one.1753 IsConsecutive &= std::next(It) == Offsets.end();1754 }1755 SortedIndices.clear();1756 if (!IsConsecutive) {1757 // Fill SortedIndices array only if it is non-consecutive.1758 SortedIndices.resize(VL.size());1759 for (auto [Idx, Off] : enumerate(Offsets))1760 SortedIndices[Idx] = Off.second;1761 }1762 return true;1763}1764 1765/// Returns true if the memory operations \p A and \p B are consecutive.1766bool llvm::isConsecutiveAccess(Value *A, Value *B, const DataLayout &DL,1767 ScalarEvolution &SE, bool CheckType) {1768 Value *PtrA = getLoadStorePointerOperand(A);1769 Value *PtrB = getLoadStorePointerOperand(B);1770 if (!PtrA || !PtrB)1771 return false;1772 Type *ElemTyA = getLoadStoreType(A);1773 Type *ElemTyB = getLoadStoreType(B);1774 std::optional<int64_t> Diff =1775 getPointersDiff(ElemTyA, PtrA, ElemTyB, PtrB, DL, SE,1776 /*StrictCheck=*/true, CheckType);1777 return Diff == 1;1778}1779 1780void MemoryDepChecker::addAccess(StoreInst *SI) {1781 visitPointers(SI->getPointerOperand(), *InnermostLoop,1782 [this, SI](Value *Ptr) {1783 Accesses[MemAccessInfo(Ptr, true)].push_back(AccessIdx);1784 InstMap.push_back(SI);1785 ++AccessIdx;1786 });1787}1788 1789void MemoryDepChecker::addAccess(LoadInst *LI) {1790 visitPointers(LI->getPointerOperand(), *InnermostLoop,1791 [this, LI](Value *Ptr) {1792 Accesses[MemAccessInfo(Ptr, false)].push_back(AccessIdx);1793 InstMap.push_back(LI);1794 ++AccessIdx;1795 });1796}1797 1798MemoryDepChecker::VectorizationSafetyStatus1799MemoryDepChecker::Dependence::isSafeForVectorization(DepType Type) {1800 switch (Type) {1801 case NoDep:1802 case Forward:1803 case BackwardVectorizable:1804 return VectorizationSafetyStatus::Safe;1805 1806 case Unknown:1807 return VectorizationSafetyStatus::PossiblySafeWithRtChecks;1808 case ForwardButPreventsForwarding:1809 case Backward:1810 case BackwardVectorizableButPreventsForwarding:1811 case IndirectUnsafe:1812 return VectorizationSafetyStatus::Unsafe;1813 }1814 llvm_unreachable("unexpected DepType!");1815}1816 1817bool MemoryDepChecker::Dependence::isBackward() const {1818 switch (Type) {1819 case NoDep:1820 case Forward:1821 case ForwardButPreventsForwarding:1822 case Unknown:1823 case IndirectUnsafe:1824 return false;1825 1826 case BackwardVectorizable:1827 case Backward:1828 case BackwardVectorizableButPreventsForwarding:1829 return true;1830 }1831 llvm_unreachable("unexpected DepType!");1832}1833 1834bool MemoryDepChecker::Dependence::isPossiblyBackward() const {1835 return isBackward() || Type == Unknown || Type == IndirectUnsafe;1836}1837 1838bool MemoryDepChecker::Dependence::isForward() const {1839 switch (Type) {1840 case Forward:1841 case ForwardButPreventsForwarding:1842 return true;1843 1844 case NoDep:1845 case Unknown:1846 case BackwardVectorizable:1847 case Backward:1848 case BackwardVectorizableButPreventsForwarding:1849 case IndirectUnsafe:1850 return false;1851 }1852 llvm_unreachable("unexpected DepType!");1853}1854 1855bool MemoryDepChecker::couldPreventStoreLoadForward(uint64_t Distance,1856 uint64_t TypeByteSize,1857 unsigned CommonStride) {1858 // If loads occur at a distance that is not a multiple of a feasible vector1859 // factor store-load forwarding does not take place.1860 // Positive dependences might cause troubles because vectorizing them might1861 // prevent store-load forwarding making vectorized code run a lot slower.1862 // a[i] = a[i-3] ^ a[i-8];1863 // The stores to a[i:i+1] don't align with the stores to a[i-3:i-2] and1864 // hence on your typical architecture store-load forwarding does not take1865 // place. Vectorizing in such cases does not make sense.1866 // Store-load forwarding distance.1867 1868 // After this many iterations store-to-load forwarding conflicts should not1869 // cause any slowdowns.1870 const uint64_t NumItersForStoreLoadThroughMemory = 8 * TypeByteSize;1871 // Maximum vector factor.1872 uint64_t MaxVFWithoutSLForwardIssuesPowerOf2 =1873 std::min(VectorizerParams::MaxVectorWidth * TypeByteSize,1874 MaxStoreLoadForwardSafeDistanceInBits);1875 1876 // Compute the smallest VF at which the store and load would be misaligned.1877 for (uint64_t VF = 2 * TypeByteSize;1878 VF <= MaxVFWithoutSLForwardIssuesPowerOf2; VF *= 2) {1879 // If the number of vector iteration between the store and the load are1880 // small we could incur conflicts.1881 if (Distance % VF && Distance / VF < NumItersForStoreLoadThroughMemory) {1882 MaxVFWithoutSLForwardIssuesPowerOf2 = (VF >> 1);1883 break;1884 }1885 }1886 1887 if (MaxVFWithoutSLForwardIssuesPowerOf2 < 2 * TypeByteSize) {1888 LLVM_DEBUG(1889 dbgs() << "LAA: Distance " << Distance1890 << " that could cause a store-load forwarding conflict\n");1891 return true;1892 }1893 1894 if (CommonStride &&1895 MaxVFWithoutSLForwardIssuesPowerOf2 <1896 MaxStoreLoadForwardSafeDistanceInBits &&1897 MaxVFWithoutSLForwardIssuesPowerOf2 !=1898 VectorizerParams::MaxVectorWidth * TypeByteSize) {1899 uint64_t MaxVF =1900 bit_floor(MaxVFWithoutSLForwardIssuesPowerOf2 / CommonStride);1901 uint64_t MaxVFInBits = MaxVF * TypeByteSize * 8;1902 MaxStoreLoadForwardSafeDistanceInBits =1903 std::min(MaxStoreLoadForwardSafeDistanceInBits, MaxVFInBits);1904 }1905 return false;1906}1907 1908void MemoryDepChecker::mergeInStatus(VectorizationSafetyStatus S) {1909 if (Status < S)1910 Status = S;1911}1912 1913/// Given a dependence-distance \p Dist between two memory accesses, that have1914/// strides in the same direction whose absolute value of the maximum stride is1915/// given in \p MaxStride, in a loop whose maximum backedge taken count is \p1916/// MaxBTC, check if it is possible to prove statically that the dependence1917/// distance is larger than the range that the accesses will travel through the1918/// execution of the loop. If so, return true; false otherwise. This is useful1919/// for example in loops such as the following (PR31098):1920///1921/// for (i = 0; i < D; ++i) {1922/// = out[i];1923/// out[i+D] =1924/// }1925static bool isSafeDependenceDistance(const DataLayout &DL, ScalarEvolution &SE,1926 const SCEV &MaxBTC, const SCEV &Dist,1927 uint64_t MaxStride) {1928 1929 // If we can prove that1930 // (**) |Dist| > MaxBTC * Step1931 // where Step is the absolute stride of the memory accesses in bytes,1932 // then there is no dependence.1933 //1934 // Rationale:1935 // We basically want to check if the absolute distance (|Dist/Step|)1936 // is >= the loop iteration count (or > MaxBTC).1937 // This is equivalent to the Strong SIV Test (Practical Dependence Testing,1938 // Section 4.2.1); Note, that for vectorization it is sufficient to prove1939 // that the dependence distance is >= VF; This is checked elsewhere.1940 // But in some cases we can prune dependence distances early, and1941 // even before selecting the VF, and without a runtime test, by comparing1942 // the distance against the loop iteration count. Since the vectorized code1943 // will be executed only if LoopCount >= VF, proving distance >= LoopCount1944 // also guarantees that distance >= VF.1945 //1946 const SCEV *Step = SE.getConstant(MaxBTC.getType(), MaxStride);1947 const SCEV *Product = SE.getMulExpr(&MaxBTC, Step);1948 1949 const SCEV *CastedDist = &Dist;1950 const SCEV *CastedProduct = Product;1951 uint64_t DistTypeSizeBits = DL.getTypeSizeInBits(Dist.getType());1952 uint64_t ProductTypeSizeBits = DL.getTypeSizeInBits(Product->getType());1953 1954 // The dependence distance can be positive/negative, so we sign extend Dist;1955 // The multiplication of the absolute stride in bytes and the1956 // backedgeTakenCount is non-negative, so we zero extend Product.1957 if (DistTypeSizeBits > ProductTypeSizeBits)1958 CastedProduct = SE.getZeroExtendExpr(Product, Dist.getType());1959 else1960 CastedDist = SE.getNoopOrSignExtend(&Dist, Product->getType());1961 1962 // Is Dist - (MaxBTC * Step) > 0 ?1963 // (If so, then we have proven (**) because |Dist| >= Dist)1964 const SCEV *Minus = SE.getMinusSCEV(CastedDist, CastedProduct);1965 if (SE.isKnownPositive(Minus))1966 return true;1967 1968 // Second try: Is -Dist - (MaxBTC * Step) > 0 ?1969 // (If so, then we have proven (**) because |Dist| >= -1*Dist)1970 const SCEV *NegDist = SE.getNegativeSCEV(CastedDist);1971 Minus = SE.getMinusSCEV(NegDist, CastedProduct);1972 return SE.isKnownPositive(Minus);1973}1974 1975/// Check the dependence for two accesses with the same stride \p Stride.1976/// \p Distance is the positive distance in bytes, and \p TypeByteSize is type1977/// size in bytes.1978///1979/// \returns true if they are independent.1980static bool areStridedAccessesIndependent(uint64_t Distance, uint64_t Stride,1981 uint64_t TypeByteSize) {1982 assert(Stride > 1 && "The stride must be greater than 1");1983 assert(TypeByteSize > 0 && "The type size in byte must be non-zero");1984 assert(Distance > 0 && "The distance must be non-zero");1985 1986 // Skip if the distance is not multiple of type byte size.1987 if (Distance % TypeByteSize)1988 return false;1989 1990 // No dependence if the distance is not multiple of the stride.1991 // E.g.1992 // for (i = 0; i < 1024 ; i += 4)1993 // A[i+2] = A[i] + 1;1994 //1995 // Two accesses in memory (distance is 2, stride is 4):1996 // | A[0] | | | | A[4] | | | |1997 // | | | A[2] | | | | A[6] | |1998 //1999 // E.g.2000 // for (i = 0; i < 1024 ; i += 3)2001 // A[i+4] = A[i] + 1;2002 //2003 // Two accesses in memory (distance is 4, stride is 3):2004 // | A[0] | | | A[3] | | | A[6] | | |2005 // | | | | | A[4] | | | A[7] | |2006 return Distance % Stride;2007}2008 2009bool MemoryDepChecker::areAccessesCompletelyBeforeOrAfter(const SCEV *Src,2010 Type *SrcTy,2011 const SCEV *Sink,2012 Type *SinkTy) {2013 const SCEV *BTC = PSE.getBackedgeTakenCount();2014 const SCEV *SymbolicMaxBTC = PSE.getSymbolicMaxBackedgeTakenCount();2015 ScalarEvolution &SE = *PSE.getSE();2016 const auto &[SrcStart_, SrcEnd_] =2017 getStartAndEndForAccess(InnermostLoop, Src, SrcTy, BTC, SymbolicMaxBTC,2018 &SE, &PointerBounds, DT, AC, LoopGuards);2019 if (isa<SCEVCouldNotCompute>(SrcStart_) || isa<SCEVCouldNotCompute>(SrcEnd_))2020 return false;2021 2022 const auto &[SinkStart_, SinkEnd_] =2023 getStartAndEndForAccess(InnermostLoop, Sink, SinkTy, BTC, SymbolicMaxBTC,2024 &SE, &PointerBounds, DT, AC, LoopGuards);2025 if (isa<SCEVCouldNotCompute>(SinkStart_) ||2026 isa<SCEVCouldNotCompute>(SinkEnd_))2027 return false;2028 2029 if (!LoopGuards)2030 LoopGuards.emplace(ScalarEvolution::LoopGuards::collect(InnermostLoop, SE));2031 2032 auto SrcEnd = SE.applyLoopGuards(SrcEnd_, *LoopGuards);2033 auto SinkStart = SE.applyLoopGuards(SinkStart_, *LoopGuards);2034 if (SE.isKnownPredicate(CmpInst::ICMP_ULE, SrcEnd, SinkStart))2035 return true;2036 2037 auto SinkEnd = SE.applyLoopGuards(SinkEnd_, *LoopGuards);2038 auto SrcStart = SE.applyLoopGuards(SrcStart_, *LoopGuards);2039 return SE.isKnownPredicate(CmpInst::ICMP_ULE, SinkEnd, SrcStart);2040}2041 2042std::variant<MemoryDepChecker::Dependence::DepType,2043 MemoryDepChecker::DepDistanceStrideAndSizeInfo>2044MemoryDepChecker::getDependenceDistanceStrideAndSize(2045 const AccessAnalysis::MemAccessInfo &A, Instruction *AInst,2046 const AccessAnalysis::MemAccessInfo &B, Instruction *BInst) {2047 const auto &DL = InnermostLoop->getHeader()->getDataLayout();2048 auto &SE = *PSE.getSE();2049 const auto &[APtr, AIsWrite] = A;2050 const auto &[BPtr, BIsWrite] = B;2051 2052 // Two reads are independent.2053 if (!AIsWrite && !BIsWrite)2054 return MemoryDepChecker::Dependence::NoDep;2055 2056 Type *ATy = getLoadStoreType(AInst);2057 Type *BTy = getLoadStoreType(BInst);2058 2059 // We cannot check pointers in different address spaces.2060 if (APtr->getType()->getPointerAddressSpace() !=2061 BPtr->getType()->getPointerAddressSpace())2062 return MemoryDepChecker::Dependence::Unknown;2063 2064 std::optional<int64_t> StrideAPtr = getPtrStride(2065 PSE, ATy, APtr, InnermostLoop, *DT, SymbolicStrides, true, true);2066 std::optional<int64_t> StrideBPtr = getPtrStride(2067 PSE, BTy, BPtr, InnermostLoop, *DT, SymbolicStrides, true, true);2068 2069 const SCEV *Src = PSE.getSCEV(APtr);2070 const SCEV *Sink = PSE.getSCEV(BPtr);2071 2072 // If the induction step is negative we have to invert source and sink of the2073 // dependence when measuring the distance between them. We should not swap2074 // AIsWrite with BIsWrite, as their uses expect them in program order.2075 if (StrideAPtr && *StrideAPtr < 0) {2076 std::swap(Src, Sink);2077 std::swap(AInst, BInst);2078 std::swap(ATy, BTy);2079 std::swap(StrideAPtr, StrideBPtr);2080 }2081 2082 const SCEV *Dist = SE.getMinusSCEV(Sink, Src);2083 2084 LLVM_DEBUG(dbgs() << "LAA: Src Scev: " << *Src << "Sink Scev: " << *Sink2085 << "\n");2086 LLVM_DEBUG(dbgs() << "LAA: Distance for " << *AInst << " to " << *BInst2087 << ": " << *Dist << "\n");2088 2089 // Need accesses with constant strides and the same direction for further2090 // dependence analysis. We don't want to vectorize "A[B[i]] += ..." and2091 // similar code or pointer arithmetic that could wrap in the address space.2092 2093 // If either Src or Sink are not strided (i.e. not a non-wrapping AddRec) and2094 // not loop-invariant (stride will be 0 in that case), we cannot analyze the2095 // dependence further and also cannot generate runtime checks.2096 if (!StrideAPtr || !StrideBPtr) {2097 LLVM_DEBUG(dbgs() << "Pointer access with non-constant stride\n");2098 return MemoryDepChecker::Dependence::IndirectUnsafe;2099 }2100 2101 int64_t StrideAPtrInt = *StrideAPtr;2102 int64_t StrideBPtrInt = *StrideBPtr;2103 LLVM_DEBUG(dbgs() << "LAA: Src induction step: " << StrideAPtrInt2104 << " Sink induction step: " << StrideBPtrInt << "\n");2105 // At least Src or Sink are loop invariant and the other is strided or2106 // invariant. We can generate a runtime check to disambiguate the accesses.2107 if (!StrideAPtrInt || !StrideBPtrInt)2108 return MemoryDepChecker::Dependence::Unknown;2109 2110 // Both Src and Sink have a constant stride, check if they are in the same2111 // direction.2112 if ((StrideAPtrInt > 0) != (StrideBPtrInt > 0)) {2113 LLVM_DEBUG(2114 dbgs() << "Pointer access with strides in different directions\n");2115 return MemoryDepChecker::Dependence::Unknown;2116 }2117 2118 TypeSize AStoreSz = DL.getTypeStoreSize(ATy);2119 TypeSize BStoreSz = DL.getTypeStoreSize(BTy);2120 2121 // If store sizes are not the same, set TypeByteSize to zero, so we can check2122 // it in the caller isDependent.2123 uint64_t ASz = DL.getTypeAllocSize(ATy);2124 uint64_t BSz = DL.getTypeAllocSize(BTy);2125 uint64_t TypeByteSize = (AStoreSz == BStoreSz) ? BSz : 0;2126 2127 uint64_t StrideAScaled = std::abs(StrideAPtrInt) * ASz;2128 uint64_t StrideBScaled = std::abs(StrideBPtrInt) * BSz;2129 2130 uint64_t MaxStride = std::max(StrideAScaled, StrideBScaled);2131 2132 std::optional<uint64_t> CommonStride;2133 if (StrideAScaled == StrideBScaled)2134 CommonStride = StrideAScaled;2135 2136 // TODO: Historically, we didn't retry with runtime checks when (unscaled)2137 // strides were different but there is no inherent reason to.2138 if (!isa<SCEVConstant>(Dist))2139 ShouldRetryWithRuntimeChecks |= StrideAPtrInt == StrideBPtrInt;2140 2141 // If distance is a SCEVCouldNotCompute, return Unknown immediately.2142 if (isa<SCEVCouldNotCompute>(Dist)) {2143 LLVM_DEBUG(dbgs() << "LAA: Uncomputable distance.\n");2144 return Dependence::Unknown;2145 }2146 2147 return DepDistanceStrideAndSizeInfo(Dist, MaxStride, CommonStride,2148 TypeByteSize, AIsWrite, BIsWrite);2149}2150 2151MemoryDepChecker::Dependence::DepType2152MemoryDepChecker::isDependent(const MemAccessInfo &A, unsigned AIdx,2153 const MemAccessInfo &B, unsigned BIdx) {2154 assert(AIdx < BIdx && "Must pass arguments in program order");2155 2156 // Check if we can prove that Sink only accesses memory after Src's end or2157 // vice versa. The helper is used to perform the checks only on the exit paths2158 // where it helps to improve the analysis result.2159 auto CheckCompletelyBeforeOrAfter = [&]() {2160 auto *APtr = A.getPointer();2161 auto *BPtr = B.getPointer();2162 Type *ATy = getLoadStoreType(InstMap[AIdx]);2163 Type *BTy = getLoadStoreType(InstMap[BIdx]);2164 const SCEV *Src = PSE.getSCEV(APtr);2165 const SCEV *Sink = PSE.getSCEV(BPtr);2166 return areAccessesCompletelyBeforeOrAfter(Src, ATy, Sink, BTy);2167 };2168 2169 // Get the dependence distance, stride, type size and what access writes for2170 // the dependence between A and B.2171 auto Res =2172 getDependenceDistanceStrideAndSize(A, InstMap[AIdx], B, InstMap[BIdx]);2173 if (std::holds_alternative<Dependence::DepType>(Res)) {2174 if (std::get<Dependence::DepType>(Res) == Dependence::Unknown &&2175 CheckCompletelyBeforeOrAfter())2176 return Dependence::NoDep;2177 return std::get<Dependence::DepType>(Res);2178 }2179 2180 auto &[Dist, MaxStride, CommonStride, TypeByteSize, AIsWrite, BIsWrite] =2181 std::get<DepDistanceStrideAndSizeInfo>(Res);2182 bool HasSameSize = TypeByteSize > 0;2183 2184 ScalarEvolution &SE = *PSE.getSE();2185 auto &DL = InnermostLoop->getHeader()->getDataLayout();2186 2187 // If the distance between the acecsses is larger than their maximum absolute2188 // stride multiplied by the symbolic maximum backedge taken count (which is an2189 // upper bound of the number of iterations), the accesses are independet, i.e.2190 // they are far enough appart that accesses won't access the same location2191 // across all loop ierations.2192 if (HasSameSize &&2193 isSafeDependenceDistance(2194 DL, SE, *(PSE.getSymbolicMaxBackedgeTakenCount()), *Dist, MaxStride))2195 return Dependence::NoDep;2196 2197 // The rest of this function relies on ConstDist being at most 64-bits, which2198 // is checked earlier. Will assert if the calling code changes.2199 const APInt *APDist = nullptr;2200 uint64_t ConstDist =2201 match(Dist, m_scev_APInt(APDist)) ? APDist->abs().getZExtValue() : 0;2202 2203 // Attempt to prove strided accesses independent.2204 if (APDist) {2205 // If the distance between accesses and their strides are known constants,2206 // check whether the accesses interlace each other.2207 if (ConstDist > 0 && CommonStride && CommonStride > 1 && HasSameSize &&2208 areStridedAccessesIndependent(ConstDist, *CommonStride, TypeByteSize)) {2209 LLVM_DEBUG(dbgs() << "LAA: Strided accesses are independent\n");2210 return Dependence::NoDep;2211 }2212 } else {2213 if (!LoopGuards)2214 LoopGuards.emplace(2215 ScalarEvolution::LoopGuards::collect(InnermostLoop, SE));2216 Dist = SE.applyLoopGuards(Dist, *LoopGuards);2217 }2218 2219 // Negative distances are not plausible dependencies.2220 if (SE.isKnownNonPositive(Dist)) {2221 if (SE.isKnownNonNegative(Dist)) {2222 if (HasSameSize) {2223 // Write to the same location with the same size.2224 return Dependence::Forward;2225 }2226 LLVM_DEBUG(dbgs() << "LAA: possibly zero dependence difference but "2227 "different type sizes\n");2228 return Dependence::Unknown;2229 }2230 2231 bool IsTrueDataDependence = (AIsWrite && !BIsWrite);2232 // Check if the first access writes to a location that is read in a later2233 // iteration, where the distance between them is not a multiple of a vector2234 // factor and relatively small.2235 //2236 // NOTE: There is no need to update MaxSafeVectorWidthInBits after call to2237 // couldPreventStoreLoadForward, even if it changed MinDepDistBytes, since a2238 // forward dependency will allow vectorization using any width.2239 2240 if (IsTrueDataDependence && EnableForwardingConflictDetection) {2241 if (!ConstDist) {2242 return CheckCompletelyBeforeOrAfter() ? Dependence::NoDep2243 : Dependence::Unknown;2244 }2245 if (!HasSameSize ||2246 couldPreventStoreLoadForward(ConstDist, TypeByteSize)) {2247 LLVM_DEBUG(2248 dbgs() << "LAA: Forward but may prevent st->ld forwarding\n");2249 return Dependence::ForwardButPreventsForwarding;2250 }2251 }2252 2253 LLVM_DEBUG(dbgs() << "LAA: Dependence is negative\n");2254 return Dependence::Forward;2255 }2256 2257 int64_t MinDistance = SE.getSignedRangeMin(Dist).getSExtValue();2258 // Below we only handle strictly positive distances.2259 if (MinDistance <= 0) {2260 return CheckCompletelyBeforeOrAfter() ? Dependence::NoDep2261 : Dependence::Unknown;2262 }2263 2264 if (!HasSameSize) {2265 if (CheckCompletelyBeforeOrAfter())2266 return Dependence::NoDep;2267 LLVM_DEBUG(dbgs() << "LAA: ReadWrite-Write positive dependency with "2268 "different type sizes\n");2269 return Dependence::Unknown;2270 }2271 // Bail out early if passed-in parameters make vectorization not feasible.2272 unsigned ForcedFactor = (VectorizerParams::VectorizationFactor ?2273 VectorizerParams::VectorizationFactor : 1);2274 unsigned ForcedUnroll = (VectorizerParams::VectorizationInterleave ?2275 VectorizerParams::VectorizationInterleave : 1);2276 // The minimum number of iterations for a vectorized/unrolled version.2277 unsigned MinNumIter = std::max(ForcedFactor * ForcedUnroll, 2U);2278 2279 // It's not vectorizable if the distance is smaller than the minimum distance2280 // needed for a vectroized/unrolled version. Vectorizing one iteration in2281 // front needs MaxStride. Vectorizing the last iteration needs TypeByteSize.2282 // (No need to plus the last gap distance).2283 //2284 // E.g. Assume one char is 1 byte in memory and one int is 4 bytes.2285 // foo(int *A) {2286 // int *B = (int *)((char *)A + 14);2287 // for (i = 0 ; i < 1024 ; i += 2)2288 // B[i] = A[i] + 1;2289 // }2290 //2291 // Two accesses in memory (stride is 4 * 2):2292 // | A[0] | | A[2] | | A[4] | | A[6] | |2293 // | B[0] | | B[2] | | B[4] |2294 //2295 // MinDistance needs for vectorizing iterations except the last iteration:2296 // 4 * 2 * (MinNumIter - 1). MinDistance needs for the last iteration: 4.2297 // So the minimum distance needed is: 4 * 2 * (MinNumIter - 1) + 4.2298 //2299 // If MinNumIter is 2, it is vectorizable as the minimum distance needed is2300 // 12, which is less than distance.2301 //2302 // If MinNumIter is 4 (Say if a user forces the vectorization factor to be 4),2303 // the minimum distance needed is 28, which is greater than distance. It is2304 // not safe to do vectorization.2305 //2306 // We use MaxStride (maximum of src and sink strides) to get a conservative2307 // lower bound on the MinDistanceNeeded in case of different strides.2308 2309 // We know that Dist is positive, but it may not be constant. Use the signed2310 // minimum for computations below, as this ensures we compute the closest2311 // possible dependence distance.2312 uint64_t MinDistanceNeeded = MaxStride * (MinNumIter - 1) + TypeByteSize;2313 if (MinDistanceNeeded > static_cast<uint64_t>(MinDistance)) {2314 if (!ConstDist) {2315 // For non-constant distances, we checked the lower bound of the2316 // dependence distance and the distance may be larger at runtime (and safe2317 // for vectorization). Classify it as Unknown, so we re-try with runtime2318 // checks, unless we can prove both accesses cannot overlap.2319 return CheckCompletelyBeforeOrAfter() ? Dependence::NoDep2320 : Dependence::Unknown;2321 }2322 LLVM_DEBUG(dbgs() << "LAA: Failure because of positive minimum distance "2323 << MinDistance << '\n');2324 return Dependence::Backward;2325 }2326 2327 // Unsafe if the minimum distance needed is greater than smallest dependence2328 // distance distance.2329 if (MinDistanceNeeded > MinDepDistBytes) {2330 LLVM_DEBUG(dbgs() << "LAA: Failure because it needs at least "2331 << MinDistanceNeeded << " size in bytes\n");2332 return Dependence::Backward;2333 }2334 2335 MinDepDistBytes =2336 std::min(static_cast<uint64_t>(MinDistance), MinDepDistBytes);2337 2338 bool IsTrueDataDependence = (!AIsWrite && BIsWrite);2339 if (IsTrueDataDependence && EnableForwardingConflictDetection && ConstDist &&2340 couldPreventStoreLoadForward(MinDistance, TypeByteSize, *CommonStride))2341 return Dependence::BackwardVectorizableButPreventsForwarding;2342 2343 uint64_t MaxVF = MinDepDistBytes / MaxStride;2344 LLVM_DEBUG(dbgs() << "LAA: Positive min distance " << MinDistance2345 << " with max VF = " << MaxVF << '\n');2346 2347 uint64_t MaxVFInBits = MaxVF * TypeByteSize * 8;2348 if (!ConstDist && MaxVFInBits < MaxTargetVectorWidthInBits) {2349 // For non-constant distances, we checked the lower bound of the dependence2350 // distance and the distance may be larger at runtime (and safe for2351 // vectorization). Classify it as Unknown, so we re-try with runtime checks,2352 // unless we can prove both accesses cannot overlap.2353 return CheckCompletelyBeforeOrAfter() ? Dependence::NoDep2354 : Dependence::Unknown;2355 }2356 2357 if (CheckCompletelyBeforeOrAfter())2358 return Dependence::NoDep;2359 2360 MaxSafeVectorWidthInBits = std::min(MaxSafeVectorWidthInBits, MaxVFInBits);2361 return Dependence::BackwardVectorizable;2362}2363 2364bool MemoryDepChecker::areDepsSafe(const DepCandidates &DepCands,2365 const MemAccessInfoList &CheckDeps) {2366 2367 MinDepDistBytes = -1;2368 SmallPtrSet<MemAccessInfo, 8> Visited;2369 for (MemAccessInfo CurAccess : CheckDeps) {2370 if (Visited.contains(CurAccess))2371 continue;2372 2373 // Check accesses within this set.2374 EquivalenceClasses<MemAccessInfo>::member_iterator AI =2375 DepCands.findLeader(CurAccess);2376 EquivalenceClasses<MemAccessInfo>::member_iterator AE =2377 DepCands.member_end();2378 2379 // Check every access pair.2380 while (AI != AE) {2381 Visited.insert(*AI);2382 bool AIIsWrite = AI->getInt();2383 // Check loads only against next equivalent class, but stores also against2384 // other stores in the same equivalence class - to the same address.2385 EquivalenceClasses<MemAccessInfo>::member_iterator OI =2386 (AIIsWrite ? AI : std::next(AI));2387 while (OI != AE) {2388 // Check every accessing instruction pair in program order.2389 auto &Acc = Accesses[*AI];2390 for (std::vector<unsigned>::iterator I1 = Acc.begin(), I1E = Acc.end();2391 I1 != I1E; ++I1)2392 // Scan all accesses of another equivalence class, but only the next2393 // accesses of the same equivalent class.2394 for (std::vector<unsigned>::iterator2395 I2 = (OI == AI ? std::next(I1) : Accesses[*OI].begin()),2396 I2E = (OI == AI ? I1E : Accesses[*OI].end());2397 I2 != I2E; ++I2) {2398 auto A = std::make_pair(&*AI, *I1);2399 auto B = std::make_pair(&*OI, *I2);2400 2401 assert(*I1 != *I2);2402 if (*I1 > *I2)2403 std::swap(A, B);2404 2405 Dependence::DepType Type =2406 isDependent(*A.first, A.second, *B.first, B.second);2407 mergeInStatus(Dependence::isSafeForVectorization(Type));2408 2409 // Gather dependences unless we accumulated MaxDependences2410 // dependences. In that case return as soon as we find the first2411 // unsafe dependence. This puts a limit on this quadratic2412 // algorithm.2413 if (RecordDependences) {2414 if (Type != Dependence::NoDep)2415 Dependences.emplace_back(A.second, B.second, Type);2416 2417 if (Dependences.size() >= MaxDependences) {2418 RecordDependences = false;2419 Dependences.clear();2420 LLVM_DEBUG(dbgs()2421 << "Too many dependences, stopped recording\n");2422 }2423 }2424 if (!RecordDependences && !isSafeForVectorization())2425 return false;2426 }2427 ++OI;2428 }2429 ++AI;2430 }2431 }2432 2433 LLVM_DEBUG(dbgs() << "Total Dependences: " << Dependences.size() << "\n");2434 return isSafeForVectorization();2435}2436 2437SmallVector<Instruction *, 4>2438MemoryDepChecker::getInstructionsForAccess(Value *Ptr, bool IsWrite) const {2439 MemAccessInfo Access(Ptr, IsWrite);2440 auto I = Accesses.find(Access);2441 SmallVector<Instruction *, 4> Insts;2442 if (I != Accesses.end()) {2443 transform(I->second, std::back_inserter(Insts),2444 [&](unsigned Idx) { return this->InstMap[Idx]; });2445 }2446 2447 return Insts;2448}2449 2450const char *MemoryDepChecker::Dependence::DepName[] = {2451 "NoDep",2452 "Unknown",2453 "IndirectUnsafe",2454 "Forward",2455 "ForwardButPreventsForwarding",2456 "Backward",2457 "BackwardVectorizable",2458 "BackwardVectorizableButPreventsForwarding"};2459 2460void MemoryDepChecker::Dependence::print(2461 raw_ostream &OS, unsigned Depth,2462 const SmallVectorImpl<Instruction *> &Instrs) const {2463 OS.indent(Depth) << DepName[Type] << ":\n";2464 OS.indent(Depth + 2) << *Instrs[Source] << " -> \n";2465 OS.indent(Depth + 2) << *Instrs[Destination] << "\n";2466}2467 2468bool LoopAccessInfo::canAnalyzeLoop() {2469 // We need to have a loop header.2470 LLVM_DEBUG(dbgs() << "\nLAA: Checking a loop in '"2471 << TheLoop->getHeader()->getParent()->getName() << "' from "2472 << TheLoop->getLocStr() << "\n");2473 2474 // We can only analyze innermost loops.2475 if (!TheLoop->isInnermost()) {2476 LLVM_DEBUG(dbgs() << "LAA: loop is not the innermost loop\n");2477 recordAnalysis("NotInnerMostLoop") << "loop is not the innermost loop";2478 return false;2479 }2480 2481 // We must have a single backedge.2482 if (TheLoop->getNumBackEdges() != 1) {2483 LLVM_DEBUG(2484 dbgs() << "LAA: loop control flow is not understood by analyzer\n");2485 recordAnalysis("CFGNotUnderstood")2486 << "loop control flow is not understood by analyzer";2487 return false;2488 }2489 2490 // ScalarEvolution needs to be able to find the symbolic max backedge taken2491 // count, which is an upper bound on the number of loop iterations. The loop2492 // may execute fewer iterations, if it exits via an uncountable exit.2493 const SCEV *ExitCount = PSE->getSymbolicMaxBackedgeTakenCount();2494 if (isa<SCEVCouldNotCompute>(ExitCount)) {2495 recordAnalysis("CantComputeNumberOfIterations")2496 << "could not determine number of loop iterations";2497 LLVM_DEBUG(dbgs() << "LAA: SCEV could not compute the loop exit count.\n");2498 return false;2499 }2500 2501 LLVM_DEBUG(dbgs() << "LAA: Found an analyzable loop: "2502 << TheLoop->getHeader()->getName() << "\n");2503 return true;2504}2505 2506bool LoopAccessInfo::analyzeLoop(AAResults *AA, const LoopInfo *LI,2507 const TargetLibraryInfo *TLI,2508 DominatorTree *DT) {2509 // Holds the Load and Store instructions.2510 SmallVector<LoadInst *, 16> Loads;2511 SmallVector<StoreInst *, 16> Stores;2512 SmallPtrSet<MDNode *, 8> LoopAliasScopes;2513 2514 // Holds all the different accesses in the loop.2515 unsigned NumReads = 0;2516 unsigned NumReadWrites = 0;2517 2518 bool HasComplexMemInst = false;2519 2520 // A runtime check is only legal to insert if there are no convergent calls.2521 HasConvergentOp = false;2522 2523 PtrRtChecking->Pointers.clear();2524 PtrRtChecking->Need = false;2525 2526 const bool IsAnnotatedParallel = TheLoop->isAnnotatedParallel();2527 2528 const bool EnableMemAccessVersioningOfLoop =2529 EnableMemAccessVersioning &&2530 !TheLoop->getHeader()->getParent()->hasOptSize();2531 2532 // Traverse blocks in fixed RPOT order, regardless of their storage in the2533 // loop info, as it may be arbitrary.2534 LoopBlocksRPO RPOT(TheLoop);2535 RPOT.perform(LI);2536 for (BasicBlock *BB : RPOT) {2537 // Scan the BB and collect legal loads and stores. Also detect any2538 // convergent instructions.2539 for (Instruction &I : *BB) {2540 if (auto *Call = dyn_cast<CallBase>(&I)) {2541 if (Call->isConvergent())2542 HasConvergentOp = true;2543 }2544 2545 // With both a non-vectorizable memory instruction and a convergent2546 // operation, found in this loop, no reason to continue the search.2547 if (HasComplexMemInst && HasConvergentOp)2548 return false;2549 2550 // Avoid hitting recordAnalysis multiple times.2551 if (HasComplexMemInst)2552 continue;2553 2554 // Record alias scopes defined inside the loop.2555 if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I))2556 for (Metadata *Op : Decl->getScopeList()->operands())2557 LoopAliasScopes.insert(cast<MDNode>(Op));2558 2559 // Many math library functions read the rounding mode. We will only2560 // vectorize a loop if it contains known function calls that don't set2561 // the flag. Therefore, it is safe to ignore this read from memory.2562 auto *Call = dyn_cast<CallInst>(&I);2563 if (Call && getVectorIntrinsicIDForCall(Call, TLI))2564 continue;2565 2566 // If this is a load, save it. If this instruction can read from memory2567 // but is not a load, we only allow it if it's a call to a function with a2568 // vector mapping and no pointer arguments.2569 if (I.mayReadFromMemory()) {2570 auto hasPointerArgs = [](CallBase *CB) {2571 return any_of(CB->args(), [](Value const *Arg) {2572 return Arg->getType()->isPointerTy();2573 });2574 };2575 2576 // If the function has an explicit vectorized counterpart, and does not2577 // take output/input pointers, we can safely assume that it can be2578 // vectorized.2579 if (Call && !Call->isNoBuiltin() && Call->getCalledFunction() &&2580 !hasPointerArgs(Call) && !VFDatabase::getMappings(*Call).empty())2581 continue;2582 2583 auto *Ld = dyn_cast<LoadInst>(&I);2584 if (!Ld) {2585 recordAnalysis("CantVectorizeInstruction", Ld)2586 << "instruction cannot be vectorized";2587 HasComplexMemInst = true;2588 continue;2589 }2590 if (!Ld->isSimple() && !IsAnnotatedParallel) {2591 recordAnalysis("NonSimpleLoad", Ld)2592 << "read with atomic ordering or volatile read";2593 LLVM_DEBUG(dbgs() << "LAA: Found a non-simple load.\n");2594 HasComplexMemInst = true;2595 continue;2596 }2597 NumLoads++;2598 Loads.push_back(Ld);2599 DepChecker->addAccess(Ld);2600 if (EnableMemAccessVersioningOfLoop)2601 collectStridedAccess(Ld);2602 continue;2603 }2604 2605 // Save 'store' instructions. Abort if other instructions write to memory.2606 if (I.mayWriteToMemory()) {2607 auto *St = dyn_cast<StoreInst>(&I);2608 if (!St) {2609 recordAnalysis("CantVectorizeInstruction", St)2610 << "instruction cannot be vectorized";2611 HasComplexMemInst = true;2612 continue;2613 }2614 if (!St->isSimple() && !IsAnnotatedParallel) {2615 recordAnalysis("NonSimpleStore", St)2616 << "write with atomic ordering or volatile write";2617 LLVM_DEBUG(dbgs() << "LAA: Found a non-simple store.\n");2618 HasComplexMemInst = true;2619 continue;2620 }2621 NumStores++;2622 Stores.push_back(St);2623 DepChecker->addAccess(St);2624 if (EnableMemAccessVersioningOfLoop)2625 collectStridedAccess(St);2626 }2627 } // Next instr.2628 } // Next block.2629 2630 if (HasComplexMemInst)2631 return false;2632 2633 // Now we have two lists that hold the loads and the stores.2634 // Next, we find the pointers that they use.2635 2636 // Check if we see any stores. If there are no stores, then we don't2637 // care if the pointers are *restrict*.2638 if (!Stores.size()) {2639 LLVM_DEBUG(dbgs() << "LAA: Found a read-only loop!\n");2640 return true;2641 }2642 2643 MemoryDepChecker::DepCandidates DepCands;2644 AccessAnalysis Accesses(TheLoop, AA, LI, *DT, DepCands, *PSE,2645 LoopAliasScopes);2646 2647 // Holds the analyzed pointers. We don't want to call getUnderlyingObjects2648 // multiple times on the same object. If the ptr is accessed twice, once2649 // for read and once for write, it will only appear once (on the write2650 // list). This is okay, since we are going to check for conflicts between2651 // writes and between reads and writes, but not between reads and reads.2652 SmallSet<std::pair<Value *, Type *>, 16> Seen;2653 2654 // Record uniform store addresses to identify if we have multiple stores2655 // to the same address.2656 SmallPtrSet<Value *, 16> UniformStores;2657 2658 for (StoreInst *ST : Stores) {2659 Value *Ptr = ST->getPointerOperand();2660 2661 if (isInvariant(Ptr)) {2662 // Record store instructions to loop invariant addresses2663 StoresToInvariantAddresses.push_back(ST);2664 HasStoreStoreDependenceInvolvingLoopInvariantAddress |=2665 !UniformStores.insert(Ptr).second;2666 }2667 2668 // If we did *not* see this pointer before, insert it to the read-write2669 // list. At this phase it is only a 'write' list.2670 Type *AccessTy = getLoadStoreType(ST);2671 if (Seen.insert({Ptr, AccessTy}).second) {2672 ++NumReadWrites;2673 2674 MemoryLocation Loc = MemoryLocation::get(ST);2675 // The TBAA metadata could have a control dependency on the predication2676 // condition, so we cannot rely on it when determining whether or not we2677 // need runtime pointer checks.2678 if (blockNeedsPredication(ST->getParent(), TheLoop, DT))2679 Loc.AATags.TBAA = nullptr;2680 2681 visitPointers(const_cast<Value *>(Loc.Ptr), *TheLoop,2682 [&Accesses, AccessTy, Loc](Value *Ptr) {2683 MemoryLocation NewLoc = Loc.getWithNewPtr(Ptr);2684 Accesses.addStore(NewLoc, AccessTy);2685 });2686 }2687 }2688 2689 if (IsAnnotatedParallel) {2690 LLVM_DEBUG(2691 dbgs() << "LAA: A loop annotated parallel, ignore memory dependency "2692 << "checks.\n");2693 return true;2694 }2695 2696 for (LoadInst *LD : Loads) {2697 Value *Ptr = LD->getPointerOperand();2698 // If we did *not* see this pointer before, insert it to the2699 // read list. If we *did* see it before, then it is already in2700 // the read-write list. This allows us to vectorize expressions2701 // such as A[i] += x; Because the address of A[i] is a read-write2702 // pointer. This only works if the index of A[i] is consecutive.2703 // If the address of i is unknown (for example A[B[i]]) then we may2704 // read a few words, modify, and write a few words, and some of the2705 // words may be written to the same address.2706 bool IsReadOnlyPtr = false;2707 Type *AccessTy = getLoadStoreType(LD);2708 if (Seen.insert({Ptr, AccessTy}).second ||2709 !getPtrStride(*PSE, AccessTy, Ptr, TheLoop, *DT, SymbolicStrides, false,2710 true)) {2711 ++NumReads;2712 IsReadOnlyPtr = true;2713 }2714 2715 // See if there is an unsafe dependency between a load to a uniform address and2716 // store to the same uniform address.2717 if (UniformStores.contains(Ptr)) {2718 LLVM_DEBUG(dbgs() << "LAA: Found an unsafe dependency between a uniform "2719 "load and uniform store to the same address!\n");2720 HasLoadStoreDependenceInvolvingLoopInvariantAddress = true;2721 }2722 2723 MemoryLocation Loc = MemoryLocation::get(LD);2724 // The TBAA metadata could have a control dependency on the predication2725 // condition, so we cannot rely on it when determining whether or not we2726 // need runtime pointer checks.2727 if (blockNeedsPredication(LD->getParent(), TheLoop, DT))2728 Loc.AATags.TBAA = nullptr;2729 2730 visitPointers(const_cast<Value *>(Loc.Ptr), *TheLoop,2731 [&Accesses, AccessTy, Loc, IsReadOnlyPtr](Value *Ptr) {2732 MemoryLocation NewLoc = Loc.getWithNewPtr(Ptr);2733 Accesses.addLoad(NewLoc, AccessTy, IsReadOnlyPtr);2734 });2735 }2736 2737 // If we write (or read-write) to a single destination and there are no2738 // other reads in this loop then is it safe to vectorize.2739 if (NumReadWrites == 1 && NumReads == 0) {2740 LLVM_DEBUG(dbgs() << "LAA: Found a write-only loop!\n");2741 return true;2742 }2743 2744 // Build dependence sets and check whether we need a runtime pointer bounds2745 // check.2746 Accesses.buildDependenceSets();2747 2748 // Find pointers with computable bounds. We are going to use this information2749 // to place a runtime bound check.2750 Value *UncomputablePtr = nullptr;2751 HasCompletePtrRtChecking = Accesses.canCheckPtrAtRT(2752 *PtrRtChecking, TheLoop, SymbolicStrides, UncomputablePtr, AllowPartial);2753 if (!HasCompletePtrRtChecking) {2754 const auto *I = dyn_cast_or_null<Instruction>(UncomputablePtr);2755 recordAnalysis("CantIdentifyArrayBounds", I)2756 << "cannot identify array bounds";2757 LLVM_DEBUG(dbgs() << "LAA: We can't vectorize because we can't find "2758 << "the array bounds.\n");2759 return false;2760 }2761 2762 LLVM_DEBUG(2763 dbgs() << "LAA: May be able to perform a memory runtime check if needed.\n");2764 2765 bool DepsAreSafe = true;2766 if (Accesses.isDependencyCheckNeeded()) {2767 LLVM_DEBUG(dbgs() << "LAA: Checking memory dependencies\n");2768 DepsAreSafe =2769 DepChecker->areDepsSafe(DepCands, Accesses.getDependenciesToCheck());2770 2771 if (!DepsAreSafe && DepChecker->shouldRetryWithRuntimeChecks()) {2772 LLVM_DEBUG(dbgs() << "LAA: Retrying with memory checks\n");2773 2774 // Clear the dependency checks. We assume they are not needed.2775 Accesses.resetDepChecks(*DepChecker);2776 2777 PtrRtChecking->reset();2778 PtrRtChecking->Need = true;2779 2780 UncomputablePtr = nullptr;2781 HasCompletePtrRtChecking =2782 Accesses.canCheckPtrAtRT(*PtrRtChecking, TheLoop, SymbolicStrides,2783 UncomputablePtr, AllowPartial);2784 2785 // Check that we found the bounds for the pointer.2786 if (!HasCompletePtrRtChecking) {2787 auto *I = dyn_cast_or_null<Instruction>(UncomputablePtr);2788 recordAnalysis("CantCheckMemDepsAtRunTime", I)2789 << "cannot check memory dependencies at runtime";2790 LLVM_DEBUG(dbgs() << "LAA: Can't vectorize with memory checks\n");2791 return false;2792 }2793 DepsAreSafe = true;2794 }2795 }2796 2797 if (HasConvergentOp) {2798 recordAnalysis("CantInsertRuntimeCheckWithConvergent")2799 << "cannot add control dependency to convergent operation";2800 LLVM_DEBUG(dbgs() << "LAA: We can't vectorize because a runtime check "2801 "would be needed with a convergent operation\n");2802 return false;2803 }2804 2805 if (DepsAreSafe) {2806 LLVM_DEBUG(2807 dbgs() << "LAA: No unsafe dependent memory operations in loop. We"2808 << (PtrRtChecking->Need ? "" : " don't")2809 << " need runtime memory checks.\n");2810 return true;2811 }2812 2813 emitUnsafeDependenceRemark();2814 return false;2815}2816 2817void LoopAccessInfo::emitUnsafeDependenceRemark() {2818 const auto *Deps = getDepChecker().getDependences();2819 if (!Deps)2820 return;2821 const auto *Found =2822 llvm::find_if(*Deps, [](const MemoryDepChecker::Dependence &D) {2823 return MemoryDepChecker::Dependence::isSafeForVectorization(D.Type) !=2824 MemoryDepChecker::VectorizationSafetyStatus::Safe;2825 });2826 if (Found == Deps->end())2827 return;2828 MemoryDepChecker::Dependence Dep = *Found;2829 2830 LLVM_DEBUG(dbgs() << "LAA: unsafe dependent memory operations in loop\n");2831 2832 // Emit remark for first unsafe dependence2833 bool HasForcedDistribution = false;2834 std::optional<const MDOperand *> Value =2835 findStringMetadataForLoop(TheLoop, "llvm.loop.distribute.enable");2836 if (Value) {2837 const MDOperand *Op = *Value;2838 assert(Op && mdconst::hasa<ConstantInt>(*Op) && "invalid metadata");2839 HasForcedDistribution = mdconst::extract<ConstantInt>(*Op)->getZExtValue();2840 }2841 2842 const std::string Info =2843 HasForcedDistribution2844 ? "unsafe dependent memory operations in loop."2845 : "unsafe dependent memory operations in loop. Use "2846 "#pragma clang loop distribute(enable) to allow loop distribution "2847 "to attempt to isolate the offending operations into a separate "2848 "loop";2849 OptimizationRemarkAnalysis &R =2850 recordAnalysis("UnsafeDep", Dep.getDestination(getDepChecker())) << Info;2851 2852 switch (Dep.Type) {2853 case MemoryDepChecker::Dependence::NoDep:2854 case MemoryDepChecker::Dependence::Forward:2855 case MemoryDepChecker::Dependence::BackwardVectorizable:2856 llvm_unreachable("Unexpected dependence");2857 case MemoryDepChecker::Dependence::Backward:2858 R << "\nBackward loop carried data dependence.";2859 break;2860 case MemoryDepChecker::Dependence::ForwardButPreventsForwarding:2861 R << "\nForward loop carried data dependence that prevents "2862 "store-to-load forwarding.";2863 break;2864 case MemoryDepChecker::Dependence::BackwardVectorizableButPreventsForwarding:2865 R << "\nBackward loop carried data dependence that prevents "2866 "store-to-load forwarding.";2867 break;2868 case MemoryDepChecker::Dependence::IndirectUnsafe:2869 R << "\nUnsafe indirect dependence.";2870 break;2871 case MemoryDepChecker::Dependence::Unknown:2872 R << "\nUnknown data dependence.";2873 break;2874 }2875 2876 if (Instruction *I = Dep.getSource(getDepChecker())) {2877 DebugLoc SourceLoc = I->getDebugLoc();2878 if (auto *DD = dyn_cast_or_null<Instruction>(getPointerOperand(I)))2879 SourceLoc = DD->getDebugLoc();2880 if (SourceLoc)2881 R << " Memory location is the same as accessed at "2882 << ore::NV("Location", SourceLoc);2883 }2884}2885 2886bool LoopAccessInfo::blockNeedsPredication(const BasicBlock *BB,2887 const Loop *TheLoop,2888 const DominatorTree *DT) {2889 assert(TheLoop->contains(BB) && "Unknown block used");2890 2891 // Blocks that do not dominate the latch need predication.2892 const BasicBlock *Latch = TheLoop->getLoopLatch();2893 return !DT->dominates(BB, Latch);2894}2895 2896OptimizationRemarkAnalysis &2897LoopAccessInfo::recordAnalysis(StringRef RemarkName, const Instruction *I) {2898 assert(!Report && "Multiple reports generated");2899 2900 const BasicBlock *CodeRegion = TheLoop->getHeader();2901 DebugLoc DL = TheLoop->getStartLoc();2902 2903 if (I) {2904 CodeRegion = I->getParent();2905 // If there is no debug location attached to the instruction, revert back to2906 // using the loop's.2907 if (I->getDebugLoc())2908 DL = I->getDebugLoc();2909 }2910 2911 Report = std::make_unique<OptimizationRemarkAnalysis>(DEBUG_TYPE, RemarkName,2912 DL, CodeRegion);2913 return *Report;2914}2915 2916bool LoopAccessInfo::isInvariant(Value *V) const {2917 auto *SE = PSE->getSE();2918 if (TheLoop->isLoopInvariant(V))2919 return true;2920 if (!SE->isSCEVable(V->getType()))2921 return false;2922 const SCEV *S = SE->getSCEV(V);2923 return SE->isLoopInvariant(S, TheLoop);2924}2925 2926/// If \p Ptr is a GEP, which has a loop-variant operand, return that operand.2927/// Otherwise, return \p Ptr.2928static Value *getLoopVariantGEPOperand(Value *Ptr, ScalarEvolution *SE,2929 Loop *Lp) {2930 auto *GEP = dyn_cast<GetElementPtrInst>(Ptr);2931 if (!GEP)2932 return Ptr;2933 2934 Value *V = Ptr;2935 for (const Use &U : GEP->operands()) {2936 if (!SE->isLoopInvariant(SE->getSCEV(U), Lp)) {2937 if (V == Ptr)2938 V = U;2939 else2940 // There must be exactly one loop-variant operand.2941 return Ptr;2942 }2943 }2944 return V;2945}2946 2947/// Get the stride of a pointer access in a loop. Looks for symbolic2948/// strides "a[i*stride]". Returns the symbolic stride, or null otherwise.2949static const SCEV *getStrideFromPointer(Value *Ptr, ScalarEvolution *SE, Loop *Lp) {2950 auto *PtrTy = dyn_cast<PointerType>(Ptr->getType());2951 if (!PtrTy)2952 return nullptr;2953 2954 // Try to remove a gep instruction to make the pointer (actually index at this2955 // point) easier analyzable. If OrigPtr is equal to Ptr we are analyzing the2956 // pointer, otherwise, we are analyzing the index.2957 Value *OrigPtr = Ptr;2958 2959 Ptr = getLoopVariantGEPOperand(Ptr, SE, Lp);2960 const SCEV *V = SE->getSCEV(Ptr);2961 2962 if (Ptr != OrigPtr)2963 // Strip off casts.2964 while (auto *C = dyn_cast<SCEVIntegralCastExpr>(V))2965 V = C->getOperand();2966 2967 if (!match(V, m_scev_AffineAddRec(m_SCEV(), m_SCEV(V), m_SpecificLoop(Lp))))2968 return nullptr;2969 2970 // Note that the restriction after this loop invariant check are only2971 // profitability restrictions.2972 if (!SE->isLoopInvariant(V, Lp))2973 return nullptr;2974 2975 // Look for the loop invariant symbolic value.2976 if (isa<SCEVUnknown>(V))2977 return V;2978 2979 if (auto *C = dyn_cast<SCEVIntegralCastExpr>(V))2980 if (isa<SCEVUnknown>(C->getOperand()))2981 return V;2982 2983 return nullptr;2984}2985 2986void LoopAccessInfo::collectStridedAccess(Value *MemAccess) {2987 Value *Ptr = getLoadStorePointerOperand(MemAccess);2988 if (!Ptr)2989 return;2990 2991 // Note: getStrideFromPointer is a *profitability* heuristic. We2992 // could broaden the scope of values returned here - to anything2993 // which happens to be loop invariant and contributes to the2994 // computation of an interesting IV - but we chose not to as we2995 // don't have a cost model here, and broadening the scope exposes2996 // far too many unprofitable cases.2997 const SCEV *StrideExpr = getStrideFromPointer(Ptr, PSE->getSE(), TheLoop);2998 if (!StrideExpr)2999 return;3000 3001 if (auto *Unknown = dyn_cast<SCEVUnknown>(StrideExpr))3002 if (isa<UndefValue>(Unknown->getValue()))3003 return;3004 3005 LLVM_DEBUG(dbgs() << "LAA: Found a strided access that is a candidate for "3006 "versioning:");3007 LLVM_DEBUG(dbgs() << " Ptr: " << *Ptr << " Stride: " << *StrideExpr << "\n");3008 3009 if (!SpeculateUnitStride) {3010 LLVM_DEBUG(dbgs() << " Chose not to due to -laa-speculate-unit-stride\n");3011 return;3012 }3013 3014 // Avoid adding the "Stride == 1" predicate when we know that3015 // Stride >= Trip-Count. Such a predicate will effectively optimize a single3016 // or zero iteration loop, as Trip-Count <= Stride == 1.3017 //3018 // TODO: We are currently not making a very informed decision on when it is3019 // beneficial to apply stride versioning. It might make more sense that the3020 // users of this analysis (such as the vectorizer) will trigger it, based on3021 // their specific cost considerations; For example, in cases where stride3022 // versioning does not help resolving memory accesses/dependences, the3023 // vectorizer should evaluate the cost of the runtime test, and the benefit3024 // of various possible stride specializations, considering the alternatives3025 // of using gather/scatters (if available).3026 3027 const SCEV *MaxBTC = PSE->getSymbolicMaxBackedgeTakenCount();3028 3029 // Match the types so we can compare the stride and the MaxBTC.3030 // The Stride can be positive/negative, so we sign extend Stride;3031 // The backedgeTakenCount is non-negative, so we zero extend MaxBTC.3032 const DataLayout &DL = TheLoop->getHeader()->getDataLayout();3033 uint64_t StrideTypeSizeBits = DL.getTypeSizeInBits(StrideExpr->getType());3034 uint64_t BETypeSizeBits = DL.getTypeSizeInBits(MaxBTC->getType());3035 const SCEV *CastedStride = StrideExpr;3036 const SCEV *CastedBECount = MaxBTC;3037 ScalarEvolution *SE = PSE->getSE();3038 if (BETypeSizeBits >= StrideTypeSizeBits)3039 CastedStride = SE->getNoopOrSignExtend(StrideExpr, MaxBTC->getType());3040 else3041 CastedBECount = SE->getZeroExtendExpr(MaxBTC, StrideExpr->getType());3042 const SCEV *StrideMinusBETaken = SE->getMinusSCEV(CastedStride, CastedBECount);3043 // Since TripCount == BackEdgeTakenCount + 1, checking:3044 // "Stride >= TripCount" is equivalent to checking:3045 // Stride - MaxBTC> 03046 if (SE->isKnownPositive(StrideMinusBETaken)) {3047 LLVM_DEBUG(3048 dbgs() << "LAA: Stride>=TripCount; No point in versioning as the "3049 "Stride==1 predicate will imply that the loop executes "3050 "at most once.\n");3051 return;3052 }3053 LLVM_DEBUG(dbgs() << "LAA: Found a strided access that we can version.\n");3054 3055 // Strip back off the integer cast, and check that our result is a3056 // SCEVUnknown as we expect.3057 const SCEV *StrideBase = StrideExpr;3058 if (const auto *C = dyn_cast<SCEVIntegralCastExpr>(StrideBase))3059 StrideBase = C->getOperand();3060 SymbolicStrides[Ptr] = cast<SCEVUnknown>(StrideBase);3061}3062 3063LoopAccessInfo::LoopAccessInfo(Loop *L, ScalarEvolution *SE,3064 const TargetTransformInfo *TTI,3065 const TargetLibraryInfo *TLI, AAResults *AA,3066 DominatorTree *DT, LoopInfo *LI,3067 AssumptionCache *AC, bool AllowPartial)3068 : PSE(std::make_unique<PredicatedScalarEvolution>(*SE, *L)),3069 PtrRtChecking(nullptr), TheLoop(L), AllowPartial(AllowPartial) {3070 unsigned MaxTargetVectorWidthInBits = std::numeric_limits<unsigned>::max();3071 if (TTI && !TTI->enableScalableVectorization())3072 // Scale the vector width by 2 as rough estimate to also consider3073 // interleaving.3074 MaxTargetVectorWidthInBits =3075 TTI->getRegisterBitWidth(TargetTransformInfo::RGK_FixedWidthVector) * 2;3076 3077 DepChecker = std::make_unique<MemoryDepChecker>(3078 *PSE, AC, DT, L, SymbolicStrides, MaxTargetVectorWidthInBits, LoopGuards);3079 PtrRtChecking =3080 std::make_unique<RuntimePointerChecking>(*DepChecker, SE, LoopGuards);3081 if (canAnalyzeLoop())3082 CanVecMem = analyzeLoop(AA, LI, TLI, DT);3083}3084 3085void LoopAccessInfo::print(raw_ostream &OS, unsigned Depth) const {3086 if (CanVecMem) {3087 OS.indent(Depth) << "Memory dependences are safe";3088 const MemoryDepChecker &DC = getDepChecker();3089 if (!DC.isSafeForAnyVectorWidth())3090 OS << " with a maximum safe vector width of "3091 << DC.getMaxSafeVectorWidthInBits() << " bits";3092 if (!DC.isSafeForAnyStoreLoadForwardDistances()) {3093 uint64_t SLDist = DC.getStoreLoadForwardSafeDistanceInBits();3094 OS << ", with a maximum safe store-load forward width of " << SLDist3095 << " bits";3096 }3097 if (PtrRtChecking->Need)3098 OS << " with run-time checks";3099 OS << "\n";3100 }3101 3102 if (HasConvergentOp)3103 OS.indent(Depth) << "Has convergent operation in loop\n";3104 3105 if (Report)3106 OS.indent(Depth) << "Report: " << Report->getMsg() << "\n";3107 3108 if (auto *Dependences = DepChecker->getDependences()) {3109 OS.indent(Depth) << "Dependences:\n";3110 for (const auto &Dep : *Dependences) {3111 Dep.print(OS, Depth + 2, DepChecker->getMemoryInstructions());3112 OS << "\n";3113 }3114 } else3115 OS.indent(Depth) << "Too many dependences, not recorded\n";3116 3117 // List the pair of accesses need run-time checks to prove independence.3118 PtrRtChecking->print(OS, Depth);3119 if (PtrRtChecking->Need && !HasCompletePtrRtChecking)3120 OS.indent(Depth) << "Generated run-time checks are incomplete\n";3121 OS << "\n";3122 3123 OS.indent(Depth)3124 << "Non vectorizable stores to invariant address were "3125 << (HasStoreStoreDependenceInvolvingLoopInvariantAddress ||3126 HasLoadStoreDependenceInvolvingLoopInvariantAddress3127 ? ""3128 : "not ")3129 << "found in loop.\n";3130 3131 OS.indent(Depth) << "SCEV assumptions:\n";3132 PSE->getPredicate().print(OS, Depth);3133 3134 OS << "\n";3135 3136 OS.indent(Depth) << "Expressions re-written:\n";3137 PSE->print(OS, Depth);3138}3139 3140const LoopAccessInfo &LoopAccessInfoManager::getInfo(Loop &L,3141 bool AllowPartial) {3142 const auto &[It, Inserted] = LoopAccessInfoMap.try_emplace(&L);3143 3144 // We need to create the LoopAccessInfo if either we don't already have one,3145 // or if it was created with a different value of AllowPartial.3146 if (Inserted || It->second->hasAllowPartial() != AllowPartial)3147 It->second = std::make_unique<LoopAccessInfo>(&L, &SE, TTI, TLI, &AA, &DT,3148 &LI, AC, AllowPartial);3149 3150 return *It->second;3151}3152void LoopAccessInfoManager::clear() {3153 // Collect LoopAccessInfo entries that may keep references to IR outside the3154 // analyzed loop or SCEVs that may have been modified or invalidated. At the3155 // moment, that is loops requiring memory or SCEV runtime checks, as those cache3156 // SCEVs, e.g. for pointer expressions.3157 for (const auto &[L, LAI] : LoopAccessInfoMap) {3158 if (LAI->getRuntimePointerChecking()->getChecks().empty() &&3159 LAI->getPSE().getPredicate().isAlwaysTrue())3160 continue;3161 LoopAccessInfoMap.erase(L);3162 }3163}3164 3165bool LoopAccessInfoManager::invalidate(3166 Function &F, const PreservedAnalyses &PA,3167 FunctionAnalysisManager::Invalidator &Inv) {3168 // Check whether our analysis is preserved.3169 auto PAC = PA.getChecker<LoopAccessAnalysis>();3170 if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>())3171 // If not, give up now.3172 return true;3173 3174 // Check whether the analyses we depend on became invalid for any reason.3175 // Skip checking TargetLibraryAnalysis as it is immutable and can't become3176 // invalid.3177 return Inv.invalidate<AAManager>(F, PA) ||3178 Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) ||3179 Inv.invalidate<LoopAnalysis>(F, PA) ||3180 Inv.invalidate<DominatorTreeAnalysis>(F, PA);3181}3182 3183LoopAccessInfoManager LoopAccessAnalysis::run(Function &F,3184 FunctionAnalysisManager &FAM) {3185 auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F);3186 auto &AA = FAM.getResult<AAManager>(F);3187 auto &DT = FAM.getResult<DominatorTreeAnalysis>(F);3188 auto &LI = FAM.getResult<LoopAnalysis>(F);3189 auto &TTI = FAM.getResult<TargetIRAnalysis>(F);3190 auto &TLI = FAM.getResult<TargetLibraryAnalysis>(F);3191 auto &AC = FAM.getResult<AssumptionAnalysis>(F);3192 return LoopAccessInfoManager(SE, AA, DT, LI, &TTI, &TLI, &AC);3193}3194 3195AnalysisKey LoopAccessAnalysis::Key;3196