1 //===- SimplifyCFG.cpp ----------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 // This file implements the control flow graph (CFG) simplifications
11 // presented as part of the 'Getting Started With LLVM: Basics' tutorial at the
12 // US LLVM Developers Meeting 2019. It also contains additional material.
14 // The current file contains three different CFG simplifications. There are
15 // multiple versions of each implementation (e.g. _v1 and _v2), which implement
16 // additional functionality (e.g. preserving analysis like the DominatorTree) or
17 // use additional utilities to simplify the code (e.g. LLVM's PatternMatch.h).
18 // The available simplifications are:
19 // 1. Trivially Dead block Removal (removeDeadBlocks_v[1,2]).
20 // This simplifications removes all blocks without predecessors in the CFG
22 // 2. Conditional Branch Elimination (eliminateCondBranches_v[1,2,3])
23 // This simplification replaces conditional branches with constant integer
24 // conditions with unconditional branches.
25 // 3. Single Predecessor Block Merging (mergeIntoSinglePredecessor_v[1,2])
26 // This simplification merges blocks with a single predecessor into the
27 // predecessor, if that block has a single successor.
30 // * Hook up pass to the new pass manager.
31 // * Preserve LoopInfo.
32 // * Add fixed point iteration to delete all dead blocks
33 // * Add implementation using reachability to discover dead blocks.
34 //===----------------------------------------------------------------------===//
36 #include "SimplifyCFG.h"
37 #include "InitializePasses.h"
38 #include "llvm/Analysis/DomTreeUpdater.h"
39 #include "llvm/IR/Dominators.h"
40 #include "llvm/IR/Function.h"
41 #include "llvm/IR/PassManager.h"
42 #include "llvm/IR/PatternMatch.h"
43 #include "llvm/InitializePasses.h"
44 #include "llvm/Support/CommandLine.h"
47 using namespace PatternMatch
;
49 enum TutorialVersion
{ V1
, V2
, V3
};
50 static cl::opt
<TutorialVersion
>
51 Version("tut-simplifycfg-version", cl::desc("Select tutorial version"),
52 cl::Hidden
, cl::ValueOptional
, cl::init(V1
),
53 cl::values(clEnumValN(V1
, "v1", "version 1"),
54 clEnumValN(V2
, "v2", "version 2"),
55 clEnumValN(V3
, "v3", "version 3"),
56 // Sentinel value for unspecified option.
57 clEnumValN(V3
, "", "")));
59 #define DEBUG_TYPE "tut-simplifycfg"
61 // Remove trivially dead blocks. First version, not preserving the
63 static bool removeDeadBlocks_v1(Function
&F
) {
66 // Remove trivially dead blocks.
67 for (BasicBlock
&BB
: make_early_inc_range(F
)) {
68 // Skip blocks we know to not be trivially dead. We know a block is
69 // guaranteed to be dead, iff it is neither the entry block nor
70 // has any predecessors.
71 if (&F
.getEntryBlock() == &BB
|| !pred_empty(&BB
))
74 // Notify successors of BB that BB is going to be removed. This removes
75 // incoming values from BB from PHIs in the successors. Note that this will
76 // not actually remove BB from the predecessor lists of its successors.
77 for (BasicBlock
*Succ
: successors(&BB
))
78 Succ
->removePredecessor(&BB
);
79 // TODO: Find a better place to put such small variations.
80 // Alternatively, we can update the PHI nodes manually:
81 // for (PHINode &PN : make_early_inc_range(Succ->phis()))
82 // PN.removeIncomingValue(&BB);
84 // Replace all instructions in BB with an undef constant. The block is
85 // unreachable, so the results of the instructions should never get used.
87 Instruction
&I
= BB
.back();
88 I
.replaceAllUsesWith(UndefValue::get(I
.getType()));
92 // Finally remove the basic block.
100 // Remove trivially dead blocks. This is the second version and preserves the
102 static bool removeDeadBlocks_v2(Function
&F
, DominatorTree
&DT
) {
103 bool Changed
= false;
104 DomTreeUpdater
DTU(DT
, DomTreeUpdater::UpdateStrategy::Lazy
);
105 SmallVector
<DominatorTree::UpdateType
, 8> DTUpdates
;
107 // Remove trivially dead blocks.
108 for (BasicBlock
&BB
: make_early_inc_range(F
)) {
109 // Skip blocks we know to not be trivially dead. We know a block is
110 // guaranteed to be dead, iff it is neither the entry block nor
111 // has any predecessors.
112 if (&F
.getEntryBlock() == &BB
|| !pred_empty(&BB
))
115 // Notify successors of BB that BB is going to be removed. This removes
116 // incoming values from BB from PHIs in the successors. Note that this will
117 // not actually remove BB from the predecessor lists of its successors.
118 for (BasicBlock
*Succ
: successors(&BB
)) {
119 Succ
->removePredecessor(&BB
);
121 // Collect updates that need to be applied to the dominator tree.
122 DTUpdates
.push_back({DominatorTree::Delete
, &BB
, Succ
});
125 // Remove BB via the DomTreeUpdater. DomTreeUpdater::deleteBB conveniently
126 // removes the instructions in BB as well.
131 // Apply updates permissively, to remove duplicates.
132 DTU
.applyUpdatesPermissive(DTUpdates
);
137 // Eliminate branches with constant conditionals. This is the first version,
138 // which *does not* preserve the dominator tree.
139 static bool eliminateCondBranches_v1(Function
&F
) {
140 bool Changed
= false;
142 // Eliminate branches with constant conditionals.
143 for (BasicBlock
&BB
: F
) {
144 // Skip blocks without conditional branches as terminators.
145 BranchInst
*BI
= dyn_cast
<BranchInst
>(BB
.getTerminator());
146 if (!BI
|| !BI
->isConditional())
149 // Skip blocks with conditional branches without ConstantInt conditions.
150 ConstantInt
*CI
= dyn_cast
<ConstantInt
>(BI
->getCondition());
154 // We use the branch condition (CI), to select the successor we remove:
155 // if CI == 1 (true), we remove the second successor, otherwise the first.
156 BasicBlock
*RemovedSucc
= BI
->getSuccessor(CI
->isOne());
157 // Tell RemovedSucc we will remove BB from its predecessors.
158 RemovedSucc
->removePredecessor(&BB
);
160 // Replace the conditional branch with an unconditional one, by creating
161 // a new unconditional branch to the selected successor and removing the
163 BranchInst::Create(BI
->getSuccessor(CI
->isZero()), BI
);
164 BI
->eraseFromParent();
171 // Eliminate branches with constant conditionals. This is the second
172 // version, which *does* preserve the dominator tree.
173 static bool eliminateCondBranches_v2(Function
&F
, DominatorTree
&DT
) {
174 bool Changed
= false;
176 DomTreeUpdater
DTU(DT
, DomTreeUpdater::UpdateStrategy::Lazy
);
177 SmallVector
<DominatorTree::UpdateType
, 8> DTUpdates
;
178 // Eliminate branches with constant conditionals.
179 for (BasicBlock
&BB
: F
) {
180 // Skip blocks without conditional branches as terminators.
181 BranchInst
*BI
= dyn_cast
<BranchInst
>(BB
.getTerminator());
182 if (!BI
|| !BI
->isConditional())
185 // Skip blocks with conditional branches without ConstantInt conditions.
186 ConstantInt
*CI
= dyn_cast
<ConstantInt
>(BI
->getCondition());
190 // We use the branch condition (CI), to select the successor we remove:
191 // if CI == 1 (true), we remove the second successor, otherwise the first.
192 BasicBlock
*RemovedSucc
= BI
->getSuccessor(CI
->isOne());
193 // Tell RemovedSucc we will remove BB from its predecessors.
194 RemovedSucc
->removePredecessor(&BB
);
196 // Replace the conditional branch with an unconditional one, by creating
197 // a new unconditional branch to the selected successor and removing the
199 BranchInst
*NewBranch
=
200 BranchInst::Create(BI
->getSuccessor(CI
->isZero()), BI
);
201 BI
->eraseFromParent();
203 // Delete the edge between BB and RemovedSucc in the DominatorTree, iff
204 // the conditional branch did not use RemovedSucc as both the true and false
206 if (NewBranch
->getSuccessor(0) != RemovedSucc
)
207 DTUpdates
.push_back({DominatorTree::Delete
, &BB
, RemovedSucc
});
211 // Apply updates permissively, to remove duplicates.
212 DTU
.applyUpdatesPermissive(DTUpdates
);
217 // Eliminate branches with constant conditionals. This is the third
218 // version, which uses PatternMatch.h.
219 static bool eliminateCondBranches_v3(Function
&F
, DominatorTree
&DT
) {
220 bool Changed
= false;
221 DomTreeUpdater
DTU(DT
, DomTreeUpdater::UpdateStrategy::Lazy
);
222 SmallVector
<DominatorTree::UpdateType
, 8> DTUpdates
;
224 // Eliminate branches with constant conditionals.
225 for (BasicBlock
&BB
: F
) {
226 ConstantInt
*CI
= nullptr;
227 BasicBlock
*TakenSucc
, *RemovedSucc
;
228 // Check if the terminator is a conditional branch, with constant integer
229 // condition and also capture the successor blocks as TakenSucc and
231 if (!match(BB
.getTerminator(),
232 m_Br(m_ConstantInt(CI
), m_BasicBlock(TakenSucc
),
233 m_BasicBlock(RemovedSucc
))))
236 // If the condition is false, swap TakenSucc and RemovedSucc.
238 std::swap(TakenSucc
, RemovedSucc
);
240 // Tell RemovedSucc we will remove BB from its predecessors.
241 RemovedSucc
->removePredecessor(&BB
);
243 // Replace the conditional branch with an unconditional one, by creating
244 // a new unconditional branch to the selected successor and removing the
247 BranchInst
*NewBranch
= BranchInst::Create(TakenSucc
, BB
.getTerminator());
248 BB
.getTerminator()->eraseFromParent();
250 // Delete the edge between BB and RemovedSucc in the DominatorTree, iff
251 // the conditional branch did not use RemovedSucc as both the true and false
253 if (NewBranch
->getSuccessor(0) != RemovedSucc
)
254 DTUpdates
.push_back({DominatorTree::Delete
, &BB
, RemovedSucc
});
258 // Apply updates permissively, to remove duplicates.
259 DTU
.applyUpdatesPermissive(DTUpdates
);
263 // Merge basic blocks into their single predecessor, if their predecessor has a
264 // single successor. This is the first version and does not preserve the
266 static bool mergeIntoSinglePredecessor_v1(Function
&F
) {
267 bool Changed
= false;
269 // Merge blocks with single predecessors.
270 for (BasicBlock
&BB
: make_early_inc_range(F
)) {
271 BasicBlock
*Pred
= BB
.getSinglePredecessor();
272 // Make sure BB has a single predecessor Pred and BB is the single
273 // successor of Pred.
274 if (!Pred
|| Pred
->getSingleSuccessor() != &BB
)
277 // Do not try to merge self loops. That can happen in dead blocks.
281 // Need to replace it before nuking the branch.
282 BB
.replaceAllUsesWith(Pred
);
283 // PHI nodes in BB can only have a single incoming value. Remove them.
284 for (PHINode
&PN
: make_early_inc_range(BB
.phis())) {
285 PN
.replaceAllUsesWith(PN
.getIncomingValue(0));
286 PN
.eraseFromParent();
288 // Move all instructions from BB to Pred.
289 for (Instruction
&I
: make_early_inc_range(BB
))
290 I
.moveBefore(Pred
->getTerminator());
292 // Remove the Pred's terminator (which jumped to BB). BB's terminator
293 // will become Pred's terminator.
294 Pred
->getTerminator()->eraseFromParent();
295 BB
.eraseFromParent();
303 // Merge basic blocks into their single predecessor, if their predecessor has a
304 // single successor. This is the second version and does preserve the
306 static bool mergeIntoSinglePredecessor_v2(Function
&F
, DominatorTree
&DT
) {
307 bool Changed
= false;
308 DomTreeUpdater
DTU(DT
, DomTreeUpdater::UpdateStrategy::Lazy
);
309 SmallVector
<DominatorTree::UpdateType
, 8> DTUpdates
;
311 // Merge blocks with single predecessors.
312 for (BasicBlock
&BB
: make_early_inc_range(F
)) {
313 BasicBlock
*Pred
= BB
.getSinglePredecessor();
314 // Make sure BB has a single predecessor Pred and BB is the single
315 // successor of Pred.
316 if (!Pred
|| Pred
->getSingleSuccessor() != &BB
)
319 // Do not try to merge self loops. That can happen in dead blocks.
323 // Tell DTU about the changes to the CFG: All edges from BB to its
324 // successors get removed and we add edges between Pred and BB's successors.
325 for (BasicBlock
*Succ
: successors(&BB
)) {
326 DTUpdates
.push_back({DominatorTree::Delete
, &BB
, Succ
});
327 DTUpdates
.push_back({DominatorTree::Insert
, Pred
, Succ
});
329 // Also remove the edge between Pred and BB.
330 DTUpdates
.push_back({DominatorTree::Delete
, Pred
, &BB
});
332 // Need to replace it before nuking the branch.
333 BB
.replaceAllUsesWith(Pred
);
334 // PHI nodes in BB can only have a single incoming value. Remove them.
335 for (PHINode
&PN
: make_early_inc_range(BB
.phis())) {
336 PN
.replaceAllUsesWith(PN
.getIncomingValue(0));
337 PN
.eraseFromParent();
339 // Move all instructions from BB to Pred.
340 for (Instruction
&I
: make_early_inc_range(BB
))
341 I
.moveBefore(Pred
->getTerminator());
343 // Remove the Pred's terminator (which jumped to BB). BB's terminator
344 // will become Pred's terminator.
345 Pred
->getTerminator()->eraseFromParent();
351 // Apply updates permissively, to remove duplicates.
352 DTU
.applyUpdatesPermissive(DTUpdates
);
356 static bool doSimplify_v1(Function
&F
) {
357 return (int)eliminateCondBranches_v1(F
) | mergeIntoSinglePredecessor_v1(F
) |
358 removeDeadBlocks_v1(F
);
361 static bool doSimplify_v2(Function
&F
, DominatorTree
&DT
) {
362 return (int)eliminateCondBranches_v2(F
, DT
) |
363 mergeIntoSinglePredecessor_v2(F
, DT
) | removeDeadBlocks_v2(F
, DT
);
366 static bool doSimplify_v3(Function
&F
, DominatorTree
&DT
) {
367 return (int)eliminateCondBranches_v3(F
, DT
) |
368 mergeIntoSinglePredecessor_v2(F
, DT
) | removeDeadBlocks_v2(F
, DT
);
372 struct SimplifyCFGLegacyPass
: public FunctionPass
{
374 SimplifyCFGLegacyPass() : FunctionPass(ID
) {
375 initializeSimplifyCFGLegacyPassPass(*PassRegistry::getPassRegistry());
378 void getAnalysisUsage(AnalysisUsage
&AU
) const override
{
379 AU
.addRequired
<DominatorTreeWrapperPass
>();
380 // Version 1 of the implementation does not preserve the dominator tree.
382 AU
.addPreserved
<DominatorTreeWrapperPass
>();
384 FunctionPass::getAnalysisUsage(AU
);
387 bool runOnFunction(Function
&F
) override
{
393 return doSimplify_v1(F
);
395 auto &DT
= getAnalysis
<DominatorTreeWrapperPass
>().getDomTree();
396 return doSimplify_v2(F
, DT
);
399 auto &DT
= getAnalysis
<DominatorTreeWrapperPass
>().getDomTree();
400 return doSimplify_v3(F
, DT
);
404 llvm_unreachable("Unsupported version");
409 char SimplifyCFGLegacyPass::ID
= 0;
410 INITIALIZE_PASS_BEGIN(SimplifyCFGLegacyPass
, DEBUG_TYPE
,
411 "Tutorial CFG simplification", false, false)
412 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass
)
413 INITIALIZE_PASS_END(SimplifyCFGLegacyPass
, DEBUG_TYPE
,
414 "Tutorial CFG simplifications", false, false)