blob: 15fecca0d8d56d6cc6b359e3b00eecb39da4b9ba [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"
28#include "llvm/ADT/DepthFirstIterator.h"
29#include "llvm/ADT/Statistic.h"
Owen Andersonbe802402007-06-08 01:03:01 +000030#include "llvm/Support/CFG.h"
Owen Anderson5fba6c12007-05-29 21:53:49 +000031#include "llvm/Support/Compiler.h"
Owen Anderson4a6ec8f2007-05-29 23:15:21 +000032#include "llvm/Support/Debug.h"
Owen Anderson5fba6c12007-05-29 21:53:49 +000033#include <algorithm>
Owen Anderson331bf6a2007-05-31 22:44:11 +000034#include <deque>
Owen Anderson5fba6c12007-05-29 21:53:49 +000035#include <map>
Owen Anderson331bf6a2007-05-31 22:44:11 +000036#include <vector>
Owen Anderson5fba6c12007-05-29 21:53:49 +000037#include <set>
Owen Anderson5fba6c12007-05-29 21:53:49 +000038using namespace llvm;
39
Owen Andersonb56fba02007-06-19 03:31:41 +000040//===----------------------------------------------------------------------===//
41// ValueTable Class
42//===----------------------------------------------------------------------===//
43
44/// This class holds the mapping between values and value numbers.
45
46namespace {
47 class VISIBILITY_HIDDEN ValueTable {
48 public:
49 struct Expression {
50 enum ExpressionOpcode { ADD, SUB, MUL, UDIV, SDIV, FDIV, UREM, SREM,
51 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
52 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
53 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
54 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
55 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
56 FCMPULT, FCMPULE, FCMPUNE };
57
58 ExpressionOpcode opcode;
59 uint32_t leftVN;
60 uint32_t rightVN;
61
62 bool operator< (const Expression& other) const {
63 if (opcode < other.opcode)
64 return true;
65 else if (opcode > other.opcode)
66 return false;
67 else if (leftVN < other.leftVN)
68 return true;
69 else if (leftVN > other.leftVN)
70 return false;
71 else if (rightVN < other.rightVN)
72 return true;
73 else if (rightVN > other.rightVN)
74 return false;
75 else
76 return false;
Owen Andersona75dd4d2007-06-12 00:50:47 +000077 }
Owen Andersonb56fba02007-06-19 03:31:41 +000078 };
79
80 private:
81 std::map<Value*, uint32_t> valueNumbering;
82 std::map<Expression, uint32_t> expressionNumbering;
83
84 std::set<Expression> maximalExpressions;
85 std::set<Value*> maximalValues;
86
87 uint32_t nextValueNumber;
88
89 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
90 Expression::ExpressionOpcode getOpcode(CmpInst* C);
91 public:
92 ValueTable() { nextValueNumber = 1; }
93 uint32_t lookup_or_add(Value* V);
94 uint32_t lookup(Value* V);
95 void add(Value* V, uint32_t num);
96 void clear();
97 std::set<Expression>& getMaximalExpressions() {
98 return maximalExpressions;
99
100 }
101 std::set<Value*>& getMaximalValues() { return maximalValues; }
102 Expression create_expression(BinaryOperator* BO);
103 Expression create_expression(CmpInst* C);
Owen Anderson91c54952007-06-19 05:37:32 +0000104 void erase(Value* v);
Owen Andersonb56fba02007-06-19 03:31:41 +0000105 };
106}
107
108ValueTable::Expression::ExpressionOpcode
109 ValueTable::getOpcode(BinaryOperator* BO) {
110 switch(BO->getOpcode()) {
111 case Instruction::Add:
112 return Expression::ADD;
113 case Instruction::Sub:
114 return Expression::SUB;
115 case Instruction::Mul:
116 return Expression::MUL;
117 case Instruction::UDiv:
118 return Expression::UDIV;
119 case Instruction::SDiv:
120 return Expression::SDIV;
121 case Instruction::FDiv:
122 return Expression::FDIV;
123 case Instruction::URem:
124 return Expression::UREM;
125 case Instruction::SRem:
126 return Expression::SREM;
127 case Instruction::FRem:
128 return Expression::FREM;
129 case Instruction::Shl:
130 return Expression::SHL;
131 case Instruction::LShr:
132 return Expression::LSHR;
133 case Instruction::AShr:
134 return Expression::ASHR;
135 case Instruction::And:
136 return Expression::AND;
137 case Instruction::Or:
138 return Expression::OR;
139 case Instruction::Xor:
140 return Expression::XOR;
141
142 // THIS SHOULD NEVER HAPPEN
143 default:
144 assert(0 && "Binary operator with unknown opcode?");
145 return Expression::ADD;
146 }
147}
148
149ValueTable::Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
150 if (C->getOpcode() == Instruction::ICmp) {
151 switch (C->getPredicate()) {
152 case ICmpInst::ICMP_EQ:
153 return Expression::ICMPEQ;
154 case ICmpInst::ICMP_NE:
155 return Expression::ICMPNE;
156 case ICmpInst::ICMP_UGT:
157 return Expression::ICMPUGT;
158 case ICmpInst::ICMP_UGE:
159 return Expression::ICMPUGE;
160 case ICmpInst::ICMP_ULT:
161 return Expression::ICMPULT;
162 case ICmpInst::ICMP_ULE:
163 return Expression::ICMPULE;
164 case ICmpInst::ICMP_SGT:
165 return Expression::ICMPSGT;
166 case ICmpInst::ICMP_SGE:
167 return Expression::ICMPSGE;
168 case ICmpInst::ICMP_SLT:
169 return Expression::ICMPSLT;
170 case ICmpInst::ICMP_SLE:
171 return Expression::ICMPSLE;
172
173 // THIS SHOULD NEVER HAPPEN
174 default:
175 assert(0 && "Comparison with unknown predicate?");
176 return Expression::ICMPEQ;
177 }
178 } else {
179 switch (C->getPredicate()) {
180 case FCmpInst::FCMP_OEQ:
181 return Expression::FCMPOEQ;
182 case FCmpInst::FCMP_OGT:
183 return Expression::FCMPOGT;
184 case FCmpInst::FCMP_OGE:
185 return Expression::FCMPOGE;
186 case FCmpInst::FCMP_OLT:
187 return Expression::FCMPOLT;
188 case FCmpInst::FCMP_OLE:
189 return Expression::FCMPOLE;
190 case FCmpInst::FCMP_ONE:
191 return Expression::FCMPONE;
192 case FCmpInst::FCMP_ORD:
193 return Expression::FCMPORD;
194 case FCmpInst::FCMP_UNO:
195 return Expression::FCMPUNO;
196 case FCmpInst::FCMP_UEQ:
197 return Expression::FCMPUEQ;
198 case FCmpInst::FCMP_UGT:
199 return Expression::FCMPUGT;
200 case FCmpInst::FCMP_UGE:
201 return Expression::FCMPUGE;
202 case FCmpInst::FCMP_ULT:
203 return Expression::FCMPULT;
204 case FCmpInst::FCMP_ULE:
205 return Expression::FCMPULE;
206 case FCmpInst::FCMP_UNE:
207 return Expression::FCMPUNE;
208
209 // THIS SHOULD NEVER HAPPEN
210 default:
211 assert(0 && "Comparison with unknown predicate?");
212 return Expression::FCMPOEQ;
Owen Anderson223718c2007-06-09 18:35:31 +0000213 }
214 }
Owen Andersonb56fba02007-06-19 03:31:41 +0000215}
216
217uint32_t ValueTable::lookup_or_add(Value* V) {
218 maximalValues.insert(V);
219
220 std::map<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
221 if (VI != valueNumbering.end())
222 return VI->second;
Owen Anderson223718c2007-06-09 18:35:31 +0000223
Owen Anderson223718c2007-06-09 18:35:31 +0000224
Owen Andersonb56fba02007-06-19 03:31:41 +0000225 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
226 Expression e = create_expression(BO);
227
228 std::map<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
229 if (EI != expressionNumbering.end()) {
230 valueNumbering.insert(std::make_pair(V, EI->second));
231 return EI->second;
232 } else {
233 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
234 valueNumbering.insert(std::make_pair(V, nextValueNumber));
235
236 return nextValueNumber++;
237 }
238 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
239 Expression e = create_expression(C);
240
241 std::map<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
242 if (EI != expressionNumbering.end()) {
243 valueNumbering.insert(std::make_pair(V, EI->second));
244 return EI->second;
245 } else {
246 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
247 valueNumbering.insert(std::make_pair(V, nextValueNumber));
248
249 return nextValueNumber++;
250 }
251 } else {
252 valueNumbering.insert(std::make_pair(V, nextValueNumber));
253 return nextValueNumber++;
Owen Anderson0b68cda2007-06-03 05:55:58 +0000254 }
Owen Andersonb56fba02007-06-19 03:31:41 +0000255}
256
257uint32_t ValueTable::lookup(Value* V) {
258 std::map<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
259 if (VI != valueNumbering.end())
260 return VI->second;
261 else
262 assert(0 && "Value not numbered?");
263
264 return 0;
265}
266
267void ValueTable::add(Value* V, uint32_t num) {
268 std::map<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
269 if (VI != valueNumbering.end())
270 valueNumbering.erase(VI);
271 valueNumbering.insert(std::make_pair(V, num));
272}
273
274ValueTable::Expression ValueTable::create_expression(BinaryOperator* BO) {
275 Expression e;
276
277 e.leftVN = lookup_or_add(BO->getOperand(0));
278 e.rightVN = lookup_or_add(BO->getOperand(1));
279 e.opcode = getOpcode(BO);
280
281 maximalExpressions.insert(e);
282
283 return e;
284}
285
286ValueTable::Expression ValueTable::create_expression(CmpInst* C) {
287 Expression e;
288
289 e.leftVN = lookup_or_add(C->getOperand(0));
290 e.rightVN = lookup_or_add(C->getOperand(1));
291 e.opcode = getOpcode(C);
292
293 maximalExpressions.insert(e);
294
295 return e;
296}
297
298void ValueTable::clear() {
299 valueNumbering.clear();
300 expressionNumbering.clear();
Owen Andersonb9cbaed2007-06-19 04:32:55 +0000301 maximalExpressions.clear();
302 maximalValues.clear();
Owen Andersonb56fba02007-06-19 03:31:41 +0000303 nextValueNumber = 1;
304}
Owen Anderson0b68cda2007-06-03 05:55:58 +0000305
Owen Anderson91c54952007-06-19 05:37:32 +0000306void ValueTable::erase(Value* V) {
307 maximalValues.erase(V);
308 valueNumbering.erase(V);
309 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V))
310 maximalExpressions.erase(create_expression(BO));
311 else if (CmpInst* C = dyn_cast<CmpInst>(V))
312 maximalExpressions.erase(create_expression(C));
313}
314
Owen Anderson5fba6c12007-05-29 21:53:49 +0000315namespace {
316
317 class VISIBILITY_HIDDEN GVNPRE : public FunctionPass {
318 bool runOnFunction(Function &F);
319 public:
320 static char ID; // Pass identification, replacement for typeid
Owen Andersonb9cbaed2007-06-19 04:32:55 +0000321 GVNPRE() : FunctionPass((intptr_t)&ID) { }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000322
323 private:
Owen Andersonbe802402007-06-08 01:03:01 +0000324 ValueTable VN;
Owen Andersona75dd4d2007-06-12 00:50:47 +0000325 std::vector<Instruction*> createdExpressions;
Owen Anderson81d156e2007-05-31 00:42:15 +0000326
Owen Andersonb56fba02007-06-19 03:31:41 +0000327 std::map<BasicBlock*, std::set<Value*> > availableOut;
328 std::map<BasicBlock*, std::set<Value*> > anticipatedIn;
Owen Andersondd998e12007-06-18 04:42:29 +0000329 std::map<User*, bool> invokeDep;
Owen Anderson4036ad42007-06-12 22:43:57 +0000330
Owen Anderson5fba6c12007-05-29 21:53:49 +0000331 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
332 AU.setPreservesCFG();
333 AU.addRequired<DominatorTree>();
334 AU.addRequired<PostDominatorTree>();
335 }
336
337 // Helper fuctions
338 // FIXME: eliminate or document these better
Owen Anderson2e5efc32007-06-08 01:52:45 +0000339 void dump(const std::set<Value*>& s) const;
Owen Andersonb56fba02007-06-19 03:31:41 +0000340 void dump_unique(const std::set<Value*>& s) const;
341 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 Anderson658f2c42007-06-16 00:26:54 +0000507 if (!isa<User>(V))
508 return false;
509
510 User* U = cast<User>(V);
Owen Andersondd998e12007-06-18 04:42:29 +0000511 std::map<User*, bool>::iterator I = invokeDep.find(U);
512 if (I != invokeDep.end())
513 return I->second;
514
Owen Anderson658f2c42007-06-16 00:26:54 +0000515 std::vector<Value*> worklist(U->op_begin(), U->op_end());
516 std::set<Value*> visited;
517
518 while (!worklist.empty()) {
519 Value* current = worklist.back();
520 worklist.pop_back();
521 visited.insert(current);
522
523 if (!isa<User>(current))
524 continue;
525 else if (isa<InvokeInst>(current))
526 return true;
527
528 User* curr = cast<User>(current);
Owen Andersondd998e12007-06-18 04:42:29 +0000529 std::map<User*, bool>::iterator CI = invokeDep.find(curr);
530 if (CI != invokeDep.end()) {
531 if (CI->second)
532 return true;
533 } else {
534 for (unsigned i = 0; i < curr->getNumOperands(); ++i)
535 if (visited.find(curr->getOperand(i)) == visited.end())
536 worklist.push_back(curr->getOperand(i));
537 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000538 }
539
540 return false;
541}
542
Owen Anderson5fba6c12007-05-29 21:53:49 +0000543// Remove all expressions whose operands are not themselves in the set
Owen Andersonb56fba02007-06-19 03:31:41 +0000544void GVNPRE::clean(std::set<Value*>& set) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000545 std::vector<Value*> worklist;
Owen Andersonbe802402007-06-08 01:03:01 +0000546 topo_sort(set, worklist);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000547
Owen Andersonbe802402007-06-08 01:03:01 +0000548 for (unsigned i = 0; i < worklist.size(); ++i) {
549 Value* v = worklist[i];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000550
Owen Anderson0b68cda2007-06-03 05:55:58 +0000551 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(v)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000552 bool lhsValid = !isa<Instruction>(BO->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 Andersonbe802402007-06-08 01:03:01 +0000555 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000556 if (VN.lookup(*I) == VN.lookup(BO->getOperand(0))) {
Owen Andersonbe802402007-06-08 01:03:01 +0000557 lhsValid = true;
558 break;
559 }
Owen Andersonb364b412007-06-18 04:30:44 +0000560
561 // Check for dependency on invoke insts
562 // NOTE: This check is expensive, so don't do it if we
563 // don't have to
564 if (lhsValid)
565 lhsValid = !dependsOnInvoke(BO->getOperand(0));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000566
Owen Andersonbe802402007-06-08 01:03:01 +0000567 bool rhsValid = !isa<Instruction>(BO->getOperand(1));
568 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000569 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonf1c04e12007-06-18 04:31:21 +0000570 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000571 if (VN.lookup(*I) == VN.lookup(BO->getOperand(1))) {
Owen Andersonf1c04e12007-06-18 04:31:21 +0000572 rhsValid = true;
573 break;
574 }
Owen Andersonb364b412007-06-18 04:30:44 +0000575
576 // Check for dependency on invoke insts
577 // NOTE: This check is expensive, so don't do it if we
578 // don't have to
579 if (rhsValid)
580 rhsValid = !dependsOnInvoke(BO->getOperand(1));
Owen Anderson5fba6c12007-05-29 21:53:49 +0000581
Owen Anderson0b68cda2007-06-03 05:55:58 +0000582 if (!lhsValid || !rhsValid)
583 set.erase(BO);
Owen Anderson223718c2007-06-09 18:35:31 +0000584 } else if (CmpInst* C = dyn_cast<CmpInst>(v)) {
585 bool lhsValid = !isa<Instruction>(C->getOperand(0));
586 if (!lhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000587 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000588 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000589 if (VN.lookup(*I) == VN.lookup(C->getOperand(0))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000590 lhsValid = true;
591 break;
592 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000593 lhsValid &= !dependsOnInvoke(C->getOperand(0));
594
Owen Anderson223718c2007-06-09 18:35:31 +0000595 bool rhsValid = !isa<Instruction>(C->getOperand(1));
596 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000597 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000598 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000599 if (VN.lookup(*I) == VN.lookup(C->getOperand(1))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000600 rhsValid = true;
601 break;
602 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000603 rhsValid &= !dependsOnInvoke(C->getOperand(1));
Owen Anderson223718c2007-06-09 18:35:31 +0000604
605 if (!lhsValid || !rhsValid)
606 set.erase(C);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000607 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000608 }
609}
610
Owen Andersonb56fba02007-06-19 03:31:41 +0000611void GVNPRE::topo_sort(std::set<Value*>& set,
Owen Anderson0b68cda2007-06-03 05:55:58 +0000612 std::vector<Value*>& vec) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000613 std::set<Value*> toErase;
614 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000615 I != E; ++I) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000616 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000617 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
618 if (VN.lookup(BO->getOperand(0)) == VN.lookup(*SI) ||
619 VN.lookup(BO->getOperand(1)) == VN.lookup(*SI)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000620 toErase.insert(*SI);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000621 }
Owen Anderson223718c2007-06-09 18:35:31 +0000622 }
623 else if (CmpInst* C = dyn_cast<CmpInst>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000624 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
625 if (VN.lookup(C->getOperand(0)) == VN.lookup(*SI) ||
626 VN.lookup(C->getOperand(1)) == VN.lookup(*SI)) {
Owen Anderson223718c2007-06-09 18:35:31 +0000627 toErase.insert(*SI);
628 }
629 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000630 }
631
Owen Anderson0b68cda2007-06-03 05:55:58 +0000632 std::vector<Value*> Q;
Owen Andersonb56fba02007-06-19 03:31:41 +0000633 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonbe802402007-06-08 01:03:01 +0000634 I != E; ++I) {
635 if (toErase.find(*I) == toErase.end())
636 Q.push_back(*I);
637 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000638
Owen Andersonddbe4302007-06-05 23:46:12 +0000639 std::set<Value*> visited;
Owen Anderson331bf6a2007-05-31 22:44:11 +0000640 while (!Q.empty()) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000641 Value* e = Q.back();
642
643 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000644 Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
645 Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000646
Owen Andersonddbe4302007-06-05 23:46:12 +0000647 if (l != 0 && isa<Instruction>(l) &&
648 visited.find(l) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000649 Q.push_back(l);
Owen Andersonddbe4302007-06-05 23:46:12 +0000650 else if (r != 0 && isa<Instruction>(r) &&
651 visited.find(r) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000652 Q.push_back(r);
653 else {
654 vec.push_back(e);
655 visited.insert(e);
656 Q.pop_back();
657 }
Owen Anderson223718c2007-06-09 18:35:31 +0000658 } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000659 Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
660 Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
Owen Anderson223718c2007-06-09 18:35:31 +0000661
662 if (l != 0 && isa<Instruction>(l) &&
663 visited.find(l) == visited.end())
664 Q.push_back(l);
665 else if (r != 0 && isa<Instruction>(r) &&
666 visited.find(r) == visited.end())
667 Q.push_back(r);
668 else {
669 vec.push_back(e);
670 visited.insert(e);
671 Q.pop_back();
672 }
Owen Anderson0b68cda2007-06-03 05:55:58 +0000673 } else {
Owen Anderson331bf6a2007-05-31 22:44:11 +0000674 visited.insert(e);
675 vec.push_back(e);
676 Q.pop_back();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000677 }
678 }
679}
680
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000681
Owen Anderson2e5efc32007-06-08 01:52:45 +0000682void GVNPRE::dump(const std::set<Value*>& s) const {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000683 DOUT << "{ ";
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000684 for (std::set<Value*>::iterator I = s.begin(), E = s.end();
685 I != E; ++I) {
686 DEBUG((*I)->dump());
687 }
688 DOUT << "}\n\n";
689}
690
Owen Andersonb56fba02007-06-19 03:31:41 +0000691void GVNPRE::dump_unique(const std::set<Value*>& s) const {
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000692 DOUT << "{ ";
693 for (std::set<Value*>::iterator I = s.begin(), E = s.end();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000694 I != E; ++I) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000695 DEBUG((*I)->dump());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000696 }
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000697 DOUT << "}\n\n";
Owen Anderson5fba6c12007-05-29 21:53:49 +0000698}
699
Owen Anderson4036ad42007-06-12 22:43:57 +0000700void GVNPRE::elimination() {
Owen Anderson42769842007-06-12 16:57:50 +0000701 DOUT << "\n\nPhase 3: Elimination\n\n";
702
703 std::vector<std::pair<Instruction*, Value*> > replace;
704 std::vector<Instruction*> erase;
705
706 DominatorTree& DT = getAnalysis<DominatorTree>();
707
708 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
709 E = df_end(DT.getRootNode()); DI != E; ++DI) {
710 BasicBlock* BB = DI->getBlock();
711
712 DOUT << "Block: " << BB->getName() << "\n";
713 dump_unique(availableOut[BB]);
714 DOUT << "\n\n";
715
716 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
717 BI != BE; ++BI) {
718
719 if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000720 Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
Owen Anderson42769842007-06-12 16:57:50 +0000721
722 if (leader != 0)
723 if (Instruction* Instr = dyn_cast<Instruction>(leader))
724 if (Instr->getParent() != 0 && Instr != BI) {
725 replace.push_back(std::make_pair(BI, leader));
726 erase.push_back(BI);
727 ++NumEliminated;
728 }
729 }
730 }
731 }
732
733 while (!replace.empty()) {
734 std::pair<Instruction*, Value*> rep = replace.back();
735 replace.pop_back();
736 rep.first->replaceAllUsesWith(rep.second);
737 }
738
739 for (std::vector<Instruction*>::iterator I = erase.begin(), E = erase.end();
740 I != E; ++I)
741 (*I)->eraseFromParent();
742}
743
744
745void GVNPRE::cleanup() {
746 while (!createdExpressions.empty()) {
747 Instruction* I = createdExpressions.back();
748 createdExpressions.pop_back();
749
750 delete I;
751 }
752}
753
Owen Anderson5fba6c12007-05-29 21:53:49 +0000754bool GVNPRE::runOnFunction(Function &F) {
Owen Andersonbe802402007-06-08 01:03:01 +0000755 VN.clear();
Owen Andersonbe802402007-06-08 01:03:01 +0000756 createdExpressions.clear();
Owen Anderson4036ad42007-06-12 22:43:57 +0000757 availableOut.clear();
758 anticipatedIn.clear();
Owen Andersondd998e12007-06-18 04:42:29 +0000759 invokeDep.clear();
Owen Anderson5fba6c12007-05-29 21:53:49 +0000760
Owen Andersonb56fba02007-06-19 03:31:41 +0000761 std::map<BasicBlock*, std::set<Value*> > generatedExpressions;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000762 std::map<BasicBlock*, std::set<PHINode*> > generatedPhis;
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000763 std::map<BasicBlock*, std::set<Value*> > generatedTemporaries;
Owen Anderson4036ad42007-06-12 22:43:57 +0000764
Owen Anderson5fba6c12007-05-29 21:53:49 +0000765
766 DominatorTree &DT = getAnalysis<DominatorTree>();
767
Owen Anderson634a0632007-06-06 01:27:49 +0000768 // Phase 1: BuildSets
769
770 // Phase 1, Part 1: calculate AVAIL_OUT
Owen Anderson5fba6c12007-05-29 21:53:49 +0000771
772 // Top-down walk of the dominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000773 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
Owen Anderson5fba6c12007-05-29 21:53:49 +0000774 E = df_end(DT.getRootNode()); DI != E; ++DI) {
775
776 // Get the sets to update for this block
Owen Andersonb56fba02007-06-19 03:31:41 +0000777 std::set<Value*>& currExps = generatedExpressions[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000778 std::set<PHINode*>& currPhis = generatedPhis[DI->getBlock()];
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000779 std::set<Value*>& currTemps = generatedTemporaries[DI->getBlock()];
Owen Andersonb56fba02007-06-19 03:31:41 +0000780 std::set<Value*>& currAvail = availableOut[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000781
Owen Andersonb56fba02007-06-19 03:31:41 +0000782 BasicBlock* BB = DI->getBlock();
783
784 // A block inherits AVAIL_OUT from its dominator
785 if (DI->getIDom() != 0)
786 currAvail.insert(availableOut[DI->getIDom()->getBlock()].begin(),
787 availableOut[DI->getIDom()->getBlock()].end());
788
789
790 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
791 BI != BE; ++BI) {
792
793 // Handle PHI nodes...
794 if (PHINode* p = dyn_cast<PHINode>(BI)) {
795 VN.lookup_or_add(p);
796 currPhis.insert(p);
797
798 // Handle binary ops...
799 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(BI)) {
800 Value* leftValue = BO->getOperand(0);
801 Value* rightValue = BO->getOperand(1);
802
803 VN.lookup_or_add(BO);
804
805 if (isa<Instruction>(leftValue))
806 val_insert(currExps, leftValue);
807 if (isa<Instruction>(rightValue))
808 val_insert(currExps, rightValue);
809 val_insert(currExps, BO);
810
811 // Handle cmp ops...
812 } else if (CmpInst* C = dyn_cast<CmpInst>(BI)) {
813 Value* leftValue = C->getOperand(0);
814 Value* rightValue = C->getOperand(1);
815
816 VN.lookup_or_add(C);
817
818 if (isa<Instruction>(leftValue))
819 val_insert(currExps, leftValue);
820 if (isa<Instruction>(rightValue))
821 val_insert(currExps, rightValue);
822 val_insert(currExps, C);
823
824 // Handle unsupported ops
825 } else if (!BI->isTerminator()){
826 VN.lookup_or_add(BI);
827 currTemps.insert(BI);
828 }
829
830 if (!BI->isTerminator())
831 val_insert(currAvail, BI);
832 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000833 }
834
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000835 DOUT << "Maximal Set: ";
Owen Andersonb56fba02007-06-19 03:31:41 +0000836 dump_unique(VN.getMaximalValues());
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000837 DOUT << "\n";
838
Owen Anderson42769842007-06-12 16:57:50 +0000839 // If function has no exit blocks, only perform GVN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000840 PostDominatorTree &PDT = getAnalysis<PostDominatorTree>();
Owen Anderson42769842007-06-12 16:57:50 +0000841 if (PDT[&F.getEntryBlock()] == 0) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000842 elimination();
Owen Anderson42769842007-06-12 16:57:50 +0000843 cleanup();
844
845 return true;
846 }
847
Owen Anderson5fba6c12007-05-29 21:53:49 +0000848
Owen Anderson634a0632007-06-06 01:27:49 +0000849 // Phase 1, Part 2: calculate ANTIC_IN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000850
Owen Anderson0c423072007-05-29 23:26:30 +0000851 std::set<BasicBlock*> visited;
852
Owen Anderson5fba6c12007-05-29 21:53:49 +0000853 bool changed = true;
854 unsigned iterations = 0;
855 while (changed) {
856 changed = false;
Owen Andersonb56fba02007-06-19 03:31:41 +0000857 std::set<Value*> anticOut;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000858
859 // Top-down walk of the postdominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000860 for (df_iterator<DomTreeNode*> PDI =
Owen Andersonbe802402007-06-08 01:03:01 +0000861 df_begin(PDT.getRootNode()), E = df_end(PDT.getRootNode());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000862 PDI != E; ++PDI) {
863 BasicBlock* BB = PDI->getBlock();
Owen Andersond184c182007-06-11 16:25:17 +0000864 if (BB == 0)
865 continue;
866
Owen Anderson3df52992007-06-04 23:28:33 +0000867 DOUT << "Block: " << BB->getName() << "\n";
868 DOUT << "TMP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000869 dump(generatedTemporaries[BB]);
Owen Anderson3df52992007-06-04 23:28:33 +0000870 DOUT << "\n";
871
872 DOUT << "EXP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000873 dump_unique(generatedExpressions[BB]);
Owen Anderson0c423072007-05-29 23:26:30 +0000874 visited.insert(BB);
875
Owen Andersonb56fba02007-06-19 03:31:41 +0000876 std::set<Value*>& anticIn = anticipatedIn[BB];
877 std::set<Value*> old (anticIn.begin(), anticIn.end());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000878
879 if (BB->getTerminator()->getNumSuccessors() == 1) {
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000880 if (visited.find(BB->getTerminator()->getSuccessor(0)) ==
881 visited.end())
Owen Andersonb56fba02007-06-19 03:31:41 +0000882 phi_translate_set(VN.getMaximalValues(), BB,
883 BB->getTerminator()->getSuccessor(0),
Owen Andersona75dd4d2007-06-12 00:50:47 +0000884 anticOut);
Owen Anderson81d156e2007-05-31 00:42:15 +0000885 else
Owen Andersonb56fba02007-06-19 03:31:41 +0000886 phi_translate_set(anticipatedIn[BB->getTerminator()->getSuccessor(0)],
887 BB, BB->getTerminator()->getSuccessor(0),
888 anticOut);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000889 } else if (BB->getTerminator()->getNumSuccessors() > 1) {
Owen Anderson3df52992007-06-04 23:28:33 +0000890 BasicBlock* first = BB->getTerminator()->getSuccessor(0);
891 anticOut.insert(anticipatedIn[first].begin(),
892 anticipatedIn[first].end());
893 for (unsigned i = 1; i < BB->getTerminator()->getNumSuccessors(); ++i) {
Owen Anderson5fba6c12007-05-29 21:53:49 +0000894 BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
Owen Andersonb56fba02007-06-19 03:31:41 +0000895 std::set<Value*>& succAnticIn = anticipatedIn[currSucc];
Owen Anderson3df52992007-06-04 23:28:33 +0000896
Owen Andersonb56fba02007-06-19 03:31:41 +0000897 std::set<Value*> temp;
898 std::insert_iterator<std::set<Value*> > temp_ins(temp,
899 temp.begin());
Owen Anderson3df52992007-06-04 23:28:33 +0000900 std::set_intersection(anticOut.begin(), anticOut.end(),
901 succAnticIn.begin(), succAnticIn.end(),
Owen Andersonb56fba02007-06-19 03:31:41 +0000902 temp_ins);
Owen Anderson3df52992007-06-04 23:28:33 +0000903
904 anticOut.clear();
905 anticOut.insert(temp.begin(), temp.end());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000906 }
907 }
908
Owen Anderson3df52992007-06-04 23:28:33 +0000909 DOUT << "ANTIC_OUT: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000910 dump_unique(anticOut);
Owen Anderson3df52992007-06-04 23:28:33 +0000911 DOUT << "\n";
912
Owen Andersonb56fba02007-06-19 03:31:41 +0000913 std::set<Value*> S;
914 std::insert_iterator<std::set<Value*> > s_ins(S, S.begin());
915 std::set_difference(anticOut.begin(), anticOut.end(),
916 generatedTemporaries[BB].begin(),
917 generatedTemporaries[BB].end(),
918 s_ins);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000919
920 anticIn.clear();
Owen Andersonb56fba02007-06-19 03:31:41 +0000921 std::insert_iterator<std::set<Value*> > ai_ins(anticIn, anticIn.begin());
922 std::set_difference(generatedExpressions[BB].begin(),
923 generatedExpressions[BB].end(),
924 generatedTemporaries[BB].begin(),
925 generatedTemporaries[BB].end(),
926 ai_ins);
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000927
Owen Andersonb56fba02007-06-19 03:31:41 +0000928 for (std::set<Value*>::iterator I = S.begin(), E = S.end();
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000929 I != E; ++I) {
Owen Anderson1370faf2007-06-19 07:35:36 +0000930 // For non-opaque values, we should already have a value numbering.
931 // However, for opaques, such as constants within PHI nodes, it is
932 // possible that they have not yet received a number. Make sure they do
933 // so now.
934 uint32_t valNum = 0;
935 if (isa<BinaryOperator>(*I) || isa<CmpInst>(*I))
936 valNum = VN.lookup(*I);
937 else
938 valNum = VN.lookup_or_add(*I);
939 if (find_leader(anticIn, valNum) == 0)
Owen Andersonb56fba02007-06-19 03:31:41 +0000940 val_insert(anticIn, *I);
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000941 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000942
Owen Andersonbe802402007-06-08 01:03:01 +0000943 clean(anticIn);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000944
Owen Anderson3df52992007-06-04 23:28:33 +0000945 DOUT << "ANTIC_IN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000946 dump_unique(anticIn);
Owen Anderson3df52992007-06-04 23:28:33 +0000947 DOUT << "\n";
948
Owen Andersonddbe4302007-06-05 23:46:12 +0000949 if (old.size() != anticIn.size())
Owen Anderson5fba6c12007-05-29 21:53:49 +0000950 changed = true;
951
952 anticOut.clear();
953 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000954
Owen Anderson5fba6c12007-05-29 21:53:49 +0000955 iterations++;
956 }
957
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000958 DOUT << "Iterations: " << iterations << "\n";
Owen Anderson5fba6c12007-05-29 21:53:49 +0000959
960 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000961 DOUT << "Name: " << I->getName().c_str() << "\n";
962
963 DOUT << "TMP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000964 dump(generatedTemporaries[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000965 DOUT << "\n";
966
967 DOUT << "EXP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000968 dump_unique(generatedExpressions[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000969 DOUT << "\n";
970
971 DOUT << "ANTIC_IN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000972 dump_unique(anticipatedIn[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000973 DOUT << "\n";
Owen Anderson0b68cda2007-06-03 05:55:58 +0000974
975 DOUT << "AVAIL_OUT: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000976 dump_unique(availableOut[I]);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000977 DOUT << "\n";
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000978 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000979
Owen Anderson634a0632007-06-06 01:27:49 +0000980 // Phase 2: Insert
Owen Andersonbe802402007-06-08 01:03:01 +0000981 DOUT<< "\nPhase 2: Insertion\n";
982
Owen Andersonb56fba02007-06-19 03:31:41 +0000983 std::map<BasicBlock*, std::set<Value*> > new_sets;
Owen Andersonbe802402007-06-08 01:03:01 +0000984 unsigned i_iterations = 0;
985 bool new_stuff = true;
986 while (new_stuff) {
987 new_stuff = false;
988 DOUT << "Iteration: " << i_iterations << "\n\n";
989 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
990 E = df_end(DT.getRootNode()); DI != E; ++DI) {
991 BasicBlock* BB = DI->getBlock();
992
Owen Andersond184c182007-06-11 16:25:17 +0000993 if (BB == 0)
994 continue;
995
Owen Andersonb56fba02007-06-19 03:31:41 +0000996 std::set<Value*>& new_set = new_sets[BB];
997 std::set<Value*>& availOut = availableOut[BB];
998 std::set<Value*>& anticIn = anticipatedIn[BB];
Owen Andersonbe802402007-06-08 01:03:01 +0000999
Owen Anderson55994f22007-06-08 20:44:02 +00001000 new_set.clear();
1001
Owen Andersonbe802402007-06-08 01:03:01 +00001002 // Replace leaders with leaders inherited from dominator
1003 if (DI->getIDom() != 0) {
Owen Andersonb56fba02007-06-19 03:31:41 +00001004 std::set<Value*>& dom_set = new_sets[DI->getIDom()->getBlock()];
1005 for (std::set<Value*>::iterator I = dom_set.begin(),
Owen Andersonbe802402007-06-08 01:03:01 +00001006 E = dom_set.end(); I != E; ++I) {
1007 new_set.insert(*I);
Owen Andersonb56fba02007-06-19 03:31:41 +00001008 val_replace(availOut, *I);
Owen Andersonbe802402007-06-08 01:03:01 +00001009 }
1010 }
1011
1012 // If there is more than one predecessor...
1013 if (pred_begin(BB) != pred_end(BB) && ++pred_begin(BB) != pred_end(BB)) {
1014 std::vector<Value*> workList;
1015 topo_sort(anticIn, workList);
1016
1017 DOUT << "Merge Block: " << BB->getName() << "\n";
1018 DOUT << "ANTIC_IN: ";
1019 dump_unique(anticIn);
1020 DOUT << "\n";
1021
Owen Andersona75dd4d2007-06-12 00:50:47 +00001022 for (unsigned i = 0; i < workList.size(); ++i) {
1023 Value* e = workList[i];
Owen Andersonbe802402007-06-08 01:03:01 +00001024
Owen Anderson223718c2007-06-09 18:35:31 +00001025 if (isa<BinaryOperator>(e) || isa<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +00001026 if (find_leader(availableOut[DI->getIDom()->getBlock()], VN.lookup(e)) != 0)
Owen Andersonbe802402007-06-08 01:03:01 +00001027 continue;
1028
1029 std::map<BasicBlock*, Value*> avail;
1030 bool by_some = false;
1031 int num_avail = 0;
1032
1033 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;
1034 ++PI) {
Owen Anderson4036ad42007-06-12 22:43:57 +00001035 Value *e2 = phi_translate(e, *PI, BB);
Owen Andersonb56fba02007-06-19 03:31:41 +00001036 Value *e3 = find_leader(availableOut[*PI], VN.lookup(e2));
Owen Andersonbe802402007-06-08 01:03:01 +00001037
1038 if (e3 == 0) {
1039 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1040 if (av != avail.end())
1041 avail.erase(av);
1042 avail.insert(std::make_pair(*PI, e2));
1043 } else {
1044 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1045 if (av != avail.end())
1046 avail.erase(av);
1047 avail.insert(std::make_pair(*PI, e3));
1048
1049 by_some = true;
1050 num_avail++;
1051 }
1052 }
1053
1054 if (by_some &&
1055 num_avail < std::distance(pred_begin(BB), pred_end(BB))) {
1056 DOUT << "Processing Value: ";
1057 DEBUG(e->dump());
1058 DOUT << "\n\n";
1059
1060 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1061 PI != PE; ++PI) {
1062 Value* e2 = avail[*PI];
Owen Andersonb56fba02007-06-19 03:31:41 +00001063 if (!find_leader(availableOut[*PI], VN.lookup(e2))) {
Owen Anderson223718c2007-06-09 18:35:31 +00001064 User* U = cast<User>(e2);
Owen Andersonbe802402007-06-08 01:03:01 +00001065
1066 Value* s1 = 0;
Owen Anderson658f2c42007-06-16 00:26:54 +00001067 if (isa<BinaryOperator>(U->getOperand(0)) ||
1068 isa<CmpInst>(U->getOperand(0)))
Owen Andersonb56fba02007-06-19 03:31:41 +00001069 s1 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(0)));
Owen Andersonbe802402007-06-08 01:03:01 +00001070 else
Owen Anderson223718c2007-06-09 18:35:31 +00001071 s1 = U->getOperand(0);
Owen Andersonbe802402007-06-08 01:03:01 +00001072
1073 Value* s2 = 0;
Owen Anderson658f2c42007-06-16 00:26:54 +00001074 if (isa<BinaryOperator>(U->getOperand(1)) ||
1075 isa<CmpInst>(U->getOperand(1)))
Owen Andersonb56fba02007-06-19 03:31:41 +00001076 s2 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(1)));
Owen Andersonbe802402007-06-08 01:03:01 +00001077 else
Owen Anderson223718c2007-06-09 18:35:31 +00001078 s2 = U->getOperand(1);
Owen Andersonbe802402007-06-08 01:03:01 +00001079
Owen Anderson223718c2007-06-09 18:35:31 +00001080 Value* newVal = 0;
1081 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
1082 newVal = BinaryOperator::create(BO->getOpcode(),
Owen Andersonbe802402007-06-08 01:03:01 +00001083 s1, s2,
1084 BO->getName()+".gvnpre",
1085 (*PI)->getTerminator());
Owen Anderson223718c2007-06-09 18:35:31 +00001086 else if (CmpInst* C = dyn_cast<CmpInst>(U))
1087 newVal = CmpInst::create(C->getOpcode(),
1088 C->getPredicate(),
1089 s1, s2,
1090 C->getName()+".gvnpre",
1091 (*PI)->getTerminator());
1092
Owen Andersonb56fba02007-06-19 03:31:41 +00001093 VN.add(newVal, VN.lookup(U));
Owen Anderson55994f22007-06-08 20:44:02 +00001094
Owen Andersonb56fba02007-06-19 03:31:41 +00001095 std::set<Value*>& predAvail = availableOut[*PI];
1096 val_replace(predAvail, newVal);
Owen Andersonbe802402007-06-08 01:03:01 +00001097
1098 DOUT << "Creating value: " << std::hex << newVal << std::dec << "\n";
1099
1100 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1101 if (av != avail.end())
1102 avail.erase(av);
1103 avail.insert(std::make_pair(*PI, newVal));
Owen Anderson7d76b2a2007-06-08 22:02:36 +00001104
1105 ++NumInsertedVals;
Owen Andersonbe802402007-06-08 01:03:01 +00001106 }
1107 }
1108
1109 PHINode* p = 0;
1110
1111 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1112 PI != PE; ++PI) {
1113 if (p == 0)
1114 p = new PHINode(avail[*PI]->getType(), "gvnpre-join",
1115 BB->begin());
1116
1117 p->addIncoming(avail[*PI], *PI);
1118 }
1119
Owen Andersonb56fba02007-06-19 03:31:41 +00001120 VN.add(p, VN.lookup(e));
Owen Andersonbe802402007-06-08 01:03:01 +00001121 DOUT << "Creating value: " << std::hex << p << std::dec << "\n";
1122
Owen Andersonb56fba02007-06-19 03:31:41 +00001123 val_replace(availOut, p);
Owen Andersonbe802402007-06-08 01:03:01 +00001124 availOut.insert(p);
Owen Anderson55994f22007-06-08 20:44:02 +00001125
Owen Andersonbe802402007-06-08 01:03:01 +00001126 new_stuff = true;
1127
1128 DOUT << "Preds After Processing: ";
1129 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1130 PI != PE; ++PI)
1131 DEBUG((*PI)->dump());
1132 DOUT << "\n\n";
1133
1134 DOUT << "Merge Block After Processing: ";
1135 DEBUG(BB->dump());
1136 DOUT << "\n\n";
1137
1138 new_set.insert(p);
Owen Anderson7d76b2a2007-06-08 22:02:36 +00001139
1140 ++NumInsertedPhis;
Owen Andersonbe802402007-06-08 01:03:01 +00001141 }
1142 }
1143 }
1144 }
1145 }
1146 i_iterations++;
1147 }
Owen Anderson634a0632007-06-06 01:27:49 +00001148
1149 // Phase 3: Eliminate
Owen Anderson4036ad42007-06-12 22:43:57 +00001150 elimination();
Owen Anderson55994f22007-06-08 20:44:02 +00001151
Owen Andersonbe802402007-06-08 01:03:01 +00001152 // Phase 4: Cleanup
Owen Anderson42769842007-06-12 16:57:50 +00001153 cleanup();
Owen Andersonbe802402007-06-08 01:03:01 +00001154
Owen Anderson42769842007-06-12 16:57:50 +00001155 return true;
Owen Anderson5fba6c12007-05-29 21:53:49 +00001156}