blob: a6e52ae187bd6d9187e219ebb1d0e18b1a94da2f [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 clean(std::set<Value*>& set);
342 Value* find_leader(std::set<Value*>& vals,
343 uint32_t v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000344 Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ);
Owen Andersonb56fba02007-06-19 03:31:41 +0000345 void phi_translate_set(std::set<Value*>& anticIn, BasicBlock* pred,
346 BasicBlock* succ, std::set<Value*>& out);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000347
Owen Andersonb56fba02007-06-19 03:31:41 +0000348 void topo_sort(std::set<Value*>& set,
Owen Anderson0b68cda2007-06-03 05:55:58 +0000349 std::vector<Value*>& vec);
Owen Anderson331bf6a2007-05-31 22:44:11 +0000350
Owen Anderson5fba6c12007-05-29 21:53:49 +0000351 // For a given block, calculate the generated expressions, temporaries,
352 // and the AVAIL_OUT set
Owen Anderson42769842007-06-12 16:57:50 +0000353 void cleanup();
Owen Anderson4036ad42007-06-12 22:43:57 +0000354 void elimination();
Owen Andersondd998e12007-06-18 04:42:29 +0000355
Owen Andersonb56fba02007-06-19 03:31:41 +0000356 void val_insert(std::set<Value*>& s, Value* v);
357 void val_replace(std::set<Value*>& s, Value* v);
Owen Andersondd998e12007-06-18 04:42:29 +0000358 bool dependsOnInvoke(Value* V);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000359
360 };
361
362 char GVNPRE::ID = 0;
363
364}
365
366FunctionPass *llvm::createGVNPREPass() { return new GVNPRE(); }
367
368RegisterPass<GVNPRE> X("gvnpre",
369 "Global Value Numbering/Partial Redundancy Elimination");
370
Owen Anderson5fba6c12007-05-29 21:53:49 +0000371
Owen Anderson7d76b2a2007-06-08 22:02:36 +0000372STATISTIC(NumInsertedVals, "Number of values inserted");
373STATISTIC(NumInsertedPhis, "Number of PHI nodes inserted");
374STATISTIC(NumEliminated, "Number of redundant instructions eliminated");
375
Owen Andersonb56fba02007-06-19 03:31:41 +0000376Value* GVNPRE::find_leader(std::set<Value*>& vals, uint32_t v) {
377 for (std::set<Value*>::iterator I = vals.begin(), E = vals.end();
378 I != E; ++I)
379 if (v == VN.lookup(*I))
Owen Anderson0b68cda2007-06-03 05:55:58 +0000380 return *I;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000381
Owen Anderson0b68cda2007-06-03 05:55:58 +0000382 return 0;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000383}
384
Owen Andersonb56fba02007-06-19 03:31:41 +0000385void GVNPRE::val_insert(std::set<Value*>& s, Value* v) {
386 uint32_t num = VN.lookup(v);
387 Value* leader = find_leader(s, num);
388 if (leader == 0)
389 s.insert(v);
390}
391
392void GVNPRE::val_replace(std::set<Value*>& s, Value* v) {
393 uint32_t num = VN.lookup(v);
394 Value* leader = find_leader(s, num);
395 while (leader != 0) {
396 s.erase(leader);
397 leader = find_leader(s, num);
398 }
399 s.insert(v);
400}
401
Owen Anderson4036ad42007-06-12 22:43:57 +0000402Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
Owen Anderson38b6b222007-06-04 18:05:26 +0000403 if (V == 0)
404 return 0;
405
406 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000407 Value* newOp1 = 0;
408 if (isa<Instruction>(BO->getOperand(0)))
409 newOp1 = phi_translate(find_leader(anticipatedIn[succ],
410 VN.lookup(BO->getOperand(0))),
411 pred, succ);
412 else
413 newOp1 = BO->getOperand(0);
414
Owen Anderson38b6b222007-06-04 18:05:26 +0000415 if (newOp1 == 0)
416 return 0;
417
Owen Andersonb56fba02007-06-19 03:31:41 +0000418 Value* newOp2 = 0;
419 if (isa<Instruction>(BO->getOperand(1)))
420 newOp2 = phi_translate(find_leader(anticipatedIn[succ],
421 VN.lookup(BO->getOperand(1))),
422 pred, succ);
423 else
424 newOp2 = BO->getOperand(1);
425
Owen Anderson38b6b222007-06-04 18:05:26 +0000426 if (newOp2 == 0)
427 return 0;
428
429 if (newOp1 != BO->getOperand(0) || newOp2 != BO->getOperand(1)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000430 Instruction* newVal = BinaryOperator::create(BO->getOpcode(),
Owen Anderson38b6b222007-06-04 18:05:26 +0000431 newOp1, newOp2,
Owen Anderson91c54952007-06-19 05:37:32 +0000432 BO->getName()+".expr");
Owen Anderson55994f22007-06-08 20:44:02 +0000433
Owen Andersonb56fba02007-06-19 03:31:41 +0000434 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson4036ad42007-06-12 22:43:57 +0000435
Owen Andersonb56fba02007-06-19 03:31:41 +0000436 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000437 if (leader == 0) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000438 createdExpressions.push_back(newVal);
Owen Anderson38b6b222007-06-04 18:05:26 +0000439 return newVal;
Owen Andersonc8472092007-06-05 22:11:49 +0000440 } else {
Owen Anderson91c54952007-06-19 05:37:32 +0000441 VN.erase(newVal);
Owen Andersonc8472092007-06-05 22:11:49 +0000442 delete newVal;
Owen Anderson4036ad42007-06-12 22:43:57 +0000443 return leader;
Owen Andersonc8472092007-06-05 22:11:49 +0000444 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000445 }
446 } else if (PHINode* P = dyn_cast<PHINode>(V)) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000447 if (P->getParent() == succ)
Owen Anderson38b6b222007-06-04 18:05:26 +0000448 return P->getIncomingValueForBlock(pred);
Owen Anderson223718c2007-06-09 18:35:31 +0000449 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000450 Value* newOp1 = 0;
451 if (isa<Instruction>(C->getOperand(0)))
452 newOp1 = phi_translate(find_leader(anticipatedIn[succ],
453 VN.lookup(C->getOperand(0))),
454 pred, succ);
455 else
456 newOp1 = C->getOperand(0);
457
Owen Anderson223718c2007-06-09 18:35:31 +0000458 if (newOp1 == 0)
459 return 0;
460
Owen Andersonb56fba02007-06-19 03:31:41 +0000461 Value* newOp2 = 0;
462 if (isa<Instruction>(C->getOperand(1)))
463 newOp2 = phi_translate(find_leader(anticipatedIn[succ],
464 VN.lookup(C->getOperand(1))),
465 pred, succ);
466 else
467 newOp2 = C->getOperand(1);
468
Owen Anderson223718c2007-06-09 18:35:31 +0000469 if (newOp2 == 0)
470 return 0;
471
472 if (newOp1 != C->getOperand(0) || newOp2 != C->getOperand(1)) {
473 Instruction* newVal = CmpInst::create(C->getOpcode(),
474 C->getPredicate(),
475 newOp1, newOp2,
Owen Anderson91c54952007-06-19 05:37:32 +0000476 C->getName()+".expr");
Owen Anderson223718c2007-06-09 18:35:31 +0000477
Owen Andersonb56fba02007-06-19 03:31:41 +0000478 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson4036ad42007-06-12 22:43:57 +0000479
Owen Andersonb56fba02007-06-19 03:31:41 +0000480 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000481 if (leader == 0) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000482 createdExpressions.push_back(newVal);
Owen Anderson223718c2007-06-09 18:35:31 +0000483 return newVal;
484 } else {
Owen Anderson91c54952007-06-19 05:37:32 +0000485 VN.erase(newVal);
Owen Anderson223718c2007-06-09 18:35:31 +0000486 delete newVal;
Owen Anderson4036ad42007-06-12 22:43:57 +0000487 return leader;
Owen Anderson223718c2007-06-09 18:35:31 +0000488 }
489 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000490 }
491
492 return V;
493}
494
Owen Andersonb56fba02007-06-19 03:31:41 +0000495void GVNPRE::phi_translate_set(std::set<Value*>& anticIn,
Owen Andersona75dd4d2007-06-12 00:50:47 +0000496 BasicBlock* pred, BasicBlock* succ,
Owen Andersonb56fba02007-06-19 03:31:41 +0000497 std::set<Value*>& out) {
498 for (std::set<Value*>::iterator I = anticIn.begin(),
Owen Anderson38b6b222007-06-04 18:05:26 +0000499 E = anticIn.end(); I != E; ++I) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000500 Value* V = phi_translate(*I, pred, succ);
Owen Anderson38b6b222007-06-04 18:05:26 +0000501 if (V != 0)
502 out.insert(V);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000503 }
504}
505
Owen Andersondd998e12007-06-18 04:42:29 +0000506bool GVNPRE::dependsOnInvoke(Value* V) {
Owen Anderson2320d432007-06-19 23:07:16 +0000507 if (PHINode* p = dyn_cast<PHINode>(V)) {
508 for (PHINode::op_iterator I = p->op_begin(), E = p->op_end(); I != E; ++I)
509 if (isa<InvokeInst>(*I))
Owen Andersondd998e12007-06-18 04:42:29 +0000510 return true;
Owen Anderson2320d432007-06-19 23:07:16 +0000511 return false;
512 } else {
513 return false;
Owen Anderson658f2c42007-06-16 00:26:54 +0000514 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000515}
516
Owen Anderson5fba6c12007-05-29 21:53:49 +0000517// Remove all expressions whose operands are not themselves in the set
Owen Andersonb56fba02007-06-19 03:31:41 +0000518void GVNPRE::clean(std::set<Value*>& set) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000519 std::vector<Value*> worklist;
Owen Andersonbe802402007-06-08 01:03:01 +0000520 topo_sort(set, worklist);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000521
Owen Andersonbe802402007-06-08 01:03:01 +0000522 for (unsigned i = 0; i < worklist.size(); ++i) {
523 Value* v = worklist[i];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000524
Owen Anderson0b68cda2007-06-03 05:55:58 +0000525 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(v)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000526 bool lhsValid = !isa<Instruction>(BO->getOperand(0));
527 if (!lhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000528 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonbe802402007-06-08 01:03:01 +0000529 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000530 if (VN.lookup(*I) == VN.lookup(BO->getOperand(0))) {
Owen Andersonbe802402007-06-08 01:03:01 +0000531 lhsValid = true;
532 break;
533 }
Owen Andersonb364b412007-06-18 04:30:44 +0000534 if (lhsValid)
535 lhsValid = !dependsOnInvoke(BO->getOperand(0));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000536
Owen Andersonbe802402007-06-08 01:03:01 +0000537 bool rhsValid = !isa<Instruction>(BO->getOperand(1));
538 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000539 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonf1c04e12007-06-18 04:31:21 +0000540 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000541 if (VN.lookup(*I) == VN.lookup(BO->getOperand(1))) {
Owen Andersonf1c04e12007-06-18 04:31:21 +0000542 rhsValid = true;
543 break;
544 }
Owen Andersonb364b412007-06-18 04:30:44 +0000545 if (rhsValid)
546 rhsValid = !dependsOnInvoke(BO->getOperand(1));
Owen Anderson5fba6c12007-05-29 21:53:49 +0000547
Owen Anderson0b68cda2007-06-03 05:55:58 +0000548 if (!lhsValid || !rhsValid)
549 set.erase(BO);
Owen Anderson223718c2007-06-09 18:35:31 +0000550 } else if (CmpInst* C = dyn_cast<CmpInst>(v)) {
551 bool lhsValid = !isa<Instruction>(C->getOperand(0));
552 if (!lhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000553 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000554 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000555 if (VN.lookup(*I) == VN.lookup(C->getOperand(0))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000556 lhsValid = true;
557 break;
558 }
Owen Anderson2320d432007-06-19 23:07:16 +0000559 if (lhsValid)
560 lhsValid = !dependsOnInvoke(C->getOperand(0));
Owen Anderson658f2c42007-06-16 00:26:54 +0000561
Owen Anderson223718c2007-06-09 18:35:31 +0000562 bool rhsValid = !isa<Instruction>(C->getOperand(1));
563 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000564 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000565 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000566 if (VN.lookup(*I) == VN.lookup(C->getOperand(1))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000567 rhsValid = true;
568 break;
569 }
Owen Anderson2320d432007-06-19 23:07:16 +0000570 if (rhsValid)
571 rhsValid = !dependsOnInvoke(C->getOperand(1));
Owen Anderson223718c2007-06-09 18:35:31 +0000572
573 if (!lhsValid || !rhsValid)
574 set.erase(C);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000575 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000576 }
577}
578
Owen Andersonb56fba02007-06-19 03:31:41 +0000579void GVNPRE::topo_sort(std::set<Value*>& set,
Owen Anderson0b68cda2007-06-03 05:55:58 +0000580 std::vector<Value*>& vec) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000581 std::set<Value*> toErase;
582 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000583 I != E; ++I) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000584 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000585 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
586 if (VN.lookup(BO->getOperand(0)) == VN.lookup(*SI) ||
587 VN.lookup(BO->getOperand(1)) == VN.lookup(*SI)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000588 toErase.insert(*SI);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000589 }
Owen Anderson223718c2007-06-09 18:35:31 +0000590 }
591 else if (CmpInst* C = dyn_cast<CmpInst>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000592 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
593 if (VN.lookup(C->getOperand(0)) == VN.lookup(*SI) ||
594 VN.lookup(C->getOperand(1)) == VN.lookup(*SI)) {
Owen Anderson223718c2007-06-09 18:35:31 +0000595 toErase.insert(*SI);
596 }
597 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000598 }
599
Owen Anderson0b68cda2007-06-03 05:55:58 +0000600 std::vector<Value*> Q;
Owen Andersonb56fba02007-06-19 03:31:41 +0000601 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonbe802402007-06-08 01:03:01 +0000602 I != E; ++I) {
603 if (toErase.find(*I) == toErase.end())
604 Q.push_back(*I);
605 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000606
Owen Andersonddbe4302007-06-05 23:46:12 +0000607 std::set<Value*> visited;
Owen Anderson331bf6a2007-05-31 22:44:11 +0000608 while (!Q.empty()) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000609 Value* e = Q.back();
610
611 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000612 Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
613 Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000614
Owen Andersonddbe4302007-06-05 23:46:12 +0000615 if (l != 0 && isa<Instruction>(l) &&
616 visited.find(l) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000617 Q.push_back(l);
Owen Andersonddbe4302007-06-05 23:46:12 +0000618 else if (r != 0 && isa<Instruction>(r) &&
619 visited.find(r) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000620 Q.push_back(r);
621 else {
622 vec.push_back(e);
623 visited.insert(e);
624 Q.pop_back();
625 }
Owen Anderson223718c2007-06-09 18:35:31 +0000626 } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000627 Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
628 Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
Owen Anderson223718c2007-06-09 18:35:31 +0000629
630 if (l != 0 && isa<Instruction>(l) &&
631 visited.find(l) == visited.end())
632 Q.push_back(l);
633 else if (r != 0 && isa<Instruction>(r) &&
634 visited.find(r) == visited.end())
635 Q.push_back(r);
636 else {
637 vec.push_back(e);
638 visited.insert(e);
639 Q.pop_back();
640 }
Owen Anderson0b68cda2007-06-03 05:55:58 +0000641 } else {
Owen Anderson331bf6a2007-05-31 22:44:11 +0000642 visited.insert(e);
643 vec.push_back(e);
644 Q.pop_back();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000645 }
646 }
647}
648
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000649
Owen Anderson2e5efc32007-06-08 01:52:45 +0000650void GVNPRE::dump(const std::set<Value*>& s) const {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000651 DOUT << "{ ";
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000652 for (std::set<Value*>::iterator I = s.begin(), E = s.end();
653 I != E; ++I) {
654 DEBUG((*I)->dump());
655 }
656 DOUT << "}\n\n";
657}
658
Owen Anderson4036ad42007-06-12 22:43:57 +0000659void GVNPRE::elimination() {
Owen Anderson42769842007-06-12 16:57:50 +0000660 DOUT << "\n\nPhase 3: Elimination\n\n";
661
662 std::vector<std::pair<Instruction*, Value*> > replace;
663 std::vector<Instruction*> erase;
664
665 DominatorTree& DT = getAnalysis<DominatorTree>();
666
667 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
668 E = df_end(DT.getRootNode()); DI != E; ++DI) {
669 BasicBlock* BB = DI->getBlock();
670
671 DOUT << "Block: " << BB->getName() << "\n";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000672 dump(availableOut[BB]);
Owen Anderson42769842007-06-12 16:57:50 +0000673 DOUT << "\n\n";
674
675 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
676 BI != BE; ++BI) {
677
678 if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000679 Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
Owen Anderson42769842007-06-12 16:57:50 +0000680
681 if (leader != 0)
682 if (Instruction* Instr = dyn_cast<Instruction>(leader))
683 if (Instr->getParent() != 0 && Instr != BI) {
684 replace.push_back(std::make_pair(BI, leader));
685 erase.push_back(BI);
686 ++NumEliminated;
687 }
688 }
689 }
690 }
691
692 while (!replace.empty()) {
693 std::pair<Instruction*, Value*> rep = replace.back();
694 replace.pop_back();
695 rep.first->replaceAllUsesWith(rep.second);
696 }
697
698 for (std::vector<Instruction*>::iterator I = erase.begin(), E = erase.end();
699 I != E; ++I)
700 (*I)->eraseFromParent();
701}
702
703
704void GVNPRE::cleanup() {
705 while (!createdExpressions.empty()) {
706 Instruction* I = createdExpressions.back();
707 createdExpressions.pop_back();
708
709 delete I;
710 }
711}
712
Owen Anderson5fba6c12007-05-29 21:53:49 +0000713bool GVNPRE::runOnFunction(Function &F) {
Owen Andersonbe802402007-06-08 01:03:01 +0000714 VN.clear();
Owen Andersonbe802402007-06-08 01:03:01 +0000715 createdExpressions.clear();
Owen Anderson4036ad42007-06-12 22:43:57 +0000716 availableOut.clear();
717 anticipatedIn.clear();
Owen Andersondd998e12007-06-18 04:42:29 +0000718 invokeDep.clear();
Owen Anderson5fba6c12007-05-29 21:53:49 +0000719
Owen Andersonb56fba02007-06-19 03:31:41 +0000720 std::map<BasicBlock*, std::set<Value*> > generatedExpressions;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000721 std::map<BasicBlock*, std::set<PHINode*> > generatedPhis;
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000722 std::map<BasicBlock*, std::set<Value*> > generatedTemporaries;
Owen Anderson4036ad42007-06-12 22:43:57 +0000723
Owen Anderson5fba6c12007-05-29 21:53:49 +0000724
725 DominatorTree &DT = getAnalysis<DominatorTree>();
726
Owen Anderson634a0632007-06-06 01:27:49 +0000727 // Phase 1: BuildSets
728
729 // Phase 1, Part 1: calculate AVAIL_OUT
Owen Anderson5fba6c12007-05-29 21:53:49 +0000730
731 // Top-down walk of the dominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000732 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
Owen Anderson5fba6c12007-05-29 21:53:49 +0000733 E = df_end(DT.getRootNode()); DI != E; ++DI) {
734
735 // Get the sets to update for this block
Owen Andersonb56fba02007-06-19 03:31:41 +0000736 std::set<Value*>& currExps = generatedExpressions[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000737 std::set<PHINode*>& currPhis = generatedPhis[DI->getBlock()];
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000738 std::set<Value*>& currTemps = generatedTemporaries[DI->getBlock()];
Owen Andersonb56fba02007-06-19 03:31:41 +0000739 std::set<Value*>& currAvail = availableOut[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000740
Owen Andersonb56fba02007-06-19 03:31:41 +0000741 BasicBlock* BB = DI->getBlock();
742
743 // A block inherits AVAIL_OUT from its dominator
744 if (DI->getIDom() != 0)
745 currAvail.insert(availableOut[DI->getIDom()->getBlock()].begin(),
746 availableOut[DI->getIDom()->getBlock()].end());
747
748
749 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
750 BI != BE; ++BI) {
751
752 // Handle PHI nodes...
753 if (PHINode* p = dyn_cast<PHINode>(BI)) {
754 VN.lookup_or_add(p);
755 currPhis.insert(p);
756
757 // Handle binary ops...
758 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(BI)) {
759 Value* leftValue = BO->getOperand(0);
760 Value* rightValue = BO->getOperand(1);
761
762 VN.lookup_or_add(BO);
763
764 if (isa<Instruction>(leftValue))
765 val_insert(currExps, leftValue);
766 if (isa<Instruction>(rightValue))
767 val_insert(currExps, rightValue);
768 val_insert(currExps, BO);
769
770 // Handle cmp ops...
771 } else if (CmpInst* C = dyn_cast<CmpInst>(BI)) {
772 Value* leftValue = C->getOperand(0);
773 Value* rightValue = C->getOperand(1);
774
775 VN.lookup_or_add(C);
776
777 if (isa<Instruction>(leftValue))
778 val_insert(currExps, leftValue);
779 if (isa<Instruction>(rightValue))
780 val_insert(currExps, rightValue);
781 val_insert(currExps, C);
782
783 // Handle unsupported ops
784 } else if (!BI->isTerminator()){
785 VN.lookup_or_add(BI);
786 currTemps.insert(BI);
787 }
788
789 if (!BI->isTerminator())
790 val_insert(currAvail, BI);
791 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000792 }
793
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000794 DOUT << "Maximal Set: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000795 dump(VN.getMaximalValues());
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000796 DOUT << "\n";
797
Owen Anderson42769842007-06-12 16:57:50 +0000798 // If function has no exit blocks, only perform GVN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000799 PostDominatorTree &PDT = getAnalysis<PostDominatorTree>();
Owen Anderson42769842007-06-12 16:57:50 +0000800 if (PDT[&F.getEntryBlock()] == 0) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000801 elimination();
Owen Anderson42769842007-06-12 16:57:50 +0000802 cleanup();
803
804 return true;
805 }
806
Owen Anderson5fba6c12007-05-29 21:53:49 +0000807
Owen Anderson634a0632007-06-06 01:27:49 +0000808 // Phase 1, Part 2: calculate ANTIC_IN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000809
Owen Anderson0c423072007-05-29 23:26:30 +0000810 std::set<BasicBlock*> visited;
811
Owen Anderson5fba6c12007-05-29 21:53:49 +0000812 bool changed = true;
813 unsigned iterations = 0;
814 while (changed) {
815 changed = false;
Owen Andersonb56fba02007-06-19 03:31:41 +0000816 std::set<Value*> anticOut;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000817
818 // Top-down walk of the postdominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000819 for (df_iterator<DomTreeNode*> PDI =
Owen Andersonbe802402007-06-08 01:03:01 +0000820 df_begin(PDT.getRootNode()), E = df_end(PDT.getRootNode());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000821 PDI != E; ++PDI) {
822 BasicBlock* BB = PDI->getBlock();
Owen Andersond184c182007-06-11 16:25:17 +0000823 if (BB == 0)
824 continue;
825
Owen Anderson3df52992007-06-04 23:28:33 +0000826 DOUT << "Block: " << BB->getName() << "\n";
827 DOUT << "TMP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000828 dump(generatedTemporaries[BB]);
Owen Anderson3df52992007-06-04 23:28:33 +0000829 DOUT << "\n";
830
831 DOUT << "EXP_GEN: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000832 dump(generatedExpressions[BB]);
Owen Anderson0c423072007-05-29 23:26:30 +0000833 visited.insert(BB);
834
Owen Andersonb56fba02007-06-19 03:31:41 +0000835 std::set<Value*>& anticIn = anticipatedIn[BB];
836 std::set<Value*> old (anticIn.begin(), anticIn.end());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000837
838 if (BB->getTerminator()->getNumSuccessors() == 1) {
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000839 if (visited.find(BB->getTerminator()->getSuccessor(0)) ==
840 visited.end())
Owen Andersonb56fba02007-06-19 03:31:41 +0000841 phi_translate_set(VN.getMaximalValues(), BB,
842 BB->getTerminator()->getSuccessor(0),
Owen Andersona75dd4d2007-06-12 00:50:47 +0000843 anticOut);
Owen Anderson81d156e2007-05-31 00:42:15 +0000844 else
Owen Andersonb56fba02007-06-19 03:31:41 +0000845 phi_translate_set(anticipatedIn[BB->getTerminator()->getSuccessor(0)],
846 BB, BB->getTerminator()->getSuccessor(0),
847 anticOut);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000848 } else if (BB->getTerminator()->getNumSuccessors() > 1) {
Owen Anderson3df52992007-06-04 23:28:33 +0000849 BasicBlock* first = BB->getTerminator()->getSuccessor(0);
850 anticOut.insert(anticipatedIn[first].begin(),
851 anticipatedIn[first].end());
852 for (unsigned i = 1; i < BB->getTerminator()->getNumSuccessors(); ++i) {
Owen Anderson5fba6c12007-05-29 21:53:49 +0000853 BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
Owen Andersonb56fba02007-06-19 03:31:41 +0000854 std::set<Value*>& succAnticIn = anticipatedIn[currSucc];
Owen Anderson3df52992007-06-04 23:28:33 +0000855
Owen Andersonb56fba02007-06-19 03:31:41 +0000856 std::set<Value*> temp;
857 std::insert_iterator<std::set<Value*> > temp_ins(temp,
858 temp.begin());
Owen Anderson3df52992007-06-04 23:28:33 +0000859 std::set_intersection(anticOut.begin(), anticOut.end(),
860 succAnticIn.begin(), succAnticIn.end(),
Owen Andersonb56fba02007-06-19 03:31:41 +0000861 temp_ins);
Owen Anderson3df52992007-06-04 23:28:33 +0000862
863 anticOut.clear();
864 anticOut.insert(temp.begin(), temp.end());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000865 }
866 }
867
Owen Anderson3df52992007-06-04 23:28:33 +0000868 DOUT << "ANTIC_OUT: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000869 dump(anticOut);
Owen Anderson3df52992007-06-04 23:28:33 +0000870 DOUT << "\n";
871
Owen Andersonb56fba02007-06-19 03:31:41 +0000872 std::set<Value*> S;
873 std::insert_iterator<std::set<Value*> > s_ins(S, S.begin());
874 std::set_difference(anticOut.begin(), anticOut.end(),
875 generatedTemporaries[BB].begin(),
876 generatedTemporaries[BB].end(),
877 s_ins);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000878
879 anticIn.clear();
Owen Andersonb56fba02007-06-19 03:31:41 +0000880 std::insert_iterator<std::set<Value*> > ai_ins(anticIn, anticIn.begin());
881 std::set_difference(generatedExpressions[BB].begin(),
882 generatedExpressions[BB].end(),
883 generatedTemporaries[BB].begin(),
884 generatedTemporaries[BB].end(),
885 ai_ins);
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000886
Owen Andersonb56fba02007-06-19 03:31:41 +0000887 for (std::set<Value*>::iterator I = S.begin(), E = S.end();
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000888 I != E; ++I) {
Owen Anderson1370faf2007-06-19 07:35:36 +0000889 // For non-opaque values, we should already have a value numbering.
890 // However, for opaques, such as constants within PHI nodes, it is
891 // possible that they have not yet received a number. Make sure they do
892 // so now.
893 uint32_t valNum = 0;
894 if (isa<BinaryOperator>(*I) || isa<CmpInst>(*I))
895 valNum = VN.lookup(*I);
896 else
897 valNum = VN.lookup_or_add(*I);
898 if (find_leader(anticIn, valNum) == 0)
Owen Andersonb56fba02007-06-19 03:31:41 +0000899 val_insert(anticIn, *I);
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000900 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000901
Owen Andersonbe802402007-06-08 01:03:01 +0000902 clean(anticIn);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000903
Owen Anderson3df52992007-06-04 23:28:33 +0000904 DOUT << "ANTIC_IN: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000905 dump(anticIn);
Owen Anderson3df52992007-06-04 23:28:33 +0000906 DOUT << "\n";
907
Owen Andersonddbe4302007-06-05 23:46:12 +0000908 if (old.size() != anticIn.size())
Owen Anderson5fba6c12007-05-29 21:53:49 +0000909 changed = true;
910
911 anticOut.clear();
912 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000913
Owen Anderson5fba6c12007-05-29 21:53:49 +0000914 iterations++;
915 }
916
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000917 DOUT << "Iterations: " << iterations << "\n";
Owen Anderson5fba6c12007-05-29 21:53:49 +0000918
919 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000920 DOUT << "Name: " << I->getName().c_str() << "\n";
921
922 DOUT << "TMP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000923 dump(generatedTemporaries[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000924 DOUT << "\n";
925
926 DOUT << "EXP_GEN: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000927 dump(generatedExpressions[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000928 DOUT << "\n";
929
930 DOUT << "ANTIC_IN: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000931 dump(anticipatedIn[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000932 DOUT << "\n";
Owen Anderson0b68cda2007-06-03 05:55:58 +0000933
934 DOUT << "AVAIL_OUT: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000935 dump(availableOut[I]);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000936 DOUT << "\n";
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000937 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000938
Owen Anderson634a0632007-06-06 01:27:49 +0000939 // Phase 2: Insert
Owen Andersonbe802402007-06-08 01:03:01 +0000940 DOUT<< "\nPhase 2: Insertion\n";
941
Owen Andersonb56fba02007-06-19 03:31:41 +0000942 std::map<BasicBlock*, std::set<Value*> > new_sets;
Owen Andersonbe802402007-06-08 01:03:01 +0000943 unsigned i_iterations = 0;
944 bool new_stuff = true;
945 while (new_stuff) {
946 new_stuff = false;
947 DOUT << "Iteration: " << i_iterations << "\n\n";
948 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
949 E = df_end(DT.getRootNode()); DI != E; ++DI) {
950 BasicBlock* BB = DI->getBlock();
951
Owen Andersond184c182007-06-11 16:25:17 +0000952 if (BB == 0)
953 continue;
954
Owen Andersonb56fba02007-06-19 03:31:41 +0000955 std::set<Value*>& new_set = new_sets[BB];
956 std::set<Value*>& availOut = availableOut[BB];
957 std::set<Value*>& anticIn = anticipatedIn[BB];
Owen Andersonbe802402007-06-08 01:03:01 +0000958
Owen Anderson55994f22007-06-08 20:44:02 +0000959 new_set.clear();
960
Owen Andersonbe802402007-06-08 01:03:01 +0000961 // Replace leaders with leaders inherited from dominator
962 if (DI->getIDom() != 0) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000963 std::set<Value*>& dom_set = new_sets[DI->getIDom()->getBlock()];
964 for (std::set<Value*>::iterator I = dom_set.begin(),
Owen Andersonbe802402007-06-08 01:03:01 +0000965 E = dom_set.end(); I != E; ++I) {
966 new_set.insert(*I);
Owen Andersonb56fba02007-06-19 03:31:41 +0000967 val_replace(availOut, *I);
Owen Andersonbe802402007-06-08 01:03:01 +0000968 }
969 }
970
971 // If there is more than one predecessor...
972 if (pred_begin(BB) != pred_end(BB) && ++pred_begin(BB) != pred_end(BB)) {
973 std::vector<Value*> workList;
974 topo_sort(anticIn, workList);
975
976 DOUT << "Merge Block: " << BB->getName() << "\n";
977 DOUT << "ANTIC_IN: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000978 dump(anticIn);
Owen Andersonbe802402007-06-08 01:03:01 +0000979 DOUT << "\n";
980
Owen Andersona75dd4d2007-06-12 00:50:47 +0000981 for (unsigned i = 0; i < workList.size(); ++i) {
982 Value* e = workList[i];
Owen Andersonbe802402007-06-08 01:03:01 +0000983
Owen Anderson223718c2007-06-09 18:35:31 +0000984 if (isa<BinaryOperator>(e) || isa<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000985 if (find_leader(availableOut[DI->getIDom()->getBlock()], VN.lookup(e)) != 0)
Owen Andersonbe802402007-06-08 01:03:01 +0000986 continue;
987
988 std::map<BasicBlock*, Value*> avail;
989 bool by_some = false;
990 int num_avail = 0;
991
992 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;
993 ++PI) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000994 Value *e2 = phi_translate(e, *PI, BB);
Owen Andersonb56fba02007-06-19 03:31:41 +0000995 Value *e3 = find_leader(availableOut[*PI], VN.lookup(e2));
Owen Andersonbe802402007-06-08 01:03:01 +0000996
997 if (e3 == 0) {
998 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
999 if (av != avail.end())
1000 avail.erase(av);
1001 avail.insert(std::make_pair(*PI, e2));
1002 } else {
1003 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1004 if (av != avail.end())
1005 avail.erase(av);
1006 avail.insert(std::make_pair(*PI, e3));
1007
1008 by_some = true;
1009 num_avail++;
1010 }
1011 }
1012
1013 if (by_some &&
1014 num_avail < std::distance(pred_begin(BB), pred_end(BB))) {
1015 DOUT << "Processing Value: ";
1016 DEBUG(e->dump());
1017 DOUT << "\n\n";
1018
1019 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1020 PI != PE; ++PI) {
1021 Value* e2 = avail[*PI];
Owen Andersonb56fba02007-06-19 03:31:41 +00001022 if (!find_leader(availableOut[*PI], VN.lookup(e2))) {
Owen Anderson223718c2007-06-09 18:35:31 +00001023 User* U = cast<User>(e2);
Owen Andersonbe802402007-06-08 01:03:01 +00001024
1025 Value* s1 = 0;
Owen Anderson658f2c42007-06-16 00:26:54 +00001026 if (isa<BinaryOperator>(U->getOperand(0)) ||
1027 isa<CmpInst>(U->getOperand(0)))
Owen Andersonb56fba02007-06-19 03:31:41 +00001028 s1 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(0)));
Owen Andersonbe802402007-06-08 01:03:01 +00001029 else
Owen Anderson223718c2007-06-09 18:35:31 +00001030 s1 = U->getOperand(0);
Owen Andersonbe802402007-06-08 01:03:01 +00001031
1032 Value* s2 = 0;
Owen Anderson658f2c42007-06-16 00:26:54 +00001033 if (isa<BinaryOperator>(U->getOperand(1)) ||
1034 isa<CmpInst>(U->getOperand(1)))
Owen Andersonb56fba02007-06-19 03:31:41 +00001035 s2 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(1)));
Owen Andersonbe802402007-06-08 01:03:01 +00001036 else
Owen Anderson223718c2007-06-09 18:35:31 +00001037 s2 = U->getOperand(1);
Owen Andersonbe802402007-06-08 01:03:01 +00001038
Owen Anderson223718c2007-06-09 18:35:31 +00001039 Value* newVal = 0;
1040 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
1041 newVal = BinaryOperator::create(BO->getOpcode(),
Owen Andersonbe802402007-06-08 01:03:01 +00001042 s1, s2,
1043 BO->getName()+".gvnpre",
1044 (*PI)->getTerminator());
Owen Anderson223718c2007-06-09 18:35:31 +00001045 else if (CmpInst* C = dyn_cast<CmpInst>(U))
1046 newVal = CmpInst::create(C->getOpcode(),
1047 C->getPredicate(),
1048 s1, s2,
1049 C->getName()+".gvnpre",
1050 (*PI)->getTerminator());
1051
Owen Andersonb56fba02007-06-19 03:31:41 +00001052 VN.add(newVal, VN.lookup(U));
Owen Anderson55994f22007-06-08 20:44:02 +00001053
Owen Andersonb56fba02007-06-19 03:31:41 +00001054 std::set<Value*>& predAvail = availableOut[*PI];
1055 val_replace(predAvail, newVal);
Owen Andersonbe802402007-06-08 01:03:01 +00001056
1057 DOUT << "Creating value: " << std::hex << newVal << std::dec << "\n";
1058
1059 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1060 if (av != avail.end())
1061 avail.erase(av);
1062 avail.insert(std::make_pair(*PI, newVal));
Owen Anderson7d76b2a2007-06-08 22:02:36 +00001063
1064 ++NumInsertedVals;
Owen Andersonbe802402007-06-08 01:03:01 +00001065 }
1066 }
1067
1068 PHINode* p = 0;
1069
1070 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1071 PI != PE; ++PI) {
1072 if (p == 0)
1073 p = new PHINode(avail[*PI]->getType(), "gvnpre-join",
1074 BB->begin());
1075
1076 p->addIncoming(avail[*PI], *PI);
1077 }
1078
Owen Andersonb56fba02007-06-19 03:31:41 +00001079 VN.add(p, VN.lookup(e));
Owen Andersonbe802402007-06-08 01:03:01 +00001080 DOUT << "Creating value: " << std::hex << p << std::dec << "\n";
1081
Owen Andersonb56fba02007-06-19 03:31:41 +00001082 val_replace(availOut, p);
Owen Andersonbe802402007-06-08 01:03:01 +00001083 availOut.insert(p);
Owen Anderson55994f22007-06-08 20:44:02 +00001084
Owen Andersonbe802402007-06-08 01:03:01 +00001085 new_stuff = true;
1086
1087 DOUT << "Preds After Processing: ";
1088 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1089 PI != PE; ++PI)
1090 DEBUG((*PI)->dump());
1091 DOUT << "\n\n";
1092
1093 DOUT << "Merge Block After Processing: ";
1094 DEBUG(BB->dump());
1095 DOUT << "\n\n";
1096
1097 new_set.insert(p);
Owen Anderson7d76b2a2007-06-08 22:02:36 +00001098
1099 ++NumInsertedPhis;
Owen Andersonbe802402007-06-08 01:03:01 +00001100 }
1101 }
1102 }
1103 }
1104 }
1105 i_iterations++;
1106 }
Owen Anderson634a0632007-06-06 01:27:49 +00001107
1108 // Phase 3: Eliminate
Owen Anderson4036ad42007-06-12 22:43:57 +00001109 elimination();
Owen Anderson55994f22007-06-08 20:44:02 +00001110
Owen Andersonbe802402007-06-08 01:03:01 +00001111 // Phase 4: Cleanup
Owen Anderson42769842007-06-12 16:57:50 +00001112 cleanup();
Owen Andersonbe802402007-06-08 01:03:01 +00001113
Owen Anderson42769842007-06-12 16:57:50 +00001114 return true;
Owen Anderson5fba6c12007-05-29 21:53:49 +00001115}