forked from OSchip/llvm-project
[MemorySSA] Remove -enable-mssa-loop-dependency option
This option has been enabled by default for quite a while now. The practical impact of removing the option is that MSSA use cannot be disabled in default pipelines (both LPM and NPM) and in manual LPM invocations. NPM can still choose to enable/disable MSSA using loop vs loop-mssa. The next step will be to require MSSA for LICM and drop the AST-based implementation entirely. Differential Revision: https://reviews.llvm.org/D108075
This commit is contained in:
parent
65532ea6dd
commit
735a590471
|
@ -106,9 +106,6 @@
|
|||
|
||||
namespace llvm {
|
||||
|
||||
/// Enables memory ssa as a dependency for loop passes.
|
||||
extern cl::opt<bool> EnableMSSALoopDependency;
|
||||
|
||||
class AllocaInst;
|
||||
class Function;
|
||||
class Instruction;
|
||||
|
|
|
@ -90,10 +90,6 @@ bool llvm::VerifyMemorySSA = true;
|
|||
#else
|
||||
bool llvm::VerifyMemorySSA = false;
|
||||
#endif
|
||||
/// Enables memory ssa as a dependency for loop passes in legacy pass manager.
|
||||
cl::opt<bool> llvm::EnableMSSALoopDependency(
|
||||
"enable-mssa-loop-dependency", cl::Hidden, cl::init(true),
|
||||
cl::desc("Enable MemorySSA dependency for loop pass manager"));
|
||||
|
||||
static cl::opt<bool, true>
|
||||
VerifyMemorySSAX("verify-memoryssa", cl::location(VerifyMemorySSA),
|
||||
|
|
|
@ -617,7 +617,7 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
|
|||
FPM.addPass(
|
||||
RequireAnalysisPass<OptimizationRemarkEmitterAnalysis, Function>());
|
||||
FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1),
|
||||
EnableMSSALoopDependency,
|
||||
/*UseMemorySSA=*/true,
|
||||
/*UseBlockFrequencyInfo=*/true));
|
||||
FPM.addPass(SimplifyCFGPass());
|
||||
FPM.addPass(InstCombinePass());
|
||||
|
@ -791,7 +791,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
|
|||
FPM.addPass(
|
||||
RequireAnalysisPass<OptimizationRemarkEmitterAnalysis, Function>());
|
||||
FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1),
|
||||
EnableMSSALoopDependency,
|
||||
/*UseMemorySSA=*/true,
|
||||
/*UseBlockFrequencyInfo=*/true));
|
||||
FPM.addPass(SimplifyCFGPass());
|
||||
FPM.addPass(InstCombinePass());
|
||||
|
@ -848,7 +848,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
|
|||
FPM.addPass(DSEPass());
|
||||
FPM.addPass(createFunctionToLoopPassAdaptor(
|
||||
LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap),
|
||||
EnableMSSALoopDependency, /*UseBlockFrequencyInfo=*/true));
|
||||
/*UseMemorySSA=*/true, /*UseBlockFrequencyInfo=*/true));
|
||||
|
||||
FPM.addPass(CoroElidePass());
|
||||
|
||||
|
@ -1246,9 +1246,9 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
|
|||
OptimizationLevel::O3));
|
||||
FPM.addPass(
|
||||
RequireAnalysisPass<OptimizationRemarkEmitterAnalysis, Function>());
|
||||
FPM.addPass(createFunctionToLoopPassAdaptor(
|
||||
std::move(LPM), EnableMSSALoopDependency,
|
||||
/*UseBlockFrequencyInfo=*/true));
|
||||
FPM.addPass(
|
||||
createFunctionToLoopPassAdaptor(std::move(LPM), /*UseMemorySSA=*/true,
|
||||
/*UseBlockFrequencyInfo=*/true));
|
||||
FPM.addPass(SimplifyCFGPass());
|
||||
FPM.addPass(InstCombinePass());
|
||||
}
|
||||
|
@ -1307,7 +1307,7 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
|
|||
RequireAnalysisPass<OptimizationRemarkEmitterAnalysis, Function>());
|
||||
FPM.addPass(createFunctionToLoopPassAdaptor(
|
||||
LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap),
|
||||
EnableMSSALoopDependency, /*UseBlockFrequencyInfo=*/true));
|
||||
/*UseMemorySSA=*/true, /*UseBlockFrequencyInfo=*/true));
|
||||
}
|
||||
|
||||
// Now that we've vectorized and unrolled loops, we may have more refined
|
||||
|
@ -1828,7 +1828,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
|
|||
FunctionPassManager MainFPM;
|
||||
MainFPM.addPass(createFunctionToLoopPassAdaptor(
|
||||
LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap),
|
||||
EnableMSSALoopDependency, /*UseBlockFrequencyInfo=*/true));
|
||||
/*USeMemorySSA=*/true, /*UseBlockFrequencyInfo=*/true));
|
||||
|
||||
if (RunNewGVN)
|
||||
MainFPM.addPass(NewGVNPass());
|
||||
|
|
|
@ -229,9 +229,7 @@ struct LegacyLICMPass : public LoopPass {
|
|||
<< L->getHeader()->getNameOrAsOperand() << "\n");
|
||||
|
||||
auto *SE = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>();
|
||||
MemorySSA *MSSA = EnableMSSALoopDependency
|
||||
? (&getAnalysis<MemorySSAWrapperPass>().getMSSA())
|
||||
: nullptr;
|
||||
MemorySSA *MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
bool hasProfileData = L->getHeader()->getParent()->hasProfileData();
|
||||
BlockFrequencyInfo *BFI =
|
||||
hasProfileData ? &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI()
|
||||
|
@ -258,10 +256,8 @@ struct LegacyLICMPass : public LoopPass {
|
|||
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||
AU.addPreserved<LoopInfoWrapperPass>();
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
if (EnableMSSALoopDependency) {
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
}
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
AU.addRequired<TargetTransformInfoWrapperPass>();
|
||||
getLoopAnalysisUsage(AU);
|
||||
LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU);
|
||||
|
|
|
@ -195,15 +195,10 @@ public:
|
|||
const TargetLibraryInfo &TLI =
|
||||
getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
|
||||
*L->getHeader()->getParent());
|
||||
MemorySSA *MSSA = nullptr;
|
||||
Optional<MemorySSAUpdater> MSSAU;
|
||||
if (EnableMSSALoopDependency) {
|
||||
MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
MSSAU = MemorySSAUpdater(MSSA);
|
||||
}
|
||||
MemorySSA *MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
MemorySSAUpdater MSSAU(MSSA);
|
||||
|
||||
return simplifyLoopInst(*L, DT, LI, AC, TLI,
|
||||
MSSAU.hasValue() ? MSSAU.getPointer() : nullptr);
|
||||
return simplifyLoopInst(*L, DT, LI, AC, TLI, &MSSAU);
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
|
@ -211,10 +206,8 @@ public:
|
|||
AU.addRequired<DominatorTreeWrapperPass>();
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
AU.setPreservesCFG();
|
||||
if (EnableMSSALoopDependency) {
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
}
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
getLoopAnalysisUsage(AU);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -99,8 +99,7 @@ public:
|
|||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<AssumptionCacheTracker>();
|
||||
AU.addRequired<TargetTransformInfoWrapperPass>();
|
||||
if (EnableMSSALoopDependency)
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
getLoopAnalysisUsage(AU);
|
||||
|
||||
// Lazy BFI and BPI are marked as preserved here so LoopRotate
|
||||
|
@ -121,13 +120,11 @@ public:
|
|||
auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
|
||||
const SimplifyQuery SQ = getBestSimplifyQuery(*this, F);
|
||||
Optional<MemorySSAUpdater> MSSAU;
|
||||
if (EnableMSSALoopDependency) {
|
||||
// Not requiring MemorySSA and getting it only if available will split
|
||||
// the loop pass pipeline when LoopRotate is being run first.
|
||||
auto *MSSAA = getAnalysisIfAvailable<MemorySSAWrapperPass>();
|
||||
if (MSSAA)
|
||||
MSSAU = MemorySSAUpdater(&MSSAA->getMSSA());
|
||||
}
|
||||
// Not requiring MemorySSA and getting it only if available will split
|
||||
// the loop pass pipeline when LoopRotate is being run first.
|
||||
auto *MSSAA = getAnalysisIfAvailable<MemorySSAWrapperPass>();
|
||||
if (MSSAA)
|
||||
MSSAU = MemorySSAUpdater(&MSSAA->getMSSA());
|
||||
// Vectorization requires loop-rotation. Use default threshold for loops the
|
||||
// user explicitly marked for vectorization, even when header duplication is
|
||||
// disabled.
|
||||
|
|
|
@ -733,27 +733,20 @@ public:
|
|||
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||
LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
|
||||
ScalarEvolution &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
|
||||
Optional<MemorySSAUpdater> MSSAU;
|
||||
if (EnableMSSALoopDependency) {
|
||||
MemorySSA *MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
MSSAU = MemorySSAUpdater(MSSA);
|
||||
if (VerifyMemorySSA)
|
||||
MSSA->verifyMemorySSA();
|
||||
}
|
||||
MemorySSA *MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
MemorySSAUpdater MSSAU(MSSA);
|
||||
if (VerifyMemorySSA)
|
||||
MSSA->verifyMemorySSA();
|
||||
bool DeleteCurrentLoop = false;
|
||||
bool Changed = simplifyLoopCFG(
|
||||
*L, DT, LI, SE, MSSAU.hasValue() ? MSSAU.getPointer() : nullptr,
|
||||
DeleteCurrentLoop);
|
||||
bool Changed = simplifyLoopCFG(*L, DT, LI, SE, &MSSAU, DeleteCurrentLoop);
|
||||
if (DeleteCurrentLoop)
|
||||
LPM.markLoopAsDeleted(*L);
|
||||
return Changed;
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
if (EnableMSSALoopDependency) {
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
}
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<DependenceAnalysisWrapperPass>();
|
||||
getLoopAnalysisUsage(AU);
|
||||
}
|
||||
|
|
|
@ -232,10 +232,8 @@ namespace {
|
|||
AU.addPreserved<LazyBranchProbabilityInfoPass>();
|
||||
AU.addRequired<AssumptionCacheTracker>();
|
||||
AU.addRequired<TargetTransformInfoWrapperPass>();
|
||||
if (EnableMSSALoopDependency) {
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
}
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
if (HasBranchDivergence)
|
||||
AU.addRequired<LegacyDivergenceAnalysis>();
|
||||
getLoopAnalysisUsage(AU);
|
||||
|
@ -539,11 +537,8 @@ bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPMRef) {
|
|||
LPM = &LPMRef;
|
||||
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||
AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
|
||||
if (EnableMSSALoopDependency) {
|
||||
MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
|
||||
assert(DT && "Cannot update MemorySSA without a valid DomTree.");
|
||||
}
|
||||
MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
|
||||
CurrentLoop = L;
|
||||
Function *F = CurrentLoop->getHeader()->getParent();
|
||||
|
||||
|
@ -551,19 +546,19 @@ bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPMRef) {
|
|||
if (SanitizeMemory)
|
||||
SafetyInfo.computeLoopSafetyInfo(L);
|
||||
|
||||
if (MSSA && VerifyMemorySSA)
|
||||
if (VerifyMemorySSA)
|
||||
MSSA->verifyMemorySSA();
|
||||
|
||||
bool Changed = false;
|
||||
do {
|
||||
assert(CurrentLoop->isLCSSAForm(*DT));
|
||||
if (MSSA && VerifyMemorySSA)
|
||||
if (VerifyMemorySSA)
|
||||
MSSA->verifyMemorySSA();
|
||||
RedoLoop = false;
|
||||
Changed |= processCurrentLoop();
|
||||
} while (RedoLoop);
|
||||
|
||||
if (MSSA && VerifyMemorySSA)
|
||||
if (VerifyMemorySSA)
|
||||
MSSA->verifyMemorySSA();
|
||||
|
||||
return Changed;
|
||||
|
|
|
@ -3126,10 +3126,8 @@ public:
|
|||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<AssumptionCacheTracker>();
|
||||
AU.addRequired<TargetTransformInfoWrapperPass>();
|
||||
if (EnableMSSALoopDependency) {
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
}
|
||||
AU.addRequired<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
getLoopAnalysisUsage(AU);
|
||||
}
|
||||
};
|
||||
|
@ -3150,12 +3148,8 @@ bool SimpleLoopUnswitchLegacyPass::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
|
||||
auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();
|
||||
auto &TTI = getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
|
||||
MemorySSA *MSSA = nullptr;
|
||||
Optional<MemorySSAUpdater> MSSAU;
|
||||
if (EnableMSSALoopDependency) {
|
||||
MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
MSSAU = MemorySSAUpdater(MSSA);
|
||||
}
|
||||
MemorySSA *MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
MemorySSAUpdater MSSAU(MSSA);
|
||||
|
||||
auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>();
|
||||
auto *SE = SEWP ? &SEWP->getSE() : nullptr;
|
||||
|
@ -3179,14 +3173,13 @@ bool SimpleLoopUnswitchLegacyPass::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
LPM.markLoopAsDeleted(*L);
|
||||
};
|
||||
|
||||
if (MSSA && VerifyMemorySSA)
|
||||
if (VerifyMemorySSA)
|
||||
MSSA->verifyMemorySSA();
|
||||
|
||||
bool Changed =
|
||||
unswitchLoop(*L, DT, LI, AC, AA, TTI, true, NonTrivial, UnswitchCB, SE,
|
||||
MSSAU.hasValue() ? MSSAU.getPointer() : nullptr);
|
||||
bool Changed = unswitchLoop(*L, DT, LI, AC, AA, TTI, true, NonTrivial,
|
||||
UnswitchCB, SE, &MSSAU);
|
||||
|
||||
if (MSSA && VerifyMemorySSA)
|
||||
if (VerifyMemorySSA)
|
||||
MSSA->verifyMemorySSA();
|
||||
|
||||
// Historically this pass has had issues with the dominator tree so verify it
|
||||
|
|
|
@ -779,8 +779,7 @@ namespace {
|
|||
AU.addPreserved<DependenceAnalysisWrapperPass>();
|
||||
AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
|
||||
AU.addPreserved<BranchProbabilityInfoWrapperPass>();
|
||||
if (EnableMSSALoopDependency)
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
}
|
||||
|
||||
/// verifyAnalysis() - Verify LoopSimplifyForm's guarantees.
|
||||
|
@ -814,12 +813,10 @@ bool LoopSimplify::runOnFunction(Function &F) {
|
|||
&getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
|
||||
MemorySSA *MSSA = nullptr;
|
||||
std::unique_ptr<MemorySSAUpdater> MSSAU;
|
||||
if (EnableMSSALoopDependency) {
|
||||
auto *MSSAAnalysis = getAnalysisIfAvailable<MemorySSAWrapperPass>();
|
||||
if (MSSAAnalysis) {
|
||||
MSSA = &MSSAAnalysis->getMSSA();
|
||||
MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
|
||||
}
|
||||
auto *MSSAAnalysis = getAnalysisIfAvailable<MemorySSAWrapperPass>();
|
||||
if (MSSAAnalysis) {
|
||||
MSSA = &MSSAAnalysis->getMSSA();
|
||||
MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
|
||||
}
|
||||
|
||||
bool PreserveLCSSA = mustPreserveAnalysisID(LCSSAID);
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
; disambiguating some obvious cases. If LICM is able to disambiguate the
|
||||
; two pointers, then the load should be hoisted, and the store sunk.
|
||||
|
||||
; RUN: opt < %s -basic-aa -licm -enable-mssa-loop-dependency=false -enable-new-pm=0 -S | FileCheck %s -check-prefixes=CHECK,AST
|
||||
; RUN: opt < %s -basic-aa -licm -enable-new-pm=0 -S | FileCheck %s -check-prefixes=CHECK,MSSA
|
||||
; RUN: opt < %s -aa-pipeline=basic-aa -passes='loop(licm)' -S | FileCheck %s -check-prefixes=CHECK,AST
|
||||
; RUN: opt < %s -aa-pipeline=basic-aa -passes='loop-mssa(licm)' -S | FileCheck %s -check-prefixes=CHECK,MSSA
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
; REQUIRES: asserts
|
||||
; RUN: opt -loop-rotate -licm %s -disable-output -debug-only=licm 2>&1 | FileCheck %s -check-prefix=LICM
|
||||
; RUN: opt -loop-rotate -licm %s -disable-output -enable-mssa-loop-dependency=false -debug-only=licm 2>&1 | FileCheck %s -check-prefix=LICM
|
||||
; RUN: opt -loop-rotate -licm %s -S | FileCheck %s
|
||||
; RUN: opt -loop-rotate -licm %s -S -enable-mssa-loop-dependency=false | FileCheck %s
|
||||
|
||||
; LICM: Using
|
||||
; LICM-NOT: LICM sinking instruction: %.pre = load i8, i8* %arrayidx.phi.trans.insert
|
||||
|
|
|
@ -1,45 +1,26 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -enable-mssa-loop-dependency=false -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown < %s | \
|
||||
; RUN: FileCheck %s
|
||||
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown < %s | \
|
||||
; RUN: FileCheck %s --check-prefix=MSSA
|
||||
; Function Attrs: nounwind
|
||||
define void @ec_GFp_nistp256_points_mul() {
|
||||
; CHECK-LABEL: ec_GFp_nistp256_points_mul:
|
||||
; CHECK: # %bb.0: # %entry
|
||||
; CHECK-NEXT: ld 5, 0(3)
|
||||
; CHECK-NEXT: li 3, 127
|
||||
; CHECK-NEXT: li 4, 0
|
||||
; CHECK-NEXT: .p2align 5
|
||||
; CHECK-NEXT: .LBB0_1: # %fe_cmovznz.exit.i534.i.15
|
||||
; CHECK-NEXT: #
|
||||
; CHECK-NEXT: subfic 6, 5, 0
|
||||
; CHECK-NEXT: subfze 6, 4
|
||||
; CHECK-NEXT: sradi 7, 6, 63
|
||||
; CHECK-NEXT: srad 6, 6, 3
|
||||
; CHECK-NEXT: subc 5, 7, 5
|
||||
; CHECK-NEXT: subfe 5, 4, 6
|
||||
; CHECK-NEXT: sradi 5, 5, 63
|
||||
; CHECK-NEXT: b .LBB0_1
|
||||
;
|
||||
; MSSA-LABEL: ec_GFp_nistp256_points_mul:
|
||||
; MSSA: # %bb.0: # %entry
|
||||
; MSSA-NEXT: ld 3, 0(3)
|
||||
; MSSA-NEXT: li 4, 0
|
||||
; MSSA-NEXT: subfic 5, 3, 0
|
||||
; MSSA-NEXT: subfze 5, 4
|
||||
; MSSA-NEXT: sradi 5, 5, 63
|
||||
; MSSA-NEXT: subc 3, 5, 3
|
||||
; MSSA-NEXT: subfe 3, 4, 5
|
||||
; MSSA-NEXT: sradi 3, 3, 63
|
||||
; MSSA-NEXT: std 3, 0(3)
|
||||
; MSSA-NEXT: .p2align 4
|
||||
; MSSA-NEXT: .LBB0_1: # %fe_cmovznz.exit.i534.i.15
|
||||
; MSSA-NEXT: #
|
||||
; MSSA-NEXT: b .LBB0_1
|
||||
; RUN: FileCheck %s
|
||||
|
||||
; With MemorySSA, everything is taken out of the loop by licm.
|
||||
; Loads and stores to undef are treated as non-aliasing.
|
||||
define void @ec_GFp_nistp256_points_mul() {
|
||||
; CHECK-LABEL: ec_GFp_nistp256_points_mul:
|
||||
; CHECK: # %bb.0: # %entry
|
||||
; CHECK-NEXT: ld 3, 0(3)
|
||||
; CHECK-NEXT: li 4, 0
|
||||
; CHECK-NEXT: subfic 5, 3, 0
|
||||
; CHECK-NEXT: subfze 5, 4
|
||||
; CHECK-NEXT: sradi 5, 5, 63
|
||||
; CHECK-NEXT: subc 3, 5, 3
|
||||
; CHECK-NEXT: subfe 3, 4, 5
|
||||
; CHECK-NEXT: sradi 3, 3, 63
|
||||
; CHECK-NEXT: std 3, 0(3)
|
||||
; CHECK-NEXT: .p2align 4
|
||||
; CHECK-NEXT: .LBB0_1: # %fe_cmovznz.exit.i534.i.15
|
||||
; CHECK-NEXT: #
|
||||
; CHECK-NEXT: b .LBB0_1
|
||||
|
||||
entry:
|
||||
br label %fe_cmovznz.exit.i534.i.15
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
; RUN: opt -S -basic-aa -licm -licm-n2-threshold=0 -enable-mssa-loop-dependency=false %s -enable-new-pm=0 | FileCheck %s
|
||||
; RUN: opt -S -basic-aa -licm -licm-n2-threshold=0 -verify-memoryssa %s -enable-new-pm=0 | FileCheck %s --check-prefix=ALIAS-N2
|
||||
; RUN: opt -licm -basic-aa -licm-n2-threshold=200 < %s -S -enable-new-pm=0 | FileCheck %s --check-prefix=ALIAS-N2
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
; RUN: opt < %s -S -basic-aa -licm -enable-mssa-loop-dependency=false -enable-new-pm=0 | FileCheck -check-prefixes=CHECK,AST %s
|
||||
; RUN: opt < %s -S -basic-aa -licm -enable-new-pm=0 | FileCheck -check-prefixes=CHECK,MSSA %s
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='require<opt-remark-emit>,loop(licm)' < %s -S | FileCheck -check-prefixes=CHECK,AST %s
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck -check-prefixes=CHECK,MSSA %s
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; REQUIRES: asserts
|
||||
; RUN: opt -licm -basic-aa -enable-mssa-loop-dependency=false -ipt-expensive-asserts=true < %s -S | FileCheck %s
|
||||
; RUN: opt -licm -basic-aa -ipt-expensive-asserts=true < %s -S | FileCheck %s --check-prefixes=CHECK,MSSA
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop(licm)' -ipt-expensive-asserts=true < %s -S | FileCheck %s
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' -ipt-expensive-asserts=true < %s -S | FileCheck %s --check-prefixes=CHECK,MSSA
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt -enable-mssa-loop-dependency=false -disable-basic-aa -alias-set-saturation-threshold=2 -licm -S < %s | FileCheck %s
|
||||
; RUN: opt -disable-basic-aa -alias-set-saturation-threshold=2 -passes='loop(licm)' -S < %s | FileCheck %s
|
||||
; REQUIRES: asserts
|
||||
|
||||
; CHECK-LABEL: @f1()
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
; RUN: opt -tbaa -basic-aa -licm -enable-mssa-loop-dependency=false -enable-new-pm=0 -S < %s | FileCheck %s --check-prefixes=CHECK,AST
|
||||
; RUN: opt -tbaa -basic-aa -licm -enable-new-pm=0 -S < %s | FileCheck %s --check-prefixes=CHECK,MSSA
|
||||
; RUN: opt -aa-pipeline=tbaa,basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop(licm)' -S %s | FileCheck %s --check-prefixes=CHECK,AST
|
||||
; RUN: opt -aa-pipeline=tbaa,basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' -S %s | FileCheck %s --check-prefixes=CHECK,MSSA
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
; RUN: opt -S -basic-aa -licm -licm-n2-threshold=0 -enable-mssa-loop-dependency=false %s -enable-new-pm=0 | FileCheck %s
|
||||
; RUN: opt -S -basic-aa -licm -licm-n2-threshold=0 %s -enable-new-pm=0 | FileCheck %s --check-prefix=ALIAS-N2
|
||||
; RUN: opt -licm -basic-aa -licm-n2-threshold=200 < %s -S -enable-new-pm=0 | FileCheck %s --check-prefix=ALIAS-N2
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
; RUN: opt -S -basic-aa -licm -enable-mssa-loop-dependency=false %s -enable-new-pm=0 | FileCheck -check-prefixes=CHECK,AST %s
|
||||
; RUN: opt -S -basic-aa -licm %s -enable-new-pm=0 | FileCheck -check-prefixes=CHECK,MSSA %s
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop(licm)' < %s -S | FileCheck -check-prefixes=CHECK,AST %s
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<targetir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck -check-prefixes=CHECK,MSSA %s
|
||||
|
|
|
@ -415,8 +415,7 @@ TEST_F(LoopPassManagerTest, FunctionPassInvalidationOfLoopAnalyses) {
|
|||
RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
|
||||
// For 'f', preserve most things but not the specific loop analyses.
|
||||
auto PA = getLoopPassPreservedAnalyses();
|
||||
if (EnableMSSALoopDependency)
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
EXPECT_CALL(MFPHandle, run(HasName("f"), _))
|
||||
.InSequence(FSequence)
|
||||
.WillOnce(Return(PA));
|
||||
|
@ -494,8 +493,7 @@ TEST_F(LoopPassManagerTest, ModulePassInvalidationOfLoopAnalyses) {
|
|||
EXPECT_CALL(MMPHandle, run(_, _)).WillOnce(InvokeWithoutArgs([] {
|
||||
auto PA = getLoopPassPreservedAnalyses();
|
||||
PA.preserve<FunctionAnalysisManagerModuleProxy>();
|
||||
if (EnableMSSALoopDependency)
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
return PA;
|
||||
}));
|
||||
// All the loop analyses from both functions get invalidated before we
|
||||
|
@ -822,8 +820,7 @@ TEST_F(LoopPassManagerTest, IndirectOuterPassInvalidation) {
|
|||
// the fact that they were preserved.
|
||||
EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
|
||||
auto PA = getLoopPassPreservedAnalyses();
|
||||
if (EnableMSSALoopDependency)
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
PA.preserveSet<AllAnalysesOn<Loop>>();
|
||||
return PA;
|
||||
}));
|
||||
|
@ -845,8 +842,7 @@ TEST_F(LoopPassManagerTest, IndirectOuterPassInvalidation) {
|
|||
// Which means that no extra invalidation occurs and cached values are used.
|
||||
EXPECT_CALL(MFPHandle, run(HasName("g"), _)).WillOnce(InvokeWithoutArgs([] {
|
||||
auto PA = getLoopPassPreservedAnalyses();
|
||||
if (EnableMSSALoopDependency)
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
PA.preserveSet<AllAnalysesOn<Loop>>();
|
||||
return PA;
|
||||
}));
|
||||
|
|
Loading…
Reference in New Issue