Skip to content

Commit b341efc

Browse files
committed
Revert [AliasAnalysis] AAResults preserves AAManager.
Triggers use-after-free. llvm-svn: 359055
1 parent 06d2fa7 commit b341efc

File tree

5 files changed

+13
-13
lines changed

5 files changed

+13
-13
lines changed

llvm/include/llvm/Analysis/AliasAnalysis.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,12 +1096,6 @@ bool isIdentifiedFunctionLocal(const Value *V);
10961096
/// This manager effectively wraps the AnalysisManager for registering alias
10971097
/// analyses. When you register your alias analysis with this manager, it will
10981098
/// ensure the analysis itself is registered with its AnalysisManager.
1099-
///
1100-
/// The result of this analysis is only invalidated if one of the particular
1101-
/// aggregated AA results end up being invalidated. This removes the need to
1102-
/// explicitly preserve the results of `AAManager`. Note that analyses should no
1103-
/// longer be registered once the `AAManager` is run.
1104-
11051099
class AAManager : public AnalysisInfoMixin<AAManager> {
11061100
public:
11071101
using Result = AAResults;

llvm/lib/Analysis/AliasAnalysis.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,12 @@ AAResults::~AAResults() {
7979

8080
bool AAResults::invalidate(Function &F, const PreservedAnalyses &PA,
8181
FunctionAnalysisManager::Invalidator &Inv) {
82-
// AAResults preserves the AAManager by default, due to the stateless nature
83-
// of AliasAnalysis. There is no need to check whether it has been preserved
84-
// explicitly. However, we still need to check if any of the dependencies end
85-
// up being invalidated, and invalidate ourselves in that case.
82+
// Check if the AA manager itself has been invalidated.
83+
auto PAC = PA.getChecker<AAManager>();
84+
if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>())
85+
return true; // The manager needs to be blown away, clear everything.
86+
87+
// Check all of the dependencies registered.
8688
for (AnalysisKey *ID : AADeps)
8789
if (Inv.invalidate(ID, F, PA))
8890
return true;

llvm/test/Analysis/MemoryDependenceAnalysis/invalidation.ll

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
; Test that memdep gets invalidated when the analyses it depends on are
22
; invalidated.
33
;
4-
; Check AA. AA is stateless, there's nothing to invalidate.
4+
; Check AA specifically.
55
; RUN: opt -disable-output -debug-pass-manager -aa-pipeline='basic-aa' %s 2>&1 \
66
; RUN: -passes='require<memdep>,invalidate<aa>,gvn' \
77
; RUN: | FileCheck %s --check-prefix=CHECK-AA-INVALIDATE
88
; CHECK-AA-INVALIDATE: Running pass: RequireAnalysisPass
99
; CHECK-AA-INVALIDATE: Running analysis: MemoryDependenceAnalysis
1010
; CHECK-AA-INVALIDATE: Running pass: InvalidateAnalysisPass
11-
; CHECK-NOT-AA-INVALIDATE: Invalidating analysis: MemoryDependenceAnalysis
11+
; CHECK-AA-INVALIDATE: Invalidating analysis: AAManager
12+
; CHECK-AA-INVALIDATE: Invalidating analysis: MemoryDependenceAnalysis
1213
; CHECK-AA-INVALIDATE: Running pass: GVN
13-
; CHECK-NOT-AA-INVALIDATE: Running analysis: MemoryDependenceAnalysis
14+
; CHECK-AA-INVALIDATE: Running analysis: MemoryDependenceAnalysis
1415
;
1516
; Check domtree specifically.
1617
; RUN: opt -disable-output -debug-pass-manager %s 2>&1 \

llvm/test/Other/new-pass-manager.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,13 @@
355355
; CHECK-AA-MODULE-INVALIDATE: Running analysis: AAManager
356356
; CHECK-AA-MODULE-INVALIDATE: Finished llvm::Function pass manager run
357357
; CHECK-AA-MODULE-INVALIDATE: Running pass: InvalidateAnalysisPass
358+
; CHECK-AA-MODULE-INVALIDATE: Invalidating analysis: AAManager
358359
; CHECK-AA-MODULE-INVALIDATE: Invalidating analysis: GlobalsAA
359360
; CHECK-AA-MODULE-INVALIDATE: Running pass: RequireAnalysisPass
360361
; CHECK-AA-MODULE-INVALIDATE: Running analysis: GlobalsAA
361362
; CHECK-AA-MODULE-INVALIDATE: Starting llvm::Function pass manager run
362363
; CHECK-AA-MODULE-INVALIDATE: Running pass: AAEvaluator
364+
; CHECK-AA-MODULE-INVALIDATE: Running analysis: AAManager
363365
; CHECK-AA-MODULE-INVALIDATE: Finished llvm::Function pass manager run
364366
; CHECK-AA-MODULE-INVALIDATE: Finished llvm::Module pass manager run
365367

llvm/unittests/Transforms/Scalar/LoopPassManagerTest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,7 @@ TEST_F(LoopPassManagerTest, InvalidationOfBundledAnalyses) {
572572
// invalidation and running.
573573
EXPECT_CALL(MFPHandle, run(HasName("f"), _))
574574
.WillOnce(Return(getLoopPassPreservedAnalyses()));
575+
EXPECT_CALL(MLAHandle, invalidate(_, _, _)).Times(3);
575576
EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
576577
EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
577578
EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));

0 commit comments

Comments
 (0)