forked from OSchip/llvm-project
[DSE] Make DSEState non-copyable (NFC)
As it contains a self-reference, the default copy/move ctors would not be safe. Move the DSEState::get() method into the ctor to make sure no move occurs here even without NRVO. This is a speculative fix for test failures on llvm-clang-x86_64-expensive-checks-win.
This commit is contained in:
parent
8cf93a35d4
commit
f3c74b72f4
|
@ -898,30 +898,29 @@ struct DSEState {
|
|||
/// basic block.
|
||||
DenseMap<BasicBlock *, InstOverlapIntervalsTy> IOLs;
|
||||
|
||||
// Class contains self-reference, make sure it's not copied/moved.
|
||||
DSEState(const DSEState &) = delete;
|
||||
DSEState &operator=(const DSEState &) = delete;
|
||||
|
||||
DSEState(Function &F, AliasAnalysis &AA, MemorySSA &MSSA, DominatorTree &DT,
|
||||
PostDominatorTree &PDT, const TargetLibraryInfo &TLI,
|
||||
const LoopInfo &LI)
|
||||
: F(F), AA(AA), EI(DT, LI), BatchAA(AA, &EI), MSSA(MSSA), DT(DT),
|
||||
PDT(PDT), TLI(TLI), DL(F.getParent()->getDataLayout()), LI(LI) {}
|
||||
|
||||
static DSEState get(Function &F, AliasAnalysis &AA, MemorySSA &MSSA,
|
||||
DominatorTree &DT, PostDominatorTree &PDT,
|
||||
const TargetLibraryInfo &TLI, const LoopInfo &LI) {
|
||||
DSEState State(F, AA, MSSA, DT, PDT, TLI, LI);
|
||||
PDT(PDT), TLI(TLI), DL(F.getParent()->getDataLayout()), LI(LI) {
|
||||
// Collect blocks with throwing instructions not modeled in MemorySSA and
|
||||
// alloc-like objects.
|
||||
unsigned PO = 0;
|
||||
for (BasicBlock *BB : post_order(&F)) {
|
||||
State.PostOrderNumbers[BB] = PO++;
|
||||
PostOrderNumbers[BB] = PO++;
|
||||
for (Instruction &I : *BB) {
|
||||
MemoryAccess *MA = MSSA.getMemoryAccess(&I);
|
||||
if (I.mayThrow() && !MA)
|
||||
State.ThrowingBlocks.insert(I.getParent());
|
||||
ThrowingBlocks.insert(I.getParent());
|
||||
|
||||
auto *MD = dyn_cast_or_null<MemoryDef>(MA);
|
||||
if (MD && State.MemDefs.size() < MemorySSADefsPerBlockLimit &&
|
||||
(State.getLocForWriteEx(&I) || State.isMemTerminatorInst(&I)))
|
||||
State.MemDefs.push_back(MD);
|
||||
if (MD && MemDefs.size() < MemorySSADefsPerBlockLimit &&
|
||||
(getLocForWriteEx(&I) || isMemTerminatorInst(&I)))
|
||||
MemDefs.push_back(MD);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -931,14 +930,12 @@ struct DSEState {
|
|||
if (AI.hasPassPointeeByValueCopyAttr()) {
|
||||
// For byval, the caller doesn't know the address of the allocation.
|
||||
if (AI.hasByValAttr())
|
||||
State.InvisibleToCallerBeforeRet.insert({&AI, true});
|
||||
State.InvisibleToCallerAfterRet.insert({&AI, true});
|
||||
InvisibleToCallerBeforeRet.insert({&AI, true});
|
||||
InvisibleToCallerAfterRet.insert({&AI, true});
|
||||
}
|
||||
|
||||
// Collect whether there is any irreducible control flow in the function.
|
||||
State.ContainsIrreducibleLoops = mayContainIrreducibleControl(F, &LI);
|
||||
|
||||
return State;
|
||||
ContainsIrreducibleLoops = mayContainIrreducibleControl(F, &LI);
|
||||
}
|
||||
|
||||
/// Return 'OW_Complete' if a store to the 'KillingLoc' location (by \p
|
||||
|
@ -1935,7 +1932,7 @@ static bool eliminateDeadStores(Function &F, AliasAnalysis &AA, MemorySSA &MSSA,
|
|||
const LoopInfo &LI) {
|
||||
bool MadeChange = false;
|
||||
|
||||
DSEState State = DSEState::get(F, AA, MSSA, DT, PDT, TLI, LI);
|
||||
DSEState State(F, AA, MSSA, DT, PDT, TLI, LI);
|
||||
// For each store:
|
||||
for (unsigned I = 0; I < State.MemDefs.size(); I++) {
|
||||
MemoryDef *KillingDef = State.MemDefs[I];
|
||||
|
|
Loading…
Reference in New Issue