LLVM 24.0.0git
LoopAccessAnalysis.cpp
Go to the documentation of this file.
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// The implementation for the loop memory dependence that was originally
10// developed for the loop vectorizer.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/APInt.h"
16#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/SetVector.h"
22#include "llvm/ADT/SmallSet.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"
46#include "llvm/IR/Dominators.h"
47#include "llvm/IR/Function.h"
48#include "llvm/IR/InstrTypes.h"
49#include "llvm/IR/Instruction.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"
58#include "llvm/Support/Debug.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
75 VectorizationFactor("force-vector-width", cl::Hidden,
76 cl::desc("Sets the SIMD width. Zero is autoselect."),
79
81VectorizationInterleave("force-vector-interleave", cl::Hidden,
82 cl::desc("Sets the vectorization interleave count. "
83 "Zero is autoselect."),
87
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)."),
94
95/// The maximum iterations used to merge memory checks
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.
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 memory
113/// 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 to
118/// if (Stride1 == 1 && Stride2 == 1) {
119/// for (i = 0; i < N; i+=4)
120/// A[i:i+3] += ...
121/// } else
122/// ...
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 can
128/// be disabled for correctness testing.
130 "store-to-load-forwarding-conflict-detection", cl::Hidden,
131 cl::desc("Enable conflict detection in loop-access analysis"),
132 cl::init(true));
133
135 "max-forked-scev-depth", cl::Hidden,
136 cl::desc("Maximum recursion depth when finding forked SCEVs (default = 5)"),
137 cl::init(5));
138
140 "laa-speculate-unit-stride", cl::Hidden,
141 cl::desc("Speculate that non-constant strides are unit in LAA"),
142 cl::init(true));
143
145 "hoist-runtime-checks", cl::Hidden,
146 cl::desc(
147 "Hoist inner loop runtime memory checks to outer loop if possible"),
150
152 return ::VectorizationInterleave.getNumOccurrences() > 0;
153}
154
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 the
161 // 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 actual
168 // invariant here is that StrideSCEV should be loop invariant. The only
169 // such invariant strides we happen to speculate right now are unknowns
170 // 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: " << *OrigSCEV
179 << " by: " << *Expr << "\n");
180 return Expr;
181}
182
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()
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. Otherwise
194/// 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. Otherwise
203/// return nullptr. \p A and \p B must have the same type.
204static const SCEV *mulSCEVNoOverflow(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 at
212/// \p MaxBTC is guaranteed inbounds of the accessed object.
214 const SCEVAddRecExpr *AR, const SCEV *MaxBTC, const SCEV *EltSize,
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;
224 Value *StartPtrV = StartPtr->getValue();
225 // We can ignore frees, as the fact that an object of a certain size existed
226 // at the location *at some point* is sufficient to derive the nowrap fact.
227 uint64_t DerefBytes = StartPtrV->getPointerDereferenceableBytes(
228 DL, CheckForNonNull, /*CanBeFreed=*/nullptr);
229
230 // If the deref size is only known when the pointer is non-null, ignore it
231 // here and fall back to a dereferenceable assumption below.
232 if (DerefBytes && CheckForNonNull)
233 DerefBytes = 0;
234
235 const SCEV *Step = AR->getStepRecurrence(SE);
236 Type *WiderTy = SE.getWiderType(MaxBTC->getType(), Step->getType());
237 const SCEV *DerefBytesSCEV = SE.getConstant(WiderTy, DerefBytes);
238
239 // Check if we have a suitable dereferencable assumption we can use.
240 Instruction *CtxI = &*L->getHeader()->getFirstNonPHIIt();
241 if (BasicBlock *LoopPred = L->getLoopPredecessor()) {
242 if (isa<UncondBrInst, CondBrInst>(LoopPred->getTerminator()))
243 CtxI = LoopPred->getTerminator();
244 }
246 StartPtrV, Attribute::Dereferenceable, *AC,
247 [&](RetainedKnowledge RK, Instruction *Assume, auto) {
248 if (!isValidAssumeForContext(Assume, CtxI, DT))
249 return false;
250 const SCEV *DerefRKSCEV = SE.getSCEV(RK.IRArgValue);
251 Type *CommonTy =
252 SE.getWiderType(DerefBytesSCEV->getType(), DerefRKSCEV->getType());
253 DerefBytesSCEV = SE.getNoopOrZeroExtend(DerefBytesSCEV, CommonTy);
254 DerefRKSCEV = SE.getNoopOrZeroExtend(DerefRKSCEV, CommonTy);
255 DerefBytesSCEV = SE.getUMaxExpr(DerefBytesSCEV, DerefRKSCEV);
256 // Continue with other assumptions.
257 return false;
258 });
259
260 if (DerefBytesSCEV->isZero())
261 return false;
262
263 bool IsKnownNonNegative = SE.isKnownNonNegative(Step);
264 if (!IsKnownNonNegative && !SE.isKnownNegative(Step))
265 return false;
266
267 Step = SE.getNoopOrSignExtend(Step, WiderTy);
268 MaxBTC = SE.getNoopOrZeroExtend(MaxBTC, WiderTy);
269
270 // For the computations below, make sure they don't unsigned wrap.
271 if (!SE.isKnownPredicate(CmpInst::ICMP_UGE, AR->getStart(), StartPtr))
272 return false;
273 const SCEV *StartOffset = SE.getNoopOrZeroExtend(
274 SE.getMinusSCEV(AR->getStart(), StartPtr), WiderTy);
275
276 if (!LoopGuards)
277 LoopGuards.emplace(ScalarEvolution::LoopGuards::collect(AR->getLoop(), SE));
278 MaxBTC = SE.applyLoopGuards(MaxBTC, *LoopGuards);
279
280 const SCEV *OffsetAtLastIter =
281 mulSCEVNoOverflow(MaxBTC, SE.getAbsExpr(Step, /*IsNSW=*/false), SE);
282 if (!OffsetAtLastIter) {
283 // Re-try with constant max backedge-taken count if using the symbolic one
284 // failed.
285 MaxBTC = SE.getConstantMaxBackedgeTakenCount(AR->getLoop());
286 if (isa<SCEVCouldNotCompute>(MaxBTC))
287 return false;
288 MaxBTC = SE.getNoopOrZeroExtend(
289 MaxBTC, WiderTy);
290 OffsetAtLastIter =
291 mulSCEVNoOverflow(MaxBTC, SE.getAbsExpr(Step, /*IsNSW=*/false), SE);
292 if (!OffsetAtLastIter)
293 return false;
294 }
295
296 const SCEV *OffsetEndBytes = addSCEVNoOverflow(
297 OffsetAtLastIter, SE.getNoopOrZeroExtend(EltSize, WiderTy), SE);
298 if (!OffsetEndBytes)
299 return false;
300
301 if (IsKnownNonNegative) {
302 // For positive steps, check if
303 // (AR->getStart() - StartPtr) + (MaxBTC * Step) + EltSize <= DerefBytes,
304 // while making sure none of the computations unsigned wrap themselves.
305 const SCEV *EndBytes = addSCEVNoOverflow(StartOffset, OffsetEndBytes, SE);
306 if (!EndBytes)
307 return false;
308
309 DerefBytesSCEV = SE.applyLoopGuards(DerefBytesSCEV, *LoopGuards);
310 return SE.isKnownPredicate(CmpInst::ICMP_ULE, EndBytes, DerefBytesSCEV);
311 }
312
313 // For negative steps check if
314 // * StartOffset >= (MaxBTC * Step + EltSize)
315 // * StartOffset <= DerefBytes.
316 assert(SE.isKnownNegative(Step) && "must be known negative");
317 return SE.isKnownPredicate(CmpInst::ICMP_SGE, StartOffset, OffsetEndBytes) &&
318 SE.isKnownPredicate(CmpInst::ICMP_ULE, StartOffset, DerefBytesSCEV);
319}
320
321std::pair<const SCEV *, const SCEV *> llvm::getStartAndEndForAccess(
322 const Loop *Lp, const SCEV *PtrExpr, Type *AccessTy, const SCEV *BTC,
323 const SCEV *MaxBTC, ScalarEvolution *SE,
324 DenseMap<std::pair<const SCEV *, const SCEV *>,
325 std::pair<const SCEV *, const SCEV *>> *PointerBounds,
327 std::optional<ScalarEvolution::LoopGuards> &LoopGuards) {
328 auto &DL = Lp->getHeader()->getDataLayout();
329 Type *IdxTy = DL.getIndexType(PtrExpr->getType());
330 const SCEV *EltSizeSCEV = SE->getStoreSizeOfExpr(IdxTy, AccessTy);
331
332 // Delegate to the SCEV-based overload, passing through the cache.
333 return getStartAndEndForAccess(Lp, PtrExpr, EltSizeSCEV, BTC, MaxBTC, SE,
334 PointerBounds, DT, AC, LoopGuards);
335}
336
337std::pair<const SCEV *, const SCEV *> llvm::getStartAndEndForAccess(
338 const Loop *Lp, const SCEV *PtrExpr, const SCEV *EltSizeSCEV,
339 const SCEV *BTC, const SCEV *MaxBTC, ScalarEvolution *SE,
340 DenseMap<std::pair<const SCEV *, const SCEV *>,
341 std::pair<const SCEV *, const SCEV *>> *PointerBounds,
343 std::optional<ScalarEvolution::LoopGuards> &LoopGuards) {
344 std::pair<const SCEV *, const SCEV *> *PtrBoundsPair;
345 if (PointerBounds) {
346 auto [Iter, Ins] = PointerBounds->insert(
347 {{PtrExpr, EltSizeSCEV},
348 {SE->getCouldNotCompute(), SE->getCouldNotCompute()}});
349 if (!Ins)
350 return Iter->second;
351 PtrBoundsPair = &Iter->second;
352 }
353
354 const SCEV *ScStart;
355 const SCEV *ScEnd;
356
357 auto &DL = Lp->getHeader()->getDataLayout();
358 if (SE->isLoopInvariant(PtrExpr, Lp)) {
359 ScStart = ScEnd = PtrExpr;
360 } else if (auto *AR = dyn_cast<SCEVAddRecExpr>(PtrExpr)) {
361 ScStart = AR->getStart();
362 if (!isa<SCEVCouldNotCompute>(BTC))
363 // Evaluating AR at an exact BTC is safe: LAA separately checks that
364 // accesses cannot wrap in the loop. If evaluating AR at BTC wraps, then
365 // the loop either triggers UB when executing a memory access with a
366 // poison pointer or the wrapping/poisoned pointer is not used.
367 ScEnd = AR->evaluateAtIteration(BTC, *SE);
368 else {
369 // Evaluating AR at MaxBTC may wrap and create an expression that is less
370 // than the start of the AddRec due to wrapping (for example consider
371 // MaxBTC = -2). If that's the case, set ScEnd to -(EltSize + 1). ScEnd
372 // will get incremented by EltSize before returning, so this effectively
373 // sets ScEnd to the maximum unsigned value for the type. Note that LAA
374 // separately checks that accesses cannot not wrap, so unsigned max
375 // represents an upper bound.
376 if (evaluatePtrAddRecAtMaxBTCWillNotWrap(AR, MaxBTC, EltSizeSCEV, *SE, DL,
377 DT, AC, LoopGuards)) {
378 ScEnd = AR->evaluateAtIteration(MaxBTC, *SE);
379 } else {
380 ScEnd = SE->getAddExpr(
381 SE->getNegativeSCEV(EltSizeSCEV),
384 AR->getType())));
385 }
386 }
387 const SCEV *Step = AR->getStepRecurrence(*SE);
388
389 // For expressions with negative step, the upper bound is ScStart and the
390 // lower bound is ScEnd.
391 if (const auto *CStep = dyn_cast<SCEVConstant>(Step)) {
392 if (CStep->getValue()->isNegative())
393 std::swap(ScStart, ScEnd);
394 } else {
395 // Fallback case: the step is not constant, but we can still
396 // get the upper and lower bounds of the interval by using min/max
397 // expressions.
398 ScStart = SE->getUMinExpr(ScStart, ScEnd);
399 ScEnd = SE->getUMaxExpr(AR->getStart(), ScEnd);
400 }
401 } else
402 return {SE->getCouldNotCompute(), SE->getCouldNotCompute()};
403
404 assert(SE->isLoopInvariant(ScStart, Lp) && "ScStart needs to be invariant");
405 assert(SE->isLoopInvariant(ScEnd, Lp) && "ScEnd needs to be invariant");
406
407 // Add the size of the pointed element to ScEnd.
408 ScEnd = SE->getAddExpr(ScEnd, EltSizeSCEV);
409
410 std::pair<const SCEV *, const SCEV *> Res = {ScStart, ScEnd};
411 if (PointerBounds)
412 *PtrBoundsPair = Res;
413 return Res;
414}
415
416/// Calculate Start and End points of memory access using
417/// getStartAndEndForAccess.
418void RuntimePointerChecking::insert(Loop *Lp, Value *Ptr, const SCEV *PtrExpr,
419 Type *AccessTy, bool WritePtr,
420 unsigned DepSetId, unsigned ASId,
422 bool NeedsFreeze) {
423 const SCEV *SymbolicMaxBTC = PSE.getSymbolicMaxBackedgeTakenCount();
424 const SCEV *BTC = PSE.getBackedgeTakenCount();
425 const auto &[ScStart, ScEnd] = getStartAndEndForAccess(
426 Lp, PtrExpr, AccessTy, BTC, SymbolicMaxBTC, PSE.getSE(),
427 &DC.getPointerBounds(), DC.getDT(), DC.getAC(), LoopGuards);
429 !isa<SCEVCouldNotCompute>(ScEnd) &&
430 "must be able to compute both start and end expressions");
431 Pointers.emplace_back(Ptr, ScStart, ScEnd, WritePtr, DepSetId, ASId, PtrExpr,
432 NeedsFreeze);
433}
434
435bool RuntimePointerChecking::tryToCreateDiffCheck(
436 const RuntimeCheckingPtrGroup &CGI, const RuntimeCheckingPtrGroup &CGJ) {
437 // If either group contains multiple different pointers, bail out.
438 // TODO: Support multiple pointers by using the minimum or maximum pointer,
439 // depending on src & sink.
440 if (CGI.Members.size() != 1 || CGJ.Members.size() != 1)
441 return false;
442
443 const PointerInfo *Src = &Pointers[CGI.Members[0]];
444 const PointerInfo *Sink = &Pointers[CGJ.Members[0]];
445
446 // If either pointer is read and written, multiple checks may be needed. Bail
447 // out.
448 if (!DC.getOrderForAccess(Src->PointerValue, !Src->IsWritePtr).empty() ||
449 !DC.getOrderForAccess(Sink->PointerValue, !Sink->IsWritePtr).empty())
450 return false;
451
452 ArrayRef<unsigned> AccSrc =
453 DC.getOrderForAccess(Src->PointerValue, Src->IsWritePtr);
454 ArrayRef<unsigned> AccSink =
455 DC.getOrderForAccess(Sink->PointerValue, Sink->IsWritePtr);
456 // If either pointer is accessed multiple times, there may not be a clear
457 // src/sink relation. Bail out for now.
458 if (AccSrc.size() != 1 || AccSink.size() != 1)
459 return false;
460
461 // If the sink is accessed before src, swap src/sink.
462 if (AccSink[0] < AccSrc[0])
463 std::swap(Src, Sink);
464
465 const SCEVConstant *Step;
466 const SCEV *SrcStart;
467 const SCEV *SinkStart;
468 const Loop *InnerLoop = DC.getInnermostLoop();
469 if (!match(Src->Expr,
471 m_SpecificLoop(InnerLoop))) ||
472 !match(Sink->Expr,
474 m_SpecificLoop(InnerLoop))))
475 return false;
476
478 DC.getInstructionsForAccess(Src->PointerValue, Src->IsWritePtr);
480 DC.getInstructionsForAccess(Sink->PointerValue, Sink->IsWritePtr);
481 Type *SrcTy = getLoadStoreType(SrcInsts[0]);
482 Type *DstTy = getLoadStoreType(SinkInsts[0]);
484 return false;
485
486 const DataLayout &DL = InnerLoop->getHeader()->getDataLayout();
487 unsigned AllocSize =
488 std::max(DL.getTypeAllocSize(SrcTy), DL.getTypeAllocSize(DstTy));
489
490 // Only matching constant steps matching the AllocSize are supported at the
491 // moment. This simplifies the difference computation. Can be extended in the
492 // future.
493 if (Step->getAPInt().abs() != AllocSize)
494 return false;
495
496 // When counting down, the dependence distance needs to be swapped.
497 if (Step->getValue()->isNegative())
498 std::swap(SinkStart, SrcStart);
499
500 const SCEV *SinkStartInt = SE->getPtrToAddrExpr(SinkStart);
501 const SCEV *SrcStartInt = SE->getPtrToAddrExpr(SrcStart);
502 if (isa<SCEVCouldNotCompute>(SinkStartInt) ||
503 isa<SCEVCouldNotCompute>(SrcStartInt))
504 return false;
505
506 // If the start values for both Src and Sink also vary according to an outer
507 // loop, then it's probably better to avoid creating diff checks because
508 // they may not be hoisted. We should instead let llvm::addRuntimeChecks
509 // do the expanded full range overlap checks, which can be hoisted.
510 if (HoistRuntimeChecks && InnerLoop->getParentLoop() &&
511 isa<SCEVAddRecExpr>(SinkStartInt) && isa<SCEVAddRecExpr>(SrcStartInt)) {
512 auto *SrcStartAR = cast<SCEVAddRecExpr>(SrcStartInt);
513 auto *SinkStartAR = cast<SCEVAddRecExpr>(SinkStartInt);
514 const Loop *StartARLoop = SrcStartAR->getLoop();
515 if (StartARLoop == SinkStartAR->getLoop() &&
516 StartARLoop == InnerLoop->getParentLoop() &&
517 // If the diff check would already be loop invariant (due to the
518 // recurrences being the same), then we prefer to keep the diff checks
519 // because they are cheaper.
520 SrcStartAR->getStepRecurrence(*SE) !=
521 SinkStartAR->getStepRecurrence(*SE)) {
522 LLVM_DEBUG(dbgs() << "LAA: Not creating diff runtime check, since these "
523 "cannot be hoisted out of the outer loop\n");
524 return false;
525 }
526 }
527
528 LLVM_DEBUG(dbgs() << "LAA: Creating diff runtime check for:\n"
529 << "SrcStart: " << *SrcStartInt << '\n'
530 << "SinkStartInt: " << *SinkStartInt << '\n');
531 DiffChecks.emplace_back(SrcStartInt, SinkStartInt, AllocSize,
532 Src->NeedsFreeze || Sink->NeedsFreeze);
533 return true;
534}
535
537 SmallVector<RuntimePointerCheck, 4> Checks;
538
539 for (unsigned I = 0; I < CheckingGroups.size(); ++I) {
540 for (unsigned J = I + 1; J < CheckingGroups.size(); ++J) {
543
544 if (needsChecking(CGI, CGJ)) {
545 CanUseDiffCheck = CanUseDiffCheck && tryToCreateDiffCheck(CGI, CGJ);
546 Checks.emplace_back(&CGI, &CGJ);
547 }
548 }
549 }
550 return Checks;
551}
552
555 assert(Checks.empty() && "Checks is not empty");
556 groupChecks(DepCands);
557 Checks = generateChecks();
558}
559
561 const RuntimeCheckingPtrGroup &M, const RuntimeCheckingPtrGroup &N) const {
562 for (const auto &I : M.Members)
563 for (const auto &J : N.Members)
564 if (needsChecking(I, J))
565 return true;
566 return false;
567}
568
569/// Compare \p I and \p J and return the minimum.
570/// Return nullptr in case we couldn't find an answer.
571static const SCEV *getMinFromExprs(const SCEV *I, const SCEV *J,
572 ScalarEvolution *SE) {
573 std::optional<APInt> Diff = SE->computeConstantDifference(J, I);
574 if (!Diff)
575 return nullptr;
576 return Diff->isNegative() ? J : I;
577}
578
580 unsigned Index, const RuntimePointerChecking &RtCheck) {
581 return addPointer(
582 Index, RtCheck.Pointers[Index].Start, RtCheck.Pointers[Index].End,
583 RtCheck.Pointers[Index].PointerValue->getType()->getPointerAddressSpace(),
584 RtCheck.Pointers[Index].NeedsFreeze, *RtCheck.SE);
585}
586
587bool RuntimeCheckingPtrGroup::addPointer(unsigned Index, const SCEV *Start,
588 const SCEV *End, unsigned AS,
589 bool NeedsFreeze,
590 ScalarEvolution &SE) {
591 assert(AddressSpace == AS &&
592 "all pointers in a checking group must be in the same address space");
593
594 // Compare the starts and ends with the known minimum and maximum
595 // of this set. We need to know how we compare against the min/max
596 // of the set in order to be able to emit memchecks.
597 const SCEV *Min0 = getMinFromExprs(Start, Low, &SE);
598 if (!Min0)
599 return false;
600
601 const SCEV *Min1 = getMinFromExprs(End, High, &SE);
602 if (!Min1)
603 return false;
604
605 // Update the low bound expression if we've found a new min value.
606 if (Min0 == Start)
607 Low = Start;
608
609 // Update the high bound expression if we've found a new max value.
610 if (Min1 != End)
611 High = End;
612
613 Members.push_back(Index);
614 this->NeedsFreeze |= NeedsFreeze;
615 return true;
616}
617
618void RuntimePointerChecking::groupChecks(
620 // We build the groups from dependency candidates equivalence classes
621 // because:
622 // - We know that pointers in the same equivalence class share
623 // the same underlying object and therefore there is a chance
624 // that we can compare pointers
625 // - We wouldn't be able to merge two pointers for which we need
626 // to emit a memcheck. The classes in DepCands are already
627 // conveniently built such that no two pointers in the same
628 // class need checking against each other.
629
630 // We use the following (greedy) algorithm to construct the groups
631 // For every pointer in the equivalence class:
632 // For each existing group:
633 // - if the difference between this pointer and the min/max bounds
634 // of the group is a constant, then make the pointer part of the
635 // group and update the min/max bounds of that group as required.
636
637 CheckingGroups.clear();
638
639 // If we need to check two pointers to the same underlying object
640 // with a non-constant difference, we shouldn't perform any pointer
641 // grouping with those pointers. This is because we can easily get
642 // into cases where the resulting check would return false, even when
643 // the accesses are safe.
644 //
645 // The following example shows this:
646 // for (i = 0; i < 1000; ++i)
647 // a[5000 + i * m] = a[i] + a[i + 9000]
648 //
649 // Here grouping gives a check of (5000, 5000 + 1000 * m) against
650 // (0, 10000) which is always false. However, if m is 1, there is no
651 // dependence. Not grouping the checks for a[i] and a[i + 9000] allows
652 // us to perform an accurate check in this case.
653 //
654 // In the above case, we have a non-constant distance and an Unknown
655 // dependence between accesses to the same underlying object, and could retry
656 // with runtime checks without dependency information being available. In this
657 // case we will use the fallback path and create separate checking groups for
658 // accesses not present in DepCands.
659
660 unsigned TotalComparisons = 0;
661
663 for (unsigned Index = 0; Index < Pointers.size(); ++Index)
664 PositionMap[Pointers[Index].PointerValue].push_back(Index);
665
666 // We need to keep track of what pointers we've already seen so we
667 // don't process them twice.
669
670 // Go through all equivalence classes, get the "pointer check groups"
671 // and add them to the overall solution. We use the order in which accesses
672 // appear in 'Pointers' to enforce determinism.
673 for (unsigned I = 0; I < Pointers.size(); ++I) {
674 // We've seen this pointer before, and therefore already processed
675 // its equivalence class.
676 if (Seen.contains(I))
677 continue;
678
680 Pointers[I].IsWritePtr);
681
682 // If there is no entry in the dependency partition, there are no potential
683 // accesses to merge; simply add a new pointer checking group.
684 if (!DepCands.contains(Access)) {
685 CheckingGroups.push_back(RuntimeCheckingPtrGroup(I, *this));
686 continue;
687 }
688
690
691 // Because DepCands is constructed by visiting accesses in the order in
692 // which they appear in alias sets (which is deterministic) and the
693 // iteration order within an equivalence class member is only dependent on
694 // the order in which unions and insertions are performed on the
695 // equivalence class, the iteration order is deterministic.
696 for (auto M : DepCands.members(Access)) {
697 auto PointerI = PositionMap.find(M.getPointer());
698 // If we can't find the pointer in PositionMap that means we can't
699 // generate a memcheck for it.
700 if (PointerI == PositionMap.end())
701 continue;
702 for (unsigned Pointer : PointerI->second) {
703 bool Merged = false;
704 // Mark this pointer as seen.
705 Seen.insert(Pointer);
706
707 // Go through all the existing sets and see if we can find one
708 // which can include this pointer.
709 for (RuntimeCheckingPtrGroup &Group : Groups) {
710 // Don't perform more than a certain amount of comparisons.
711 // This should limit the cost of grouping the pointers to something
712 // reasonable. If we do end up hitting this threshold, the algorithm
713 // will create separate groups for all remaining pointers.
714 if (TotalComparisons > MemoryCheckMergeThreshold)
715 break;
716
717 TotalComparisons++;
718
719 if (Group.addPointer(Pointer, *this)) {
720 Merged = true;
721 break;
722 }
723 }
724
725 if (!Merged)
726 // We couldn't add this pointer to any existing set or the threshold
727 // for the number of comparisons has been reached. Create a new group
728 // to hold the current pointer.
729 Groups.emplace_back(Pointer, *this);
730 }
731 }
732
733 // We've computed the grouped checks for this partition.
734 // Save the results and continue with the next one.
736 }
737}
738
740 const SmallVectorImpl<int> &PtrToPartition, unsigned PtrIdx1,
741 unsigned PtrIdx2) {
742 return (PtrToPartition[PtrIdx1] != -1 &&
743 PtrToPartition[PtrIdx1] == PtrToPartition[PtrIdx2]);
744}
745
746bool RuntimePointerChecking::needsChecking(unsigned I, unsigned J) const {
747 const PointerInfo &PointerI = Pointers[I];
748 const PointerInfo &PointerJ = Pointers[J];
749
750 // No need to check if two readonly pointers intersect.
751 if (!PointerI.IsWritePtr && !PointerJ.IsWritePtr)
752 return false;
753
754 // Only need to check pointers between two different dependency sets.
755 if (PointerI.DependencySetId == PointerJ.DependencySetId)
756 return false;
757
758 // Only need to check pointers in the same alias set.
759 return PointerI.AliasSetId == PointerJ.AliasSetId;
760}
761
762/// Assign each RuntimeCheckingPtrGroup pointer an index for stable UTC output.
766 for (const auto &[Idx, CG] : enumerate(CheckingGroups))
767 PtrIndices[&CG] = Idx;
768 return PtrIndices;
769}
770
773 unsigned Depth) const {
774 unsigned N = 0;
775 auto PtrIndices = getPtrToIdxMap(CheckingGroups);
776 for (const auto &[Check1, Check2] : Checks) {
777 const auto &First = Check1->Members, &Second = Check2->Members;
778 OS.indent(Depth) << "Check " << N++ << ":\n";
779 OS.indent(Depth + 2) << "Comparing group GRP" << PtrIndices.at(Check1)
780 << ":\n";
781 for (unsigned K : First)
782 OS.indent(Depth + 2) << *Pointers[K].PointerValue << "\n";
783 OS.indent(Depth + 2) << "Against group GRP" << PtrIndices.at(Check2)
784 << ":\n";
785 for (unsigned K : Second)
786 OS.indent(Depth + 2) << *Pointers[K].PointerValue << "\n";
787 }
788}
789
791
792 OS.indent(Depth) << "Run-time memory checks:\n";
793 printChecks(OS, Checks, Depth);
794
795 OS.indent(Depth) << "Grouped accesses:\n";
796 auto PtrIndices = getPtrToIdxMap(CheckingGroups);
797 for (const auto &CG : CheckingGroups) {
798 OS.indent(Depth + 2) << "Group GRP" << PtrIndices.at(&CG) << ":\n";
799 OS.indent(Depth + 4) << "(Low: " << *CG.Low << " High: " << *CG.High
800 << ")\n";
801 for (unsigned Member : CG.Members) {
802 OS.indent(Depth + 6) << "Member: " << *Pointers[Member].Expr << "\n";
803 }
804 }
805}
806
807namespace {
808
809/// Analyses memory accesses in a loop.
810///
811/// Checks whether run time pointer checks are needed and builds sets for data
812/// dependence checking.
813class AccessAnalysis {
814public:
815 using MemAccessInfo =
816 PointerIntPair<Value * /* AccessPtr */, 1, bool /* IsWrite */>;
817
818 AccessAnalysis(const Loop *TheLoop, AAResults *AA, const LoopInfo *LI,
821 SmallPtrSetImpl<MDNode *> &LoopAliasScopes)
822 : TheLoop(TheLoop), BAA(*AA), AST(BAA), LI(LI), DT(DT), DepCands(DA),
823 PSE(PSE), LoopAliasScopes(LoopAliasScopes) {
824 // We're analyzing dependences across loop iterations.
825 BAA.enableCrossIterationMode();
826 }
827
828 /// Register a load and whether it is only read from.
829 void addLoad(const MemoryLocation &Loc, Type *AccessTy, bool IsReadOnly) {
830 Value *Ptr = const_cast<Value *>(Loc.Ptr);
831 AST.add(adjustLoc(Loc));
832 Accesses[MemAccessInfo(Ptr, false)].insert(AccessTy);
833 if (IsReadOnly)
834 ReadOnlyPtr.insert(Ptr);
835 }
836
837 /// Register a store.
838 void addStore(const MemoryLocation &Loc, Type *AccessTy) {
839 Value *Ptr = const_cast<Value *>(Loc.Ptr);
840 AST.add(adjustLoc(Loc));
841 Accesses[MemAccessInfo(Ptr, true)].insert(AccessTy);
842 }
843
844 /// Check if we can emit a run-time no-alias check for \p Access.
845 ///
846 /// Returns true if we can emit a run-time no alias check for \p Access.
847 /// If we can check this access, this also adds it to a dependence set and
848 /// adds a run-time to check for it to \p RtCheck. If \p Assume is true,
849 /// we will attempt to use additional run-time checks in order to get
850 /// the bounds of the pointer.
851 bool createCheckForAccess(RuntimePointerChecking &RtCheck,
852 MemAccessInfo Access, Type *AccessTy,
853 const DenseMap<Value *, const SCEV *> &Strides,
854 DenseMap<Value *, unsigned> &DepSetId,
855 Loop *TheLoop, unsigned &RunningDepId,
856 unsigned ASId, bool Assume);
857
858 /// Check whether we can check the pointers at runtime for
859 /// non-intersection.
860 ///
861 /// Returns true if we need no check or if we do and we can generate them
862 /// (i.e. the pointers have computable bounds). A return value of false means
863 /// we couldn't analyze and generate runtime checks for all pointers in the
864 /// loop, but if \p AllowPartial is set then we will have checks for those
865 /// pointers we could analyze. \p DepChecker is used to remove unknown
866 /// dependences from DepCands.
867 bool canCheckPtrAtRT(RuntimePointerChecking &RtCheck, Loop *TheLoop,
868 const DenseMap<Value *, const SCEV *> &Strides,
869 Value *&UncomputablePtr, bool AllowPartial,
870 const MemoryDepChecker &DepChecker);
871
872 /// Goes over all memory accesses, checks whether a RT check is needed
873 /// and builds sets of dependent accesses.
874 void buildDependenceSets();
875
876 /// Initial processing of memory accesses determined that we need to
877 /// perform dependency checking.
878 ///
879 /// Note that this can later be cleared if we retry memcheck analysis without
880 /// dependency checking (i.e. ShouldRetryWithRuntimeChecks).
881 bool isDependencyCheckNeeded() const { return !CheckDeps.empty(); }
882
883 /// We decided that no dependence analysis would be used. Reset the state.
884 void resetDepChecks(MemoryDepChecker &DepChecker) {
885 CheckDeps.clear();
886 DepChecker.clearDependences();
887 }
888
889 ArrayRef<MemAccessInfo> getDependenciesToCheck() const { return CheckDeps; }
890
891private:
892 using PtrAccessMap = MapVector<MemAccessInfo, SmallSetVector<Type *, 1>>;
893
894 /// Adjust the MemoryLocation so that it represents accesses to this
895 /// location across all iterations, rather than a single one.
896 MemoryLocation adjustLoc(MemoryLocation Loc) const {
897 // The accessed location varies within the loop, but remains within the
898 // underlying object.
900 Loc.AATags.Scope = adjustAliasScopeList(Loc.AATags.Scope);
901 Loc.AATags.NoAlias = adjustAliasScopeList(Loc.AATags.NoAlias);
902 return Loc;
903 }
904
905 /// Drop alias scopes that are only valid within a single loop iteration.
906 MDNode *adjustAliasScopeList(MDNode *ScopeList) const {
907 if (!ScopeList)
908 return nullptr;
909
910 // For the sake of simplicity, drop the whole scope list if any scope is
911 // iteration-local.
912 if (any_of(ScopeList->operands(), [&](Metadata *Scope) {
913 return LoopAliasScopes.contains(cast<MDNode>(Scope));
914 }))
915 return nullptr;
916
917 return ScopeList;
918 }
919
920 /// Map of all accesses. Values are the types used to access memory pointed to
921 /// by the pointer.
922 PtrAccessMap Accesses;
923
924 /// The loop being checked.
925 const Loop *TheLoop;
926
927 /// List of accesses that need a further dependence check.
929
930 /// Set of pointers that are read only.
931 SmallPtrSet<Value*, 16> ReadOnlyPtr;
932
933 /// Batched alias analysis results.
934 BatchAAResults BAA;
935
936 /// An alias set tracker to partition the access set by underlying object and
937 //intrinsic property (such as TBAA metadata).
938 AliasSetTracker AST;
939
940 /// The LoopInfo of the loop being checked.
941 const LoopInfo *LI;
942
943 /// The dominator tree of the function.
944 DominatorTree &DT;
945
946 /// Sets of potentially dependent accesses - members of one set share an
947 /// underlying pointer. The set "CheckDeps" identfies which sets really need a
948 /// dependence check.
950
951 /// Initial processing of memory accesses determined that we may need
952 /// to add memchecks. Perform the analysis to determine the necessary checks.
953 ///
954 /// Note that, this is different from isDependencyCheckNeeded. When we retry
955 /// memcheck analysis without dependency checking
956 /// (i.e. ShouldRetryWithRuntimeChecks), isDependencyCheckNeeded is
957 /// cleared while this remains set if we have potentially dependent accesses.
958 bool IsRTCheckAnalysisNeeded = false;
959
960 /// The SCEV predicate containing all the SCEV-related assumptions.
961 PredicatedScalarEvolution &PSE;
962
963 DenseMap<Value *, SmallVector<const Value *, 16>> UnderlyingObjects;
964
965 /// Alias scopes that are declared inside the loop, and as such not valid
966 /// across iterations.
967 SmallPtrSetImpl<MDNode *> &LoopAliasScopes;
968};
969
970} // end anonymous namespace
971
972std::optional<int64_t>
974 Type *AccessTy, Value *Ptr,
976 if (isa<ScalableVectorType>(AccessTy)) {
977 LLVM_DEBUG(dbgs() << "LAA: Bad stride - Scalable object: " << *AccessTy
978 << "\n");
979 return std::nullopt;
980 }
981
982 // The access function must stride over the innermost loop.
983 if (Lp != AR->getLoop()) {
984 LLVM_DEBUG({
985 dbgs() << "LAA: Bad stride - Not striding over innermost loop ";
986 if (Ptr)
987 dbgs() << *Ptr << " ";
988
989 dbgs() << "SCEV: " << *AR << "\n";
990 });
991 return std::nullopt;
992 }
993
994 // Check the step is constant.
995 const SCEV *Step = AR->getStepRecurrence(*PSE.getSE());
996
997 // Calculate the pointer stride and check if it is constant.
998 const APInt *APStepVal;
999 if (!match(Step, m_scev_APInt(APStepVal))) {
1000 LLVM_DEBUG({
1001 dbgs() << "LAA: Bad stride - Not a constant strided ";
1002 if (Ptr)
1003 dbgs() << *Ptr << " ";
1004 dbgs() << "SCEV: " << *AR << "\n";
1005 });
1006 return std::nullopt;
1007 }
1008
1009 const auto &DL = Lp->getHeader()->getDataLayout();
1010 TypeSize AllocSize = DL.getTypeAllocSize(AccessTy);
1011 int64_t Size = AllocSize.getFixedValue();
1012
1013 // Huge step value - give up.
1014 std::optional<int64_t> StepVal = APStepVal->trySExtValue();
1015 if (!StepVal)
1016 return std::nullopt;
1017
1018 // Strided access.
1019 return *StepVal % Size ? std::nullopt : std::make_optional(*StepVal / Size);
1020}
1021
1022/// Check whether \p AR is a non-wrapping AddRec. If \p Ptr is not nullptr, use
1023/// information from the IR pointer value to determine no-wrap. If \p Predicates
1024/// is not nullptr add no-wrap assumptions if needed.
1025static bool
1027 Type *AccessTy, const Loop *L, const DominatorTree &DT,
1028 std::optional<int64_t> Stride = std::nullopt,
1029 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr) {
1030 // FIXME: This should probably only return true for NUW.
1031 if (any(AR->getNoWrapFlags(SCEV::NoWrapMask)))
1032 return true;
1033
1035 return true;
1036
1037 // An nusw getelementptr that is an AddRec cannot wrap. If it would wrap,
1038 // the distance between the previously accessed location and the wrapped
1039 // location will be larger than half the pointer index type space. In that
1040 // case, the GEP would be poison and any memory access dependent on it would
1041 // be immediate UB when executed.
1043 GEP && GEP->hasNoUnsignedSignedWrap()) {
1044 // For the above reasoning to apply, the pointer must be dereferenced in
1045 // every iteration.
1046 if (L->getHeader() == L->getLoopLatch() ||
1047 any_of(GEP->users(), [L, &DT, GEP](User *U) {
1048 if (getLoadStorePointerOperand(U) != GEP)
1049 return false;
1050 BasicBlock *UserBB = cast<Instruction>(U)->getParent();
1051 if (!L->contains(UserBB))
1052 return false;
1053 return !LoopAccessInfo::blockNeedsPredication(UserBB, L, &DT);
1054 }))
1055 return true;
1056 }
1057
1058 if (!Stride)
1059 Stride = getStrideFromAddRec(AR, L, AccessTy, Ptr, PSE);
1060 if (Stride) {
1061 // If the null pointer is undefined, then a access sequence which would
1062 // otherwise access it can be assumed not to unsigned wrap. Note that this
1063 // assumes the object in memory is aligned to the natural alignment.
1064 unsigned AddrSpace = AR->getType()->getPointerAddressSpace();
1065 if (!NullPointerIsDefined(L->getHeader()->getParent(), AddrSpace) &&
1066 (Stride == 1 || Stride == -1))
1067 return true;
1068 }
1069
1070 if (Ptr && Predicates) {
1071 ScalarEvolution &SE = *PSE.getSE();
1075 Predicates->push_back(SE.getWrapPredicate(AR, Flags));
1076 LLVM_DEBUG(dbgs() << "LAA: Pointer may wrap:\n"
1077 << "LAA: Pointer: " << *Ptr << "\n"
1078 << "LAA: SCEV: " << *AR << "\n"
1079 << "LAA: Added an overflow assumption\n");
1080 return true;
1081 }
1082
1083 return false;
1084}
1085
1086static void visitPointers(Value *StartPtr, const Loop &InnermostLoop,
1087 function_ref<void(Value *)> AddPointer) {
1089 SmallVector<Value *> WorkList;
1090 WorkList.push_back(StartPtr);
1091
1092 while (!WorkList.empty()) {
1093 Value *Ptr = WorkList.pop_back_val();
1094 if (!Visited.insert(Ptr).second)
1095 continue;
1096 auto *PN = dyn_cast<PHINode>(Ptr);
1097 // SCEV does not look through non-header PHIs inside the loop. Such phis
1098 // can be analyzed by adding separate accesses for each incoming pointer
1099 // value.
1100 if (PN && InnermostLoop.contains(PN->getParent()) &&
1101 PN->getParent() != InnermostLoop.getHeader()) {
1102 llvm::append_range(WorkList, PN->incoming_values());
1103 } else
1104 AddPointer(Ptr);
1105 }
1106}
1107
1108// Walk back through the IR for a pointer, looking for a select like the
1109// following:
1110//
1111// %offset = select i1 %cmp, i64 %a, i64 %b
1112// %addr = getelementptr double, double* %base, i64 %offset
1113// %ld = load double, double* %addr, align 8
1114//
1115// We won't be able to form a single SCEVAddRecExpr from this since the
1116// address for each loop iteration depends on %cmp. We could potentially
1117// produce multiple valid SCEVAddRecExprs, though, and check all of them for
1118// memory safety/aliasing if needed.
1119//
1120// If we encounter some IR we don't yet handle, or something obviously fine
1121// like a constant, then we just add the SCEV for that term to the list passed
1122// in by the caller. If we have a node that may potentially yield a valid
1123// SCEVAddRecExpr then we decompose it into parts and build the SCEV terms
1124// ourselves before adding to the list.
1126 ScalarEvolution *SE, const Loop *L, Value *Ptr,
1128 unsigned Depth) {
1129 // If our Value is a SCEVAddRecExpr, loop invariant, not an instruction, or
1130 // we've exceeded our limit on recursion, just return whatever we have
1131 // regardless of whether it can be used for a forked pointer or not, along
1132 // with an indication of whether it might be a poison or undef value.
1133 const SCEV *Scev = SE->getSCEV(Ptr);
1134 if (isa<SCEVAddRecExpr>(Scev) || L->isLoopInvariant(Ptr) ||
1135 !isa<Instruction>(Ptr) || Depth == 0) {
1136 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));
1137 return;
1138 }
1139
1140 Depth--;
1141
1142 auto UndefPoisonCheck = [](PointerIntPair<const SCEV *, 1, bool> S) {
1143 return get<1>(S);
1144 };
1145
1146 auto GetBinOpExpr = [&SE](unsigned Opcode, const SCEV *L, const SCEV *R) {
1147 switch (Opcode) {
1148 case Instruction::Add:
1149 return SE->getAddExpr(L, R);
1150 case Instruction::Sub:
1151 return SE->getMinusSCEV(L, R);
1152 default:
1153 llvm_unreachable("Unexpected binary operator when walking ForkedPtrs");
1154 }
1155 };
1156
1158 unsigned Opcode = I->getOpcode();
1159 switch (Opcode) {
1160 case Instruction::GetElementPtr: {
1161 auto *GEP = cast<GetElementPtrInst>(I);
1162 Type *SourceTy = GEP->getSourceElementType();
1163 // We only handle base + single offset GEPs here for now.
1164 // Not dealing with preexisting gathers yet, so no vectors.
1165 if (I->getNumOperands() != 2 || SourceTy->isVectorTy()) {
1166 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(GEP));
1167 break;
1168 }
1171 findForkedSCEVs(SE, L, I->getOperand(0), BaseScevs, Depth);
1172 findForkedSCEVs(SE, L, I->getOperand(1), OffsetScevs, Depth);
1173
1174 // See if we need to freeze our fork...
1175 bool NeedsFreeze = any_of(BaseScevs, UndefPoisonCheck) ||
1176 any_of(OffsetScevs, UndefPoisonCheck);
1177
1178 // Check that we only have a single fork, on either the base or the offset.
1179 // Copy the SCEV across for the one without a fork in order to generate
1180 // the full SCEV for both sides of the GEP.
1181 if (OffsetScevs.size() == 2 && BaseScevs.size() == 1)
1182 BaseScevs.push_back(BaseScevs[0]);
1183 else if (BaseScevs.size() == 2 && OffsetScevs.size() == 1)
1184 OffsetScevs.push_back(OffsetScevs[0]);
1185 else {
1186 ScevList.emplace_back(Scev, NeedsFreeze);
1187 break;
1188 }
1189
1190 Type *IntPtrTy = SE->getEffectiveSCEVType(GEP->getPointerOperandType());
1191
1192 // Find the size of the type being pointed to. We only have a single
1193 // index term (guarded above) so we don't need to index into arrays or
1194 // structures, just get the size of the scalar value.
1195 const SCEV *Size = SE->getSizeOfExpr(IntPtrTy, SourceTy);
1196
1197 for (auto [B, O] : zip(BaseScevs, OffsetScevs)) {
1198 const SCEV *Base = get<0>(B);
1199 const SCEV *Offset = get<0>(O);
1200
1201 // Scale up the offsets by the size of the type, then add to the bases.
1202 const SCEV *Scaled =
1204 ScevList.emplace_back(SE->getAddExpr(Base, Scaled), NeedsFreeze);
1205 }
1206 break;
1207 }
1208 case Instruction::Select: {
1210 // A select means we've found a forked pointer, but we currently only
1211 // support a single select per pointer so if there's another behind this
1212 // then we just bail out and return the generic SCEV.
1213 findForkedSCEVs(SE, L, I->getOperand(1), ChildScevs, Depth);
1214 findForkedSCEVs(SE, L, I->getOperand(2), ChildScevs, Depth);
1215 if (ChildScevs.size() == 2)
1216 append_range(ScevList, ChildScevs);
1217 else
1218 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));
1219 break;
1220 }
1221 case Instruction::PHI: {
1223 // A phi means we've found a forked pointer, but we currently only
1224 // support a single phi per pointer so if there's another behind this
1225 // then we just bail out and return the generic SCEV.
1226 if (I->getNumOperands() == 2) {
1227 findForkedSCEVs(SE, L, I->getOperand(0), ChildScevs, Depth);
1228 findForkedSCEVs(SE, L, I->getOperand(1), ChildScevs, Depth);
1229 }
1230 if (ChildScevs.size() == 2)
1231 append_range(ScevList, ChildScevs);
1232 else
1233 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));
1234 break;
1235 }
1236 case Instruction::Add:
1237 case Instruction::Sub: {
1240 findForkedSCEVs(SE, L, I->getOperand(0), LScevs, Depth);
1241 findForkedSCEVs(SE, L, I->getOperand(1), RScevs, Depth);
1242
1243 // See if we need to freeze our fork...
1244 bool NeedsFreeze =
1245 any_of(LScevs, UndefPoisonCheck) || any_of(RScevs, UndefPoisonCheck);
1246
1247 // Check that we only have a single fork, on either the left or right side.
1248 // Copy the SCEV across for the one without a fork in order to generate
1249 // the full SCEV for both sides of the BinOp.
1250 if (LScevs.size() == 2 && RScevs.size() == 1)
1251 RScevs.push_back(RScevs[0]);
1252 else if (RScevs.size() == 2 && LScevs.size() == 1)
1253 LScevs.push_back(LScevs[0]);
1254 else {
1255 ScevList.emplace_back(Scev, NeedsFreeze);
1256 break;
1257 }
1258
1259 for (auto [L, R] : zip(LScevs, RScevs))
1260 ScevList.emplace_back(GetBinOpExpr(Opcode, get<0>(L), get<0>(R)),
1261 NeedsFreeze);
1262 break;
1263 }
1264 default:
1265 // Just return the current SCEV if we haven't handled the instruction yet.
1266 LLVM_DEBUG(dbgs() << "ForkedPtr unhandled instruction: " << *I << "\n");
1267 ScevList.emplace_back(Scev, !isGuaranteedNotToBeUndefOrPoison(Ptr));
1268 break;
1269 }
1270}
1271
1272bool AccessAnalysis::createCheckForAccess(
1273 RuntimePointerChecking &RtCheck, MemAccessInfo Access, Type *AccessTy,
1274 const DenseMap<Value *, const SCEV *> &StridesMap,
1275 DenseMap<Value *, unsigned> &DepSetId, Loop *TheLoop,
1276 unsigned &RunningDepId, unsigned ASId, bool Assume) {
1277 Value *Ptr = Access.getPointer();
1278 ScalarEvolution *SE = PSE.getSE();
1279 assert(SE->isSCEVable(Ptr->getType()) && "Value is not SCEVable!");
1280
1282 findForkedSCEVs(SE, TheLoop, Ptr, RTCheckPtrs, MaxForkedSCEVDepth);
1283 assert(!RTCheckPtrs.empty() &&
1284 "Must have some runtime-check pointer candidates");
1285
1286 // RTCheckPtrs must have size 2 if there are forked pointers. Otherwise, there
1287 // are no forked pointers; replaceSymbolicStridesSCEV in this case.
1288 auto IsLoopInvariantOrAR =
1289 [&SE, &TheLoop](const PointerIntPair<const SCEV *, 1, bool> &P) {
1290 return SE->isLoopInvariant(P.getPointer(), TheLoop) ||
1291 isa<SCEVAddRecExpr>(P.getPointer());
1292 };
1293 if (RTCheckPtrs.size() == 2 && all_of(RTCheckPtrs, IsLoopInvariantOrAR)) {
1294 LLVM_DEBUG(dbgs() << "LAA: Found forked pointer: " << *Ptr << "\n";
1295 for (const auto &[Idx, Q] : enumerate(RTCheckPtrs)) dbgs()
1296 << "\t(" << Idx << ") " << *Q.getPointer() << "\n");
1297 } else {
1298 RTCheckPtrs = {{replaceSymbolicStrideSCEV(PSE, StridesMap, Ptr), false}};
1299 }
1300
1301 /// Check whether all pointers can participate in a runtime bounds check. They
1302 /// must either be invariant or non-wrapping affine AddRecs.
1304 for (auto &P : RTCheckPtrs) {
1305 // The bounds for loop-invariant pointer is trivial.
1306 if (SE->isLoopInvariant(P.getPointer(), TheLoop))
1307 continue;
1308
1309 const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(P.getPointer());
1310 if (!AR && Assume)
1311 AR = PSE.getAsAddRec(Ptr, &Predicates);
1312 if (!AR || !AR->isAffine())
1313 return false;
1314
1315 // If there's only one option for Ptr, commit the predicates collected by
1316 // getAsAddRec and look Ptr up again afterwards: the lookup below reads the
1317 // assumptions back from PSE, so they need to be committed first.
1318 if (RTCheckPtrs.size() == 1) {
1319 PSE.addPredicates(Predicates);
1320 Predicates.clear();
1321 if (auto *StrideAR = dyn_cast<SCEVAddRecExpr>(
1322 replaceSymbolicStrideSCEV(PSE, StridesMap, Ptr)))
1323 AR = StrideAR;
1324 P.setPointer(AR);
1325 }
1326
1327 if (!isNoWrap(PSE, AR, RTCheckPtrs.size() == 1 ? Ptr : nullptr, AccessTy,
1328 TheLoop, DT, /*Stride=*/std::nullopt,
1329 Assume ? &Predicates : nullptr))
1330 return false;
1331 }
1332 PSE.addPredicates(Predicates);
1333
1334 for (const auto &[PtrExpr, NeedsFreeze] : RTCheckPtrs) {
1335 // The id of the dependence set.
1336 unsigned DepId;
1337
1338 if (DepCands.contains(Access)) {
1339 Value *Leader = DepCands.getLeaderValue(Access).getPointer();
1340 unsigned &LeaderId = DepSetId[Leader];
1341 if (!LeaderId)
1342 LeaderId = RunningDepId++;
1343 DepId = LeaderId;
1344 } else
1345 // Each access has its own dependence set.
1346 DepId = RunningDepId++;
1347
1348 bool IsWrite = Access.getInt();
1349 RtCheck.insert(TheLoop, Ptr, PtrExpr, AccessTy, IsWrite, DepId, ASId, PSE,
1350 NeedsFreeze);
1351 LLVM_DEBUG(dbgs() << "LAA: Found a runtime check ptr:" << *Ptr << '\n');
1352 }
1353
1354 return true;
1355}
1356
1357bool AccessAnalysis::canCheckPtrAtRT(
1358 RuntimePointerChecking &RtCheck, Loop *TheLoop,
1359 const DenseMap<Value *, const SCEV *> &StridesMap, Value *&UncomputablePtr,
1360 bool AllowPartial, const MemoryDepChecker &DepChecker) {
1361 // Find pointers with computable bounds. We are going to use this information
1362 // to place a runtime bound check.
1363 bool CanDoRT = true;
1364
1365 bool MayNeedRTCheck = false;
1366 if (!IsRTCheckAnalysisNeeded) return true;
1367
1368 if (auto *Deps = DepChecker.getDependences()) {
1369 // If there are unknown dependences, this means runtime checks are needed to
1370 // ensure there's no overlap between accesses to the same underlying object.
1371 // Remove the equivalence classes containing both source and destination
1372 // accesses from DepCands. This ensures runtime checks will be generated
1373 // between those accesses and prevents them from being grouped together.
1374 for (const auto &Dep : *Deps) {
1375 if (Dep.Type != MemoryDepChecker::Dependence::Unknown) {
1378 "Should only skip safe dependences");
1379 continue;
1380 }
1381 Instruction *Src = Dep.getSource(DepChecker);
1382 Instruction *Dst = Dep.getDestination(DepChecker);
1383 DepCands.eraseClass({getPointerOperand(Src), Src->mayWriteToMemory()});
1384 DepCands.eraseClass({getPointerOperand(Dst), Dst->mayWriteToMemory()});
1385 }
1386 } else {
1387 CheckDeps.clear();
1388 DepCands = {};
1389 }
1390
1391 // We assign a consecutive id to access from different alias sets.
1392 // Accesses between different groups doesn't need to be checked.
1393 unsigned ASId = 0;
1394 for (const auto &AS : AST) {
1395 int NumReadPtrChecks = 0;
1396 int NumWritePtrChecks = 0;
1397 bool CanDoAliasSetRT = true;
1398 ++ASId;
1399 auto ASPointers = AS.getPointers();
1400
1401 // We assign consecutive id to access from different dependence sets.
1402 // Accesses within the same set don't need a runtime check.
1403 unsigned RunningDepId = 1;
1405
1407
1408 // First, count how many write and read accesses are in the alias set. Also
1409 // collect MemAccessInfos for later.
1411 for (const Value *ConstPtr : ASPointers) {
1412 Value *Ptr = const_cast<Value *>(ConstPtr);
1413 bool IsWrite = Accesses.contains(MemAccessInfo(Ptr, true));
1414 if (IsWrite)
1415 ++NumWritePtrChecks;
1416 else
1417 ++NumReadPtrChecks;
1418 AccessInfos.emplace_back(Ptr, IsWrite);
1419 }
1420
1421 // We do not need runtime checks for this alias set, if there are no writes
1422 // or a single write and no reads.
1423 if (NumWritePtrChecks == 0 ||
1424 (NumWritePtrChecks == 1 && NumReadPtrChecks == 0)) {
1425 assert((ASPointers.size() <= 1 ||
1426 all_of(ASPointers,
1427 [this](const Value *Ptr) {
1428 MemAccessInfo AccessWrite(const_cast<Value *>(Ptr),
1429 true);
1430 return !DepCands.contains(AccessWrite);
1431 })) &&
1432 "Can only skip updating CanDoRT below, if all entries in AS "
1433 "are reads or there is at most 1 entry");
1434 continue;
1435 }
1436
1437 for (auto &Access : AccessInfos) {
1438 for (const auto &AccessTy : Accesses[Access]) {
1439 if (!createCheckForAccess(RtCheck, Access, AccessTy, StridesMap,
1440 DepSetId, TheLoop, RunningDepId, ASId,
1441 false)) {
1442 LLVM_DEBUG(dbgs() << "LAA: Can't find bounds for ptr:"
1443 << *Access.getPointer() << '\n');
1444 Retries.emplace_back(Access, AccessTy);
1445 CanDoAliasSetRT = false;
1446 }
1447 }
1448 }
1449
1450 // Note that this function computes CanDoRT and MayNeedRTCheck
1451 // independently. For example CanDoRT=false, MayNeedRTCheck=false means that
1452 // we have a pointer for which we couldn't find the bounds but we don't
1453 // actually need to emit any checks so it does not matter.
1454 //
1455 // We need runtime checks for this alias set, if there are at least 2
1456 // dependence sets (in which case RunningDepId > 2) or if we need to re-try
1457 // any bound checks (because in that case the number of dependence sets is
1458 // incomplete).
1459 bool NeedsAliasSetRTCheck = RunningDepId > 2 || !Retries.empty();
1460
1461 // We need to perform run-time alias checks, but some pointers had bounds
1462 // that couldn't be checked.
1463 if (NeedsAliasSetRTCheck && !CanDoAliasSetRT) {
1464 // Reset the CanDoSetRt flag and retry all accesses that have failed.
1465 // We know that we need these checks, so we can now be more aggressive
1466 // and add further checks if required (overflow checks).
1467 CanDoAliasSetRT = true;
1468 for (const auto &[Access, AccessTy] : Retries) {
1469 if (!createCheckForAccess(RtCheck, Access, AccessTy, StridesMap,
1470 DepSetId, TheLoop, RunningDepId, ASId,
1471 /*Assume=*/true)) {
1472 CanDoAliasSetRT = false;
1473 UncomputablePtr = Access.getPointer();
1474 if (!AllowPartial)
1475 break;
1476 }
1477 }
1478 }
1479
1480 CanDoRT &= CanDoAliasSetRT;
1481 MayNeedRTCheck |= NeedsAliasSetRTCheck;
1482 ++ASId;
1483 }
1484
1485 // If the pointers that we would use for the bounds comparison have different
1486 // address spaces, assume the values aren't directly comparable, so we can't
1487 // use them for the runtime check. We also have to assume they could
1488 // overlap. In the future there should be metadata for whether address spaces
1489 // are disjoint.
1490 unsigned NumPointers = RtCheck.Pointers.size();
1491 for (unsigned i = 0; i < NumPointers; ++i) {
1492 for (unsigned j = i + 1; j < NumPointers; ++j) {
1493 // Only need to check pointers between two different dependency sets.
1494 if (RtCheck.Pointers[i].DependencySetId ==
1495 RtCheck.Pointers[j].DependencySetId)
1496 continue;
1497 // Only need to check pointers in the same alias set.
1498 if (RtCheck.Pointers[i].AliasSetId != RtCheck.Pointers[j].AliasSetId)
1499 continue;
1500
1501 Value *PtrI = RtCheck.Pointers[i].PointerValue;
1502 Value *PtrJ = RtCheck.Pointers[j].PointerValue;
1503
1504 unsigned ASi = PtrI->getType()->getPointerAddressSpace();
1505 unsigned ASj = PtrJ->getType()->getPointerAddressSpace();
1506 if (ASi != ASj) {
1507 LLVM_DEBUG(
1508 dbgs() << "LAA: Runtime check would require comparison between"
1509 " different address spaces\n");
1510 return false;
1511 }
1512 }
1513 }
1514
1515 if (MayNeedRTCheck && (CanDoRT || AllowPartial))
1516 RtCheck.generateChecks(DepCands);
1517
1518 LLVM_DEBUG(dbgs() << "LAA: We need to do " << RtCheck.getNumberOfChecks()
1519 << " pointer comparisons.\n");
1520
1521 // If we can do run-time checks, but there are no checks, no runtime checks
1522 // are needed. This can happen when all pointers point to the same underlying
1523 // object for example.
1524 RtCheck.Need = CanDoRT ? RtCheck.getNumberOfChecks() != 0 : MayNeedRTCheck;
1525
1526 bool CanDoRTIfNeeded = !RtCheck.Need || CanDoRT;
1527 assert(CanDoRTIfNeeded == (CanDoRT || !MayNeedRTCheck) &&
1528 "CanDoRTIfNeeded depends on RtCheck.Need");
1529 if (!CanDoRTIfNeeded && !AllowPartial)
1530 RtCheck.reset();
1531 return CanDoRTIfNeeded;
1532}
1533
1534void AccessAnalysis::buildDependenceSets() {
1535 // We process the set twice: first we process read-write pointers, last we
1536 // process read-only pointers. This allows us to skip dependence tests for
1537 // read-only pointers.
1538
1539 LLVM_DEBUG(dbgs() << "LAA: Processing memory accesses...\n");
1540 LLVM_DEBUG(dbgs() << " AST: "; AST.dump());
1541 LLVM_DEBUG(dbgs() << "LAA: Accesses(" << Accesses.size() << "):\n");
1542 LLVM_DEBUG({
1543 for (const auto &[A, _] : Accesses)
1544 dbgs() << "\t" << *A.getPointer() << " ("
1545 << (A.getInt()
1546 ? "write"
1547 : (ReadOnlyPtr.contains(A.getPointer()) ? "read-only"
1548 : "read"))
1549 << ")\n";
1550 });
1551
1552 // The AliasSetTracker has nicely partitioned our pointers by metadata
1553 // compatibility and potential for underlying-object overlap. As a result, we
1554 // only need to check for potential pointer dependencies within each alias
1555 // set.
1556 for (const auto &AS : AST) {
1557 bool AliasSetHasWrite = false;
1558
1559 // Map of (pointer to underlying objects, accessed address space) to last
1560 // access encountered.
1561 using UnderlyingObjToAccessMap =
1563 UnderlyingObjToAccessMap ObjToLastAccess;
1564
1565 // Set of access to check after all writes have been processed.
1566 PtrAccessMap DeferredAccesses;
1567
1568 // Iterate over each alias set twice, once to process read/write pointers,
1569 // and then to process read-only pointers.
1570
1571 auto ProcessAccesses = [&](bool UseDeferred) {
1572 PtrAccessMap &S = UseDeferred ? DeferredAccesses : Accesses;
1573
1574 // Note that both the alias-set tracker and the alias sets themselves used
1575 // ordered collections internally and so the iteration order here is
1576 // deterministic.
1577 for (const Value *ConstPtr : AS.getPointers()) {
1578 Value *Ptr = const_cast<Value *>(ConstPtr);
1579
1580 // For a single memory access in AliasSetTracker, Accesses may contain
1581 // both read and write, and they both need to be handled for CheckDeps.
1582 for (auto [AccessPtr, IsWrite] : S.keys()) {
1583 if (AccessPtr != Ptr)
1584 continue;
1585
1586 // If we're using the deferred access set, then it contains only
1587 // reads.
1588 bool IsReadOnlyPtr = ReadOnlyPtr.contains(Ptr) && !IsWrite;
1589 if (UseDeferred && !IsReadOnlyPtr)
1590 continue;
1591 // Otherwise, the pointer must be in the PtrAccessSet, either as a
1592 // read or a write.
1593 assert(((IsReadOnlyPtr && UseDeferred) || IsWrite ||
1594 S.contains(MemAccessInfo(Ptr, false))) &&
1595 "Alias-set pointer not in the access set?");
1596
1597 MemAccessInfo Access(Ptr, IsWrite);
1598 DepCands.insert(Access);
1599
1600 // Memorize read-only pointers for later processing and skip them in
1601 // the first round (they need to be checked after we have seen all
1602 // write pointers). Note: we also mark pointer that are not
1603 // consecutive as "read-only" pointers (so that we check
1604 // "a[b[i]] +="). Hence, we need the second check for "!IsWrite".
1605 if (!UseDeferred && IsReadOnlyPtr) {
1606 // We only use the pointer keys, the types vector values don't
1607 // matter.
1608 DeferredAccesses.insert({Access, {}});
1609 continue;
1610 }
1611
1612 // If this is a write - check other reads and writes for conflicts. If
1613 // this is a read only check other writes for conflicts (but only if
1614 // there is no other write to the ptr - this is an optimization to
1615 // catch "a[i] = a[i] + " without having to do a dependence check).
1616 if ((IsWrite || IsReadOnlyPtr) && AliasSetHasWrite) {
1617 CheckDeps.push_back(Access);
1618 IsRTCheckAnalysisNeeded = true;
1619 }
1620
1621 if (IsWrite)
1622 AliasSetHasWrite = true;
1623
1624 // Create sets of pointers connected by a shared alias set and
1625 // underlying object.
1626 SmallVector<const Value *, 16> &UOs = UnderlyingObjects[Ptr];
1627 UOs = {};
1628 ::getUnderlyingObjects(Ptr, UOs, LI);
1630 << "Underlying objects for pointer " << *Ptr << "\n");
1631 for (const Value *UnderlyingObj : UOs) {
1632 // nullptr never alias, don't join sets for pointer that have "null"
1633 // in their UnderlyingObjects list.
1634 if (isa<ConstantPointerNull>(UnderlyingObj) &&
1636 TheLoop->getHeader()->getParent(),
1637 UnderlyingObj->getType()->getPointerAddressSpace()))
1638 continue;
1639
1640 auto [It, Inserted] = ObjToLastAccess.try_emplace(
1641 {UnderlyingObj,
1642 cast<PointerType>(Ptr->getType())->getAddressSpace()},
1643 Access);
1644 if (!Inserted) {
1645 DepCands.unionSets(Access, It->second);
1646 It->second = Access;
1647 }
1648
1649 LLVM_DEBUG(dbgs() << " " << *UnderlyingObj << "\n");
1650 }
1651 }
1652 }
1653 };
1654
1655 ProcessAccesses(false);
1656 ProcessAccesses(true);
1657 }
1658}
1659
1660/// Check whether the access through \p Ptr has a constant stride.
1661std::optional<int64_t> llvm::getPtrStride(
1662 PredicatedScalarEvolution &PSE, Type *AccessTy, Value *Ptr, const Loop *Lp,
1663 const DominatorTree &DT, const DenseMap<Value *, const SCEV *> &StridesMap,
1664 bool ShouldCheckWrap, SmallVectorImpl<const SCEVPredicate *> *Predicates) {
1665 const SCEV *PtrScev = replaceSymbolicStrideSCEV(PSE, StridesMap, Ptr);
1666 if (PSE.getSE()->isLoopInvariant(PtrScev, Lp))
1667 return 0;
1668
1669 assert(Ptr->getType()->isPointerTy() && "Unexpected non-ptr");
1670
1671 const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PtrScev);
1672 if (Predicates && !AR) {
1673 AR = PSE.getSE()->convertSCEVToAddRecWithPredicates(PtrScev, Lp,
1674 *Predicates);
1675 }
1676
1677 if (!AR) {
1678 LLVM_DEBUG(dbgs() << "LAA: Bad stride - Not an AddRecExpr pointer " << *Ptr
1679 << " SCEV: " << *PtrScev << "\n");
1680 return std::nullopt;
1681 }
1682
1683 std::optional<int64_t> Stride =
1684 getStrideFromAddRec(AR, Lp, AccessTy, Ptr, PSE);
1685 if (!ShouldCheckWrap || !Stride)
1686 return Stride;
1687
1688 if (isNoWrap(PSE, AR, Ptr, AccessTy, Lp, DT, Stride, Predicates))
1689 return Stride;
1690
1691 LLVM_DEBUG(
1692 dbgs() << "LAA: Bad stride - Pointer may wrap in the address space "
1693 << *Ptr << " SCEV: " << *AR << "\n");
1694 return std::nullopt;
1695}
1696
1697/// Check whether the access through \p Ptr has a constant stride.
1698std::optional<int64_t>
1700 const Loop *Lp, const DominatorTree &DT,
1701 const DenseMap<Value *, const SCEV *> &StridesMap,
1702 bool Assume, bool ShouldCheckWrap) {
1704 std::optional<int64_t> Stride =
1705 getPtrStride(PSE, AccessTy, Ptr, Lp, DT, StridesMap, ShouldCheckWrap,
1706 Assume ? &Predicates : nullptr);
1707 PSE.addPredicates(Predicates);
1708 return Stride;
1709}
1710
1711std::optional<int64_t> llvm::getPointersDiff(Type *ElemTyA, Value *PtrA,
1712 Type *ElemTyB, Value *PtrB,
1713 const DataLayout &DL,
1714 ScalarEvolution &SE,
1715 bool StrictCheck, bool CheckType) {
1716 assert(PtrA && PtrB && "Expected non-nullptr pointers.");
1717
1718 // Make sure that A and B are different pointers.
1719 if (PtrA == PtrB)
1720 return 0;
1721
1722 // Make sure that the element types are the same if required.
1723 if (CheckType && ElemTyA != ElemTyB)
1724 return std::nullopt;
1725
1726 unsigned ASA = PtrA->getType()->getPointerAddressSpace();
1727 unsigned ASB = PtrB->getType()->getPointerAddressSpace();
1728
1729 // Check that the address spaces match.
1730 if (ASA != ASB)
1731 return std::nullopt;
1732 unsigned IdxWidth = DL.getIndexSizeInBits(ASA);
1733
1734 APInt OffsetA(IdxWidth, 0), OffsetB(IdxWidth, 0);
1735 const Value *PtrA1 = PtrA->stripAndAccumulateConstantOffsets(
1736 DL, OffsetA, /*AllowNonInbounds=*/true);
1737 const Value *PtrB1 = PtrB->stripAndAccumulateConstantOffsets(
1738 DL, OffsetB, /*AllowNonInbounds=*/true);
1739
1740 std::optional<int64_t> Val;
1741 if (PtrA1 == PtrB1) {
1742 // Retrieve the address space again as pointer stripping now tracks through
1743 // `addrspacecast`.
1744 ASA = cast<PointerType>(PtrA1->getType())->getAddressSpace();
1745 ASB = cast<PointerType>(PtrB1->getType())->getAddressSpace();
1746 // Check that the address spaces match and that the pointers are valid.
1747 if (ASA != ASB)
1748 return std::nullopt;
1749
1750 IdxWidth = DL.getIndexSizeInBits(ASA);
1751 OffsetA = OffsetA.sextOrTrunc(IdxWidth);
1752 OffsetB = OffsetB.sextOrTrunc(IdxWidth);
1753
1754 OffsetB -= OffsetA;
1755 Val = OffsetB.trySExtValue();
1756 } else {
1757 // Otherwise compute the distance with SCEV between the base pointers.
1758 const SCEV *PtrSCEVA = SE.getSCEV(PtrA);
1759 const SCEV *PtrSCEVB = SE.getSCEV(PtrB);
1760 std::optional<APInt> Diff =
1761 SE.computeConstantDifference(PtrSCEVB, PtrSCEVA);
1762 if (!Diff)
1763 return std::nullopt;
1764 Val = Diff->trySExtValue();
1765 }
1766
1767 if (!Val)
1768 return std::nullopt;
1769
1770 int64_t Size = DL.getTypeStoreSize(ElemTyA);
1771 int64_t Dist = *Val / Size;
1772
1773 // Ensure that the calculated distance matches the type-based one after all
1774 // the bitcasts removal in the provided pointers.
1775 if (!StrictCheck || Dist * Size == Val)
1776 return Dist;
1777 return std::nullopt;
1778}
1779
1781 const DataLayout &DL, ScalarEvolution &SE,
1782 SmallVectorImpl<unsigned> &SortedIndices) {
1784 VL, [](const Value *V) { return V->getType()->isPointerTy(); }) &&
1785 "Expected list of pointer operands.");
1786 // Walk over the pointers, and map each of them to an offset relative to
1787 // first pointer in the array.
1788 Value *Ptr0 = VL[0];
1789
1790 using DistOrdPair = std::pair<int64_t, unsigned>;
1791 auto Compare = llvm::less_first();
1792 std::set<DistOrdPair, decltype(Compare)> Offsets(Compare);
1793 Offsets.emplace(0, 0);
1794 bool IsConsecutive = true;
1795 for (auto [Idx, Ptr] : drop_begin(enumerate(VL))) {
1796 std::optional<int64_t> Diff =
1797 getPointersDiff(ElemTy, Ptr0, ElemTy, Ptr, DL, SE,
1798 /*StrictCheck=*/true);
1799 if (!Diff)
1800 return false;
1801
1802 // Check if the pointer with the same offset is found.
1803 int64_t Offset = *Diff;
1804 auto [It, IsInserted] = Offsets.emplace(Offset, Idx);
1805 if (!IsInserted)
1806 return false;
1807 // Consecutive order if the inserted element is the last one.
1808 IsConsecutive &= std::next(It) == Offsets.end();
1809 }
1810 SortedIndices.clear();
1811 if (!IsConsecutive) {
1812 // Fill SortedIndices array only if it is non-consecutive.
1813 SortedIndices.resize(VL.size());
1814 for (auto [Idx, Off] : enumerate(Offsets))
1815 SortedIndices[Idx] = Off.second;
1816 }
1817 return true;
1818}
1819
1820/// Returns true if the memory operations \p A and \p B are consecutive.
1822 ScalarEvolution &SE, bool CheckType) {
1825 if (!PtrA || !PtrB)
1826 return false;
1827 Type *ElemTyA = getLoadStoreType(A);
1828 Type *ElemTyB = getLoadStoreType(B);
1829 std::optional<int64_t> Diff =
1830 getPointersDiff(ElemTyA, PtrA, ElemTyB, PtrB, DL, SE,
1831 /*StrictCheck=*/true, CheckType);
1832 return Diff == 1;
1833}
1834
1836 visitPointers(SI->getPointerOperand(), *InnermostLoop,
1837 [this, SI](Value *Ptr) {
1838 Accesses[MemAccessInfo(Ptr, true)].push_back(AccessIdx);
1839 InstMap.push_back(SI);
1840 ++AccessIdx;
1841 });
1842}
1843
1845 visitPointers(LI->getPointerOperand(), *InnermostLoop,
1846 [this, LI](Value *Ptr) {
1847 Accesses[MemAccessInfo(Ptr, false)].push_back(AccessIdx);
1848 InstMap.push_back(LI);
1849 ++AccessIdx;
1850 });
1851}
1852
1872
1874 switch (Type) {
1875 case NoDep:
1876 case Forward:
1878 case Unknown:
1879 case IndirectUnsafe:
1880 case InvariantUnsafe:
1881 return false;
1882
1884 case Backward:
1886 return true;
1887 }
1888 llvm_unreachable("unexpected DepType!");
1889}
1890
1895
1897 switch (Type) {
1898 case Forward:
1900 return true;
1901
1902 case NoDep:
1903 case Unknown:
1905 case Backward:
1907 case IndirectUnsafe:
1908 case InvariantUnsafe:
1909 return false;
1910 }
1911 llvm_unreachable("unexpected DepType!");
1912}
1913
1914bool MemoryDepChecker::couldPreventStoreLoadForward(uint64_t Distance,
1915 uint64_t TypeByteSize,
1916 unsigned CommonStride) {
1917 // If loads occur at a distance that is not a multiple of a feasible vector
1918 // factor store-load forwarding does not take place.
1919 // Positive dependences might cause troubles because vectorizing them might
1920 // prevent store-load forwarding making vectorized code run a lot slower.
1921 // a[i] = a[i-3] ^ a[i-8];
1922 // The stores to a[i:i+1] don't align with the stores to a[i-3:i-2] and
1923 // hence on your typical architecture store-load forwarding does not take
1924 // place. Vectorizing in such cases does not make sense.
1925 // Store-load forwarding distance.
1926
1927 // After this many iterations store-to-load forwarding conflicts should not
1928 // cause any slowdowns.
1929 const uint64_t NumItersForStoreLoadThroughMemory = 8 * TypeByteSize;
1930 // Maximum vector factor.
1931 uint64_t MaxVFWithoutSLForwardIssuesPowerOf2 =
1932 std::min(VectorizerParams::MaxVectorWidth * TypeByteSize,
1933 MaxStoreLoadForwardSafeDistanceInBits);
1934
1935 // Compute the smallest VF at which the store and load would be misaligned.
1936 for (uint64_t VF = 2 * TypeByteSize;
1937 VF <= MaxVFWithoutSLForwardIssuesPowerOf2; VF *= 2) {
1938 // If the number of vector iteration between the store and the load are
1939 // small we could incur conflicts.
1940 if (Distance % VF && Distance / VF < NumItersForStoreLoadThroughMemory) {
1941 MaxVFWithoutSLForwardIssuesPowerOf2 = (VF >> 1);
1942 break;
1943 }
1944 }
1945
1946 if (MaxVFWithoutSLForwardIssuesPowerOf2 < 2 * TypeByteSize) {
1947 LLVM_DEBUG(
1948 dbgs() << "LAA: Distance " << Distance
1949 << " that could cause a store-load forwarding conflict\n");
1950 return true;
1951 }
1952
1953 if (CommonStride &&
1954 MaxVFWithoutSLForwardIssuesPowerOf2 <
1955 MaxStoreLoadForwardSafeDistanceInBits &&
1956 MaxVFWithoutSLForwardIssuesPowerOf2 !=
1957 VectorizerParams::MaxVectorWidth * TypeByteSize) {
1958 uint64_t MaxVF =
1959 bit_floor(MaxVFWithoutSLForwardIssuesPowerOf2 / CommonStride);
1960 uint64_t MaxVFInBits = MaxVF * TypeByteSize * 8;
1961 MaxStoreLoadForwardSafeDistanceInBits =
1962 std::min(MaxStoreLoadForwardSafeDistanceInBits, MaxVFInBits);
1963 }
1964 return false;
1965}
1966
1967void MemoryDepChecker::mergeInStatus(VectorizationSafetyStatus S) {
1968 if (Status < S)
1969 Status = S;
1970}
1971
1972/// Given a dependence-distance \p Dist between two memory accesses, that have
1973/// strides in the same direction whose absolute value of the maximum stride is
1974/// given in \p MaxStride, in a loop whose maximum backedge taken count is \p
1975/// MaxBTC, check if it is possible to prove statically that the dependence
1976/// distance is larger than the range that the accesses will travel through the
1977/// execution of the loop. If so, return true; false otherwise. This is useful
1978/// for example in loops such as the following (PR31098):
1979///
1980/// for (i = 0; i < D; ++i) {
1981/// = out[i];
1982/// out[i+D] =
1983/// }
1985 const SCEV &MaxBTC, const SCEV &Dist,
1986 uint64_t MaxStride) {
1987
1988 // If we can prove that
1989 // (**) |Dist| > MaxBTC * Step
1990 // where Step is the absolute stride of the memory accesses in bytes,
1991 // then there is no dependence.
1992 //
1993 // Rationale:
1994 // We basically want to check if the absolute distance (|Dist/Step|)
1995 // is >= the loop iteration count (or > MaxBTC).
1996 // This is equivalent to the Strong SIV Test (Practical Dependence Testing,
1997 // Section 4.2.1); Note, that for vectorization it is sufficient to prove
1998 // that the dependence distance is >= VF; This is checked elsewhere.
1999 // But in some cases we can prune dependence distances early, and
2000 // even before selecting the VF, and without a runtime test, by comparing
2001 // the distance against the loop iteration count. Since the vectorized code
2002 // will be executed only if LoopCount >= VF, proving distance >= LoopCount
2003 // also guarantees that distance >= VF.
2004 //
2005 const SCEV *Step = SE.getConstant(MaxBTC.getType(), MaxStride);
2006 const SCEV *Product = SE.getMulExpr(&MaxBTC, Step);
2007
2008 const SCEV *CastedDist = &Dist;
2009 const SCEV *CastedProduct = Product;
2010 uint64_t DistTypeSizeBits = DL.getTypeSizeInBits(Dist.getType());
2011 uint64_t ProductTypeSizeBits = DL.getTypeSizeInBits(Product->getType());
2012
2013 // The dependence distance can be positive/negative, so we sign extend Dist;
2014 // The multiplication of the absolute stride in bytes and the
2015 // backedgeTakenCount is non-negative, so we zero extend Product.
2016 if (DistTypeSizeBits > ProductTypeSizeBits)
2017 CastedProduct = SE.getZeroExtendExpr(Product, Dist.getType());
2018 else
2019 CastedDist = SE.getNoopOrSignExtend(&Dist, Product->getType());
2020
2021 // Is Dist - (MaxBTC * Step) > 0 ?
2022 // (If so, then we have proven (**) because |Dist| >= Dist)
2023 const SCEV *Minus = SE.getMinusSCEV(CastedDist, CastedProduct);
2024 if (SE.isKnownPositive(Minus))
2025 return true;
2026
2027 // Second try: Is -Dist - (MaxBTC * Step) > 0 ?
2028 // (If so, then we have proven (**) because |Dist| >= -1*Dist)
2029 const SCEV *NegDist = SE.getNegativeSCEV(CastedDist);
2030 Minus = SE.getMinusSCEV(NegDist, CastedProduct);
2031 return SE.isKnownPositive(Minus);
2032}
2033
2034/// Check the dependence for two accesses with the same stride \p Stride.
2035/// \p Distance is the positive distance in bytes, and \p TypeByteSize is type
2036/// size in bytes.
2037///
2038/// \returns true if they are independent.
2040 uint64_t TypeByteSize) {
2041 assert(Stride > 1 && "The stride must be greater than 1");
2042 assert(TypeByteSize > 0 && "The type size in byte must be non-zero");
2043 assert(Distance > 0 && "The distance must be non-zero");
2044
2045 // Skip if the distance is not multiple of type byte size.
2046 if (Distance % TypeByteSize)
2047 return false;
2048
2049 // No dependence if the distance is not multiple of the stride.
2050 // E.g.
2051 // for (i = 0; i < 1024 ; i += 4)
2052 // A[i+2] = A[i] + 1;
2053 //
2054 // Two accesses in memory (distance is 2, stride is 4):
2055 // | A[0] | | | | A[4] | | | |
2056 // | | | A[2] | | | | A[6] | |
2057 //
2058 // E.g.
2059 // for (i = 0; i < 1024 ; i += 3)
2060 // A[i+4] = A[i] + 1;
2061 //
2062 // Two accesses in memory (distance is 4, stride is 3):
2063 // | A[0] | | | A[3] | | | A[6] | | |
2064 // | | | | | A[4] | | | A[7] | |
2065 return Distance % Stride;
2066}
2067
2068bool MemoryDepChecker::areAccessesCompletelyBeforeOrAfter(const SCEV *Src,
2069 Type *SrcTy,
2070 const SCEV *Sink,
2071 Type *SinkTy) {
2072 const SCEV *BTC = PSE.getBackedgeTakenCount();
2073 const SCEV *SymbolicMaxBTC = PSE.getSymbolicMaxBackedgeTakenCount();
2074 ScalarEvolution &SE = *PSE.getSE();
2075 const auto &[SrcStart_, SrcEnd_] =
2076 getStartAndEndForAccess(InnermostLoop, Src, SrcTy, BTC, SymbolicMaxBTC,
2077 &SE, &PointerBounds, DT, AC, LoopGuards);
2078 if (isa<SCEVCouldNotCompute>(SrcStart_) || isa<SCEVCouldNotCompute>(SrcEnd_))
2079 return false;
2080
2081 const auto &[SinkStart_, SinkEnd_] =
2082 getStartAndEndForAccess(InnermostLoop, Sink, SinkTy, BTC, SymbolicMaxBTC,
2083 &SE, &PointerBounds, DT, AC, LoopGuards);
2084 if (isa<SCEVCouldNotCompute>(SinkStart_) ||
2085 isa<SCEVCouldNotCompute>(SinkEnd_))
2086 return false;
2087
2088 if (!LoopGuards)
2089 LoopGuards.emplace(ScalarEvolution::LoopGuards::collect(InnermostLoop, SE));
2090
2091 auto SrcEnd = SE.applyLoopGuards(SrcEnd_, *LoopGuards);
2092 auto SinkStart = SE.applyLoopGuards(SinkStart_, *LoopGuards);
2093 if (SE.isKnownPredicate(CmpInst::ICMP_ULE, SrcEnd, SinkStart))
2094 return true;
2095
2096 auto SinkEnd = SE.applyLoopGuards(SinkEnd_, *LoopGuards);
2097 auto SrcStart = SE.applyLoopGuards(SrcStart_, *LoopGuards);
2098 return SE.isKnownPredicate(CmpInst::ICMP_ULE, SinkEnd, SrcStart);
2099}
2100
2102 MemoryDepChecker::DepDistanceStrideAndSizeInfo>
2103MemoryDepChecker::getDependenceDistanceStrideAndSize(
2104 const AccessAnalysis::MemAccessInfo &A, Instruction *AInst,
2105 const AccessAnalysis::MemAccessInfo &B, Instruction *BInst) {
2106 const auto &DL = InnermostLoop->getHeader()->getDataLayout();
2107 auto &SE = *PSE.getSE();
2108 const auto &[APtr, AIsWrite] = A;
2109 const auto &[BPtr, BIsWrite] = B;
2110
2111 // Two reads are independent.
2112 if (!AIsWrite && !BIsWrite)
2114
2115 Type *ATy = getLoadStoreType(AInst);
2116 Type *BTy = getLoadStoreType(BInst);
2117
2118 // We cannot check pointers in different address spaces.
2119 if (APtr->getType()->getPointerAddressSpace() !=
2120 BPtr->getType()->getPointerAddressSpace())
2122
2124 std::optional<int64_t> StrideAPtr =
2125 getPtrStride(PSE, ATy, APtr, InnermostLoop, *DT, SymbolicStrides,
2126 /*ShouldCheckWrap=*/true, &Predicates);
2127 std::optional<int64_t> StrideBPtr =
2128 getPtrStride(PSE, BTy, BPtr, InnermostLoop, *DT, SymbolicStrides,
2129 /*ShouldCheckWrap=*/true, &Predicates);
2130 PSE.addPredicates(Predicates);
2131
2132 const SCEV *Src = PSE.getSCEV(APtr);
2133 const SCEV *Sink = PSE.getSCEV(BPtr);
2134
2135 // If the induction step is negative we have to invert source and sink of the
2136 // dependence when measuring the distance between them. We should not swap
2137 // AIsWrite with BIsWrite, as their uses expect them in program order.
2138 if (StrideAPtr && *StrideAPtr < 0) {
2139 std::swap(Src, Sink);
2140 std::swap(AInst, BInst);
2141 std::swap(ATy, BTy);
2142 std::swap(StrideAPtr, StrideBPtr);
2143 }
2144
2145 const SCEV *Dist = SE.getMinusSCEV(Sink, Src);
2146
2147 LLVM_DEBUG(dbgs() << "LAA: Src Scev: " << *Src << "Sink Scev: " << *Sink
2148 << "\n");
2149 LLVM_DEBUG(dbgs() << "LAA: Distance for " << *AInst << " to " << *BInst
2150 << ": " << *Dist << "\n");
2151
2152 // Need accesses with constant strides and the same direction for further
2153 // dependence analysis. We don't want to vectorize "A[B[i]] += ..." and
2154 // similar code or pointer arithmetic that could wrap in the address space.
2155
2156 // If either Src or Sink are not strided (i.e. not a non-wrapping AddRec) and
2157 // not loop-invariant (stride will be 0 in that case), we cannot analyze the
2158 // dependence further and also cannot generate runtime checks.
2159 if (!StrideAPtr || !StrideBPtr) {
2160 LLVM_DEBUG(dbgs() << "Pointer access with non-constant stride\n");
2162 }
2163
2164 int64_t StrideAPtrInt = *StrideAPtr;
2165 int64_t StrideBPtrInt = *StrideBPtr;
2166 LLVM_DEBUG(dbgs() << "LAA: Src induction step: " << StrideAPtrInt
2167 << " Sink induction step: " << StrideBPtrInt << "\n");
2168 // At least Src or Sink are loop invariant and the other is strided or
2169 // invariant.
2170 if (!StrideAPtrInt || !StrideBPtrInt) {
2171 // If both are loop-invariant and access the same location, we cannot
2172 // vectorize.
2173 if (!StrideAPtrInt && !StrideBPtrInt && Dist->isZero())
2175 // Otherwise, we can generate a runtime check to disambiguate the accesses.
2177 }
2178
2179 // Both Src and Sink have a constant stride, check if they are in the same
2180 // direction.
2181 if ((StrideAPtrInt > 0) != (StrideBPtrInt > 0)) {
2182 LLVM_DEBUG(
2183 dbgs() << "Pointer access with strides in different directions\n");
2185 }
2186
2187 TypeSize AStoreSz = DL.getTypeStoreSize(ATy);
2188 TypeSize BStoreSz = DL.getTypeStoreSize(BTy);
2189
2190 // If store sizes are not the same, set TypeByteSize to zero, so we can check
2191 // it in the caller isDependent.
2192 uint64_t ASz = DL.getTypeAllocSize(ATy);
2193 uint64_t BSz = DL.getTypeAllocSize(BTy);
2194 uint64_t TypeByteSize = (AStoreSz == BStoreSz) ? BSz : 0;
2195
2196 uint64_t StrideAScaled = std::abs(StrideAPtrInt) * ASz;
2197 uint64_t StrideBScaled = std::abs(StrideBPtrInt) * BSz;
2198
2199 uint64_t MaxStride = std::max(StrideAScaled, StrideBScaled);
2200
2201 std::optional<uint64_t> CommonStride;
2202 if (StrideAScaled == StrideBScaled)
2203 CommonStride = StrideAScaled;
2204
2205 // TODO: Historically, we didn't retry with runtime checks when (unscaled)
2206 // strides were different but there is no inherent reason to.
2207 if (!isa<SCEVConstant>(Dist))
2208 ShouldRetryWithRuntimeChecks |= StrideAPtrInt == StrideBPtrInt;
2209
2210 // If distance is a SCEVCouldNotCompute, return Unknown immediately.
2211 if (isa<SCEVCouldNotCompute>(Dist)) {
2212 LLVM_DEBUG(dbgs() << "LAA: Uncomputable distance.\n");
2213 return Dependence::Unknown;
2214 }
2215
2216 return DepDistanceStrideAndSizeInfo(Dist, MaxStride, CommonStride,
2217 TypeByteSize, AIsWrite, BIsWrite);
2218}
2219
2221MemoryDepChecker::isDependent(const MemAccessInfo &A, unsigned AIdx,
2222 const MemAccessInfo &B, unsigned BIdx) {
2223 assert(AIdx < BIdx && "Must pass arguments in program order");
2224
2225 // Check if we can prove that Sink only accesses memory after Src's end or
2226 // vice versa. The helper is used to perform the checks only on the exit paths
2227 // where it helps to improve the analysis result.
2228 auto CheckCompletelyBeforeOrAfter = [&]() {
2229 auto *APtr = A.getPointer();
2230 auto *BPtr = B.getPointer();
2231 Type *ATy = getLoadStoreType(InstMap[AIdx]);
2232 Type *BTy = getLoadStoreType(InstMap[BIdx]);
2233 const SCEV *Src = PSE.getSCEV(APtr);
2234 const SCEV *Sink = PSE.getSCEV(BPtr);
2235 return areAccessesCompletelyBeforeOrAfter(Src, ATy, Sink, BTy);
2236 };
2237
2238 // Get the dependence distance, stride, type size and what access writes for
2239 // the dependence between A and B.
2240 auto Res =
2241 getDependenceDistanceStrideAndSize(A, InstMap[AIdx], B, InstMap[BIdx]);
2242 if (std::holds_alternative<Dependence::DepType>(Res)) {
2243 if (std::get<Dependence::DepType>(Res) == Dependence::Unknown &&
2244 CheckCompletelyBeforeOrAfter())
2245 return Dependence::NoDep;
2246 return std::get<Dependence::DepType>(Res);
2247 }
2248
2249 auto &[Dist, MaxStride, CommonStride, TypeByteSize, AIsWrite, BIsWrite] =
2250 std::get<DepDistanceStrideAndSizeInfo>(Res);
2251 bool HasSameSize = TypeByteSize > 0;
2252
2253 ScalarEvolution &SE = *PSE.getSE();
2254 auto &DL = InnermostLoop->getHeader()->getDataLayout();
2255
2256 // If the distance between the acecsses is larger than their maximum absolute
2257 // stride multiplied by the symbolic maximum backedge taken count (which is an
2258 // upper bound of the number of iterations), the accesses are independet, i.e.
2259 // they are far enough appart that accesses won't access the same location
2260 // across all loop ierations.
2261 if (HasSameSize &&
2263 DL, SE, *(PSE.getSymbolicMaxBackedgeTakenCount()), *Dist, MaxStride))
2264 return Dependence::NoDep;
2265
2266 const APInt *APDist = nullptr;
2267 uint64_t ConstDist = 0;
2268 if (match(Dist, m_scev_APInt(APDist))) {
2269 std::optional<uint64_t> Val = APDist->abs().tryZExtValue();
2270 if (!Val) {
2271 LLVM_DEBUG(dbgs() << "LAA: Constant distance does not fit in 64 bits.\n");
2272 return Dependence::Unknown;
2273 }
2274 ConstDist = *Val;
2275 }
2276
2277 // Attempt to prove strided accesses independent.
2278 if (APDist) {
2279 // If the distance between accesses and their strides are known constants,
2280 // check whether the accesses interlace each other.
2281 if (ConstDist > 0 && CommonStride && CommonStride > 1 && HasSameSize &&
2282 areStridedAccessesIndependent(ConstDist, *CommonStride, TypeByteSize)) {
2283 LLVM_DEBUG(dbgs() << "LAA: Strided accesses are independent\n");
2284 return Dependence::NoDep;
2285 }
2286 } else {
2287 if (!LoopGuards)
2288 LoopGuards.emplace(
2289 ScalarEvolution::LoopGuards::collect(InnermostLoop, SE));
2290 Dist = SE.applyLoopGuards(Dist, *LoopGuards);
2291 }
2292
2293 // Negative distances are not plausible dependencies.
2294 if (SE.isKnownNonPositive(Dist)) {
2295 if (SE.isKnownNonNegative(Dist)) {
2296 if (HasSameSize) {
2297 // Write to the same location with the same size.
2298 return Dependence::Forward;
2299 }
2300 LLVM_DEBUG(dbgs() << "LAA: possibly zero dependence difference but "
2301 "different type sizes\n");
2302 return Dependence::Unknown;
2303 }
2304
2305 bool IsTrueDataDependence = (AIsWrite && !BIsWrite);
2306 // Check if the first access writes to a location that is read in a later
2307 // iteration, where the distance between them is not a multiple of a vector
2308 // factor and relatively small.
2309 //
2310 // NOTE: There is no need to update MaxSafeVectorWidthInBits after call to
2311 // couldPreventStoreLoadForward, even if it changed MinDepDistBytes, since a
2312 // forward dependency will allow vectorization using any width.
2313
2314 if (IsTrueDataDependence && EnableForwardingConflictDetection) {
2315 if (!ConstDist) {
2316 return CheckCompletelyBeforeOrAfter() ? Dependence::NoDep
2318 }
2319 if (!HasSameSize ||
2320 couldPreventStoreLoadForward(ConstDist, TypeByteSize)) {
2321 LLVM_DEBUG(
2322 dbgs() << "LAA: Forward but may prevent st->ld forwarding\n");
2324 }
2325 }
2326
2327 LLVM_DEBUG(dbgs() << "LAA: Dependence is negative\n");
2328 return Dependence::Forward;
2329 }
2330
2331 std::optional<int64_t> MinDistanceOpt =
2333 if (!MinDistanceOpt) {
2334 LLVM_DEBUG(dbgs() << "LAA: Minimum distance does not fit in 64 bits.\n");
2335 return Dependence::Unknown;
2336 }
2337 int64_t MinDistance = *MinDistanceOpt;
2338 // Below we only handle strictly positive distances.
2339 if (MinDistance <= 0) {
2340 return CheckCompletelyBeforeOrAfter() ? Dependence::NoDep
2342 }
2343
2344 if (!HasSameSize) {
2345 if (CheckCompletelyBeforeOrAfter())
2346 return Dependence::NoDep;
2347 LLVM_DEBUG(dbgs() << "LAA: ReadWrite-Write positive dependency with "
2348 "different type sizes\n");
2349 return Dependence::Unknown;
2350 }
2351 // Bail out early if passed-in parameters make vectorization not feasible.
2352 unsigned MinForcedFactor =
2353 std::max(1U, VectorizerParams::VectorizationFactor.getKnownMinValue());
2354 unsigned ForcedUnroll = (VectorizerParams::VectorizationInterleave ?
2356 // The minimum number of iterations for a vectorized/unrolled version.
2357 unsigned MinNumIter = std::max(MinForcedFactor * ForcedUnroll, 2U);
2358
2359 // It's not vectorizable if the distance is smaller than the minimum distance
2360 // needed for a vectroized/unrolled version. Vectorizing one iteration in
2361 // front needs MaxStride. Vectorizing the last iteration needs TypeByteSize.
2362 // (No need to plus the last gap distance).
2363 //
2364 // E.g. Assume one char is 1 byte in memory and one int is 4 bytes.
2365 // foo(int *A) {
2366 // int *B = (int *)((char *)A + 14);
2367 // for (i = 0 ; i < 1024 ; i += 2)
2368 // B[i] = A[i] + 1;
2369 // }
2370 //
2371 // Two accesses in memory (stride is 4 * 2):
2372 // | A[0] | | A[2] | | A[4] | | A[6] | |
2373 // | B[0] | | B[2] | | B[4] |
2374 //
2375 // MinDistance needs for vectorizing iterations except the last iteration:
2376 // 4 * 2 * (MinNumIter - 1). MinDistance needs for the last iteration: 4.
2377 // So the minimum distance needed is: 4 * 2 * (MinNumIter - 1) + 4.
2378 //
2379 // If MinNumIter is 2, it is vectorizable as the minimum distance needed is
2380 // 12, which is less than distance.
2381 //
2382 // If MinNumIter is 4 (Say if a user forces the vectorization factor to be 4),
2383 // the minimum distance needed is 28, which is greater than distance. It is
2384 // not safe to do vectorization.
2385 //
2386 // We use MaxStride (maximum of src and sink strides) to get a conservative
2387 // lower bound on the MinDistanceNeeded in case of different strides.
2388
2389 // We know that Dist is positive, but it may not be constant. Use the signed
2390 // minimum for computations below, as this ensures we compute the closest
2391 // possible dependence distance.
2392 uint64_t MinDistanceNeeded = MaxStride * (MinNumIter - 1) + TypeByteSize;
2393 if (MinDistanceNeeded > static_cast<uint64_t>(MinDistance)) {
2394 if (!ConstDist) {
2395 // For non-constant distances, we checked the lower bound of the
2396 // dependence distance and the distance may be larger at runtime (and safe
2397 // for vectorization). Classify it as Unknown, so we re-try with runtime
2398 // checks, unless we can prove both accesses cannot overlap.
2399 return CheckCompletelyBeforeOrAfter() ? Dependence::NoDep
2401 }
2402 LLVM_DEBUG(dbgs() << "LAA: Failure because of positive minimum distance "
2403 << MinDistance << '\n');
2404 return Dependence::Backward;
2405 }
2406
2407 // Unsafe if the minimum distance needed is greater than smallest dependence
2408 // distance distance.
2409 if (MinDistanceNeeded > MinDepDistBytes) {
2410 LLVM_DEBUG(dbgs() << "LAA: Failure because it needs at least "
2411 << MinDistanceNeeded << " size in bytes\n");
2412 return Dependence::Backward;
2413 }
2414
2415 MinDepDistBytes =
2416 std::min(static_cast<uint64_t>(MinDistance), MinDepDistBytes);
2417
2418 bool IsTrueDataDependence = (!AIsWrite && BIsWrite);
2419 if (IsTrueDataDependence && EnableForwardingConflictDetection && ConstDist &&
2420 couldPreventStoreLoadForward(MinDistance, TypeByteSize, *CommonStride))
2422
2423 uint64_t MaxVF = MinDepDistBytes / MaxStride;
2424 LLVM_DEBUG(dbgs() << "LAA: Positive min distance " << MinDistance
2425 << " with max VF = " << MaxVF << '\n');
2426
2427 uint64_t MaxVFInBits = MaxVF * TypeByteSize * 8;
2428 if (!ConstDist && MaxVFInBits < MaxTargetVectorWidthInBits) {
2429 // For non-constant distances, we checked the lower bound of the dependence
2430 // distance and the distance may be larger at runtime (and safe for
2431 // vectorization). Classify it as Unknown, so we re-try with runtime checks,
2432 // unless we can prove both accesses cannot overlap.
2433 return CheckCompletelyBeforeOrAfter() ? Dependence::NoDep
2435 }
2436
2437 if (CheckCompletelyBeforeOrAfter())
2438 return Dependence::NoDep;
2439
2440 MaxSafeVectorWidthInBits = std::min(MaxSafeVectorWidthInBits, MaxVFInBits);
2442}
2443
2445 ArrayRef<MemAccessInfo> CheckDeps) {
2446
2447 MinDepDistBytes = -1;
2449 for (MemAccessInfo CurAccess : CheckDeps) {
2450 if (Visited.contains(CurAccess))
2451 continue;
2452
2453 // Check accesses within this set.
2455 DepCands.findLeader(CurAccess);
2457 DepCands.member_end();
2458
2459 // Check every access pair.
2460 while (AI != AE) {
2461 Visited.insert(*AI);
2462 bool AIIsWrite = AI->getInt();
2463 // Reads from the same pointer don't create extra hazards, but multiple
2464 // stores do (WAW), so start from AI for writes and next(AI) for reads.
2466 (AIIsWrite ? AI : std::next(AI));
2467 while (OI != AE) {
2468 // Check every accessing instruction pair in program order.
2469 auto &Acc = Accesses[*AI];
2470 for (std::vector<unsigned>::iterator I1 = Acc.begin(), I1E = Acc.end();
2471 I1 != I1E; ++I1)
2472 // When checking for WAW (OI == AI) caused by multiple writes to the
2473 // same pointer, start I2 at the next access past I1 to avoid
2474 // self-comparison.
2475 for (std::vector<unsigned>::iterator
2476 I2 = (OI == AI ? std::next(I1) : Accesses[*OI].begin()),
2477 I2E = (OI == AI ? I1E : Accesses[*OI].end());
2478 I2 != I2E; ++I2) {
2479 auto A = std::make_pair(&*AI, *I1);
2480 auto B = std::make_pair(&*OI, *I2);
2481
2482 assert(*I1 != *I2);
2483 if (*I1 > *I2)
2484 std::swap(A, B);
2485
2487 isDependent(*A.first, A.second, *B.first, B.second);
2489
2490 // Gather dependences unless we accumulated MaxDependences
2491 // dependences. In that case return as soon as we find the first
2492 // unsafe dependence. This puts a limit on this quadratic
2493 // algorithm.
2494 if (RecordDependences) {
2495 if (Type != Dependence::NoDep)
2496 Dependences.emplace_back(A.second, B.second, Type);
2497
2498 if (Dependences.size() >= MaxDependences) {
2499 RecordDependences = false;
2500 Dependences.clear();
2502 << "Too many dependences, stopped recording\n");
2503 }
2504 }
2505 if (!RecordDependences && !isSafeForVectorization())
2506 return false;
2507 }
2508 ++OI;
2509 }
2510 ++AI;
2511 }
2512 }
2513
2514 LLVM_DEBUG(dbgs() << "Total Dependences: " << Dependences.size() << "\n");
2515 return isSafeForVectorization();
2516}
2517
2520 MemAccessInfo Access(Ptr, IsWrite);
2521 auto I = Accesses.find(Access);
2523 if (I != Accesses.end()) {
2524 transform(I->second, std::back_inserter(Insts),
2525 [&](unsigned Idx) { return this->InstMap[Idx]; });
2526 }
2527
2528 return Insts;
2529}
2530
2532 "NoDep",
2533 "Unknown",
2534 "IndirectUnsafe",
2535 "InvariantUnsafe",
2536 "Forward",
2537 "ForwardButPreventsForwarding",
2538 "Backward",
2539 "BackwardVectorizable",
2540 "BackwardVectorizableButPreventsForwarding"};
2541
2543 raw_ostream &OS, unsigned Depth,
2544 const SmallVectorImpl<Instruction *> &Instrs) const {
2545 OS.indent(Depth) << DepName[Type] << ":\n";
2546 OS.indent(Depth + 2) << *Instrs[Source] << " -> \n";
2547 OS.indent(Depth + 2) << *Instrs[Destination] << "\n";
2548}
2549
2550bool LoopAccessInfo::canAnalyzeLoop() {
2551 // We need to have a loop header.
2552 LLVM_DEBUG(dbgs() << "\nLAA: Checking a loop in '"
2553 << TheLoop->getHeader()->getParent()->getName() << "' from "
2554 << TheLoop->getLocStr() << "\n");
2555
2556 // We can only analyze innermost loops.
2557 if (!TheLoop->isInnermost()) {
2558 LLVM_DEBUG(dbgs() << "LAA: loop is not the innermost loop\n");
2559 recordAnalysis("NotInnerMostLoop") << "loop is not the innermost loop";
2560 return false;
2561 }
2562
2563 // We must have a single backedge.
2564 if (TheLoop->getNumBackEdges() != 1) {
2565 LLVM_DEBUG(
2566 dbgs() << "LAA: loop control flow is not understood by analyzer\n");
2567 recordAnalysis("CFGNotUnderstood")
2568 << "loop control flow is not understood by analyzer";
2569 return false;
2570 }
2571
2572 // ScalarEvolution needs to be able to find the symbolic max backedge taken
2573 // count, which is an upper bound on the number of loop iterations. The loop
2574 // may execute fewer iterations, if it exits via an uncountable exit.
2575 const SCEV *ExitCount = PSE->getSymbolicMaxBackedgeTakenCount();
2576 if (isa<SCEVCouldNotCompute>(ExitCount)) {
2577 recordAnalysis("CantComputeNumberOfIterations")
2578 << "could not determine number of loop iterations";
2579 LLVM_DEBUG(dbgs() << "LAA: SCEV could not compute the loop exit count.\n");
2580 return false;
2581 }
2582
2583 LLVM_DEBUG(dbgs() << "LAA: Found an analyzable loop: "
2584 << TheLoop->getHeader()->getName() << "\n");
2585 return true;
2586}
2587
2588bool LoopAccessInfo::analyzeLoop(AAResults *AA, const LoopInfo *LI,
2589 const TargetLibraryInfo *TLI,
2590 DominatorTree *DT) {
2591 // Holds the Load and Store instructions.
2594 SmallPtrSet<MDNode *, 8> LoopAliasScopes;
2595
2596 // Holds all the different accesses in the loop.
2597 unsigned NumReads = 0;
2598 unsigned NumReadWrites = 0;
2599
2600 bool HasComplexMemInst = false;
2601
2602 // A runtime check is only legal to insert if there are no convergent calls.
2603 HasConvergentOp = false;
2604
2605 PtrRtChecking->Pointers.clear();
2606 PtrRtChecking->Need = false;
2607
2608 const bool IsAnnotatedParallel = TheLoop->isAnnotatedParallel();
2609
2610 const bool EnableMemAccessVersioningOfLoop =
2612 !TheLoop->getHeader()->getParent()->hasOptSize();
2613
2614 // Traverse blocks in fixed RPOT order, regardless of their storage in the
2615 // loop info, as it may be arbitrary.
2616 LoopBlocksRPO RPOT(TheLoop);
2617 RPOT.perform(LI);
2618
2619 // Don't return early as soon as we found a memory access that cannot be
2620 // vectorize - HasConvergentOp must still be computed as it is part of LAI's
2621 // public API (used by LoopDistribute).
2622 for (BasicBlock *BB : RPOT) {
2623 // Scan the BB and collect legal loads and stores. Also detect any
2624 // convergent instructions.
2625 for (Instruction &I : *BB) {
2626 if (auto *Call = dyn_cast<CallBase>(&I)) {
2627 if (Call->isConvergent())
2628 HasConvergentOp = true;
2629 }
2630
2631 // Unsafe to vectorize and we already found a convergent operation, can
2632 // early return now.
2633 if (HasComplexMemInst && HasConvergentOp)
2634 return false;
2635
2636 // Already unsafe to vectorize; keep scanning for convergent ops.
2637 if (HasComplexMemInst)
2638 continue;
2639
2640 // Record alias scopes defined inside the loop.
2641 if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I))
2642 for (Metadata *Op : Decl->getScopeList()->operands())
2643 LoopAliasScopes.insert(cast<MDNode>(Op));
2644
2645 // Many math library functions read the rounding mode. We will only
2646 // vectorize a loop if it contains known function calls that don't set
2647 // the flag. Therefore, it is safe to ignore this read from memory.
2648 auto *Call = dyn_cast<CallInst>(&I);
2650 continue;
2651
2652 // If this is a load, save it. If this instruction can read from memory
2653 // but is not a load, we only allow it if it's a call to a function with a
2654 // vector mapping and no pointer arguments.
2655 if (I.mayReadFromMemory()) {
2656 auto hasPointerArgs = [](CallBase *CB) {
2657 return any_of(CB->args(), [](Value const *Arg) {
2658 return Arg->getType()->isPointerTy();
2659 });
2660 };
2661
2662 // If the function has an explicit vectorized counterpart, and does not
2663 // take output/input pointers, we can safely assume that it can be
2664 // vectorized.
2665 if (Call && !Call->isNoBuiltin() && Call->getCalledFunction() &&
2666 !hasPointerArgs(Call) && !VFDatabase::getMappings(*Call).empty())
2667 continue;
2668
2669 auto *Ld = dyn_cast<LoadInst>(&I);
2670 if (!Ld) {
2671 recordAnalysis("CantVectorizeInstruction", &I)
2672 << "instruction cannot be vectorized";
2673 HasComplexMemInst = true;
2674 continue;
2675 }
2676 if (!Ld->isSimple() && !IsAnnotatedParallel) {
2677 recordAnalysis("NonSimpleLoad", Ld)
2678 << "read with atomic ordering or volatile read";
2679 LLVM_DEBUG(dbgs() << "LAA: Found a non-simple load.\n");
2680 HasComplexMemInst = true;
2681 continue;
2682 }
2683 NumLoads++;
2684 Loads.push_back(Ld);
2685 DepChecker->addAccess(Ld);
2686 if (EnableMemAccessVersioningOfLoop)
2687 collectStridedAccess(Ld);
2688 continue;
2689 }
2690
2691 // Save 'store' instructions. Abort if other instructions write to memory.
2692 if (I.mayWriteToMemory()) {
2693 auto *St = dyn_cast<StoreInst>(&I);
2694 if (!St) {
2695 recordAnalysis("CantVectorizeInstruction", &I)
2696 << "instruction cannot be vectorized";
2697 HasComplexMemInst = true;
2698 continue;
2699 }
2700 if (!St->isSimple() && !IsAnnotatedParallel) {
2701 recordAnalysis("NonSimpleStore", St)
2702 << "write with atomic ordering or volatile write";
2703 LLVM_DEBUG(dbgs() << "LAA: Found a non-simple store.\n");
2704 HasComplexMemInst = true;
2705 continue;
2706 }
2707 NumStores++;
2708 Stores.push_back(St);
2709 DepChecker->addAccess(St);
2710 if (EnableMemAccessVersioningOfLoop)
2711 collectStridedAccess(St);
2712 }
2713 } // Next instr.
2714 } // Next block.
2715
2716 if (HasComplexMemInst)
2717 return false;
2718
2719 // Now we have two lists that hold the loads and the stores.
2720 // Next, we find the pointers that they use.
2721
2722 // Check if we see any stores. If there are no stores, then we don't
2723 // care if the pointers are *restrict*.
2724 if (!Stores.size()) {
2725 LLVM_DEBUG(dbgs() << "LAA: Found a read-only loop!\n");
2726 return true;
2727 }
2728
2730 AccessAnalysis Accesses(TheLoop, AA, LI, *DT, DepCands, *PSE,
2731 LoopAliasScopes);
2732
2733 // Holds the analyzed pointers. We don't want to call getUnderlyingObjects
2734 // multiple times on the same object. If the ptr is accessed twice, once
2735 // for read and once for write, it will only appear once (on the write
2736 // list). This is okay, since we are going to check for conflicts between
2737 // writes and between reads and writes, but not between reads and reads.
2738 SmallSet<std::pair<Value *, Type *>, 16> Seen;
2739
2740 // Record uniform store addresses to identify if we have multiple stores
2741 // to the same address.
2742 SmallPtrSet<Value *, 16> UniformStores;
2743
2744 for (StoreInst *ST : Stores) {
2745 Value *Ptr = ST->getPointerOperand();
2746
2747 if (isInvariant(Ptr)) {
2748 // Record store instructions to loop invariant addresses
2749 StoresToInvariantAddresses.push_back(ST);
2750 HasStoreStoreDependenceInvolvingLoopInvariantAddress |=
2751 !UniformStores.insert(Ptr).second;
2752 }
2753
2754 // If we did *not* see this pointer before, insert it to the read-write
2755 // list. At this phase it is only a 'write' list.
2756 Type *AccessTy = getLoadStoreType(ST);
2757 if (Seen.insert({Ptr, AccessTy}).second) {
2758 ++NumReadWrites;
2759
2760 MemoryLocation Loc = MemoryLocation::get(ST);
2761 // The TBAA metadata could have a control dependency on the predication
2762 // condition, so we cannot rely on it when determining whether or not we
2763 // need runtime pointer checks.
2764 if (blockNeedsPredication(ST->getParent(), TheLoop, DT))
2765 Loc.AATags.TBAA = nullptr;
2766
2767 // Expand forked pointers (i.e., a phi of multiple strided pointers) into
2768 // all alternatives.
2769 visitPointers(const_cast<Value *>(Loc.Ptr), *TheLoop,
2770 [&Accesses, AccessTy, Loc](Value *Ptr) {
2771 MemoryLocation NewLoc = Loc.getWithNewPtr(Ptr);
2772 Accesses.addStore(NewLoc, AccessTy);
2773 });
2774 }
2775 }
2776
2777 if (IsAnnotatedParallel) {
2778 LLVM_DEBUG(
2779 dbgs() << "LAA: A loop annotated parallel, ignore memory dependency "
2780 << "checks.\n");
2781 return true;
2782 }
2783
2784 for (LoadInst *LD : Loads) {
2785 Value *Ptr = LD->getPointerOperand();
2786 // If we did *not* see this pointer before, insert it to the read list. If
2787 // we *did* see it before, then it is already in the read-write list. This
2788 // allows us to vectorize expressions such as A[i] += x; Because the address
2789 // of A[i] is a read-write pointer. This only works if the index of A[i] is
2790 // strictly monotonic, which we approximate (conservatively) via
2791 // getPtrStride. If the address is unknown (e.g. A[B[i]]) then we may read,
2792 // modify, and write overlapping words. Note that "zero stride" is unsafe
2793 // and is being handled below.
2794 bool IsReadOnlyPtr = false;
2795 Type *AccessTy = getLoadStoreType(LD);
2796 if (Seen.insert({Ptr, AccessTy}).second ||
2797 !getPtrStride(*PSE, AccessTy, Ptr, TheLoop, *DT, SymbolicStrides, false,
2798 true)) {
2799 ++NumReads;
2800 IsReadOnlyPtr = true;
2801 }
2802
2803 // See if there is an unsafe dependency between a load to a uniform address and
2804 // store to the same uniform address.
2805 if (UniformStores.contains(Ptr)) {
2806 LLVM_DEBUG(dbgs() << "LAA: Found an unsafe dependency between a uniform "
2807 "load and uniform store to the same address!\n");
2808 HasLoadStoreDependenceInvolvingLoopInvariantAddress = true;
2809 }
2810
2811 MemoryLocation Loc = MemoryLocation::get(LD);
2812 // The TBAA metadata could have a control dependency on the predication
2813 // condition, so we cannot rely on it when determining whether or not we
2814 // need runtime pointer checks.
2815 if (blockNeedsPredication(LD->getParent(), TheLoop, DT))
2816 Loc.AATags.TBAA = nullptr;
2817
2818 // Expand forked pointers (i.e., a phi of multiple strided pointers) into
2819 // all alternatives.
2820 visitPointers(const_cast<Value *>(Loc.Ptr), *TheLoop,
2821 [&Accesses, AccessTy, Loc, IsReadOnlyPtr](Value *Ptr) {
2822 MemoryLocation NewLoc = Loc.getWithNewPtr(Ptr);
2823 Accesses.addLoad(NewLoc, AccessTy, IsReadOnlyPtr);
2824 });
2825 }
2826
2827 // If we write (or read-write) to a single destination and there are no other
2828 // reads in this loop then is it safe to vectorize: the vectorized stores
2829 // preserve ordering via replication or order-preserving @llvm.masked.scatter.
2830 if (NumReadWrites == 1 && NumReads == 0) {
2831 LLVM_DEBUG(dbgs() << "LAA: Found a write-only loop!\n");
2832 return true;
2833 }
2834
2835 // Build dependence sets and check whether we need a runtime pointer bounds
2836 // check.
2837 Accesses.buildDependenceSets();
2838
2839 // Find pointers with computable bounds. We are going to use this information
2840 // to place a runtime bound check.
2841 Value *UncomputablePtr = nullptr;
2842 HasCompletePtrRtChecking =
2843 Accesses.canCheckPtrAtRT(*PtrRtChecking, TheLoop, SymbolicStrides,
2844 UncomputablePtr, AllowPartial, getDepChecker());
2845 if (!HasCompletePtrRtChecking) {
2846 const auto *I = dyn_cast_or_null<Instruction>(UncomputablePtr);
2847 recordAnalysis("CantIdentifyArrayBounds", I)
2848 << "cannot identify array bounds";
2849 LLVM_DEBUG(dbgs() << "LAA: We can't vectorize because we can't find "
2850 << "the array bounds.\n");
2851 return false;
2852 }
2853
2854 LLVM_DEBUG(
2855 dbgs() << "LAA: May be able to perform a memory runtime check if needed.\n");
2856
2857 bool DepsAreSafe = true;
2858 if (Accesses.isDependencyCheckNeeded()) {
2859 LLVM_DEBUG(dbgs() << "LAA: Checking memory dependencies\n");
2860 DepsAreSafe =
2861 DepChecker->areDepsSafe(DepCands, Accesses.getDependenciesToCheck());
2862
2863 if (!DepsAreSafe && DepChecker->shouldRetryWithRuntimeChecks()) {
2864 LLVM_DEBUG(dbgs() << "LAA: Retrying with memory checks\n");
2865
2866 PtrRtChecking->reset();
2867 PtrRtChecking->Need = true;
2868
2869 UncomputablePtr = nullptr;
2870 HasCompletePtrRtChecking = Accesses.canCheckPtrAtRT(
2871 *PtrRtChecking, TheLoop, SymbolicStrides, UncomputablePtr,
2872 AllowPartial, getDepChecker());
2873
2874 // Check that we found the bounds for the pointer.
2875 if (!HasCompletePtrRtChecking) {
2876 auto *I = dyn_cast_or_null<Instruction>(UncomputablePtr);
2877 recordAnalysis("CantCheckMemDepsAtRunTime", I)
2878 << "cannot check memory dependencies at runtime";
2879 LLVM_DEBUG(dbgs() << "LAA: Can't vectorize with memory checks\n");
2880 return false;
2881 }
2882
2883 // Clear the dependency checks. They are no longer needed.
2884 Accesses.resetDepChecks(*DepChecker);
2885
2886 DepsAreSafe = true;
2887 }
2888 }
2889
2890 // Update the invariant address dependence flags based on dependences found
2891 // by the dep checker. Even if dependences were not recorded (too many to
2892 // track), any InvariantUnsafe dep would still have set the status to Unsafe
2893 if (const auto *Deps = DepChecker->getDependences()) {
2894 for (const auto &Dep : *Deps) {
2896 continue;
2897 Instruction *Src = Dep.getSource(*DepChecker);
2898 Instruction *Dst = Dep.getDestination(*DepChecker);
2899 if (isa<LoadInst>(Src) != isa<LoadInst>(Dst)) {
2900 HasLoadStoreDependenceInvolvingLoopInvariantAddress = true;
2901 } else {
2902 assert(isa<StoreInst>(Src) && isa<StoreInst>(Dst) &&
2903 "Expected both to be stores");
2904 HasStoreStoreDependenceInvolvingLoopInvariantAddress = true;
2905 }
2906 }
2907 }
2908
2909 if (HasConvergentOp) {
2910 recordAnalysis("CantInsertRuntimeCheckWithConvergent")
2911 << "cannot add control dependency to convergent operation";
2912 LLVM_DEBUG(dbgs() << "LAA: We can't vectorize because a runtime check "
2913 "would be needed with a convergent operation\n");
2914 return false;
2915 }
2916
2917 if (DepsAreSafe) {
2918 LLVM_DEBUG(
2919 dbgs() << "LAA: No unsafe dependent memory operations in loop. We"
2920 << (PtrRtChecking->Need ? "" : " don't")
2921 << " need runtime memory checks.\n");
2922 return true;
2923 }
2924
2925 emitUnsafeDependenceRemark();
2926 return false;
2927}
2928
2929void LoopAccessInfo::emitUnsafeDependenceRemark() {
2930 const auto *Deps = getDepChecker().getDependences();
2931 if (!Deps)
2932 return;
2933 const auto *Found =
2934 llvm::find_if(*Deps, [](const MemoryDepChecker::Dependence &D) {
2937 });
2938 if (Found == Deps->end())
2939 return;
2940 MemoryDepChecker::Dependence Dep = *Found;
2941
2942 LLVM_DEBUG(dbgs() << "LAA: unsafe dependent memory operations in loop\n");
2943
2944 // Emit remark for first unsafe dependence
2945 bool HasForcedDistribution =
2946 getBooleanLoopAttribute(TheLoop, "llvm.loop.distribute.enable");
2947
2948 const std::string Info =
2949 HasForcedDistribution
2950 ? "unsafe dependent memory operations in loop."
2951 : "unsafe dependent memory operations in loop. Use "
2952 "#pragma clang loop distribute(enable) to allow loop distribution "
2953 "to attempt to isolate the offending operations into a separate "
2954 "loop";
2955 OptimizationRemarkAnalysis &R =
2956 recordAnalysis("UnsafeDep", Dep.getDestination(getDepChecker())) << Info;
2957
2958 switch (Dep.Type) {
2962 llvm_unreachable("Unexpected dependence");
2964 R << "\nBackward loop carried data dependence.";
2965 break;
2967 R << "\nForward loop carried data dependence that prevents "
2968 "store-to-load forwarding.";
2969 break;
2971 R << "\nBackward loop carried data dependence that prevents "
2972 "store-to-load forwarding.";
2973 break;
2975 R << "\nUnsafe indirect dependence.";
2976 break;
2978 R << "\nUnsafe dependence on loop-invariant address.";
2979 break;
2981 R << "\nUnknown data dependence.";
2982 break;
2983 }
2984
2985 if (Instruction *I = Dep.getSource(getDepChecker())) {
2986 DebugLoc SourceLoc = I->getDebugLoc();
2988 SourceLoc = DD->getDebugLoc();
2989 if (SourceLoc)
2990 R << " Memory location is the same as accessed at "
2991 << ore::NV("Location", SourceLoc);
2992 }
2993}
2994
2996 const Loop *TheLoop,
2997 const DominatorTree *DT) {
2998 assert(TheLoop->contains(BB) && "Unknown block used");
2999
3000 // Blocks that do not dominate the latch need predication.
3001 const BasicBlock *Latch = TheLoop->getLoopLatch();
3002 assert(Latch && "Loop expected to have a single latch.");
3003 return !DT->dominates(BB, Latch);
3004}
3005
3007LoopAccessInfo::recordAnalysis(StringRef RemarkName, const Instruction *I) {
3008 assert(!Report && "Multiple reports generated");
3009
3010 const BasicBlock *CodeRegion = TheLoop->getHeader();
3011 DebugLoc DL = TheLoop->getStartLoc();
3012
3013 if (I) {
3014 CodeRegion = I->getParent();
3015 // If there is no debug location attached to the instruction, revert back to
3016 // using the loop's.
3017 if (I->getDebugLoc())
3018 DL = I->getDebugLoc();
3019 }
3020
3021 Report = std::make_unique<OptimizationRemarkAnalysis>(DEBUG_TYPE, RemarkName,
3022 DL, CodeRegion);
3023 return *Report;
3024}
3025
3027 auto *SE = PSE->getSE();
3028 if (TheLoop->isLoopInvariant(V))
3029 return true;
3030 if (!SE->isSCEVable(V->getType()))
3031 return false;
3032 const SCEV *S = SE->getSCEV(V);
3033 return SE->isLoopInvariant(S, TheLoop);
3034}
3035
3036/// If \p Ptr is a GEP, which has a loop-variant operand, return that operand.
3037/// Otherwise, return \p Ptr.
3039 Loop *Lp) {
3040 auto *GEP = dyn_cast<GetElementPtrInst>(Ptr);
3041 if (!GEP)
3042 return Ptr;
3043
3044 Value *V = Ptr;
3045 for (const Use &U : GEP->operands()) {
3046 if (!SE->isLoopInvariant(SE->getSCEV(U), Lp)) {
3047 if (V == Ptr)
3048 V = U;
3049 else
3050 // There must be exactly one loop-variant operand.
3051 return Ptr;
3052 }
3053 }
3054 return V;
3055}
3056
3057/// Get the stride of a pointer access in a loop. Looks for symbolic
3058/// strides "a[i*stride]". Returns the symbolic stride, or null otherwise.
3059static const SCEV *getStrideFromPointer(Value *Ptr, ScalarEvolution *SE, Loop *Lp) {
3060 auto *PtrTy = dyn_cast<PointerType>(Ptr->getType());
3061 if (!PtrTy)
3062 return nullptr;
3063
3064 // Try to remove a gep instruction to make the pointer (actually index at this
3065 // point) easier analyzable. If OrigPtr is equal to Ptr we are analyzing the
3066 // pointer, otherwise, we are analyzing the index.
3067 Value *OrigPtr = Ptr;
3068
3069 Ptr = getLoopVariantGEPOperand(Ptr, SE, Lp);
3070 const SCEV *V = SE->getSCEV(Ptr);
3071
3072 if (Ptr != OrigPtr)
3073 // Strip off casts.
3074 while (auto *C = dyn_cast<SCEVIntegralCastExpr>(V))
3075 V = C->getOperand();
3076
3078 return nullptr;
3079
3080 // Note that the restriction after this loop invariant check are only
3081 // profitability restrictions.
3082 if (!SE->isLoopInvariant(V, Lp))
3083 return nullptr;
3084
3085 // Look for the loop invariant symbolic value.
3086 if (isa<SCEVUnknown>(V))
3087 return V;
3088
3089 // Look through multiplies that scale a stride by a constant.
3091 if (auto *C = dyn_cast<SCEVIntegralCastExpr>(V))
3092 if (isa<SCEVUnknown>(C->getOperand()))
3093 return V;
3094
3095 return nullptr;
3096}
3097
3098void LoopAccessInfo::collectStridedAccess(Value *MemAccess) {
3099 Value *Ptr = getLoadStorePointerOperand(MemAccess);
3100 if (!Ptr)
3101 return;
3102
3103 // Note: getStrideFromPointer is a *profitability* heuristic. We
3104 // could broaden the scope of values returned here - to anything
3105 // which happens to be loop invariant and contributes to the
3106 // computation of an interesting IV - but we chose not to as we
3107 // don't have a cost model here, and broadening the scope exposes
3108 // far too many unprofitable cases.
3109 const SCEV *StrideExpr = getStrideFromPointer(Ptr, PSE->getSE(), TheLoop);
3110 if (!StrideExpr)
3111 return;
3112
3113 if (match(StrideExpr, m_scev_UndefOrPoison()))
3114 return;
3115
3116 LLVM_DEBUG(dbgs() << "LAA: Found a strided access that is a candidate for "
3117 "versioning:");
3118 LLVM_DEBUG(dbgs() << " Ptr: " << *Ptr << " Stride: " << *StrideExpr << "\n");
3119
3120 if (!SpeculateUnitStride) {
3121 LLVM_DEBUG(dbgs() << " Chose not to due to -laa-speculate-unit-stride\n");
3122 return;
3123 }
3124
3125 // Avoid adding the "Stride == 1" predicate when we know that
3126 // Stride >= Trip-Count. Such a predicate will effectively optimize a single
3127 // or zero iteration loop, as Trip-Count <= Stride == 1.
3128 //
3129 // TODO: We are currently not making a very informed decision on when it is
3130 // beneficial to apply stride versioning. It might make more sense that the
3131 // users of this analysis (such as the vectorizer) will trigger it, based on
3132 // their specific cost considerations; For example, in cases where stride
3133 // versioning does not help resolving memory accesses/dependences, the
3134 // vectorizer should evaluate the cost of the runtime test, and the benefit
3135 // of various possible stride specializations, considering the alternatives
3136 // of using gather/scatters (if available).
3137
3138 const SCEV *MaxBTC = PSE->getSymbolicMaxBackedgeTakenCount();
3139
3140 // Match the types so we can compare the stride and the MaxBTC.
3141 // The Stride can be positive/negative, so we sign extend Stride;
3142 // The backedgeTakenCount is non-negative, so we zero extend MaxBTC.
3143 const DataLayout &DL = TheLoop->getHeader()->getDataLayout();
3144 uint64_t StrideTypeSizeBits = DL.getTypeSizeInBits(StrideExpr->getType());
3145 uint64_t BETypeSizeBits = DL.getTypeSizeInBits(MaxBTC->getType());
3146 const SCEV *CastedStride = StrideExpr;
3147 const SCEV *CastedBECount = MaxBTC;
3148 ScalarEvolution *SE = PSE->getSE();
3149 if (BETypeSizeBits >= StrideTypeSizeBits)
3150 CastedStride = SE->getNoopOrSignExtend(StrideExpr, MaxBTC->getType());
3151 else
3152 CastedBECount = SE->getZeroExtendExpr(MaxBTC, StrideExpr->getType());
3153 const SCEV *StrideMinusBETaken = SE->getMinusSCEV(CastedStride, CastedBECount);
3154 // Since TripCount == BackEdgeTakenCount + 1, checking:
3155 // "Stride >= TripCount" is equivalent to checking:
3156 // Stride - MaxBTC> 0
3157 if (SE->isKnownPositive(StrideMinusBETaken)) {
3158 LLVM_DEBUG(
3159 dbgs() << "LAA: Stride>=TripCount; No point in versioning as the "
3160 "Stride==1 predicate will imply that the loop executes "
3161 "at most once.\n");
3162 return;
3163 }
3164 LLVM_DEBUG(dbgs() << "LAA: Found a strided access that we can version.\n");
3165
3166 // Strip back off the integer cast, and check that our result is a
3167 // SCEVUnknown as we expect.
3168 const SCEV *StrideBase = StrideExpr;
3169 if (const auto *C = dyn_cast<SCEVIntegralCastExpr>(StrideBase))
3170 StrideBase = C->getOperand();
3171 SymbolicStrides[Ptr] = cast<SCEVUnknown>(StrideBase);
3172}
3173
3175 const TargetTransformInfo *TTI,
3176 const TargetLibraryInfo *TLI, AAResults *AA,
3177 DominatorTree *DT, LoopInfo *LI,
3178 AssumptionCache *AC, bool AllowPartial)
3179 : PSE(std::make_unique<PredicatedScalarEvolution>(*SE, *L)),
3180 PtrRtChecking(nullptr), TheLoop(L), AllowPartial(AllowPartial) {
3181 unsigned MaxTargetVectorWidthInBits = std::numeric_limits<unsigned>::max();
3182 if (TTI && !TTI->enableScalableVectorization())
3183 // Scale the vector width by 2 as rough estimate to also consider
3184 // interleaving.
3185 MaxTargetVectorWidthInBits =
3186 TTI->getRegisterBitWidth(TargetTransformInfo::RGK_FixedWidthVector) * 2;
3187
3188 DepChecker = std::make_unique<MemoryDepChecker>(
3189 *PSE, AC, DT, L, SymbolicStrides, MaxTargetVectorWidthInBits, LoopGuards);
3190 PtrRtChecking =
3191 std::make_unique<RuntimePointerChecking>(*DepChecker, SE, LoopGuards);
3192 if (canAnalyzeLoop())
3193 CanVecMem = analyzeLoop(AA, LI, TLI, DT);
3194}
3195
3196void LoopAccessInfo::print(raw_ostream &OS, unsigned Depth) const {
3197 if (CanVecMem) {
3198 OS.indent(Depth) << "Memory dependences are safe";
3199 const MemoryDepChecker &DC = getDepChecker();
3200 if (!DC.isSafeForAnyVectorWidth())
3201 OS << " with a maximum safe vector width of "
3202 << DC.getMaxSafeVectorWidthInBits() << " bits";
3205 OS << ", with a maximum safe store-load forward width of " << SLDist
3206 << " bits";
3207 }
3208 if (PtrRtChecking->Need)
3209 OS << " with run-time checks";
3210 OS << "\n";
3211 }
3212
3213 if (HasConvergentOp)
3214 OS.indent(Depth) << "Has convergent operation in loop\n";
3215
3216 if (Report)
3217 OS.indent(Depth) << "Report: " << Report->getMsg() << "\n";
3218
3219 if (auto *Dependences = DepChecker->getDependences()) {
3220 OS.indent(Depth) << "Dependences:\n";
3221 for (const auto &Dep : *Dependences) {
3222 Dep.print(OS, Depth + 2, DepChecker->getMemoryInstructions());
3223 OS << "\n";
3224 }
3225 } else
3226 OS.indent(Depth) << "Too many dependences, not recorded\n";
3227
3228 // List the pair of accesses need run-time checks to prove independence.
3229 PtrRtChecking->print(OS, Depth);
3230 if (PtrRtChecking->Need && !HasCompletePtrRtChecking)
3231 OS.indent(Depth) << "Generated run-time checks are incomplete\n";
3232 OS << "\n";
3233
3234 OS.indent(Depth)
3235 << "Non vectorizable stores to invariant address were "
3236 << (HasStoreStoreDependenceInvolvingLoopInvariantAddress ||
3237 HasLoadStoreDependenceInvolvingLoopInvariantAddress
3238 ? ""
3239 : "not ")
3240 << "found in loop.\n";
3241
3242 OS.indent(Depth) << "SCEV assumptions:\n";
3243 PSE->getPredicate().print(OS, Depth);
3244
3245 OS << "\n";
3246
3247 OS.indent(Depth) << "Expressions re-written:\n";
3248 PSE->print(OS, Depth);
3249}
3250
3252 bool AllowPartial) {
3253 const auto &[It, Inserted] = LoopAccessInfoMap.try_emplace(&L);
3254
3255 // We need to create the LoopAccessInfo if either we don't already have one,
3256 // or if it was created with a different value of AllowPartial.
3257 if (Inserted || It->second->hasAllowPartial() != AllowPartial)
3258 It->second = std::make_unique<LoopAccessInfo>(&L, &SE, TTI, TLI, &AA, &DT,
3259 &LI, AC, AllowPartial);
3260
3261 return *It->second;
3262}
3264 // Collect LoopAccessInfo entries that may keep references to IR outside the
3265 // analyzed loop or SCEVs that may have been modified or invalidated. At the
3266 // moment, that is loops requiring memory or SCEV runtime checks, as those cache
3267 // SCEVs, e.g. for pointer expressions.
3268 LoopAccessInfoMap.remove_if([](const auto &Entry) {
3269 const auto &LAI = Entry.second;
3270 return !(LAI->getRuntimePointerChecking()->getChecks().empty() &&
3271 LAI->getPSE().getPredicate().isAlwaysTrue());
3272 });
3273}
3274
3276 Function &F, const PreservedAnalyses &PA,
3277 FunctionAnalysisManager::Invalidator &Inv) {
3278 // Check whether our analysis is preserved.
3279 auto PAC = PA.getChecker<LoopAccessAnalysis>();
3280 if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>())
3281 // If not, give up now.
3282 return true;
3283
3284 // Check whether the analyses we depend on became invalid for any reason.
3285 // Skip checking TargetLibraryAnalysis as it is immutable and can't become
3286 // invalid.
3287 return Inv.invalidate<AAManager>(F, PA) ||
3288 Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) ||
3289 Inv.invalidate<LoopAnalysis>(F, PA) ||
3290 Inv.invalidate<DominatorTreeAnalysis>(F, PA);
3291}
3292
3295 auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F);
3296 auto &AA = FAM.getResult<AAManager>(F);
3297 auto &DT = FAM.getResult<DominatorTreeAnalysis>(F);
3298 auto &LI = FAM.getResult<LoopAnalysis>(F);
3299 auto &TTI = FAM.getResult<TargetIRAnalysis>(F);
3300 auto &TLI = FAM.getResult<TargetLibraryAnalysis>(F);
3301 auto &AC = FAM.getResult<AssumptionAnalysis>(F);
3302 return LoopAccessInfoManager(SE, AA, DT, LI, &TTI, &TLI, &AC);
3303}
3304
3305AnalysisKey LoopAccessAnalysis::Key;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
@ Scaled
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Forward Handle Accesses
DXIL Resource Access
dxil translate DXIL Translate Metadata
This file defines the DenseMap class.
Generic implementation of equivalence classes through the use Tarjan's efficient union-find algorithm...
#define DEBUG_TYPE
Hexagon Common GEP
#define _
This header defines various interfaces for pass management in LLVM.
static cl::opt< unsigned > MaxDependences("max-dependences", cl::Hidden, cl::desc("Maximum number of dependences collected by " "loop-access analysis (default = 100)"), cl::init(100))
We collect dependences up to this threshold.
static cl::opt< bool > EnableForwardingConflictDetection("store-to-load-forwarding-conflict-detection", cl::Hidden, cl::desc("Enable conflict detection in loop-access analysis"), cl::init(true))
Enable store-to-load forwarding conflict detection.
static void findForkedSCEVs(ScalarEvolution *SE, const Loop *L, Value *Ptr, SmallVectorImpl< PointerIntPair< const SCEV *, 1, bool > > &ScevList, unsigned Depth)
static const SCEV * mulSCEVNoOverflow(const SCEV *A, const SCEV *B, ScalarEvolution &SE)
Returns A * B, if it is guaranteed not to unsigned wrap.
static bool isNoWrap(PredicatedScalarEvolution &PSE, const SCEVAddRecExpr *AR, Value *Ptr, Type *AccessTy, const Loop *L, const DominatorTree &DT, std::optional< int64_t > Stride=std::nullopt, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Check whether AR is a non-wrapping AddRec.
static cl::opt< unsigned > MemoryCheckMergeThreshold("memory-check-merge-threshold", cl::Hidden, cl::desc("Maximum number of comparisons done when trying to merge " "runtime memory checks. (default = 100)"), cl::init(100))
The maximum iterations used to merge memory checks.
static const SCEV * getStrideFromPointer(Value *Ptr, ScalarEvolution *SE, Loop *Lp)
Get the stride of a pointer access in a loop.
static cl::opt< ElementCount, true > VectorizationFactor("force-vector-width", cl::Hidden, cl::desc("Sets the SIMD width. Zero is autoselect."), cl::location(VectorizerParams::VectorizationFactor))
static bool evaluatePtrAddRecAtMaxBTCWillNotWrap(const SCEVAddRecExpr *AR, const SCEV *MaxBTC, const SCEV *EltSize, ScalarEvolution &SE, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC, std::optional< ScalarEvolution::LoopGuards > &LoopGuards)
Return true, if evaluating AR at MaxBTC cannot wrap, because AR at MaxBTC is guaranteed inbounds of t...
static cl::opt< unsigned, true > VectorizationInterleave("force-vector-interleave", cl::Hidden, cl::desc("Sets the vectorization interleave count. " "Zero is autoselect."), cl::location(VectorizerParams::VectorizationInterleave))
static cl::opt< bool, true > HoistRuntimeChecks("hoist-runtime-checks", cl::Hidden, cl::desc("Hoist inner loop runtime memory checks to outer loop if possible"), cl::location(VectorizerParams::HoistRuntimeChecks), cl::init(true))
static DenseMap< const RuntimeCheckingPtrGroup *, unsigned > getPtrToIdxMap(ArrayRef< RuntimeCheckingPtrGroup > CheckingGroups)
Assign each RuntimeCheckingPtrGroup pointer an index for stable UTC output.
static cl::opt< unsigned, true > RuntimeMemoryCheckThreshold("runtime-memory-check-threshold", cl::Hidden, cl::desc("When performing memory disambiguation checks at runtime do not " "generate more than this number of comparisons (default = 8)."), cl::location(VectorizerParams::RuntimeMemoryCheckThreshold), cl::init(8))
static void visitPointers(Value *StartPtr, const Loop &InnermostLoop, function_ref< void(Value *)> AddPointer)
static bool isSafeDependenceDistance(const DataLayout &DL, ScalarEvolution &SE, const SCEV &MaxBTC, const SCEV &Dist, uint64_t MaxStride)
Given a dependence-distance Dist between two memory accesses, that have strides in the same direction...
static bool areStridedAccessesIndependent(uint64_t Distance, uint64_t Stride, uint64_t TypeByteSize)
Check the dependence for two accesses with the same stride Stride.
static const SCEV * getMinFromExprs(const SCEV *I, const SCEV *J, ScalarEvolution *SE)
Compare I and J and return the minimum.
static Value * getLoopVariantGEPOperand(Value *Ptr, ScalarEvolution *SE, Loop *Lp)
If Ptr is a GEP, which has a loop-variant operand, return that operand.
static cl::opt< unsigned > MaxForkedSCEVDepth("max-forked-scev-depth", cl::Hidden, cl::desc("Maximum recursion depth when finding forked SCEVs (default = 5)"), cl::init(5))
static cl::opt< bool > SpeculateUnitStride("laa-speculate-unit-stride", cl::Hidden, cl::desc("Speculate that non-constant strides are unit in LAA"), cl::init(true))
static cl::opt< bool > EnableMemAccessVersioning("enable-mem-access-versioning", cl::init(true), cl::Hidden, cl::desc("Enable symbolic stride memory access versioning"))
This enables versioning on the strides of symbolically striding memory accesses in code like the foll...
static const SCEV * addSCEVNoOverflow(const SCEV *A, const SCEV *B, ScalarEvolution &SE)
Returns A + B, if it is guaranteed not to unsigned wrap.
This header provides classes for managing per-loop analyses.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file provides utility analysis objects describing memory locations.
#define P(N)
FunctionAnalysisManager FAM
This file defines the PointerIntPair class.
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
static const X86InstrFMA3Group Groups[]
A manager for alias analyses.
Class for arbitrary precision integers.
Definition APInt.h:78
std::optional< uint64_t > tryZExtValue() const
Get zero extended value if possible.
Definition APInt.h:1577
APInt abs() const
Get the absolute value.
Definition APInt.h:1820
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1084
std::optional< int64_t > trySExtValue() const
Get sign extended value if possible.
Definition APInt.h:1599
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
A function analysis which provides an AssumptionCache.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
bool isNoBuiltin() const
Return true if the call should not be treated as a call to a builtin.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool isConvergent() const
Determine if the invoke is convergent.
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
bool isNegative() const
Definition Constants.h:214
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
A debug info location.
Definition DebugLoc.h:126
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:250
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
iterator end()
Definition DenseMap.h:141
Analysis pass which computes a DominatorTree.
Definition Dominators.h:270
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:151
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
iterator_range< member_iterator > members(const ECValue &ECV) const
bool contains(const ElemTy &V) const
Returns true if V is contained an equivalence class.
const ECValue & insert(const ElemTy &Data)
Insert a new value into the union/find set, ignoring the request if the value already exists.
member_iterator member_end() const
const ElemTy & getLeaderValue(const ElemTy &V) const
Return the leader for the specified value that is in the set.
member_iterator findLeader(const ElemTy &V) const
Given a value in the set, return a member iterator for the equivalence class it is in.
void eraseClass(const ElemTy &V)
Erase the class containing V, i.e.
member_iterator unionSets(const ElemTy &V1, const ElemTy &V2)
Merge the two equivalence sets for the specified values, inserting them if they do not already exist ...
bool hasOptSize() const
Optimize this function for size (-Os) or minimum size (-Oz).
Definition Function.h:691
bool empty() const
Definition Function.h:836
PointerType * getType() const
Global values are always pointers.
An instruction for reading from memory.
Value * getPointerOperand()
static constexpr LocationSize beforeOrAfterPointer()
Any location before or after the base pointer (but still within the underlying object).
This analysis provides dependence information for the memory accesses of a loop.
LLVM_ABI Result run(Function &F, FunctionAnalysisManager &AM)
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
LLVM_ABI const LoopAccessInfo & getInfo(Loop &L, bool AllowPartial=false)
Drive the analysis of memory accesses in the loop.
const MemoryDepChecker & getDepChecker() const
the Memory Dependence Checker which can determine the loop-independent and loop-carried dependences b...
LLVM_ABI bool isInvariant(Value *V) const
Returns true if value V is loop invariant.
LLVM_ABI void print(raw_ostream &OS, unsigned Depth=0) const
Print the information about the memory accesses in the loop.
static LLVM_ABI bool blockNeedsPredication(const BasicBlock *BB, const Loop *TheLoop, const DominatorTree *DT)
Return true if the block BB needs to be predicated in order for the loop to be vectorized.
LLVM_ABI LoopAccessInfo(Loop *L, ScalarEvolution *SE, const TargetTransformInfo *TTI, const TargetLibraryInfo *TLI, AAResults *AA, DominatorTree *DT, LoopInfo *LI, AssumptionCache *AC, bool AllowPartial=false)
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:587
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
bool isInnermost() const
Return true if the loop does not contain any (natural) loops.
unsigned getNumBackEdges() const
Calculate the number of back edges to the loop header.
BlockT * getHeader() const
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
std::string getLocStr() const
Return a string containing the debug location of the loop (file name + line number if present,...
Definition LoopInfo.cpp:704
bool isAnnotatedParallel() const
Returns true if the loop is annotated parallel.
Definition LoopInfo.cpp:602
DebugLoc getStartLoc() const
Return the debug location of the start of this loop.
Definition LoopInfo.cpp:669
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1424
Checks memory dependences among accesses to the same underlying object to determine whether there vec...
ArrayRef< unsigned > getOrderForAccess(Value *Ptr, bool IsWrite) const
Return the program order indices for the access location (Ptr, IsWrite).
bool isSafeForAnyStoreLoadForwardDistances() const
Return true if there are no store-load forwarding dependencies.
LLVM_ABI bool areDepsSafe(const DepCandidates &AccessSets, ArrayRef< MemAccessInfo > CheckDeps)
Check whether the dependencies between the accesses are safe, and records the dependence information ...
bool isSafeForAnyVectorWidth() const
Return true if the number of elements that are safe to operate on simultaneously is not bounded.
PointerIntPair< Value *, 1, bool > MemAccessInfo
EquivalenceClasses< MemAccessInfo > DepCandidates
Set of potential dependent memory accesses.
bool shouldRetryWithRuntimeChecks() const
In same cases when the dependency check fails we can still vectorize the loop with a dynamic array ac...
const Loop * getInnermostLoop() const
uint64_t getMaxSafeVectorWidthInBits() const
Return the number of elements that are safe to operate on simultaneously, multiplied by the size of t...
bool isSafeForVectorization() const
No memory dependence was encountered that would inhibit vectorization.
const SmallVectorImpl< Dependence > * getDependences() const
Returns the memory dependences.
LLVM_ABI SmallVector< Instruction *, 4 > getInstructionsForAccess(Value *Ptr, bool isWrite) const
Find the set of instructions that read or write via Ptr.
VectorizationSafetyStatus
Type to keep track of the status of the dependence check.
LLVM_ABI void addAccess(StoreInst *SI)
Register the location (instructions are given increasing numbers) of a write access.
uint64_t getStoreLoadForwardSafeDistanceInBits() const
Return safe power-of-2 number of elements, which do not prevent store-load forwarding,...
Representation for a specific memory location.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
LocationSize Size
The maximum size of the location, in address-units, or UnknownSize if the size is not known.
AAMDNodes AATags
The metadata nodes which describes the aliasing of the location (each member is null if that kind of ...
const Value * Ptr
The address of the start of the location.
Diagnostic information for optimization analysis remarks.
PointerIntPair - This class implements a pair of a pointer and small integer.
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
LLVM_ABI void addPredicate(const SCEVPredicate &Pred)
Adds a new predicate.
ScalarEvolution * getSE() const
Returns the ScalarEvolution analysis used.
LLVM_ABI bool hasNoOverflow(Value *V, SCEVWrapPredicate::IncrementWrapFlags Flags)
Returns true if we've statically proved that V doesn't wrap.
LLVM_ABI const SCEVAddRecExpr * getAsAddRec(Value *V, SmallVectorImpl< const SCEVPredicate * > *WrapPredsAdded=nullptr)
Attempts to produce an AddRecExpr for V by adding additional SCEV predicates.
LLVM_ABI void addPredicates(ArrayRef< const SCEVPredicate * > Preds)
Adds all predicates in Preds.
LLVM_ABI const SCEV * getBackedgeTakenCount()
Get the (predicated) backedge count for the analyzed loop.
LLVM_ABI const SCEV * getSymbolicMaxBackedgeTakenCount()
Get the (predicated) symbolic max backedge count for the analyzed loop.
LLVM_ABI const SCEV * getSCEV(Value *V)
Returns the SCEV expression of V, in the context of the current SCEV predicate.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition Analysis.h:275
Holds information about the memory runtime legality checks to verify that a group of pointers do not ...
bool Need
This flag indicates if we need to add the runtime check.
void reset()
Reset the state of the pointer runtime information.
unsigned getNumberOfChecks() const
Returns the number of run-time checks required according to needsChecking.
LLVM_ABI void printChecks(raw_ostream &OS, const SmallVectorImpl< RuntimePointerCheck > &Checks, unsigned Depth=0) const
Print Checks.
LLVM_ABI bool needsChecking(const RuntimeCheckingPtrGroup &M, const RuntimeCheckingPtrGroup &N) const
Decide if we need to add a check between two groups of pointers, according to needsChecking.
LLVM_ABI void print(raw_ostream &OS, unsigned Depth=0) const
Print the list run-time memory checks necessary.
SmallVector< RuntimeCheckingPtrGroup, 2 > CheckingGroups
Holds a partitioning of pointers into "check groups".
static LLVM_ABI bool arePointersInSamePartition(const SmallVectorImpl< int > &PtrToPartition, unsigned PtrIdx1, unsigned PtrIdx2)
Check if pointers are in the same partition.
LLVM_ABI void generateChecks(MemoryDepChecker::DepCandidates &DepCands)
Generate the checks and store it.
SmallVector< PointerInfo, 2 > Pointers
Information about the pointers that may require checking.
LLVM_ABI void insert(Loop *Lp, Value *Ptr, const SCEV *PtrExpr, Type *AccessTy, bool WritePtr, unsigned DepSetId, unsigned ASId, PredicatedScalarEvolution &PSE, bool NeedsFreeze)
Insert a pointer and calculate the start and end SCEVs.
This node represents a polynomial recurrence on the trip count of the specified loop.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents a constant integer value.
ConstantInt * getValue() const
const APInt & getAPInt() const
NoWrapFlags getNoWrapFlags(NoWrapFlags Mask=NoWrapMask) const
IncrementWrapFlags
Similar to SCEV::NoWrapFlags, but with slightly different semantics for FlagNUSW.
static SCEVWrapPredicate::IncrementWrapFlags clearFlags(SCEVWrapPredicate::IncrementWrapFlags Flags, SCEVWrapPredicate::IncrementWrapFlags OffFlags)
Convenient IncrementWrapFlags manipulation methods.
static SCEVWrapPredicate::IncrementWrapFlags getImpliedFlags(const SCEVAddRecExpr *AR, ScalarEvolution &SE)
Returns the set of SCEVWrapPredicate no wrap flags implied by a SCEVAddRecExpr.
This class represents an analyzed expression in the program.
static constexpr auto NoWrapMask
LLVM_ABI bool isZero() const
Return true if the expression is a constant zero.
LLVM_ABI Type * getType() const
Return the LLVM type of this SCEV expression.
Analysis pass that exposes the ScalarEvolution for a function.
static LLVM_ABI LoopGuards collect(const Loop *L, ScalarEvolution &SE)
Collect rewrite map for loop guards for loop L, together with flags indicating if NUW and NSW can be ...
The main scalar evolution driver.
const SCEV * getConstantMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEVConstant that is greater than or equal to (i.e.
LLVM_ABI bool isKnownNonNegative(const SCEV *S)
Test if the given expression is known to be non-negative.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI Type * getWiderType(Type *Ty1, Type *Ty2) const
LLVM_ABI const SCEV * getAbsExpr(const SCEV *Op, bool IsNSW)
LLVM_ABI bool isKnownNonPositive(const SCEV *S)
Test if the given expression is known to be non-positive.
LLVM_ABI bool isKnownNegative(const SCEV *S)
Test if the given expression is known to be negative.
LLVM_ABI bool willNotOverflow(Instruction::BinaryOps BinOp, bool Signed, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI=nullptr)
Is operation BinOp between LHS and RHS provably does not have a signed/unsigned overflow (Signed)?
LLVM_ABI const SCEVPredicate * getEqualPredicate(const SCEV *LHS, const SCEV *RHS)
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
LLVM_ABI const SCEV * getNoopOrSignExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI bool isKnownPositive(const SCEV *S)
Test if the given expression is known to be positive.
LLVM_ABI const SCEV * getZeroExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI bool isSCEVable(Type *Ty) const
Test if values of the given type are analyzable within the SCEV framework.
LLVM_ABI Type * getEffectiveSCEVType(Type *Ty) const
Return a type with the same bitwidth as the given type and which represents how SCEV will treat the g...
APInt getSignedRangeMin(const SCEV *S)
Determine the min of the signed range for a particular SCEV.
LLVM_ABI const SCEV * getUMaxExpr(SCEVUse LHS, SCEVUse RHS)
LLVM_ABI const SCEV * getStoreSizeOfExpr(Type *IntTy, Type *StoreTy)
Return an expression for the store size of StoreTy that is type IntTy.
LLVM_ABI const SCEVPredicate * getWrapPredicate(const SCEVAddRecExpr *AR, SCEVWrapPredicate::IncrementWrapFlags AddedFlags)
LLVM_ABI const SCEV * getNoopOrZeroExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI const SCEV * getCouldNotCompute()
LLVM_ABI const SCEV * getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI const SCEV * getPointerBase(const SCEV *V)
Transitively follow the chain of pointer-type operands until reaching a SCEV that does not have a sin...
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
LLVM_ABI const SCEV * getPtrToAddrExpr(const SCEV *Op)
LLVM_ABI const SCEVAddRecExpr * convertSCEVToAddRecWithPredicates(const SCEV *S, const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Preds)
Tries to convert the S expression to an AddRec expression, adding additional predicates to Preds as r...
LLVM_ABI const SCEV * getSizeOfExpr(Type *IntTy, TypeSize Size)
Return an expression for a TypeSize.
LLVM_ABI std::optional< APInt > computeConstantDifference(const SCEV *LHS, const SCEV *RHS)
Compute LHS - RHS and returns the result as an APInt if it is a constant, and std::nullopt if it isn'...
LLVM_ABI const SCEV * getUMinExpr(SCEVUse LHS, SCEVUse RHS, bool Sequential=false)
LLVM_ABI const SCEV * getTruncateOrSignExtend(const SCEV *V, Type *Ty, unsigned Depth=0)
Return a SCEV corresponding to a conversion of the input value to the specified type.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:134
bool contains(const T &V) const
Check if the SmallSet contains the given element.
Definition SmallSet.h:229
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition SmallSet.h:184
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void resize(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
static SmallVector< VFInfo, 8 > getMappings(const CallInst &CI)
Retrieve all the VFInfo instances associated to the CallInst CI.
Definition VectorUtils.h:76
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI uint64_t getPointerDereferenceableBytes(const DataLayout &DL, bool &CanBeNull, bool *CanBeFreed) const
Returns the number of bytes known to be dereferenceable for the pointer value.
Definition Value.cpp:909
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
Definition Attributor.h:165
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
bool match(Val *V, const Pattern &P)
bind_cst_ty m_scev_APInt(const APInt *&C)
Match an SCEV constant and bind it to an APInt.
is_undef_or_poison m_scev_UndefOrPoison()
Match an SCEVUnknown wrapping undef or poison.
specificloop_ty m_SpecificLoop(const Loop *L)
match_bind< const SCEVMulExpr > m_scev_Mul(const SCEVMulExpr *&V)
specificscev_ty m_scev_Specific(const SCEV *S)
Match if we have a specific specified SCEV.
SCEVAffineAddRec_match< Op0_t, Op1_t, match_isa< const Loop > > m_scev_AffineAddRec(const Op0_t &Op0, const Op1_t &Op1)
initializer< Ty > init(const Ty &Val)
LocationClass< Ty > location(Ty &L)
DiagnosticInfoOptimizationBase::Argument NV
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::pair< const SCEV *, const SCEV * > getStartAndEndForAccess(const Loop *Lp, const SCEV *PtrExpr, Type *AccessTy, const SCEV *BTC, const SCEV *MaxBTC, ScalarEvolution *SE, DenseMap< std::pair< const SCEV *, const SCEV * >, std::pair< const SCEV *, const SCEV * > > *PointerBounds, DominatorTree *DT, AssumptionCache *AC, std::optional< ScalarEvolution::LoopGuards > &LoopGuards)
Calculate Start and End points of memory access using exact backedge taken count BTC if computable or...
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:315
@ Offset
Definition DWP.cpp:578
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:830
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI RetainedKnowledge getKnowledgeForValue(const Value *V, ArrayRef< Attribute::AttrKind > AttrKinds, AssumptionCache &AC, function_ref< bool(RetainedKnowledge, Instruction *, const CallBase::BundleOpInfo *)> Filter=[](auto...) { return true;})
Return a valid Knowledge associated to the Value V if its Attribute kind is in AttrKinds and it match...
LLVM_ABI bool isValidAssumeForContext(const Instruction *I, const Instruction *CxtI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
LLVM_ABI bool getBooleanLoopAttribute(const Loop *TheLoop, StringRef Name)
Returns true if Name is applied to TheLoop and enabled.
LLVM_ABI Intrinsic::ID getVectorIntrinsicIDForCall(const CallInst *CI, const TargetLibraryInfo *TLI)
Returns intrinsic ID for call.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
unsigned getPointerAddressSpace(const Type *T)
Definition SPIRVUtils.h:390
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
const Value * getPointerOperand(const Value *V)
A helper function that returns the pointer operand of a load, store or GEP instruction.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
Definition STLExtras.h:2026
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI std::optional< int64_t > getPointersDiff(Type *ElemTyA, Value *PtrA, Type *ElemTyB, Value *PtrB, const DataLayout &DL, ScalarEvolution &SE, bool StrictCheck=false, bool CheckType=true)
Returns the distance between the pointers PtrA and PtrB iff they are compatible and it is possible to...
LLVM_ABI bool sortPtrAccesses(ArrayRef< Value * > VL, Type *ElemTy, const DataLayout &DL, ScalarEvolution &SE, SmallVectorImpl< unsigned > &SortedIndices)
Attempt to sort the pointers in VL and return the sorted indices in SortedIndices,...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
TargetTransformInfo TTI
LLVM_ABI const SCEV * replaceSymbolicStrideSCEV(PredicatedScalarEvolution &PSE, const DenseMap< Value *, const SCEV * > &PtrToStride, Value *Ptr)
Return the SCEV corresponding to a pointer with the symbolic stride replaced with constant one,...
LLVM_ABI bool isConsecutiveAccess(Value *A, Value *B, const DataLayout &DL, ScalarEvolution &SE, bool CheckType=true)
Returns true if the memory operations A and B are consecutive.
IntPtrTy
Definition InstrProf.h:82
DWARFExpression::Operation Op
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1772
Type * getLoadStoreType(const Value *I)
A helper function that returns the type of a load or store instruction.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI std::optional< int64_t > getStrideFromAddRec(const SCEVAddRecExpr *AR, const Loop *Lp, Type *AccessTy, Value *Ptr, PredicatedScalarEvolution &PSE)
If AR is an affine AddRec for Lp with a constant step, return the step in units of AccessTy's allocat...
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:347
LLVM_ABI void getUnderlyingObjects(const Value *V, SmallVectorImpl< const Value * > &Objects, const LoopInfo *LI=nullptr, unsigned MaxLookup=MaxLookupSearchDepth)
This method is similar to getUnderlyingObject except that it can look through phi and select instruct...
LLVM_ABI std::optional< int64_t > getPtrStride(PredicatedScalarEvolution &PSE, Type *AccessTy, Value *Ptr, const Loop *Lp, const DominatorTree &DT, const DenseMap< Value *, const SCEV * > &StridesMap=DenseMap< Value *, const SCEV * >(), bool ShouldCheckWrap=true, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
If the pointer has a constant stride return it in units of the access type size.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
IR Values for the lower and upper bounds of a pointer evolution.
MDNode * Scope
The tag for alias scope specification (used with noalias).
Definition Metadata.h:786
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:780
MDNode * NoAlias
The tag specifying the noalias scope.
Definition Metadata.h:789
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
Instruction * getDestination(const MemoryDepChecker &DepChecker) const
Return the destination instruction of the dependence.
DepType Type
The type of the dependence.
unsigned Destination
Index of the destination of the dependence in the InstMap vector.
LLVM_ABI bool isPossiblyBackward() const
May be a lexically backward dependence type (includes Unknown).
Instruction * getSource(const MemoryDepChecker &DepChecker) const
Return the source instruction of the dependence.
LLVM_ABI bool isForward() const
Lexically forward dependence.
LLVM_ABI bool isBackward() const
Lexically backward dependence.
LLVM_ABI void print(raw_ostream &OS, unsigned Depth, const SmallVectorImpl< Instruction * > &Instrs) const
Print the dependence.
unsigned Source
Index of the source of the dependence in the InstMap vector.
DepType
The type of the dependence.
static LLVM_ABI const char * DepName[]
String version of the types.
static LLVM_ABI VectorizationSafetyStatus isSafeForVectorization(DepType Type)
Dependence types that don't prevent vectorization.
Represent one information held inside an operand bundle of an llvm.assume.
unsigned AddressSpace
Address space of the involved pointers.
LLVM_ABI bool addPointer(unsigned Index, const RuntimePointerChecking &RtCheck)
Tries to add the pointer recorded in RtCheck at index Index to this pointer checking group.
bool NeedsFreeze
Whether the pointer needs to be frozen after expansion, e.g.
LLVM_ABI RuntimeCheckingPtrGroup(unsigned Index, const RuntimePointerChecking &RtCheck)
Create a new pointer checking group containing a single pointer, with index Index in RtCheck.
const SCEV * High
The SCEV expression which represents the upper bound of all the pointers in this group.
SmallVector< unsigned, 2 > Members
Indices of all the pointers that constitute this grouping.
const SCEV * Low
The SCEV expression which represents the lower bound of all the pointers in this group.
bool IsWritePtr
Holds the information if this pointer is used for writing to memory.
unsigned DependencySetId
Holds the id of the set of pointers that could be dependent because of a shared underlying object.
unsigned AliasSetId
Holds the id of the disjoint alias set to which this pointer belongs.
static LLVM_ABI const unsigned MaxVectorWidth
Maximum SIMD width.
static LLVM_ABI unsigned RuntimeMemoryCheckThreshold
\When performing memory disambiguation checks at runtime do not make more than this number of compari...
static LLVM_ABI bool isInterleaveForced()
True if force-vector-interleave was specified by the user.
static LLVM_ABI unsigned VectorizationInterleave
Interleave factor as overridden by the user.
static LLVM_ABI ElementCount VectorizationFactor
VF as overridden by the user.
static LLVM_ABI bool HoistRuntimeChecks
Function object to check whether the first component of a container supported by std::get (like std::...
Definition STLExtras.h:1439