annotate lib/CodeGen/UnreachableBlockElim.cpp @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===-- UnreachableBlockElim.cpp - Remove unreachable blocks for codegen --===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // This pass is an extremely simple version of the SimplifyCFG pass. Its sole
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // job is to delete LLVM basic blocks that are not reachable from the entry
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 // node. To do this, it performs a simple depth first traversal of the CFG,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 // then deletes any unvisited nodes.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 // Note that this pass is really a hack. In particular, the instruction
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 // selectors for various targets should just not generate code for unreachable
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 // blocks. Until LLVM has a more systematic way of defining instruction
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 // selectors, however, we cannot really expect them to handle additional
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 // complexity.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
23 #include "llvm/CodeGen/UnreachableBlockElim.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "llvm/ADT/DepthFirstIterator.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 #include "llvm/ADT/SmallPtrSet.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 #include "llvm/CodeGen/MachineDominators.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 #include "llvm/CodeGen/MachineFunctionPass.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
28 #include "llvm/CodeGen/MachineInstrBuilder.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 #include "llvm/CodeGen/MachineLoopInfo.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 #include "llvm/CodeGen/MachineModuleInfo.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 #include "llvm/CodeGen/MachineRegisterInfo.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
32 #include "llvm/CodeGen/Passes.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
33 #include "llvm/CodeGen/TargetInstrInfo.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
34 #include "llvm/IR/CFG.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 #include "llvm/IR/Constant.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
36 #include "llvm/IR/Dominators.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 #include "llvm/IR/Function.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 #include "llvm/IR/Instructions.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 #include "llvm/IR/Type.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 #include "llvm/Pass.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 using namespace llvm;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
43 static bool eliminateUnreachableBlock(Function &F) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
44 df_iterator_default_set<BasicBlock*> Reachable;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 // Mark all reachable blocks.
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
47 for (BasicBlock *BB : depth_first_ext(&F, Reachable))
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
48 (void)BB/* Mark all reachable blocks */;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 // Loop over all dead blocks, remembering them and deleting all instructions
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 // in them.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 std::vector<BasicBlock*> DeadBlocks;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
54 if (!Reachable.count(&*I)) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
55 BasicBlock *BB = &*I;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 DeadBlocks.push_back(BB);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 PN->replaceAllUsesWith(Constant::getNullValue(PN->getType()));
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 BB->getInstList().pop_front();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 for (succ_iterator SI = succ_begin(BB), E = succ_end(BB); SI != E; ++SI)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 (*SI)->removePredecessor(BB);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 BB->dropAllReferences();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 // Actually remove the blocks now.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 DeadBlocks[i]->eraseFromParent();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
71 return !DeadBlocks.empty();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
74 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
75 class UnreachableBlockElimLegacyPass : public FunctionPass {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
76 bool runOnFunction(Function &F) override {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
77 return eliminateUnreachableBlock(F);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
78 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
79
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
80 public:
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
81 static char ID; // Pass identification, replacement for typeid
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
82 UnreachableBlockElimLegacyPass() : FunctionPass(ID) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
83 initializeUnreachableBlockElimLegacyPassPass(
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
84 *PassRegistry::getPassRegistry());
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
85 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
86
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
87 void getAnalysisUsage(AnalysisUsage &AU) const override {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
88 AU.addPreserved<DominatorTreeWrapperPass>();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
89 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
90 };
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
91 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
92 char UnreachableBlockElimLegacyPass::ID = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
93 INITIALIZE_PASS(UnreachableBlockElimLegacyPass, "unreachableblockelim",
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
94 "Remove unreachable blocks from the CFG", false, false)
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
95
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
96 FunctionPass *llvm::createUnreachableBlockEliminationPass() {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
97 return new UnreachableBlockElimLegacyPass();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
98 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
99
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
100 PreservedAnalyses UnreachableBlockElimPass::run(Function &F,
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
101 FunctionAnalysisManager &AM) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
102 bool Changed = eliminateUnreachableBlock(F);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
103 if (!Changed)
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
104 return PreservedAnalyses::all();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
105 PreservedAnalyses PA;
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
106 PA.preserve<DominatorTreeAnalysis>();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
107 return PA;
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
108 }
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 namespace {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 class UnreachableMachineBlockElim : public MachineFunctionPass {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
112 bool runOnMachineFunction(MachineFunction &F) override;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
113 void getAnalysisUsage(AnalysisUsage &AU) const override;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 MachineModuleInfo *MMI;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 public:
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 static char ID; // Pass identification, replacement for typeid
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 UnreachableMachineBlockElim() : MachineFunctionPass(ID) {}
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 };
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 char UnreachableMachineBlockElim::ID = 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 INITIALIZE_PASS(UnreachableMachineBlockElim, "unreachable-mbb-elimination",
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 "Remove unreachable machine basic blocks", false, false)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 char &llvm::UnreachableMachineBlockElimID = UnreachableMachineBlockElim::ID;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 void UnreachableMachineBlockElim::getAnalysisUsage(AnalysisUsage &AU) const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 AU.addPreserved<MachineLoopInfo>();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 AU.addPreserved<MachineDominatorTree>();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 MachineFunctionPass::getAnalysisUsage(AU);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 bool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
134 df_iterator_default_set<MachineBasicBlock*> Reachable;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 bool ModifiedPHI = false;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 MMI = getAnalysisIfAvailable<MachineModuleInfo>();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 MachineDominatorTree *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 MachineLoopInfo *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 // Mark all reachable blocks.
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
142 for (MachineBasicBlock *BB : depth_first_ext(&F, Reachable))
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
143 (void)BB/* Mark all reachable blocks */;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 // Loop over all dead blocks, remembering them and deleting all instructions
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 // in them.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 std::vector<MachineBasicBlock*> DeadBlocks;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
149 MachineBasicBlock *BB = &*I;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 // Test for deadness.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 if (!Reachable.count(BB)) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 DeadBlocks.push_back(BB);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 // Update dominator and loop info.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 if (MLI) MLI->removeBlock(BB);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 if (MDT && MDT->getNode(BB)) MDT->eraseNode(BB);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 while (BB->succ_begin() != BB->succ_end()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 MachineBasicBlock* succ = *BB->succ_begin();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 MachineBasicBlock::iterator start = succ->begin();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 while (start != succ->end() && start->isPHI()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 for (unsigned i = start->getNumOperands() - 1; i >= 2; i-=2)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 if (start->getOperand(i).isMBB() &&
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 start->getOperand(i).getMBB() == BB) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 start->RemoveOperand(i);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 start->RemoveOperand(i-1);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 start++;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 BB->removeSuccessor(BB->succ_begin());
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 // Actually remove the blocks now.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 DeadBlocks[i]->eraseFromParent();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 // Cleanup PHI nodes.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
185 MachineBasicBlock *BB = &*I;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 // Prune unneeded PHI entries.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 SmallPtrSet<MachineBasicBlock*, 8> preds(BB->pred_begin(),
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 BB->pred_end());
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 MachineBasicBlock::iterator phi = BB->begin();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 while (phi != BB->end() && phi->isPHI()) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 for (unsigned i = phi->getNumOperands() - 1; i >= 2; i-=2)
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 if (!preds.count(phi->getOperand(i).getMBB())) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 phi->RemoveOperand(i);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 phi->RemoveOperand(i-1);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 ModifiedPHI = true;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 if (phi->getNumOperands() == 3) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
199 const MachineOperand &Input = phi->getOperand(1);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
200 const MachineOperand &Output = phi->getOperand(0);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
201 unsigned InputReg = Input.getReg();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
202 unsigned OutputReg = Output.getReg();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
203 assert(Output.getSubReg() == 0 && "Cannot have output subregister");
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 ModifiedPHI = true;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
206 if (InputReg != OutputReg) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 MachineRegisterInfo &MRI = F.getRegInfo();
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
208 unsigned InputSub = Input.getSubReg();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
209 if (InputSub == 0 &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
210 MRI.constrainRegClass(InputReg, MRI.getRegClass(OutputReg)) &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
211 !Input.isUndef()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
212 MRI.replaceRegWith(OutputReg, InputReg);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
213 } else {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
214 // The input register to the PHI has a subregister or it can't be
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
215 // constrained to the proper register class or it is undef:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
216 // insert a COPY instead of simply replacing the output
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
217 // with the input.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
218 const TargetInstrInfo *TII = F.getSubtarget().getInstrInfo();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
219 BuildMI(*BB, BB->getFirstNonPHI(), phi->getDebugLoc(),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
220 TII->get(TargetOpcode::COPY), OutputReg)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
221 .addReg(InputReg, getRegState(Input), InputSub);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
222 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
223 phi++->eraseFromParent();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 continue;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 ++phi;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 F.RenumberBlocks();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
234 return (!DeadBlocks.empty() || ModifiedPHI);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 }