blob: 91c1cd4d47b30af8b068252a9aa0f862a1a0cdd6 [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);
104 };
105}
106
107ValueTable::Expression::ExpressionOpcode
108 ValueTable::getOpcode(BinaryOperator* BO) {
109 switch(BO->getOpcode()) {
110 case Instruction::Add:
111 return Expression::ADD;
112 case Instruction::Sub:
113 return Expression::SUB;
114 case Instruction::Mul:
115 return Expression::MUL;
116 case Instruction::UDiv:
117 return Expression::UDIV;
118 case Instruction::SDiv:
119 return Expression::SDIV;
120 case Instruction::FDiv:
121 return Expression::FDIV;
122 case Instruction::URem:
123 return Expression::UREM;
124 case Instruction::SRem:
125 return Expression::SREM;
126 case Instruction::FRem:
127 return Expression::FREM;
128 case Instruction::Shl:
129 return Expression::SHL;
130 case Instruction::LShr:
131 return Expression::LSHR;
132 case Instruction::AShr:
133 return Expression::ASHR;
134 case Instruction::And:
135 return Expression::AND;
136 case Instruction::Or:
137 return Expression::OR;
138 case Instruction::Xor:
139 return Expression::XOR;
140
141 // THIS SHOULD NEVER HAPPEN
142 default:
143 assert(0 && "Binary operator with unknown opcode?");
144 return Expression::ADD;
145 }
146}
147
148ValueTable::Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
149 if (C->getOpcode() == Instruction::ICmp) {
150 switch (C->getPredicate()) {
151 case ICmpInst::ICMP_EQ:
152 return Expression::ICMPEQ;
153 case ICmpInst::ICMP_NE:
154 return Expression::ICMPNE;
155 case ICmpInst::ICMP_UGT:
156 return Expression::ICMPUGT;
157 case ICmpInst::ICMP_UGE:
158 return Expression::ICMPUGE;
159 case ICmpInst::ICMP_ULT:
160 return Expression::ICMPULT;
161 case ICmpInst::ICMP_ULE:
162 return Expression::ICMPULE;
163 case ICmpInst::ICMP_SGT:
164 return Expression::ICMPSGT;
165 case ICmpInst::ICMP_SGE:
166 return Expression::ICMPSGE;
167 case ICmpInst::ICMP_SLT:
168 return Expression::ICMPSLT;
169 case ICmpInst::ICMP_SLE:
170 return Expression::ICMPSLE;
171
172 // THIS SHOULD NEVER HAPPEN
173 default:
174 assert(0 && "Comparison with unknown predicate?");
175 return Expression::ICMPEQ;
176 }
177 } else {
178 switch (C->getPredicate()) {
179 case FCmpInst::FCMP_OEQ:
180 return Expression::FCMPOEQ;
181 case FCmpInst::FCMP_OGT:
182 return Expression::FCMPOGT;
183 case FCmpInst::FCMP_OGE:
184 return Expression::FCMPOGE;
185 case FCmpInst::FCMP_OLT:
186 return Expression::FCMPOLT;
187 case FCmpInst::FCMP_OLE:
188 return Expression::FCMPOLE;
189 case FCmpInst::FCMP_ONE:
190 return Expression::FCMPONE;
191 case FCmpInst::FCMP_ORD:
192 return Expression::FCMPORD;
193 case FCmpInst::FCMP_UNO:
194 return Expression::FCMPUNO;
195 case FCmpInst::FCMP_UEQ:
196 return Expression::FCMPUEQ;
197 case FCmpInst::FCMP_UGT:
198 return Expression::FCMPUGT;
199 case FCmpInst::FCMP_UGE:
200 return Expression::FCMPUGE;
201 case FCmpInst::FCMP_ULT:
202 return Expression::FCMPULT;
203 case FCmpInst::FCMP_ULE:
204 return Expression::FCMPULE;
205 case FCmpInst::FCMP_UNE:
206 return Expression::FCMPUNE;
207
208 // THIS SHOULD NEVER HAPPEN
209 default:
210 assert(0 && "Comparison with unknown predicate?");
211 return Expression::FCMPOEQ;
Owen Anderson223718c2007-06-09 18:35:31 +0000212 }
213 }
Owen Andersonb56fba02007-06-19 03:31:41 +0000214}
215
216uint32_t ValueTable::lookup_or_add(Value* V) {
217 maximalValues.insert(V);
218
219 std::map<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
220 if (VI != valueNumbering.end())
221 return VI->second;
Owen Anderson223718c2007-06-09 18:35:31 +0000222
Owen Anderson223718c2007-06-09 18:35:31 +0000223
Owen Andersonb56fba02007-06-19 03:31:41 +0000224 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
225 Expression e = create_expression(BO);
226
227 std::map<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
228 if (EI != expressionNumbering.end()) {
229 valueNumbering.insert(std::make_pair(V, EI->second));
230 return EI->second;
231 } else {
232 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
233 valueNumbering.insert(std::make_pair(V, nextValueNumber));
234
235 return nextValueNumber++;
236 }
237 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
238 Expression e = create_expression(C);
239
240 std::map<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
241 if (EI != expressionNumbering.end()) {
242 valueNumbering.insert(std::make_pair(V, EI->second));
243 return EI->second;
244 } else {
245 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
246 valueNumbering.insert(std::make_pair(V, nextValueNumber));
247
248 return nextValueNumber++;
249 }
250 } else {
251 valueNumbering.insert(std::make_pair(V, nextValueNumber));
252 return nextValueNumber++;
Owen Anderson0b68cda2007-06-03 05:55:58 +0000253 }
Owen Andersonb56fba02007-06-19 03:31:41 +0000254}
255
256uint32_t ValueTable::lookup(Value* V) {
257 std::map<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
258 if (VI != valueNumbering.end())
259 return VI->second;
260 else
261 assert(0 && "Value not numbered?");
262
263 return 0;
264}
265
266void ValueTable::add(Value* V, uint32_t num) {
267 std::map<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
268 if (VI != valueNumbering.end())
269 valueNumbering.erase(VI);
270 valueNumbering.insert(std::make_pair(V, num));
271}
272
273ValueTable::Expression ValueTable::create_expression(BinaryOperator* BO) {
274 Expression e;
275
276 e.leftVN = lookup_or_add(BO->getOperand(0));
277 e.rightVN = lookup_or_add(BO->getOperand(1));
278 e.opcode = getOpcode(BO);
279
280 maximalExpressions.insert(e);
281
282 return e;
283}
284
285ValueTable::Expression ValueTable::create_expression(CmpInst* C) {
286 Expression e;
287
288 e.leftVN = lookup_or_add(C->getOperand(0));
289 e.rightVN = lookup_or_add(C->getOperand(1));
290 e.opcode = getOpcode(C);
291
292 maximalExpressions.insert(e);
293
294 return e;
295}
296
297void ValueTable::clear() {
298 valueNumbering.clear();
299 expressionNumbering.clear();
300 nextValueNumber = 1;
301}
Owen Anderson0b68cda2007-06-03 05:55:58 +0000302
Owen Anderson5fba6c12007-05-29 21:53:49 +0000303namespace {
304
305 class VISIBILITY_HIDDEN GVNPRE : public FunctionPass {
306 bool runOnFunction(Function &F);
307 public:
308 static char ID; // Pass identification, replacement for typeid
Owen Anderson223718c2007-06-09 18:35:31 +0000309 GVNPRE() : FunctionPass((intptr_t)&ID) { nextValueNumber = 1; }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000310
311 private:
312 uint32_t nextValueNumber;
Owen Andersonbe802402007-06-08 01:03:01 +0000313 ValueTable VN;
Owen Andersona75dd4d2007-06-12 00:50:47 +0000314 std::vector<Instruction*> createdExpressions;
Owen Anderson81d156e2007-05-31 00:42:15 +0000315
Owen Andersonb56fba02007-06-19 03:31:41 +0000316 std::map<BasicBlock*, std::set<Value*> > availableOut;
317 std::map<BasicBlock*, std::set<Value*> > anticipatedIn;
Owen Andersondd998e12007-06-18 04:42:29 +0000318 std::map<User*, bool> invokeDep;
Owen Anderson4036ad42007-06-12 22:43:57 +0000319
Owen Anderson5fba6c12007-05-29 21:53:49 +0000320 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
321 AU.setPreservesCFG();
322 AU.addRequired<DominatorTree>();
323 AU.addRequired<PostDominatorTree>();
324 }
325
326 // Helper fuctions
327 // FIXME: eliminate or document these better
Owen Anderson2e5efc32007-06-08 01:52:45 +0000328 void dump(const std::set<Value*>& s) const;
Owen Andersonb56fba02007-06-19 03:31:41 +0000329 void dump_unique(const std::set<Value*>& s) const;
330 void clean(std::set<Value*>& set);
331 Value* find_leader(std::set<Value*>& vals,
332 uint32_t v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000333 Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ);
Owen Andersonb56fba02007-06-19 03:31:41 +0000334 void phi_translate_set(std::set<Value*>& anticIn, BasicBlock* pred,
335 BasicBlock* succ, std::set<Value*>& out);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000336
Owen Andersonb56fba02007-06-19 03:31:41 +0000337 void topo_sort(std::set<Value*>& set,
Owen Anderson0b68cda2007-06-03 05:55:58 +0000338 std::vector<Value*>& vec);
Owen Anderson331bf6a2007-05-31 22:44:11 +0000339
Owen Anderson5fba6c12007-05-29 21:53:49 +0000340 // For a given block, calculate the generated expressions, temporaries,
341 // and the AVAIL_OUT set
Owen Anderson42769842007-06-12 16:57:50 +0000342 void cleanup();
Owen Anderson4036ad42007-06-12 22:43:57 +0000343 void elimination();
Owen Andersondd998e12007-06-18 04:42:29 +0000344
Owen Andersonb56fba02007-06-19 03:31:41 +0000345 void val_insert(std::set<Value*>& s, Value* v);
346 void val_replace(std::set<Value*>& s, Value* v);
Owen Andersondd998e12007-06-18 04:42:29 +0000347 bool dependsOnInvoke(Value* V);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000348
349 };
350
351 char GVNPRE::ID = 0;
352
353}
354
355FunctionPass *llvm::createGVNPREPass() { return new GVNPRE(); }
356
357RegisterPass<GVNPRE> X("gvnpre",
358 "Global Value Numbering/Partial Redundancy Elimination");
359
Owen Anderson5fba6c12007-05-29 21:53:49 +0000360
Owen Anderson7d76b2a2007-06-08 22:02:36 +0000361STATISTIC(NumInsertedVals, "Number of values inserted");
362STATISTIC(NumInsertedPhis, "Number of PHI nodes inserted");
363STATISTIC(NumEliminated, "Number of redundant instructions eliminated");
364
Owen Andersonb56fba02007-06-19 03:31:41 +0000365Value* GVNPRE::find_leader(std::set<Value*>& vals, uint32_t v) {
366 for (std::set<Value*>::iterator I = vals.begin(), E = vals.end();
367 I != E; ++I)
368 if (v == VN.lookup(*I))
Owen Anderson0b68cda2007-06-03 05:55:58 +0000369 return *I;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000370
Owen Anderson0b68cda2007-06-03 05:55:58 +0000371 return 0;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000372}
373
Owen Andersonb56fba02007-06-19 03:31:41 +0000374void GVNPRE::val_insert(std::set<Value*>& s, Value* v) {
375 uint32_t num = VN.lookup(v);
376 Value* leader = find_leader(s, num);
377 if (leader == 0)
378 s.insert(v);
379}
380
381void GVNPRE::val_replace(std::set<Value*>& s, Value* v) {
382 uint32_t num = VN.lookup(v);
383 Value* leader = find_leader(s, num);
384 while (leader != 0) {
385 s.erase(leader);
386 leader = find_leader(s, num);
387 }
388 s.insert(v);
389}
390
Owen Anderson4036ad42007-06-12 22:43:57 +0000391Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
Owen Anderson38b6b222007-06-04 18:05:26 +0000392 if (V == 0)
393 return 0;
394
395 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000396 Value* newOp1 = 0;
397 if (isa<Instruction>(BO->getOperand(0)))
398 newOp1 = phi_translate(find_leader(anticipatedIn[succ],
399 VN.lookup(BO->getOperand(0))),
400 pred, succ);
401 else
402 newOp1 = BO->getOperand(0);
403
Owen Anderson38b6b222007-06-04 18:05:26 +0000404 if (newOp1 == 0)
405 return 0;
406
Owen Andersonb56fba02007-06-19 03:31:41 +0000407 Value* newOp2 = 0;
408 if (isa<Instruction>(BO->getOperand(1)))
409 newOp2 = phi_translate(find_leader(anticipatedIn[succ],
410 VN.lookup(BO->getOperand(1))),
411 pred, succ);
412 else
413 newOp2 = BO->getOperand(1);
414
Owen Anderson38b6b222007-06-04 18:05:26 +0000415 if (newOp2 == 0)
416 return 0;
417
418 if (newOp1 != BO->getOperand(0) || newOp2 != BO->getOperand(1)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000419 Instruction* newVal = BinaryOperator::create(BO->getOpcode(),
Owen Anderson38b6b222007-06-04 18:05:26 +0000420 newOp1, newOp2,
421 BO->getName()+".gvnpre");
Owen Anderson55994f22007-06-08 20:44:02 +0000422
Owen Andersonb56fba02007-06-19 03:31:41 +0000423 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson4036ad42007-06-12 22:43:57 +0000424
Owen Andersonb56fba02007-06-19 03:31:41 +0000425 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000426 if (leader == 0) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000427 createdExpressions.push_back(newVal);
Owen Anderson38b6b222007-06-04 18:05:26 +0000428 return newVal;
Owen Andersonc8472092007-06-05 22:11:49 +0000429 } else {
430 delete newVal;
Owen Anderson4036ad42007-06-12 22:43:57 +0000431 return leader;
Owen Andersonc8472092007-06-05 22:11:49 +0000432 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000433 }
434 } else if (PHINode* P = dyn_cast<PHINode>(V)) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000435 if (P->getParent() == succ)
Owen Anderson38b6b222007-06-04 18:05:26 +0000436 return P->getIncomingValueForBlock(pred);
Owen Anderson223718c2007-06-09 18:35:31 +0000437 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000438 Value* newOp1 = 0;
439 if (isa<Instruction>(C->getOperand(0)))
440 newOp1 = phi_translate(find_leader(anticipatedIn[succ],
441 VN.lookup(C->getOperand(0))),
442 pred, succ);
443 else
444 newOp1 = C->getOperand(0);
445
Owen Anderson223718c2007-06-09 18:35:31 +0000446 if (newOp1 == 0)
447 return 0;
448
Owen Andersonb56fba02007-06-19 03:31:41 +0000449 Value* newOp2 = 0;
450 if (isa<Instruction>(C->getOperand(1)))
451 newOp2 = phi_translate(find_leader(anticipatedIn[succ],
452 VN.lookup(C->getOperand(1))),
453 pred, succ);
454 else
455 newOp2 = C->getOperand(1);
456
Owen Anderson223718c2007-06-09 18:35:31 +0000457 if (newOp2 == 0)
458 return 0;
459
460 if (newOp1 != C->getOperand(0) || newOp2 != C->getOperand(1)) {
461 Instruction* newVal = CmpInst::create(C->getOpcode(),
462 C->getPredicate(),
463 newOp1, newOp2,
464 C->getName()+".gvnpre");
465
Owen Andersonb56fba02007-06-19 03:31:41 +0000466 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson4036ad42007-06-12 22:43:57 +0000467
Owen Andersonb56fba02007-06-19 03:31:41 +0000468 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000469 if (leader == 0) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000470 createdExpressions.push_back(newVal);
Owen Anderson223718c2007-06-09 18:35:31 +0000471 return newVal;
472 } else {
Owen Anderson223718c2007-06-09 18:35:31 +0000473 delete newVal;
Owen Anderson4036ad42007-06-12 22:43:57 +0000474 return leader;
Owen Anderson223718c2007-06-09 18:35:31 +0000475 }
476 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000477 }
478
479 return V;
480}
481
Owen Andersonb56fba02007-06-19 03:31:41 +0000482void GVNPRE::phi_translate_set(std::set<Value*>& anticIn,
Owen Andersona75dd4d2007-06-12 00:50:47 +0000483 BasicBlock* pred, BasicBlock* succ,
Owen Andersonb56fba02007-06-19 03:31:41 +0000484 std::set<Value*>& out) {
485 for (std::set<Value*>::iterator I = anticIn.begin(),
Owen Anderson38b6b222007-06-04 18:05:26 +0000486 E = anticIn.end(); I != E; ++I) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000487 Value* V = phi_translate(*I, pred, succ);
Owen Anderson38b6b222007-06-04 18:05:26 +0000488 if (V != 0)
489 out.insert(V);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000490 }
491}
492
Owen Andersondd998e12007-06-18 04:42:29 +0000493bool GVNPRE::dependsOnInvoke(Value* V) {
Owen Anderson658f2c42007-06-16 00:26:54 +0000494 if (!isa<User>(V))
495 return false;
496
497 User* U = cast<User>(V);
Owen Andersondd998e12007-06-18 04:42:29 +0000498 std::map<User*, bool>::iterator I = invokeDep.find(U);
499 if (I != invokeDep.end())
500 return I->second;
501
Owen Anderson658f2c42007-06-16 00:26:54 +0000502 std::vector<Value*> worklist(U->op_begin(), U->op_end());
503 std::set<Value*> visited;
504
505 while (!worklist.empty()) {
506 Value* current = worklist.back();
507 worklist.pop_back();
508 visited.insert(current);
509
510 if (!isa<User>(current))
511 continue;
512 else if (isa<InvokeInst>(current))
513 return true;
514
515 User* curr = cast<User>(current);
Owen Andersondd998e12007-06-18 04:42:29 +0000516 std::map<User*, bool>::iterator CI = invokeDep.find(curr);
517 if (CI != invokeDep.end()) {
518 if (CI->second)
519 return true;
520 } else {
521 for (unsigned i = 0; i < curr->getNumOperands(); ++i)
522 if (visited.find(curr->getOperand(i)) == visited.end())
523 worklist.push_back(curr->getOperand(i));
524 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000525 }
526
527 return false;
528}
529
Owen Anderson5fba6c12007-05-29 21:53:49 +0000530// Remove all expressions whose operands are not themselves in the set
Owen Andersonb56fba02007-06-19 03:31:41 +0000531void GVNPRE::clean(std::set<Value*>& set) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000532 std::vector<Value*> worklist;
Owen Andersonbe802402007-06-08 01:03:01 +0000533 topo_sort(set, worklist);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000534
Owen Andersonbe802402007-06-08 01:03:01 +0000535 for (unsigned i = 0; i < worklist.size(); ++i) {
536 Value* v = worklist[i];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000537
Owen Anderson0b68cda2007-06-03 05:55:58 +0000538 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(v)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000539 bool lhsValid = !isa<Instruction>(BO->getOperand(0));
540 if (!lhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000541 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonbe802402007-06-08 01:03:01 +0000542 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000543 if (VN.lookup(*I) == VN.lookup(BO->getOperand(0))) {
Owen Andersonbe802402007-06-08 01:03:01 +0000544 lhsValid = true;
545 break;
546 }
Owen Andersonb364b412007-06-18 04:30:44 +0000547
548 // Check for dependency on invoke insts
549 // NOTE: This check is expensive, so don't do it if we
550 // don't have to
551 if (lhsValid)
552 lhsValid = !dependsOnInvoke(BO->getOperand(0));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000553
Owen Andersonbe802402007-06-08 01:03:01 +0000554 bool rhsValid = !isa<Instruction>(BO->getOperand(1));
555 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000556 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonf1c04e12007-06-18 04:31:21 +0000557 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000558 if (VN.lookup(*I) == VN.lookup(BO->getOperand(1))) {
Owen Andersonf1c04e12007-06-18 04:31:21 +0000559 rhsValid = true;
560 break;
561 }
Owen Andersonb364b412007-06-18 04:30:44 +0000562
563 // Check for dependency on invoke insts
564 // NOTE: This check is expensive, so don't do it if we
565 // don't have to
566 if (rhsValid)
567 rhsValid = !dependsOnInvoke(BO->getOperand(1));
Owen Anderson5fba6c12007-05-29 21:53:49 +0000568
Owen Anderson0b68cda2007-06-03 05:55:58 +0000569 if (!lhsValid || !rhsValid)
570 set.erase(BO);
Owen Anderson223718c2007-06-09 18:35:31 +0000571 } else if (CmpInst* C = dyn_cast<CmpInst>(v)) {
572 bool lhsValid = !isa<Instruction>(C->getOperand(0));
573 if (!lhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000574 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000575 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000576 if (VN.lookup(*I) == VN.lookup(C->getOperand(0))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000577 lhsValid = true;
578 break;
579 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000580 lhsValid &= !dependsOnInvoke(C->getOperand(0));
581
Owen Anderson223718c2007-06-09 18:35:31 +0000582 bool rhsValid = !isa<Instruction>(C->getOperand(1));
583 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000584 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000585 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000586 if (VN.lookup(*I) == VN.lookup(C->getOperand(1))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000587 rhsValid = true;
588 break;
589 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000590 rhsValid &= !dependsOnInvoke(C->getOperand(1));
Owen Anderson223718c2007-06-09 18:35:31 +0000591
592 if (!lhsValid || !rhsValid)
593 set.erase(C);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000594 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000595 }
596}
597
Owen Andersonb56fba02007-06-19 03:31:41 +0000598void GVNPRE::topo_sort(std::set<Value*>& set,
Owen Anderson0b68cda2007-06-03 05:55:58 +0000599 std::vector<Value*>& vec) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000600 std::set<Value*> toErase;
601 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000602 I != E; ++I) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000603 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000604 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
605 if (VN.lookup(BO->getOperand(0)) == VN.lookup(*SI) ||
606 VN.lookup(BO->getOperand(1)) == VN.lookup(*SI)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000607 toErase.insert(*SI);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000608 }
Owen Anderson223718c2007-06-09 18:35:31 +0000609 }
610 else if (CmpInst* C = dyn_cast<CmpInst>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000611 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
612 if (VN.lookup(C->getOperand(0)) == VN.lookup(*SI) ||
613 VN.lookup(C->getOperand(1)) == VN.lookup(*SI)) {
Owen Anderson223718c2007-06-09 18:35:31 +0000614 toErase.insert(*SI);
615 }
616 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000617 }
618
Owen Anderson0b68cda2007-06-03 05:55:58 +0000619 std::vector<Value*> Q;
Owen Andersonb56fba02007-06-19 03:31:41 +0000620 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonbe802402007-06-08 01:03:01 +0000621 I != E; ++I) {
622 if (toErase.find(*I) == toErase.end())
623 Q.push_back(*I);
624 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000625
Owen Andersonddbe4302007-06-05 23:46:12 +0000626 std::set<Value*> visited;
Owen Anderson331bf6a2007-05-31 22:44:11 +0000627 while (!Q.empty()) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000628 Value* e = Q.back();
629
630 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000631 Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
632 Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000633
Owen Andersonddbe4302007-06-05 23:46:12 +0000634 if (l != 0 && isa<Instruction>(l) &&
635 visited.find(l) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000636 Q.push_back(l);
Owen Andersonddbe4302007-06-05 23:46:12 +0000637 else if (r != 0 && isa<Instruction>(r) &&
638 visited.find(r) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000639 Q.push_back(r);
640 else {
641 vec.push_back(e);
642 visited.insert(e);
643 Q.pop_back();
644 }
Owen Anderson223718c2007-06-09 18:35:31 +0000645 } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000646 Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
647 Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
Owen Anderson223718c2007-06-09 18:35:31 +0000648
649 if (l != 0 && isa<Instruction>(l) &&
650 visited.find(l) == visited.end())
651 Q.push_back(l);
652 else if (r != 0 && isa<Instruction>(r) &&
653 visited.find(r) == visited.end())
654 Q.push_back(r);
655 else {
656 vec.push_back(e);
657 visited.insert(e);
658 Q.pop_back();
659 }
Owen Anderson0b68cda2007-06-03 05:55:58 +0000660 } else {
Owen Anderson331bf6a2007-05-31 22:44:11 +0000661 visited.insert(e);
662 vec.push_back(e);
663 Q.pop_back();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000664 }
665 }
666}
667
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000668
Owen Anderson2e5efc32007-06-08 01:52:45 +0000669void GVNPRE::dump(const std::set<Value*>& s) const {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000670 DOUT << "{ ";
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000671 for (std::set<Value*>::iterator I = s.begin(), E = s.end();
672 I != E; ++I) {
673 DEBUG((*I)->dump());
674 }
675 DOUT << "}\n\n";
676}
677
Owen Andersonb56fba02007-06-19 03:31:41 +0000678void GVNPRE::dump_unique(const std::set<Value*>& s) const {
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000679 DOUT << "{ ";
680 for (std::set<Value*>::iterator I = s.begin(), E = s.end();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000681 I != E; ++I) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000682 DEBUG((*I)->dump());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000683 }
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000684 DOUT << "}\n\n";
Owen Anderson5fba6c12007-05-29 21:53:49 +0000685}
686
Owen Anderson4036ad42007-06-12 22:43:57 +0000687void GVNPRE::elimination() {
Owen Anderson42769842007-06-12 16:57:50 +0000688 DOUT << "\n\nPhase 3: Elimination\n\n";
689
690 std::vector<std::pair<Instruction*, Value*> > replace;
691 std::vector<Instruction*> erase;
692
693 DominatorTree& DT = getAnalysis<DominatorTree>();
694
695 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
696 E = df_end(DT.getRootNode()); DI != E; ++DI) {
697 BasicBlock* BB = DI->getBlock();
698
699 DOUT << "Block: " << BB->getName() << "\n";
700 dump_unique(availableOut[BB]);
701 DOUT << "\n\n";
702
703 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
704 BI != BE; ++BI) {
705
706 if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000707 Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
Owen Anderson42769842007-06-12 16:57:50 +0000708
709 if (leader != 0)
710 if (Instruction* Instr = dyn_cast<Instruction>(leader))
711 if (Instr->getParent() != 0 && Instr != BI) {
712 replace.push_back(std::make_pair(BI, leader));
713 erase.push_back(BI);
714 ++NumEliminated;
715 }
716 }
717 }
718 }
719
720 while (!replace.empty()) {
721 std::pair<Instruction*, Value*> rep = replace.back();
722 replace.pop_back();
723 rep.first->replaceAllUsesWith(rep.second);
724 }
725
726 for (std::vector<Instruction*>::iterator I = erase.begin(), E = erase.end();
727 I != E; ++I)
728 (*I)->eraseFromParent();
729}
730
731
732void GVNPRE::cleanup() {
733 while (!createdExpressions.empty()) {
734 Instruction* I = createdExpressions.back();
735 createdExpressions.pop_back();
736
737 delete I;
738 }
739}
740
Owen Anderson5fba6c12007-05-29 21:53:49 +0000741bool GVNPRE::runOnFunction(Function &F) {
Owen Andersonbe802402007-06-08 01:03:01 +0000742 VN.clear();
Owen Andersonbe802402007-06-08 01:03:01 +0000743 createdExpressions.clear();
Owen Anderson4036ad42007-06-12 22:43:57 +0000744 availableOut.clear();
745 anticipatedIn.clear();
Owen Andersondd998e12007-06-18 04:42:29 +0000746 invokeDep.clear();
Owen Anderson5fba6c12007-05-29 21:53:49 +0000747
Owen Andersonb56fba02007-06-19 03:31:41 +0000748 std::map<BasicBlock*, std::set<Value*> > generatedExpressions;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000749 std::map<BasicBlock*, std::set<PHINode*> > generatedPhis;
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000750 std::map<BasicBlock*, std::set<Value*> > generatedTemporaries;
Owen Anderson4036ad42007-06-12 22:43:57 +0000751
Owen Anderson5fba6c12007-05-29 21:53:49 +0000752
753 DominatorTree &DT = getAnalysis<DominatorTree>();
754
Owen Anderson634a0632007-06-06 01:27:49 +0000755 // Phase 1: BuildSets
756
757 // Phase 1, Part 1: calculate AVAIL_OUT
Owen Anderson5fba6c12007-05-29 21:53:49 +0000758
759 // Top-down walk of the dominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000760 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
Owen Anderson5fba6c12007-05-29 21:53:49 +0000761 E = df_end(DT.getRootNode()); DI != E; ++DI) {
762
763 // Get the sets to update for this block
Owen Andersonb56fba02007-06-19 03:31:41 +0000764 std::set<Value*>& currExps = generatedExpressions[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000765 std::set<PHINode*>& currPhis = generatedPhis[DI->getBlock()];
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000766 std::set<Value*>& currTemps = generatedTemporaries[DI->getBlock()];
Owen Andersonb56fba02007-06-19 03:31:41 +0000767 std::set<Value*>& currAvail = availableOut[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000768
Owen Andersonb56fba02007-06-19 03:31:41 +0000769 BasicBlock* BB = DI->getBlock();
770
771 // A block inherits AVAIL_OUT from its dominator
772 if (DI->getIDom() != 0)
773 currAvail.insert(availableOut[DI->getIDom()->getBlock()].begin(),
774 availableOut[DI->getIDom()->getBlock()].end());
775
776
777 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
778 BI != BE; ++BI) {
779
780 // Handle PHI nodes...
781 if (PHINode* p = dyn_cast<PHINode>(BI)) {
782 VN.lookup_or_add(p);
783 currPhis.insert(p);
784
785 // Handle binary ops...
786 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(BI)) {
787 Value* leftValue = BO->getOperand(0);
788 Value* rightValue = BO->getOperand(1);
789
790 VN.lookup_or_add(BO);
791
792 if (isa<Instruction>(leftValue))
793 val_insert(currExps, leftValue);
794 if (isa<Instruction>(rightValue))
795 val_insert(currExps, rightValue);
796 val_insert(currExps, BO);
797
798 // Handle cmp ops...
799 } else if (CmpInst* C = dyn_cast<CmpInst>(BI)) {
800 Value* leftValue = C->getOperand(0);
801 Value* rightValue = C->getOperand(1);
802
803 VN.lookup_or_add(C);
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, C);
810
811 // Handle unsupported ops
812 } else if (!BI->isTerminator()){
813 VN.lookup_or_add(BI);
814 currTemps.insert(BI);
815 }
816
817 if (!BI->isTerminator())
818 val_insert(currAvail, BI);
819 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000820 }
821
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000822 DOUT << "Maximal Set: ";
Owen Andersonb56fba02007-06-19 03:31:41 +0000823 dump_unique(VN.getMaximalValues());
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000824 DOUT << "\n";
825
Owen Anderson42769842007-06-12 16:57:50 +0000826 // If function has no exit blocks, only perform GVN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000827 PostDominatorTree &PDT = getAnalysis<PostDominatorTree>();
Owen Anderson42769842007-06-12 16:57:50 +0000828 if (PDT[&F.getEntryBlock()] == 0) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000829 elimination();
Owen Anderson42769842007-06-12 16:57:50 +0000830 cleanup();
831
832 return true;
833 }
834
Owen Anderson5fba6c12007-05-29 21:53:49 +0000835
Owen Anderson634a0632007-06-06 01:27:49 +0000836 // Phase 1, Part 2: calculate ANTIC_IN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000837
Owen Anderson0c423072007-05-29 23:26:30 +0000838 std::set<BasicBlock*> visited;
839
Owen Anderson5fba6c12007-05-29 21:53:49 +0000840 bool changed = true;
841 unsigned iterations = 0;
842 while (changed) {
843 changed = false;
Owen Andersonb56fba02007-06-19 03:31:41 +0000844 std::set<Value*> anticOut;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000845
846 // Top-down walk of the postdominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000847 for (df_iterator<DomTreeNode*> PDI =
Owen Andersonbe802402007-06-08 01:03:01 +0000848 df_begin(PDT.getRootNode()), E = df_end(PDT.getRootNode());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000849 PDI != E; ++PDI) {
850 BasicBlock* BB = PDI->getBlock();
Owen Andersond184c182007-06-11 16:25:17 +0000851 if (BB == 0)
852 continue;
853
Owen Anderson3df52992007-06-04 23:28:33 +0000854 DOUT << "Block: " << BB->getName() << "\n";
855 DOUT << "TMP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000856 dump(generatedTemporaries[BB]);
Owen Anderson3df52992007-06-04 23:28:33 +0000857 DOUT << "\n";
858
859 DOUT << "EXP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000860 dump_unique(generatedExpressions[BB]);
Owen Anderson0c423072007-05-29 23:26:30 +0000861 visited.insert(BB);
862
Owen Andersonb56fba02007-06-19 03:31:41 +0000863 std::set<Value*>& anticIn = anticipatedIn[BB];
864 std::set<Value*> old (anticIn.begin(), anticIn.end());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000865
866 if (BB->getTerminator()->getNumSuccessors() == 1) {
Owen Anderson9b89e4b2007-06-05 17:31:23 +0000867 if (visited.find(BB->getTerminator()->getSuccessor(0)) ==
868 visited.end())
Owen Andersonb56fba02007-06-19 03:31:41 +0000869 phi_translate_set(VN.getMaximalValues(), BB,
870 BB->getTerminator()->getSuccessor(0),
Owen Andersona75dd4d2007-06-12 00:50:47 +0000871 anticOut);
Owen Anderson81d156e2007-05-31 00:42:15 +0000872 else
Owen Andersonb56fba02007-06-19 03:31:41 +0000873 phi_translate_set(anticipatedIn[BB->getTerminator()->getSuccessor(0)],
874 BB, BB->getTerminator()->getSuccessor(0),
875 anticOut);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000876 } else if (BB->getTerminator()->getNumSuccessors() > 1) {
Owen Anderson3df52992007-06-04 23:28:33 +0000877 BasicBlock* first = BB->getTerminator()->getSuccessor(0);
878 anticOut.insert(anticipatedIn[first].begin(),
879 anticipatedIn[first].end());
880 for (unsigned i = 1; i < BB->getTerminator()->getNumSuccessors(); ++i) {
Owen Anderson5fba6c12007-05-29 21:53:49 +0000881 BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
Owen Andersonb56fba02007-06-19 03:31:41 +0000882 std::set<Value*>& succAnticIn = anticipatedIn[currSucc];
Owen Anderson3df52992007-06-04 23:28:33 +0000883
Owen Andersonb56fba02007-06-19 03:31:41 +0000884 std::set<Value*> temp;
885 std::insert_iterator<std::set<Value*> > temp_ins(temp,
886 temp.begin());
Owen Anderson3df52992007-06-04 23:28:33 +0000887 std::set_intersection(anticOut.begin(), anticOut.end(),
888 succAnticIn.begin(), succAnticIn.end(),
Owen Andersonb56fba02007-06-19 03:31:41 +0000889 temp_ins);
Owen Anderson3df52992007-06-04 23:28:33 +0000890
891 anticOut.clear();
892 anticOut.insert(temp.begin(), temp.end());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000893 }
894 }
895
Owen Anderson3df52992007-06-04 23:28:33 +0000896 DOUT << "ANTIC_OUT: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000897 dump_unique(anticOut);
Owen Anderson3df52992007-06-04 23:28:33 +0000898 DOUT << "\n";
899
Owen Andersonb56fba02007-06-19 03:31:41 +0000900 std::set<Value*> S;
901 std::insert_iterator<std::set<Value*> > s_ins(S, S.begin());
902 std::set_difference(anticOut.begin(), anticOut.end(),
903 generatedTemporaries[BB].begin(),
904 generatedTemporaries[BB].end(),
905 s_ins);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000906
907 anticIn.clear();
Owen Andersonb56fba02007-06-19 03:31:41 +0000908 std::insert_iterator<std::set<Value*> > ai_ins(anticIn, anticIn.begin());
909 std::set_difference(generatedExpressions[BB].begin(),
910 generatedExpressions[BB].end(),
911 generatedTemporaries[BB].begin(),
912 generatedTemporaries[BB].end(),
913 ai_ins);
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000914
Owen Andersonb56fba02007-06-19 03:31:41 +0000915 for (std::set<Value*>::iterator I = S.begin(), E = S.end();
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000916 I != E; ++I) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000917 if (find_leader(anticIn, VN.lookup(*I)) == 0)
918 val_insert(anticIn, *I);
Owen Anderson3c9d8ee2007-06-04 23:34:56 +0000919 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000920
Owen Andersonbe802402007-06-08 01:03:01 +0000921 clean(anticIn);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000922
Owen Anderson3df52992007-06-04 23:28:33 +0000923 DOUT << "ANTIC_IN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000924 dump_unique(anticIn);
Owen Anderson3df52992007-06-04 23:28:33 +0000925 DOUT << "\n";
926
Owen Andersonddbe4302007-06-05 23:46:12 +0000927 if (old.size() != anticIn.size())
Owen Anderson5fba6c12007-05-29 21:53:49 +0000928 changed = true;
929
930 anticOut.clear();
931 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000932
Owen Anderson5fba6c12007-05-29 21:53:49 +0000933 iterations++;
934 }
935
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000936 DOUT << "Iterations: " << iterations << "\n";
Owen Anderson5fba6c12007-05-29 21:53:49 +0000937
938 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000939 DOUT << "Name: " << I->getName().c_str() << "\n";
940
941 DOUT << "TMP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000942 dump(generatedTemporaries[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000943 DOUT << "\n";
944
945 DOUT << "EXP_GEN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000946 dump_unique(generatedExpressions[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000947 DOUT << "\n";
948
949 DOUT << "ANTIC_IN: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000950 dump_unique(anticipatedIn[I]);
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000951 DOUT << "\n";
Owen Anderson0b68cda2007-06-03 05:55:58 +0000952
953 DOUT << "AVAIL_OUT: ";
Owen Andersonbe802402007-06-08 01:03:01 +0000954 dump_unique(availableOut[I]);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000955 DOUT << "\n";
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000956 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000957
Owen Anderson634a0632007-06-06 01:27:49 +0000958 // Phase 2: Insert
Owen Andersonbe802402007-06-08 01:03:01 +0000959 DOUT<< "\nPhase 2: Insertion\n";
960
Owen Andersonb56fba02007-06-19 03:31:41 +0000961 std::map<BasicBlock*, std::set<Value*> > new_sets;
Owen Andersonbe802402007-06-08 01:03:01 +0000962 unsigned i_iterations = 0;
963 bool new_stuff = true;
964 while (new_stuff) {
965 new_stuff = false;
966 DOUT << "Iteration: " << i_iterations << "\n\n";
967 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
968 E = df_end(DT.getRootNode()); DI != E; ++DI) {
969 BasicBlock* BB = DI->getBlock();
970
Owen Andersond184c182007-06-11 16:25:17 +0000971 if (BB == 0)
972 continue;
973
Owen Andersonb56fba02007-06-19 03:31:41 +0000974 std::set<Value*>& new_set = new_sets[BB];
975 std::set<Value*>& availOut = availableOut[BB];
976 std::set<Value*>& anticIn = anticipatedIn[BB];
Owen Andersonbe802402007-06-08 01:03:01 +0000977
Owen Anderson55994f22007-06-08 20:44:02 +0000978 new_set.clear();
979
Owen Andersonbe802402007-06-08 01:03:01 +0000980 // Replace leaders with leaders inherited from dominator
981 if (DI->getIDom() != 0) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000982 std::set<Value*>& dom_set = new_sets[DI->getIDom()->getBlock()];
983 for (std::set<Value*>::iterator I = dom_set.begin(),
Owen Andersonbe802402007-06-08 01:03:01 +0000984 E = dom_set.end(); I != E; ++I) {
985 new_set.insert(*I);
Owen Andersonb56fba02007-06-19 03:31:41 +0000986 val_replace(availOut, *I);
Owen Andersonbe802402007-06-08 01:03:01 +0000987 }
988 }
989
990 // If there is more than one predecessor...
991 if (pred_begin(BB) != pred_end(BB) && ++pred_begin(BB) != pred_end(BB)) {
992 std::vector<Value*> workList;
993 topo_sort(anticIn, workList);
994
995 DOUT << "Merge Block: " << BB->getName() << "\n";
996 DOUT << "ANTIC_IN: ";
997 dump_unique(anticIn);
998 DOUT << "\n";
999
Owen Andersona75dd4d2007-06-12 00:50:47 +00001000 for (unsigned i = 0; i < workList.size(); ++i) {
1001 Value* e = workList[i];
Owen Andersonbe802402007-06-08 01:03:01 +00001002
Owen Anderson223718c2007-06-09 18:35:31 +00001003 if (isa<BinaryOperator>(e) || isa<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +00001004 if (find_leader(availableOut[DI->getIDom()->getBlock()], VN.lookup(e)) != 0)
Owen Andersonbe802402007-06-08 01:03:01 +00001005 continue;
1006
1007 std::map<BasicBlock*, Value*> avail;
1008 bool by_some = false;
1009 int num_avail = 0;
1010
1011 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;
1012 ++PI) {
Owen Anderson4036ad42007-06-12 22:43:57 +00001013 Value *e2 = phi_translate(e, *PI, BB);
Owen Andersonb56fba02007-06-19 03:31:41 +00001014 Value *e3 = find_leader(availableOut[*PI], VN.lookup(e2));
Owen Andersonbe802402007-06-08 01:03:01 +00001015
1016 if (e3 == 0) {
1017 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1018 if (av != avail.end())
1019 avail.erase(av);
1020 avail.insert(std::make_pair(*PI, e2));
1021 } else {
1022 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1023 if (av != avail.end())
1024 avail.erase(av);
1025 avail.insert(std::make_pair(*PI, e3));
1026
1027 by_some = true;
1028 num_avail++;
1029 }
1030 }
1031
1032 if (by_some &&
1033 num_avail < std::distance(pred_begin(BB), pred_end(BB))) {
1034 DOUT << "Processing Value: ";
1035 DEBUG(e->dump());
1036 DOUT << "\n\n";
1037
1038 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1039 PI != PE; ++PI) {
1040 Value* e2 = avail[*PI];
Owen Andersonb56fba02007-06-19 03:31:41 +00001041 if (!find_leader(availableOut[*PI], VN.lookup(e2))) {
Owen Anderson223718c2007-06-09 18:35:31 +00001042 User* U = cast<User>(e2);
Owen Andersonbe802402007-06-08 01:03:01 +00001043
1044 Value* s1 = 0;
Owen Anderson658f2c42007-06-16 00:26:54 +00001045 if (isa<BinaryOperator>(U->getOperand(0)) ||
1046 isa<CmpInst>(U->getOperand(0)))
Owen Andersonb56fba02007-06-19 03:31:41 +00001047 s1 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(0)));
Owen Andersonbe802402007-06-08 01:03:01 +00001048 else
Owen Anderson223718c2007-06-09 18:35:31 +00001049 s1 = U->getOperand(0);
Owen Andersonbe802402007-06-08 01:03:01 +00001050
1051 Value* s2 = 0;
Owen Anderson658f2c42007-06-16 00:26:54 +00001052 if (isa<BinaryOperator>(U->getOperand(1)) ||
1053 isa<CmpInst>(U->getOperand(1)))
Owen Andersonb56fba02007-06-19 03:31:41 +00001054 s2 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(1)));
Owen Andersonbe802402007-06-08 01:03:01 +00001055 else
Owen Anderson223718c2007-06-09 18:35:31 +00001056 s2 = U->getOperand(1);
Owen Andersonbe802402007-06-08 01:03:01 +00001057
Owen Anderson223718c2007-06-09 18:35:31 +00001058 Value* newVal = 0;
1059 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
1060 newVal = BinaryOperator::create(BO->getOpcode(),
Owen Andersonbe802402007-06-08 01:03:01 +00001061 s1, s2,
1062 BO->getName()+".gvnpre",
1063 (*PI)->getTerminator());
Owen Anderson223718c2007-06-09 18:35:31 +00001064 else if (CmpInst* C = dyn_cast<CmpInst>(U))
1065 newVal = CmpInst::create(C->getOpcode(),
1066 C->getPredicate(),
1067 s1, s2,
1068 C->getName()+".gvnpre",
1069 (*PI)->getTerminator());
1070
Owen Andersonb56fba02007-06-19 03:31:41 +00001071 VN.add(newVal, VN.lookup(U));
Owen Anderson55994f22007-06-08 20:44:02 +00001072
Owen Andersonb56fba02007-06-19 03:31:41 +00001073 std::set<Value*>& predAvail = availableOut[*PI];
1074 val_replace(predAvail, newVal);
Owen Andersonbe802402007-06-08 01:03:01 +00001075
1076 DOUT << "Creating value: " << std::hex << newVal << std::dec << "\n";
1077
1078 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1079 if (av != avail.end())
1080 avail.erase(av);
1081 avail.insert(std::make_pair(*PI, newVal));
Owen Anderson7d76b2a2007-06-08 22:02:36 +00001082
1083 ++NumInsertedVals;
Owen Andersonbe802402007-06-08 01:03:01 +00001084 }
1085 }
1086
1087 PHINode* p = 0;
1088
1089 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1090 PI != PE; ++PI) {
1091 if (p == 0)
1092 p = new PHINode(avail[*PI]->getType(), "gvnpre-join",
1093 BB->begin());
1094
1095 p->addIncoming(avail[*PI], *PI);
1096 }
1097
Owen Andersonb56fba02007-06-19 03:31:41 +00001098 VN.add(p, VN.lookup(e));
Owen Andersonbe802402007-06-08 01:03:01 +00001099 DOUT << "Creating value: " << std::hex << p << std::dec << "\n";
1100
Owen Andersonb56fba02007-06-19 03:31:41 +00001101 val_replace(availOut, p);
Owen Andersonbe802402007-06-08 01:03:01 +00001102 availOut.insert(p);
Owen Anderson55994f22007-06-08 20:44:02 +00001103
Owen Andersonbe802402007-06-08 01:03:01 +00001104 new_stuff = true;
1105
1106 DOUT << "Preds After Processing: ";
1107 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1108 PI != PE; ++PI)
1109 DEBUG((*PI)->dump());
1110 DOUT << "\n\n";
1111
1112 DOUT << "Merge Block After Processing: ";
1113 DEBUG(BB->dump());
1114 DOUT << "\n\n";
1115
1116 new_set.insert(p);
Owen Anderson7d76b2a2007-06-08 22:02:36 +00001117
1118 ++NumInsertedPhis;
Owen Andersonbe802402007-06-08 01:03:01 +00001119 }
1120 }
1121 }
1122 }
1123 }
1124 i_iterations++;
1125 }
Owen Anderson634a0632007-06-06 01:27:49 +00001126
1127 // Phase 3: Eliminate
Owen Anderson4036ad42007-06-12 22:43:57 +00001128 elimination();
Owen Anderson55994f22007-06-08 20:44:02 +00001129
Owen Andersonbe802402007-06-08 01:03:01 +00001130 // Phase 4: Cleanup
Owen Anderson42769842007-06-12 16:57:50 +00001131 cleanup();
Owen Andersonbe802402007-06-08 01:03:01 +00001132
Owen Anderson42769842007-06-12 16:57:50 +00001133 return true;
Owen Anderson5fba6c12007-05-29 21:53:49 +00001134}