[llvm] [MemDepAnalysis] Don't reuse NonLocalPointerDeps cache if memory location size differs (PR #116936)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 19 23:29:39 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Arthur Eubanks (aeubanks)
<details>
<summary>Changes</summary>
As seen in #<!-- -->111585, we can end up using a previous cache entry where the size was too large and was UB.
Compile time impact: https://llvm-compile-time-tracker.com/compare.php?from=6a863f7e2679a60f2f38ae6a920d0b6e1a2c1690&to=faccf4e1f47fcd5360a438de2a56d02b770ad498&stat=instructions:u.
Fixes #<!-- -->111585.
---
Full diff: https://github.com/llvm/llvm-project/pull/116936.diff
1 Files Affected:
- (modified) llvm/lib/Analysis/MemoryDependenceAnalysis.cpp (+12-34)
``````````diff
diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
index c5fba184cd0850..2a0c9612d4abc8 100644
--- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -1066,40 +1066,18 @@ bool MemoryDependenceResults::getNonLocalPointerDepFromBB(
// Invariant loads don't participate in caching. Thus no need to reconcile.
if (!isInvariantLoad && !Pair.second) {
if (CacheInfo->Size != Loc.Size) {
- bool ThrowOutEverything;
- if (CacheInfo->Size.hasValue() && Loc.Size.hasValue()) {
- // FIXME: We may be able to do better in the face of results with mixed
- // precision. We don't appear to get them in practice, though, so just
- // be conservative.
- ThrowOutEverything =
- CacheInfo->Size.isPrecise() != Loc.Size.isPrecise() ||
- !TypeSize::isKnownGE(CacheInfo->Size.getValue(),
- Loc.Size.getValue());
- } else {
- // For our purposes, unknown size > all others.
- ThrowOutEverything = !Loc.Size.hasValue();
- }
-
- if (ThrowOutEverything) {
- // The query's Size is greater than the cached one. Throw out the
- // cached data and proceed with the query at the greater size.
- CacheInfo->Pair = BBSkipFirstBlockPair();
- CacheInfo->Size = Loc.Size;
- for (auto &Entry : CacheInfo->NonLocalDeps)
- if (Instruction *Inst = Entry.getResult().getInst())
- RemoveFromReverseMap(ReverseNonLocalPtrDeps, Inst, CacheKey);
- CacheInfo->NonLocalDeps.clear();
- // The cache is cleared (in the above line) so we will have lost
- // information about blocks we have already visited. We therefore must
- // assume that the cache information is incomplete.
- IsIncomplete = true;
- } else {
- // This query's Size is less than the cached one. Conservatively restart
- // the query using the greater size.
- return getNonLocalPointerDepFromBB(
- QueryInst, Pointer, Loc.getWithNewSize(CacheInfo->Size), isLoad,
- StartBB, Result, Visited, SkipFirstBlock, IsIncomplete);
- }
+ // The query's Size is greater than the cached one. Throw out the
+ // cached data and proceed with the query at the greater size.
+ CacheInfo->Pair = BBSkipFirstBlockPair();
+ CacheInfo->Size = Loc.Size;
+ for (auto &Entry : CacheInfo->NonLocalDeps)
+ if (Instruction *Inst = Entry.getResult().getInst())
+ RemoveFromReverseMap(ReverseNonLocalPtrDeps, Inst, CacheKey);
+ CacheInfo->NonLocalDeps.clear();
+ // The cache is cleared (in the above line) so we will have lost
+ // information about blocks we have already visited. We therefore must
+ // assume that the cache information is incomplete.
+ IsIncomplete = true;
}
// If the query's AATags are inconsistent with the cached one,
``````````
</details>
https://github.com/llvm/llvm-project/pull/116936
More information about the llvm-commits
mailing list