diff options
author | Florian Hahn <flo@fhahn.com> | 2024-05-04 20:53:53 +0100 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2024-05-04 20:53:54 +0100 |
commit | b54a78d69be1952884462cb897abb9cf60a33978 (patch) | |
tree | 87c53e7e21500fd47d58c6d95cf83b5b10613c6c /llvm/lib/Analysis/LoopAccessAnalysis.cpp | |
parent | 677dddebae77a93e080a98617aa2714be4a46fd0 (diff) | |
download | llvm-b54a78d69be1952884462cb897abb9cf60a33978.zip llvm-b54a78d69be1952884462cb897abb9cf60a33978.tar.gz llvm-b54a78d69be1952884462cb897abb9cf60a33978.tar.bz2 |
[LV,LAA] Don't vectorize loops with load and store to invar address.
Code checking stores to invariant addresses and reductions made an
incorrect assumption that the case of both a load & store to the same
invariant address does not need to be handled.
In some cases when vectorizing with runtime checks, there may be
dependences with a load and store to the same address, storing a
reduction value.
Update LAA to separately track if there was a store-store and a
load-store dependence with an invariant addresses.
Bail out early if there as a load-store dependence with invariant
address. If there was a store-store one, still apply the logic checking
if they all store a reduction.
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopAccessAnalysis.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index b0d29e2..fc86523 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -2537,7 +2537,7 @@ void LoopAccessInfo::analyzeLoop(AAResults *AA, LoopInfo *LI, if (isInvariant(Ptr)) { // Record store instructions to loop invariant addresses StoresToInvariantAddresses.push_back(ST); - HasDependenceInvolvingLoopInvariantAddress |= + HasStoreStoreDependenceInvolvingLoopInvariantAddress |= !UniformStores.insert(Ptr).second; } @@ -2593,7 +2593,7 @@ void LoopAccessInfo::analyzeLoop(AAResults *AA, LoopInfo *LI, if (UniformStores.count(Ptr)) { LLVM_DEBUG(dbgs() << "LAA: Found an unsafe dependency between a uniform " "load and uniform store to the same address!\n"); - HasDependenceInvolvingLoopInvariantAddress = true; + HasLoadStoreDependenceInvolvingLoopInvariantAddress = true; } MemoryLocation Loc = MemoryLocation::get(LD); @@ -3057,9 +3057,13 @@ void LoopAccessInfo::print(raw_ostream &OS, unsigned Depth) const { PtrRtChecking->print(OS, Depth); OS << "\n"; - OS.indent(Depth) << "Non vectorizable stores to invariant address were " - << (HasDependenceInvolvingLoopInvariantAddress ? "" : "not ") - << "found in loop.\n"; + OS.indent(Depth) + << "Non vectorizable stores to invariant address were " + << (HasStoreStoreDependenceInvolvingLoopInvariantAddress || + HasLoadStoreDependenceInvolvingLoopInvariantAddress + ? "" + : "not ") + << "found in loop.\n"; OS.indent(Depth) << "SCEV assumptions:\n"; PSE->getPredicate().print(OS, Depth); |