summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Transforms/Utils/Local.h6
-rw-r--r--llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp18
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyCFG.cpp2
-rw-r--r--llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll2
4 files changed, 18 insertions, 10 deletions
diff --git a/llvm/include/llvm/Transforms/Utils/Local.h b/llvm/include/llvm/Transforms/Utils/Local.h
index af00a6c2cce..f66a05eb8c0 100644
--- a/llvm/include/llvm/Transforms/Utils/Local.h
+++ b/llvm/include/llvm/Transforms/Utils/Local.h
@@ -60,14 +60,16 @@ class TargetTransformInfo;
/// replaced by lookup tables and selects.
struct SimplifyCFGOptions {
int BonusInstThreshold;
+ bool ForwardSwitchCondToPhi;
bool ConvertSwitchToLookupTable;
bool NeedCanonicalLoop;
AssumptionCache *AC;
- SimplifyCFGOptions(int BonusThreshold = 1, bool SwitchToLookup = false,
- bool CanonicalLoops = true,
+ SimplifyCFGOptions(int BonusThreshold = 1, bool ForwardSwitchCond = false,
+ bool SwitchToLookup = false, bool CanonicalLoops = true,
AssumptionCache *AssumpCache = nullptr)
: BonusInstThreshold(BonusThreshold),
+ ForwardSwitchCondToPhi(ForwardSwitchCond),
ConvertSwitchToLookupTable(SwitchToLookup),
NeedCanonicalLoop(CanonicalLoops), AC(AssumpCache) {}
};
diff --git a/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp b/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
index 723619f46bb..6f38e5d11b5 100644
--- a/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
+++ b/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
@@ -179,8 +179,10 @@ static bool simplifyFunctionCFG(Function &F, const TargetTransformInfo &TTI,
return true;
}
+// FIXME: The new pass manager always creates a "late" simplifycfg pass using
+// this default constructor.
SimplifyCFGPass::SimplifyCFGPass()
- : Options(UserBonusInstThreshold, true, false) {}
+ : Options(UserBonusInstThreshold, true, true, false) {}
SimplifyCFGPass::SimplifyCFGPass(const SimplifyCFGOptions &PassOptions)
: Options(PassOptions) {}
@@ -200,12 +202,15 @@ namespace {
struct BaseCFGSimplifyPass : public FunctionPass {
std::function<bool(const Function &)> PredicateFtor;
int BonusInstThreshold;
+ bool ForwardSwitchCondToPhi;
bool ConvertSwitchToLookupTable;
bool KeepCanonicalLoops;
- BaseCFGSimplifyPass(int T, bool ConvertSwitch, bool KeepLoops,
+ BaseCFGSimplifyPass(int T, bool ForwardSwitchCond, bool ConvertSwitch,
+ bool KeepLoops,
std::function<bool(const Function &)> Ftor, char &ID)
: FunctionPass(ID), PredicateFtor(std::move(Ftor)),
+ ForwardSwitchCondToPhi(ForwardSwitchCond),
ConvertSwitchToLookupTable(ConvertSwitch),
KeepCanonicalLoops(KeepLoops) {
BonusInstThreshold = (T == -1) ? UserBonusInstThreshold : T;
@@ -219,8 +224,9 @@ struct BaseCFGSimplifyPass : public FunctionPass {
const TargetTransformInfo &TTI =
getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
return simplifyFunctionCFG(F, TTI,
- {BonusInstThreshold, ConvertSwitchToLookupTable,
- KeepCanonicalLoops, AC});
+ {BonusInstThreshold, ForwardSwitchCondToPhi,
+ ConvertSwitchToLookupTable, KeepCanonicalLoops,
+ AC});
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
@@ -235,7 +241,7 @@ struct CFGSimplifyPass : public BaseCFGSimplifyPass {
CFGSimplifyPass(int T = -1,
std::function<bool(const Function &)> Ftor = nullptr)
- : BaseCFGSimplifyPass(T, false, true, Ftor, ID) {
+ : BaseCFGSimplifyPass(T, false, false, true, Ftor, ID) {
initializeCFGSimplifyPassPass(*PassRegistry::getPassRegistry());
}
};
@@ -245,7 +251,7 @@ struct LateCFGSimplifyPass : public BaseCFGSimplifyPass {
LateCFGSimplifyPass(int T = -1,
std::function<bool(const Function &)> Ftor = nullptr)
- : BaseCFGSimplifyPass(T, true, false, Ftor, ID) {
+ : BaseCFGSimplifyPass(T, true, true, false, Ftor, ID) {
initializeLateCFGSimplifyPassPass(*PassRegistry::getPassRegistry());
}
};
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 42f2bf267f5..954d6339dc0 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -5563,7 +5563,7 @@ bool SimplifyCFGOpt::SimplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) {
if (switchToSelect(SI, Builder, DL, TTI))
return simplifyCFG(BB, TTI, Options) | true;
- if (ForwardSwitchConditionToPHI(SI))
+ if (Options.ForwardSwitchCondToPhi && ForwardSwitchConditionToPHI(SI))
return simplifyCFG(BB, TTI, Options) | true;
// The conversion from switch to lookup tables results in difficult-to-analyze
diff --git a/llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll b/llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll
index d51d24ad3cd..4dcccef03d8 100644
--- a/llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll
+++ b/llvm/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -simplifycfg -S | FileCheck %s
+; RUN: opt < %s -latesimplifycfg -S | FileCheck %s
; PR10131
OpenPOWER on IntegriCloud