[llvm] [LAA] Always use DepCands when grouping runtime checks. (PR #91196)
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 8 04:29:42 PDT 2024
================
@@ -1128,18 +1124,38 @@ bool AccessAnalysis::createCheckForAccess(RuntimePointerChecking &RtCheck,
return true;
}
-bool AccessAnalysis::canCheckPtrAtRT(RuntimePointerChecking &RtCheck,
- ScalarEvolution *SE, Loop *TheLoop,
- const DenseMap<Value *, const SCEV *> &StridesMap,
- Value *&UncomputablePtr, bool ShouldCheckWrap) {
+bool AccessAnalysis::canCheckPtrAtRT(
+ const MemoryDepChecker &DepChecker, RuntimePointerChecking &RtCheck,
+ ScalarEvolution *SE, Loop *TheLoop,
+ const DenseMap<Value *, const SCEV *> &StridesMap, Value *&UncomputablePtr,
+ bool ShouldCheckWrap) {
// Find pointers with computable bounds. We are going to use this information
// to place a runtime bound check.
bool CanDoRT = true;
bool MayNeedRTCheck = false;
if (!IsRTCheckAnalysisNeeded) return true;
- bool IsDepCheckNeeded = isDependencyCheckNeeded();
+ if (auto *Deps = DepChecker.getDependences()) {
+ // If there are unknown dependences, this means runtime checks are needed to
+ // ensure there's no overlap between accesses to the same underlying object.
+ // Remove the equivalence classes containing both source and destination
+ // accesses from DepCands. This ensures runtime checks will be generated
+ // between those accesses and prevents them from being grouped together.
+ for (const auto &Dep : *Deps) {
+ if (Dep.Type != MemoryDepChecker::Dependence::Unknown) {
+ assert(MemoryDepChecker::Dependence::isSafeForVectorization(Dep.Type) ==
+ MemoryDepChecker::VectorizationSafetyStatus::Safe &&
+ "Should only skip safe dependences");
+ continue;
+ }
+ Instruction *Src = Dep.getSource(DepChecker);
+ Instruction *Dst = Dep.getDestination(DepChecker);
+ DepCands.eraseClass({getPointerOperand(Src), Src->mayWriteToMemory()});
+ DepCands.eraseClass({getPointerOperand(Dst), Dst->mayWriteToMemory()});
+ }
+ } else
+ CheckDeps.clear();
----------------
Meinersbur wrote:
[serious] Can we do without modifying state within a query function?
https://github.com/llvm/llvm-project/pull/91196
More information about the llvm-commits
mailing list