blob: 3f66131e5bddb06709e13c503a5b1ab2981b52a4 [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))
Owen Anderson333c4002009-07-09 23:48:35 +0000865 newVal = CmpInst::Create(*Context, 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))
870 newVal = new ExtractElementInst(newOp1, newOp2, E->getName()+".expr");
Owen Anderson8338ff52007-06-08 20:44:02 +0000871
Owen Anderson086f5f32007-06-19 03:31:41 +0000872 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson71fcebc2007-06-12 22:43:57 +0000873
Owen Anderson086f5f32007-06-19 03:31:41 +0000874 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson71fcebc2007-06-12 22:43:57 +0000875 if (leader == 0) {
Owen Anderson65d28622007-06-12 00:50:47 +0000876 createdExpressions.push_back(newVal);
Owen Anderson5ea069f2007-06-04 18:05:26 +0000877 return newVal;
Owen Anderson8f862c82007-06-05 22:11:49 +0000878 } else {
Owen Anderson20cb51f2007-06-19 05:37:32 +0000879 VN.erase(newVal);
Owen Anderson8f862c82007-06-05 22:11:49 +0000880 delete newVal;
Owen Anderson71fcebc2007-06-12 22:43:57 +0000881 return leader;
Owen Anderson8f862c82007-06-05 22:11:49 +0000882 }
Owen Anderson5ea069f2007-06-04 18:05:26 +0000883 }
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000884
885 // Ternary Operations
Owen Anderson890e1a02007-06-28 23:51:21 +0000886 } else if (isa<ShuffleVectorInst>(V) || isa<InsertElementInst>(V) ||
887 isa<SelectInst>(V)) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000888 User* U = cast<User>(V);
889
890 Value* newOp1 = 0;
891 if (isa<Instruction>(U->getOperand(0)))
892 newOp1 = phi_translate(U->getOperand(0), pred, succ);
893 else
894 newOp1 = U->getOperand(0);
895
896 if (newOp1 == 0)
897 return 0;
898
899 Value* newOp2 = 0;
900 if (isa<Instruction>(U->getOperand(1)))
901 newOp2 = phi_translate(U->getOperand(1), pred, succ);
902 else
903 newOp2 = U->getOperand(1);
904
905 if (newOp2 == 0)
906 return 0;
907
908 Value* newOp3 = 0;
909 if (isa<Instruction>(U->getOperand(2)))
910 newOp3 = phi_translate(U->getOperand(2), pred, succ);
911 else
912 newOp3 = U->getOperand(2);
913
914 if (newOp3 == 0)
915 return 0;
916
917 if (newOp1 != U->getOperand(0) ||
918 newOp2 != U->getOperand(1) ||
919 newOp3 != U->getOperand(2)) {
920 Instruction* newVal = 0;
921 if (ShuffleVectorInst* S = dyn_cast<ShuffleVectorInst>(U))
922 newVal = new ShuffleVectorInst(newOp1, newOp2, newOp3,
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000923 S->getName() + ".expr");
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000924 else if (InsertElementInst* I = dyn_cast<InsertElementInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +0000925 newVal = InsertElementInst::Create(newOp1, newOp2, newOp3,
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000926 I->getName() + ".expr");
Owen Anderson890e1a02007-06-28 23:51:21 +0000927 else if (SelectInst* I = dyn_cast<SelectInst>(U))
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000928 newVal = SelectInst::Create(newOp1, newOp2, newOp3,
929 I->getName() + ".expr");
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000930
931 uint32_t v = VN.lookup_or_add(newVal);
932
933 Value* leader = find_leader(availableOut[pred], v);
934 if (leader == 0) {
935 createdExpressions.push_back(newVal);
936 return newVal;
937 } else {
938 VN.erase(newVal);
939 delete newVal;
940 return leader;
941 }
942 }
943
Owen Anderson56533222007-07-03 23:51:19 +0000944 // Varargs operators
945 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
946 Value* newOp1 = 0;
947 if (isa<Instruction>(U->getPointerOperand()))
948 newOp1 = phi_translate(U->getPointerOperand(), pred, succ);
949 else
950 newOp1 = U->getPointerOperand();
951
952 if (newOp1 == 0)
953 return 0;
954
955 bool changed_idx = false;
Owen Anderson19bc4a82007-07-19 06:37:56 +0000956 SmallVector<Value*, 4> newIdx;
Owen Anderson56533222007-07-03 23:51:19 +0000957 for (GetElementPtrInst::op_iterator I = U->idx_begin(), E = U->idx_end();
958 I != E; ++I)
959 if (isa<Instruction>(*I)) {
960 Value* newVal = phi_translate(*I, pred, succ);
961 newIdx.push_back(newVal);
962 if (newVal != *I)
963 changed_idx = true;
964 } else {
965 newIdx.push_back(*I);
966 }
967
968 if (newOp1 != U->getPointerOperand() || changed_idx) {
Gabor Greif051a9502008-04-06 20:25:17 +0000969 Instruction* newVal =
970 GetElementPtrInst::Create(newOp1,
971 newIdx.begin(), newIdx.end(),
972 U->getName()+".expr");
Owen Anderson56533222007-07-03 23:51:19 +0000973
974 uint32_t v = VN.lookup_or_add(newVal);
975
976 Value* leader = find_leader(availableOut[pred], v);
977 if (leader == 0) {
978 createdExpressions.push_back(newVal);
979 return newVal;
980 } else {
981 VN.erase(newVal);
982 delete newVal;
983 return leader;
984 }
985 }
986
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000987 // PHI Nodes
Owen Anderson5ea069f2007-06-04 18:05:26 +0000988 } else if (PHINode* P = dyn_cast<PHINode>(V)) {
Owen Anderson65d28622007-06-12 00:50:47 +0000989 if (P->getParent() == succ)
Owen Anderson5ea069f2007-06-04 18:05:26 +0000990 return P->getIncomingValueForBlock(pred);
991 }
992
993 return V;
994}
995
Owen Anderson9cb56012007-06-21 00:19:05 +0000996/// phi_translate_set - Perform phi translation on every element of a set
Owen Anderson0616dff2007-07-09 06:50:06 +0000997void GVNPRE::phi_translate_set(ValueNumberedSet& anticIn,
Owen Anderson65d28622007-06-12 00:50:47 +0000998 BasicBlock* pred, BasicBlock* succ,
Owen Anderson0616dff2007-07-09 06:50:06 +0000999 ValueNumberedSet& out) {
1000 for (ValueNumberedSet::iterator I = anticIn.begin(),
Owen Anderson5ea069f2007-06-04 18:05:26 +00001001 E = anticIn.end(); I != E; ++I) {
Owen Anderson71fcebc2007-06-12 22:43:57 +00001002 Value* V = phi_translate(*I, pred, succ);
Owen Anderson0616dff2007-07-09 06:50:06 +00001003 if (V != 0 && !out.test(VN.lookup_or_add(V))) {
Owen Anderson5ea069f2007-06-04 18:05:26 +00001004 out.insert(V);
Owen Anderson0616dff2007-07-09 06:50:06 +00001005 out.set(VN.lookup(V));
1006 }
Owen Andersonea12a062007-05-29 21:53:49 +00001007 }
1008}
1009
Owen Anderson9cb56012007-06-21 00:19:05 +00001010/// dependsOnInvoke - Test if a value has an phi node as an operand, any of
1011/// whose inputs is an invoke instruction. If this is true, we cannot safely
1012/// PRE the instruction or anything that depends on it.
Owen Andersonbbf11972007-06-18 04:42:29 +00001013bool GVNPRE::dependsOnInvoke(Value* V) {
Owen Anderson52471b12007-06-19 23:07:16 +00001014 if (PHINode* p = dyn_cast<PHINode>(V)) {
1015 for (PHINode::op_iterator I = p->op_begin(), E = p->op_end(); I != E; ++I)
1016 if (isa<InvokeInst>(*I))
Owen Andersonbbf11972007-06-18 04:42:29 +00001017 return true;
Owen Anderson52471b12007-06-19 23:07:16 +00001018 return false;
1019 } else {
1020 return false;
Owen Anderson32bc7892007-06-16 00:26:54 +00001021 }
Owen Anderson32bc7892007-06-16 00:26:54 +00001022}
1023
Owen Anderson9cb56012007-06-21 00:19:05 +00001024/// clean - Remove all non-opaque values from the set whose operands are not
1025/// themselves in the set, as well as all values that depend on invokes (see
1026/// above)
Owen Anderson0616dff2007-07-09 06:50:06 +00001027void GVNPRE::clean(ValueNumberedSet& set) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001028 SmallVector<Value*, 8> worklist;
Owen Andersone8138ff2007-06-22 00:43:22 +00001029 worklist.reserve(set.size());
Owen Anderson397d4052007-06-08 01:03:01 +00001030 topo_sort(set, worklist);
Owen Andersonea12a062007-05-29 21:53:49 +00001031
Owen Anderson397d4052007-06-08 01:03:01 +00001032 for (unsigned i = 0; i < worklist.size(); ++i) {
1033 Value* v = worklist[i];
Owen Andersonea12a062007-05-29 21:53:49 +00001034
Owen Anderson216394f2007-07-03 18:37:08 +00001035 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001036 if (CastInst* U = dyn_cast<CastInst>(v)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001037 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001038 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson216394f2007-07-03 18:37:08 +00001039 if (lhsValid)
1040 lhsValid = !dependsOnInvoke(U->getOperand(0));
1041
1042 if (!lhsValid) {
1043 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001044 set.reset(VN.lookup(U));
Owen Anderson216394f2007-07-03 18:37:08 +00001045 }
1046
Owen Anderson7b317d22007-06-27 17:03:03 +00001047 // Handle binary ops
Owen Anderson216394f2007-07-03 18:37:08 +00001048 } else if (isa<BinaryOperator>(v) || isa<CmpInst>(v) ||
Owen Anderson7b317d22007-06-27 17:03:03 +00001049 isa<ExtractElementInst>(v)) {
1050 User* U = cast<User>(v);
1051
1052 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001053 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson60e17442007-06-18 04:30:44 +00001054 if (lhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001055 lhsValid = !dependsOnInvoke(U->getOperand(0));
Owen Andersona724ac12007-06-03 05:55:58 +00001056
Owen Anderson7b317d22007-06-27 17:03:03 +00001057 bool rhsValid = !isa<Instruction>(U->getOperand(1));
Owen Anderson0616dff2007-07-09 06:50:06 +00001058 rhsValid |= set.test(VN.lookup(U->getOperand(1)));
Owen Anderson60e17442007-06-18 04:30:44 +00001059 if (rhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001060 rhsValid = !dependsOnInvoke(U->getOperand(1));
Owen Andersonea12a062007-05-29 21:53:49 +00001061
Owen Anderson68cb52e2007-06-27 17:38:29 +00001062 if (!lhsValid || !rhsValid) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001063 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001064 set.reset(VN.lookup(U));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001065 }
Owen Anderson139fe842007-06-09 18:35:31 +00001066
Owen Anderson7b317d22007-06-27 17:03:03 +00001067 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001068 } else if (isa<ShuffleVectorInst>(v) || isa<InsertElementInst>(v) ||
1069 isa<SelectInst>(v)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001070 User* U = cast<User>(v);
1071
1072 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001073 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001074 if (lhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001075 lhsValid = !dependsOnInvoke(U->getOperand(0));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001076
Owen Anderson7b317d22007-06-27 17:03:03 +00001077 bool rhsValid = !isa<Instruction>(U->getOperand(1));
Owen Anderson0616dff2007-07-09 06:50:06 +00001078 rhsValid |= set.test(VN.lookup(U->getOperand(1)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001079 if (rhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001080 rhsValid = !dependsOnInvoke(U->getOperand(1));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001081
Owen Anderson7b317d22007-06-27 17:03:03 +00001082 bool thirdValid = !isa<Instruction>(U->getOperand(2));
Owen Anderson0616dff2007-07-09 06:50:06 +00001083 thirdValid |= set.test(VN.lookup(U->getOperand(2)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001084 if (thirdValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001085 thirdValid = !dependsOnInvoke(U->getOperand(2));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001086
Owen Anderson68cb52e2007-06-27 17:38:29 +00001087 if (!lhsValid || !rhsValid || !thirdValid) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001088 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001089 set.reset(VN.lookup(U));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001090 }
Owen Anderson56533222007-07-03 23:51:19 +00001091
1092 // Handle varargs ops
1093 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(v)) {
1094 bool ptrValid = !isa<Instruction>(U->getPointerOperand());
Owen Anderson0616dff2007-07-09 06:50:06 +00001095 ptrValid |= set.test(VN.lookup(U->getPointerOperand()));
Owen Anderson56533222007-07-03 23:51:19 +00001096 if (ptrValid)
1097 ptrValid = !dependsOnInvoke(U->getPointerOperand());
1098
1099 bool varValid = true;
1100 for (GetElementPtrInst::op_iterator I = U->idx_begin(), E = U->idx_end();
1101 I != E; ++I)
1102 if (varValid) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001103 varValid &= !isa<Instruction>(*I) || set.test(VN.lookup(*I));
Owen Anderson56533222007-07-03 23:51:19 +00001104 varValid &= !dependsOnInvoke(*I);
1105 }
1106
1107 if (!ptrValid || !varValid) {
1108 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001109 set.reset(VN.lookup(U));
Owen Anderson56533222007-07-03 23:51:19 +00001110 }
Owen Andersona724ac12007-06-03 05:55:58 +00001111 }
Owen Andersonea12a062007-05-29 21:53:49 +00001112 }
1113}
1114
Owen Anderson9cb56012007-06-21 00:19:05 +00001115/// topo_sort - Given a set of values, sort them by topological
1116/// order into the provided vector.
Owen Anderson19bc4a82007-07-19 06:37:56 +00001117void GVNPRE::topo_sort(ValueNumberedSet& set, SmallVector<Value*, 8>& vec) {
Owen Andersona20f35d2007-06-28 00:34:34 +00001118 SmallPtrSet<Value*, 16> visited;
Owen Anderson19bc4a82007-07-19 06:37:56 +00001119 SmallVector<Value*, 8> stack;
Owen Anderson0616dff2007-07-09 06:50:06 +00001120 for (ValueNumberedSet::iterator I = set.begin(), E = set.end();
Owen Anderson64758042007-06-22 21:31:16 +00001121 I != E; ++I) {
1122 if (visited.count(*I) == 0)
1123 stack.push_back(*I);
1124
1125 while (!stack.empty()) {
1126 Value* e = stack.back();
Owen Anderson216394f2007-07-03 18:37:08 +00001127
1128 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001129 if (CastInst* U = dyn_cast<CastInst>(e)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001130 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1131
1132 if (l != 0 && isa<Instruction>(l) &&
1133 visited.count(l) == 0)
1134 stack.push_back(l);
1135 else {
1136 vec.push_back(e);
1137 visited.insert(e);
1138 stack.pop_back();
1139 }
1140
Owen Anderson7b317d22007-06-27 17:03:03 +00001141 // Handle binary ops
Owen Anderson216394f2007-07-03 18:37:08 +00001142 } else if (isa<BinaryOperator>(e) || isa<CmpInst>(e) ||
Owen Anderson7b317d22007-06-27 17:03:03 +00001143 isa<ExtractElementInst>(e)) {
1144 User* U = cast<User>(e);
1145 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1146 Value* r = find_leader(set, VN.lookup(U->getOperand(1)));
Owen Anderson64758042007-06-22 21:31:16 +00001147
1148 if (l != 0 && isa<Instruction>(l) &&
1149 visited.count(l) == 0)
1150 stack.push_back(l);
1151 else if (r != 0 && isa<Instruction>(r) &&
1152 visited.count(r) == 0)
1153 stack.push_back(r);
1154 else {
1155 vec.push_back(e);
1156 visited.insert(e);
1157 stack.pop_back();
1158 }
Owen Andersona724ac12007-06-03 05:55:58 +00001159
Owen Anderson7b317d22007-06-27 17:03:03 +00001160 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001161 } else if (isa<InsertElementInst>(e) || isa<ShuffleVectorInst>(e) ||
1162 isa<SelectInst>(e)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001163 User* U = cast<User>(e);
1164 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1165 Value* r = find_leader(set, VN.lookup(U->getOperand(1)));
1166 Value* m = find_leader(set, VN.lookup(U->getOperand(2)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001167
1168 if (l != 0 && isa<Instruction>(l) &&
1169 visited.count(l) == 0)
1170 stack.push_back(l);
1171 else if (r != 0 && isa<Instruction>(r) &&
1172 visited.count(r) == 0)
1173 stack.push_back(r);
1174 else if (m != 0 && isa<Instruction>(m) &&
1175 visited.count(m) == 0)
Owen Andersondf30b632007-07-04 18:26:18 +00001176 stack.push_back(m);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001177 else {
1178 vec.push_back(e);
1179 visited.insert(e);
1180 stack.pop_back();
1181 }
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001182
Owen Anderson56533222007-07-03 23:51:19 +00001183 // Handle vararg ops
1184 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(e)) {
1185 Value* p = find_leader(set, VN.lookup(U->getPointerOperand()));
1186
1187 if (p != 0 && isa<Instruction>(p) &&
1188 visited.count(p) == 0)
1189 stack.push_back(p);
1190 else {
1191 bool push_va = false;
1192 for (GetElementPtrInst::op_iterator I = U->idx_begin(),
1193 E = U->idx_end(); I != E; ++I) {
1194 Value * v = find_leader(set, VN.lookup(*I));
1195 if (v != 0 && isa<Instruction>(v) && visited.count(v) == 0) {
1196 stack.push_back(v);
1197 push_va = true;
1198 }
1199 }
1200
1201 if (!push_va) {
1202 vec.push_back(e);
1203 visited.insert(e);
1204 stack.pop_back();
1205 }
1206 }
1207
Owen Anderson7b317d22007-06-27 17:03:03 +00001208 // Handle opaque ops
Owen Anderson64758042007-06-22 21:31:16 +00001209 } else {
Owen Andersona724ac12007-06-03 05:55:58 +00001210 visited.insert(e);
Owen Anderson139fe842007-06-09 18:35:31 +00001211 vec.push_back(e);
Owen Anderson64758042007-06-22 21:31:16 +00001212 stack.pop_back();
Owen Anderson139fe842007-06-09 18:35:31 +00001213 }
Owen Anderson243f3482007-05-31 22:44:11 +00001214 }
Owen Anderson64758042007-06-22 21:31:16 +00001215
1216 stack.clear();
Owen Anderson243f3482007-05-31 22:44:11 +00001217 }
1218}
1219
Owen Anderson9cb56012007-06-21 00:19:05 +00001220/// dump - Dump a set of values to standard error
Owen Anderson0616dff2007-07-09 06:50:06 +00001221void GVNPRE::dump(ValueNumberedSet& s) const {
Owen Andersoncdf8efd2007-05-29 23:15:21 +00001222 DOUT << "{ ";
Owen Anderson0616dff2007-07-09 06:50:06 +00001223 for (ValueNumberedSet::iterator I = s.begin(), E = s.end();
Owen Anderson0fa6b372007-06-03 22:02:14 +00001224 I != E; ++I) {
Owen Anderson890e1a02007-06-28 23:51:21 +00001225 DOUT << "" << VN.lookup(*I) << ": ";
Owen Anderson0fa6b372007-06-03 22:02:14 +00001226 DEBUG((*I)->dump());
1227 }
1228 DOUT << "}\n\n";
1229}
1230
Owen Anderson9cb56012007-06-21 00:19:05 +00001231/// elimination - Phase 3 of the main algorithm. Perform full redundancy
1232/// elimination by walking the dominator tree and removing any instruction that
1233/// is dominated by another instruction with the same value number.
Owen Anderson3eaca712007-06-20 22:10:02 +00001234bool GVNPRE::elimination() {
Owen Anderson3eaca712007-06-20 22:10:02 +00001235 bool changed_function = false;
1236
Owen Anderson19bc4a82007-07-19 06:37:56 +00001237 SmallVector<std::pair<Instruction*, Value*>, 8> replace;
1238 SmallVector<Instruction*, 8> erase;
Owen Anderson239e7122007-06-12 16:57:50 +00001239
1240 DominatorTree& DT = getAnalysis<DominatorTree>();
1241
1242 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
1243 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1244 BasicBlock* BB = DI->getBlock();
1245
Owen Anderson239e7122007-06-12 16:57:50 +00001246 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1247 BI != BE; ++BI) {
1248
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001249 if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI) ||
1250 isa<ShuffleVectorInst>(BI) || isa<InsertElementInst>(BI) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001251 isa<ExtractElementInst>(BI) || isa<SelectInst>(BI) ||
Owen Anderson56533222007-07-03 23:51:19 +00001252 isa<CastInst>(BI) || isa<GetElementPtrInst>(BI)) {
Owen Andersona05a81b2007-07-10 00:09:25 +00001253
Owen Anderson9fed5892007-08-02 18:20:52 +00001254 if (availableOut[BB].test(VN.lookup(BI)) &&
1255 !availableOut[BB].count(BI)) {
Owen Andersona05a81b2007-07-10 00:09:25 +00001256 Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
Owen Anderson239e7122007-06-12 16:57:50 +00001257 if (Instruction* Instr = dyn_cast<Instruction>(leader))
1258 if (Instr->getParent() != 0 && Instr != BI) {
1259 replace.push_back(std::make_pair(BI, leader));
1260 erase.push_back(BI);
1261 ++NumEliminated;
1262 }
Owen Andersona05a81b2007-07-10 00:09:25 +00001263 }
Owen Anderson239e7122007-06-12 16:57:50 +00001264 }
1265 }
1266 }
1267
1268 while (!replace.empty()) {
1269 std::pair<Instruction*, Value*> rep = replace.back();
1270 replace.pop_back();
1271 rep.first->replaceAllUsesWith(rep.second);
Owen Anderson0304b2b2007-06-20 18:30:20 +00001272 changed_function = true;
Owen Anderson239e7122007-06-12 16:57:50 +00001273 }
1274
Owen Anderson9fed5892007-08-02 18:20:52 +00001275 for (SmallVector<Instruction*, 8>::iterator I = erase.begin(),
1276 E = erase.end(); I != E; ++I)
Owen Anderson239e7122007-06-12 16:57:50 +00001277 (*I)->eraseFromParent();
Owen Anderson3eaca712007-06-20 22:10:02 +00001278
1279 return changed_function;
Owen Anderson239e7122007-06-12 16:57:50 +00001280}
1281
Owen Anderson9cb56012007-06-21 00:19:05 +00001282/// cleanup - Delete any extraneous values that were created to represent
1283/// expressions without leaders.
Owen Anderson239e7122007-06-12 16:57:50 +00001284void GVNPRE::cleanup() {
1285 while (!createdExpressions.empty()) {
1286 Instruction* I = createdExpressions.back();
1287 createdExpressions.pop_back();
1288
1289 delete I;
1290 }
1291}
1292
Owen Anderson9cb56012007-06-21 00:19:05 +00001293/// buildsets_availout - When calculating availability, handle an instruction
1294/// by inserting it into the appropriate sets
Owen Anderson3eaca712007-06-20 22:10:02 +00001295void GVNPRE::buildsets_availout(BasicBlock::iterator I,
Owen Anderson0616dff2007-07-09 06:50:06 +00001296 ValueNumberedSet& currAvail,
1297 ValueNumberedSet& currPhis,
1298 ValueNumberedSet& currExps,
1299 SmallPtrSet<Value*, 16>& currTemps) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001300 // Handle PHI nodes
Owen Anderson3eaca712007-06-20 22:10:02 +00001301 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001302 unsigned num = VN.lookup_or_add(p);
Owen Anderson12408462007-06-22 03:14:03 +00001303
Owen Anderson3eaca712007-06-20 22:10:02 +00001304 currPhis.insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001305 currPhis.set(num);
Owen Anderson216394f2007-07-03 18:37:08 +00001306
1307 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001308 } else if (CastInst* U = dyn_cast<CastInst>(I)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001309 Value* leftValue = U->getOperand(0);
Owen Anderson3eaca712007-06-20 22:10:02 +00001310
Owen Anderson216394f2007-07-03 18:37:08 +00001311 unsigned num = VN.lookup_or_add(U);
Owen Anderson216394f2007-07-03 18:37:08 +00001312
1313 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001314 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson216394f2007-07-03 18:37:08 +00001315 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001316 currExps.set(VN.lookup(leftValue));
Owen Anderson216394f2007-07-03 18:37:08 +00001317 }
1318
Owen Anderson0616dff2007-07-09 06:50:06 +00001319 if (!currExps.test(num)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001320 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001321 currExps.set(num);
Owen Anderson216394f2007-07-03 18:37:08 +00001322 }
1323
Owen Anderson7b317d22007-06-27 17:03:03 +00001324 // Handle binary ops
1325 } else if (isa<BinaryOperator>(I) || isa<CmpInst>(I) ||
1326 isa<ExtractElementInst>(I)) {
1327 User* U = cast<User>(I);
1328 Value* leftValue = U->getOperand(0);
1329 Value* rightValue = U->getOperand(1);
Owen Anderson3eaca712007-06-20 22:10:02 +00001330
Owen Anderson7b317d22007-06-27 17:03:03 +00001331 unsigned num = VN.lookup_or_add(U);
Owen Anderson3eaca712007-06-20 22:10:02 +00001332
1333 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001334 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson12408462007-06-22 03:14:03 +00001335 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001336 currExps.set(VN.lookup(leftValue));
Owen Anderson12408462007-06-22 03:14:03 +00001337 }
1338
Owen Anderson3eaca712007-06-20 22:10:02 +00001339 if (isa<Instruction>(rightValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001340 if (!currExps.test(VN.lookup(rightValue))) {
Owen Anderson12408462007-06-22 03:14:03 +00001341 currExps.insert(rightValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001342 currExps.set(VN.lookup(rightValue));
Owen Anderson12408462007-06-22 03:14:03 +00001343 }
1344
Owen Anderson0616dff2007-07-09 06:50:06 +00001345 if (!currExps.test(num)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001346 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001347 currExps.set(num);
Owen Anderson12408462007-06-22 03:14:03 +00001348 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001349
Owen Anderson7b317d22007-06-27 17:03:03 +00001350 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001351 } else if (isa<InsertElementInst>(I) || isa<ShuffleVectorInst>(I) ||
1352 isa<SelectInst>(I)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001353 User* U = cast<User>(I);
1354 Value* leftValue = U->getOperand(0);
1355 Value* rightValue = U->getOperand(1);
1356 Value* thirdValue = U->getOperand(2);
Owen Anderson3eaca712007-06-20 22:10:02 +00001357
Owen Anderson7b317d22007-06-27 17:03:03 +00001358 VN.lookup_or_add(U);
Owen Anderson12408462007-06-22 03:14:03 +00001359
Owen Anderson7b317d22007-06-27 17:03:03 +00001360 unsigned num = VN.lookup_or_add(U);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001361
1362 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001363 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001364 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001365 currExps.set(VN.lookup(leftValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001366 }
1367 if (isa<Instruction>(rightValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001368 if (!currExps.test(VN.lookup(rightValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001369 currExps.insert(rightValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001370 currExps.set(VN.lookup(rightValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001371 }
1372 if (isa<Instruction>(thirdValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001373 if (!currExps.test(VN.lookup(thirdValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001374 currExps.insert(thirdValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001375 currExps.set(VN.lookup(thirdValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001376 }
1377
Owen Anderson0616dff2007-07-09 06:50:06 +00001378 if (!currExps.test(num)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001379 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001380 currExps.set(num);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001381 }
1382
Owen Anderson56533222007-07-03 23:51:19 +00001383 // Handle vararg ops
1384 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(I)) {
1385 Value* ptrValue = U->getPointerOperand();
1386
1387 VN.lookup_or_add(U);
1388
1389 unsigned num = VN.lookup_or_add(U);
Owen Anderson56533222007-07-03 23:51:19 +00001390
1391 if (isa<Instruction>(ptrValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001392 if (!currExps.test(VN.lookup(ptrValue))) {
Owen Anderson56533222007-07-03 23:51:19 +00001393 currExps.insert(ptrValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001394 currExps.set(VN.lookup(ptrValue));
Owen Anderson56533222007-07-03 23:51:19 +00001395 }
1396
1397 for (GetElementPtrInst::op_iterator OI = U->idx_begin(), OE = U->idx_end();
1398 OI != OE; ++OI)
Owen Anderson0616dff2007-07-09 06:50:06 +00001399 if (isa<Instruction>(*OI) && !currExps.test(VN.lookup(*OI))) {
Owen Anderson56533222007-07-03 23:51:19 +00001400 currExps.insert(*OI);
Owen Anderson0616dff2007-07-09 06:50:06 +00001401 currExps.set(VN.lookup(*OI));
Owen Anderson56533222007-07-03 23:51:19 +00001402 }
1403
Owen Anderson0616dff2007-07-09 06:50:06 +00001404 if (!currExps.test(VN.lookup(U))) {
Owen Anderson56533222007-07-03 23:51:19 +00001405 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001406 currExps.set(num);
Owen Anderson56533222007-07-03 23:51:19 +00001407 }
1408
Owen Anderson7b317d22007-06-27 17:03:03 +00001409 // Handle opaque ops
1410 } else if (!I->isTerminator()){
Owen Anderson3eaca712007-06-20 22:10:02 +00001411 VN.lookup_or_add(I);
Owen Anderson12408462007-06-22 03:14:03 +00001412
Owen Anderson3eaca712007-06-20 22:10:02 +00001413 currTemps.insert(I);
1414 }
1415
1416 if (!I->isTerminator())
Owen Anderson0616dff2007-07-09 06:50:06 +00001417 if (!currAvail.test(VN.lookup(I))) {
Owen Anderson12408462007-06-22 03:14:03 +00001418 currAvail.insert(I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001419 currAvail.set(VN.lookup(I));
Owen Anderson12408462007-06-22 03:14:03 +00001420 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001421}
Owen Andersonea12a062007-05-29 21:53:49 +00001422
Owen Anderson9cb56012007-06-21 00:19:05 +00001423/// buildsets_anticout - When walking the postdom tree, calculate the ANTIC_OUT
1424/// set as a function of the ANTIC_IN set of the block's predecessors
Owen Anderson82575d82007-06-22 00:20:30 +00001425bool GVNPRE::buildsets_anticout(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +00001426 ValueNumberedSet& anticOut,
Owen Andersonb9781982007-07-19 03:32:44 +00001427 SmallPtrSet<BasicBlock*, 8>& visited) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001428 if (BB->getTerminator()->getNumSuccessors() == 1) {
Owen Andersonf62c44a2007-06-25 05:41:12 +00001429 if (BB->getTerminator()->getSuccessor(0) != BB &&
1430 visited.count(BB->getTerminator()->getSuccessor(0)) == 0) {
Owen Anderson82575d82007-06-22 00:20:30 +00001431 return true;
Owen Andersonf62c44a2007-06-25 05:41:12 +00001432 }
1433 else {
Owen Anderson3eaca712007-06-20 22:10:02 +00001434 phi_translate_set(anticipatedIn[BB->getTerminator()->getSuccessor(0)],
1435 BB, BB->getTerminator()->getSuccessor(0), anticOut);
Owen Andersonf62c44a2007-06-25 05:41:12 +00001436 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001437 } else if (BB->getTerminator()->getNumSuccessors() > 1) {
1438 BasicBlock* first = BB->getTerminator()->getSuccessor(0);
Owen Anderson0616dff2007-07-09 06:50:06 +00001439 for (ValueNumberedSet::iterator I = anticipatedIn[first].begin(),
1440 E = anticipatedIn[first].end(); I != E; ++I) {
1441 anticOut.insert(*I);
1442 anticOut.set(VN.lookup(*I));
1443 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001444
1445 for (unsigned i = 1; i < BB->getTerminator()->getNumSuccessors(); ++i) {
1446 BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
Owen Anderson0616dff2007-07-09 06:50:06 +00001447 ValueNumberedSet& succAnticIn = anticipatedIn[currSucc];
Owen Anderson3eaca712007-06-20 22:10:02 +00001448
Owen Anderson19bc4a82007-07-19 06:37:56 +00001449 SmallVector<Value*, 16> temp;
Owen Anderson66fd9062007-06-21 17:57:53 +00001450
Owen Anderson0616dff2007-07-09 06:50:06 +00001451 for (ValueNumberedSet::iterator I = anticOut.begin(),
Owen Anderson66fd9062007-06-21 17:57:53 +00001452 E = anticOut.end(); I != E; ++I)
Owen Anderson0616dff2007-07-09 06:50:06 +00001453 if (!succAnticIn.test(VN.lookup(*I)))
Owen Anderson66fd9062007-06-21 17:57:53 +00001454 temp.push_back(*I);
1455
Owen Anderson19bc4a82007-07-19 06:37:56 +00001456 for (SmallVector<Value*, 16>::iterator I = temp.begin(), E = temp.end();
Owen Anderson0616dff2007-07-09 06:50:06 +00001457 I != E; ++I) {
Owen Anderson66fd9062007-06-21 17:57:53 +00001458 anticOut.erase(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001459 anticOut.reset(VN.lookup(*I));
1460 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001461 }
1462 }
Owen Anderson82575d82007-06-22 00:20:30 +00001463
1464 return false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001465}
1466
Owen Anderson9cb56012007-06-21 00:19:05 +00001467/// buildsets_anticin - Walk the postdom tree, calculating ANTIC_OUT for
1468/// each block. ANTIC_IN is then a function of ANTIC_OUT and the GEN
1469/// sets populated in buildsets_availout
Owen Anderson82575d82007-06-22 00:20:30 +00001470unsigned GVNPRE::buildsets_anticin(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +00001471 ValueNumberedSet& anticOut,
1472 ValueNumberedSet& currExps,
Owen Andersona20f35d2007-06-28 00:34:34 +00001473 SmallPtrSet<Value*, 16>& currTemps,
Owen Andersonb9781982007-07-19 03:32:44 +00001474 SmallPtrSet<BasicBlock*, 8>& visited) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001475 ValueNumberedSet& anticIn = anticipatedIn[BB];
Owen Anderson2106f612007-06-22 18:27:04 +00001476 unsigned old = anticIn.size();
Owen Anderson3eaca712007-06-20 22:10:02 +00001477
Owen Anderson82575d82007-06-22 00:20:30 +00001478 bool defer = buildsets_anticout(BB, anticOut, visited);
1479 if (defer)
1480 return 0;
Owen Anderson66fd9062007-06-21 17:57:53 +00001481
Owen Anderson3eaca712007-06-20 22:10:02 +00001482 anticIn.clear();
Owen Anderson66fd9062007-06-21 17:57:53 +00001483
Owen Anderson0616dff2007-07-09 06:50:06 +00001484 for (ValueNumberedSet::iterator I = anticOut.begin(),
Owen Anderson2106f612007-06-22 18:27:04 +00001485 E = anticOut.end(); I != E; ++I) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001486 anticIn.insert(*I);
1487 anticIn.set(VN.lookup(*I));
Owen Anderson3eaca712007-06-20 22:10:02 +00001488 }
Owen Anderson0616dff2007-07-09 06:50:06 +00001489 for (ValueNumberedSet::iterator I = currExps.begin(),
Owen Anderson2106f612007-06-22 18:27:04 +00001490 E = currExps.end(); I != E; ++I) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001491 if (!anticIn.test(VN.lookup(*I))) {
Owen Anderson2106f612007-06-22 18:27:04 +00001492 anticIn.insert(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001493 anticIn.set(VN.lookup(*I));
Owen Anderson2106f612007-06-22 18:27:04 +00001494 }
1495 }
1496
Owen Andersona20f35d2007-06-28 00:34:34 +00001497 for (SmallPtrSet<Value*, 16>::iterator I = currTemps.begin(),
Owen Anderson68cb52e2007-06-27 17:38:29 +00001498 E = currTemps.end(); I != E; ++I) {
Owen Anderson2106f612007-06-22 18:27:04 +00001499 anticIn.erase(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001500 anticIn.reset(VN.lookup(*I));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001501 }
Owen Anderson2106f612007-06-22 18:27:04 +00001502
Owen Anderson0616dff2007-07-09 06:50:06 +00001503 clean(anticIn);
Owen Anderson68cb52e2007-06-27 17:38:29 +00001504 anticOut.clear();
Owen Anderson3eaca712007-06-20 22:10:02 +00001505
Owen Anderson68cb52e2007-06-27 17:38:29 +00001506 if (old != anticIn.size())
Owen Anderson82575d82007-06-22 00:20:30 +00001507 return 2;
Owen Anderson68cb52e2007-06-27 17:38:29 +00001508 else
Owen Anderson82575d82007-06-22 00:20:30 +00001509 return 1;
Owen Anderson3eaca712007-06-20 22:10:02 +00001510}
1511
Owen Anderson9cb56012007-06-21 00:19:05 +00001512/// buildsets - Phase 1 of the main algorithm. Construct the AVAIL_OUT
1513/// and the ANTIC_IN sets.
Owen Anderson6032a5b2007-06-26 23:29:41 +00001514void GVNPRE::buildsets(Function& F) {
Owen Andersonb9781982007-07-19 03:32:44 +00001515 DenseMap<BasicBlock*, ValueNumberedSet> generatedExpressions;
1516 DenseMap<BasicBlock*, SmallPtrSet<Value*, 16> > generatedTemporaries;
Owen Anderson3eaca712007-06-20 22:10:02 +00001517
Owen Andersonea12a062007-05-29 21:53:49 +00001518 DominatorTree &DT = getAnalysis<DominatorTree>();
1519
Owen Anderson12112af2007-06-06 01:27:49 +00001520 // Phase 1, Part 1: calculate AVAIL_OUT
Owen Andersonea12a062007-05-29 21:53:49 +00001521
1522 // Top-down walk of the dominator tree
Devang Patel26042422007-06-04 00:32:22 +00001523 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
Owen Andersonea12a062007-05-29 21:53:49 +00001524 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1525
1526 // Get the sets to update for this block
Owen Anderson0616dff2007-07-09 06:50:06 +00001527 ValueNumberedSet& currExps = generatedExpressions[DI->getBlock()];
1528 ValueNumberedSet& currPhis = generatedPhis[DI->getBlock()];
Owen Andersona20f35d2007-06-28 00:34:34 +00001529 SmallPtrSet<Value*, 16>& currTemps = generatedTemporaries[DI->getBlock()];
Owen Anderson0616dff2007-07-09 06:50:06 +00001530 ValueNumberedSet& currAvail = availableOut[DI->getBlock()];
Owen Andersonea12a062007-05-29 21:53:49 +00001531
Owen Anderson086f5f32007-06-19 03:31:41 +00001532 BasicBlock* BB = DI->getBlock();
1533
1534 // A block inherits AVAIL_OUT from its dominator
Owen Andersondfa24352007-07-09 22:29:50 +00001535 if (DI->getIDom() != 0)
1536 currAvail = availableOut[DI->getIDom()->getBlock()];
Owen Anderson0616dff2007-07-09 06:50:06 +00001537
Owen Anderson086f5f32007-06-19 03:31:41 +00001538 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
Owen Anderson3eaca712007-06-20 22:10:02 +00001539 BI != BE; ++BI)
Owen Anderson12408462007-06-22 03:14:03 +00001540 buildsets_availout(BI, currAvail, currPhis, currExps,
Owen Anderson0616dff2007-07-09 06:50:06 +00001541 currTemps);
Owen Anderson086f5f32007-06-19 03:31:41 +00001542
Owen Andersonea12a062007-05-29 21:53:49 +00001543 }
Owen Andersonf62c44a2007-06-25 05:41:12 +00001544
1545 // Phase 1, Part 2: calculate ANTIC_IN
Owen Andersonea12a062007-05-29 21:53:49 +00001546
Owen Andersonb9781982007-07-19 03:32:44 +00001547 SmallPtrSet<BasicBlock*, 8> visited;
Owen Anderson6032a5b2007-06-26 23:29:41 +00001548 SmallPtrSet<BasicBlock*, 4> block_changed;
1549 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
1550 block_changed.insert(FI);
Owen Andersone3072b22007-05-29 23:26:30 +00001551
Owen Andersonea12a062007-05-29 21:53:49 +00001552 bool changed = true;
1553 unsigned iterations = 0;
Owen Anderson6032a5b2007-06-26 23:29:41 +00001554
Owen Andersonea12a062007-05-29 21:53:49 +00001555 while (changed) {
1556 changed = false;
Owen Anderson0616dff2007-07-09 06:50:06 +00001557 ValueNumberedSet anticOut;
Owen Andersonea12a062007-05-29 21:53:49 +00001558
Owen Anderson6032a5b2007-06-26 23:29:41 +00001559 // Postorder walk of the CFG
Owen Anderson9030d382007-06-25 18:25:31 +00001560 for (po_iterator<BasicBlock*> BBI = po_begin(&F.getEntryBlock()),
1561 BBE = po_end(&F.getEntryBlock()); BBI != BBE; ++BBI) {
Owen Andersonf62c44a2007-06-25 05:41:12 +00001562 BasicBlock* BB = *BBI;
Owen Anderson0e714662007-06-11 16:25:17 +00001563
Owen Anderson6032a5b2007-06-26 23:29:41 +00001564 if (block_changed.count(BB) != 0) {
1565 unsigned ret = buildsets_anticin(BB, anticOut,generatedExpressions[BB],
1566 generatedTemporaries[BB], visited);
Owen Anderson82575d82007-06-22 00:20:30 +00001567
Owen Anderson6032a5b2007-06-26 23:29:41 +00001568 if (ret == 0) {
1569 changed = true;
1570 continue;
1571 } else {
1572 visited.insert(BB);
1573
1574 if (ret == 2)
1575 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1576 PI != PE; ++PI) {
1577 block_changed.insert(*PI);
1578 }
1579 else
1580 block_changed.erase(BB);
1581
1582 changed |= (ret == 2);
Owen Andersonf62c44a2007-06-25 05:41:12 +00001583 }
Owen Anderson82575d82007-06-22 00:20:30 +00001584 }
Owen Andersonea12a062007-05-29 21:53:49 +00001585 }
Owen Anderson5ea069f2007-06-04 18:05:26 +00001586
Owen Andersonea12a062007-05-29 21:53:49 +00001587 iterations++;
1588 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001589}
1590
Owen Anderson9cb56012007-06-21 00:19:05 +00001591/// insertion_pre - When a partial redundancy has been identified, eliminate it
1592/// by inserting appropriate values into the predecessors and a phi node in
1593/// the main block
Owen Anderson3eaca712007-06-20 22:10:02 +00001594void GVNPRE::insertion_pre(Value* e, BasicBlock* BB,
Owen Anderson19bc4a82007-07-19 06:37:56 +00001595 DenseMap<BasicBlock*, Value*>& avail,
Owen Anderson0616dff2007-07-09 06:50:06 +00001596 std::map<BasicBlock*, ValueNumberedSet>& new_sets) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001597 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
1598 Value* e2 = avail[*PI];
Owen Anderson0616dff2007-07-09 06:50:06 +00001599 if (!availableOut[*PI].test(VN.lookup(e2))) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001600 User* U = cast<User>(e2);
1601
1602 Value* s1 = 0;
1603 if (isa<BinaryOperator>(U->getOperand(0)) ||
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001604 isa<CmpInst>(U->getOperand(0)) ||
1605 isa<ShuffleVectorInst>(U->getOperand(0)) ||
1606 isa<ExtractElementInst>(U->getOperand(0)) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001607 isa<InsertElementInst>(U->getOperand(0)) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001608 isa<SelectInst>(U->getOperand(0)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001609 isa<CastInst>(U->getOperand(0)) ||
1610 isa<GetElementPtrInst>(U->getOperand(0)))
Owen Anderson3eaca712007-06-20 22:10:02 +00001611 s1 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(0)));
1612 else
1613 s1 = U->getOperand(0);
1614
1615 Value* s2 = 0;
Owen Anderson216394f2007-07-03 18:37:08 +00001616
1617 if (isa<BinaryOperator>(U) ||
1618 isa<CmpInst>(U) ||
1619 isa<ShuffleVectorInst>(U) ||
1620 isa<ExtractElementInst>(U) ||
1621 isa<InsertElementInst>(U) ||
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001622 isa<SelectInst>(U)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001623 if (isa<BinaryOperator>(U->getOperand(1)) ||
1624 isa<CmpInst>(U->getOperand(1)) ||
1625 isa<ShuffleVectorInst>(U->getOperand(1)) ||
1626 isa<ExtractElementInst>(U->getOperand(1)) ||
1627 isa<InsertElementInst>(U->getOperand(1)) ||
1628 isa<SelectInst>(U->getOperand(1)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001629 isa<CastInst>(U->getOperand(1)) ||
1630 isa<GetElementPtrInst>(U->getOperand(1))) {
Owen Anderson216394f2007-07-03 18:37:08 +00001631 s2 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(1)));
1632 } else {
1633 s2 = U->getOperand(1);
1634 }
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001635 }
Owen Anderson7b317d22007-06-27 17:03:03 +00001636
1637 // Ternary Operators
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001638 Value* s3 = 0;
1639 if (isa<ShuffleVectorInst>(U) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001640 isa<InsertElementInst>(U) ||
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001641 isa<SelectInst>(U)) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001642 if (isa<BinaryOperator>(U->getOperand(2)) ||
1643 isa<CmpInst>(U->getOperand(2)) ||
1644 isa<ShuffleVectorInst>(U->getOperand(2)) ||
1645 isa<ExtractElementInst>(U->getOperand(2)) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001646 isa<InsertElementInst>(U->getOperand(2)) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001647 isa<SelectInst>(U->getOperand(2)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001648 isa<CastInst>(U->getOperand(2)) ||
1649 isa<GetElementPtrInst>(U->getOperand(2))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001650 s3 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(2)));
Owen Anderson216394f2007-07-03 18:37:08 +00001651 } else {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001652 s3 = U->getOperand(2);
Owen Anderson216394f2007-07-03 18:37:08 +00001653 }
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001654 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001655
Owen Anderson56533222007-07-03 23:51:19 +00001656 // Vararg operators
Owen Anderson19bc4a82007-07-19 06:37:56 +00001657 SmallVector<Value*, 4> sVarargs;
Owen Anderson56533222007-07-03 23:51:19 +00001658 if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(U)) {
1659 for (GetElementPtrInst::op_iterator OI = G->idx_begin(),
1660 OE = G->idx_end(); OI != OE; ++OI) {
1661 if (isa<BinaryOperator>(*OI) ||
1662 isa<CmpInst>(*OI) ||
1663 isa<ShuffleVectorInst>(*OI) ||
1664 isa<ExtractElementInst>(*OI) ||
1665 isa<InsertElementInst>(*OI) ||
1666 isa<SelectInst>(*OI) ||
1667 isa<CastInst>(*OI) ||
1668 isa<GetElementPtrInst>(*OI)) {
1669 sVarargs.push_back(find_leader(availableOut[*PI],
1670 VN.lookup(*OI)));
1671 } else {
1672 sVarargs.push_back(*OI);
1673 }
1674 }
1675 }
1676
Owen Anderson3eaca712007-06-20 22:10:02 +00001677 Value* newVal = 0;
1678 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +00001679 newVal = BinaryOperator::Create(BO->getOpcode(), s1, s2,
Owen Anderson3eaca712007-06-20 22:10:02 +00001680 BO->getName()+".gvnpre",
1681 (*PI)->getTerminator());
1682 else if (CmpInst* C = dyn_cast<CmpInst>(U))
Owen Anderson333c4002009-07-09 23:48:35 +00001683 newVal = CmpInst::Create(*Context, C->getOpcode(),
1684 C->getPredicate(), s1, s2,
Owen Anderson3eaca712007-06-20 22:10:02 +00001685 C->getName()+".gvnpre",
1686 (*PI)->getTerminator());
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001687 else if (ShuffleVectorInst* S = dyn_cast<ShuffleVectorInst>(U))
1688 newVal = new ShuffleVectorInst(s1, s2, s3, S->getName()+".gvnpre",
1689 (*PI)->getTerminator());
1690 else if (InsertElementInst* S = dyn_cast<InsertElementInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001691 newVal = InsertElementInst::Create(s1, s2, s3, S->getName()+".gvnpre",
1692 (*PI)->getTerminator());
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001693 else if (ExtractElementInst* S = dyn_cast<ExtractElementInst>(U))
1694 newVal = new ExtractElementInst(s1, s2, S->getName()+".gvnpre",
1695 (*PI)->getTerminator());
Owen Anderson890e1a02007-06-28 23:51:21 +00001696 else if (SelectInst* S = dyn_cast<SelectInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001697 newVal = SelectInst::Create(s1, s2, s3, S->getName()+".gvnpre",
1698 (*PI)->getTerminator());
Owen Anderson216394f2007-07-03 18:37:08 +00001699 else if (CastInst* C = dyn_cast<CastInst>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +00001700 newVal = CastInst::Create(C->getOpcode(), s1, C->getType(),
Owen Anderson216394f2007-07-03 18:37:08 +00001701 C->getName()+".gvnpre",
1702 (*PI)->getTerminator());
Owen Anderson56533222007-07-03 23:51:19 +00001703 else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001704 newVal = GetElementPtrInst::Create(s1, sVarargs.begin(), sVarargs.end(),
1705 G->getName()+".gvnpre",
1706 (*PI)->getTerminator());
1707
Owen Anderson3eaca712007-06-20 22:10:02 +00001708 VN.add(newVal, VN.lookup(U));
1709
Owen Anderson0616dff2007-07-09 06:50:06 +00001710 ValueNumberedSet& predAvail = availableOut[*PI];
Owen Anderson3eaca712007-06-20 22:10:02 +00001711 val_replace(predAvail, newVal);
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001712 val_replace(new_sets[*PI], newVal);
Owen Anderson0616dff2007-07-09 06:50:06 +00001713 predAvail.set(VN.lookup(newVal));
Owen Anderson9cb56012007-06-21 00:19:05 +00001714
Owen Anderson19bc4a82007-07-19 06:37:56 +00001715 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001716 if (av != avail.end())
1717 avail.erase(av);
1718 avail.insert(std::make_pair(*PI, newVal));
1719
1720 ++NumInsertedVals;
1721 }
1722 }
1723
1724 PHINode* p = 0;
1725
1726 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
1727 if (p == 0)
Gabor Greif051a9502008-04-06 20:25:17 +00001728 p = PHINode::Create(avail[*PI]->getType(), "gvnpre-join", BB->begin());
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001729
Owen Anderson3eaca712007-06-20 22:10:02 +00001730 p->addIncoming(avail[*PI], *PI);
1731 }
1732
1733 VN.add(p, VN.lookup(e));
Owen Anderson3eaca712007-06-20 22:10:02 +00001734 val_replace(availableOut[BB], p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001735 availableOut[BB].set(VN.lookup(e));
Owen Andersonec5614b2007-07-06 20:29:43 +00001736 generatedPhis[BB].insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001737 generatedPhis[BB].set(VN.lookup(e));
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001738 new_sets[BB].insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001739 new_sets[BB].set(VN.lookup(e));
Owen Anderson3eaca712007-06-20 22:10:02 +00001740
1741 ++NumInsertedPhis;
1742}
1743
Owen Anderson9cb56012007-06-21 00:19:05 +00001744/// insertion_mergepoint - When walking the dom tree, check at each merge
1745/// block for the possibility of a partial redundancy. If present, eliminate it
Owen Anderson19bc4a82007-07-19 06:37:56 +00001746unsigned GVNPRE::insertion_mergepoint(SmallVector<Value*, 8>& workList,
Owen Anderson82575d82007-06-22 00:20:30 +00001747 df_iterator<DomTreeNode*>& D,
Owen Anderson0616dff2007-07-09 06:50:06 +00001748 std::map<BasicBlock*, ValueNumberedSet >& new_sets) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001749 bool changed_function = false;
1750 bool new_stuff = false;
1751
1752 BasicBlock* BB = D->getBlock();
1753 for (unsigned i = 0; i < workList.size(); ++i) {
1754 Value* e = workList[i];
1755
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001756 if (isa<BinaryOperator>(e) || isa<CmpInst>(e) ||
1757 isa<ExtractElementInst>(e) || isa<InsertElementInst>(e) ||
Owen Anderson56533222007-07-03 23:51:19 +00001758 isa<ShuffleVectorInst>(e) || isa<SelectInst>(e) || isa<CastInst>(e) ||
1759 isa<GetElementPtrInst>(e)) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001760 if (availableOut[D->getIDom()->getBlock()].test(VN.lookup(e)))
Owen Anderson3eaca712007-06-20 22:10:02 +00001761 continue;
1762
Owen Anderson19bc4a82007-07-19 06:37:56 +00001763 DenseMap<BasicBlock*, Value*> avail;
Owen Anderson3eaca712007-06-20 22:10:02 +00001764 bool by_some = false;
Owen Andersonec5614b2007-07-06 20:29:43 +00001765 bool all_same = true;
1766 Value * first_s = 0;
Owen Anderson3eaca712007-06-20 22:10:02 +00001767
1768 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;
1769 ++PI) {
1770 Value *e2 = phi_translate(e, *PI, BB);
1771 Value *e3 = find_leader(availableOut[*PI], VN.lookup(e2));
1772
1773 if (e3 == 0) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001774 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001775 if (av != avail.end())
1776 avail.erase(av);
1777 avail.insert(std::make_pair(*PI, e2));
Owen Andersonec5614b2007-07-06 20:29:43 +00001778 all_same = false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001779 } else {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001780 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001781 if (av != avail.end())
1782 avail.erase(av);
1783 avail.insert(std::make_pair(*PI, e3));
1784
1785 by_some = true;
Owen Andersonec5614b2007-07-06 20:29:43 +00001786 if (first_s == 0)
1787 first_s = e3;
1788 else if (first_s != e3)
1789 all_same = false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001790 }
1791 }
1792
Owen Andersonec5614b2007-07-06 20:29:43 +00001793 if (by_some && !all_same &&
Owen Anderson0616dff2007-07-09 06:50:06 +00001794 !generatedPhis[BB].test(VN.lookup(e))) {
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001795 insertion_pre(e, BB, avail, new_sets);
Owen Anderson3eaca712007-06-20 22:10:02 +00001796
1797 changed_function = true;
1798 new_stuff = true;
1799 }
1800 }
1801 }
1802
1803 unsigned retval = 0;
1804 if (changed_function)
1805 retval += 1;
1806 if (new_stuff)
1807 retval += 2;
1808
1809 return retval;
1810}
1811
Owen Anderson9cb56012007-06-21 00:19:05 +00001812/// insert - Phase 2 of the main algorithm. Walk the dominator tree looking for
1813/// merge points. When one is found, check for a partial redundancy. If one is
1814/// present, eliminate it. Repeat this walk until no changes are made.
Owen Anderson3eaca712007-06-20 22:10:02 +00001815bool GVNPRE::insertion(Function& F) {
1816 bool changed_function = false;
1817
1818 DominatorTree &DT = getAnalysis<DominatorTree>();
Owen Anderson397d4052007-06-08 01:03:01 +00001819
Owen Anderson0616dff2007-07-09 06:50:06 +00001820 std::map<BasicBlock*, ValueNumberedSet> new_sets;
Owen Anderson397d4052007-06-08 01:03:01 +00001821 bool new_stuff = true;
1822 while (new_stuff) {
1823 new_stuff = false;
Owen Anderson397d4052007-06-08 01:03:01 +00001824 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
1825 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1826 BasicBlock* BB = DI->getBlock();
1827
Owen Anderson0e714662007-06-11 16:25:17 +00001828 if (BB == 0)
1829 continue;
1830
Owen Anderson0616dff2007-07-09 06:50:06 +00001831 ValueNumberedSet& availOut = availableOut[BB];
1832 ValueNumberedSet& anticIn = anticipatedIn[BB];
Owen Anderson397d4052007-06-08 01:03:01 +00001833
1834 // Replace leaders with leaders inherited from dominator
1835 if (DI->getIDom() != 0) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001836 ValueNumberedSet& dom_set = new_sets[DI->getIDom()->getBlock()];
1837 for (ValueNumberedSet::iterator I = dom_set.begin(),
Owen Anderson397d4052007-06-08 01:03:01 +00001838 E = dom_set.end(); I != E; ++I) {
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001839 val_replace(new_sets[BB], *I);
Owen Anderson086f5f32007-06-19 03:31:41 +00001840 val_replace(availOut, *I);
Owen Anderson397d4052007-06-08 01:03:01 +00001841 }
1842 }
1843
1844 // If there is more than one predecessor...
1845 if (pred_begin(BB) != pred_end(BB) && ++pred_begin(BB) != pred_end(BB)) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001846 SmallVector<Value*, 8> workList;
Owen Andersone8138ff2007-06-22 00:43:22 +00001847 workList.reserve(anticIn.size());
Owen Anderson397d4052007-06-08 01:03:01 +00001848 topo_sort(anticIn, workList);
1849
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001850 unsigned result = insertion_mergepoint(workList, DI, new_sets);
Owen Anderson3eaca712007-06-20 22:10:02 +00001851 if (result & 1)
1852 changed_function = true;
1853 if (result & 2)
1854 new_stuff = true;
Owen Anderson397d4052007-06-08 01:03:01 +00001855 }
1856 }
Owen Anderson397d4052007-06-08 01:03:01 +00001857 }
Owen Anderson12112af2007-06-06 01:27:49 +00001858
Owen Anderson3eaca712007-06-20 22:10:02 +00001859 return changed_function;
1860}
1861
Owen Anderson9cb56012007-06-21 00:19:05 +00001862// GVNPRE::runOnFunction - This is the main transformation entry point for a
1863// function.
1864//
Owen Anderson3eaca712007-06-20 22:10:02 +00001865bool GVNPRE::runOnFunction(Function &F) {
Owen Anderson9cb56012007-06-21 00:19:05 +00001866 // Clean out global sets from any previous functions
Owen Anderson3eaca712007-06-20 22:10:02 +00001867 VN.clear();
1868 createdExpressions.clear();
1869 availableOut.clear();
1870 anticipatedIn.clear();
Owen Andersonec5614b2007-07-06 20:29:43 +00001871 generatedPhis.clear();
1872
Owen Anderson3eaca712007-06-20 22:10:02 +00001873 bool changed_function = false;
1874
1875 // Phase 1: BuildSets
Owen Anderson9cb56012007-06-21 00:19:05 +00001876 // This phase calculates the AVAIL_OUT and ANTIC_IN sets
Owen Anderson6032a5b2007-06-26 23:29:41 +00001877 buildsets(F);
Owen Anderson3eaca712007-06-20 22:10:02 +00001878
1879 // Phase 2: Insert
Owen Anderson9cb56012007-06-21 00:19:05 +00001880 // This phase inserts values to make partially redundant values
1881 // fully redundant
Owen Anderson3eaca712007-06-20 22:10:02 +00001882 changed_function |= insertion(F);
1883
Owen Anderson12112af2007-06-06 01:27:49 +00001884 // Phase 3: Eliminate
Owen Anderson9cb56012007-06-21 00:19:05 +00001885 // This phase performs trivial full redundancy elimination
Owen Anderson3eaca712007-06-20 22:10:02 +00001886 changed_function |= elimination();
Owen Anderson8338ff52007-06-08 20:44:02 +00001887
Owen Anderson397d4052007-06-08 01:03:01 +00001888 // Phase 4: Cleanup
Owen Anderson9cb56012007-06-21 00:19:05 +00001889 // This phase cleans up values that were created solely
1890 // as leaders for expressions
Owen Anderson239e7122007-06-12 16:57:50 +00001891 cleanup();
Owen Anderson397d4052007-06-08 01:03:01 +00001892
Owen Anderson0304b2b2007-06-20 18:30:20 +00001893 return changed_function;
Owen Andersonea12a062007-05-29 21:53:49 +00001894}