[llvm] [SLP] Bail out on store-to-load forwarding hazards (PR #199606)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 22 05:22:27 PDT 2026
================
@@ -27384,6 +27418,142 @@ bool SLPVectorizerPass::runImpl(Function &F, ScalarEvolution *SE_,
return Changed;
}
+bool BoUpSLP::findStoreLoadForwardingConflict(StoreInst *BaseStore,
+ unsigned VF) {
+ if (!BaseStore || !LAIs)
+ return false;
+
+ StoreInst *FirstStore = BaseStore;
+
+ // Cache lookup: avoid re-walking the LAA dependence list when the same
+ // chain is retried at multiple vector factors.
+ auto Key = std::make_pair(FirstStore, VF);
+ auto CacheIt = StlfConflictCache.find(Key);
+ if (CacheIt != StlfConflictCache.end())
+ return CacheIt->second;
+
+ auto CacheAndReturn = [&](bool Result) -> bool {
+ StlfConflictCache[Key] = Result;
+ return Result;
+ };
+
+ Loop *L = LI->getLoopFor(FirstStore->getParent());
+ if (!L)
+ return CacheAndReturn(false);
+
+ Type *ValueTy = FirstStore->getValueOperand()->getType();
+ TypeSize StoreSize = DL->getTypeStoreSize(ValueTy);
+ if (StoreSize.isScalable())
+ return CacheAndReturn(false);
+ uint64_t ElementSize = StoreSize.getFixedValue();
+ if (ElementSize == 0)
+ return CacheAndReturn(false);
+ uint64_t VectorStoreBytes = uint64_t(VF) * ElementSize;
+ LLVM_DEBUG(dbgs() << "SLP: STLF check: VF=" << VF
+ << " ElementSize=" << ElementSize
+ << " VectorStoreBytes=" << VectorStoreBytes << "\n");
+
+ // Cheap early-gate: if the loop has no loads from the same underlying
+ // object as the store chain, STLF conflicts are impossible. This avoids
+ // paying for LAA on loops that obviously cannot conflict.
+ Value *StoreBase = getUnderlyingObject(FirstStore->getPointerOperand());
+ auto HasSameBaseLoad = [&]() {
+ for (BasicBlock *BB : L->blocks())
+ for (Instruction &I : *BB)
+ if (auto *LdI = dyn_cast<LoadInst>(&I))
+ if (LdI->isSimple() &&
+ getUnderlyingObject(LdI->getPointerOperand()) == StoreBase)
+ return true;
----------------
alexey-bataev wrote:
```suggestion
if (auto *LdI = dyn_cast<LoadInst>(&I); LdI && LdI->isSimple() &&
getUnderlyingObject(LdI->getPointerOperand()) == StoreBase)
return true;
```
https://github.com/llvm/llvm-project/pull/199606
More information about the llvm-commits
mailing list