Revert "[SLP] Optionally preserve MemorySSA"
This reverts commit 1cfa986d68
. See https://github.com/llvm/llvm-project/issues/54256 for why I'm discontinuing the project.
Seperately, it turns out that while this patch does correctly preserve MSSA, it's correct only at the end of the pass; not between vectorization attempts. Even if we decide to resurrect this, we'll need to fix that before reapplying.
This commit is contained in:
parent
078b546555
commit
8f108c32bc
|
@ -37,7 +37,6 @@ class InsertElementInst;
|
|||
class InsertValueInst;
|
||||
class Instruction;
|
||||
class LoopInfo;
|
||||
class MemorySSA;
|
||||
class OptimizationRemarkEmitter;
|
||||
class PHINode;
|
||||
class ScalarEvolution;
|
||||
|
@ -68,7 +67,6 @@ struct SLPVectorizerPass : public PassInfoMixin<SLPVectorizerPass> {
|
|||
DominatorTree *DT = nullptr;
|
||||
AssumptionCache *AC = nullptr;
|
||||
DemandedBits *DB = nullptr;
|
||||
MemorySSA *MSSA = nullptr; // nullable, currently preserved, but not used
|
||||
const DataLayout *DL = nullptr;
|
||||
|
||||
public:
|
||||
|
@ -78,7 +76,7 @@ public:
|
|||
bool runImpl(Function &F, ScalarEvolution *SE_, TargetTransformInfo *TTI_,
|
||||
TargetLibraryInfo *TLI_, AAResults *AA_, LoopInfo *LI_,
|
||||
DominatorTree *DT_, AssumptionCache *AC_, DemandedBits *DB_,
|
||||
MemorySSA *MSSA_, OptimizationRemarkEmitter *ORE_);
|
||||
OptimizationRemarkEmitter *ORE_);
|
||||
|
||||
private:
|
||||
/// Collect store and getelementptr instructions and organize them
|
||||
|
|
|
@ -41,8 +41,6 @@
|
|||
#include "llvm/Analysis/LoopAccessAnalysis.h"
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/Analysis/MemoryLocation.h"
|
||||
#include "llvm/Analysis/MemorySSA.h"
|
||||
#include "llvm/Analysis/MemorySSAUpdater.h"
|
||||
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
|
||||
#include "llvm/Analysis/ScalarEvolution.h"
|
||||
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
|
||||
|
@ -168,10 +166,6 @@ static cl::opt<bool>
|
|||
ViewSLPTree("view-slp-tree", cl::Hidden,
|
||||
cl::desc("Display the SLP trees with Graphviz"));
|
||||
|
||||
static cl::opt<bool> EnableMSSAInSLPVectorizer(
|
||||
"enable-mssa-in-slp-vectorizer", cl::Hidden, cl::init(false),
|
||||
cl::desc("Enable MemorySSA for SLPVectorizer in new pass manager"));
|
||||
|
||||
// Limit the number of alias checks. The limit is chosen so that
|
||||
// it has no negative effect on the llvm benchmarks.
|
||||
static const unsigned AliasedCheckLimit = 10;
|
||||
|
@ -846,10 +840,9 @@ public:
|
|||
BoUpSLP(Function *Func, ScalarEvolution *Se, TargetTransformInfo *Tti,
|
||||
TargetLibraryInfo *TLi, AAResults *Aa, LoopInfo *Li,
|
||||
DominatorTree *Dt, AssumptionCache *AC, DemandedBits *DB,
|
||||
MemorySSA *MSSA, const DataLayout *DL, OptimizationRemarkEmitter *ORE)
|
||||
const DataLayout *DL, OptimizationRemarkEmitter *ORE)
|
||||
: BatchAA(*Aa), F(Func), SE(Se), TTI(Tti), TLI(TLi), LI(Li),
|
||||
DT(Dt), AC(AC), DB(DB), MSSA(MSSA), DL(DL), ORE(ORE),
|
||||
Builder(Se->getContext()) {
|
||||
DT(Dt), AC(AC), DB(DB), DL(DL), ORE(ORE), Builder(Se->getContext()) {
|
||||
CodeMetrics::collectEphemeralValues(F, AC, EphValues);
|
||||
// Use the vector register size specified by the target unless overridden
|
||||
// by a command-line option.
|
||||
|
@ -3057,7 +3050,6 @@ private:
|
|||
DominatorTree *DT;
|
||||
AssumptionCache *AC;
|
||||
DemandedBits *DB;
|
||||
MemorySSA *MSSA;
|
||||
const DataLayout *DL;
|
||||
OptimizationRemarkEmitter *ORE;
|
||||
|
||||
|
@ -3170,13 +3162,6 @@ template <> struct DOTGraphTraits<BoUpSLP *> : public DefaultDOTGraphTraits {
|
|||
} // end namespace llvm
|
||||
|
||||
BoUpSLP::~BoUpSLP() {
|
||||
if (MSSA) {
|
||||
MemorySSAUpdater MSSAU(MSSA);
|
||||
for (const auto &Pair : DeletedInstructions) {
|
||||
if (auto *Access = MSSA->getMemoryAccess(Pair.first))
|
||||
MSSAU.removeMemoryAccess(Access);
|
||||
}
|
||||
}
|
||||
for (const auto &Pair : DeletedInstructions) {
|
||||
// Replace operands of ignored instructions with Undefs in case if they were
|
||||
// marked for deletion.
|
||||
|
@ -6919,15 +6904,6 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
|||
auto *PtrTy = PointerType::get(VecTy, LI->getPointerAddressSpace());
|
||||
Value *Ptr = Builder.CreateBitCast(LI->getOperand(0), PtrTy);
|
||||
LoadInst *V = Builder.CreateAlignedLoad(VecTy, Ptr, LI->getAlign());
|
||||
if (MSSA) {
|
||||
MemorySSAUpdater MSSAU(MSSA);
|
||||
auto *Access = MSSA->getMemoryAccess(LI);
|
||||
assert(Access);
|
||||
MemoryUseOrDef *NewAccess =
|
||||
MSSAU.createMemoryAccessBefore(V, Access->getDefiningAccess(),
|
||||
Access);
|
||||
MSSAU.insertUse(cast<MemoryUse>(NewAccess), true);
|
||||
}
|
||||
Value *NewV = propagateMetadata(V, E->Scalars);
|
||||
ShuffleBuilder.addInversedMask(E->ReorderIndices);
|
||||
ShuffleBuilder.addMask(E->ReuseShuffleIndices);
|
||||
|
@ -7177,17 +7153,6 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
|||
commonAlignment(CommonAlignment, cast<LoadInst>(V)->getAlign());
|
||||
NewLI = Builder.CreateMaskedGather(VecTy, VecPtr, CommonAlignment);
|
||||
}
|
||||
|
||||
if (MSSA) {
|
||||
MemorySSAUpdater MSSAU(MSSA);
|
||||
auto *Access = MSSA->getMemoryAccess(LI);
|
||||
assert(Access);
|
||||
MemoryUseOrDef *NewAccess =
|
||||
MSSAU.createMemoryAccessAfter(NewLI, Access->getDefiningAccess(),
|
||||
Access);
|
||||
MSSAU.insertUse(cast<MemoryUse>(NewAccess), true);
|
||||
}
|
||||
|
||||
Value *V = propagateMetadata(NewLI, E->Scalars);
|
||||
|
||||
ShuffleBuilder.addInversedMask(E->ReorderIndices);
|
||||
|
@ -7213,16 +7178,6 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
|||
StoreInst *ST =
|
||||
Builder.CreateAlignedStore(VecValue, VecPtr, SI->getAlign());
|
||||
|
||||
if (MSSA) {
|
||||
MemorySSAUpdater MSSAU(MSSA);
|
||||
auto *Access = MSSA->getMemoryAccess(SI);
|
||||
assert(Access);
|
||||
MemoryUseOrDef *NewAccess =
|
||||
MSSAU.createMemoryAccessAfter(ST, Access->getDefiningAccess(),
|
||||
Access);
|
||||
MSSAU.insertDef(cast<MemoryDef>(NewAccess), true);
|
||||
}
|
||||
|
||||
// The pointer operand uses an in-tree scalar, so add the new BitCast or
|
||||
// StoreInst to ExternalUses to make sure that an extract will be
|
||||
// generated in the future.
|
||||
|
@ -8205,15 +8160,6 @@ void BoUpSLP::scheduleBlock(BlockScheduling *BS) {
|
|||
BS->initialFillReadyList(ReadyInsts);
|
||||
|
||||
Instruction *LastScheduledInst = BS->ScheduleEnd;
|
||||
MemoryAccess *MemInsertPt = nullptr;
|
||||
if (MSSA) {
|
||||
for (auto I = LastScheduledInst->getIterator(); I != BS->BB->end(); I++) {
|
||||
if (auto *Access = MSSA->getMemoryAccess(&*I)) {
|
||||
MemInsertPt = Access;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Do the "real" scheduling.
|
||||
while (!ReadyInsts.empty()) {
|
||||
|
@ -8225,24 +8171,9 @@ void BoUpSLP::scheduleBlock(BlockScheduling *BS) {
|
|||
for (ScheduleData *BundleMember = picked; BundleMember;
|
||||
BundleMember = BundleMember->NextInBundle) {
|
||||
Instruction *pickedInst = BundleMember->Inst;
|
||||
if (pickedInst->getNextNode() != LastScheduledInst) {
|
||||
if (pickedInst->getNextNode() != LastScheduledInst)
|
||||
pickedInst->moveBefore(LastScheduledInst);
|
||||
if (MSSA) {
|
||||
MemorySSAUpdater MSSAU(MSSA);
|
||||
if (auto *Access = MSSA->getMemoryAccess(pickedInst)) {
|
||||
if (MemInsertPt)
|
||||
MSSAU.moveBefore(Access, cast<MemoryUseOrDef>(MemInsertPt));
|
||||
else
|
||||
MSSAU.moveToPlace(Access, BS->BB,
|
||||
MemorySSA::InsertionPlace::End);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LastScheduledInst = pickedInst;
|
||||
if (MSSA)
|
||||
if (auto *Access = MSSA->getMemoryAccess(LastScheduledInst))
|
||||
MemInsertPt = Access;
|
||||
}
|
||||
|
||||
BS->schedule(picked, ReadyInsts);
|
||||
|
@ -8588,7 +8519,7 @@ struct SLPVectorizer : public FunctionPass {
|
|||
auto *DB = &getAnalysis<DemandedBitsWrapperPass>().getDemandedBits();
|
||||
auto *ORE = &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE();
|
||||
|
||||
return Impl.runImpl(F, SE, TTI, TLI, AA, LI, DT, AC, DB, /*MSSA*/nullptr, ORE);
|
||||
return Impl.runImpl(F, SE, TTI, TLI, AA, LI, DT, AC, DB, ORE);
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
|
@ -8622,21 +8553,13 @@ PreservedAnalyses SLPVectorizerPass::run(Function &F, FunctionAnalysisManager &A
|
|||
auto *AC = &AM.getResult<AssumptionAnalysis>(F);
|
||||
auto *DB = &AM.getResult<DemandedBitsAnalysis>(F);
|
||||
auto *ORE = &AM.getResult<OptimizationRemarkEmitterAnalysis>(F);
|
||||
auto *MSSA = EnableMSSAInSLPVectorizer ?
|
||||
&AM.getResult<MemorySSAAnalysis>(F).getMSSA() : (MemorySSA*)nullptr;
|
||||
|
||||
bool Changed = runImpl(F, SE, TTI, TLI, AA, LI, DT, AC, DB, MSSA, ORE);
|
||||
bool Changed = runImpl(F, SE, TTI, TLI, AA, LI, DT, AC, DB, ORE);
|
||||
if (!Changed)
|
||||
return PreservedAnalyses::all();
|
||||
|
||||
PreservedAnalyses PA;
|
||||
PA.preserveSet<CFGAnalyses>();
|
||||
if (MSSA) {
|
||||
#ifdef EXPENSIVE_CHECKS
|
||||
MSSA->verifyMemorySSA();
|
||||
#endif
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
}
|
||||
return PA;
|
||||
}
|
||||
|
||||
|
@ -8645,7 +8568,6 @@ bool SLPVectorizerPass::runImpl(Function &F, ScalarEvolution *SE_,
|
|||
TargetLibraryInfo *TLI_, AAResults *AA_,
|
||||
LoopInfo *LI_, DominatorTree *DT_,
|
||||
AssumptionCache *AC_, DemandedBits *DB_,
|
||||
MemorySSA *MSSA,
|
||||
OptimizationRemarkEmitter *ORE_) {
|
||||
if (!RunSLPVectorization)
|
||||
return false;
|
||||
|
@ -8679,7 +8601,7 @@ bool SLPVectorizerPass::runImpl(Function &F, ScalarEvolution *SE_,
|
|||
|
||||
// Use the bottom up slp vectorizer to construct chains that start with
|
||||
// store instructions.
|
||||
BoUpSLP R(&F, SE, TTI, TLI, AA, LI, DT, AC, DB, MSSA, DL, ORE_);
|
||||
BoUpSLP R(&F, SE, TTI, TLI, AA, LI, DT, AC, DB, DL, ORE_);
|
||||
|
||||
// A general note: the vectorizer must use BoUpSLP::eraseInstruction() to
|
||||
// delete instructions.
|
||||
|
|
Loading…
Reference in New Issue