blob: b6296f72f3f4676033844bffb607d9f50b568440 [file] [log] [blame]
Owen Andersonea12a062007-05-29 21:53:49 +00001//===- GVNPRE.cpp - Eliminate redundant values and expressions ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Owen Andersonea12a062007-05-29 21:53:49 +00007//
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 Andersona7f916c2007-06-08 20:57:08 +000016// live ranges, and should be used with caution on platforms that are very
Owen Andersonea12a062007-05-29 21:53:49 +000017// sensitive to register pressure.
18//
Matthijs Kooijman845f5242008-06-05 07:55:49 +000019// Note that this pass does the value numbering itself, it does not use the
20// ValueNumbering analysis passes.
21//
Owen Andersonea12a062007-05-29 21:53:49 +000022//===----------------------------------------------------------------------===//
23
24#define DEBUG_TYPE "gvnpre"
25#include "llvm/Value.h"
26#include "llvm/Transforms/Scalar.h"
27#include "llvm/Instructions.h"
28#include "llvm/Function.h"
Owen Anderson40dc00e2007-06-29 00:40:05 +000029#include "llvm/DerivedTypes.h"
Owen Andersonea12a062007-05-29 21:53:49 +000030#include "llvm/Analysis/Dominators.h"
Owen Anderson82575d82007-06-22 00:20:30 +000031#include "llvm/ADT/BitVector.h"
Owen Anderson4f703ec2007-06-19 23:23:54 +000032#include "llvm/ADT/DenseMap.h"
Owen Andersonea12a062007-05-29 21:53:49 +000033#include "llvm/ADT/DepthFirstIterator.h"
Owen Anderson9030d382007-06-25 18:25:31 +000034#include "llvm/ADT/PostOrderIterator.h"
Owen Anderson66fd9062007-06-21 17:57:53 +000035#include "llvm/ADT/SmallPtrSet.h"
Owen Andersonfb665412007-07-19 06:13:15 +000036#include "llvm/ADT/SmallVector.h"
Owen Andersonea12a062007-05-29 21:53:49 +000037#include "llvm/ADT/Statistic.h"
Owen Anderson2a5c9d82007-07-05 23:11:26 +000038#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
Owen Anderson397d4052007-06-08 01:03:01 +000039#include "llvm/Support/CFG.h"
Owen Andersonea12a062007-05-29 21:53:49 +000040#include "llvm/Support/Compiler.h"
Owen Andersoncdf8efd2007-05-29 23:15:21 +000041#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000042#include "llvm/Support/ErrorHandling.h"
Owen Andersonea12a062007-05-29 21:53:49 +000043#include <algorithm>
Owen Anderson243f3482007-05-31 22:44:11 +000044#include <deque>
Owen Andersonea12a062007-05-29 21:53:49 +000045#include <map>
Owen Andersonea12a062007-05-29 21:53:49 +000046using namespace llvm;
47
Owen Anderson086f5f32007-06-19 03:31:41 +000048//===----------------------------------------------------------------------===//
49// ValueTable Class
50//===----------------------------------------------------------------------===//
51
Dan Gohman844731a2008-05-13 00:00:25 +000052namespace {
53
Owen Anderson9cb56012007-06-21 00:19:05 +000054/// This class holds the mapping between values and value numbers. It is used
55/// as an efficient mechanism to determine the expression-wise equivalence of
56/// two values.
Owen Anderson086f5f32007-06-19 03:31:41 +000057
Owen Andersonfb665412007-07-19 06:13:15 +000058struct Expression {
Dan Gohmanae3a0be2009-06-04 22:49:04 +000059 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
60 UDIV, SDIV, FDIV, UREM, SREM,
Owen Andersonfb665412007-07-19 06:13:15 +000061 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
62 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
63 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
64 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
65 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
66 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
67 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
68 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
69 PTRTOINT, INTTOPTR, BITCAST, GEP, EMPTY,
70 TOMBSTONE };
71
72 ExpressionOpcode opcode;
73 const Type* type;
74 uint32_t firstVN;
75 uint32_t secondVN;
76 uint32_t thirdVN;
77 SmallVector<uint32_t, 4> varargs;
78
79 Expression() { }
Dan Gohman746767b2007-09-24 15:48:49 +000080 explicit Expression(ExpressionOpcode o) : opcode(o) { }
Owen Andersonfb665412007-07-19 06:13:15 +000081
82 bool operator==(const Expression &other) const {
83 if (opcode != other.opcode)
84 return false;
85 else if (opcode == EMPTY || opcode == TOMBSTONE)
86 return true;
87 else if (type != other.type)
88 return false;
89 else if (firstVN != other.firstVN)
90 return false;
91 else if (secondVN != other.secondVN)
92 return false;
93 else if (thirdVN != other.thirdVN)
94 return false;
95 else {
96 if (varargs.size() != other.varargs.size())
97 return false;
98
99 for (size_t i = 0; i < varargs.size(); ++i)
100 if (varargs[i] != other.varargs[i])
101 return false;
102
103 return true;
104 }
105 }
106
107 bool operator!=(const Expression &other) const {
108 if (opcode != other.opcode)
109 return true;
110 else if (opcode == EMPTY || opcode == TOMBSTONE)
111 return false;
112 else if (type != other.type)
113 return true;
114 else if (firstVN != other.firstVN)
115 return true;
116 else if (secondVN != other.secondVN)
117 return true;
118 else if (thirdVN != other.thirdVN)
119 return true;
120 else {
121 if (varargs.size() != other.varargs.size())
122 return true;
123
124 for (size_t i = 0; i < varargs.size(); ++i)
125 if (varargs[i] != other.varargs[i])
126 return true;
127
128 return false;
129 }
130 }
131};
132
Dan Gohman844731a2008-05-13 00:00:25 +0000133}
Owen Andersonfb665412007-07-19 06:13:15 +0000134
Owen Anderson086f5f32007-06-19 03:31:41 +0000135namespace {
136 class VISIBILITY_HIDDEN ValueTable {
Owen Anderson086f5f32007-06-19 03:31:41 +0000137 private:
Owen Anderson4f703ec2007-06-19 23:23:54 +0000138 DenseMap<Value*, uint32_t> valueNumbering;
Owen Andersonfb665412007-07-19 06:13:15 +0000139 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Anderson086f5f32007-06-19 03:31:41 +0000140
Owen Anderson086f5f32007-06-19 03:31:41 +0000141 uint32_t nextValueNumber;
142
143 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
144 Expression::ExpressionOpcode getOpcode(CmpInst* C);
Owen Andersonca6c31c2007-06-29 00:51:03 +0000145 Expression::ExpressionOpcode getOpcode(CastInst* C);
Owen Anderson9cb56012007-06-21 00:19:05 +0000146 Expression create_expression(BinaryOperator* BO);
147 Expression create_expression(CmpInst* C);
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000148 Expression create_expression(ShuffleVectorInst* V);
149 Expression create_expression(ExtractElementInst* C);
150 Expression create_expression(InsertElementInst* V);
Owen Anderson890e1a02007-06-28 23:51:21 +0000151 Expression create_expression(SelectInst* V);
Owen Andersonca6c31c2007-06-29 00:51:03 +0000152 Expression create_expression(CastInst* C);
Owen Andersoneb216862007-07-03 22:50:56 +0000153 Expression create_expression(GetElementPtrInst* G);
Owen Anderson086f5f32007-06-19 03:31:41 +0000154 public:
155 ValueTable() { nextValueNumber = 1; }
156 uint32_t lookup_or_add(Value* V);
Owen Anderson890e1a02007-06-28 23:51:21 +0000157 uint32_t lookup(Value* V) const;
Owen Anderson086f5f32007-06-19 03:31:41 +0000158 void add(Value* V, uint32_t num);
159 void clear();
Owen Anderson20cb51f2007-06-19 05:37:32 +0000160 void erase(Value* v);
Owen Anderson82575d82007-06-22 00:20:30 +0000161 unsigned size();
Owen Anderson086f5f32007-06-19 03:31:41 +0000162 };
163}
164
Owen Andersonfb665412007-07-19 06:13:15 +0000165namespace llvm {
Chris Lattner76c1b972007-09-17 18:34:04 +0000166template <> struct DenseMapInfo<Expression> {
Owen Anderson9fed5892007-08-02 18:20:52 +0000167 static inline Expression getEmptyKey() {
168 return Expression(Expression::EMPTY);
169 }
170
171 static inline Expression getTombstoneKey() {
172 return Expression(Expression::TOMBSTONE);
173 }
Owen Andersonfb665412007-07-19 06:13:15 +0000174
175 static unsigned getHashValue(const Expression e) {
176 unsigned hash = e.opcode;
177
178 hash = e.firstVN + hash * 37;
179 hash = e.secondVN + hash * 37;
180 hash = e.thirdVN + hash * 37;
181
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000182 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
183 (unsigned)((uintptr_t)e.type >> 9)) +
184 hash * 37;
Owen Andersonfb665412007-07-19 06:13:15 +0000185
Owen Anderson9fed5892007-08-02 18:20:52 +0000186 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
187 E = e.varargs.end(); I != E; ++I)
Owen Andersonfb665412007-07-19 06:13:15 +0000188 hash = *I + hash * 37;
189
190 return hash;
191 }
Chris Lattner76c1b972007-09-17 18:34:04 +0000192 static bool isEqual(const Expression &LHS, const Expression &RHS) {
193 return LHS == RHS;
194 }
Owen Andersonfb665412007-07-19 06:13:15 +0000195 static bool isPod() { return true; }
196};
197}
198
Owen Anderson9cb56012007-06-21 00:19:05 +0000199//===----------------------------------------------------------------------===//
200// ValueTable Internal Functions
201//===----------------------------------------------------------------------===//
Owen Andersonfb665412007-07-19 06:13:15 +0000202Expression::ExpressionOpcode
Owen Anderson9cb56012007-06-21 00:19:05 +0000203 ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson086f5f32007-06-19 03:31:41 +0000204 switch(BO->getOpcode()) {
205 case Instruction::Add:
206 return Expression::ADD;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000207 case Instruction::FAdd:
208 return Expression::FADD;
Owen Anderson086f5f32007-06-19 03:31:41 +0000209 case Instruction::Sub:
210 return Expression::SUB;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000211 case Instruction::FSub:
212 return Expression::FSUB;
Owen Anderson086f5f32007-06-19 03:31:41 +0000213 case Instruction::Mul:
214 return Expression::MUL;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000215 case Instruction::FMul:
216 return Expression::FMUL;
Owen Anderson086f5f32007-06-19 03:31:41 +0000217 case Instruction::UDiv:
218 return Expression::UDIV;
219 case Instruction::SDiv:
220 return Expression::SDIV;
221 case Instruction::FDiv:
222 return Expression::FDIV;
223 case Instruction::URem:
224 return Expression::UREM;
225 case Instruction::SRem:
226 return Expression::SREM;
227 case Instruction::FRem:
228 return Expression::FREM;
229 case Instruction::Shl:
230 return Expression::SHL;
231 case Instruction::LShr:
232 return Expression::LSHR;
233 case Instruction::AShr:
234 return Expression::ASHR;
235 case Instruction::And:
236 return Expression::AND;
237 case Instruction::Or:
238 return Expression::OR;
239 case Instruction::Xor:
240 return Expression::XOR;
241
242 // THIS SHOULD NEVER HAPPEN
243 default:
Torok Edwinc23197a2009-07-14 16:55:14 +0000244 llvm_unreachable("Binary operator with unknown opcode?");
Owen Anderson086f5f32007-06-19 03:31:41 +0000245 return Expression::ADD;
246 }
247}
248
Owen Andersonfb665412007-07-19 06:13:15 +0000249Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Owen Anderson086f5f32007-06-19 03:31:41 +0000250 if (C->getOpcode() == Instruction::ICmp) {
251 switch (C->getPredicate()) {
252 case ICmpInst::ICMP_EQ:
253 return Expression::ICMPEQ;
254 case ICmpInst::ICMP_NE:
255 return Expression::ICMPNE;
256 case ICmpInst::ICMP_UGT:
257 return Expression::ICMPUGT;
258 case ICmpInst::ICMP_UGE:
259 return Expression::ICMPUGE;
260 case ICmpInst::ICMP_ULT:
261 return Expression::ICMPULT;
262 case ICmpInst::ICMP_ULE:
263 return Expression::ICMPULE;
264 case ICmpInst::ICMP_SGT:
265 return Expression::ICMPSGT;
266 case ICmpInst::ICMP_SGE:
267 return Expression::ICMPSGE;
268 case ICmpInst::ICMP_SLT:
269 return Expression::ICMPSLT;
270 case ICmpInst::ICMP_SLE:
271 return Expression::ICMPSLE;
272
273 // THIS SHOULD NEVER HAPPEN
274 default:
Torok Edwinc23197a2009-07-14 16:55:14 +0000275 llvm_unreachable("Comparison with unknown predicate?");
Owen Anderson086f5f32007-06-19 03:31:41 +0000276 return Expression::ICMPEQ;
277 }
278 } else {
279 switch (C->getPredicate()) {
280 case FCmpInst::FCMP_OEQ:
281 return Expression::FCMPOEQ;
282 case FCmpInst::FCMP_OGT:
283 return Expression::FCMPOGT;
284 case FCmpInst::FCMP_OGE:
285 return Expression::FCMPOGE;
286 case FCmpInst::FCMP_OLT:
287 return Expression::FCMPOLT;
288 case FCmpInst::FCMP_OLE:
289 return Expression::FCMPOLE;
290 case FCmpInst::FCMP_ONE:
291 return Expression::FCMPONE;
292 case FCmpInst::FCMP_ORD:
293 return Expression::FCMPORD;
294 case FCmpInst::FCMP_UNO:
295 return Expression::FCMPUNO;
296 case FCmpInst::FCMP_UEQ:
297 return Expression::FCMPUEQ;
298 case FCmpInst::FCMP_UGT:
299 return Expression::FCMPUGT;
300 case FCmpInst::FCMP_UGE:
301 return Expression::FCMPUGE;
302 case FCmpInst::FCMP_ULT:
303 return Expression::FCMPULT;
304 case FCmpInst::FCMP_ULE:
305 return Expression::FCMPULE;
306 case FCmpInst::FCMP_UNE:
307 return Expression::FCMPUNE;
308
309 // THIS SHOULD NEVER HAPPEN
310 default:
Torok Edwinc23197a2009-07-14 16:55:14 +0000311 llvm_unreachable("Comparison with unknown predicate?");
Owen Anderson086f5f32007-06-19 03:31:41 +0000312 return Expression::FCMPOEQ;
Owen Anderson139fe842007-06-09 18:35:31 +0000313 }
314 }
Owen Anderson086f5f32007-06-19 03:31:41 +0000315}
316
Owen Andersonfb665412007-07-19 06:13:15 +0000317Expression::ExpressionOpcode
Owen Andersonca6c31c2007-06-29 00:51:03 +0000318 ValueTable::getOpcode(CastInst* C) {
319 switch(C->getOpcode()) {
320 case Instruction::Trunc:
321 return Expression::TRUNC;
322 case Instruction::ZExt:
323 return Expression::ZEXT;
324 case Instruction::SExt:
325 return Expression::SEXT;
326 case Instruction::FPToUI:
327 return Expression::FPTOUI;
328 case Instruction::FPToSI:
329 return Expression::FPTOSI;
330 case Instruction::UIToFP:
331 return Expression::UITOFP;
332 case Instruction::SIToFP:
333 return Expression::SITOFP;
334 case Instruction::FPTrunc:
335 return Expression::FPTRUNC;
336 case Instruction::FPExt:
337 return Expression::FPEXT;
338 case Instruction::PtrToInt:
339 return Expression::PTRTOINT;
340 case Instruction::IntToPtr:
341 return Expression::INTTOPTR;
342 case Instruction::BitCast:
343 return Expression::BITCAST;
344
345 // THIS SHOULD NEVER HAPPEN
346 default:
Torok Edwinc23197a2009-07-14 16:55:14 +0000347 llvm_unreachable("Cast operator with unknown opcode?");
Owen Andersonca6c31c2007-06-29 00:51:03 +0000348 return Expression::BITCAST;
349 }
350}
351
Owen Andersonfb665412007-07-19 06:13:15 +0000352Expression ValueTable::create_expression(BinaryOperator* BO) {
Owen Anderson9cb56012007-06-21 00:19:05 +0000353 Expression e;
354
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000355 e.firstVN = lookup_or_add(BO->getOperand(0));
356 e.secondVN = lookup_or_add(BO->getOperand(1));
357 e.thirdVN = 0;
Owen Anderson40dc00e2007-06-29 00:40:05 +0000358 e.type = BO->getType();
Owen Anderson9cb56012007-06-21 00:19:05 +0000359 e.opcode = getOpcode(BO);
360
Owen Anderson9cb56012007-06-21 00:19:05 +0000361 return e;
362}
363
Owen Andersonfb665412007-07-19 06:13:15 +0000364Expression ValueTable::create_expression(CmpInst* C) {
Owen Anderson9cb56012007-06-21 00:19:05 +0000365 Expression e;
366
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000367 e.firstVN = lookup_or_add(C->getOperand(0));
368 e.secondVN = lookup_or_add(C->getOperand(1));
369 e.thirdVN = 0;
Owen Anderson40dc00e2007-06-29 00:40:05 +0000370 e.type = C->getType();
Owen Anderson9cb56012007-06-21 00:19:05 +0000371 e.opcode = getOpcode(C);
372
Owen Anderson9cb56012007-06-21 00:19:05 +0000373 return e;
374}
375
Owen Andersonfb665412007-07-19 06:13:15 +0000376Expression ValueTable::create_expression(CastInst* C) {
Owen Andersonca6c31c2007-06-29 00:51:03 +0000377 Expression e;
378
379 e.firstVN = lookup_or_add(C->getOperand(0));
380 e.secondVN = 0;
381 e.thirdVN = 0;
382 e.type = C->getType();
383 e.opcode = getOpcode(C);
384
385 return e;
386}
387
Owen Andersonfb665412007-07-19 06:13:15 +0000388Expression ValueTable::create_expression(ShuffleVectorInst* S) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000389 Expression e;
390
391 e.firstVN = lookup_or_add(S->getOperand(0));
392 e.secondVN = lookup_or_add(S->getOperand(1));
393 e.thirdVN = lookup_or_add(S->getOperand(2));
Owen Anderson40dc00e2007-06-29 00:40:05 +0000394 e.type = S->getType();
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000395 e.opcode = Expression::SHUFFLE;
396
397 return e;
398}
399
Owen Andersonfb665412007-07-19 06:13:15 +0000400Expression ValueTable::create_expression(ExtractElementInst* E) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000401 Expression e;
402
403 e.firstVN = lookup_or_add(E->getOperand(0));
404 e.secondVN = lookup_or_add(E->getOperand(1));
405 e.thirdVN = 0;
Owen Anderson40dc00e2007-06-29 00:40:05 +0000406 e.type = E->getType();
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000407 e.opcode = Expression::EXTRACT;
408
409 return e;
410}
411
Owen Andersonfb665412007-07-19 06:13:15 +0000412Expression ValueTable::create_expression(InsertElementInst* I) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000413 Expression e;
414
415 e.firstVN = lookup_or_add(I->getOperand(0));
416 e.secondVN = lookup_or_add(I->getOperand(1));
417 e.thirdVN = lookup_or_add(I->getOperand(2));
Owen Anderson40dc00e2007-06-29 00:40:05 +0000418 e.type = I->getType();
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000419 e.opcode = Expression::INSERT;
420
421 return e;
422}
423
Owen Andersonfb665412007-07-19 06:13:15 +0000424Expression ValueTable::create_expression(SelectInst* I) {
Owen Anderson890e1a02007-06-28 23:51:21 +0000425 Expression e;
426
427 e.firstVN = lookup_or_add(I->getCondition());
428 e.secondVN = lookup_or_add(I->getTrueValue());
429 e.thirdVN = lookup_or_add(I->getFalseValue());
Owen Anderson40dc00e2007-06-29 00:40:05 +0000430 e.type = I->getType();
Owen Anderson890e1a02007-06-28 23:51:21 +0000431 e.opcode = Expression::SELECT;
432
433 return e;
434}
435
Owen Andersonfb665412007-07-19 06:13:15 +0000436Expression ValueTable::create_expression(GetElementPtrInst* G) {
Owen Andersoneb216862007-07-03 22:50:56 +0000437 Expression e;
438
439 e.firstVN = lookup_or_add(G->getPointerOperand());
440 e.secondVN = 0;
441 e.thirdVN = 0;
442 e.type = G->getType();
Owen Andersonc9399be2007-07-20 08:19:20 +0000443 e.opcode = Expression::GEP;
Owen Andersoneb216862007-07-03 22:50:56 +0000444
445 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
446 I != E; ++I)
447 e.varargs.push_back(lookup_or_add(*I));
448
449 return e;
450}
451
Owen Anderson9cb56012007-06-21 00:19:05 +0000452//===----------------------------------------------------------------------===//
453// ValueTable External Functions
454//===----------------------------------------------------------------------===//
455
456/// lookup_or_add - Returns the value number for the specified value, assigning
457/// it a new number if it did not have one before.
Owen Anderson086f5f32007-06-19 03:31:41 +0000458uint32_t ValueTable::lookup_or_add(Value* V) {
Owen Anderson4f703ec2007-06-19 23:23:54 +0000459 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Anderson086f5f32007-06-19 03:31:41 +0000460 if (VI != valueNumbering.end())
461 return VI->second;
Owen Anderson139fe842007-06-09 18:35:31 +0000462
Owen Anderson139fe842007-06-09 18:35:31 +0000463
Owen Anderson086f5f32007-06-19 03:31:41 +0000464 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
465 Expression e = create_expression(BO);
466
Owen Andersonfb665412007-07-19 06:13:15 +0000467 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson086f5f32007-06-19 03:31:41 +0000468 if (EI != expressionNumbering.end()) {
469 valueNumbering.insert(std::make_pair(V, EI->second));
470 return EI->second;
471 } else {
472 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
473 valueNumbering.insert(std::make_pair(V, nextValueNumber));
474
475 return nextValueNumber++;
476 }
477 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
478 Expression e = create_expression(C);
479
Owen Andersonfb665412007-07-19 06:13:15 +0000480 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson086f5f32007-06-19 03:31:41 +0000481 if (EI != expressionNumbering.end()) {
482 valueNumbering.insert(std::make_pair(V, EI->second));
483 return EI->second;
484 } else {
485 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
486 valueNumbering.insert(std::make_pair(V, nextValueNumber));
487
488 return nextValueNumber++;
489 }
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000490 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
491 Expression e = create_expression(U);
492
Owen Andersonfb665412007-07-19 06:13:15 +0000493 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000494 if (EI != expressionNumbering.end()) {
495 valueNumbering.insert(std::make_pair(V, EI->second));
496 return EI->second;
497 } else {
498 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
499 valueNumbering.insert(std::make_pair(V, nextValueNumber));
500
501 return nextValueNumber++;
502 }
503 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
504 Expression e = create_expression(U);
505
Owen Andersonfb665412007-07-19 06:13:15 +0000506 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000507 if (EI != expressionNumbering.end()) {
508 valueNumbering.insert(std::make_pair(V, EI->second));
509 return EI->second;
510 } else {
511 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
512 valueNumbering.insert(std::make_pair(V, nextValueNumber));
513
514 return nextValueNumber++;
515 }
516 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
517 Expression e = create_expression(U);
518
Owen Andersonfb665412007-07-19 06:13:15 +0000519 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000520 if (EI != expressionNumbering.end()) {
521 valueNumbering.insert(std::make_pair(V, EI->second));
522 return EI->second;
523 } else {
524 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
525 valueNumbering.insert(std::make_pair(V, nextValueNumber));
526
527 return nextValueNumber++;
528 }
Owen Anderson890e1a02007-06-28 23:51:21 +0000529 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
530 Expression e = create_expression(U);
531
Owen Andersonfb665412007-07-19 06:13:15 +0000532 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson890e1a02007-06-28 23:51:21 +0000533 if (EI != expressionNumbering.end()) {
534 valueNumbering.insert(std::make_pair(V, EI->second));
535 return EI->second;
536 } else {
537 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
538 valueNumbering.insert(std::make_pair(V, nextValueNumber));
539
540 return nextValueNumber++;
541 }
Owen Andersonca6c31c2007-06-29 00:51:03 +0000542 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
543 Expression e = create_expression(U);
544
Owen Andersonfb665412007-07-19 06:13:15 +0000545 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Andersonca6c31c2007-06-29 00:51:03 +0000546 if (EI != expressionNumbering.end()) {
547 valueNumbering.insert(std::make_pair(V, EI->second));
548 return EI->second;
549 } else {
550 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
551 valueNumbering.insert(std::make_pair(V, nextValueNumber));
552
553 return nextValueNumber++;
554 }
Owen Anderson56533222007-07-03 23:51:19 +0000555 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
556 Expression e = create_expression(U);
557
Owen Andersonfb665412007-07-19 06:13:15 +0000558 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson56533222007-07-03 23:51:19 +0000559 if (EI != expressionNumbering.end()) {
560 valueNumbering.insert(std::make_pair(V, EI->second));
561 return EI->second;
562 } else {
563 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
564 valueNumbering.insert(std::make_pair(V, nextValueNumber));
565
566 return nextValueNumber++;
567 }
Owen Anderson086f5f32007-06-19 03:31:41 +0000568 } else {
569 valueNumbering.insert(std::make_pair(V, nextValueNumber));
570 return nextValueNumber++;
Owen Andersona724ac12007-06-03 05:55:58 +0000571 }
Owen Anderson086f5f32007-06-19 03:31:41 +0000572}
573
Owen Anderson9cb56012007-06-21 00:19:05 +0000574/// lookup - Returns the value number of the specified value. Fails if
575/// the value has not yet been numbered.
Owen Anderson890e1a02007-06-28 23:51:21 +0000576uint32_t ValueTable::lookup(Value* V) const {
Owen Anderson4f703ec2007-06-19 23:23:54 +0000577 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Anderson086f5f32007-06-19 03:31:41 +0000578 if (VI != valueNumbering.end())
579 return VI->second;
580 else
Torok Edwinc23197a2009-07-14 16:55:14 +0000581 llvm_unreachable("Value not numbered?");
Owen Anderson086f5f32007-06-19 03:31:41 +0000582
583 return 0;
584}
585
Owen Anderson9cb56012007-06-21 00:19:05 +0000586/// add - Add the specified value with the given value number, removing
587/// its old number, if any
Owen Anderson086f5f32007-06-19 03:31:41 +0000588void ValueTable::add(Value* V, uint32_t num) {
Owen Anderson4f703ec2007-06-19 23:23:54 +0000589 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Anderson086f5f32007-06-19 03:31:41 +0000590 if (VI != valueNumbering.end())
591 valueNumbering.erase(VI);
592 valueNumbering.insert(std::make_pair(V, num));
593}
594
Owen Andersonf62c44a2007-06-25 05:41:12 +0000595/// clear - Remove all entries from the ValueTable
Owen Anderson086f5f32007-06-19 03:31:41 +0000596void ValueTable::clear() {
597 valueNumbering.clear();
598 expressionNumbering.clear();
599 nextValueNumber = 1;
600}
Owen Andersona724ac12007-06-03 05:55:58 +0000601
Owen Andersonf62c44a2007-06-25 05:41:12 +0000602/// erase - Remove a value from the value numbering
Owen Anderson20cb51f2007-06-19 05:37:32 +0000603void ValueTable::erase(Value* V) {
Owen Anderson20cb51f2007-06-19 05:37:32 +0000604 valueNumbering.erase(V);
Owen Anderson20cb51f2007-06-19 05:37:32 +0000605}
606
Owen Anderson82575d82007-06-22 00:20:30 +0000607/// size - Return the number of assigned value numbers
608unsigned ValueTable::size() {
609 // NOTE: zero is never assigned
610 return nextValueNumber;
611}
612
Dan Gohman844731a2008-05-13 00:00:25 +0000613namespace {
614
Owen Anderson9cb56012007-06-21 00:19:05 +0000615//===----------------------------------------------------------------------===//
Owen Andersonab3fd052007-07-09 16:43:55 +0000616// ValueNumberedSet Class
Owen Anderson0616dff2007-07-09 06:50:06 +0000617//===----------------------------------------------------------------------===//
618
619class ValueNumberedSet {
620 private:
621 SmallPtrSet<Value*, 8> contents;
622 BitVector numbers;
623 public:
624 ValueNumberedSet() { numbers.resize(1); }
Owen Anderson81c2a6e2007-07-10 00:27:22 +0000625 ValueNumberedSet(const ValueNumberedSet& other) {
626 numbers = other.numbers;
627 contents = other.contents;
628 }
Owen Anderson0616dff2007-07-09 06:50:06 +0000629
630 typedef SmallPtrSet<Value*, 8>::iterator iterator;
631
632 iterator begin() { return contents.begin(); }
633 iterator end() { return contents.end(); }
634
635 bool insert(Value* v) { return contents.insert(v); }
636 void insert(iterator I, iterator E) { contents.insert(I, E); }
637 void erase(Value* v) { contents.erase(v); }
Owen Andersona05a81b2007-07-10 00:09:25 +0000638 unsigned count(Value* v) { return contents.count(v); }
Owen Anderson0616dff2007-07-09 06:50:06 +0000639 size_t size() { return contents.size(); }
640
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000641 void set(unsigned i) {
Owen Anderson0616dff2007-07-09 06:50:06 +0000642 if (i >= numbers.size())
643 numbers.resize(i+1);
644
645 numbers.set(i);
646 }
647
Owen Andersondfa24352007-07-09 22:29:50 +0000648 void operator=(const ValueNumberedSet& other) {
649 contents = other.contents;
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000650 numbers = other.numbers;
651 }
652
653 void reset(unsigned i) {
Owen Anderson0616dff2007-07-09 06:50:06 +0000654 if (i < numbers.size())
655 numbers.reset(i);
656 }
657
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000658 bool test(unsigned i) {
Owen Anderson0616dff2007-07-09 06:50:06 +0000659 if (i >= numbers.size())
660 return false;
661
662 return numbers.test(i);
663 }
664
665 void clear() {
666 contents.clear();
667 numbers.clear();
668 }
669};
670
Dan Gohman844731a2008-05-13 00:00:25 +0000671}
672
Owen Anderson0616dff2007-07-09 06:50:06 +0000673//===----------------------------------------------------------------------===//
Owen Anderson9cb56012007-06-21 00:19:05 +0000674// GVNPRE Pass
675//===----------------------------------------------------------------------===//
676
Owen Andersonea12a062007-05-29 21:53:49 +0000677namespace {
678
679 class VISIBILITY_HIDDEN GVNPRE : public FunctionPass {
680 bool runOnFunction(Function &F);
681 public:
682 static char ID; // Pass identification, replacement for typeid
Dan Gohmanae73dc12008-09-04 17:05:41 +0000683 GVNPRE() : FunctionPass(&ID) {}
Owen Andersonea12a062007-05-29 21:53:49 +0000684
685 private:
Owen Anderson397d4052007-06-08 01:03:01 +0000686 ValueTable VN;
Owen Anderson19bc4a82007-07-19 06:37:56 +0000687 SmallVector<Instruction*, 8> createdExpressions;
Owen Anderson8214d502007-05-31 00:42:15 +0000688
Owen Anderson81c2a6e2007-07-10 00:27:22 +0000689 DenseMap<BasicBlock*, ValueNumberedSet> availableOut;
690 DenseMap<BasicBlock*, ValueNumberedSet> anticipatedIn;
691 DenseMap<BasicBlock*, ValueNumberedSet> generatedPhis;
Owen Anderson71fcebc2007-06-12 22:43:57 +0000692
Owen Anderson9cb56012007-06-21 00:19:05 +0000693 // This transformation requires dominator postdominator info
Owen Andersonea12a062007-05-29 21:53:49 +0000694 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
695 AU.setPreservesCFG();
Owen Anderson2c194e62007-07-06 18:12:36 +0000696 AU.addRequiredID(BreakCriticalEdgesID);
Owen Anderson2a5c9d82007-07-05 23:11:26 +0000697 AU.addRequired<UnifyFunctionExitNodes>();
Owen Andersonea12a062007-05-29 21:53:49 +0000698 AU.addRequired<DominatorTree>();
Owen Andersonea12a062007-05-29 21:53:49 +0000699 }
700
701 // Helper fuctions
702 // FIXME: eliminate or document these better
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000703 void dump(ValueNumberedSet& s) const ;
704 void clean(ValueNumberedSet& set) ;
705 Value* find_leader(ValueNumberedSet& vals, uint32_t v) ;
706 Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) ;
Owen Anderson0616dff2007-07-09 06:50:06 +0000707 void phi_translate_set(ValueNumberedSet& anticIn, BasicBlock* pred,
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000708 BasicBlock* succ, ValueNumberedSet& out) ;
Owen Andersonea12a062007-05-29 21:53:49 +0000709
Owen Anderson0616dff2007-07-09 06:50:06 +0000710 void topo_sort(ValueNumberedSet& set,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000711 SmallVector<Value*, 8>& vec) ;
Owen Anderson243f3482007-05-31 22:44:11 +0000712
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000713 void cleanup() ;
714 bool elimination() ;
Owen Andersonbbf11972007-06-18 04:42:29 +0000715
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000716 void val_insert(ValueNumberedSet& s, Value* v) ;
717 void val_replace(ValueNumberedSet& s, Value* v) ;
718 bool dependsOnInvoke(Value* V) ;
Owen Anderson3eaca712007-06-20 22:10:02 +0000719 void buildsets_availout(BasicBlock::iterator I,
Owen Anderson0616dff2007-07-09 06:50:06 +0000720 ValueNumberedSet& currAvail,
721 ValueNumberedSet& currPhis,
722 ValueNumberedSet& currExps,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000723 SmallPtrSet<Value*, 16>& currTemps);
Owen Anderson82575d82007-06-22 00:20:30 +0000724 bool buildsets_anticout(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +0000725 ValueNumberedSet& anticOut,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000726 SmallPtrSet<BasicBlock*, 8>& visited);
Owen Anderson82575d82007-06-22 00:20:30 +0000727 unsigned buildsets_anticin(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +0000728 ValueNumberedSet& anticOut,
729 ValueNumberedSet& currExps,
Owen Andersona20f35d2007-06-28 00:34:34 +0000730 SmallPtrSet<Value*, 16>& currTemps,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000731 SmallPtrSet<BasicBlock*, 8>& visited);
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000732 void buildsets(Function& F) ;
Owen Anderson3eaca712007-06-20 22:10:02 +0000733
734 void insertion_pre(Value* e, BasicBlock* BB,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000735 DenseMap<BasicBlock*, Value*>& avail,
736 std::map<BasicBlock*,ValueNumberedSet>& new_set);
737 unsigned insertion_mergepoint(SmallVector<Value*, 8>& workList,
Owen Anderson82575d82007-06-22 00:20:30 +0000738 df_iterator<DomTreeNode*>& D,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000739 std::map<BasicBlock*, ValueNumberedSet>& new_set);
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000740 bool insertion(Function& F) ;
Owen Andersonea12a062007-05-29 21:53:49 +0000741
742 };
743
744 char GVNPRE::ID = 0;
745
746}
747
Owen Anderson9cb56012007-06-21 00:19:05 +0000748// createGVNPREPass - The public interface to this file...
Owen Andersonea12a062007-05-29 21:53:49 +0000749FunctionPass *llvm::createGVNPREPass() { return new GVNPRE(); }
750
Owen Anderson16a72bb2007-07-10 20:20:19 +0000751static RegisterPass<GVNPRE> X("gvnpre",
Owen Anderson9fed5892007-08-02 18:20:52 +0000752 "Global Value Numbering/Partial Redundancy Elimination");
Owen Andersonea12a062007-05-29 21:53:49 +0000753
Owen Andersonea12a062007-05-29 21:53:49 +0000754
Owen Andersonb8b873c2007-06-08 22:02:36 +0000755STATISTIC(NumInsertedVals, "Number of values inserted");
756STATISTIC(NumInsertedPhis, "Number of PHI nodes inserted");
757STATISTIC(NumEliminated, "Number of redundant instructions eliminated");
758
Owen Anderson9cb56012007-06-21 00:19:05 +0000759/// find_leader - Given a set and a value number, return the first
760/// element of the set with that value number, or 0 if no such element
761/// is present
Owen Anderson0616dff2007-07-09 06:50:06 +0000762Value* GVNPRE::find_leader(ValueNumberedSet& vals, uint32_t v) {
763 if (!vals.test(v))
764 return 0;
765
766 for (ValueNumberedSet::iterator I = vals.begin(), E = vals.end();
Owen Anderson086f5f32007-06-19 03:31:41 +0000767 I != E; ++I)
768 if (v == VN.lookup(*I))
Owen Andersona724ac12007-06-03 05:55:58 +0000769 return *I;
Owen Andersonea12a062007-05-29 21:53:49 +0000770
Torok Edwinc23197a2009-07-14 16:55:14 +0000771 llvm_unreachable("No leader found, but present bit is set?");
Owen Andersona724ac12007-06-03 05:55:58 +0000772 return 0;
Owen Andersonea12a062007-05-29 21:53:49 +0000773}
774
Owen Anderson9cb56012007-06-21 00:19:05 +0000775/// val_insert - Insert a value into a set only if there is not a value
776/// with the same value number already in the set
Owen Anderson0616dff2007-07-09 06:50:06 +0000777void GVNPRE::val_insert(ValueNumberedSet& s, Value* v) {
Owen Anderson086f5f32007-06-19 03:31:41 +0000778 uint32_t num = VN.lookup(v);
Owen Anderson0616dff2007-07-09 06:50:06 +0000779 if (!s.test(num))
Owen Anderson086f5f32007-06-19 03:31:41 +0000780 s.insert(v);
781}
782
Owen Anderson9cb56012007-06-21 00:19:05 +0000783/// val_replace - Insert a value into a set, replacing any values already in
784/// the set that have the same value number
Owen Anderson0616dff2007-07-09 06:50:06 +0000785void GVNPRE::val_replace(ValueNumberedSet& s, Value* v) {
Owen Andersonb83e56f2007-07-19 19:57:13 +0000786 if (s.count(v)) return;
787
Owen Anderson086f5f32007-06-19 03:31:41 +0000788 uint32_t num = VN.lookup(v);
789 Value* leader = find_leader(s, num);
Owen Andersondfa24352007-07-09 22:29:50 +0000790 if (leader != 0)
Owen Anderson086f5f32007-06-19 03:31:41 +0000791 s.erase(leader);
Owen Anderson086f5f32007-06-19 03:31:41 +0000792 s.insert(v);
Owen Andersondfa24352007-07-09 22:29:50 +0000793 s.set(num);
Owen Anderson086f5f32007-06-19 03:31:41 +0000794}
795
Owen Anderson9cb56012007-06-21 00:19:05 +0000796/// phi_translate - Given a value, its parent block, and a predecessor of its
797/// parent, translate the value into legal for the predecessor block. This
798/// means translating its operands (and recursively, their operands) through
799/// any phi nodes in the parent into values available in the predecessor
Owen Anderson71fcebc2007-06-12 22:43:57 +0000800Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
Owen Anderson5ea069f2007-06-04 18:05:26 +0000801 if (V == 0)
802 return 0;
803
Owen Anderson216394f2007-07-03 18:37:08 +0000804 // Unary Operations
Owen Anderson3d6fac32007-07-03 19:01:42 +0000805 if (CastInst* U = dyn_cast<CastInst>(V)) {
Owen Anderson216394f2007-07-03 18:37:08 +0000806 Value* newOp1 = 0;
807 if (isa<Instruction>(U->getOperand(0)))
808 newOp1 = phi_translate(U->getOperand(0), pred, succ);
809 else
810 newOp1 = U->getOperand(0);
811
812 if (newOp1 == 0)
813 return 0;
814
815 if (newOp1 != U->getOperand(0)) {
816 Instruction* newVal = 0;
817 if (CastInst* C = dyn_cast<CastInst>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +0000818 newVal = CastInst::Create(C->getOpcode(),
Owen Anderson216394f2007-07-03 18:37:08 +0000819 newOp1, C->getType(),
820 C->getName()+".expr");
821
822 uint32_t v = VN.lookup_or_add(newVal);
823
824 Value* leader = find_leader(availableOut[pred], v);
825 if (leader == 0) {
826 createdExpressions.push_back(newVal);
827 return newVal;
828 } else {
829 VN.erase(newVal);
830 delete newVal;
831 return leader;
832 }
833 }
834
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000835 // Binary Operations
Owen Anderson216394f2007-07-03 18:37:08 +0000836 } if (isa<BinaryOperator>(V) || isa<CmpInst>(V) ||
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000837 isa<ExtractElementInst>(V)) {
Owen Andersonf62c44a2007-06-25 05:41:12 +0000838 User* U = cast<User>(V);
839
Owen Anderson086f5f32007-06-19 03:31:41 +0000840 Value* newOp1 = 0;
Owen Andersonf62c44a2007-06-25 05:41:12 +0000841 if (isa<Instruction>(U->getOperand(0)))
842 newOp1 = phi_translate(U->getOperand(0), pred, succ);
Owen Anderson086f5f32007-06-19 03:31:41 +0000843 else
Owen Andersonf62c44a2007-06-25 05:41:12 +0000844 newOp1 = U->getOperand(0);
Owen Anderson086f5f32007-06-19 03:31:41 +0000845
Owen Anderson5ea069f2007-06-04 18:05:26 +0000846 if (newOp1 == 0)
847 return 0;
848
Owen Anderson086f5f32007-06-19 03:31:41 +0000849 Value* newOp2 = 0;
Owen Andersonf62c44a2007-06-25 05:41:12 +0000850 if (isa<Instruction>(U->getOperand(1)))
851 newOp2 = phi_translate(U->getOperand(1), pred, succ);
Owen Anderson086f5f32007-06-19 03:31:41 +0000852 else
Owen Andersonf62c44a2007-06-25 05:41:12 +0000853 newOp2 = U->getOperand(1);
Owen Anderson086f5f32007-06-19 03:31:41 +0000854
Owen Anderson5ea069f2007-06-04 18:05:26 +0000855 if (newOp2 == 0)
856 return 0;
857
Owen Andersonf62c44a2007-06-25 05:41:12 +0000858 if (newOp1 != U->getOperand(0) || newOp2 != U->getOperand(1)) {
859 Instruction* newVal = 0;
860 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +0000861 newVal = BinaryOperator::Create(BO->getOpcode(),
Owen Andersonf62c44a2007-06-25 05:41:12 +0000862 newOp1, newOp2,
863 BO->getName()+".expr");
864 else if (CmpInst* C = dyn_cast<CmpInst>(U))
Dan Gohman1c8a23c2009-08-25 23:17:54 +0000865 newVal = CmpInst::Create(C->getOpcode(),
Owen Andersonf62c44a2007-06-25 05:41:12 +0000866 C->getPredicate(),
867 newOp1, newOp2,
868 C->getName()+".expr");
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000869 else if (ExtractElementInst* E = dyn_cast<ExtractElementInst>(U))
Daniel Dunbar6e0d1cb2009-07-25 04:41:11 +0000870 newVal = ExtractElementInst::Create(newOp1, newOp2,
871 E->getName()+".expr");
Owen Anderson8338ff52007-06-08 20:44:02 +0000872
Owen Anderson086f5f32007-06-19 03:31:41 +0000873 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson71fcebc2007-06-12 22:43:57 +0000874
Owen Anderson086f5f32007-06-19 03:31:41 +0000875 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson71fcebc2007-06-12 22:43:57 +0000876 if (leader == 0) {
Owen Anderson65d28622007-06-12 00:50:47 +0000877 createdExpressions.push_back(newVal);
Owen Anderson5ea069f2007-06-04 18:05:26 +0000878 return newVal;
Owen Anderson8f862c82007-06-05 22:11:49 +0000879 } else {
Owen Anderson20cb51f2007-06-19 05:37:32 +0000880 VN.erase(newVal);
Owen Anderson8f862c82007-06-05 22:11:49 +0000881 delete newVal;
Owen Anderson71fcebc2007-06-12 22:43:57 +0000882 return leader;
Owen Anderson8f862c82007-06-05 22:11:49 +0000883 }
Owen Anderson5ea069f2007-06-04 18:05:26 +0000884 }
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000885
886 // Ternary Operations
Owen Anderson890e1a02007-06-28 23:51:21 +0000887 } else if (isa<ShuffleVectorInst>(V) || isa<InsertElementInst>(V) ||
888 isa<SelectInst>(V)) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000889 User* U = cast<User>(V);
890
891 Value* newOp1 = 0;
892 if (isa<Instruction>(U->getOperand(0)))
893 newOp1 = phi_translate(U->getOperand(0), pred, succ);
894 else
895 newOp1 = U->getOperand(0);
896
897 if (newOp1 == 0)
898 return 0;
899
900 Value* newOp2 = 0;
901 if (isa<Instruction>(U->getOperand(1)))
902 newOp2 = phi_translate(U->getOperand(1), pred, succ);
903 else
904 newOp2 = U->getOperand(1);
905
906 if (newOp2 == 0)
907 return 0;
908
909 Value* newOp3 = 0;
910 if (isa<Instruction>(U->getOperand(2)))
911 newOp3 = phi_translate(U->getOperand(2), pred, succ);
912 else
913 newOp3 = U->getOperand(2);
914
915 if (newOp3 == 0)
916 return 0;
917
918 if (newOp1 != U->getOperand(0) ||
919 newOp2 != U->getOperand(1) ||
920 newOp3 != U->getOperand(2)) {
921 Instruction* newVal = 0;
922 if (ShuffleVectorInst* S = dyn_cast<ShuffleVectorInst>(U))
923 newVal = new ShuffleVectorInst(newOp1, newOp2, newOp3,
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000924 S->getName() + ".expr");
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000925 else if (InsertElementInst* I = dyn_cast<InsertElementInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +0000926 newVal = InsertElementInst::Create(newOp1, newOp2, newOp3,
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000927 I->getName() + ".expr");
Owen Anderson890e1a02007-06-28 23:51:21 +0000928 else if (SelectInst* I = dyn_cast<SelectInst>(U))
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000929 newVal = SelectInst::Create(newOp1, newOp2, newOp3,
930 I->getName() + ".expr");
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000931
932 uint32_t v = VN.lookup_or_add(newVal);
933
934 Value* leader = find_leader(availableOut[pred], v);
935 if (leader == 0) {
936 createdExpressions.push_back(newVal);
937 return newVal;
938 } else {
939 VN.erase(newVal);
940 delete newVal;
941 return leader;
942 }
943 }
944
Owen Anderson56533222007-07-03 23:51:19 +0000945 // Varargs operators
946 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
947 Value* newOp1 = 0;
948 if (isa<Instruction>(U->getPointerOperand()))
949 newOp1 = phi_translate(U->getPointerOperand(), pred, succ);
950 else
951 newOp1 = U->getPointerOperand();
952
953 if (newOp1 == 0)
954 return 0;
955
956 bool changed_idx = false;
Owen Anderson19bc4a82007-07-19 06:37:56 +0000957 SmallVector<Value*, 4> newIdx;
Owen Anderson56533222007-07-03 23:51:19 +0000958 for (GetElementPtrInst::op_iterator I = U->idx_begin(), E = U->idx_end();
959 I != E; ++I)
960 if (isa<Instruction>(*I)) {
961 Value* newVal = phi_translate(*I, pred, succ);
962 newIdx.push_back(newVal);
963 if (newVal != *I)
964 changed_idx = true;
965 } else {
966 newIdx.push_back(*I);
967 }
968
969 if (newOp1 != U->getPointerOperand() || changed_idx) {
Gabor Greif051a9502008-04-06 20:25:17 +0000970 Instruction* newVal =
971 GetElementPtrInst::Create(newOp1,
972 newIdx.begin(), newIdx.end(),
973 U->getName()+".expr");
Owen Anderson56533222007-07-03 23:51:19 +0000974
975 uint32_t v = VN.lookup_or_add(newVal);
976
977 Value* leader = find_leader(availableOut[pred], v);
978 if (leader == 0) {
979 createdExpressions.push_back(newVal);
980 return newVal;
981 } else {
982 VN.erase(newVal);
983 delete newVal;
984 return leader;
985 }
986 }
987
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000988 // PHI Nodes
Owen Anderson5ea069f2007-06-04 18:05:26 +0000989 } else if (PHINode* P = dyn_cast<PHINode>(V)) {
Owen Anderson65d28622007-06-12 00:50:47 +0000990 if (P->getParent() == succ)
Owen Anderson5ea069f2007-06-04 18:05:26 +0000991 return P->getIncomingValueForBlock(pred);
992 }
993
994 return V;
995}
996
Owen Anderson9cb56012007-06-21 00:19:05 +0000997/// phi_translate_set - Perform phi translation on every element of a set
Owen Anderson0616dff2007-07-09 06:50:06 +0000998void GVNPRE::phi_translate_set(ValueNumberedSet& anticIn,
Owen Anderson65d28622007-06-12 00:50:47 +0000999 BasicBlock* pred, BasicBlock* succ,
Owen Anderson0616dff2007-07-09 06:50:06 +00001000 ValueNumberedSet& out) {
1001 for (ValueNumberedSet::iterator I = anticIn.begin(),
Owen Anderson5ea069f2007-06-04 18:05:26 +00001002 E = anticIn.end(); I != E; ++I) {
Owen Anderson71fcebc2007-06-12 22:43:57 +00001003 Value* V = phi_translate(*I, pred, succ);
Owen Anderson0616dff2007-07-09 06:50:06 +00001004 if (V != 0 && !out.test(VN.lookup_or_add(V))) {
Owen Anderson5ea069f2007-06-04 18:05:26 +00001005 out.insert(V);
Owen Anderson0616dff2007-07-09 06:50:06 +00001006 out.set(VN.lookup(V));
1007 }
Owen Andersonea12a062007-05-29 21:53:49 +00001008 }
1009}
1010
Owen Anderson9cb56012007-06-21 00:19:05 +00001011/// dependsOnInvoke - Test if a value has an phi node as an operand, any of
1012/// whose inputs is an invoke instruction. If this is true, we cannot safely
1013/// PRE the instruction or anything that depends on it.
Owen Andersonbbf11972007-06-18 04:42:29 +00001014bool GVNPRE::dependsOnInvoke(Value* V) {
Owen Anderson52471b12007-06-19 23:07:16 +00001015 if (PHINode* p = dyn_cast<PHINode>(V)) {
1016 for (PHINode::op_iterator I = p->op_begin(), E = p->op_end(); I != E; ++I)
1017 if (isa<InvokeInst>(*I))
Owen Andersonbbf11972007-06-18 04:42:29 +00001018 return true;
Owen Anderson52471b12007-06-19 23:07:16 +00001019 return false;
1020 } else {
1021 return false;
Owen Anderson32bc7892007-06-16 00:26:54 +00001022 }
Owen Anderson32bc7892007-06-16 00:26:54 +00001023}
1024
Owen Anderson9cb56012007-06-21 00:19:05 +00001025/// clean - Remove all non-opaque values from the set whose operands are not
1026/// themselves in the set, as well as all values that depend on invokes (see
1027/// above)
Owen Anderson0616dff2007-07-09 06:50:06 +00001028void GVNPRE::clean(ValueNumberedSet& set) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001029 SmallVector<Value*, 8> worklist;
Owen Andersone8138ff2007-06-22 00:43:22 +00001030 worklist.reserve(set.size());
Owen Anderson397d4052007-06-08 01:03:01 +00001031 topo_sort(set, worklist);
Owen Andersonea12a062007-05-29 21:53:49 +00001032
Owen Anderson397d4052007-06-08 01:03:01 +00001033 for (unsigned i = 0; i < worklist.size(); ++i) {
1034 Value* v = worklist[i];
Owen Andersonea12a062007-05-29 21:53:49 +00001035
Owen Anderson216394f2007-07-03 18:37:08 +00001036 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001037 if (CastInst* U = dyn_cast<CastInst>(v)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001038 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001039 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson216394f2007-07-03 18:37:08 +00001040 if (lhsValid)
1041 lhsValid = !dependsOnInvoke(U->getOperand(0));
1042
1043 if (!lhsValid) {
1044 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001045 set.reset(VN.lookup(U));
Owen Anderson216394f2007-07-03 18:37:08 +00001046 }
1047
Owen Anderson7b317d22007-06-27 17:03:03 +00001048 // Handle binary ops
Owen Anderson216394f2007-07-03 18:37:08 +00001049 } else if (isa<BinaryOperator>(v) || isa<CmpInst>(v) ||
Owen Anderson7b317d22007-06-27 17:03:03 +00001050 isa<ExtractElementInst>(v)) {
1051 User* U = cast<User>(v);
1052
1053 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001054 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson60e17442007-06-18 04:30:44 +00001055 if (lhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001056 lhsValid = !dependsOnInvoke(U->getOperand(0));
Owen Andersona724ac12007-06-03 05:55:58 +00001057
Owen Anderson7b317d22007-06-27 17:03:03 +00001058 bool rhsValid = !isa<Instruction>(U->getOperand(1));
Owen Anderson0616dff2007-07-09 06:50:06 +00001059 rhsValid |= set.test(VN.lookup(U->getOperand(1)));
Owen Anderson60e17442007-06-18 04:30:44 +00001060 if (rhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001061 rhsValid = !dependsOnInvoke(U->getOperand(1));
Owen Andersonea12a062007-05-29 21:53:49 +00001062
Owen Anderson68cb52e2007-06-27 17:38:29 +00001063 if (!lhsValid || !rhsValid) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001064 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001065 set.reset(VN.lookup(U));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001066 }
Owen Anderson139fe842007-06-09 18:35:31 +00001067
Owen Anderson7b317d22007-06-27 17:03:03 +00001068 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001069 } else if (isa<ShuffleVectorInst>(v) || isa<InsertElementInst>(v) ||
1070 isa<SelectInst>(v)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001071 User* U = cast<User>(v);
1072
1073 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001074 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001075 if (lhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001076 lhsValid = !dependsOnInvoke(U->getOperand(0));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001077
Owen Anderson7b317d22007-06-27 17:03:03 +00001078 bool rhsValid = !isa<Instruction>(U->getOperand(1));
Owen Anderson0616dff2007-07-09 06:50:06 +00001079 rhsValid |= set.test(VN.lookup(U->getOperand(1)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001080 if (rhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001081 rhsValid = !dependsOnInvoke(U->getOperand(1));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001082
Owen Anderson7b317d22007-06-27 17:03:03 +00001083 bool thirdValid = !isa<Instruction>(U->getOperand(2));
Owen Anderson0616dff2007-07-09 06:50:06 +00001084 thirdValid |= set.test(VN.lookup(U->getOperand(2)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001085 if (thirdValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001086 thirdValid = !dependsOnInvoke(U->getOperand(2));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001087
Owen Anderson68cb52e2007-06-27 17:38:29 +00001088 if (!lhsValid || !rhsValid || !thirdValid) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001089 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001090 set.reset(VN.lookup(U));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001091 }
Owen Anderson56533222007-07-03 23:51:19 +00001092
1093 // Handle varargs ops
1094 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(v)) {
1095 bool ptrValid = !isa<Instruction>(U->getPointerOperand());
Owen Anderson0616dff2007-07-09 06:50:06 +00001096 ptrValid |= set.test(VN.lookup(U->getPointerOperand()));
Owen Anderson56533222007-07-03 23:51:19 +00001097 if (ptrValid)
1098 ptrValid = !dependsOnInvoke(U->getPointerOperand());
1099
1100 bool varValid = true;
1101 for (GetElementPtrInst::op_iterator I = U->idx_begin(), E = U->idx_end();
1102 I != E; ++I)
1103 if (varValid) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001104 varValid &= !isa<Instruction>(*I) || set.test(VN.lookup(*I));
Owen Anderson56533222007-07-03 23:51:19 +00001105 varValid &= !dependsOnInvoke(*I);
1106 }
1107
1108 if (!ptrValid || !varValid) {
1109 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001110 set.reset(VN.lookup(U));
Owen Anderson56533222007-07-03 23:51:19 +00001111 }
Owen Andersona724ac12007-06-03 05:55:58 +00001112 }
Owen Andersonea12a062007-05-29 21:53:49 +00001113 }
1114}
1115
Owen Anderson9cb56012007-06-21 00:19:05 +00001116/// topo_sort - Given a set of values, sort them by topological
1117/// order into the provided vector.
Owen Anderson19bc4a82007-07-19 06:37:56 +00001118void GVNPRE::topo_sort(ValueNumberedSet& set, SmallVector<Value*, 8>& vec) {
Owen Andersona20f35d2007-06-28 00:34:34 +00001119 SmallPtrSet<Value*, 16> visited;
Owen Anderson19bc4a82007-07-19 06:37:56 +00001120 SmallVector<Value*, 8> stack;
Owen Anderson0616dff2007-07-09 06:50:06 +00001121 for (ValueNumberedSet::iterator I = set.begin(), E = set.end();
Owen Anderson64758042007-06-22 21:31:16 +00001122 I != E; ++I) {
1123 if (visited.count(*I) == 0)
1124 stack.push_back(*I);
1125
1126 while (!stack.empty()) {
1127 Value* e = stack.back();
Owen Anderson216394f2007-07-03 18:37:08 +00001128
1129 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001130 if (CastInst* U = dyn_cast<CastInst>(e)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001131 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1132
1133 if (l != 0 && isa<Instruction>(l) &&
1134 visited.count(l) == 0)
1135 stack.push_back(l);
1136 else {
1137 vec.push_back(e);
1138 visited.insert(e);
1139 stack.pop_back();
1140 }
1141
Owen Anderson7b317d22007-06-27 17:03:03 +00001142 // Handle binary ops
Owen Anderson216394f2007-07-03 18:37:08 +00001143 } else if (isa<BinaryOperator>(e) || isa<CmpInst>(e) ||
Owen Anderson7b317d22007-06-27 17:03:03 +00001144 isa<ExtractElementInst>(e)) {
1145 User* U = cast<User>(e);
1146 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1147 Value* r = find_leader(set, VN.lookup(U->getOperand(1)));
Owen Anderson64758042007-06-22 21:31:16 +00001148
1149 if (l != 0 && isa<Instruction>(l) &&
1150 visited.count(l) == 0)
1151 stack.push_back(l);
1152 else if (r != 0 && isa<Instruction>(r) &&
1153 visited.count(r) == 0)
1154 stack.push_back(r);
1155 else {
1156 vec.push_back(e);
1157 visited.insert(e);
1158 stack.pop_back();
1159 }
Owen Andersona724ac12007-06-03 05:55:58 +00001160
Owen Anderson7b317d22007-06-27 17:03:03 +00001161 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001162 } else if (isa<InsertElementInst>(e) || isa<ShuffleVectorInst>(e) ||
1163 isa<SelectInst>(e)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001164 User* U = cast<User>(e);
1165 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1166 Value* r = find_leader(set, VN.lookup(U->getOperand(1)));
1167 Value* m = find_leader(set, VN.lookup(U->getOperand(2)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001168
1169 if (l != 0 && isa<Instruction>(l) &&
1170 visited.count(l) == 0)
1171 stack.push_back(l);
1172 else if (r != 0 && isa<Instruction>(r) &&
1173 visited.count(r) == 0)
1174 stack.push_back(r);
1175 else if (m != 0 && isa<Instruction>(m) &&
1176 visited.count(m) == 0)
Owen Andersondf30b632007-07-04 18:26:18 +00001177 stack.push_back(m);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001178 else {
1179 vec.push_back(e);
1180 visited.insert(e);
1181 stack.pop_back();
1182 }
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001183
Owen Anderson56533222007-07-03 23:51:19 +00001184 // Handle vararg ops
1185 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(e)) {
1186 Value* p = find_leader(set, VN.lookup(U->getPointerOperand()));
1187
1188 if (p != 0 && isa<Instruction>(p) &&
1189 visited.count(p) == 0)
1190 stack.push_back(p);
1191 else {
1192 bool push_va = false;
1193 for (GetElementPtrInst::op_iterator I = U->idx_begin(),
1194 E = U->idx_end(); I != E; ++I) {
1195 Value * v = find_leader(set, VN.lookup(*I));
1196 if (v != 0 && isa<Instruction>(v) && visited.count(v) == 0) {
1197 stack.push_back(v);
1198 push_va = true;
1199 }
1200 }
1201
1202 if (!push_va) {
1203 vec.push_back(e);
1204 visited.insert(e);
1205 stack.pop_back();
1206 }
1207 }
1208
Owen Anderson7b317d22007-06-27 17:03:03 +00001209 // Handle opaque ops
Owen Anderson64758042007-06-22 21:31:16 +00001210 } else {
Owen Andersona724ac12007-06-03 05:55:58 +00001211 visited.insert(e);
Owen Anderson139fe842007-06-09 18:35:31 +00001212 vec.push_back(e);
Owen Anderson64758042007-06-22 21:31:16 +00001213 stack.pop_back();
Owen Anderson139fe842007-06-09 18:35:31 +00001214 }
Owen Anderson243f3482007-05-31 22:44:11 +00001215 }
Owen Anderson64758042007-06-22 21:31:16 +00001216
1217 stack.clear();
Owen Anderson243f3482007-05-31 22:44:11 +00001218 }
1219}
1220
Owen Anderson9cb56012007-06-21 00:19:05 +00001221/// dump - Dump a set of values to standard error
Owen Anderson0616dff2007-07-09 06:50:06 +00001222void GVNPRE::dump(ValueNumberedSet& s) const {
Chris Lattnerbbbfa992009-08-23 06:35:02 +00001223 DEBUG(errs() << "{ ");
Owen Anderson0616dff2007-07-09 06:50:06 +00001224 for (ValueNumberedSet::iterator I = s.begin(), E = s.end();
Owen Anderson0fa6b372007-06-03 22:02:14 +00001225 I != E; ++I) {
Chris Lattnerbbbfa992009-08-23 06:35:02 +00001226 DEBUG(errs() << "" << VN.lookup(*I) << ": ");
Owen Anderson0fa6b372007-06-03 22:02:14 +00001227 DEBUG((*I)->dump());
1228 }
Chris Lattnerbbbfa992009-08-23 06:35:02 +00001229 DEBUG(errs() << "}\n\n");
Owen Anderson0fa6b372007-06-03 22:02:14 +00001230}
1231
Owen Anderson9cb56012007-06-21 00:19:05 +00001232/// elimination - Phase 3 of the main algorithm. Perform full redundancy
1233/// elimination by walking the dominator tree and removing any instruction that
1234/// is dominated by another instruction with the same value number.
Owen Anderson3eaca712007-06-20 22:10:02 +00001235bool GVNPRE::elimination() {
Owen Anderson3eaca712007-06-20 22:10:02 +00001236 bool changed_function = false;
1237
Owen Anderson19bc4a82007-07-19 06:37:56 +00001238 SmallVector<std::pair<Instruction*, Value*>, 8> replace;
1239 SmallVector<Instruction*, 8> erase;
Owen Anderson239e7122007-06-12 16:57:50 +00001240
1241 DominatorTree& DT = getAnalysis<DominatorTree>();
1242
1243 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
1244 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1245 BasicBlock* BB = DI->getBlock();
1246
Owen Anderson239e7122007-06-12 16:57:50 +00001247 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1248 BI != BE; ++BI) {
1249
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001250 if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI) ||
1251 isa<ShuffleVectorInst>(BI) || isa<InsertElementInst>(BI) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001252 isa<ExtractElementInst>(BI) || isa<SelectInst>(BI) ||
Owen Anderson56533222007-07-03 23:51:19 +00001253 isa<CastInst>(BI) || isa<GetElementPtrInst>(BI)) {
Owen Andersona05a81b2007-07-10 00:09:25 +00001254
Owen Anderson9fed5892007-08-02 18:20:52 +00001255 if (availableOut[BB].test(VN.lookup(BI)) &&
1256 !availableOut[BB].count(BI)) {
Owen Andersona05a81b2007-07-10 00:09:25 +00001257 Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
Owen Anderson239e7122007-06-12 16:57:50 +00001258 if (Instruction* Instr = dyn_cast<Instruction>(leader))
1259 if (Instr->getParent() != 0 && Instr != BI) {
1260 replace.push_back(std::make_pair(BI, leader));
1261 erase.push_back(BI);
1262 ++NumEliminated;
1263 }
Owen Andersona05a81b2007-07-10 00:09:25 +00001264 }
Owen Anderson239e7122007-06-12 16:57:50 +00001265 }
1266 }
1267 }
1268
1269 while (!replace.empty()) {
1270 std::pair<Instruction*, Value*> rep = replace.back();
1271 replace.pop_back();
1272 rep.first->replaceAllUsesWith(rep.second);
Owen Anderson0304b2b2007-06-20 18:30:20 +00001273 changed_function = true;
Owen Anderson239e7122007-06-12 16:57:50 +00001274 }
1275
Owen Anderson9fed5892007-08-02 18:20:52 +00001276 for (SmallVector<Instruction*, 8>::iterator I = erase.begin(),
1277 E = erase.end(); I != E; ++I)
Owen Anderson239e7122007-06-12 16:57:50 +00001278 (*I)->eraseFromParent();
Owen Anderson3eaca712007-06-20 22:10:02 +00001279
1280 return changed_function;
Owen Anderson239e7122007-06-12 16:57:50 +00001281}
1282
Owen Anderson9cb56012007-06-21 00:19:05 +00001283/// cleanup - Delete any extraneous values that were created to represent
1284/// expressions without leaders.
Owen Anderson239e7122007-06-12 16:57:50 +00001285void GVNPRE::cleanup() {
1286 while (!createdExpressions.empty()) {
1287 Instruction* I = createdExpressions.back();
1288 createdExpressions.pop_back();
1289
1290 delete I;
1291 }
1292}
1293
Owen Anderson9cb56012007-06-21 00:19:05 +00001294/// buildsets_availout - When calculating availability, handle an instruction
1295/// by inserting it into the appropriate sets
Owen Anderson3eaca712007-06-20 22:10:02 +00001296void GVNPRE::buildsets_availout(BasicBlock::iterator I,
Owen Anderson0616dff2007-07-09 06:50:06 +00001297 ValueNumberedSet& currAvail,
1298 ValueNumberedSet& currPhis,
1299 ValueNumberedSet& currExps,
1300 SmallPtrSet<Value*, 16>& currTemps) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001301 // Handle PHI nodes
Owen Anderson3eaca712007-06-20 22:10:02 +00001302 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001303 unsigned num = VN.lookup_or_add(p);
Owen Anderson12408462007-06-22 03:14:03 +00001304
Owen Anderson3eaca712007-06-20 22:10:02 +00001305 currPhis.insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001306 currPhis.set(num);
Owen Anderson216394f2007-07-03 18:37:08 +00001307
1308 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001309 } else if (CastInst* U = dyn_cast<CastInst>(I)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001310 Value* leftValue = U->getOperand(0);
Owen Anderson3eaca712007-06-20 22:10:02 +00001311
Owen Anderson216394f2007-07-03 18:37:08 +00001312 unsigned num = VN.lookup_or_add(U);
Owen Anderson216394f2007-07-03 18:37:08 +00001313
1314 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001315 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson216394f2007-07-03 18:37:08 +00001316 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001317 currExps.set(VN.lookup(leftValue));
Owen Anderson216394f2007-07-03 18:37:08 +00001318 }
1319
Owen Anderson0616dff2007-07-09 06:50:06 +00001320 if (!currExps.test(num)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001321 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001322 currExps.set(num);
Owen Anderson216394f2007-07-03 18:37:08 +00001323 }
1324
Owen Anderson7b317d22007-06-27 17:03:03 +00001325 // Handle binary ops
1326 } else if (isa<BinaryOperator>(I) || isa<CmpInst>(I) ||
1327 isa<ExtractElementInst>(I)) {
1328 User* U = cast<User>(I);
1329 Value* leftValue = U->getOperand(0);
1330 Value* rightValue = U->getOperand(1);
Owen Anderson3eaca712007-06-20 22:10:02 +00001331
Owen Anderson7b317d22007-06-27 17:03:03 +00001332 unsigned num = VN.lookup_or_add(U);
Owen Anderson3eaca712007-06-20 22:10:02 +00001333
1334 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001335 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson12408462007-06-22 03:14:03 +00001336 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001337 currExps.set(VN.lookup(leftValue));
Owen Anderson12408462007-06-22 03:14:03 +00001338 }
1339
Owen Anderson3eaca712007-06-20 22:10:02 +00001340 if (isa<Instruction>(rightValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001341 if (!currExps.test(VN.lookup(rightValue))) {
Owen Anderson12408462007-06-22 03:14:03 +00001342 currExps.insert(rightValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001343 currExps.set(VN.lookup(rightValue));
Owen Anderson12408462007-06-22 03:14:03 +00001344 }
1345
Owen Anderson0616dff2007-07-09 06:50:06 +00001346 if (!currExps.test(num)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001347 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001348 currExps.set(num);
Owen Anderson12408462007-06-22 03:14:03 +00001349 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001350
Owen Anderson7b317d22007-06-27 17:03:03 +00001351 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001352 } else if (isa<InsertElementInst>(I) || isa<ShuffleVectorInst>(I) ||
1353 isa<SelectInst>(I)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001354 User* U = cast<User>(I);
1355 Value* leftValue = U->getOperand(0);
1356 Value* rightValue = U->getOperand(1);
1357 Value* thirdValue = U->getOperand(2);
Owen Anderson3eaca712007-06-20 22:10:02 +00001358
Owen Anderson7b317d22007-06-27 17:03:03 +00001359 VN.lookup_or_add(U);
Owen Anderson12408462007-06-22 03:14:03 +00001360
Owen Anderson7b317d22007-06-27 17:03:03 +00001361 unsigned num = VN.lookup_or_add(U);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001362
1363 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001364 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001365 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001366 currExps.set(VN.lookup(leftValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001367 }
1368 if (isa<Instruction>(rightValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001369 if (!currExps.test(VN.lookup(rightValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001370 currExps.insert(rightValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001371 currExps.set(VN.lookup(rightValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001372 }
1373 if (isa<Instruction>(thirdValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001374 if (!currExps.test(VN.lookup(thirdValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001375 currExps.insert(thirdValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001376 currExps.set(VN.lookup(thirdValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001377 }
1378
Owen Anderson0616dff2007-07-09 06:50:06 +00001379 if (!currExps.test(num)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001380 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001381 currExps.set(num);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001382 }
1383
Owen Anderson56533222007-07-03 23:51:19 +00001384 // Handle vararg ops
1385 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(I)) {
1386 Value* ptrValue = U->getPointerOperand();
1387
1388 VN.lookup_or_add(U);
1389
1390 unsigned num = VN.lookup_or_add(U);
Owen Anderson56533222007-07-03 23:51:19 +00001391
1392 if (isa<Instruction>(ptrValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001393 if (!currExps.test(VN.lookup(ptrValue))) {
Owen Anderson56533222007-07-03 23:51:19 +00001394 currExps.insert(ptrValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001395 currExps.set(VN.lookup(ptrValue));
Owen Anderson56533222007-07-03 23:51:19 +00001396 }
1397
1398 for (GetElementPtrInst::op_iterator OI = U->idx_begin(), OE = U->idx_end();
1399 OI != OE; ++OI)
Owen Anderson0616dff2007-07-09 06:50:06 +00001400 if (isa<Instruction>(*OI) && !currExps.test(VN.lookup(*OI))) {
Owen Anderson56533222007-07-03 23:51:19 +00001401 currExps.insert(*OI);
Owen Anderson0616dff2007-07-09 06:50:06 +00001402 currExps.set(VN.lookup(*OI));
Owen Anderson56533222007-07-03 23:51:19 +00001403 }
1404
Owen Anderson0616dff2007-07-09 06:50:06 +00001405 if (!currExps.test(VN.lookup(U))) {
Owen Anderson56533222007-07-03 23:51:19 +00001406 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001407 currExps.set(num);
Owen Anderson56533222007-07-03 23:51:19 +00001408 }
1409
Owen Anderson7b317d22007-06-27 17:03:03 +00001410 // Handle opaque ops
1411 } else if (!I->isTerminator()){
Owen Anderson3eaca712007-06-20 22:10:02 +00001412 VN.lookup_or_add(I);
Owen Anderson12408462007-06-22 03:14:03 +00001413
Owen Anderson3eaca712007-06-20 22:10:02 +00001414 currTemps.insert(I);
1415 }
1416
1417 if (!I->isTerminator())
Owen Anderson0616dff2007-07-09 06:50:06 +00001418 if (!currAvail.test(VN.lookup(I))) {
Owen Anderson12408462007-06-22 03:14:03 +00001419 currAvail.insert(I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001420 currAvail.set(VN.lookup(I));
Owen Anderson12408462007-06-22 03:14:03 +00001421 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001422}
Owen Andersonea12a062007-05-29 21:53:49 +00001423
Owen Anderson9cb56012007-06-21 00:19:05 +00001424/// buildsets_anticout - When walking the postdom tree, calculate the ANTIC_OUT
1425/// set as a function of the ANTIC_IN set of the block's predecessors
Owen Anderson82575d82007-06-22 00:20:30 +00001426bool GVNPRE::buildsets_anticout(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +00001427 ValueNumberedSet& anticOut,
Owen Andersonb9781982007-07-19 03:32:44 +00001428 SmallPtrSet<BasicBlock*, 8>& visited) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001429 if (BB->getTerminator()->getNumSuccessors() == 1) {
Owen Andersonf62c44a2007-06-25 05:41:12 +00001430 if (BB->getTerminator()->getSuccessor(0) != BB &&
1431 visited.count(BB->getTerminator()->getSuccessor(0)) == 0) {
Owen Anderson82575d82007-06-22 00:20:30 +00001432 return true;
Owen Andersonf62c44a2007-06-25 05:41:12 +00001433 }
1434 else {
Owen Anderson3eaca712007-06-20 22:10:02 +00001435 phi_translate_set(anticipatedIn[BB->getTerminator()->getSuccessor(0)],
1436 BB, BB->getTerminator()->getSuccessor(0), anticOut);
Owen Andersonf62c44a2007-06-25 05:41:12 +00001437 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001438 } else if (BB->getTerminator()->getNumSuccessors() > 1) {
1439 BasicBlock* first = BB->getTerminator()->getSuccessor(0);
Owen Anderson0616dff2007-07-09 06:50:06 +00001440 for (ValueNumberedSet::iterator I = anticipatedIn[first].begin(),
1441 E = anticipatedIn[first].end(); I != E; ++I) {
1442 anticOut.insert(*I);
1443 anticOut.set(VN.lookup(*I));
1444 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001445
1446 for (unsigned i = 1; i < BB->getTerminator()->getNumSuccessors(); ++i) {
1447 BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
Owen Anderson0616dff2007-07-09 06:50:06 +00001448 ValueNumberedSet& succAnticIn = anticipatedIn[currSucc];
Owen Anderson3eaca712007-06-20 22:10:02 +00001449
Owen Anderson19bc4a82007-07-19 06:37:56 +00001450 SmallVector<Value*, 16> temp;
Owen Anderson66fd9062007-06-21 17:57:53 +00001451
Owen Anderson0616dff2007-07-09 06:50:06 +00001452 for (ValueNumberedSet::iterator I = anticOut.begin(),
Owen Anderson66fd9062007-06-21 17:57:53 +00001453 E = anticOut.end(); I != E; ++I)
Owen Anderson0616dff2007-07-09 06:50:06 +00001454 if (!succAnticIn.test(VN.lookup(*I)))
Owen Anderson66fd9062007-06-21 17:57:53 +00001455 temp.push_back(*I);
1456
Owen Anderson19bc4a82007-07-19 06:37:56 +00001457 for (SmallVector<Value*, 16>::iterator I = temp.begin(), E = temp.end();
Owen Anderson0616dff2007-07-09 06:50:06 +00001458 I != E; ++I) {
Owen Anderson66fd9062007-06-21 17:57:53 +00001459 anticOut.erase(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001460 anticOut.reset(VN.lookup(*I));
1461 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001462 }
1463 }
Owen Anderson82575d82007-06-22 00:20:30 +00001464
1465 return false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001466}
1467
Owen Anderson9cb56012007-06-21 00:19:05 +00001468/// buildsets_anticin - Walk the postdom tree, calculating ANTIC_OUT for
1469/// each block. ANTIC_IN is then a function of ANTIC_OUT and the GEN
1470/// sets populated in buildsets_availout
Owen Anderson82575d82007-06-22 00:20:30 +00001471unsigned GVNPRE::buildsets_anticin(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +00001472 ValueNumberedSet& anticOut,
1473 ValueNumberedSet& currExps,
Owen Andersona20f35d2007-06-28 00:34:34 +00001474 SmallPtrSet<Value*, 16>& currTemps,
Owen Andersonb9781982007-07-19 03:32:44 +00001475 SmallPtrSet<BasicBlock*, 8>& visited) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001476 ValueNumberedSet& anticIn = anticipatedIn[BB];
Owen Anderson2106f612007-06-22 18:27:04 +00001477 unsigned old = anticIn.size();
Owen Anderson3eaca712007-06-20 22:10:02 +00001478
Owen Anderson82575d82007-06-22 00:20:30 +00001479 bool defer = buildsets_anticout(BB, anticOut, visited);
1480 if (defer)
1481 return 0;
Owen Anderson66fd9062007-06-21 17:57:53 +00001482
Owen Anderson3eaca712007-06-20 22:10:02 +00001483 anticIn.clear();
Owen Anderson66fd9062007-06-21 17:57:53 +00001484
Owen Anderson0616dff2007-07-09 06:50:06 +00001485 for (ValueNumberedSet::iterator I = anticOut.begin(),
Owen Anderson2106f612007-06-22 18:27:04 +00001486 E = anticOut.end(); I != E; ++I) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001487 anticIn.insert(*I);
1488 anticIn.set(VN.lookup(*I));
Owen Anderson3eaca712007-06-20 22:10:02 +00001489 }
Owen Anderson0616dff2007-07-09 06:50:06 +00001490 for (ValueNumberedSet::iterator I = currExps.begin(),
Owen Anderson2106f612007-06-22 18:27:04 +00001491 E = currExps.end(); I != E; ++I) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001492 if (!anticIn.test(VN.lookup(*I))) {
Owen Anderson2106f612007-06-22 18:27:04 +00001493 anticIn.insert(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001494 anticIn.set(VN.lookup(*I));
Owen Anderson2106f612007-06-22 18:27:04 +00001495 }
1496 }
1497
Owen Andersona20f35d2007-06-28 00:34:34 +00001498 for (SmallPtrSet<Value*, 16>::iterator I = currTemps.begin(),
Owen Anderson68cb52e2007-06-27 17:38:29 +00001499 E = currTemps.end(); I != E; ++I) {
Owen Anderson2106f612007-06-22 18:27:04 +00001500 anticIn.erase(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001501 anticIn.reset(VN.lookup(*I));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001502 }
Owen Anderson2106f612007-06-22 18:27:04 +00001503
Owen Anderson0616dff2007-07-09 06:50:06 +00001504 clean(anticIn);
Owen Anderson68cb52e2007-06-27 17:38:29 +00001505 anticOut.clear();
Owen Anderson3eaca712007-06-20 22:10:02 +00001506
Owen Anderson68cb52e2007-06-27 17:38:29 +00001507 if (old != anticIn.size())
Owen Anderson82575d82007-06-22 00:20:30 +00001508 return 2;
Owen Anderson68cb52e2007-06-27 17:38:29 +00001509 else
Owen Anderson82575d82007-06-22 00:20:30 +00001510 return 1;
Owen Anderson3eaca712007-06-20 22:10:02 +00001511}
1512
Owen Anderson9cb56012007-06-21 00:19:05 +00001513/// buildsets - Phase 1 of the main algorithm. Construct the AVAIL_OUT
1514/// and the ANTIC_IN sets.
Owen Anderson6032a5b2007-06-26 23:29:41 +00001515void GVNPRE::buildsets(Function& F) {
Owen Andersonb9781982007-07-19 03:32:44 +00001516 DenseMap<BasicBlock*, ValueNumberedSet> generatedExpressions;
1517 DenseMap<BasicBlock*, SmallPtrSet<Value*, 16> > generatedTemporaries;
Owen Anderson3eaca712007-06-20 22:10:02 +00001518
Owen Andersonea12a062007-05-29 21:53:49 +00001519 DominatorTree &DT = getAnalysis<DominatorTree>();
1520
Owen Anderson12112af2007-06-06 01:27:49 +00001521 // Phase 1, Part 1: calculate AVAIL_OUT
Owen Andersonea12a062007-05-29 21:53:49 +00001522
1523 // Top-down walk of the dominator tree
Devang Patel26042422007-06-04 00:32:22 +00001524 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
Owen Andersonea12a062007-05-29 21:53:49 +00001525 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1526
1527 // Get the sets to update for this block
Owen Anderson0616dff2007-07-09 06:50:06 +00001528 ValueNumberedSet& currExps = generatedExpressions[DI->getBlock()];
1529 ValueNumberedSet& currPhis = generatedPhis[DI->getBlock()];
Owen Andersona20f35d2007-06-28 00:34:34 +00001530 SmallPtrSet<Value*, 16>& currTemps = generatedTemporaries[DI->getBlock()];
Owen Anderson0616dff2007-07-09 06:50:06 +00001531 ValueNumberedSet& currAvail = availableOut[DI->getBlock()];
Owen Andersonea12a062007-05-29 21:53:49 +00001532
Owen Anderson086f5f32007-06-19 03:31:41 +00001533 BasicBlock* BB = DI->getBlock();
1534
1535 // A block inherits AVAIL_OUT from its dominator
Owen Andersondfa24352007-07-09 22:29:50 +00001536 if (DI->getIDom() != 0)
1537 currAvail = availableOut[DI->getIDom()->getBlock()];
Owen Anderson0616dff2007-07-09 06:50:06 +00001538
Owen Anderson086f5f32007-06-19 03:31:41 +00001539 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
Owen Anderson3eaca712007-06-20 22:10:02 +00001540 BI != BE; ++BI)
Owen Anderson12408462007-06-22 03:14:03 +00001541 buildsets_availout(BI, currAvail, currPhis, currExps,
Owen Anderson0616dff2007-07-09 06:50:06 +00001542 currTemps);
Owen Anderson086f5f32007-06-19 03:31:41 +00001543
Owen Andersonea12a062007-05-29 21:53:49 +00001544 }
Owen Andersonf62c44a2007-06-25 05:41:12 +00001545
1546 // Phase 1, Part 2: calculate ANTIC_IN
Owen Andersonea12a062007-05-29 21:53:49 +00001547
Owen Andersonb9781982007-07-19 03:32:44 +00001548 SmallPtrSet<BasicBlock*, 8> visited;
Owen Anderson6032a5b2007-06-26 23:29:41 +00001549 SmallPtrSet<BasicBlock*, 4> block_changed;
1550 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
1551 block_changed.insert(FI);
Owen Andersone3072b22007-05-29 23:26:30 +00001552
Owen Andersonea12a062007-05-29 21:53:49 +00001553 bool changed = true;
1554 unsigned iterations = 0;
Owen Anderson6032a5b2007-06-26 23:29:41 +00001555
Owen Andersonea12a062007-05-29 21:53:49 +00001556 while (changed) {
1557 changed = false;
Owen Anderson0616dff2007-07-09 06:50:06 +00001558 ValueNumberedSet anticOut;
Owen Andersonea12a062007-05-29 21:53:49 +00001559
Owen Anderson6032a5b2007-06-26 23:29:41 +00001560 // Postorder walk of the CFG
Owen Anderson9030d382007-06-25 18:25:31 +00001561 for (po_iterator<BasicBlock*> BBI = po_begin(&F.getEntryBlock()),
1562 BBE = po_end(&F.getEntryBlock()); BBI != BBE; ++BBI) {
Owen Andersonf62c44a2007-06-25 05:41:12 +00001563 BasicBlock* BB = *BBI;
Owen Anderson0e714662007-06-11 16:25:17 +00001564
Owen Anderson6032a5b2007-06-26 23:29:41 +00001565 if (block_changed.count(BB) != 0) {
1566 unsigned ret = buildsets_anticin(BB, anticOut,generatedExpressions[BB],
1567 generatedTemporaries[BB], visited);
Owen Anderson82575d82007-06-22 00:20:30 +00001568
Owen Anderson6032a5b2007-06-26 23:29:41 +00001569 if (ret == 0) {
1570 changed = true;
1571 continue;
1572 } else {
1573 visited.insert(BB);
1574
1575 if (ret == 2)
1576 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1577 PI != PE; ++PI) {
1578 block_changed.insert(*PI);
1579 }
1580 else
1581 block_changed.erase(BB);
1582
1583 changed |= (ret == 2);
Owen Andersonf62c44a2007-06-25 05:41:12 +00001584 }
Owen Anderson82575d82007-06-22 00:20:30 +00001585 }
Owen Andersonea12a062007-05-29 21:53:49 +00001586 }
Owen Anderson5ea069f2007-06-04 18:05:26 +00001587
Owen Andersonea12a062007-05-29 21:53:49 +00001588 iterations++;
1589 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001590}
1591
Owen Anderson9cb56012007-06-21 00:19:05 +00001592/// insertion_pre - When a partial redundancy has been identified, eliminate it
1593/// by inserting appropriate values into the predecessors and a phi node in
1594/// the main block
Owen Anderson3eaca712007-06-20 22:10:02 +00001595void GVNPRE::insertion_pre(Value* e, BasicBlock* BB,
Owen Anderson19bc4a82007-07-19 06:37:56 +00001596 DenseMap<BasicBlock*, Value*>& avail,
Owen Anderson0616dff2007-07-09 06:50:06 +00001597 std::map<BasicBlock*, ValueNumberedSet>& new_sets) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001598 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
1599 Value* e2 = avail[*PI];
Owen Anderson0616dff2007-07-09 06:50:06 +00001600 if (!availableOut[*PI].test(VN.lookup(e2))) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001601 User* U = cast<User>(e2);
1602
1603 Value* s1 = 0;
1604 if (isa<BinaryOperator>(U->getOperand(0)) ||
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001605 isa<CmpInst>(U->getOperand(0)) ||
1606 isa<ShuffleVectorInst>(U->getOperand(0)) ||
1607 isa<ExtractElementInst>(U->getOperand(0)) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001608 isa<InsertElementInst>(U->getOperand(0)) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001609 isa<SelectInst>(U->getOperand(0)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001610 isa<CastInst>(U->getOperand(0)) ||
1611 isa<GetElementPtrInst>(U->getOperand(0)))
Owen Anderson3eaca712007-06-20 22:10:02 +00001612 s1 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(0)));
1613 else
1614 s1 = U->getOperand(0);
1615
1616 Value* s2 = 0;
Owen Anderson216394f2007-07-03 18:37:08 +00001617
1618 if (isa<BinaryOperator>(U) ||
1619 isa<CmpInst>(U) ||
1620 isa<ShuffleVectorInst>(U) ||
1621 isa<ExtractElementInst>(U) ||
1622 isa<InsertElementInst>(U) ||
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001623 isa<SelectInst>(U)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001624 if (isa<BinaryOperator>(U->getOperand(1)) ||
1625 isa<CmpInst>(U->getOperand(1)) ||
1626 isa<ShuffleVectorInst>(U->getOperand(1)) ||
1627 isa<ExtractElementInst>(U->getOperand(1)) ||
1628 isa<InsertElementInst>(U->getOperand(1)) ||
1629 isa<SelectInst>(U->getOperand(1)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001630 isa<CastInst>(U->getOperand(1)) ||
1631 isa<GetElementPtrInst>(U->getOperand(1))) {
Owen Anderson216394f2007-07-03 18:37:08 +00001632 s2 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(1)));
1633 } else {
1634 s2 = U->getOperand(1);
1635 }
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001636 }
Owen Anderson7b317d22007-06-27 17:03:03 +00001637
1638 // Ternary Operators
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001639 Value* s3 = 0;
1640 if (isa<ShuffleVectorInst>(U) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001641 isa<InsertElementInst>(U) ||
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001642 isa<SelectInst>(U)) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001643 if (isa<BinaryOperator>(U->getOperand(2)) ||
1644 isa<CmpInst>(U->getOperand(2)) ||
1645 isa<ShuffleVectorInst>(U->getOperand(2)) ||
1646 isa<ExtractElementInst>(U->getOperand(2)) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001647 isa<InsertElementInst>(U->getOperand(2)) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001648 isa<SelectInst>(U->getOperand(2)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001649 isa<CastInst>(U->getOperand(2)) ||
1650 isa<GetElementPtrInst>(U->getOperand(2))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001651 s3 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(2)));
Owen Anderson216394f2007-07-03 18:37:08 +00001652 } else {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001653 s3 = U->getOperand(2);
Owen Anderson216394f2007-07-03 18:37:08 +00001654 }
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001655 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001656
Owen Anderson56533222007-07-03 23:51:19 +00001657 // Vararg operators
Owen Anderson19bc4a82007-07-19 06:37:56 +00001658 SmallVector<Value*, 4> sVarargs;
Owen Anderson56533222007-07-03 23:51:19 +00001659 if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(U)) {
1660 for (GetElementPtrInst::op_iterator OI = G->idx_begin(),
1661 OE = G->idx_end(); OI != OE; ++OI) {
1662 if (isa<BinaryOperator>(*OI) ||
1663 isa<CmpInst>(*OI) ||
1664 isa<ShuffleVectorInst>(*OI) ||
1665 isa<ExtractElementInst>(*OI) ||
1666 isa<InsertElementInst>(*OI) ||
1667 isa<SelectInst>(*OI) ||
1668 isa<CastInst>(*OI) ||
1669 isa<GetElementPtrInst>(*OI)) {
1670 sVarargs.push_back(find_leader(availableOut[*PI],
1671 VN.lookup(*OI)));
1672 } else {
1673 sVarargs.push_back(*OI);
1674 }
1675 }
1676 }
1677
Owen Anderson3eaca712007-06-20 22:10:02 +00001678 Value* newVal = 0;
1679 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +00001680 newVal = BinaryOperator::Create(BO->getOpcode(), s1, s2,
Owen Anderson3eaca712007-06-20 22:10:02 +00001681 BO->getName()+".gvnpre",
1682 (*PI)->getTerminator());
1683 else if (CmpInst* C = dyn_cast<CmpInst>(U))
Dan Gohman1c8a23c2009-08-25 23:17:54 +00001684 newVal = CmpInst::Create(C->getOpcode(),
Owen Anderson333c4002009-07-09 23:48:35 +00001685 C->getPredicate(), s1, s2,
Owen Anderson3eaca712007-06-20 22:10:02 +00001686 C->getName()+".gvnpre",
1687 (*PI)->getTerminator());
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001688 else if (ShuffleVectorInst* S = dyn_cast<ShuffleVectorInst>(U))
1689 newVal = new ShuffleVectorInst(s1, s2, s3, S->getName()+".gvnpre",
1690 (*PI)->getTerminator());
1691 else if (InsertElementInst* S = dyn_cast<InsertElementInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001692 newVal = InsertElementInst::Create(s1, s2, s3, S->getName()+".gvnpre",
1693 (*PI)->getTerminator());
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001694 else if (ExtractElementInst* S = dyn_cast<ExtractElementInst>(U))
Eric Christophera3500da2009-07-25 02:28:41 +00001695 newVal = ExtractElementInst::Create(s1, s2, S->getName()+".gvnpre",
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001696 (*PI)->getTerminator());
Owen Anderson890e1a02007-06-28 23:51:21 +00001697 else if (SelectInst* S = dyn_cast<SelectInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001698 newVal = SelectInst::Create(s1, s2, s3, S->getName()+".gvnpre",
1699 (*PI)->getTerminator());
Owen Anderson216394f2007-07-03 18:37:08 +00001700 else if (CastInst* C = dyn_cast<CastInst>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +00001701 newVal = CastInst::Create(C->getOpcode(), s1, C->getType(),
Owen Anderson216394f2007-07-03 18:37:08 +00001702 C->getName()+".gvnpre",
1703 (*PI)->getTerminator());
Owen Anderson56533222007-07-03 23:51:19 +00001704 else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001705 newVal = GetElementPtrInst::Create(s1, sVarargs.begin(), sVarargs.end(),
1706 G->getName()+".gvnpre",
1707 (*PI)->getTerminator());
1708
Owen Anderson3eaca712007-06-20 22:10:02 +00001709 VN.add(newVal, VN.lookup(U));
1710
Owen Anderson0616dff2007-07-09 06:50:06 +00001711 ValueNumberedSet& predAvail = availableOut[*PI];
Owen Anderson3eaca712007-06-20 22:10:02 +00001712 val_replace(predAvail, newVal);
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001713 val_replace(new_sets[*PI], newVal);
Owen Anderson0616dff2007-07-09 06:50:06 +00001714 predAvail.set(VN.lookup(newVal));
Owen Anderson9cb56012007-06-21 00:19:05 +00001715
Owen Anderson19bc4a82007-07-19 06:37:56 +00001716 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001717 if (av != avail.end())
1718 avail.erase(av);
1719 avail.insert(std::make_pair(*PI, newVal));
1720
1721 ++NumInsertedVals;
1722 }
1723 }
1724
1725 PHINode* p = 0;
1726
1727 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
1728 if (p == 0)
Gabor Greif051a9502008-04-06 20:25:17 +00001729 p = PHINode::Create(avail[*PI]->getType(), "gvnpre-join", BB->begin());
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001730
Owen Anderson3eaca712007-06-20 22:10:02 +00001731 p->addIncoming(avail[*PI], *PI);
1732 }
1733
1734 VN.add(p, VN.lookup(e));
Owen Anderson3eaca712007-06-20 22:10:02 +00001735 val_replace(availableOut[BB], p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001736 availableOut[BB].set(VN.lookup(e));
Owen Andersonec5614b2007-07-06 20:29:43 +00001737 generatedPhis[BB].insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001738 generatedPhis[BB].set(VN.lookup(e));
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001739 new_sets[BB].insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001740 new_sets[BB].set(VN.lookup(e));
Owen Anderson3eaca712007-06-20 22:10:02 +00001741
1742 ++NumInsertedPhis;
1743}
1744
Owen Anderson9cb56012007-06-21 00:19:05 +00001745/// insertion_mergepoint - When walking the dom tree, check at each merge
1746/// block for the possibility of a partial redundancy. If present, eliminate it
Owen Anderson19bc4a82007-07-19 06:37:56 +00001747unsigned GVNPRE::insertion_mergepoint(SmallVector<Value*, 8>& workList,
Owen Anderson82575d82007-06-22 00:20:30 +00001748 df_iterator<DomTreeNode*>& D,
Owen Anderson0616dff2007-07-09 06:50:06 +00001749 std::map<BasicBlock*, ValueNumberedSet >& new_sets) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001750 bool changed_function = false;
1751 bool new_stuff = false;
1752
1753 BasicBlock* BB = D->getBlock();
1754 for (unsigned i = 0; i < workList.size(); ++i) {
1755 Value* e = workList[i];
1756
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001757 if (isa<BinaryOperator>(e) || isa<CmpInst>(e) ||
1758 isa<ExtractElementInst>(e) || isa<InsertElementInst>(e) ||
Owen Anderson56533222007-07-03 23:51:19 +00001759 isa<ShuffleVectorInst>(e) || isa<SelectInst>(e) || isa<CastInst>(e) ||
1760 isa<GetElementPtrInst>(e)) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001761 if (availableOut[D->getIDom()->getBlock()].test(VN.lookup(e)))
Owen Anderson3eaca712007-06-20 22:10:02 +00001762 continue;
1763
Owen Anderson19bc4a82007-07-19 06:37:56 +00001764 DenseMap<BasicBlock*, Value*> avail;
Owen Anderson3eaca712007-06-20 22:10:02 +00001765 bool by_some = false;
Owen Andersonec5614b2007-07-06 20:29:43 +00001766 bool all_same = true;
1767 Value * first_s = 0;
Owen Anderson3eaca712007-06-20 22:10:02 +00001768
1769 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;
1770 ++PI) {
1771 Value *e2 = phi_translate(e, *PI, BB);
1772 Value *e3 = find_leader(availableOut[*PI], VN.lookup(e2));
1773
1774 if (e3 == 0) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001775 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001776 if (av != avail.end())
1777 avail.erase(av);
1778 avail.insert(std::make_pair(*PI, e2));
Owen Andersonec5614b2007-07-06 20:29:43 +00001779 all_same = false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001780 } else {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001781 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001782 if (av != avail.end())
1783 avail.erase(av);
1784 avail.insert(std::make_pair(*PI, e3));
1785
1786 by_some = true;
Owen Andersonec5614b2007-07-06 20:29:43 +00001787 if (first_s == 0)
1788 first_s = e3;
1789 else if (first_s != e3)
1790 all_same = false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001791 }
1792 }
1793
Owen Andersonec5614b2007-07-06 20:29:43 +00001794 if (by_some && !all_same &&
Owen Anderson0616dff2007-07-09 06:50:06 +00001795 !generatedPhis[BB].test(VN.lookup(e))) {
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001796 insertion_pre(e, BB, avail, new_sets);
Owen Anderson3eaca712007-06-20 22:10:02 +00001797
1798 changed_function = true;
1799 new_stuff = true;
1800 }
1801 }
1802 }
1803
1804 unsigned retval = 0;
1805 if (changed_function)
1806 retval += 1;
1807 if (new_stuff)
1808 retval += 2;
1809
1810 return retval;
1811}
1812
Owen Anderson9cb56012007-06-21 00:19:05 +00001813/// insert - Phase 2 of the main algorithm. Walk the dominator tree looking for
1814/// merge points. When one is found, check for a partial redundancy. If one is
1815/// present, eliminate it. Repeat this walk until no changes are made.
Owen Anderson3eaca712007-06-20 22:10:02 +00001816bool GVNPRE::insertion(Function& F) {
1817 bool changed_function = false;
1818
1819 DominatorTree &DT = getAnalysis<DominatorTree>();
Owen Anderson397d4052007-06-08 01:03:01 +00001820
Owen Anderson0616dff2007-07-09 06:50:06 +00001821 std::map<BasicBlock*, ValueNumberedSet> new_sets;
Owen Anderson397d4052007-06-08 01:03:01 +00001822 bool new_stuff = true;
1823 while (new_stuff) {
1824 new_stuff = false;
Owen Anderson397d4052007-06-08 01:03:01 +00001825 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
1826 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1827 BasicBlock* BB = DI->getBlock();
1828
Owen Anderson0e714662007-06-11 16:25:17 +00001829 if (BB == 0)
1830 continue;
1831
Owen Anderson0616dff2007-07-09 06:50:06 +00001832 ValueNumberedSet& availOut = availableOut[BB];
1833 ValueNumberedSet& anticIn = anticipatedIn[BB];
Owen Anderson397d4052007-06-08 01:03:01 +00001834
1835 // Replace leaders with leaders inherited from dominator
1836 if (DI->getIDom() != 0) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001837 ValueNumberedSet& dom_set = new_sets[DI->getIDom()->getBlock()];
1838 for (ValueNumberedSet::iterator I = dom_set.begin(),
Owen Anderson397d4052007-06-08 01:03:01 +00001839 E = dom_set.end(); I != E; ++I) {
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001840 val_replace(new_sets[BB], *I);
Owen Anderson086f5f32007-06-19 03:31:41 +00001841 val_replace(availOut, *I);
Owen Anderson397d4052007-06-08 01:03:01 +00001842 }
1843 }
1844
1845 // If there is more than one predecessor...
1846 if (pred_begin(BB) != pred_end(BB) && ++pred_begin(BB) != pred_end(BB)) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001847 SmallVector<Value*, 8> workList;
Owen Andersone8138ff2007-06-22 00:43:22 +00001848 workList.reserve(anticIn.size());
Owen Anderson397d4052007-06-08 01:03:01 +00001849 topo_sort(anticIn, workList);
1850
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001851 unsigned result = insertion_mergepoint(workList, DI, new_sets);
Owen Anderson3eaca712007-06-20 22:10:02 +00001852 if (result & 1)
1853 changed_function = true;
1854 if (result & 2)
1855 new_stuff = true;
Owen Anderson397d4052007-06-08 01:03:01 +00001856 }
1857 }
Owen Anderson397d4052007-06-08 01:03:01 +00001858 }
Owen Anderson12112af2007-06-06 01:27:49 +00001859
Owen Anderson3eaca712007-06-20 22:10:02 +00001860 return changed_function;
1861}
1862
Owen Anderson9cb56012007-06-21 00:19:05 +00001863// GVNPRE::runOnFunction - This is the main transformation entry point for a
1864// function.
1865//
Owen Anderson3eaca712007-06-20 22:10:02 +00001866bool GVNPRE::runOnFunction(Function &F) {
Owen Anderson9cb56012007-06-21 00:19:05 +00001867 // Clean out global sets from any previous functions
Owen Anderson3eaca712007-06-20 22:10:02 +00001868 VN.clear();
1869 createdExpressions.clear();
1870 availableOut.clear();
1871 anticipatedIn.clear();
Owen Andersonec5614b2007-07-06 20:29:43 +00001872 generatedPhis.clear();
1873
Owen Anderson3eaca712007-06-20 22:10:02 +00001874 bool changed_function = false;
1875
1876 // Phase 1: BuildSets
Owen Anderson9cb56012007-06-21 00:19:05 +00001877 // This phase calculates the AVAIL_OUT and ANTIC_IN sets
Owen Anderson6032a5b2007-06-26 23:29:41 +00001878 buildsets(F);
Owen Anderson3eaca712007-06-20 22:10:02 +00001879
1880 // Phase 2: Insert
Owen Anderson9cb56012007-06-21 00:19:05 +00001881 // This phase inserts values to make partially redundant values
1882 // fully redundant
Owen Anderson3eaca712007-06-20 22:10:02 +00001883 changed_function |= insertion(F);
1884
Owen Anderson12112af2007-06-06 01:27:49 +00001885 // Phase 3: Eliminate
Owen Anderson9cb56012007-06-21 00:19:05 +00001886 // This phase performs trivial full redundancy elimination
Owen Anderson3eaca712007-06-20 22:10:02 +00001887 changed_function |= elimination();
Owen Anderson8338ff52007-06-08 20:44:02 +00001888
Owen Anderson397d4052007-06-08 01:03:01 +00001889 // Phase 4: Cleanup
Owen Anderson9cb56012007-06-21 00:19:05 +00001890 // This phase cleans up values that were created solely
1891 // as leaders for expressions
Owen Anderson239e7122007-06-12 16:57:50 +00001892 cleanup();
Owen Anderson397d4052007-06-08 01:03:01 +00001893
Owen Anderson0304b2b2007-06-20 18:30:20 +00001894 return changed_function;
Owen Andersonea12a062007-05-29 21:53:49 +00001895}