[llvm] 6b53ada - [DFAJumpThreading] Early exit if switch is not in a loop (#85360)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 15 08:00:19 PDT 2024
Author: XChy
Date: 2024-03-15T23:00:13+08:00
New Revision: 6b53ada69a8cb2d91e7ad91d810137bc2860f450
URL: https://github.com/llvm/llvm-project/commit/6b53ada69a8cb2d91e7ad91d810137bc2860f450
DIFF: https://github.com/llvm/llvm-project/commit/6b53ada69a8cb2d91e7ad91d810137bc2860f450.diff
LOG: [DFAJumpThreading] Early exit if switch is not in a loop (#85360)
This patch prevents taking non-loop switch as candidate.
Added:
Modified:
llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp b/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp
index 85d4065286e41f..e66a1a2ccb318c 100644
--- a/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp
@@ -65,6 +65,7 @@
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/CodeMetrics.h"
#include "llvm/Analysis/DomTreeUpdater.h"
+#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/IR/CFG.h"
@@ -131,9 +132,9 @@ void unfold(DomTreeUpdater *DTU, SelectInstToUnfold SIToUnfold,
class DFAJumpThreading {
public:
- DFAJumpThreading(AssumptionCache *AC, DominatorTree *DT,
+ DFAJumpThreading(AssumptionCache *AC, DominatorTree *DT, LoopInfo *LI,
TargetTransformInfo *TTI, OptimizationRemarkEmitter *ORE)
- : AC(AC), DT(DT), TTI(TTI), ORE(ORE) {}
+ : AC(AC), DT(DT), LI(LI), TTI(TTI), ORE(ORE) {}
bool run(Function &F);
@@ -161,6 +162,7 @@ class DFAJumpThreading {
AssumptionCache *AC;
DominatorTree *DT;
+ LoopInfo *LI;
TargetTransformInfo *TTI;
OptimizationRemarkEmitter *ORE;
};
@@ -378,7 +380,8 @@ inline raw_ostream &operator<<(raw_ostream &OS, const ThreadingPath &TPath) {
#endif
struct MainSwitch {
- MainSwitch(SwitchInst *SI, OptimizationRemarkEmitter *ORE) {
+ MainSwitch(SwitchInst *SI, LoopInfo *LI, OptimizationRemarkEmitter *ORE)
+ : LI(LI) {
if (isCandidate(SI)) {
Instr = SI;
} else {
@@ -411,6 +414,10 @@ struct MainSwitch {
if (!isa<PHINode>(SICond))
return false;
+ // The switch must be in a loop.
+ if (!LI->getLoopFor(SI->getParent()))
+ return false;
+
addToQueue(SICond, Q, SeenValues);
while (!Q.empty()) {
@@ -488,6 +495,7 @@ struct MainSwitch {
return true;
}
+ LoopInfo *LI;
SwitchInst *Instr = nullptr;
SmallVector<SelectInstToUnfold, 4> SelectInsts;
};
@@ -1262,7 +1270,7 @@ bool DFAJumpThreading::run(Function &F) {
LLVM_DEBUG(dbgs() << "\nCheck if SwitchInst in BB " << BB.getName()
<< " is a candidate\n");
- MainSwitch Switch(SI, ORE);
+ MainSwitch Switch(SI, LI, ORE);
if (!Switch.getInstr())
continue;
@@ -1315,10 +1323,11 @@ PreservedAnalyses DFAJumpThreadingPass::run(Function &F,
FunctionAnalysisManager &AM) {
AssumptionCache &AC = AM.getResult<AssumptionAnalysis>(F);
DominatorTree &DT = AM.getResult<DominatorTreeAnalysis>(F);
+ LoopInfo &LI = AM.getResult<LoopAnalysis>(F);
TargetTransformInfo &TTI = AM.getResult<TargetIRAnalysis>(F);
OptimizationRemarkEmitter ORE(&F);
- if (!DFAJumpThreading(&AC, &DT, &TTI, &ORE).run(F))
+ if (!DFAJumpThreading(&AC, &DT, &LI, &TTI, &ORE).run(F))
return PreservedAnalyses::all();
PreservedAnalyses PA;
More information about the llvm-commits
mailing list