1 //===- LoopInstSimplify.cpp - Loop Instruction Simplification Pass --------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This pass performs lightweight instruction simplification on loop bodies.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "loop-instsimplify"
15 #include "llvm/Instructions.h"
16 #include "llvm/Analysis/Dominators.h"
17 #include "llvm/Analysis/InstructionSimplify.h"
18 #include "llvm/Analysis/LoopInfo.h"
19 #include "llvm/Analysis/LoopPass.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Target/TargetData.h"
22 #include "llvm/Transforms/Scalar.h"
23 #include "llvm/Transforms/Utils/Local.h"
24 #include "llvm/ADT/Statistic.h"
27 STATISTIC(NumSimplified
, "Number of redundant instructions simplified");
30 class LoopInstSimplify
: public LoopPass
{
32 static char ID
; // Pass ID, replacement for typeid
33 LoopInstSimplify() : LoopPass(ID
) {
34 initializeLoopInstSimplifyPass(*PassRegistry::getPassRegistry());
37 bool runOnLoop(Loop
*, LPPassManager
&);
39 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
41 AU
.addRequired
<LoopInfo
>();
42 AU
.addRequiredID(LoopSimplifyID
);
43 AU
.addPreservedID(LoopSimplifyID
);
44 AU
.addPreservedID(LCSSAID
);
45 AU
.addPreserved("scalar-evolution");
50 char LoopInstSimplify::ID
= 0;
51 INITIALIZE_PASS_BEGIN(LoopInstSimplify
, "loop-instsimplify",
52 "Simplify instructions in loops", false, false)
53 INITIALIZE_PASS_DEPENDENCY(DominatorTree
)
54 INITIALIZE_PASS_DEPENDENCY(LoopInfo
)
55 INITIALIZE_PASS_DEPENDENCY(LCSSA
)
56 INITIALIZE_PASS_END(LoopInstSimplify
, "loop-instsimplify",
57 "Simplify instructions in loops", false, false)
59 Pass
*llvm::createLoopInstSimplifyPass() {
60 return new LoopInstSimplify();
63 bool LoopInstSimplify::runOnLoop(Loop
*L
, LPPassManager
&LPM
) {
64 DominatorTree
*DT
= getAnalysisIfAvailable
<DominatorTree
>();
65 LoopInfo
*LI
= &getAnalysis
<LoopInfo
>();
66 const TargetData
*TD
= getAnalysisIfAvailable
<TargetData
>();
68 SmallVector
<BasicBlock
*, 8> ExitBlocks
;
69 L
->getUniqueExitBlocks(ExitBlocks
);
70 array_pod_sort(ExitBlocks
.begin(), ExitBlocks
.end());
72 SmallPtrSet
<const Instruction
*, 8> S1
, S2
, *ToSimplify
= &S1
, *Next
= &S2
;
74 // The bit we are stealing from the pointer represents whether this basic
75 // block is the header of a subloop, in which case we only process its phis.
76 typedef PointerIntPair
<BasicBlock
*, 1> WorklistItem
;
77 SmallVector
<WorklistItem
, 16> VisitStack
;
78 SmallPtrSet
<BasicBlock
*, 32> Visited
;
88 VisitStack
.push_back(WorklistItem(L
->getHeader(), false));
90 while (!VisitStack
.empty()) {
91 WorklistItem Item
= VisitStack
.pop_back_val();
92 BasicBlock
*BB
= Item
.getPointer();
93 bool IsSubloopHeader
= Item
.getInt();
95 // Simplify instructions in the current basic block.
96 for (BasicBlock::iterator BI
= BB
->begin(), BE
= BB
->end(); BI
!= BE
;) {
97 Instruction
*I
= BI
++;
99 // The first time through the loop ToSimplify is empty and we try to
100 // simplify all instructions. On later iterations ToSimplify is not
101 // empty and we only bother simplifying instructions that are in it.
102 if (!ToSimplify
->empty() && !ToSimplify
->count(I
))
105 // Don't bother simplifying unused instructions.
106 if (!I
->use_empty()) {
107 Value
*V
= SimplifyInstruction(I
, TD
, DT
);
108 if (V
&& LI
->replacementPreservesLCSSAForm(I
, V
)) {
109 // Mark all uses for resimplification next time round the loop.
110 for (Value::use_iterator UI
= I
->use_begin(), UE
= I
->use_end();
112 Next
->insert(cast
<Instruction
>(*UI
));
114 I
->replaceAllUsesWith(V
);
119 LocalChanged
|= RecursivelyDeleteTriviallyDeadInstructions(I
);
121 if (IsSubloopHeader
&& !isa
<PHINode
>(I
))
125 // Add all successors to the worklist, except for loop exit blocks and the
126 // bodies of subloops. We visit the headers of loops so that we can process
127 // their phis, but we contract the rest of the subloop body and only follow
128 // edges leading back to the original loop.
129 for (succ_iterator SI
= succ_begin(BB
), SE
= succ_end(BB
); SI
!= SE
;
131 BasicBlock
*SuccBB
= *SI
;
132 if (!Visited
.insert(SuccBB
))
135 const Loop
*SuccLoop
= LI
->getLoopFor(SuccBB
);
136 if (SuccLoop
&& SuccLoop
->getHeader() == SuccBB
137 && L
->contains(SuccLoop
)) {
138 VisitStack
.push_back(WorklistItem(SuccBB
, true));
140 SmallVector
<BasicBlock
*, 8> SubLoopExitBlocks
;
141 SuccLoop
->getExitBlocks(SubLoopExitBlocks
);
143 for (unsigned i
= 0; i
< SubLoopExitBlocks
.size(); ++i
) {
144 BasicBlock
*ExitBB
= SubLoopExitBlocks
[i
];
145 if (LI
->getLoopFor(ExitBB
) == L
&& Visited
.insert(ExitBB
))
146 VisitStack
.push_back(WorklistItem(ExitBB
, false));
152 bool IsExitBlock
= std::binary_search(ExitBlocks
.begin(),
153 ExitBlocks
.end(), SuccBB
);
157 VisitStack
.push_back(WorklistItem(SuccBB
, false));
161 // Place the list of instructions to simplify on the next loop iteration
163 std::swap(ToSimplify
, Next
);
166 Changed
|= LocalChanged
;
167 } while (LocalChanged
);