blob: e261d7895fc313c02901a1ae6f151344058237b2 [file] [log] [blame]
Owen Anderson5fba6c12007-05-29 21:53:49 +00001//===- GVNPRE.cpp - Eliminate redundant values and expressions ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the Owen Anderson and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This pass performs a hybrid of global value numbering and partial redundancy
11// elimination, known as GVN-PRE. It performs partial redundancy elimination on
12// values, rather than lexical expressions, allowing a more comprehensive view
13// the optimization. It replaces redundant values with uses of earlier
14// occurences of the same value. While this is beneficial in that it eliminates
15// unneeded computation, it also increases register pressure by creating large
Owen Andersonb232efa2007-06-08 20:57:08 +000016// live ranges, and should be used with caution on platforms that are very
Owen Anderson5fba6c12007-05-29 21:53:49 +000017// sensitive to register pressure.
18//
19//===----------------------------------------------------------------------===//
20
21#define DEBUG_TYPE "gvnpre"
22#include "llvm/Value.h"
23#include "llvm/Transforms/Scalar.h"
24#include "llvm/Instructions.h"
25#include "llvm/Function.h"
26#include "llvm/Analysis/Dominators.h"
27#include "llvm/Analysis/PostDominators.h"
Owen Anderson1ad2c102007-06-19 23:23:54 +000028#include "llvm/ADT/DenseMap.h"
Owen Anderson5fba6c12007-05-29 21:53:49 +000029#include "llvm/ADT/DepthFirstIterator.h"
30#include "llvm/ADT/Statistic.h"
Owen Andersonbe802402007-06-08 01:03:01 +000031#include "llvm/Support/CFG.h"
Owen Anderson5fba6c12007-05-29 21:53:49 +000032#include "llvm/Support/Compiler.h"
Owen Anderson4a6ec8f2007-05-29 23:15:21 +000033#include "llvm/Support/Debug.h"
Owen Anderson5fba6c12007-05-29 21:53:49 +000034#include <algorithm>
Owen Anderson331bf6a2007-05-31 22:44:11 +000035#include <deque>
Owen Anderson5fba6c12007-05-29 21:53:49 +000036#include <map>
Owen Anderson331bf6a2007-05-31 22:44:11 +000037#include <vector>
Owen Anderson5fba6c12007-05-29 21:53:49 +000038#include <set>
Owen Anderson5fba6c12007-05-29 21:53:49 +000039using namespace llvm;
40
Owen Andersonb56fba02007-06-19 03:31:41 +000041//===----------------------------------------------------------------------===//
42// ValueTable Class
43//===----------------------------------------------------------------------===//
44
45/// This class holds the mapping between values and value numbers.
46
47namespace {
48 class VISIBILITY_HIDDEN ValueTable {
49 public:
50 struct Expression {
51 enum ExpressionOpcode { ADD, SUB, MUL, UDIV, SDIV, FDIV, UREM, SREM,
52 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
53 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
54 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
55 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
56 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
57 FCMPULT, FCMPULE, FCMPUNE };
58
59 ExpressionOpcode opcode;
60 uint32_t leftVN;
61 uint32_t rightVN;
62
63 bool operator< (const Expression& other) const {
64 if (opcode < other.opcode)
65 return true;
66 else if (opcode > other.opcode)
67 return false;
68 else if (leftVN < other.leftVN)
69 return true;
70 else if (leftVN > other.leftVN)
71 return false;
72 else if (rightVN < other.rightVN)
73 return true;
74 else if (rightVN > other.rightVN)
75 return false;
76 else
77 return false;
Owen Andersona75dd4d2007-06-12 00:50:47 +000078 }
Owen Andersonb56fba02007-06-19 03:31:41 +000079 };
80
81 private:
Owen Anderson1ad2c102007-06-19 23:23:54 +000082 DenseMap<Value*, uint32_t> valueNumbering;
Owen Andersonb56fba02007-06-19 03:31:41 +000083 std::map<Expression, uint32_t> expressionNumbering;
84
85 std::set<Expression> maximalExpressions;
86 std::set<Value*> maximalValues;
87
88 uint32_t nextValueNumber;
89
90 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
91 Expression::ExpressionOpcode getOpcode(CmpInst* C);
92 public:
93 ValueTable() { nextValueNumber = 1; }
94 uint32_t lookup_or_add(Value* V);
95 uint32_t lookup(Value* V);
96 void add(Value* V, uint32_t num);
97 void clear();
98 std::set<Expression>& getMaximalExpressions() {
99 return maximalExpressions;
100
101 }
102 std::set<Value*>& getMaximalValues() { return maximalValues; }
103 Expression create_expression(BinaryOperator* BO);
104 Expression create_expression(CmpInst* C);
Owen Anderson91c54952007-06-19 05:37:32 +0000105 void erase(Value* v);
Owen Andersonb56fba02007-06-19 03:31:41 +0000106 };
107}
108
109ValueTable::Expression::ExpressionOpcode
110 ValueTable::getOpcode(BinaryOperator* BO) {
111 switch(BO->getOpcode()) {
112 case Instruction::Add:
113 return Expression::ADD;
114 case Instruction::Sub:
115 return Expression::SUB;
116 case Instruction::Mul:
117 return Expression::MUL;
118 case Instruction::UDiv:
119 return Expression::UDIV;
120 case Instruction::SDiv:
121 return Expression::SDIV;
122 case Instruction::FDiv:
123 return Expression::FDIV;
124 case Instruction::URem:
125 return Expression::UREM;
126 case Instruction::SRem:
127 return Expression::SREM;
128 case Instruction::FRem:
129 return Expression::FREM;
130 case Instruction::Shl:
131 return Expression::SHL;
132 case Instruction::LShr:
133 return Expression::LSHR;
134 case Instruction::AShr:
135 return Expression::ASHR;
136 case Instruction::And:
137 return Expression::AND;
138 case Instruction::Or:
139 return Expression::OR;
140 case Instruction::Xor:
141 return Expression::XOR;
142
143 // THIS SHOULD NEVER HAPPEN
144 default:
145 assert(0 && "Binary operator with unknown opcode?");
146 return Expression::ADD;
147 }
148}
149
150ValueTable::Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
151 if (C->getOpcode() == Instruction::ICmp) {
152 switch (C->getPredicate()) {
153 case ICmpInst::ICMP_EQ:
154 return Expression::ICMPEQ;
155 case ICmpInst::ICMP_NE:
156 return Expression::ICMPNE;
157 case ICmpInst::ICMP_UGT:
158 return Expression::ICMPUGT;
159 case ICmpInst::ICMP_UGE:
160 return Expression::ICMPUGE;
161 case ICmpInst::ICMP_ULT:
162 return Expression::ICMPULT;
163 case ICmpInst::ICMP_ULE:
164 return Expression::ICMPULE;
165 case ICmpInst::ICMP_SGT:
166 return Expression::ICMPSGT;
167 case ICmpInst::ICMP_SGE:
168 return Expression::ICMPSGE;
169 case ICmpInst::ICMP_SLT:
170 return Expression::ICMPSLT;
171 case ICmpInst::ICMP_SLE:
172 return Expression::ICMPSLE;
173
174 // THIS SHOULD NEVER HAPPEN
175 default:
176 assert(0 && "Comparison with unknown predicate?");
177 return Expression::ICMPEQ;
178 }
179 } else {
180 switch (C->getPredicate()) {
181 case FCmpInst::FCMP_OEQ:
182 return Expression::FCMPOEQ;
183 case FCmpInst::FCMP_OGT:
184 return Expression::FCMPOGT;
185 case FCmpInst::FCMP_OGE:
186 return Expression::FCMPOGE;
187 case FCmpInst::FCMP_OLT:
188 return Expression::FCMPOLT;
189 case FCmpInst::FCMP_OLE:
190 return Expression::FCMPOLE;
191 case FCmpInst::FCMP_ONE:
192 return Expression::FCMPONE;
193 case FCmpInst::FCMP_ORD:
194 return Expression::FCMPORD;
195 case FCmpInst::FCMP_UNO:
196 return Expression::FCMPUNO;
197 case FCmpInst::FCMP_UEQ:
198 return Expression::FCMPUEQ;
199 case FCmpInst::FCMP_UGT:
200 return Expression::FCMPUGT;
201 case FCmpInst::FCMP_UGE:
202 return Expression::FCMPUGE;
203 case FCmpInst::FCMP_ULT:
204 return Expression::FCMPULT;
205 case FCmpInst::FCMP_ULE:
206 return Expression::FCMPULE;
207 case FCmpInst::FCMP_UNE:
208 return Expression::FCMPUNE;
209
210 // THIS SHOULD NEVER HAPPEN
211 default:
212 assert(0 && "Comparison with unknown predicate?");
213 return Expression::FCMPOEQ;
Owen Anderson223718c2007-06-09 18:35:31 +0000214 }
215 }
Owen Andersonb56fba02007-06-19 03:31:41 +0000216}
217
218uint32_t ValueTable::lookup_or_add(Value* V) {
219 maximalValues.insert(V);
220
Owen Anderson1ad2c102007-06-19 23:23:54 +0000221 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Andersonb56fba02007-06-19 03:31:41 +0000222 if (VI != valueNumbering.end())
223 return VI->second;
Owen Anderson223718c2007-06-09 18:35:31 +0000224
Owen Anderson223718c2007-06-09 18:35:31 +0000225
Owen Andersonb56fba02007-06-19 03:31:41 +0000226 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
227 Expression e = create_expression(BO);
228
229 std::map<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
230 if (EI != expressionNumbering.end()) {
231 valueNumbering.insert(std::make_pair(V, EI->second));
232 return EI->second;
233 } else {
234 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
235 valueNumbering.insert(std::make_pair(V, nextValueNumber));
236
237 return nextValueNumber++;
238 }
239 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
240 Expression e = create_expression(C);
241
242 std::map<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
243 if (EI != expressionNumbering.end()) {
244 valueNumbering.insert(std::make_pair(V, EI->second));
245 return EI->second;
246 } else {
247 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
248 valueNumbering.insert(std::make_pair(V, nextValueNumber));
249
250 return nextValueNumber++;
251 }
252 } else {
253 valueNumbering.insert(std::make_pair(V, nextValueNumber));
254 return nextValueNumber++;
Owen Anderson0b68cda2007-06-03 05:55:58 +0000255 }
Owen Andersonb56fba02007-06-19 03:31:41 +0000256}
257
258uint32_t ValueTable::lookup(Value* V) {
Owen Anderson1ad2c102007-06-19 23:23:54 +0000259 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Andersonb56fba02007-06-19 03:31:41 +0000260 if (VI != valueNumbering.end())
261 return VI->second;
262 else
263 assert(0 && "Value not numbered?");
264
265 return 0;
266}
267
268void ValueTable::add(Value* V, uint32_t num) {
Owen Anderson1ad2c102007-06-19 23:23:54 +0000269 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Andersonb56fba02007-06-19 03:31:41 +0000270 if (VI != valueNumbering.end())
271 valueNumbering.erase(VI);
272 valueNumbering.insert(std::make_pair(V, num));
273}
274
275ValueTable::Expression ValueTable::create_expression(BinaryOperator* BO) {
276 Expression e;
277
278 e.leftVN = lookup_or_add(BO->getOperand(0));
279 e.rightVN = lookup_or_add(BO->getOperand(1));
280 e.opcode = getOpcode(BO);
281
282 maximalExpressions.insert(e);
283
284 return e;
285}
286
287ValueTable::Expression ValueTable::create_expression(CmpInst* C) {
288 Expression e;
289
290 e.leftVN = lookup_or_add(C->getOperand(0));
291 e.rightVN = lookup_or_add(C->getOperand(1));
292 e.opcode = getOpcode(C);
293
294 maximalExpressions.insert(e);
295
296 return e;
297}
298
299void ValueTable::clear() {
300 valueNumbering.clear();
301 expressionNumbering.clear();
Owen Andersonb9cbaed2007-06-19 04:32:55 +0000302 maximalExpressions.clear();
303 maximalValues.clear();
Owen Andersonb56fba02007-06-19 03:31:41 +0000304 nextValueNumber = 1;
305}
Owen Anderson0b68cda2007-06-03 05:55:58 +0000306
Owen Anderson91c54952007-06-19 05:37:32 +0000307void ValueTable::erase(Value* V) {
308 maximalValues.erase(V);
309 valueNumbering.erase(V);
310 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V))
311 maximalExpressions.erase(create_expression(BO));
312 else if (CmpInst* C = dyn_cast<CmpInst>(V))
313 maximalExpressions.erase(create_expression(C));
314}
315
Owen Anderson5fba6c12007-05-29 21:53:49 +0000316namespace {
317
318 class VISIBILITY_HIDDEN GVNPRE : public FunctionPass {
319 bool runOnFunction(Function &F);
320 public:
321 static char ID; // Pass identification, replacement for typeid
Owen Andersonb9cbaed2007-06-19 04:32:55 +0000322 GVNPRE() : FunctionPass((intptr_t)&ID) { }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000323
324 private:
Owen Andersonbe802402007-06-08 01:03:01 +0000325 ValueTable VN;
Owen Andersona75dd4d2007-06-12 00:50:47 +0000326 std::vector<Instruction*> createdExpressions;
Owen Anderson81d156e2007-05-31 00:42:15 +0000327
Owen Andersonb56fba02007-06-19 03:31:41 +0000328 std::map<BasicBlock*, std::set<Value*> > availableOut;
329 std::map<BasicBlock*, std::set<Value*> > anticipatedIn;
Owen Andersondd998e12007-06-18 04:42:29 +0000330 std::map<User*, bool> invokeDep;
Owen Anderson4036ad42007-06-12 22:43:57 +0000331
Owen Anderson5fba6c12007-05-29 21:53:49 +0000332 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
333 AU.setPreservesCFG();
334 AU.addRequired<DominatorTree>();
335 AU.addRequired<PostDominatorTree>();
336 }
337
338 // Helper fuctions
339 // FIXME: eliminate or document these better
Owen Anderson2e5efc32007-06-08 01:52:45 +0000340 void dump(const std::set<Value*>& s) const;
Owen Andersonb56fba02007-06-19 03:31:41 +0000341 void dump_unique(const std::set<Value*>& s) const;
342 void clean(std::set<Value*>& set);
343 Value* find_leader(std::set<Value*>& vals,
344 uint32_t v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000345 Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ);
Owen Andersonb56fba02007-06-19 03:31:41 +0000346 void phi_translate_set(std::set<Value*>& anticIn, BasicBlock* pred,
347 BasicBlock* succ, std::set<Value*>& out);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000348
Owen Andersonb56fba02007-06-19 03:31:41 +0000349 void topo_sort(std::set<Value*>& set,
Owen Anderson0b68cda2007-06-03 05:55:58 +0000350 std::vector<Value*>& vec);
Owen Anderson331bf6a2007-05-31 22:44:11 +0000351
Owen Anderson5fba6c12007-05-29 21:53:49 +0000352 // For a given block, calculate the generated expressions, temporaries,
353 // and the AVAIL_OUT set
Owen Anderson42769842007-06-12 16:57:50 +0000354 void cleanup();
Owen Anderson4036ad42007-06-12 22:43:57 +0000355 void elimination();
Owen Andersondd998e12007-06-18 04:42:29 +0000356
Owen Andersonb56fba02007-06-19 03:31:41 +0000357 void val_insert(std::set<Value*>& s, Value* v);
358 void val_replace(std::set<Value*>& s, Value* v);
Owen Andersondd998e12007-06-18 04:42:29 +0000359 bool dependsOnInvoke(Value* V);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000360
361 };
362
363 char GVNPRE::ID = 0;
364
365}
366
367FunctionPass *llvm::createGVNPREPass() { return new GVNPRE(); }
368
369RegisterPass<GVNPRE> X("gvnpre",
370 "Global Value Numbering/Partial Redundancy Elimination");
371
Owen Anderson5fba6c12007-05-29 21:53:49 +0000372
Owen Anderson7d76b2a2007-06-08 22:02:36 +0000373STATISTIC(NumInsertedVals, "Number of values inserted");
374STATISTIC(NumInsertedPhis, "Number of PHI nodes inserted");
375STATISTIC(NumEliminated, "Number of redundant instructions eliminated");
376
Owen Andersonb56fba02007-06-19 03:31:41 +0000377Value* GVNPRE::find_leader(std::set<Value*>& vals, uint32_t v) {
378 for (std::set<Value*>::iterator I = vals.begin(), E = vals.end();
379 I != E; ++I)
380 if (v == VN.lookup(*I))
Owen Anderson0b68cda2007-06-03 05:55:58 +0000381 return *I;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000382
Owen Anderson0b68cda2007-06-03 05:55:58 +0000383 return 0;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000384}
385
Owen Andersonb56fba02007-06-19 03:31:41 +0000386void GVNPRE::val_insert(std::set<Value*>& s, Value* v) {
387 uint32_t num = VN.lookup(v);
388 Value* leader = find_leader(s, num);
389 if (leader == 0)
390 s.insert(v);
391}
392
393void GVNPRE::val_replace(std::set<Value*>& s, Value* v) {
394 uint32_t num = VN.lookup(v);
395 Value* leader = find_leader(s, num);
396 while (leader != 0) {
397 s.erase(leader);
398 leader = find_leader(s, num);
399 }
400 s.insert(v);
401}
402
Owen Anderson4036ad42007-06-12 22:43:57 +0000403Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
Owen Anderson38b6b222007-06-04 18:05:26 +0000404 if (V == 0)
405 return 0;
406
407 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000408 Value* newOp1 = 0;
409 if (isa<Instruction>(BO->getOperand(0)))
410 newOp1 = phi_translate(find_leader(anticipatedIn[succ],
411 VN.lookup(BO->getOperand(0))),
412 pred, succ);
413 else
414 newOp1 = BO->getOperand(0);
415
Owen Anderson38b6b222007-06-04 18:05:26 +0000416 if (newOp1 == 0)
417 return 0;
418
Owen Andersonb56fba02007-06-19 03:31:41 +0000419 Value* newOp2 = 0;
420 if (isa<Instruction>(BO->getOperand(1)))
421 newOp2 = phi_translate(find_leader(anticipatedIn[succ],
422 VN.lookup(BO->getOperand(1))),
423 pred, succ);
424 else
425 newOp2 = BO->getOperand(1);
426
Owen Anderson38b6b222007-06-04 18:05:26 +0000427 if (newOp2 == 0)
428 return 0;
429
430 if (newOp1 != BO->getOperand(0) || newOp2 != BO->getOperand(1)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000431 Instruction* newVal = BinaryOperator::create(BO->getOpcode(),
Owen Anderson38b6b222007-06-04 18:05:26 +0000432 newOp1, newOp2,
Owen Anderson91c54952007-06-19 05:37:32 +0000433 BO->getName()+".expr");
Owen Anderson55994f22007-06-08 20:44:02 +0000434
Owen Andersonb56fba02007-06-19 03:31:41 +0000435 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson4036ad42007-06-12 22:43:57 +0000436
Owen Andersonb56fba02007-06-19 03:31:41 +0000437 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000438 if (leader == 0) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000439 createdExpressions.push_back(newVal);
Owen Anderson38b6b222007-06-04 18:05:26 +0000440 return newVal;
Owen Andersonc8472092007-06-05 22:11:49 +0000441 } else {
Owen Anderson91c54952007-06-19 05:37:32 +0000442 VN.erase(newVal);
Owen Andersonc8472092007-06-05 22:11:49 +0000443 delete newVal;
Owen Anderson4036ad42007-06-12 22:43:57 +0000444 return leader;
Owen Andersonc8472092007-06-05 22:11:49 +0000445 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000446 }
447 } else if (PHINode* P = dyn_cast<PHINode>(V)) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000448 if (P->getParent() == succ)
Owen Anderson38b6b222007-06-04 18:05:26 +0000449 return P->getIncomingValueForBlock(pred);
Owen Anderson223718c2007-06-09 18:35:31 +0000450 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000451 Value* newOp1 = 0;
452 if (isa<Instruction>(C->getOperand(0)))
453 newOp1 = phi_translate(find_leader(anticipatedIn[succ],
454 VN.lookup(C->getOperand(0))),
455 pred, succ);
456 else
457 newOp1 = C->getOperand(0);
458
Owen Anderson223718c2007-06-09 18:35:31 +0000459 if (newOp1 == 0)
460 return 0;
461
Owen Andersonb56fba02007-06-19 03:31:41 +0000462 Value* newOp2 = 0;
463 if (isa<Instruction>(C->getOperand(1)))
464 newOp2 = phi_translate(find_leader(anticipatedIn[succ],
465 VN.lookup(C->getOperand(1))),
466 pred, succ);
467 else
468 newOp2 = C->getOperand(1);
469
Owen Anderson223718c2007-06-09 18:35:31 +0000470 if (newOp2 == 0)
471 return 0;
472
473 if (newOp1 != C->getOperand(0) || newOp2 != C->getOperand(1)) {
474 Instruction* newVal = CmpInst::create(C->getOpcode(),
475 C->getPredicate(),
476 newOp1, newOp2,
Owen Anderson91c54952007-06-19 05:37:32 +0000477 C->getName()+".expr");
Owen Anderson223718c2007-06-09 18:35:31 +0000478
Owen Andersonb56fba02007-06-19 03:31:41 +0000479 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson4036ad42007-06-12 22:43:57 +0000480
Owen Andersonb56fba02007-06-19 03:31:41 +0000481 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000482 if (leader == 0) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000483 createdExpressions.push_back(newVal);
Owen Anderson223718c2007-06-09 18:35:31 +0000484 return newVal;
485 } else {
Owen Anderson91c54952007-06-19 05:37:32 +0000486 VN.erase(newVal);
Owen Anderson223718c2007-06-09 18:35:31 +0000487 delete newVal;
Owen Anderson4036ad42007-06-12 22:43:57 +0000488 return leader;
Owen Anderson223718c2007-06-09 18:35:31 +0000489 }
490 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000491 }
492
493 return V;
494}
495
Owen Andersonb56fba02007-06-19 03:31:41 +0000496void GVNPRE::phi_translate_set(std::set<Value*>& anticIn,
Owen Andersona75dd4d2007-06-12 00:50:47 +0000497 BasicBlock* pred, BasicBlock* succ,
Owen Andersonb56fba02007-06-19 03:31:41 +0000498 std::set<Value*>& out) {
499 for (std::set<Value*>::iterator I = anticIn.begin(),
Owen Anderson38b6b222007-06-04 18:05:26 +0000500 E = anticIn.end(); I != E; ++I) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000501 Value* V = phi_translate(*I, pred, succ);
Owen Anderson38b6b222007-06-04 18:05:26 +0000502 if (V != 0)
503 out.insert(V);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000504 }
505}
506
Owen Andersondd998e12007-06-18 04:42:29 +0000507bool GVNPRE::dependsOnInvoke(Value* V) {
Owen Anderson2320d432007-06-19 23:07:16 +0000508 if (PHINode* p = dyn_cast<PHINode>(V)) {
509 for (PHINode::op_iterator I = p->op_begin(), E = p->op_end(); I != E; ++I)
510 if (isa<InvokeInst>(*I))
Owen Andersondd998e12007-06-18 04:42:29 +0000511 return true;
Owen Anderson2320d432007-06-19 23:07:16 +0000512 return false;
513 } else {
514 return false;
Owen Anderson658f2c42007-06-16 00:26:54 +0000515 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000516}
517
Owen Anderson5fba6c12007-05-29 21:53:49 +0000518// Remove all expressions whose operands are not themselves in the set
Owen Andersonb56fba02007-06-19 03:31:41 +0000519void GVNPRE::clean(std::set<Value*>& set) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000520 std::vector<Value*> worklist;
Owen Andersonbe802402007-06-08 01:03:01 +0000521 topo_sort(set, worklist);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000522
Owen Andersonbe802402007-06-08 01:03:01 +0000523 for (unsigned i = 0; i < worklist.size(); ++i) {
524 Value* v = worklist[i];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000525
Owen Anderson0b68cda2007-06-03 05:55:58 +0000526 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(v)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000527 bool lhsValid = !isa<Instruction>(BO->getOperand(0));
528 if (!lhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000529 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonbe802402007-06-08 01:03:01 +0000530 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000531 if (VN.lookup(*I) == VN.lookup(BO->getOperand(0))) {
Owen Andersonbe802402007-06-08 01:03:01 +0000532 lhsValid = true;
533 break;
534 }
Owen Andersonb364b412007-06-18 04:30:44 +0000535 if (lhsValid)
536 lhsValid = !dependsOnInvoke(BO->getOperand(0));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000537
Owen Andersonbe802402007-06-08 01:03:01 +0000538 bool rhsValid = !isa<Instruction>(BO->getOperand(1));
539 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000540 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonf1c04e12007-06-18 04:31:21 +0000541 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000542 if (VN.lookup(*I) == VN.lookup(BO->getOperand(1))) {
Owen Andersonf1c04e12007-06-18 04:31:21 +0000543 rhsValid = true;
544 break;
545 }
Owen Andersonb364b412007-06-18 04:30:44 +0000546 if (rhsValid)
547 rhsValid = !dependsOnInvoke(BO->getOperand(1));
Owen Anderson5fba6c12007-05-29 21:53:49 +0000548
Owen Anderson0b68cda2007-06-03 05:55:58 +0000549 if (!lhsValid || !rhsValid)
550 set.erase(BO);
Owen Anderson223718c2007-06-09 18:35:31 +0000551 } else if (CmpInst* C = dyn_cast<CmpInst>(v)) {
552 bool lhsValid = !isa<Instruction>(C->getOperand(0));
553 if (!lhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000554 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000555 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000556 if (VN.lookup(*I) == VN.lookup(C->getOperand(0))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000557 lhsValid = true;
558 break;
559 }
Owen Anderson2320d432007-06-19 23:07:16 +0000560 if (lhsValid)
561 lhsValid = !dependsOnInvoke(C->getOperand(0));
Owen Anderson658f2c42007-06-16 00:26:54 +0000562
Owen Anderson223718c2007-06-09 18:35:31 +0000563 bool rhsValid = !isa<Instruction>(C->getOperand(1));
564 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000565 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000566 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000567 if (VN.lookup(*I) == VN.lookup(C->getOperand(1))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000568 rhsValid = true;
569 break;
570 }
Owen Anderson2320d432007-06-19 23:07:16 +0000571 if (rhsValid)
572 rhsValid = !dependsOnInvoke(C->getOperand(1));
Owen Anderson223718c2007-06-09 18:35:31 +0000573
574 if (!lhsValid || !rhsValid)
575 set.erase(C);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000576 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000577 }
578}
579
Owen Andersonb56fba02007-06-19 03:31:41 +0000580void GVNPRE::topo_sort(std::set<Value*>& set,
Owen Anderson0b68cda2007-06-03 05:55:58 +0000581 std::vector<Value*>& vec) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000582 std::set<Value*> toErase;
583 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000584 I != E; ++I) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000585 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000586 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
587 if (VN.lookup(BO->getOperand(0)) == VN.lookup(*SI) ||
588 VN.lookup(BO->getOperand(1)) == VN.lookup(*SI)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000589 toErase.insert(*SI);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000590 }
Owen Anderson223718c2007-06-09 18:35:31 +0000591 }
592 else if (CmpInst* C = dyn_cast<CmpInst>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000593 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
594 if (VN.lookup(C->getOperand(0)) == VN.lookup(*SI) ||
595 VN.lookup(C->getOperand(1)) == VN.lookup(*SI)) {
Owen Anderson223718c2007-06-09 18:35:31 +0000596 toErase.insert(*SI);
597 }
598 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000599 }
600
Owen Anderson0b68cda2007-06-03 05:55:58 +0000601 std::vector<Value*> Q;
Owen Andersonb56fba02007-06-19 03:31:41 +0000602 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonbe802402007-06-08 01:03:01 +0000603 I != E; ++I) {
604 if (toErase.find(*I) == toErase.end())
605 Q.push_back(*I);
606 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000607
Owen Andersonddbe4302007-06-05 23:46:12 +0000608 std::set<Value*> visited;
Owen Anderson331bf6a2007-05-31 22:44:11 +0000609 while (!Q.empty()) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000610 Value* e = Q.back();
611
612 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000613 Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
614 Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000615
Owen Andersonddbe4302007-06-05 23:46:12 +0000616 if (l != 0 && isa<Instruction>(l) &&
617 visited.find(l) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000618 Q.push_back(l);
Owen Andersonddbe4302007-06-05 23:46:12 +0000619 else if (r != 0 && isa<Instruction>(r) &&
620 visited.find(r) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000621 Q.push_back(r);
622 else {
623 vec.push_back(e);
624 visited.insert(e);
625 Q.pop_back();
626 }
Owen Anderson223718c2007-06-09 18:35:31 +0000627 } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000628 Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
629 Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
Owen Anderson223718c2007-06-09 18:35:31 +0000630
631 if (l != 0 && isa<Instruction>(l) &&
632 visited.find(l) == visited.end())
633 Q.push_back(l);
634 else if (r != 0 && isa<Instruction>(r) &&
635 visited.find(r) == visited.end())
636 Q.push_back(r);
637 else {
638 vec.push_back(e);
639 visited.insert(e);
640 Q.pop_back();
641 }
Owen Anderson0b68cda2007-06-03 05:55:58 +0000642 } else {
Owen Anderson331bf6a2007-05-31 22:44:11 +0000643 visited.insert(e);
644 vec.push_back(e);
645 Q.pop_back();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000646 }
647 }
648}
649
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000650
Owen Anderson2e5efc32007-06-08 01:52:45 +0000651void GVNPRE::dump(const std::set<Value*>& s) const {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000652 DOUT << "{ ";
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000653 for (std::set<Value*>::iterator I = s.begin(), E = s.end();
654 I != E; ++I) {
655 DEBUG((*I)->dump());
656 }
657 DOUT << "}\n\n";
658}
659
Owen Andersonb56fba02007-06-19 03:31:41 +0000660void GVNPRE::dump_unique(const std::set<Value*>& s) const {
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000661 DOUT << "{ ";
662 for (std::set<Value*>::iterator I = s.begin(), E = s.end();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000663 I != E; ++I) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000664 DEBUG((*I)->dump());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000665 }
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000666 DOUT << "}\n\n";
Owen Anderson5fba6c12007-05-29 21:53:49 +0000667}
668
Owen Anderson4036ad42007-06-12 22:43:57 +0000669void GVNPRE::elimination() {
Owen Anderson42769842007-06-12 16:57:50 +0000670 DOUT << "\n\nPhase 3: Elimination\n\n";
671
672 std::vector<std::pair<Instruction*, Value*> > replace;
673 std::vector<Instruction*> erase;
674
675 DominatorTree& DT = getAnalysis<DominatorTree>();
676
677 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
678 E = df_end(DT.getRootNode()); DI != E; ++DI) {
679 BasicBlock* BB = DI->getBlock();
680
681 DOUT << "Block: " << BB->getName() << "\n";
682 dump_unique(availableOut[BB]);
683 DOUT << "\n\n";
684
685 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
686 BI != BE; ++BI) {
687
688 if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000689 Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
Owen Anderson42769842007-06-12 16:57:50 +0000690
691 if (leader != 0)
692 if (Instruction* Instr = dyn_cast<Instruction>(leader))
693 if (Instr->getParent() != 0 && Instr != BI) {
694 replace.push_back(std::make_pair(BI, leader));
695 erase.push_back(BI);
696 ++NumEliminated;
697 }
698 }
699 }
700 }
701
702 while (!replace.empty()) {
703 std::pair<Instruction*, Value*> rep = replace.back();
704 replace.pop_back();
705 rep.first->replaceAllUsesWith(rep.second);
706 }
707
708 for (std::vector<Instruction*>::iterator I = erase.begin(), E = erase.end();
709 I != E; ++I)
710 (*I)->eraseFromParent();
711}
712
713
714void GVNPRE::cleanup() {
715 while (!createdExpressions.empty()) {
716 Instruction* I = createdExpressions.back();
717 createdExpressions.pop_back();
718
719 delete I;
720 }
721}
722
Owen Anderson5fba6c12007-05-29 21:53:49 +0000723bool GVNPRE::runOnFunction(Function &F) {
Owen Andersonbe802402007-06-08 01:03:01 +0000724 VN.clear();
Owen Andersonbe802402007-06-08 01:03:01 +0000725 createdExpressions.clear();
Owen Anderson4036ad42007-06-12 22:43:57 +0000726 availableOut.clear();
727 anticipatedIn.clear();
Owen Andersondd998e12007-06-18 04:42:29 +0000728 invokeDep.clear();
Owen Anderson5fba6c12007-05-29 21:53:49 +0000729
Owen Andersonb56fba02007-06-19 03:31:41 +0000730 std::map<BasicBlock*, std::set<Value*> > generatedExpressions;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000731 std::map<BasicBlock*, std::set<PHINode*> > generatedPhis;
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000732 std::map<BasicBlock*, std::set<Value*> > generatedTemporaries;
Owen Anderson4036ad42007-06-12 22:43:57 +0000733
Owen Anderson5fba6c12007-05-29 21:53:49 +0000734
735 DominatorTree &DT = getAnalysis<DominatorTree>();
736
Owen Anderson634a0632007-06-06 01:27:49 +0000737 // Phase 1: BuildSets
738
739 // Phase 1, Part 1: calculate AVAIL_OUT
Owen Anderson5fba6c12007-05-29 21:53:49 +0000740
741 // Top-down walk of the dominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000742 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
Owen Anderson5fba6c12007-05-29 21:53:49 +0000743 E = df_end(DT.getRootNode()); DI != E; ++DI) {
744
745 // Get the sets to update for this block
Owen Andersonb56fba02007-06-19 03:31:41 +0000746 std::set<Value*>& currExps = generatedExpressions[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000747 std::set<PHINode*>& currPhis = generatedPhis[DI->getBlock()];
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000748 std::set<Value*>& currTemps = generatedTemporaries[DI->getBlock()];
Owen Andersonb56fba02007-06-19 03:31:41 +0000749 std::set<Value*>& currAvail = availableOut[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000750
Owen Andersonb56fba02007-06-19 03:31:41 +0000751 BasicBlock* BB = DI->getBlock();
752
753 // A block inherits AVAIL_OUT from its dominator
754 if (DI->getIDom() != 0)
755 currAvail.insert(availableOut[DI->getIDom()->getBlock()].begin(),
756 availableOut[DI->getIDom()->getBlock()].end());
757
758
759 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
760 BI != BE; ++BI) {
761
762 // Handle PHI nodes...
763 if (PHINode* p = dyn_cast<PHINode>(BI)) {
764 VN.lookup_or_add(p);
765 currPhis.insert(p);
766
767 // Handle binary ops...
768 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(BI)) {
769 Value* leftValue = BO->getOperand(0);
770 Value* rightValue = BO->getOperand(1);
771
772 VN.lookup_or_add(BO);
773
774 if (isa<Instruction>(leftValue))
775 val_insert(currExps, leftValue);
776 if (isa<Instruction>(rightValue))
777 val_insert(currExps, rightValue);
778 val_insert(currExps, BO);
779
780 // Handle cmp ops...
781 } else if (CmpInst* C = dyn_cast<CmpInst>(BI)) {
782 Value* leftValue = C->getOperand(0);
783 Value* rightValue = C->getOperand(1);
784
785 VN.lookup_or_add(C);
786
787 if (isa<Instruction>(leftValue))
788 val_insert(currExps, leftValue);
789 if (isa<Instruction>(rightValue))
790 val_insert(currExps, rightValue);
791 val_insert(currExps, C);
792
793 // Handle unsupported ops
794 } else if (!BI->isTerminator()){
795 VN.lookup_or_add(BI);
796 currTemps.insert(BI);
797 }
798
799 if (!BI->isTerminator())
800 val_insert(currAvail, BI);
801 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000802 }
803
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000804 DOUT << "Maximal Set: ";
Owen Andersonb56fba02007-06-19 03:31:41 +0000805 dump_unique(VN.getMaximalValues());
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000806 DOUT << "\n";
807
Owen Anderson42769842007-06-12 16:57:50 +0000808 // If function has no exit blocks, only perform GVN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000809 PostDominatorTree &PDT = getAnalysis<PostDominatorTree>();
Owen Anderson42769842007-06-12 16:57:50 +0000810 if (PDT[&F.getEntryBlock()] == 0) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000811 elimination();
Owen Anderson42769842007-06-12 16:57:50 +0000812 cleanup();
813
814 return true;
815 }
816
Owen Anderson5fba6c12007-05-29 21:53:49 +0000817
Owen Anderson634a0632007-06-06 01:27:49 +0000818 // Phase 1, Part 2: calculate ANTIC_IN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000819
Owen Anderson0c423072007-05-29 23:26:30 +0000820 std::set<BasicBlock*> visited;
821
Owen Anderson5fba6c12007-05-29 21:53:49 +0000822 bool changed = true;
823 unsigned iterations = 0;
824 while (changed) {
825 changed = false;
Owen Andersonb56fba02007-06-19 03:31:41 +0000826 std::set<Value*> anticOut;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000827
828 // Top-down walk of the postdominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000829 for (df_iterator<DomTreeNode*> PDI =
Owen Andersonbe802402007-06-08 01:03:01 +0000830 df_begin(PDT.getRootNode()), E = df_end(PDT.getRootNode());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000831 PDI != E; ++PDI) {
832 BasicBlock* BB = PDI->getBlock();
Owen Andersond184c182007-06-11 16:25:17 +0000833 if (BB == 0)
834 continue;
835
Owen Anderson3df52992007-06-04 23:28:33 +0000836 DOUT << "Block: " << BB->getName() << "\n";
837 DOUT << "TMP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000838 dump(generatedTemporaries[BB]);
Owen Anderson3df52992007-06-04 23:28:33 +0000839 DOUT << "\n";
840
841 DOUT << "EXP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000842 dump_unique(generatedExpressions[BB]);
Owen Anderson0c423072007-05-29 23:26:30 +0000843 visited.insert(BB);
844
Owen Andersonb56fba02007-06-19 03:31:41 +0000845 std::set<Value*>& anticIn = anticipatedIn[BB];
846 std::set<Value*> old (anticIn.begin(), anticIn.end());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000847
848 if (BB->getTerminator()->getNumSuccessors() == 1) {
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000849 if (visited.find(BB->getTerminator()->getSuccessor(0)) ==
850 visited.end())
Owen Andersonb56fba02007-06-19 03:31:41 +0000851 phi_translate_set(VN.getMaximalValues(), BB,
852 BB->getTerminator()->getSuccessor(0),
Owen Andersona75dd4d2007-06-12 00:50:47 +0000853 anticOut);
Owen Anderson81d156e2007-05-31 00:42:15 +0000854 else
Owen Andersonb56fba02007-06-19 03:31:41 +0000855 phi_translate_set(anticipatedIn[BB->getTerminator()->getSuccessor(0)],
856 BB, BB->getTerminator()->getSuccessor(0),
857 anticOut);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000858 } else if (BB->getTerminator()->getNumSuccessors() > 1) {
Owen Anderson3df52992007-06-04 23:28:33 +0000859 BasicBlock* first = BB->getTerminator()->getSuccessor(0);
860 anticOut.insert(anticipatedIn[first].begin(),
861 anticipatedIn[first].end());
862 for (unsigned i = 1; i < BB->getTerminator()->getNumSuccessors(); ++i) {
Owen Anderson5fba6c12007-05-29 21:53:49 +0000863 BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
Owen Andersonb56fba02007-06-19 03:31:41 +0000864 std::set<Value*>& succAnticIn = anticipatedIn[currSucc];
Owen Anderson3df52992007-06-04 23:28:33 +0000865
Owen Andersonb56fba02007-06-19 03:31:41 +0000866 std::set<Value*> temp;
867 std::insert_iterator<std::set<Value*> > temp_ins(temp,
868 temp.begin());
Owen Anderson3df52992007-06-04 23:28:33 +0000869 std::set_intersection(anticOut.begin(), anticOut.end(),
870 succAnticIn.begin(), succAnticIn.end(),
Owen Andersonb56fba02007-06-19 03:31:41 +0000871 temp_ins);
Owen Anderson3df52992007-06-04 23:28:33 +0000872
873 anticOut.clear();
874 anticOut.insert(temp.begin(), temp.end());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000875 }
876 }
877
Owen Anderson3df52992007-06-04 23:28:33 +0000878 DOUT << "ANTIC_OUT: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000879 dump_unique(anticOut);
Owen Anderson3df52992007-06-04 23:28:33 +0000880 DOUT << "\n";
881
Owen Andersonb56fba02007-06-19 03:31:41 +0000882 std::set<Value*> S;
883 std::insert_iterator<std::set<Value*> > s_ins(S, S.begin());
884 std::set_difference(anticOut.begin(), anticOut.end(),
885 generatedTemporaries[BB].begin(),
886 generatedTemporaries[BB].end(),
887 s_ins);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000888
889 anticIn.clear();
Owen Andersonb56fba02007-06-19 03:31:41 +0000890 std::insert_iterator<std::set<Value*> > ai_ins(anticIn, anticIn.begin());
891 std::set_difference(generatedExpressions[BB].begin(),
892 generatedExpressions[BB].end(),
893 generatedTemporaries[BB].begin(),
894 generatedTemporaries[BB].end(),
895 ai_ins);
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000896
Owen Andersonb56fba02007-06-19 03:31:41 +0000897 for (std::set<Value*>::iterator I = S.begin(), E = S.end();
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000898 I != E; ++I) {
Owen Anderson1370faf2007-06-19 07:35:36 +0000899 // For non-opaque values, we should already have a value numbering.
900 // However, for opaques, such as constants within PHI nodes, it is
901 // possible that they have not yet received a number. Make sure they do
902 // so now.
903 uint32_t valNum = 0;
904 if (isa<BinaryOperator>(*I) || isa<CmpInst>(*I))
905 valNum = VN.lookup(*I);
906 else
907 valNum = VN.lookup_or_add(*I);
908 if (find_leader(anticIn, valNum) == 0)
Owen Andersonb56fba02007-06-19 03:31:41 +0000909 val_insert(anticIn, *I);
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000910 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000911
Owen Andersonbe802402007-06-08 01:03:01 +0000912 clean(anticIn);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000913
Owen Anderson3df52992007-06-04 23:28:33 +0000914 DOUT << "ANTIC_IN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000915 dump_unique(anticIn);
Owen Anderson3df52992007-06-04 23:28:33 +0000916 DOUT << "\n";
917
Owen Andersonddbe4302007-06-05 23:46:12 +0000918 if (old.size() != anticIn.size())
Owen Anderson5fba6c12007-05-29 21:53:49 +0000919 changed = true;
920
921 anticOut.clear();
922 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000923
Owen Anderson5fba6c12007-05-29 21:53:49 +0000924 iterations++;
925 }
926
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000927 DOUT << "Iterations: " << iterations << "\n";
Owen Anderson5fba6c12007-05-29 21:53:49 +0000928
929 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000930 DOUT << "Name: " << I->getName().c_str() << "\n";
931
932 DOUT << "TMP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000933 dump(generatedTemporaries[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000934 DOUT << "\n";
935
936 DOUT << "EXP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000937 dump_unique(generatedExpressions[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000938 DOUT << "\n";
939
940 DOUT << "ANTIC_IN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000941 dump_unique(anticipatedIn[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000942 DOUT << "\n";
Owen Anderson0b68cda2007-06-03 05:55:58 +0000943
944 DOUT << "AVAIL_OUT: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000945 dump_unique(availableOut[I]);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000946 DOUT << "\n";
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000947 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000948
Owen Anderson634a0632007-06-06 01:27:49 +0000949 // Phase 2: Insert
Owen Andersonbe802402007-06-08 01:03:01 +0000950 DOUT<< "\nPhase 2: Insertion\n";
951
Owen Andersonb56fba02007-06-19 03:31:41 +0000952 std::map<BasicBlock*, std::set<Value*> > new_sets;
Owen Andersonbe802402007-06-08 01:03:01 +0000953 unsigned i_iterations = 0;
954 bool new_stuff = true;
955 while (new_stuff) {
956 new_stuff = false;
957 DOUT << "Iteration: " << i_iterations << "\n\n";
958 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
959 E = df_end(DT.getRootNode()); DI != E; ++DI) {
960 BasicBlock* BB = DI->getBlock();
961
Owen Andersond184c182007-06-11 16:25:17 +0000962 if (BB == 0)
963 continue;
964
Owen Andersonb56fba02007-06-19 03:31:41 +0000965 std::set<Value*>& new_set = new_sets[BB];
966 std::set<Value*>& availOut = availableOut[BB];
967 std::set<Value*>& anticIn = anticipatedIn[BB];
Owen Andersonbe802402007-06-08 01:03:01 +0000968
Owen Anderson55994f22007-06-08 20:44:02 +0000969 new_set.clear();
970
Owen Andersonbe802402007-06-08 01:03:01 +0000971 // Replace leaders with leaders inherited from dominator
972 if (DI->getIDom() != 0) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000973 std::set<Value*>& dom_set = new_sets[DI->getIDom()->getBlock()];
974 for (std::set<Value*>::iterator I = dom_set.begin(),
Owen Andersonbe802402007-06-08 01:03:01 +0000975 E = dom_set.end(); I != E; ++I) {
976 new_set.insert(*I);
Owen Andersonb56fba02007-06-19 03:31:41 +0000977 val_replace(availOut, *I);
Owen Andersonbe802402007-06-08 01:03:01 +0000978 }
979 }
980
981 // If there is more than one predecessor...
982 if (pred_begin(BB) != pred_end(BB) && ++pred_begin(BB) != pred_end(BB)) {
983 std::vector<Value*> workList;
984 topo_sort(anticIn, workList);
985
986 DOUT << "Merge Block: " << BB->getName() << "\n";
987 DOUT << "ANTIC_IN: ";
988 dump_unique(anticIn);
989 DOUT << "\n";
990
Owen Andersona75dd4d2007-06-12 00:50:47 +0000991 for (unsigned i = 0; i < workList.size(); ++i) {
992 Value* e = workList[i];
Owen Andersonbe802402007-06-08 01:03:01 +0000993
Owen Anderson223718c2007-06-09 18:35:31 +0000994 if (isa<BinaryOperator>(e) || isa<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000995 if (find_leader(availableOut[DI->getIDom()->getBlock()], VN.lookup(e)) != 0)
Owen Andersonbe802402007-06-08 01:03:01 +0000996 continue;
997
998 std::map<BasicBlock*, Value*> avail;
999 bool by_some = false;
1000 int num_avail = 0;
1001
1002 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;
1003 ++PI) {
Owen Anderson4036ad42007-06-12 22:43:57 +00001004 Value *e2 = phi_translate(e, *PI, BB);
Owen Andersonb56fba02007-06-19 03:31:41 +00001005 Value *e3 = find_leader(availableOut[*PI], VN.lookup(e2));
Owen Andersonbe802402007-06-08 01:03:01 +00001006
1007 if (e3 == 0) {
1008 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1009 if (av != avail.end())
1010 avail.erase(av);
1011 avail.insert(std::make_pair(*PI, e2));
1012 } else {
1013 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1014 if (av != avail.end())
1015 avail.erase(av);
1016 avail.insert(std::make_pair(*PI, e3));
1017
1018 by_some = true;
1019 num_avail++;
1020 }
1021 }
1022
1023 if (by_some &&
1024 num_avail < std::distance(pred_begin(BB), pred_end(BB))) {
1025 DOUT << "Processing Value: ";
1026 DEBUG(e->dump());
1027 DOUT << "\n\n";
1028
1029 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1030 PI != PE; ++PI) {
1031 Value* e2 = avail[*PI];
Owen Andersonb56fba02007-06-19 03:31:41 +00001032 if (!find_leader(availableOut[*PI], VN.lookup(e2))) {
Owen Anderson223718c2007-06-09 18:35:31 +00001033 User* U = cast<User>(e2);
Owen Andersonbe802402007-06-08 01:03:01 +00001034
1035 Value* s1 = 0;
Owen Anderson658f2c42007-06-16 00:26:54 +00001036 if (isa<BinaryOperator>(U->getOperand(0)) ||
1037 isa<CmpInst>(U->getOperand(0)))
Owen Andersonb56fba02007-06-19 03:31:41 +00001038 s1 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(0)));
Owen Andersonbe802402007-06-08 01:03:01 +00001039 else
Owen Anderson223718c2007-06-09 18:35:31 +00001040 s1 = U->getOperand(0);
Owen Andersonbe802402007-06-08 01:03:01 +00001041
1042 Value* s2 = 0;
Owen Anderson658f2c42007-06-16 00:26:54 +00001043 if (isa<BinaryOperator>(U->getOperand(1)) ||
1044 isa<CmpInst>(U->getOperand(1)))
Owen Andersonb56fba02007-06-19 03:31:41 +00001045 s2 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(1)));
Owen Andersonbe802402007-06-08 01:03:01 +00001046 else
Owen Anderson223718c2007-06-09 18:35:31 +00001047 s2 = U->getOperand(1);
Owen Andersonbe802402007-06-08 01:03:01 +00001048
Owen Anderson223718c2007-06-09 18:35:31 +00001049 Value* newVal = 0;
1050 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
1051 newVal = BinaryOperator::create(BO->getOpcode(),
Owen Andersonbe802402007-06-08 01:03:01 +00001052 s1, s2,
1053 BO->getName()+".gvnpre",
1054 (*PI)->getTerminator());
Owen Anderson223718c2007-06-09 18:35:31 +00001055 else if (CmpInst* C = dyn_cast<CmpInst>(U))
1056 newVal = CmpInst::create(C->getOpcode(),
1057 C->getPredicate(),
1058 s1, s2,
1059 C->getName()+".gvnpre",
1060 (*PI)->getTerminator());
1061
Owen Andersonb56fba02007-06-19 03:31:41 +00001062 VN.add(newVal, VN.lookup(U));
Owen Anderson55994f22007-06-08 20:44:02 +00001063
Owen Andersonb56fba02007-06-19 03:31:41 +00001064 std::set<Value*>& predAvail = availableOut[*PI];
1065 val_replace(predAvail, newVal);
Owen Andersonbe802402007-06-08 01:03:01 +00001066
1067 DOUT << "Creating value: " << std::hex << newVal << std::dec << "\n";
1068
1069 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1070 if (av != avail.end())
1071 avail.erase(av);
1072 avail.insert(std::make_pair(*PI, newVal));
Owen Anderson7d76b2a2007-06-08 22:02:36 +00001073
1074 ++NumInsertedVals;
Owen Andersonbe802402007-06-08 01:03:01 +00001075 }
1076 }
1077
1078 PHINode* p = 0;
1079
1080 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1081 PI != PE; ++PI) {
1082 if (p == 0)
1083 p = new PHINode(avail[*PI]->getType(), "gvnpre-join",
1084 BB->begin());
1085
1086 p->addIncoming(avail[*PI], *PI);
1087 }
1088
Owen Andersonb56fba02007-06-19 03:31:41 +00001089 VN.add(p, VN.lookup(e));
Owen Andersonbe802402007-06-08 01:03:01 +00001090 DOUT << "Creating value: " << std::hex << p << std::dec << "\n";
1091
Owen Andersonb56fba02007-06-19 03:31:41 +00001092 val_replace(availOut, p);
Owen Andersonbe802402007-06-08 01:03:01 +00001093 availOut.insert(p);
Owen Anderson55994f22007-06-08 20:44:02 +00001094
Owen Andersonbe802402007-06-08 01:03:01 +00001095 new_stuff = true;
1096
1097 DOUT << "Preds After Processing: ";
1098 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1099 PI != PE; ++PI)
1100 DEBUG((*PI)->dump());
1101 DOUT << "\n\n";
1102
1103 DOUT << "Merge Block After Processing: ";
1104 DEBUG(BB->dump());
1105 DOUT << "\n\n";
1106
1107 new_set.insert(p);
Owen Anderson7d76b2a2007-06-08 22:02:36 +00001108
1109 ++NumInsertedPhis;
Owen Andersonbe802402007-06-08 01:03:01 +00001110 }
1111 }
1112 }
1113 }
1114 }
1115 i_iterations++;
1116 }
Owen Anderson634a0632007-06-06 01:27:49 +00001117
1118 // Phase 3: Eliminate
Owen Anderson4036ad42007-06-12 22:43:57 +00001119 elimination();
Owen Anderson55994f22007-06-08 20:44:02 +00001120
Owen Andersonbe802402007-06-08 01:03:01 +00001121 // Phase 4: Cleanup
Owen Anderson42769842007-06-12 16:57:50 +00001122 cleanup();
Owen Andersonbe802402007-06-08 01:03:01 +00001123
Owen Anderson42769842007-06-12 16:57:50 +00001124 return true;
Owen Anderson5fba6c12007-05-29 21:53:49 +00001125}