[llvm] [LAA] Always use DepCands when grouping runtime checks. (PR #91196)
Igor Kirillov via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 11 04:48:01 PDT 2025
================
@@ -1303,17 +1303,38 @@ bool AccessAnalysis::createCheckForAccess(
}
bool AccessAnalysis::canCheckPtrAtRT(
- RuntimePointerChecking &RtCheck, Loop *TheLoop,
+ RuntimePointerChecking &RtCheck, ScalarEvolution *SE, Loop *TheLoop,
const DenseMap<Value *, const SCEV *> &StridesMap, Value *&UncomputablePtr,
- bool AllowPartial) {
+ bool AllowPartial, const MemoryDepChecker &DepChecker) {
// 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()});
----------------
igogo-x86 wrote:
Adding a comment here - or removing this line and adding a comment instead - would be helpful for future readers
https://github.com/llvm/llvm-project/pull/91196
More information about the llvm-commits
mailing list