Skip to content

Commit 606aa62

Browse files
committed
Revert "[AssumptionCache] Avoid dangling llvm.assume calls in the cache"
This reverts commit b7d870e and the subsequent fix "[Polly] Fix build after AssumptionCache change (D96168)" (commit e6810ca). It caused indeterminism in the output, such that e.g. the polly-x86_64-linux buildbot failed accasionally.
1 parent f8772da commit 606aa62

File tree

9 files changed

+68
-62
lines changed

9 files changed

+68
-62
lines changed

llvm/include/llvm/Analysis/AssumptionCache.h

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818
#include "llvm/ADT/ArrayRef.h"
1919
#include "llvm/ADT/DenseMap.h"
2020
#include "llvm/ADT/DenseMapInfo.h"
21-
#include "llvm/ADT/SmallSet.h"
2221
#include "llvm/ADT/SmallVector.h"
23-
#include "llvm/IR/IntrinsicInst.h"
2422
#include "llvm/IR/PassManager.h"
2523
#include "llvm/IR/ValueHandle.h"
2624
#include "llvm/Pass.h"
@@ -46,22 +44,6 @@ class AssumptionCache {
4644
/// llvm.assume.
4745
enum : unsigned { ExprResultIdx = std::numeric_limits<unsigned>::max() };
4846

49-
/// Callback handle to ensure we do not have dangling pointers to llvm.assume
50-
/// calls in our cache.
51-
class AssumeHandle final : public CallbackVH {
52-
AssumptionCache *AC;
53-
54-
/// Make sure llvm.assume calls that are deleted are removed from the cache.
55-
void deleted() override;
56-
57-
public:
58-
AssumeHandle(Value *V, AssumptionCache *AC = nullptr)
59-
: CallbackVH(V), AC(AC) {}
60-
61-
operator Value *() const { return getValPtr(); }
62-
CallInst *getAssumeCI() const { return cast<CallInst>(getValPtr()); }
63-
};
64-
6547
struct ResultElem {
6648
WeakVH Assume;
6749

@@ -77,9 +59,9 @@ class AssumptionCache {
7759
/// We track this to lazily populate our assumptions.
7860
Function &F;
7961

80-
/// Set of value handles for calls of the \@llvm.assume intrinsic.
81-
using AssumeHandleSet = DenseSet<AssumeHandle, DenseMapInfo<Value *>>;
82-
AssumeHandleSet AssumeHandles;
62+
/// Vector of weak value handles to calls of the \@llvm.assume
63+
/// intrinsic.
64+
SmallVector<ResultElem, 4> AssumeHandles;
8365

8466
class AffectedValueCallbackVH final : public CallbackVH {
8567
AssumptionCache *AC;
@@ -155,7 +137,13 @@ class AssumptionCache {
155137

156138
/// Access the list of assumption handles currently tracked for this
157139
/// function.
158-
AssumeHandleSet &assumptions() {
140+
///
141+
/// Note that these produce weak handles that may be null. The caller must
142+
/// handle that case.
143+
/// FIXME: We should replace this with pointee_iterator<filter_iterator<...>>
144+
/// when we can write that to filter out the null values. Then caller code
145+
/// will become simpler.
146+
MutableArrayRef<ResultElem> assumptions() {
159147
if (!Scanned)
160148
scanFunction();
161149
return AssumeHandles;

llvm/lib/Analysis/AssumptionCache.cpp

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,7 @@ void AssumptionCache::unregisterAssumption(CallInst *CI) {
163163
AffectedValues.erase(AVI);
164164
}
165165

166-
AssumeHandles.erase({CI, this});
167-
}
168-
169-
void AssumptionCache::AssumeHandle::deleted() {
170-
AC->AssumeHandles.erase(*this);
171-
// 'this' now dangles!
166+
erase_value(AssumeHandles, CI);
172167
}
173168

174169
void AssumptionCache::AffectedValueCallbackVH::deleted() {
@@ -209,14 +204,14 @@ void AssumptionCache::scanFunction() {
209204
for (BasicBlock &B : F)
210205
for (Instruction &II : B)
211206
if (match(&II, m_Intrinsic<Intrinsic::assume>()))
212-
AssumeHandles.insert({&II, this});
207+
AssumeHandles.push_back({&II, ExprResultIdx});
213208

214209
// Mark the scan as complete.
215210
Scanned = true;
216211

217212
// Update affected values.
218-
for (auto &AssumeVH : AssumeHandles)
219-
updateAffectedValues(AssumeVH.getAssumeCI());
213+
for (auto &A : AssumeHandles)
214+
updateAffectedValues(cast<CallInst>(A));
220215
}
221216

222217
void AssumptionCache::registerAssumption(CallInst *CI) {
@@ -228,19 +223,28 @@ void AssumptionCache::registerAssumption(CallInst *CI) {
228223
if (!Scanned)
229224
return;
230225

231-
AssumeHandles.insert({CI, this});
226+
AssumeHandles.push_back({CI, ExprResultIdx});
232227

233228
#ifndef NDEBUG
234229
assert(CI->getParent() &&
235230
"Cannot register @llvm.assume call not in a basic block");
236231
assert(&F == CI->getParent()->getParent() &&
237232
"Cannot register @llvm.assume call not in this function");
238233

239-
for (auto &AssumeVH : AssumeHandles) {
240-
assert(&F == AssumeVH.getAssumeCI()->getCaller() &&
234+
// We expect the number of assumptions to be small, so in an asserts build
235+
// check that we don't accumulate duplicates and that all assumptions point
236+
// to the same function.
237+
SmallPtrSet<Value *, 16> AssumptionSet;
238+
for (auto &VH : AssumeHandles) {
239+
if (!VH)
240+
continue;
241+
242+
assert(&F == cast<Instruction>(VH)->getParent()->getParent() &&
241243
"Cached assumption not inside this function!");
242-
assert(match(AssumeVH.getAssumeCI(), m_Intrinsic<Intrinsic::assume>()) &&
244+
assert(match(cast<CallInst>(VH), m_Intrinsic<Intrinsic::assume>()) &&
243245
"Cached something other than a call to @llvm.assume!");
246+
assert(AssumptionSet.insert(VH).second &&
247+
"Cache contains multiple copies of a call!");
244248
}
245249
#endif
246250

@@ -254,8 +258,9 @@ PreservedAnalyses AssumptionPrinterPass::run(Function &F,
254258
AssumptionCache &AC = AM.getResult<AssumptionAnalysis>(F);
255259

256260
OS << "Cached assumptions for function: " << F.getName() << "\n";
257-
for (auto &AssumeVH : AC.assumptions())
258-
OS << " " << *AssumeVH.getAssumeCI()->getArgOperand(0) << "\n";
261+
for (auto &VH : AC.assumptions())
262+
if (VH)
263+
OS << " " << *cast<CallInst>(VH)->getArgOperand(0) << "\n";
259264

260265
return PreservedAnalyses::all();
261266
}
@@ -301,8 +306,9 @@ void AssumptionCacheTracker::verifyAnalysis() const {
301306

302307
SmallPtrSet<const CallInst *, 4> AssumptionSet;
303308
for (const auto &I : AssumptionCaches) {
304-
for (auto &AssumeVH : I.second->assumptions())
305-
AssumptionSet.insert(AssumeVH.getAssumeCI());
309+
for (auto &VH : I.second->assumptions())
310+
if (VH)
311+
AssumptionSet.insert(cast<CallInst>(VH));
306312

307313
for (const BasicBlock &B : cast<Function>(*I.first))
308314
for (const Instruction &II : B)

llvm/lib/Analysis/CodeMetrics.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ void CodeMetrics::collectEphemeralValues(
7474
SmallVector<const Value *, 16> Worklist;
7575

7676
for (auto &AssumeVH : AC->assumptions()) {
77-
Instruction *I = AssumeVH.getAssumeCI();
77+
if (!AssumeVH)
78+
continue;
79+
Instruction *I = cast<Instruction>(AssumeVH);
7880

7981
// Filter out call sites outside of the loop so we don't do a function's
8082
// worth of work for each of its loops (and, in the common case, ephemeral
@@ -96,7 +98,9 @@ void CodeMetrics::collectEphemeralValues(
9698
SmallVector<const Value *, 16> Worklist;
9799

98100
for (auto &AssumeVH : AC->assumptions()) {
99-
Instruction *I = AssumeVH.getAssumeCI();
101+
if (!AssumeVH)
102+
continue;
103+
Instruction *I = cast<Instruction>(AssumeVH);
100104
assert(I->getParent()->getParent() == F &&
101105
"Found assumption for the wrong function!");
102106

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,9 +1704,9 @@ ScalarEvolution::getZeroExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth) {
17041704
getZeroExtendExpr(Step, Ty, Depth + 1), L,
17051705
AR->getNoWrapFlags());
17061706
}
1707-
1707+
17081708
// For a negative step, we can extend the operands iff doing so only
1709-
// traverses values in the range zext([0,UINT_MAX]).
1709+
// traverses values in the range zext([0,UINT_MAX]).
17101710
if (isKnownNegative(Step)) {
17111711
const SCEV *N = getConstant(APInt::getMaxValue(BitWidth) -
17121712
getSignedRangeMin(Step));
@@ -9927,7 +9927,9 @@ ScalarEvolution::isLoopBackedgeGuardedByCond(const Loop *L,
99279927

99289928
// Check conditions due to any @llvm.assume intrinsics.
99299929
for (auto &AssumeVH : AC.assumptions()) {
9930-
auto *CI = AssumeVH.getAssumeCI();
9930+
if (!AssumeVH)
9931+
continue;
9932+
auto *CI = cast<CallInst>(AssumeVH);
99319933
if (!DT.dominates(CI, Latch->getTerminator()))
99329934
continue;
99339935

@@ -10074,7 +10076,9 @@ bool ScalarEvolution::isBasicBlockEntryGuardedByCond(const BasicBlock *BB,
1007410076

1007510077
// Check conditions due to any @llvm.assume intrinsics.
1007610078
for (auto &AssumeVH : AC.assumptions()) {
10077-
auto *CI = AssumeVH.getAssumeCI();
10079+
if (!AssumeVH)
10080+
continue;
10081+
auto *CI = cast<CallInst>(AssumeVH);
1007810082
if (!DT.dominates(CI, BB))
1007910083
continue;
1008010084

@@ -13354,7 +13358,9 @@ const SCEV *ScalarEvolution::applyLoopGuards(const SCEV *Expr, const Loop *L) {
1335413358

1335513359
// Also collect information from assumptions dominating the loop.
1335613360
for (auto &AssumeVH : AC.assumptions()) {
13357-
auto *AssumeI = AssumeVH.getAssumeCI();
13361+
if (!AssumeVH)
13362+
continue;
13363+
auto *AssumeI = cast<CallInst>(AssumeVH);
1335813364
auto *Cmp = dyn_cast<ICmpInst>(AssumeI->getOperand(0));
1335913365
if (!Cmp || !DT.dominates(AssumeI, L->getHeader()))
1336013366
continue;

llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -331,11 +331,12 @@ bool AlignmentFromAssumptionsPass::runImpl(Function &F, AssumptionCache &AC,
331331
DT = DT_;
332332

333333
bool Changed = false;
334-
for (auto &AssumeVH : AC.assumptions()) {
335-
CallInst *Call = AssumeVH.getAssumeCI();
336-
for (unsigned Idx = 0; Idx < Call->getNumOperandBundles(); Idx++)
337-
Changed |= processAssumption(Call, Idx);
338-
}
334+
for (auto &AssumeVH : AC.assumptions())
335+
if (AssumeVH) {
336+
CallInst *Call = cast<CallInst>(AssumeVH);
337+
for (unsigned Idx = 0; Idx < Call->getNumOperandBundles(); Idx++)
338+
Changed |= processAssumption(Call, Idx);
339+
}
339340

340341
return Changed;
341342
}

llvm/lib/Transforms/Utils/CodeExtractor.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,8 +1780,10 @@ CodeExtractor::extractCodeRegion(const CodeExtractorAnalysisCache &CEAC) {
17801780
bool CodeExtractor::verifyAssumptionCache(const Function &OldFunc,
17811781
const Function &NewFunc,
17821782
AssumptionCache *AC) {
1783-
for (auto &AssumeVH : AC->assumptions()) {
1784-
auto *I = AssumeVH.getAssumeCI();
1783+
for (auto AssumeVH : AC->assumptions()) {
1784+
auto *I = dyn_cast_or_null<CallInst>(AssumeVH);
1785+
if (!I)
1786+
continue;
17851787

17861788
// There shouldn't be any llvm.assume intrinsics in the new function.
17871789
if (I->getFunction() != &OldFunc)

llvm/lib/Transforms/Utils/PredicateInfo.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -530,11 +530,10 @@ void PredicateInfoBuilder::buildPredicateInfo() {
530530
processSwitch(SI, BranchBB, OpsToRename);
531531
}
532532
}
533-
for (auto &AssumeVH : AC.assumptions()) {
534-
CallInst *AssumeCI = AssumeVH.getAssumeCI();
535-
if (DT.isReachableFromEntry(AssumeCI->getParent()))
536-
processAssume(cast<IntrinsicInst>(AssumeCI), AssumeCI->getParent(),
537-
OpsToRename);
533+
for (auto &Assume : AC.assumptions()) {
534+
if (auto *II = dyn_cast_or_null<IntrinsicInst>(Assume))
535+
if (DT.isReachableFromEntry(II->getParent()))
536+
processAssume(II, II->getParent(), OpsToRename);
538537
}
539538
// Now rename all our operations.
540539
renameUses(OpsToRename);

llvm/test/Analysis/AssumptionCache/basic.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ declare void @llvm.assume(i1)
66

77
define void @test1(i32 %a) {
88
; CHECK-LABEL: Cached assumptions for function: test1
9-
; CHECK-DAG: icmp ne i32 %{{.*}}, 0
10-
; CHECK-DAG: icmp slt i32 %{{.*}}, 0
11-
; CHECK-DAG: icmp sgt i32 %{{.*}}, 0
9+
; CHECK-NEXT: icmp ne i32 %{{.*}}, 0
10+
; CHECK-NEXT: icmp slt i32 %{{.*}}, 0
11+
; CHECK-NEXT: icmp sgt i32 %{{.*}}, 0
1212

1313
entry:
1414
%cond1 = icmp ne i32 %a, 0

polly/lib/Analysis/ScopBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,7 @@ void ScopBuilder::addRecordedAssumptions() {
15271527
void ScopBuilder::addUserAssumptions(
15281528
AssumptionCache &AC, DenseMap<BasicBlock *, isl::set> &InvalidDomainMap) {
15291529
for (auto &Assumption : AC.assumptions()) {
1530-
auto *CI = dyn_cast_or_null<CallInst>(Assumption.getAssumeCI());
1530+
auto *CI = dyn_cast_or_null<CallInst>(Assumption);
15311531
if (!CI || CI->getNumArgOperands() != 1)
15321532
continue;
15331533

0 commit comments

Comments
 (0)