blob: b1b096e3504c67c29f925ce3b698287784cb0314 [file] [log] [blame]
Owen Anderson5fba6c12007-05-29 21:53:49 +00001//===- GVNPRE.cpp - Eliminate redundant values and expressions ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the Owen Anderson and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This pass performs a hybrid of global value numbering and partial redundancy
11// elimination, known as GVN-PRE. It performs partial redundancy elimination on
12// values, rather than lexical expressions, allowing a more comprehensive view
13// the optimization. It replaces redundant values with uses of earlier
14// occurences of the same value. While this is beneficial in that it eliminates
15// unneeded computation, it also increases register pressure by creating large
Owen Andersonb232efa2007-06-08 20:57:08 +000016// live ranges, and should be used with caution on platforms that are very
Owen Anderson5fba6c12007-05-29 21:53:49 +000017// sensitive to register pressure.
18//
19//===----------------------------------------------------------------------===//
20
21#define DEBUG_TYPE "gvnpre"
22#include "llvm/Value.h"
23#include "llvm/Transforms/Scalar.h"
24#include "llvm/Instructions.h"
25#include "llvm/Function.h"
26#include "llvm/Analysis/Dominators.h"
27#include "llvm/Analysis/PostDominators.h"
Owen Anderson1ad2c102007-06-19 23:23:54 +000028#include "llvm/ADT/DenseMap.h"
Owen Anderson5fba6c12007-05-29 21:53:49 +000029#include "llvm/ADT/DepthFirstIterator.h"
30#include "llvm/ADT/Statistic.h"
Owen Andersonbe802402007-06-08 01:03:01 +000031#include "llvm/Support/CFG.h"
Owen Anderson5fba6c12007-05-29 21:53:49 +000032#include "llvm/Support/Compiler.h"
Owen Anderson4a6ec8f2007-05-29 23:15:21 +000033#include "llvm/Support/Debug.h"
Owen Anderson5fba6c12007-05-29 21:53:49 +000034#include <algorithm>
Owen Anderson331bf6a2007-05-31 22:44:11 +000035#include <deque>
Owen Anderson5fba6c12007-05-29 21:53:49 +000036#include <map>
Owen Anderson331bf6a2007-05-31 22:44:11 +000037#include <vector>
Owen Anderson5fba6c12007-05-29 21:53:49 +000038#include <set>
Owen Anderson5fba6c12007-05-29 21:53:49 +000039using namespace llvm;
40
Owen Andersonb56fba02007-06-19 03:31:41 +000041//===----------------------------------------------------------------------===//
42// ValueTable Class
43//===----------------------------------------------------------------------===//
44
Owen Andersonfd5683a2007-06-21 00:19:05 +000045/// This class holds the mapping between values and value numbers. It is used
46/// as an efficient mechanism to determine the expression-wise equivalence of
47/// two values.
Owen Andersonb56fba02007-06-19 03:31:41 +000048
49namespace {
50 class VISIBILITY_HIDDEN ValueTable {
51 public:
52 struct Expression {
53 enum ExpressionOpcode { ADD, SUB, MUL, UDIV, SDIV, FDIV, UREM, SREM,
54 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
55 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
56 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
57 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
58 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
59 FCMPULT, FCMPULE, FCMPUNE };
60
61 ExpressionOpcode opcode;
62 uint32_t leftVN;
63 uint32_t rightVN;
64
65 bool operator< (const Expression& other) const {
66 if (opcode < other.opcode)
67 return true;
68 else if (opcode > other.opcode)
69 return false;
70 else if (leftVN < other.leftVN)
71 return true;
72 else if (leftVN > other.leftVN)
73 return false;
74 else if (rightVN < other.rightVN)
75 return true;
76 else if (rightVN > other.rightVN)
77 return false;
78 else
79 return false;
Owen Andersona75dd4d2007-06-12 00:50:47 +000080 }
Owen Andersonb56fba02007-06-19 03:31:41 +000081 };
82
83 private:
Owen Anderson1ad2c102007-06-19 23:23:54 +000084 DenseMap<Value*, uint32_t> valueNumbering;
Owen Andersonb56fba02007-06-19 03:31:41 +000085 std::map<Expression, uint32_t> expressionNumbering;
86
87 std::set<Expression> maximalExpressions;
88 std::set<Value*> maximalValues;
89
90 uint32_t nextValueNumber;
91
92 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
93 Expression::ExpressionOpcode getOpcode(CmpInst* C);
Owen Andersonfd5683a2007-06-21 00:19:05 +000094 Expression create_expression(BinaryOperator* BO);
95 Expression create_expression(CmpInst* C);
Owen Andersonb56fba02007-06-19 03:31:41 +000096 public:
97 ValueTable() { nextValueNumber = 1; }
98 uint32_t lookup_or_add(Value* V);
99 uint32_t lookup(Value* V);
100 void add(Value* V, uint32_t num);
101 void clear();
102 std::set<Expression>& getMaximalExpressions() {
103 return maximalExpressions;
104
105 }
106 std::set<Value*>& getMaximalValues() { return maximalValues; }
Owen Anderson91c54952007-06-19 05:37:32 +0000107 void erase(Value* v);
Owen Andersonb56fba02007-06-19 03:31:41 +0000108 };
109}
110
Owen Andersonfd5683a2007-06-21 00:19:05 +0000111//===----------------------------------------------------------------------===//
112// ValueTable Internal Functions
113//===----------------------------------------------------------------------===//
Owen Andersonb56fba02007-06-19 03:31:41 +0000114ValueTable::Expression::ExpressionOpcode
Owen Andersonfd5683a2007-06-21 00:19:05 +0000115 ValueTable::getOpcode(BinaryOperator* BO) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000116 switch(BO->getOpcode()) {
117 case Instruction::Add:
118 return Expression::ADD;
119 case Instruction::Sub:
120 return Expression::SUB;
121 case Instruction::Mul:
122 return Expression::MUL;
123 case Instruction::UDiv:
124 return Expression::UDIV;
125 case Instruction::SDiv:
126 return Expression::SDIV;
127 case Instruction::FDiv:
128 return Expression::FDIV;
129 case Instruction::URem:
130 return Expression::UREM;
131 case Instruction::SRem:
132 return Expression::SREM;
133 case Instruction::FRem:
134 return Expression::FREM;
135 case Instruction::Shl:
136 return Expression::SHL;
137 case Instruction::LShr:
138 return Expression::LSHR;
139 case Instruction::AShr:
140 return Expression::ASHR;
141 case Instruction::And:
142 return Expression::AND;
143 case Instruction::Or:
144 return Expression::OR;
145 case Instruction::Xor:
146 return Expression::XOR;
147
148 // THIS SHOULD NEVER HAPPEN
149 default:
150 assert(0 && "Binary operator with unknown opcode?");
151 return Expression::ADD;
152 }
153}
154
155ValueTable::Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
156 if (C->getOpcode() == Instruction::ICmp) {
157 switch (C->getPredicate()) {
158 case ICmpInst::ICMP_EQ:
159 return Expression::ICMPEQ;
160 case ICmpInst::ICMP_NE:
161 return Expression::ICMPNE;
162 case ICmpInst::ICMP_UGT:
163 return Expression::ICMPUGT;
164 case ICmpInst::ICMP_UGE:
165 return Expression::ICMPUGE;
166 case ICmpInst::ICMP_ULT:
167 return Expression::ICMPULT;
168 case ICmpInst::ICMP_ULE:
169 return Expression::ICMPULE;
170 case ICmpInst::ICMP_SGT:
171 return Expression::ICMPSGT;
172 case ICmpInst::ICMP_SGE:
173 return Expression::ICMPSGE;
174 case ICmpInst::ICMP_SLT:
175 return Expression::ICMPSLT;
176 case ICmpInst::ICMP_SLE:
177 return Expression::ICMPSLE;
178
179 // THIS SHOULD NEVER HAPPEN
180 default:
181 assert(0 && "Comparison with unknown predicate?");
182 return Expression::ICMPEQ;
183 }
184 } else {
185 switch (C->getPredicate()) {
186 case FCmpInst::FCMP_OEQ:
187 return Expression::FCMPOEQ;
188 case FCmpInst::FCMP_OGT:
189 return Expression::FCMPOGT;
190 case FCmpInst::FCMP_OGE:
191 return Expression::FCMPOGE;
192 case FCmpInst::FCMP_OLT:
193 return Expression::FCMPOLT;
194 case FCmpInst::FCMP_OLE:
195 return Expression::FCMPOLE;
196 case FCmpInst::FCMP_ONE:
197 return Expression::FCMPONE;
198 case FCmpInst::FCMP_ORD:
199 return Expression::FCMPORD;
200 case FCmpInst::FCMP_UNO:
201 return Expression::FCMPUNO;
202 case FCmpInst::FCMP_UEQ:
203 return Expression::FCMPUEQ;
204 case FCmpInst::FCMP_UGT:
205 return Expression::FCMPUGT;
206 case FCmpInst::FCMP_UGE:
207 return Expression::FCMPUGE;
208 case FCmpInst::FCMP_ULT:
209 return Expression::FCMPULT;
210 case FCmpInst::FCMP_ULE:
211 return Expression::FCMPULE;
212 case FCmpInst::FCMP_UNE:
213 return Expression::FCMPUNE;
214
215 // THIS SHOULD NEVER HAPPEN
216 default:
217 assert(0 && "Comparison with unknown predicate?");
218 return Expression::FCMPOEQ;
Owen Anderson223718c2007-06-09 18:35:31 +0000219 }
220 }
Owen Andersonb56fba02007-06-19 03:31:41 +0000221}
222
Owen Andersonfd5683a2007-06-21 00:19:05 +0000223ValueTable::Expression ValueTable::create_expression(BinaryOperator* BO) {
224 Expression e;
225
226 e.leftVN = lookup_or_add(BO->getOperand(0));
227 e.rightVN = lookup_or_add(BO->getOperand(1));
228 e.opcode = getOpcode(BO);
229
230 maximalExpressions.insert(e);
231
232 return e;
233}
234
235ValueTable::Expression ValueTable::create_expression(CmpInst* C) {
236 Expression e;
237
238 e.leftVN = lookup_or_add(C->getOperand(0));
239 e.rightVN = lookup_or_add(C->getOperand(1));
240 e.opcode = getOpcode(C);
241
242 maximalExpressions.insert(e);
243
244 return e;
245}
246
247//===----------------------------------------------------------------------===//
248// ValueTable External Functions
249//===----------------------------------------------------------------------===//
250
251/// lookup_or_add - Returns the value number for the specified value, assigning
252/// it a new number if it did not have one before.
Owen Andersonb56fba02007-06-19 03:31:41 +0000253uint32_t ValueTable::lookup_or_add(Value* V) {
254 maximalValues.insert(V);
255
Owen Anderson1ad2c102007-06-19 23:23:54 +0000256 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Andersonb56fba02007-06-19 03:31:41 +0000257 if (VI != valueNumbering.end())
258 return VI->second;
Owen Anderson223718c2007-06-09 18:35:31 +0000259
Owen Anderson223718c2007-06-09 18:35:31 +0000260
Owen Andersonb56fba02007-06-19 03:31:41 +0000261 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
262 Expression e = create_expression(BO);
263
264 std::map<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
265 if (EI != expressionNumbering.end()) {
266 valueNumbering.insert(std::make_pair(V, EI->second));
267 return EI->second;
268 } else {
269 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
270 valueNumbering.insert(std::make_pair(V, nextValueNumber));
271
272 return nextValueNumber++;
273 }
274 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
275 Expression e = create_expression(C);
276
277 std::map<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
278 if (EI != expressionNumbering.end()) {
279 valueNumbering.insert(std::make_pair(V, EI->second));
280 return EI->second;
281 } else {
282 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
283 valueNumbering.insert(std::make_pair(V, nextValueNumber));
284
285 return nextValueNumber++;
286 }
287 } else {
288 valueNumbering.insert(std::make_pair(V, nextValueNumber));
289 return nextValueNumber++;
Owen Anderson0b68cda2007-06-03 05:55:58 +0000290 }
Owen Andersonb56fba02007-06-19 03:31:41 +0000291}
292
Owen Andersonfd5683a2007-06-21 00:19:05 +0000293/// lookup - Returns the value number of the specified value. Fails if
294/// the value has not yet been numbered.
Owen Andersonb56fba02007-06-19 03:31:41 +0000295uint32_t ValueTable::lookup(Value* V) {
Owen Anderson1ad2c102007-06-19 23:23:54 +0000296 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Andersonb56fba02007-06-19 03:31:41 +0000297 if (VI != valueNumbering.end())
298 return VI->second;
299 else
300 assert(0 && "Value not numbered?");
301
302 return 0;
303}
304
Owen Andersonfd5683a2007-06-21 00:19:05 +0000305/// add - Add the specified value with the given value number, removing
306/// its old number, if any
Owen Andersonb56fba02007-06-19 03:31:41 +0000307void ValueTable::add(Value* V, uint32_t num) {
Owen Anderson1ad2c102007-06-19 23:23:54 +0000308 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Andersonb56fba02007-06-19 03:31:41 +0000309 if (VI != valueNumbering.end())
310 valueNumbering.erase(VI);
311 valueNumbering.insert(std::make_pair(V, num));
312}
313
Owen Andersonfd5683a2007-06-21 00:19:05 +0000314/// clear - Remove all entries from the ValueTable and the maximal sets
Owen Andersonb56fba02007-06-19 03:31:41 +0000315void ValueTable::clear() {
316 valueNumbering.clear();
317 expressionNumbering.clear();
Owen Andersonb9cbaed2007-06-19 04:32:55 +0000318 maximalExpressions.clear();
319 maximalValues.clear();
Owen Andersonb56fba02007-06-19 03:31:41 +0000320 nextValueNumber = 1;
321}
Owen Anderson0b68cda2007-06-03 05:55:58 +0000322
Owen Andersonfd5683a2007-06-21 00:19:05 +0000323/// erase - Remove a value from the value numbering and maximal sets
Owen Anderson91c54952007-06-19 05:37:32 +0000324void ValueTable::erase(Value* V) {
325 maximalValues.erase(V);
326 valueNumbering.erase(V);
327 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V))
328 maximalExpressions.erase(create_expression(BO));
329 else if (CmpInst* C = dyn_cast<CmpInst>(V))
330 maximalExpressions.erase(create_expression(C));
331}
332
Owen Andersonfd5683a2007-06-21 00:19:05 +0000333//===----------------------------------------------------------------------===//
334// GVNPRE Pass
335//===----------------------------------------------------------------------===//
336
Owen Anderson5fba6c12007-05-29 21:53:49 +0000337namespace {
338
339 class VISIBILITY_HIDDEN GVNPRE : public FunctionPass {
340 bool runOnFunction(Function &F);
341 public:
342 static char ID; // Pass identification, replacement for typeid
Owen Andersonb9cbaed2007-06-19 04:32:55 +0000343 GVNPRE() : FunctionPass((intptr_t)&ID) { }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000344
345 private:
Owen Andersonbe802402007-06-08 01:03:01 +0000346 ValueTable VN;
Owen Andersona75dd4d2007-06-12 00:50:47 +0000347 std::vector<Instruction*> createdExpressions;
Owen Anderson81d156e2007-05-31 00:42:15 +0000348
Owen Andersonb56fba02007-06-19 03:31:41 +0000349 std::map<BasicBlock*, std::set<Value*> > availableOut;
350 std::map<BasicBlock*, std::set<Value*> > anticipatedIn;
Owen Anderson4036ad42007-06-12 22:43:57 +0000351
Owen Andersonfd5683a2007-06-21 00:19:05 +0000352 // This transformation requires dominator postdominator info
Owen Anderson5fba6c12007-05-29 21:53:49 +0000353 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
354 AU.setPreservesCFG();
355 AU.addRequired<DominatorTree>();
356 AU.addRequired<PostDominatorTree>();
357 }
358
359 // Helper fuctions
360 // FIXME: eliminate or document these better
Owen Anderson2e5efc32007-06-08 01:52:45 +0000361 void dump(const std::set<Value*>& s) const;
Owen Andersonb56fba02007-06-19 03:31:41 +0000362 void clean(std::set<Value*>& set);
363 Value* find_leader(std::set<Value*>& vals,
364 uint32_t v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000365 Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ);
Owen Andersonb56fba02007-06-19 03:31:41 +0000366 void phi_translate_set(std::set<Value*>& anticIn, BasicBlock* pred,
367 BasicBlock* succ, std::set<Value*>& out);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000368
Owen Andersonb56fba02007-06-19 03:31:41 +0000369 void topo_sort(std::set<Value*>& set,
Owen Anderson0b68cda2007-06-03 05:55:58 +0000370 std::vector<Value*>& vec);
Owen Anderson331bf6a2007-05-31 22:44:11 +0000371
Owen Anderson42769842007-06-12 16:57:50 +0000372 void cleanup();
Owen Anderson06c1e582007-06-20 22:10:02 +0000373 bool elimination();
Owen Andersondd998e12007-06-18 04:42:29 +0000374
Owen Andersonb56fba02007-06-19 03:31:41 +0000375 void val_insert(std::set<Value*>& s, Value* v);
376 void val_replace(std::set<Value*>& s, Value* v);
Owen Andersondd998e12007-06-18 04:42:29 +0000377 bool dependsOnInvoke(Value* V);
Owen Anderson06c1e582007-06-20 22:10:02 +0000378 void buildsets_availout(BasicBlock::iterator I,
379 std::set<Value*>& currAvail,
380 std::set<PHINode*>& currPhis,
381 std::set<Value*>& currExps,
382 std::set<Value*>& currTemps);
383 void buildsets_anticout(BasicBlock* BB,
384 std::set<Value*>& anticOut,
385 std::set<BasicBlock*>& visited);
386 bool buildsets_anticin(BasicBlock* BB,
387 std::set<Value*>& anticOut,
388 std::set<Value*>& currExps,
389 std::set<Value*>& currTemps,
390 std::set<BasicBlock*>& visited);
391 unsigned buildsets(Function& F);
392
393 void insertion_pre(Value* e, BasicBlock* BB,
394 std::map<BasicBlock*, Value*>& avail,
395 std::set<Value*>& new_set);
396 unsigned insertion_mergepoint(std::vector<Value*>& workList,
397 df_iterator<DomTreeNode*> D,
398 std::set<Value*>& new_set);
399 bool insertion(Function& F);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000400
401 };
402
403 char GVNPRE::ID = 0;
404
405}
406
Owen Andersonfd5683a2007-06-21 00:19:05 +0000407// createGVNPREPass - The public interface to this file...
Owen Anderson5fba6c12007-05-29 21:53:49 +0000408FunctionPass *llvm::createGVNPREPass() { return new GVNPRE(); }
409
410RegisterPass<GVNPRE> X("gvnpre",
411 "Global Value Numbering/Partial Redundancy Elimination");
412
Owen Anderson5fba6c12007-05-29 21:53:49 +0000413
Owen Anderson7d76b2a2007-06-08 22:02:36 +0000414STATISTIC(NumInsertedVals, "Number of values inserted");
415STATISTIC(NumInsertedPhis, "Number of PHI nodes inserted");
416STATISTIC(NumEliminated, "Number of redundant instructions eliminated");
417
Owen Andersonfd5683a2007-06-21 00:19:05 +0000418/// find_leader - Given a set and a value number, return the first
419/// element of the set with that value number, or 0 if no such element
420/// is present
Owen Andersonb56fba02007-06-19 03:31:41 +0000421Value* GVNPRE::find_leader(std::set<Value*>& vals, uint32_t v) {
422 for (std::set<Value*>::iterator I = vals.begin(), E = vals.end();
423 I != E; ++I)
424 if (v == VN.lookup(*I))
Owen Anderson0b68cda2007-06-03 05:55:58 +0000425 return *I;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000426
Owen Anderson0b68cda2007-06-03 05:55:58 +0000427 return 0;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000428}
429
Owen Andersonfd5683a2007-06-21 00:19:05 +0000430/// val_insert - Insert a value into a set only if there is not a value
431/// with the same value number already in the set
Owen Andersonb56fba02007-06-19 03:31:41 +0000432void GVNPRE::val_insert(std::set<Value*>& s, Value* v) {
433 uint32_t num = VN.lookup(v);
434 Value* leader = find_leader(s, num);
435 if (leader == 0)
436 s.insert(v);
437}
438
Owen Andersonfd5683a2007-06-21 00:19:05 +0000439/// val_replace - Insert a value into a set, replacing any values already in
440/// the set that have the same value number
Owen Andersonb56fba02007-06-19 03:31:41 +0000441void GVNPRE::val_replace(std::set<Value*>& s, Value* v) {
442 uint32_t num = VN.lookup(v);
443 Value* leader = find_leader(s, num);
444 while (leader != 0) {
445 s.erase(leader);
446 leader = find_leader(s, num);
447 }
448 s.insert(v);
449}
450
Owen Andersonfd5683a2007-06-21 00:19:05 +0000451/// phi_translate - Given a value, its parent block, and a predecessor of its
452/// parent, translate the value into legal for the predecessor block. This
453/// means translating its operands (and recursively, their operands) through
454/// any phi nodes in the parent into values available in the predecessor
Owen Anderson4036ad42007-06-12 22:43:57 +0000455Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
Owen Anderson38b6b222007-06-04 18:05:26 +0000456 if (V == 0)
457 return 0;
458
459 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000460 Value* newOp1 = 0;
461 if (isa<Instruction>(BO->getOperand(0)))
462 newOp1 = phi_translate(find_leader(anticipatedIn[succ],
463 VN.lookup(BO->getOperand(0))),
464 pred, succ);
465 else
466 newOp1 = BO->getOperand(0);
467
Owen Anderson38b6b222007-06-04 18:05:26 +0000468 if (newOp1 == 0)
469 return 0;
470
Owen Andersonb56fba02007-06-19 03:31:41 +0000471 Value* newOp2 = 0;
472 if (isa<Instruction>(BO->getOperand(1)))
473 newOp2 = phi_translate(find_leader(anticipatedIn[succ],
474 VN.lookup(BO->getOperand(1))),
475 pred, succ);
476 else
477 newOp2 = BO->getOperand(1);
478
Owen Anderson38b6b222007-06-04 18:05:26 +0000479 if (newOp2 == 0)
480 return 0;
481
482 if (newOp1 != BO->getOperand(0) || newOp2 != BO->getOperand(1)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000483 Instruction* newVal = BinaryOperator::create(BO->getOpcode(),
Owen Anderson38b6b222007-06-04 18:05:26 +0000484 newOp1, newOp2,
Owen Anderson91c54952007-06-19 05:37:32 +0000485 BO->getName()+".expr");
Owen Anderson55994f22007-06-08 20:44:02 +0000486
Owen Andersonb56fba02007-06-19 03:31:41 +0000487 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson4036ad42007-06-12 22:43:57 +0000488
Owen Andersonb56fba02007-06-19 03:31:41 +0000489 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000490 if (leader == 0) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000491 createdExpressions.push_back(newVal);
Owen Anderson38b6b222007-06-04 18:05:26 +0000492 return newVal;
Owen Andersonc8472092007-06-05 22:11:49 +0000493 } else {
Owen Anderson91c54952007-06-19 05:37:32 +0000494 VN.erase(newVal);
Owen Andersonc8472092007-06-05 22:11:49 +0000495 delete newVal;
Owen Anderson4036ad42007-06-12 22:43:57 +0000496 return leader;
Owen Andersonc8472092007-06-05 22:11:49 +0000497 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000498 }
499 } else if (PHINode* P = dyn_cast<PHINode>(V)) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000500 if (P->getParent() == succ)
Owen Anderson38b6b222007-06-04 18:05:26 +0000501 return P->getIncomingValueForBlock(pred);
Owen Anderson223718c2007-06-09 18:35:31 +0000502 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000503 Value* newOp1 = 0;
504 if (isa<Instruction>(C->getOperand(0)))
505 newOp1 = phi_translate(find_leader(anticipatedIn[succ],
506 VN.lookup(C->getOperand(0))),
507 pred, succ);
508 else
509 newOp1 = C->getOperand(0);
510
Owen Anderson223718c2007-06-09 18:35:31 +0000511 if (newOp1 == 0)
512 return 0;
513
Owen Andersonb56fba02007-06-19 03:31:41 +0000514 Value* newOp2 = 0;
515 if (isa<Instruction>(C->getOperand(1)))
516 newOp2 = phi_translate(find_leader(anticipatedIn[succ],
517 VN.lookup(C->getOperand(1))),
518 pred, succ);
519 else
520 newOp2 = C->getOperand(1);
521
Owen Anderson223718c2007-06-09 18:35:31 +0000522 if (newOp2 == 0)
523 return 0;
524
525 if (newOp1 != C->getOperand(0) || newOp2 != C->getOperand(1)) {
526 Instruction* newVal = CmpInst::create(C->getOpcode(),
527 C->getPredicate(),
528 newOp1, newOp2,
Owen Anderson91c54952007-06-19 05:37:32 +0000529 C->getName()+".expr");
Owen Anderson223718c2007-06-09 18:35:31 +0000530
Owen Andersonb56fba02007-06-19 03:31:41 +0000531 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson4036ad42007-06-12 22:43:57 +0000532
Owen Andersonb56fba02007-06-19 03:31:41 +0000533 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson4036ad42007-06-12 22:43:57 +0000534 if (leader == 0) {
Owen Andersona75dd4d2007-06-12 00:50:47 +0000535 createdExpressions.push_back(newVal);
Owen Anderson223718c2007-06-09 18:35:31 +0000536 return newVal;
537 } else {
Owen Anderson91c54952007-06-19 05:37:32 +0000538 VN.erase(newVal);
Owen Anderson223718c2007-06-09 18:35:31 +0000539 delete newVal;
Owen Anderson4036ad42007-06-12 22:43:57 +0000540 return leader;
Owen Anderson223718c2007-06-09 18:35:31 +0000541 }
542 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000543 }
544
545 return V;
546}
547
Owen Andersonfd5683a2007-06-21 00:19:05 +0000548/// phi_translate_set - Perform phi translation on every element of a set
Owen Andersonb56fba02007-06-19 03:31:41 +0000549void GVNPRE::phi_translate_set(std::set<Value*>& anticIn,
Owen Andersona75dd4d2007-06-12 00:50:47 +0000550 BasicBlock* pred, BasicBlock* succ,
Owen Andersonb56fba02007-06-19 03:31:41 +0000551 std::set<Value*>& out) {
552 for (std::set<Value*>::iterator I = anticIn.begin(),
Owen Anderson38b6b222007-06-04 18:05:26 +0000553 E = anticIn.end(); I != E; ++I) {
Owen Anderson4036ad42007-06-12 22:43:57 +0000554 Value* V = phi_translate(*I, pred, succ);
Owen Anderson38b6b222007-06-04 18:05:26 +0000555 if (V != 0)
556 out.insert(V);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000557 }
558}
559
Owen Andersonfd5683a2007-06-21 00:19:05 +0000560/// dependsOnInvoke - Test if a value has an phi node as an operand, any of
561/// whose inputs is an invoke instruction. If this is true, we cannot safely
562/// PRE the instruction or anything that depends on it.
Owen Andersondd998e12007-06-18 04:42:29 +0000563bool GVNPRE::dependsOnInvoke(Value* V) {
Owen Anderson2320d432007-06-19 23:07:16 +0000564 if (PHINode* p = dyn_cast<PHINode>(V)) {
565 for (PHINode::op_iterator I = p->op_begin(), E = p->op_end(); I != E; ++I)
566 if (isa<InvokeInst>(*I))
Owen Andersondd998e12007-06-18 04:42:29 +0000567 return true;
Owen Anderson2320d432007-06-19 23:07:16 +0000568 return false;
569 } else {
570 return false;
Owen Anderson658f2c42007-06-16 00:26:54 +0000571 }
Owen Anderson658f2c42007-06-16 00:26:54 +0000572}
573
Owen Andersonfd5683a2007-06-21 00:19:05 +0000574/// clean - Remove all non-opaque values from the set whose operands are not
575/// themselves in the set, as well as all values that depend on invokes (see
576/// above)
Owen Andersonb56fba02007-06-19 03:31:41 +0000577void GVNPRE::clean(std::set<Value*>& set) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000578 std::vector<Value*> worklist;
Owen Andersonbe802402007-06-08 01:03:01 +0000579 topo_sort(set, worklist);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000580
Owen Andersonbe802402007-06-08 01:03:01 +0000581 for (unsigned i = 0; i < worklist.size(); ++i) {
582 Value* v = worklist[i];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000583
Owen Anderson0b68cda2007-06-03 05:55:58 +0000584 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(v)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000585 bool lhsValid = !isa<Instruction>(BO->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 Andersonbe802402007-06-08 01:03:01 +0000588 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000589 if (VN.lookup(*I) == VN.lookup(BO->getOperand(0))) {
Owen Andersonbe802402007-06-08 01:03:01 +0000590 lhsValid = true;
591 break;
592 }
Owen Andersonb364b412007-06-18 04:30:44 +0000593 if (lhsValid)
594 lhsValid = !dependsOnInvoke(BO->getOperand(0));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000595
Owen Andersonbe802402007-06-08 01:03:01 +0000596 bool rhsValid = !isa<Instruction>(BO->getOperand(1));
597 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000598 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonf1c04e12007-06-18 04:31:21 +0000599 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000600 if (VN.lookup(*I) == VN.lookup(BO->getOperand(1))) {
Owen Andersonf1c04e12007-06-18 04:31:21 +0000601 rhsValid = true;
602 break;
603 }
Owen Andersonb364b412007-06-18 04:30:44 +0000604 if (rhsValid)
605 rhsValid = !dependsOnInvoke(BO->getOperand(1));
Owen Anderson5fba6c12007-05-29 21:53:49 +0000606
Owen Anderson0b68cda2007-06-03 05:55:58 +0000607 if (!lhsValid || !rhsValid)
608 set.erase(BO);
Owen Anderson223718c2007-06-09 18:35:31 +0000609 } else if (CmpInst* C = dyn_cast<CmpInst>(v)) {
610 bool lhsValid = !isa<Instruction>(C->getOperand(0));
611 if (!lhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000612 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000613 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000614 if (VN.lookup(*I) == VN.lookup(C->getOperand(0))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000615 lhsValid = true;
616 break;
617 }
Owen Anderson2320d432007-06-19 23:07:16 +0000618 if (lhsValid)
619 lhsValid = !dependsOnInvoke(C->getOperand(0));
Owen Anderson658f2c42007-06-16 00:26:54 +0000620
Owen Anderson223718c2007-06-09 18:35:31 +0000621 bool rhsValid = !isa<Instruction>(C->getOperand(1));
622 if (!rhsValid)
Owen Andersonb56fba02007-06-19 03:31:41 +0000623 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson223718c2007-06-09 18:35:31 +0000624 I != E; ++I)
Owen Andersonb56fba02007-06-19 03:31:41 +0000625 if (VN.lookup(*I) == VN.lookup(C->getOperand(1))) {
Owen Anderson223718c2007-06-09 18:35:31 +0000626 rhsValid = true;
627 break;
628 }
Owen Anderson2320d432007-06-19 23:07:16 +0000629 if (rhsValid)
630 rhsValid = !dependsOnInvoke(C->getOperand(1));
Owen Anderson223718c2007-06-09 18:35:31 +0000631
632 if (!lhsValid || !rhsValid)
633 set.erase(C);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000634 }
Owen Anderson5fba6c12007-05-29 21:53:49 +0000635 }
636}
637
Owen Andersonfd5683a2007-06-21 00:19:05 +0000638/// topo_sort - Given a set of values, sort them by topological
639/// order into the provided vector.
640void GVNPRE::topo_sort(std::set<Value*>& set, std::vector<Value*>& vec) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000641 std::set<Value*> toErase;
642 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000643 I != E; ++I) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000644 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000645 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
646 if (VN.lookup(BO->getOperand(0)) == VN.lookup(*SI) ||
647 VN.lookup(BO->getOperand(1)) == VN.lookup(*SI)) {
Owen Andersonbe802402007-06-08 01:03:01 +0000648 toErase.insert(*SI);
Owen Anderson0b68cda2007-06-03 05:55:58 +0000649 }
Owen Anderson223718c2007-06-09 18:35:31 +0000650 }
651 else if (CmpInst* C = dyn_cast<CmpInst>(*I))
Owen Andersonb56fba02007-06-19 03:31:41 +0000652 for (std::set<Value*>::iterator SI = set.begin(); SI != E; ++SI) {
653 if (VN.lookup(C->getOperand(0)) == VN.lookup(*SI) ||
654 VN.lookup(C->getOperand(1)) == VN.lookup(*SI)) {
Owen Anderson223718c2007-06-09 18:35:31 +0000655 toErase.insert(*SI);
656 }
657 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000658 }
659
Owen Anderson0b68cda2007-06-03 05:55:58 +0000660 std::vector<Value*> Q;
Owen Andersonb56fba02007-06-19 03:31:41 +0000661 for (std::set<Value*>::iterator I = set.begin(), E = set.end();
Owen Andersonbe802402007-06-08 01:03:01 +0000662 I != E; ++I) {
663 if (toErase.find(*I) == toErase.end())
664 Q.push_back(*I);
665 }
Owen Anderson331bf6a2007-05-31 22:44:11 +0000666
Owen Andersonddbe4302007-06-05 23:46:12 +0000667 std::set<Value*> visited;
Owen Anderson331bf6a2007-05-31 22:44:11 +0000668 while (!Q.empty()) {
Owen Anderson0b68cda2007-06-03 05:55:58 +0000669 Value* e = Q.back();
670
671 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000672 Value* l = find_leader(set, VN.lookup(BO->getOperand(0)));
673 Value* r = find_leader(set, VN.lookup(BO->getOperand(1)));
Owen Anderson0b68cda2007-06-03 05:55:58 +0000674
Owen Andersonddbe4302007-06-05 23:46:12 +0000675 if (l != 0 && isa<Instruction>(l) &&
676 visited.find(l) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000677 Q.push_back(l);
Owen Andersonddbe4302007-06-05 23:46:12 +0000678 else if (r != 0 && isa<Instruction>(r) &&
679 visited.find(r) == visited.end())
Owen Anderson0b68cda2007-06-03 05:55:58 +0000680 Q.push_back(r);
681 else {
682 vec.push_back(e);
683 visited.insert(e);
684 Q.pop_back();
685 }
Owen Anderson223718c2007-06-09 18:35:31 +0000686 } else if (CmpInst* C = dyn_cast<CmpInst>(e)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000687 Value* l = find_leader(set, VN.lookup(C->getOperand(0)));
688 Value* r = find_leader(set, VN.lookup(C->getOperand(1)));
Owen Anderson223718c2007-06-09 18:35:31 +0000689
690 if (l != 0 && isa<Instruction>(l) &&
691 visited.find(l) == visited.end())
692 Q.push_back(l);
693 else if (r != 0 && isa<Instruction>(r) &&
694 visited.find(r) == visited.end())
695 Q.push_back(r);
696 else {
697 vec.push_back(e);
698 visited.insert(e);
699 Q.pop_back();
700 }
Owen Anderson0b68cda2007-06-03 05:55:58 +0000701 } else {
Owen Anderson331bf6a2007-05-31 22:44:11 +0000702 visited.insert(e);
703 vec.push_back(e);
704 Q.pop_back();
Owen Anderson331bf6a2007-05-31 22:44:11 +0000705 }
706 }
707}
708
Owen Andersonfd5683a2007-06-21 00:19:05 +0000709/// dump - Dump a set of values to standard error
Owen Anderson2e5efc32007-06-08 01:52:45 +0000710void GVNPRE::dump(const std::set<Value*>& s) const {
Owen Anderson4a6ec8f2007-05-29 23:15:21 +0000711 DOUT << "{ ";
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000712 for (std::set<Value*>::iterator I = s.begin(), E = s.end();
713 I != E; ++I) {
714 DEBUG((*I)->dump());
715 }
716 DOUT << "}\n\n";
717}
718
Owen Andersonfd5683a2007-06-21 00:19:05 +0000719/// elimination - Phase 3 of the main algorithm. Perform full redundancy
720/// elimination by walking the dominator tree and removing any instruction that
721/// is dominated by another instruction with the same value number.
Owen Anderson06c1e582007-06-20 22:10:02 +0000722bool GVNPRE::elimination() {
Owen Anderson42769842007-06-12 16:57:50 +0000723 DOUT << "\n\nPhase 3: Elimination\n\n";
724
Owen Anderson06c1e582007-06-20 22:10:02 +0000725 bool changed_function = false;
726
Owen Anderson42769842007-06-12 16:57:50 +0000727 std::vector<std::pair<Instruction*, Value*> > replace;
728 std::vector<Instruction*> erase;
729
730 DominatorTree& DT = getAnalysis<DominatorTree>();
731
732 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
733 E = df_end(DT.getRootNode()); DI != E; ++DI) {
734 BasicBlock* BB = DI->getBlock();
735
736 DOUT << "Block: " << BB->getName() << "\n";
Owen Anderson7b0fb442007-06-20 00:43:33 +0000737 dump(availableOut[BB]);
Owen Anderson42769842007-06-12 16:57:50 +0000738 DOUT << "\n\n";
739
740 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
741 BI != BE; ++BI) {
742
743 if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI)) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000744 Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
Owen Anderson42769842007-06-12 16:57:50 +0000745
746 if (leader != 0)
747 if (Instruction* Instr = dyn_cast<Instruction>(leader))
748 if (Instr->getParent() != 0 && Instr != BI) {
749 replace.push_back(std::make_pair(BI, leader));
750 erase.push_back(BI);
751 ++NumEliminated;
752 }
753 }
754 }
755 }
756
757 while (!replace.empty()) {
758 std::pair<Instruction*, Value*> rep = replace.back();
759 replace.pop_back();
760 rep.first->replaceAllUsesWith(rep.second);
Owen Andersonb0714bb2007-06-20 18:30:20 +0000761 changed_function = true;
Owen Anderson42769842007-06-12 16:57:50 +0000762 }
763
764 for (std::vector<Instruction*>::iterator I = erase.begin(), E = erase.end();
765 I != E; ++I)
766 (*I)->eraseFromParent();
Owen Anderson06c1e582007-06-20 22:10:02 +0000767
768 return changed_function;
Owen Anderson42769842007-06-12 16:57:50 +0000769}
770
Owen Andersonfd5683a2007-06-21 00:19:05 +0000771/// cleanup - Delete any extraneous values that were created to represent
772/// expressions without leaders.
Owen Anderson42769842007-06-12 16:57:50 +0000773void GVNPRE::cleanup() {
774 while (!createdExpressions.empty()) {
775 Instruction* I = createdExpressions.back();
776 createdExpressions.pop_back();
777
778 delete I;
779 }
780}
781
Owen Andersonfd5683a2007-06-21 00:19:05 +0000782/// buildsets_availout - When calculating availability, handle an instruction
783/// by inserting it into the appropriate sets
Owen Anderson06c1e582007-06-20 22:10:02 +0000784void GVNPRE::buildsets_availout(BasicBlock::iterator I,
785 std::set<Value*>& currAvail,
786 std::set<PHINode*>& currPhis,
787 std::set<Value*>& currExps,
788 std::set<Value*>& currTemps) {
789 // Handle PHI nodes...
790 if (PHINode* p = dyn_cast<PHINode>(I)) {
791 VN.lookup_or_add(p);
792 currPhis.insert(p);
793
794 // Handle binary ops...
795 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(I)) {
796 Value* leftValue = BO->getOperand(0);
797 Value* rightValue = BO->getOperand(1);
798
799 VN.lookup_or_add(BO);
800
801 if (isa<Instruction>(leftValue))
802 val_insert(currExps, leftValue);
803 if (isa<Instruction>(rightValue))
804 val_insert(currExps, rightValue);
805 val_insert(currExps, BO);
806
807 // Handle cmp ops...
808 } else if (CmpInst* C = dyn_cast<CmpInst>(I)) {
809 Value* leftValue = C->getOperand(0);
810 Value* rightValue = C->getOperand(1);
811
812 VN.lookup_or_add(C);
813
814 if (isa<Instruction>(leftValue))
815 val_insert(currExps, leftValue);
816 if (isa<Instruction>(rightValue))
817 val_insert(currExps, rightValue);
818 val_insert(currExps, C);
819
820 // Handle unsupported ops
821 } else if (!I->isTerminator()){
822 VN.lookup_or_add(I);
823 currTemps.insert(I);
824 }
825
826 if (!I->isTerminator())
827 val_insert(currAvail, I);
828}
Owen Anderson5fba6c12007-05-29 21:53:49 +0000829
Owen Andersonfd5683a2007-06-21 00:19:05 +0000830/// buildsets_anticout - When walking the postdom tree, calculate the ANTIC_OUT
831/// set as a function of the ANTIC_IN set of the block's predecessors
Owen Anderson06c1e582007-06-20 22:10:02 +0000832void GVNPRE::buildsets_anticout(BasicBlock* BB,
833 std::set<Value*>& anticOut,
834 std::set<BasicBlock*>& visited) {
835 if (BB->getTerminator()->getNumSuccessors() == 1) {
836 if (visited.find(BB->getTerminator()->getSuccessor(0)) == visited.end())
837 phi_translate_set(VN.getMaximalValues(), BB,
838 BB->getTerminator()->getSuccessor(0), anticOut);
839 else
840 phi_translate_set(anticipatedIn[BB->getTerminator()->getSuccessor(0)],
841 BB, BB->getTerminator()->getSuccessor(0), anticOut);
842 } else if (BB->getTerminator()->getNumSuccessors() > 1) {
843 BasicBlock* first = BB->getTerminator()->getSuccessor(0);
844 anticOut.insert(anticipatedIn[first].begin(), anticipatedIn[first].end());
845
846 for (unsigned i = 1; i < BB->getTerminator()->getNumSuccessors(); ++i) {
847 BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
848 std::set<Value*>& succAnticIn = anticipatedIn[currSucc];
849
850 std::set<Value*> temp;
851 std::insert_iterator<std::set<Value*> > temp_ins(temp, temp.begin());
852 std::set_intersection(anticOut.begin(), anticOut.end(),
853 succAnticIn.begin(), succAnticIn.end(), temp_ins);
854
855 anticOut.clear();
856 anticOut.insert(temp.begin(), temp.end());
857 }
858 }
859}
860
Owen Andersonfd5683a2007-06-21 00:19:05 +0000861/// buildsets_anticin - Walk the postdom tree, calculating ANTIC_OUT for
862/// each block. ANTIC_IN is then a function of ANTIC_OUT and the GEN
863/// sets populated in buildsets_availout
Owen Anderson06c1e582007-06-20 22:10:02 +0000864bool GVNPRE::buildsets_anticin(BasicBlock* BB,
865 std::set<Value*>& anticOut,
866 std::set<Value*>& currExps,
867 std::set<Value*>& currTemps,
868 std::set<BasicBlock*>& visited) {
869 std::set<Value*>& anticIn = anticipatedIn[BB];
870 std::set<Value*> old (anticIn.begin(), anticIn.end());
871
872 buildsets_anticout(BB, anticOut, visited);
873
874 std::set<Value*> S;
875 std::insert_iterator<std::set<Value*> > s_ins(S, S.begin());
876 std::set_difference(anticOut.begin(), anticOut.end(),
877 currTemps.begin(), currTemps.end(), s_ins);
878
879 anticIn.clear();
880 std::insert_iterator<std::set<Value*> > ai_ins(anticIn, anticIn.begin());
881 std::set_difference(currExps.begin(), currExps.end(),
882 currTemps.begin(), currTemps.end(), ai_ins);
883
884 for (std::set<Value*>::iterator I = S.begin(), E = S.end();
885 I != E; ++I) {
886 // For non-opaque values, we should already have a value numbering.
887 // However, for opaques, such as constants within PHI nodes, it is
888 // possible that they have not yet received a number. Make sure they do
889 // so now.
Owen Anderson27876a32007-06-21 01:59:05 +0000890 if (!isa<BinaryOperator>(*I) && !isa<CmpInst>(*I))
891 VN.lookup_or_add(*I);
892 val_insert(anticIn, *I);
Owen Anderson06c1e582007-06-20 22:10:02 +0000893 }
894
895 clean(anticIn);
896 anticOut.clear();
897
898 if (old.size() != anticIn.size())
899 return true;
900 else
901 return false;
902}
903
Owen Andersonfd5683a2007-06-21 00:19:05 +0000904/// buildsets - Phase 1 of the main algorithm. Construct the AVAIL_OUT
905/// and the ANTIC_IN sets.
Owen Anderson06c1e582007-06-20 22:10:02 +0000906unsigned GVNPRE::buildsets(Function& F) {
Owen Andersonb56fba02007-06-19 03:31:41 +0000907 std::map<BasicBlock*, std::set<Value*> > generatedExpressions;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000908 std::map<BasicBlock*, std::set<PHINode*> > generatedPhis;
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000909 std::map<BasicBlock*, std::set<Value*> > generatedTemporaries;
Owen Anderson06c1e582007-06-20 22:10:02 +0000910
Owen Anderson5fba6c12007-05-29 21:53:49 +0000911 DominatorTree &DT = getAnalysis<DominatorTree>();
912
Owen Anderson634a0632007-06-06 01:27:49 +0000913 // Phase 1, Part 1: calculate AVAIL_OUT
Owen Anderson5fba6c12007-05-29 21:53:49 +0000914
915 // Top-down walk of the dominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000916 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
Owen Anderson5fba6c12007-05-29 21:53:49 +0000917 E = df_end(DT.getRootNode()); DI != E; ++DI) {
918
919 // Get the sets to update for this block
Owen Andersonb56fba02007-06-19 03:31:41 +0000920 std::set<Value*>& currExps = generatedExpressions[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000921 std::set<PHINode*>& currPhis = generatedPhis[DI->getBlock()];
Owen Anderson0eca9aa2007-06-03 22:02:14 +0000922 std::set<Value*>& currTemps = generatedTemporaries[DI->getBlock()];
Owen Andersonb56fba02007-06-19 03:31:41 +0000923 std::set<Value*>& currAvail = availableOut[DI->getBlock()];
Owen Anderson5fba6c12007-05-29 21:53:49 +0000924
Owen Andersonb56fba02007-06-19 03:31:41 +0000925 BasicBlock* BB = DI->getBlock();
926
927 // A block inherits AVAIL_OUT from its dominator
928 if (DI->getIDom() != 0)
929 currAvail.insert(availableOut[DI->getIDom()->getBlock()].begin(),
930 availableOut[DI->getIDom()->getBlock()].end());
931
932
933 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
Owen Anderson06c1e582007-06-20 22:10:02 +0000934 BI != BE; ++BI)
935 buildsets_availout(BI, currAvail, currPhis, currExps, currTemps);
Owen Andersonb56fba02007-06-19 03:31:41 +0000936
Owen Anderson5fba6c12007-05-29 21:53:49 +0000937 }
938
Owen Anderson42769842007-06-12 16:57:50 +0000939 // If function has no exit blocks, only perform GVN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000940 PostDominatorTree &PDT = getAnalysis<PostDominatorTree>();
Owen Anderson42769842007-06-12 16:57:50 +0000941 if (PDT[&F.getEntryBlock()] == 0) {
Owen Anderson06c1e582007-06-20 22:10:02 +0000942 bool changed_function = elimination();
Owen Anderson42769842007-06-12 16:57:50 +0000943 cleanup();
944
Owen Anderson06c1e582007-06-20 22:10:02 +0000945 if (changed_function)
946 return 2; // Bailed early, made changes
947 else
948 return 1; // Bailed early, no changes
Owen Anderson42769842007-06-12 16:57:50 +0000949 }
950
Owen Anderson5fba6c12007-05-29 21:53:49 +0000951
Owen Anderson634a0632007-06-06 01:27:49 +0000952 // Phase 1, Part 2: calculate ANTIC_IN
Owen Anderson5fba6c12007-05-29 21:53:49 +0000953
Owen Anderson0c423072007-05-29 23:26:30 +0000954 std::set<BasicBlock*> visited;
955
Owen Anderson5fba6c12007-05-29 21:53:49 +0000956 bool changed = true;
957 unsigned iterations = 0;
958 while (changed) {
959 changed = false;
Owen Andersonb56fba02007-06-19 03:31:41 +0000960 std::set<Value*> anticOut;
Owen Anderson5fba6c12007-05-29 21:53:49 +0000961
962 // Top-down walk of the postdominator tree
Devang Patelbdd1aae2007-06-04 00:32:22 +0000963 for (df_iterator<DomTreeNode*> PDI =
Owen Andersonbe802402007-06-08 01:03:01 +0000964 df_begin(PDT.getRootNode()), E = df_end(PDT.getRootNode());
Owen Anderson5fba6c12007-05-29 21:53:49 +0000965 PDI != E; ++PDI) {
966 BasicBlock* BB = PDI->getBlock();
Owen Andersond184c182007-06-11 16:25:17 +0000967 if (BB == 0)
968 continue;
969
Owen Anderson0c423072007-05-29 23:26:30 +0000970 visited.insert(BB);
971
Owen Anderson06c1e582007-06-20 22:10:02 +0000972 changed |= buildsets_anticin(BB, anticOut, generatedTemporaries[BB],
973 generatedExpressions[BB], visited);
Owen Anderson5fba6c12007-05-29 21:53:49 +0000974 }
Owen Anderson38b6b222007-06-04 18:05:26 +0000975
Owen Anderson5fba6c12007-05-29 21:53:49 +0000976 iterations++;
977 }
978
Owen Anderson06c1e582007-06-20 22:10:02 +0000979 return 0; // No bail, no changes
980}
981
Owen Andersonfd5683a2007-06-21 00:19:05 +0000982/// insertion_pre - When a partial redundancy has been identified, eliminate it
983/// by inserting appropriate values into the predecessors and a phi node in
984/// the main block
Owen Anderson06c1e582007-06-20 22:10:02 +0000985void GVNPRE::insertion_pre(Value* e, BasicBlock* BB,
986 std::map<BasicBlock*, Value*>& avail,
987 std::set<Value*>& new_set) {
Owen Anderson06c1e582007-06-20 22:10:02 +0000988 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
989 Value* e2 = avail[*PI];
990 if (!find_leader(availableOut[*PI], VN.lookup(e2))) {
991 User* U = cast<User>(e2);
992
993 Value* s1 = 0;
994 if (isa<BinaryOperator>(U->getOperand(0)) ||
995 isa<CmpInst>(U->getOperand(0)))
996 s1 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(0)));
997 else
998 s1 = U->getOperand(0);
999
1000 Value* s2 = 0;
1001 if (isa<BinaryOperator>(U->getOperand(1)) ||
1002 isa<CmpInst>(U->getOperand(1)))
1003 s2 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(1)));
1004 else
1005 s2 = U->getOperand(1);
1006
1007 Value* newVal = 0;
1008 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
1009 newVal = BinaryOperator::create(BO->getOpcode(), s1, s2,
1010 BO->getName()+".gvnpre",
1011 (*PI)->getTerminator());
1012 else if (CmpInst* C = dyn_cast<CmpInst>(U))
1013 newVal = CmpInst::create(C->getOpcode(), C->getPredicate(), s1, s2,
1014 C->getName()+".gvnpre",
1015 (*PI)->getTerminator());
1016
1017 VN.add(newVal, VN.lookup(U));
1018
1019 std::set<Value*>& predAvail = availableOut[*PI];
1020 val_replace(predAvail, newVal);
Owen Andersonfd5683a2007-06-21 00:19:05 +00001021
Owen Anderson06c1e582007-06-20 22:10:02 +00001022 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, newVal));
1026
1027 ++NumInsertedVals;
1028 }
1029 }
1030
1031 PHINode* p = 0;
1032
1033 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
1034 if (p == 0)
1035 p = new PHINode(avail[*PI]->getType(), "gvnpre-join", BB->begin());
1036
1037 p->addIncoming(avail[*PI], *PI);
1038 }
1039
1040 VN.add(p, VN.lookup(e));
Owen Anderson06c1e582007-06-20 22:10:02 +00001041 val_replace(availableOut[BB], p);
Owen Anderson06c1e582007-06-20 22:10:02 +00001042 new_set.insert(p);
1043
1044 ++NumInsertedPhis;
1045}
1046
Owen Andersonfd5683a2007-06-21 00:19:05 +00001047/// insertion_mergepoint - When walking the dom tree, check at each merge
1048/// block for the possibility of a partial redundancy. If present, eliminate it
Owen Anderson06c1e582007-06-20 22:10:02 +00001049unsigned GVNPRE::insertion_mergepoint(std::vector<Value*>& workList,
1050 df_iterator<DomTreeNode*> D,
1051 std::set<Value*>& new_set) {
1052 bool changed_function = false;
1053 bool new_stuff = false;
1054
1055 BasicBlock* BB = D->getBlock();
1056 for (unsigned i = 0; i < workList.size(); ++i) {
1057 Value* e = workList[i];
1058
1059 if (isa<BinaryOperator>(e) || isa<CmpInst>(e)) {
1060 if (find_leader(availableOut[D->getIDom()->getBlock()],
1061 VN.lookup(e)) != 0)
1062 continue;
1063
1064 std::map<BasicBlock*, Value*> avail;
1065 bool by_some = false;
1066 int num_avail = 0;
1067
1068 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;
1069 ++PI) {
1070 Value *e2 = phi_translate(e, *PI, BB);
1071 Value *e3 = find_leader(availableOut[*PI], VN.lookup(e2));
1072
1073 if (e3 == 0) {
1074 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1075 if (av != avail.end())
1076 avail.erase(av);
1077 avail.insert(std::make_pair(*PI, e2));
1078 } else {
1079 std::map<BasicBlock*, Value*>::iterator av = avail.find(*PI);
1080 if (av != avail.end())
1081 avail.erase(av);
1082 avail.insert(std::make_pair(*PI, e3));
1083
1084 by_some = true;
1085 num_avail++;
1086 }
1087 }
1088
1089 if (by_some && num_avail < std::distance(pred_begin(BB), pred_end(BB))) {
1090 insertion_pre(e, BB, avail, new_set);
1091
1092 changed_function = true;
1093 new_stuff = true;
1094 }
1095 }
1096 }
1097
1098 unsigned retval = 0;
1099 if (changed_function)
1100 retval += 1;
1101 if (new_stuff)
1102 retval += 2;
1103
1104 return retval;
1105}
1106
Owen Andersonfd5683a2007-06-21 00:19:05 +00001107/// insert - Phase 2 of the main algorithm. Walk the dominator tree looking for
1108/// merge points. When one is found, check for a partial redundancy. If one is
1109/// present, eliminate it. Repeat this walk until no changes are made.
Owen Anderson06c1e582007-06-20 22:10:02 +00001110bool GVNPRE::insertion(Function& F) {
1111 bool changed_function = false;
1112
1113 DominatorTree &DT = getAnalysis<DominatorTree>();
Owen Andersonbe802402007-06-08 01:03:01 +00001114
Owen Andersonb56fba02007-06-19 03:31:41 +00001115 std::map<BasicBlock*, std::set<Value*> > new_sets;
Owen Andersonbe802402007-06-08 01:03:01 +00001116 bool new_stuff = true;
1117 while (new_stuff) {
1118 new_stuff = false;
Owen Andersonbe802402007-06-08 01:03:01 +00001119 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
1120 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1121 BasicBlock* BB = DI->getBlock();
1122
Owen Andersond184c182007-06-11 16:25:17 +00001123 if (BB == 0)
1124 continue;
1125
Owen Andersonb56fba02007-06-19 03:31:41 +00001126 std::set<Value*>& new_set = new_sets[BB];
1127 std::set<Value*>& availOut = availableOut[BB];
1128 std::set<Value*>& anticIn = anticipatedIn[BB];
Owen Andersonbe802402007-06-08 01:03:01 +00001129
Owen Anderson55994f22007-06-08 20:44:02 +00001130 new_set.clear();
1131
Owen Andersonbe802402007-06-08 01:03:01 +00001132 // Replace leaders with leaders inherited from dominator
1133 if (DI->getIDom() != 0) {
Owen Andersonb56fba02007-06-19 03:31:41 +00001134 std::set<Value*>& dom_set = new_sets[DI->getIDom()->getBlock()];
1135 for (std::set<Value*>::iterator I = dom_set.begin(),
Owen Andersonbe802402007-06-08 01:03:01 +00001136 E = dom_set.end(); I != E; ++I) {
1137 new_set.insert(*I);
Owen Andersonb56fba02007-06-19 03:31:41 +00001138 val_replace(availOut, *I);
Owen Andersonbe802402007-06-08 01:03:01 +00001139 }
1140 }
1141
1142 // If there is more than one predecessor...
1143 if (pred_begin(BB) != pred_end(BB) && ++pred_begin(BB) != pred_end(BB)) {
1144 std::vector<Value*> workList;
1145 topo_sort(anticIn, workList);
1146
1147 DOUT << "Merge Block: " << BB->getName() << "\n";
1148 DOUT << "ANTIC_IN: ";
Owen Anderson7b0fb442007-06-20 00:43:33 +00001149 dump(anticIn);
Owen Andersonbe802402007-06-08 01:03:01 +00001150 DOUT << "\n";
1151
Owen Anderson06c1e582007-06-20 22:10:02 +00001152 unsigned result = insertion_mergepoint(workList, DI, new_set);
1153 if (result & 1)
1154 changed_function = true;
1155 if (result & 2)
1156 new_stuff = true;
Owen Andersonbe802402007-06-08 01:03:01 +00001157 }
1158 }
Owen Andersonbe802402007-06-08 01:03:01 +00001159 }
Owen Anderson634a0632007-06-06 01:27:49 +00001160
Owen Anderson06c1e582007-06-20 22:10:02 +00001161 return changed_function;
1162}
1163
Owen Andersonfd5683a2007-06-21 00:19:05 +00001164// GVNPRE::runOnFunction - This is the main transformation entry point for a
1165// function.
1166//
Owen Anderson06c1e582007-06-20 22:10:02 +00001167bool GVNPRE::runOnFunction(Function &F) {
Owen Andersonfd5683a2007-06-21 00:19:05 +00001168 // Clean out global sets from any previous functions
Owen Anderson06c1e582007-06-20 22:10:02 +00001169 VN.clear();
1170 createdExpressions.clear();
1171 availableOut.clear();
1172 anticipatedIn.clear();
1173
1174 bool changed_function = false;
1175
1176 // Phase 1: BuildSets
Owen Andersonfd5683a2007-06-21 00:19:05 +00001177 // This phase calculates the AVAIL_OUT and ANTIC_IN sets
1178 // NOTE: If full postdom information is no available, this will bail
1179 // early, performing GVN but not PRE
Owen Anderson06c1e582007-06-20 22:10:02 +00001180 unsigned bail = buildsets(F);
1181 //If a bail occurred, terminate early
1182 if (bail != 0)
1183 return (bail == 2);
1184
1185 // Phase 2: Insert
Owen Andersonfd5683a2007-06-21 00:19:05 +00001186 // This phase inserts values to make partially redundant values
1187 // fully redundant
Owen Anderson06c1e582007-06-20 22:10:02 +00001188 changed_function |= insertion(F);
1189
Owen Anderson634a0632007-06-06 01:27:49 +00001190 // Phase 3: Eliminate
Owen Andersonfd5683a2007-06-21 00:19:05 +00001191 // This phase performs trivial full redundancy elimination
Owen Anderson06c1e582007-06-20 22:10:02 +00001192 changed_function |= elimination();
Owen Anderson55994f22007-06-08 20:44:02 +00001193
Owen Andersonbe802402007-06-08 01:03:01 +00001194 // Phase 4: Cleanup
Owen Andersonfd5683a2007-06-21 00:19:05 +00001195 // This phase cleans up values that were created solely
1196 // as leaders for expressions
Owen Anderson42769842007-06-12 16:57:50 +00001197 cleanup();
Owen Andersonbe802402007-06-08 01:03:01 +00001198
Owen Andersonb0714bb2007-06-20 18:30:20 +00001199 return changed_function;
Owen Anderson5fba6c12007-05-29 21:53:49 +00001200}