[llvm] [Analysis] Teach isDereferenceableAndAlignedInLoop about SCEV predicates (PR #106562)
Igor Kirillov via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 6 07:51:24 PDT 2024
================
@@ -1331,11 +1331,17 @@ bool LoopVectorizationLegality::canVectorizeWithIfConvert() {
// we restrict this to loads; stores are more complicated due to
// concurrency restrictions.
ScalarEvolution &SE = *PSE.getSE();
+ SmallVector<const SCEVPredicate *, 4> Predicates;
for (Instruction &I : *BB) {
LoadInst *LI = dyn_cast<LoadInst>(&I);
+ // Pass the Predicates pointer to isDereferenceableAndAlignedInLoop so
+ // that it will consider loops that need guarding by SCEV checks. The
+ // vectoriser will generate these checks if we decide to vectorise.
if (LI && !LI->getType()->isVectorTy() && !mustSuppressSpeculation(*LI) &&
- isDereferenceableAndAlignedInLoop(LI, TheLoop, SE, *DT, AC))
+ isDereferenceableAndAlignedInLoop(LI, TheLoop, SE, *DT, AC,
+ &Predicates))
SafePointers.insert(LI->getPointerOperand());
+ Predicates.clear();
----------------
igogo-x86 wrote:
I might not understand the full underlying magic, but I need help seeing a generation of the required predicates. As far as I understand, it is legal to put a pointer into `SafePointer` if `Predicates` would be generated before the vectorised loop, but I don't see any other code that collects those predicates again or generates them.
https://github.com/llvm/llvm-project/pull/106562
More information about the llvm-commits
mailing list