blob: af7e039eb97946cba0025f8c1039767584a96705 [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"
Owen Andersonea12a062007-05-29 21:53:49 +000042#include <algorithm>
Owen Anderson243f3482007-05-31 22:44:11 +000043#include <deque>
Owen Andersonea12a062007-05-29 21:53:49 +000044#include <map>
Owen Andersonea12a062007-05-29 21:53:49 +000045using namespace llvm;
46
Owen Anderson086f5f32007-06-19 03:31:41 +000047//===----------------------------------------------------------------------===//
48// ValueTable Class
49//===----------------------------------------------------------------------===//
50
Dan Gohman844731a2008-05-13 00:00:25 +000051namespace {
52
Owen Anderson9cb56012007-06-21 00:19:05 +000053/// This class holds the mapping between values and value numbers. It is used
54/// as an efficient mechanism to determine the expression-wise equivalence of
55/// two values.
Owen Anderson086f5f32007-06-19 03:31:41 +000056
Owen Andersonfb665412007-07-19 06:13:15 +000057struct Expression {
Dan Gohmanae3a0be2009-06-04 22:49:04 +000058 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
59 UDIV, SDIV, FDIV, UREM, SREM,
Owen Andersonfb665412007-07-19 06:13:15 +000060 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
61 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
62 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
63 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
64 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
65 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
66 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
67 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
68 PTRTOINT, INTTOPTR, BITCAST, GEP, EMPTY,
69 TOMBSTONE };
70
71 ExpressionOpcode opcode;
72 const Type* type;
73 uint32_t firstVN;
74 uint32_t secondVN;
75 uint32_t thirdVN;
76 SmallVector<uint32_t, 4> varargs;
77
78 Expression() { }
Dan Gohman746767b2007-09-24 15:48:49 +000079 explicit Expression(ExpressionOpcode o) : opcode(o) { }
Owen Andersonfb665412007-07-19 06:13:15 +000080
81 bool operator==(const Expression &other) const {
82 if (opcode != other.opcode)
83 return false;
84 else if (opcode == EMPTY || opcode == TOMBSTONE)
85 return true;
86 else if (type != other.type)
87 return false;
88 else if (firstVN != other.firstVN)
89 return false;
90 else if (secondVN != other.secondVN)
91 return false;
92 else if (thirdVN != other.thirdVN)
93 return false;
94 else {
95 if (varargs.size() != other.varargs.size())
96 return false;
97
98 for (size_t i = 0; i < varargs.size(); ++i)
99 if (varargs[i] != other.varargs[i])
100 return false;
101
102 return true;
103 }
104 }
105
106 bool operator!=(const Expression &other) const {
107 if (opcode != other.opcode)
108 return true;
109 else if (opcode == EMPTY || opcode == TOMBSTONE)
110 return false;
111 else if (type != other.type)
112 return true;
113 else if (firstVN != other.firstVN)
114 return true;
115 else if (secondVN != other.secondVN)
116 return true;
117 else if (thirdVN != other.thirdVN)
118 return true;
119 else {
120 if (varargs.size() != other.varargs.size())
121 return true;
122
123 for (size_t i = 0; i < varargs.size(); ++i)
124 if (varargs[i] != other.varargs[i])
125 return true;
126
127 return false;
128 }
129 }
130};
131
Dan Gohman844731a2008-05-13 00:00:25 +0000132}
Owen Andersonfb665412007-07-19 06:13:15 +0000133
Owen Anderson086f5f32007-06-19 03:31:41 +0000134namespace {
135 class VISIBILITY_HIDDEN ValueTable {
Owen Anderson086f5f32007-06-19 03:31:41 +0000136 private:
Owen Anderson4f703ec2007-06-19 23:23:54 +0000137 DenseMap<Value*, uint32_t> valueNumbering;
Owen Andersonfb665412007-07-19 06:13:15 +0000138 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Anderson086f5f32007-06-19 03:31:41 +0000139
Owen Anderson086f5f32007-06-19 03:31:41 +0000140 uint32_t nextValueNumber;
141
142 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
143 Expression::ExpressionOpcode getOpcode(CmpInst* C);
Owen Andersonca6c31c2007-06-29 00:51:03 +0000144 Expression::ExpressionOpcode getOpcode(CastInst* C);
Owen Anderson9cb56012007-06-21 00:19:05 +0000145 Expression create_expression(BinaryOperator* BO);
146 Expression create_expression(CmpInst* C);
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000147 Expression create_expression(ShuffleVectorInst* V);
148 Expression create_expression(ExtractElementInst* C);
149 Expression create_expression(InsertElementInst* V);
Owen Anderson890e1a02007-06-28 23:51:21 +0000150 Expression create_expression(SelectInst* V);
Owen Andersonca6c31c2007-06-29 00:51:03 +0000151 Expression create_expression(CastInst* C);
Owen Andersoneb216862007-07-03 22:50:56 +0000152 Expression create_expression(GetElementPtrInst* G);
Owen Anderson086f5f32007-06-19 03:31:41 +0000153 public:
154 ValueTable() { nextValueNumber = 1; }
155 uint32_t lookup_or_add(Value* V);
Owen Anderson890e1a02007-06-28 23:51:21 +0000156 uint32_t lookup(Value* V) const;
Owen Anderson086f5f32007-06-19 03:31:41 +0000157 void add(Value* V, uint32_t num);
158 void clear();
Owen Anderson20cb51f2007-06-19 05:37:32 +0000159 void erase(Value* v);
Owen Anderson82575d82007-06-22 00:20:30 +0000160 unsigned size();
Owen Anderson086f5f32007-06-19 03:31:41 +0000161 };
162}
163
Owen Andersonfb665412007-07-19 06:13:15 +0000164namespace llvm {
Chris Lattner76c1b972007-09-17 18:34:04 +0000165template <> struct DenseMapInfo<Expression> {
Owen Anderson9fed5892007-08-02 18:20:52 +0000166 static inline Expression getEmptyKey() {
167 return Expression(Expression::EMPTY);
168 }
169
170 static inline Expression getTombstoneKey() {
171 return Expression(Expression::TOMBSTONE);
172 }
Owen Andersonfb665412007-07-19 06:13:15 +0000173
174 static unsigned getHashValue(const Expression e) {
175 unsigned hash = e.opcode;
176
177 hash = e.firstVN + hash * 37;
178 hash = e.secondVN + hash * 37;
179 hash = e.thirdVN + hash * 37;
180
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000181 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
182 (unsigned)((uintptr_t)e.type >> 9)) +
183 hash * 37;
Owen Andersonfb665412007-07-19 06:13:15 +0000184
Owen Anderson9fed5892007-08-02 18:20:52 +0000185 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
186 E = e.varargs.end(); I != E; ++I)
Owen Andersonfb665412007-07-19 06:13:15 +0000187 hash = *I + hash * 37;
188
189 return hash;
190 }
Chris Lattner76c1b972007-09-17 18:34:04 +0000191 static bool isEqual(const Expression &LHS, const Expression &RHS) {
192 return LHS == RHS;
193 }
Owen Andersonfb665412007-07-19 06:13:15 +0000194 static bool isPod() { return true; }
195};
196}
197
Owen Anderson9cb56012007-06-21 00:19:05 +0000198//===----------------------------------------------------------------------===//
199// ValueTable Internal Functions
200//===----------------------------------------------------------------------===//
Owen Andersonfb665412007-07-19 06:13:15 +0000201Expression::ExpressionOpcode
Owen Anderson9cb56012007-06-21 00:19:05 +0000202 ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson086f5f32007-06-19 03:31:41 +0000203 switch(BO->getOpcode()) {
204 case Instruction::Add:
205 return Expression::ADD;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000206 case Instruction::FAdd:
207 return Expression::FADD;
Owen Anderson086f5f32007-06-19 03:31:41 +0000208 case Instruction::Sub:
209 return Expression::SUB;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000210 case Instruction::FSub:
211 return Expression::FSUB;
Owen Anderson086f5f32007-06-19 03:31:41 +0000212 case Instruction::Mul:
213 return Expression::MUL;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000214 case Instruction::FMul:
215 return Expression::FMUL;
Owen Anderson086f5f32007-06-19 03:31:41 +0000216 case Instruction::UDiv:
217 return Expression::UDIV;
218 case Instruction::SDiv:
219 return Expression::SDIV;
220 case Instruction::FDiv:
221 return Expression::FDIV;
222 case Instruction::URem:
223 return Expression::UREM;
224 case Instruction::SRem:
225 return Expression::SREM;
226 case Instruction::FRem:
227 return Expression::FREM;
228 case Instruction::Shl:
229 return Expression::SHL;
230 case Instruction::LShr:
231 return Expression::LSHR;
232 case Instruction::AShr:
233 return Expression::ASHR;
234 case Instruction::And:
235 return Expression::AND;
236 case Instruction::Or:
237 return Expression::OR;
238 case Instruction::Xor:
239 return Expression::XOR;
240
241 // THIS SHOULD NEVER HAPPEN
242 default:
243 assert(0 && "Binary operator with unknown opcode?");
244 return Expression::ADD;
245 }
246}
247
Owen Andersonfb665412007-07-19 06:13:15 +0000248Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Owen Anderson086f5f32007-06-19 03:31:41 +0000249 if (C->getOpcode() == Instruction::ICmp) {
250 switch (C->getPredicate()) {
251 case ICmpInst::ICMP_EQ:
252 return Expression::ICMPEQ;
253 case ICmpInst::ICMP_NE:
254 return Expression::ICMPNE;
255 case ICmpInst::ICMP_UGT:
256 return Expression::ICMPUGT;
257 case ICmpInst::ICMP_UGE:
258 return Expression::ICMPUGE;
259 case ICmpInst::ICMP_ULT:
260 return Expression::ICMPULT;
261 case ICmpInst::ICMP_ULE:
262 return Expression::ICMPULE;
263 case ICmpInst::ICMP_SGT:
264 return Expression::ICMPSGT;
265 case ICmpInst::ICMP_SGE:
266 return Expression::ICMPSGE;
267 case ICmpInst::ICMP_SLT:
268 return Expression::ICMPSLT;
269 case ICmpInst::ICMP_SLE:
270 return Expression::ICMPSLE;
271
272 // THIS SHOULD NEVER HAPPEN
273 default:
274 assert(0 && "Comparison with unknown predicate?");
275 return Expression::ICMPEQ;
276 }
277 } else {
278 switch (C->getPredicate()) {
279 case FCmpInst::FCMP_OEQ:
280 return Expression::FCMPOEQ;
281 case FCmpInst::FCMP_OGT:
282 return Expression::FCMPOGT;
283 case FCmpInst::FCMP_OGE:
284 return Expression::FCMPOGE;
285 case FCmpInst::FCMP_OLT:
286 return Expression::FCMPOLT;
287 case FCmpInst::FCMP_OLE:
288 return Expression::FCMPOLE;
289 case FCmpInst::FCMP_ONE:
290 return Expression::FCMPONE;
291 case FCmpInst::FCMP_ORD:
292 return Expression::FCMPORD;
293 case FCmpInst::FCMP_UNO:
294 return Expression::FCMPUNO;
295 case FCmpInst::FCMP_UEQ:
296 return Expression::FCMPUEQ;
297 case FCmpInst::FCMP_UGT:
298 return Expression::FCMPUGT;
299 case FCmpInst::FCMP_UGE:
300 return Expression::FCMPUGE;
301 case FCmpInst::FCMP_ULT:
302 return Expression::FCMPULT;
303 case FCmpInst::FCMP_ULE:
304 return Expression::FCMPULE;
305 case FCmpInst::FCMP_UNE:
306 return Expression::FCMPUNE;
307
308 // THIS SHOULD NEVER HAPPEN
309 default:
310 assert(0 && "Comparison with unknown predicate?");
311 return Expression::FCMPOEQ;
Owen Anderson139fe842007-06-09 18:35:31 +0000312 }
313 }
Owen Anderson086f5f32007-06-19 03:31:41 +0000314}
315
Owen Andersonfb665412007-07-19 06:13:15 +0000316Expression::ExpressionOpcode
Owen Andersonca6c31c2007-06-29 00:51:03 +0000317 ValueTable::getOpcode(CastInst* C) {
318 switch(C->getOpcode()) {
319 case Instruction::Trunc:
320 return Expression::TRUNC;
321 case Instruction::ZExt:
322 return Expression::ZEXT;
323 case Instruction::SExt:
324 return Expression::SEXT;
325 case Instruction::FPToUI:
326 return Expression::FPTOUI;
327 case Instruction::FPToSI:
328 return Expression::FPTOSI;
329 case Instruction::UIToFP:
330 return Expression::UITOFP;
331 case Instruction::SIToFP:
332 return Expression::SITOFP;
333 case Instruction::FPTrunc:
334 return Expression::FPTRUNC;
335 case Instruction::FPExt:
336 return Expression::FPEXT;
337 case Instruction::PtrToInt:
338 return Expression::PTRTOINT;
339 case Instruction::IntToPtr:
340 return Expression::INTTOPTR;
341 case Instruction::BitCast:
342 return Expression::BITCAST;
343
344 // THIS SHOULD NEVER HAPPEN
345 default:
346 assert(0 && "Cast operator with unknown opcode?");
347 return Expression::BITCAST;
348 }
349}
350
Owen Andersonfb665412007-07-19 06:13:15 +0000351Expression ValueTable::create_expression(BinaryOperator* BO) {
Owen Anderson9cb56012007-06-21 00:19:05 +0000352 Expression e;
353
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000354 e.firstVN = lookup_or_add(BO->getOperand(0));
355 e.secondVN = lookup_or_add(BO->getOperand(1));
356 e.thirdVN = 0;
Owen Anderson40dc00e2007-06-29 00:40:05 +0000357 e.type = BO->getType();
Owen Anderson9cb56012007-06-21 00:19:05 +0000358 e.opcode = getOpcode(BO);
359
Owen Anderson9cb56012007-06-21 00:19:05 +0000360 return e;
361}
362
Owen Andersonfb665412007-07-19 06:13:15 +0000363Expression ValueTable::create_expression(CmpInst* C) {
Owen Anderson9cb56012007-06-21 00:19:05 +0000364 Expression e;
365
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000366 e.firstVN = lookup_or_add(C->getOperand(0));
367 e.secondVN = lookup_or_add(C->getOperand(1));
368 e.thirdVN = 0;
Owen Anderson40dc00e2007-06-29 00:40:05 +0000369 e.type = C->getType();
Owen Anderson9cb56012007-06-21 00:19:05 +0000370 e.opcode = getOpcode(C);
371
Owen Anderson9cb56012007-06-21 00:19:05 +0000372 return e;
373}
374
Owen Andersonfb665412007-07-19 06:13:15 +0000375Expression ValueTable::create_expression(CastInst* C) {
Owen Andersonca6c31c2007-06-29 00:51:03 +0000376 Expression e;
377
378 e.firstVN = lookup_or_add(C->getOperand(0));
379 e.secondVN = 0;
380 e.thirdVN = 0;
381 e.type = C->getType();
382 e.opcode = getOpcode(C);
383
384 return e;
385}
386
Owen Andersonfb665412007-07-19 06:13:15 +0000387Expression ValueTable::create_expression(ShuffleVectorInst* S) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000388 Expression e;
389
390 e.firstVN = lookup_or_add(S->getOperand(0));
391 e.secondVN = lookup_or_add(S->getOperand(1));
392 e.thirdVN = lookup_or_add(S->getOperand(2));
Owen Anderson40dc00e2007-06-29 00:40:05 +0000393 e.type = S->getType();
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000394 e.opcode = Expression::SHUFFLE;
395
396 return e;
397}
398
Owen Andersonfb665412007-07-19 06:13:15 +0000399Expression ValueTable::create_expression(ExtractElementInst* E) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000400 Expression e;
401
402 e.firstVN = lookup_or_add(E->getOperand(0));
403 e.secondVN = lookup_or_add(E->getOperand(1));
404 e.thirdVN = 0;
Owen Anderson40dc00e2007-06-29 00:40:05 +0000405 e.type = E->getType();
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000406 e.opcode = Expression::EXTRACT;
407
408 return e;
409}
410
Owen Andersonfb665412007-07-19 06:13:15 +0000411Expression ValueTable::create_expression(InsertElementInst* I) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000412 Expression e;
413
414 e.firstVN = lookup_or_add(I->getOperand(0));
415 e.secondVN = lookup_or_add(I->getOperand(1));
416 e.thirdVN = lookup_or_add(I->getOperand(2));
Owen Anderson40dc00e2007-06-29 00:40:05 +0000417 e.type = I->getType();
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000418 e.opcode = Expression::INSERT;
419
420 return e;
421}
422
Owen Andersonfb665412007-07-19 06:13:15 +0000423Expression ValueTable::create_expression(SelectInst* I) {
Owen Anderson890e1a02007-06-28 23:51:21 +0000424 Expression e;
425
426 e.firstVN = lookup_or_add(I->getCondition());
427 e.secondVN = lookup_or_add(I->getTrueValue());
428 e.thirdVN = lookup_or_add(I->getFalseValue());
Owen Anderson40dc00e2007-06-29 00:40:05 +0000429 e.type = I->getType();
Owen Anderson890e1a02007-06-28 23:51:21 +0000430 e.opcode = Expression::SELECT;
431
432 return e;
433}
434
Owen Andersonfb665412007-07-19 06:13:15 +0000435Expression ValueTable::create_expression(GetElementPtrInst* G) {
Owen Andersoneb216862007-07-03 22:50:56 +0000436 Expression e;
437
438 e.firstVN = lookup_or_add(G->getPointerOperand());
439 e.secondVN = 0;
440 e.thirdVN = 0;
441 e.type = G->getType();
Owen Andersonc9399be2007-07-20 08:19:20 +0000442 e.opcode = Expression::GEP;
Owen Andersoneb216862007-07-03 22:50:56 +0000443
444 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
445 I != E; ++I)
446 e.varargs.push_back(lookup_or_add(*I));
447
448 return e;
449}
450
Owen Anderson9cb56012007-06-21 00:19:05 +0000451//===----------------------------------------------------------------------===//
452// ValueTable External Functions
453//===----------------------------------------------------------------------===//
454
455/// lookup_or_add - Returns the value number for the specified value, assigning
456/// it a new number if it did not have one before.
Owen Anderson086f5f32007-06-19 03:31:41 +0000457uint32_t ValueTable::lookup_or_add(Value* V) {
Owen Anderson4f703ec2007-06-19 23:23:54 +0000458 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Anderson086f5f32007-06-19 03:31:41 +0000459 if (VI != valueNumbering.end())
460 return VI->second;
Owen Anderson139fe842007-06-09 18:35:31 +0000461
Owen Anderson139fe842007-06-09 18:35:31 +0000462
Owen Anderson086f5f32007-06-19 03:31:41 +0000463 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
464 Expression e = create_expression(BO);
465
Owen Andersonfb665412007-07-19 06:13:15 +0000466 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson086f5f32007-06-19 03:31:41 +0000467 if (EI != expressionNumbering.end()) {
468 valueNumbering.insert(std::make_pair(V, EI->second));
469 return EI->second;
470 } else {
471 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
472 valueNumbering.insert(std::make_pair(V, nextValueNumber));
473
474 return nextValueNumber++;
475 }
476 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
477 Expression e = create_expression(C);
478
Owen Andersonfb665412007-07-19 06:13:15 +0000479 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson086f5f32007-06-19 03:31:41 +0000480 if (EI != expressionNumbering.end()) {
481 valueNumbering.insert(std::make_pair(V, EI->second));
482 return EI->second;
483 } else {
484 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
485 valueNumbering.insert(std::make_pair(V, nextValueNumber));
486
487 return nextValueNumber++;
488 }
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000489 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
490 Expression e = create_expression(U);
491
Owen Andersonfb665412007-07-19 06:13:15 +0000492 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000493 if (EI != expressionNumbering.end()) {
494 valueNumbering.insert(std::make_pair(V, EI->second));
495 return EI->second;
496 } else {
497 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
498 valueNumbering.insert(std::make_pair(V, nextValueNumber));
499
500 return nextValueNumber++;
501 }
502 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
503 Expression e = create_expression(U);
504
Owen Andersonfb665412007-07-19 06:13:15 +0000505 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000506 if (EI != expressionNumbering.end()) {
507 valueNumbering.insert(std::make_pair(V, EI->second));
508 return EI->second;
509 } else {
510 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
511 valueNumbering.insert(std::make_pair(V, nextValueNumber));
512
513 return nextValueNumber++;
514 }
515 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
516 Expression e = create_expression(U);
517
Owen Andersonfb665412007-07-19 06:13:15 +0000518 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000519 if (EI != expressionNumbering.end()) {
520 valueNumbering.insert(std::make_pair(V, EI->second));
521 return EI->second;
522 } else {
523 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
524 valueNumbering.insert(std::make_pair(V, nextValueNumber));
525
526 return nextValueNumber++;
527 }
Owen Anderson890e1a02007-06-28 23:51:21 +0000528 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
529 Expression e = create_expression(U);
530
Owen Andersonfb665412007-07-19 06:13:15 +0000531 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson890e1a02007-06-28 23:51:21 +0000532 if (EI != expressionNumbering.end()) {
533 valueNumbering.insert(std::make_pair(V, EI->second));
534 return EI->second;
535 } else {
536 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
537 valueNumbering.insert(std::make_pair(V, nextValueNumber));
538
539 return nextValueNumber++;
540 }
Owen Andersonca6c31c2007-06-29 00:51:03 +0000541 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
542 Expression e = create_expression(U);
543
Owen Andersonfb665412007-07-19 06:13:15 +0000544 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Andersonca6c31c2007-06-29 00:51:03 +0000545 if (EI != expressionNumbering.end()) {
546 valueNumbering.insert(std::make_pair(V, EI->second));
547 return EI->second;
548 } else {
549 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
550 valueNumbering.insert(std::make_pair(V, nextValueNumber));
551
552 return nextValueNumber++;
553 }
Owen Anderson56533222007-07-03 23:51:19 +0000554 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
555 Expression e = create_expression(U);
556
Owen Andersonfb665412007-07-19 06:13:15 +0000557 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
Owen Anderson56533222007-07-03 23:51:19 +0000558 if (EI != expressionNumbering.end()) {
559 valueNumbering.insert(std::make_pair(V, EI->second));
560 return EI->second;
561 } else {
562 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
563 valueNumbering.insert(std::make_pair(V, nextValueNumber));
564
565 return nextValueNumber++;
566 }
Owen Anderson086f5f32007-06-19 03:31:41 +0000567 } else {
568 valueNumbering.insert(std::make_pair(V, nextValueNumber));
569 return nextValueNumber++;
Owen Andersona724ac12007-06-03 05:55:58 +0000570 }
Owen Anderson086f5f32007-06-19 03:31:41 +0000571}
572
Owen Anderson9cb56012007-06-21 00:19:05 +0000573/// lookup - Returns the value number of the specified value. Fails if
574/// the value has not yet been numbered.
Owen Anderson890e1a02007-06-28 23:51:21 +0000575uint32_t ValueTable::lookup(Value* V) const {
Owen Anderson4f703ec2007-06-19 23:23:54 +0000576 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Anderson086f5f32007-06-19 03:31:41 +0000577 if (VI != valueNumbering.end())
578 return VI->second;
579 else
580 assert(0 && "Value not numbered?");
581
582 return 0;
583}
584
Owen Anderson9cb56012007-06-21 00:19:05 +0000585/// add - Add the specified value with the given value number, removing
586/// its old number, if any
Owen Anderson086f5f32007-06-19 03:31:41 +0000587void ValueTable::add(Value* V, uint32_t num) {
Owen Anderson4f703ec2007-06-19 23:23:54 +0000588 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Owen Anderson086f5f32007-06-19 03:31:41 +0000589 if (VI != valueNumbering.end())
590 valueNumbering.erase(VI);
591 valueNumbering.insert(std::make_pair(V, num));
592}
593
Owen Andersonf62c44a2007-06-25 05:41:12 +0000594/// clear - Remove all entries from the ValueTable
Owen Anderson086f5f32007-06-19 03:31:41 +0000595void ValueTable::clear() {
596 valueNumbering.clear();
597 expressionNumbering.clear();
598 nextValueNumber = 1;
599}
Owen Andersona724ac12007-06-03 05:55:58 +0000600
Owen Andersonf62c44a2007-06-25 05:41:12 +0000601/// erase - Remove a value from the value numbering
Owen Anderson20cb51f2007-06-19 05:37:32 +0000602void ValueTable::erase(Value* V) {
Owen Anderson20cb51f2007-06-19 05:37:32 +0000603 valueNumbering.erase(V);
Owen Anderson20cb51f2007-06-19 05:37:32 +0000604}
605
Owen Anderson82575d82007-06-22 00:20:30 +0000606/// size - Return the number of assigned value numbers
607unsigned ValueTable::size() {
608 // NOTE: zero is never assigned
609 return nextValueNumber;
610}
611
Dan Gohman844731a2008-05-13 00:00:25 +0000612namespace {
613
Owen Anderson9cb56012007-06-21 00:19:05 +0000614//===----------------------------------------------------------------------===//
Owen Andersonab3fd052007-07-09 16:43:55 +0000615// ValueNumberedSet Class
Owen Anderson0616dff2007-07-09 06:50:06 +0000616//===----------------------------------------------------------------------===//
617
618class ValueNumberedSet {
619 private:
620 SmallPtrSet<Value*, 8> contents;
621 BitVector numbers;
622 public:
623 ValueNumberedSet() { numbers.resize(1); }
Owen Anderson81c2a6e2007-07-10 00:27:22 +0000624 ValueNumberedSet(const ValueNumberedSet& other) {
625 numbers = other.numbers;
626 contents = other.contents;
627 }
Owen Anderson0616dff2007-07-09 06:50:06 +0000628
629 typedef SmallPtrSet<Value*, 8>::iterator iterator;
630
631 iterator begin() { return contents.begin(); }
632 iterator end() { return contents.end(); }
633
634 bool insert(Value* v) { return contents.insert(v); }
635 void insert(iterator I, iterator E) { contents.insert(I, E); }
636 void erase(Value* v) { contents.erase(v); }
Owen Andersona05a81b2007-07-10 00:09:25 +0000637 unsigned count(Value* v) { return contents.count(v); }
Owen Anderson0616dff2007-07-09 06:50:06 +0000638 size_t size() { return contents.size(); }
639
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000640 void set(unsigned i) {
Owen Anderson0616dff2007-07-09 06:50:06 +0000641 if (i >= numbers.size())
642 numbers.resize(i+1);
643
644 numbers.set(i);
645 }
646
Owen Andersondfa24352007-07-09 22:29:50 +0000647 void operator=(const ValueNumberedSet& other) {
648 contents = other.contents;
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000649 numbers = other.numbers;
650 }
651
652 void reset(unsigned i) {
Owen Anderson0616dff2007-07-09 06:50:06 +0000653 if (i < numbers.size())
654 numbers.reset(i);
655 }
656
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000657 bool test(unsigned i) {
Owen Anderson0616dff2007-07-09 06:50:06 +0000658 if (i >= numbers.size())
659 return false;
660
661 return numbers.test(i);
662 }
663
664 void clear() {
665 contents.clear();
666 numbers.clear();
667 }
668};
669
Dan Gohman844731a2008-05-13 00:00:25 +0000670}
671
Owen Anderson0616dff2007-07-09 06:50:06 +0000672//===----------------------------------------------------------------------===//
Owen Anderson9cb56012007-06-21 00:19:05 +0000673// GVNPRE Pass
674//===----------------------------------------------------------------------===//
675
Owen Andersonea12a062007-05-29 21:53:49 +0000676namespace {
677
678 class VISIBILITY_HIDDEN GVNPRE : public FunctionPass {
679 bool runOnFunction(Function &F);
680 public:
681 static char ID; // Pass identification, replacement for typeid
Dan Gohmanae73dc12008-09-04 17:05:41 +0000682 GVNPRE() : FunctionPass(&ID) {}
Owen Andersonea12a062007-05-29 21:53:49 +0000683
684 private:
Owen Anderson397d4052007-06-08 01:03:01 +0000685 ValueTable VN;
Owen Anderson19bc4a82007-07-19 06:37:56 +0000686 SmallVector<Instruction*, 8> createdExpressions;
Owen Anderson8214d502007-05-31 00:42:15 +0000687
Owen Anderson81c2a6e2007-07-10 00:27:22 +0000688 DenseMap<BasicBlock*, ValueNumberedSet> availableOut;
689 DenseMap<BasicBlock*, ValueNumberedSet> anticipatedIn;
690 DenseMap<BasicBlock*, ValueNumberedSet> generatedPhis;
Owen Anderson71fcebc2007-06-12 22:43:57 +0000691
Owen Anderson9cb56012007-06-21 00:19:05 +0000692 // This transformation requires dominator postdominator info
Owen Andersonea12a062007-05-29 21:53:49 +0000693 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
694 AU.setPreservesCFG();
Owen Anderson2c194e62007-07-06 18:12:36 +0000695 AU.addRequiredID(BreakCriticalEdgesID);
Owen Anderson2a5c9d82007-07-05 23:11:26 +0000696 AU.addRequired<UnifyFunctionExitNodes>();
Owen Andersonea12a062007-05-29 21:53:49 +0000697 AU.addRequired<DominatorTree>();
Owen Andersonea12a062007-05-29 21:53:49 +0000698 }
699
700 // Helper fuctions
701 // FIXME: eliminate or document these better
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000702 void dump(ValueNumberedSet& s) const ;
703 void clean(ValueNumberedSet& set) ;
704 Value* find_leader(ValueNumberedSet& vals, uint32_t v) ;
705 Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) ;
Owen Anderson0616dff2007-07-09 06:50:06 +0000706 void phi_translate_set(ValueNumberedSet& anticIn, BasicBlock* pred,
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000707 BasicBlock* succ, ValueNumberedSet& out) ;
Owen Andersonea12a062007-05-29 21:53:49 +0000708
Owen Anderson0616dff2007-07-09 06:50:06 +0000709 void topo_sort(ValueNumberedSet& set,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000710 SmallVector<Value*, 8>& vec) ;
Owen Anderson243f3482007-05-31 22:44:11 +0000711
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000712 void cleanup() ;
713 bool elimination() ;
Owen Andersonbbf11972007-06-18 04:42:29 +0000714
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000715 void val_insert(ValueNumberedSet& s, Value* v) ;
716 void val_replace(ValueNumberedSet& s, Value* v) ;
717 bool dependsOnInvoke(Value* V) ;
Owen Anderson3eaca712007-06-20 22:10:02 +0000718 void buildsets_availout(BasicBlock::iterator I,
Owen Anderson0616dff2007-07-09 06:50:06 +0000719 ValueNumberedSet& currAvail,
720 ValueNumberedSet& currPhis,
721 ValueNumberedSet& currExps,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000722 SmallPtrSet<Value*, 16>& currTemps);
Owen Anderson82575d82007-06-22 00:20:30 +0000723 bool buildsets_anticout(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +0000724 ValueNumberedSet& anticOut,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000725 SmallPtrSet<BasicBlock*, 8>& visited);
Owen Anderson82575d82007-06-22 00:20:30 +0000726 unsigned buildsets_anticin(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +0000727 ValueNumberedSet& anticOut,
728 ValueNumberedSet& currExps,
Owen Andersona20f35d2007-06-28 00:34:34 +0000729 SmallPtrSet<Value*, 16>& currTemps,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000730 SmallPtrSet<BasicBlock*, 8>& visited);
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000731 void buildsets(Function& F) ;
Owen Anderson3eaca712007-06-20 22:10:02 +0000732
733 void insertion_pre(Value* e, BasicBlock* BB,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000734 DenseMap<BasicBlock*, Value*>& avail,
735 std::map<BasicBlock*,ValueNumberedSet>& new_set);
736 unsigned insertion_mergepoint(SmallVector<Value*, 8>& workList,
Owen Anderson82575d82007-06-22 00:20:30 +0000737 df_iterator<DomTreeNode*>& D,
Owen Anderson19bc4a82007-07-19 06:37:56 +0000738 std::map<BasicBlock*, ValueNumberedSet>& new_set);
Owen Andersonb9eeb1a2007-07-09 07:56:55 +0000739 bool insertion(Function& F) ;
Owen Andersonea12a062007-05-29 21:53:49 +0000740
741 };
742
743 char GVNPRE::ID = 0;
744
745}
746
Owen Anderson9cb56012007-06-21 00:19:05 +0000747// createGVNPREPass - The public interface to this file...
Owen Andersonea12a062007-05-29 21:53:49 +0000748FunctionPass *llvm::createGVNPREPass() { return new GVNPRE(); }
749
Owen Anderson16a72bb2007-07-10 20:20:19 +0000750static RegisterPass<GVNPRE> X("gvnpre",
Owen Anderson9fed5892007-08-02 18:20:52 +0000751 "Global Value Numbering/Partial Redundancy Elimination");
Owen Andersonea12a062007-05-29 21:53:49 +0000752
Owen Andersonea12a062007-05-29 21:53:49 +0000753
Owen Andersonb8b873c2007-06-08 22:02:36 +0000754STATISTIC(NumInsertedVals, "Number of values inserted");
755STATISTIC(NumInsertedPhis, "Number of PHI nodes inserted");
756STATISTIC(NumEliminated, "Number of redundant instructions eliminated");
757
Owen Anderson9cb56012007-06-21 00:19:05 +0000758/// find_leader - Given a set and a value number, return the first
759/// element of the set with that value number, or 0 if no such element
760/// is present
Owen Anderson0616dff2007-07-09 06:50:06 +0000761Value* GVNPRE::find_leader(ValueNumberedSet& vals, uint32_t v) {
762 if (!vals.test(v))
763 return 0;
764
765 for (ValueNumberedSet::iterator I = vals.begin(), E = vals.end();
Owen Anderson086f5f32007-06-19 03:31:41 +0000766 I != E; ++I)
767 if (v == VN.lookup(*I))
Owen Andersona724ac12007-06-03 05:55:58 +0000768 return *I;
Owen Andersonea12a062007-05-29 21:53:49 +0000769
Owen Anderson5fd507d2007-07-09 23:57:18 +0000770 assert(0 && "No leader found, but present bit is set?");
Owen Andersona724ac12007-06-03 05:55:58 +0000771 return 0;
Owen Andersonea12a062007-05-29 21:53:49 +0000772}
773
Owen Anderson9cb56012007-06-21 00:19:05 +0000774/// val_insert - Insert a value into a set only if there is not a value
775/// with the same value number already in the set
Owen Anderson0616dff2007-07-09 06:50:06 +0000776void GVNPRE::val_insert(ValueNumberedSet& s, Value* v) {
Owen Anderson086f5f32007-06-19 03:31:41 +0000777 uint32_t num = VN.lookup(v);
Owen Anderson0616dff2007-07-09 06:50:06 +0000778 if (!s.test(num))
Owen Anderson086f5f32007-06-19 03:31:41 +0000779 s.insert(v);
780}
781
Owen Anderson9cb56012007-06-21 00:19:05 +0000782/// val_replace - Insert a value into a set, replacing any values already in
783/// the set that have the same value number
Owen Anderson0616dff2007-07-09 06:50:06 +0000784void GVNPRE::val_replace(ValueNumberedSet& s, Value* v) {
Owen Andersonb83e56f2007-07-19 19:57:13 +0000785 if (s.count(v)) return;
786
Owen Anderson086f5f32007-06-19 03:31:41 +0000787 uint32_t num = VN.lookup(v);
788 Value* leader = find_leader(s, num);
Owen Andersondfa24352007-07-09 22:29:50 +0000789 if (leader != 0)
Owen Anderson086f5f32007-06-19 03:31:41 +0000790 s.erase(leader);
Owen Anderson086f5f32007-06-19 03:31:41 +0000791 s.insert(v);
Owen Andersondfa24352007-07-09 22:29:50 +0000792 s.set(num);
Owen Anderson086f5f32007-06-19 03:31:41 +0000793}
794
Owen Anderson9cb56012007-06-21 00:19:05 +0000795/// phi_translate - Given a value, its parent block, and a predecessor of its
796/// parent, translate the value into legal for the predecessor block. This
797/// means translating its operands (and recursively, their operands) through
798/// any phi nodes in the parent into values available in the predecessor
Owen Anderson71fcebc2007-06-12 22:43:57 +0000799Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) {
Owen Anderson5ea069f2007-06-04 18:05:26 +0000800 if (V == 0)
801 return 0;
802
Owen Anderson216394f2007-07-03 18:37:08 +0000803 // Unary Operations
Owen Anderson3d6fac32007-07-03 19:01:42 +0000804 if (CastInst* U = dyn_cast<CastInst>(V)) {
Owen Anderson216394f2007-07-03 18:37:08 +0000805 Value* newOp1 = 0;
806 if (isa<Instruction>(U->getOperand(0)))
807 newOp1 = phi_translate(U->getOperand(0), pred, succ);
808 else
809 newOp1 = U->getOperand(0);
810
811 if (newOp1 == 0)
812 return 0;
813
814 if (newOp1 != U->getOperand(0)) {
815 Instruction* newVal = 0;
816 if (CastInst* C = dyn_cast<CastInst>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +0000817 newVal = CastInst::Create(C->getOpcode(),
Owen Anderson216394f2007-07-03 18:37:08 +0000818 newOp1, C->getType(),
819 C->getName()+".expr");
820
821 uint32_t v = VN.lookup_or_add(newVal);
822
823 Value* leader = find_leader(availableOut[pred], v);
824 if (leader == 0) {
825 createdExpressions.push_back(newVal);
826 return newVal;
827 } else {
828 VN.erase(newVal);
829 delete newVal;
830 return leader;
831 }
832 }
833
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000834 // Binary Operations
Owen Anderson216394f2007-07-03 18:37:08 +0000835 } if (isa<BinaryOperator>(V) || isa<CmpInst>(V) ||
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000836 isa<ExtractElementInst>(V)) {
Owen Andersonf62c44a2007-06-25 05:41:12 +0000837 User* U = cast<User>(V);
838
Owen Anderson086f5f32007-06-19 03:31:41 +0000839 Value* newOp1 = 0;
Owen Andersonf62c44a2007-06-25 05:41:12 +0000840 if (isa<Instruction>(U->getOperand(0)))
841 newOp1 = phi_translate(U->getOperand(0), pred, succ);
Owen Anderson086f5f32007-06-19 03:31:41 +0000842 else
Owen Andersonf62c44a2007-06-25 05:41:12 +0000843 newOp1 = U->getOperand(0);
Owen Anderson086f5f32007-06-19 03:31:41 +0000844
Owen Anderson5ea069f2007-06-04 18:05:26 +0000845 if (newOp1 == 0)
846 return 0;
847
Owen Anderson086f5f32007-06-19 03:31:41 +0000848 Value* newOp2 = 0;
Owen Andersonf62c44a2007-06-25 05:41:12 +0000849 if (isa<Instruction>(U->getOperand(1)))
850 newOp2 = phi_translate(U->getOperand(1), pred, succ);
Owen Anderson086f5f32007-06-19 03:31:41 +0000851 else
Owen Andersonf62c44a2007-06-25 05:41:12 +0000852 newOp2 = U->getOperand(1);
Owen Anderson086f5f32007-06-19 03:31:41 +0000853
Owen Anderson5ea069f2007-06-04 18:05:26 +0000854 if (newOp2 == 0)
855 return 0;
856
Owen Andersonf62c44a2007-06-25 05:41:12 +0000857 if (newOp1 != U->getOperand(0) || newOp2 != U->getOperand(1)) {
858 Instruction* newVal = 0;
859 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +0000860 newVal = BinaryOperator::Create(BO->getOpcode(),
Owen Andersonf62c44a2007-06-25 05:41:12 +0000861 newOp1, newOp2,
862 BO->getName()+".expr");
863 else if (CmpInst* C = dyn_cast<CmpInst>(U))
Owen Anderson333c4002009-07-09 23:48:35 +0000864 newVal = CmpInst::Create(*Context, C->getOpcode(),
Owen Andersonf62c44a2007-06-25 05:41:12 +0000865 C->getPredicate(),
866 newOp1, newOp2,
867 C->getName()+".expr");
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000868 else if (ExtractElementInst* E = dyn_cast<ExtractElementInst>(U))
869 newVal = new ExtractElementInst(newOp1, newOp2, E->getName()+".expr");
Owen Anderson8338ff52007-06-08 20:44:02 +0000870
Owen Anderson086f5f32007-06-19 03:31:41 +0000871 uint32_t v = VN.lookup_or_add(newVal);
Owen Anderson71fcebc2007-06-12 22:43:57 +0000872
Owen Anderson086f5f32007-06-19 03:31:41 +0000873 Value* leader = find_leader(availableOut[pred], v);
Owen Anderson71fcebc2007-06-12 22:43:57 +0000874 if (leader == 0) {
Owen Anderson65d28622007-06-12 00:50:47 +0000875 createdExpressions.push_back(newVal);
Owen Anderson5ea069f2007-06-04 18:05:26 +0000876 return newVal;
Owen Anderson8f862c82007-06-05 22:11:49 +0000877 } else {
Owen Anderson20cb51f2007-06-19 05:37:32 +0000878 VN.erase(newVal);
Owen Anderson8f862c82007-06-05 22:11:49 +0000879 delete newVal;
Owen Anderson71fcebc2007-06-12 22:43:57 +0000880 return leader;
Owen Anderson8f862c82007-06-05 22:11:49 +0000881 }
Owen Anderson5ea069f2007-06-04 18:05:26 +0000882 }
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000883
884 // Ternary Operations
Owen Anderson890e1a02007-06-28 23:51:21 +0000885 } else if (isa<ShuffleVectorInst>(V) || isa<InsertElementInst>(V) ||
886 isa<SelectInst>(V)) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000887 User* U = cast<User>(V);
888
889 Value* newOp1 = 0;
890 if (isa<Instruction>(U->getOperand(0)))
891 newOp1 = phi_translate(U->getOperand(0), pred, succ);
892 else
893 newOp1 = U->getOperand(0);
894
895 if (newOp1 == 0)
896 return 0;
897
898 Value* newOp2 = 0;
899 if (isa<Instruction>(U->getOperand(1)))
900 newOp2 = phi_translate(U->getOperand(1), pred, succ);
901 else
902 newOp2 = U->getOperand(1);
903
904 if (newOp2 == 0)
905 return 0;
906
907 Value* newOp3 = 0;
908 if (isa<Instruction>(U->getOperand(2)))
909 newOp3 = phi_translate(U->getOperand(2), pred, succ);
910 else
911 newOp3 = U->getOperand(2);
912
913 if (newOp3 == 0)
914 return 0;
915
916 if (newOp1 != U->getOperand(0) ||
917 newOp2 != U->getOperand(1) ||
918 newOp3 != U->getOperand(2)) {
919 Instruction* newVal = 0;
920 if (ShuffleVectorInst* S = dyn_cast<ShuffleVectorInst>(U))
921 newVal = new ShuffleVectorInst(newOp1, newOp2, newOp3,
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000922 S->getName() + ".expr");
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000923 else if (InsertElementInst* I = dyn_cast<InsertElementInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +0000924 newVal = InsertElementInst::Create(newOp1, newOp2, newOp3,
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000925 I->getName() + ".expr");
Owen Anderson890e1a02007-06-28 23:51:21 +0000926 else if (SelectInst* I = dyn_cast<SelectInst>(U))
Gabor Greifb1dbcd82008-05-15 10:04:30 +0000927 newVal = SelectInst::Create(newOp1, newOp2, newOp3,
928 I->getName() + ".expr");
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000929
930 uint32_t v = VN.lookup_or_add(newVal);
931
932 Value* leader = find_leader(availableOut[pred], v);
933 if (leader == 0) {
934 createdExpressions.push_back(newVal);
935 return newVal;
936 } else {
937 VN.erase(newVal);
938 delete newVal;
939 return leader;
940 }
941 }
942
Owen Anderson56533222007-07-03 23:51:19 +0000943 // Varargs operators
944 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
945 Value* newOp1 = 0;
946 if (isa<Instruction>(U->getPointerOperand()))
947 newOp1 = phi_translate(U->getPointerOperand(), pred, succ);
948 else
949 newOp1 = U->getPointerOperand();
950
951 if (newOp1 == 0)
952 return 0;
953
954 bool changed_idx = false;
Owen Anderson19bc4a82007-07-19 06:37:56 +0000955 SmallVector<Value*, 4> newIdx;
Owen Anderson56533222007-07-03 23:51:19 +0000956 for (GetElementPtrInst::op_iterator I = U->idx_begin(), E = U->idx_end();
957 I != E; ++I)
958 if (isa<Instruction>(*I)) {
959 Value* newVal = phi_translate(*I, pred, succ);
960 newIdx.push_back(newVal);
961 if (newVal != *I)
962 changed_idx = true;
963 } else {
964 newIdx.push_back(*I);
965 }
966
967 if (newOp1 != U->getPointerOperand() || changed_idx) {
Gabor Greif051a9502008-04-06 20:25:17 +0000968 Instruction* newVal =
969 GetElementPtrInst::Create(newOp1,
970 newIdx.begin(), newIdx.end(),
971 U->getName()+".expr");
Owen Anderson56533222007-07-03 23:51:19 +0000972
973 uint32_t v = VN.lookup_or_add(newVal);
974
975 Value* leader = find_leader(availableOut[pred], v);
976 if (leader == 0) {
977 createdExpressions.push_back(newVal);
978 return newVal;
979 } else {
980 VN.erase(newVal);
981 delete newVal;
982 return leader;
983 }
984 }
985
Owen Anderson62cf8ba2007-06-27 04:10:46 +0000986 // PHI Nodes
Owen Anderson5ea069f2007-06-04 18:05:26 +0000987 } else if (PHINode* P = dyn_cast<PHINode>(V)) {
Owen Anderson65d28622007-06-12 00:50:47 +0000988 if (P->getParent() == succ)
Owen Anderson5ea069f2007-06-04 18:05:26 +0000989 return P->getIncomingValueForBlock(pred);
990 }
991
992 return V;
993}
994
Owen Anderson9cb56012007-06-21 00:19:05 +0000995/// phi_translate_set - Perform phi translation on every element of a set
Owen Anderson0616dff2007-07-09 06:50:06 +0000996void GVNPRE::phi_translate_set(ValueNumberedSet& anticIn,
Owen Anderson65d28622007-06-12 00:50:47 +0000997 BasicBlock* pred, BasicBlock* succ,
Owen Anderson0616dff2007-07-09 06:50:06 +0000998 ValueNumberedSet& out) {
999 for (ValueNumberedSet::iterator I = anticIn.begin(),
Owen Anderson5ea069f2007-06-04 18:05:26 +00001000 E = anticIn.end(); I != E; ++I) {
Owen Anderson71fcebc2007-06-12 22:43:57 +00001001 Value* V = phi_translate(*I, pred, succ);
Owen Anderson0616dff2007-07-09 06:50:06 +00001002 if (V != 0 && !out.test(VN.lookup_or_add(V))) {
Owen Anderson5ea069f2007-06-04 18:05:26 +00001003 out.insert(V);
Owen Anderson0616dff2007-07-09 06:50:06 +00001004 out.set(VN.lookup(V));
1005 }
Owen Andersonea12a062007-05-29 21:53:49 +00001006 }
1007}
1008
Owen Anderson9cb56012007-06-21 00:19:05 +00001009/// dependsOnInvoke - Test if a value has an phi node as an operand, any of
1010/// whose inputs is an invoke instruction. If this is true, we cannot safely
1011/// PRE the instruction or anything that depends on it.
Owen Andersonbbf11972007-06-18 04:42:29 +00001012bool GVNPRE::dependsOnInvoke(Value* V) {
Owen Anderson52471b12007-06-19 23:07:16 +00001013 if (PHINode* p = dyn_cast<PHINode>(V)) {
1014 for (PHINode::op_iterator I = p->op_begin(), E = p->op_end(); I != E; ++I)
1015 if (isa<InvokeInst>(*I))
Owen Andersonbbf11972007-06-18 04:42:29 +00001016 return true;
Owen Anderson52471b12007-06-19 23:07:16 +00001017 return false;
1018 } else {
1019 return false;
Owen Anderson32bc7892007-06-16 00:26:54 +00001020 }
Owen Anderson32bc7892007-06-16 00:26:54 +00001021}
1022
Owen Anderson9cb56012007-06-21 00:19:05 +00001023/// clean - Remove all non-opaque values from the set whose operands are not
1024/// themselves in the set, as well as all values that depend on invokes (see
1025/// above)
Owen Anderson0616dff2007-07-09 06:50:06 +00001026void GVNPRE::clean(ValueNumberedSet& set) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001027 SmallVector<Value*, 8> worklist;
Owen Andersone8138ff2007-06-22 00:43:22 +00001028 worklist.reserve(set.size());
Owen Anderson397d4052007-06-08 01:03:01 +00001029 topo_sort(set, worklist);
Owen Andersonea12a062007-05-29 21:53:49 +00001030
Owen Anderson397d4052007-06-08 01:03:01 +00001031 for (unsigned i = 0; i < worklist.size(); ++i) {
1032 Value* v = worklist[i];
Owen Andersonea12a062007-05-29 21:53:49 +00001033
Owen Anderson216394f2007-07-03 18:37:08 +00001034 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001035 if (CastInst* U = dyn_cast<CastInst>(v)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001036 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001037 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson216394f2007-07-03 18:37:08 +00001038 if (lhsValid)
1039 lhsValid = !dependsOnInvoke(U->getOperand(0));
1040
1041 if (!lhsValid) {
1042 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001043 set.reset(VN.lookup(U));
Owen Anderson216394f2007-07-03 18:37:08 +00001044 }
1045
Owen Anderson7b317d22007-06-27 17:03:03 +00001046 // Handle binary ops
Owen Anderson216394f2007-07-03 18:37:08 +00001047 } else if (isa<BinaryOperator>(v) || isa<CmpInst>(v) ||
Owen Anderson7b317d22007-06-27 17:03:03 +00001048 isa<ExtractElementInst>(v)) {
1049 User* U = cast<User>(v);
1050
1051 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001052 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson60e17442007-06-18 04:30:44 +00001053 if (lhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001054 lhsValid = !dependsOnInvoke(U->getOperand(0));
Owen Andersona724ac12007-06-03 05:55:58 +00001055
Owen Anderson7b317d22007-06-27 17:03:03 +00001056 bool rhsValid = !isa<Instruction>(U->getOperand(1));
Owen Anderson0616dff2007-07-09 06:50:06 +00001057 rhsValid |= set.test(VN.lookup(U->getOperand(1)));
Owen Anderson60e17442007-06-18 04:30:44 +00001058 if (rhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001059 rhsValid = !dependsOnInvoke(U->getOperand(1));
Owen Andersonea12a062007-05-29 21:53:49 +00001060
Owen Anderson68cb52e2007-06-27 17:38:29 +00001061 if (!lhsValid || !rhsValid) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001062 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001063 set.reset(VN.lookup(U));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001064 }
Owen Anderson139fe842007-06-09 18:35:31 +00001065
Owen Anderson7b317d22007-06-27 17:03:03 +00001066 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001067 } else if (isa<ShuffleVectorInst>(v) || isa<InsertElementInst>(v) ||
1068 isa<SelectInst>(v)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001069 User* U = cast<User>(v);
1070
1071 bool lhsValid = !isa<Instruction>(U->getOperand(0));
Owen Anderson0616dff2007-07-09 06:50:06 +00001072 lhsValid |= set.test(VN.lookup(U->getOperand(0)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001073 if (lhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001074 lhsValid = !dependsOnInvoke(U->getOperand(0));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001075
Owen Anderson7b317d22007-06-27 17:03:03 +00001076 bool rhsValid = !isa<Instruction>(U->getOperand(1));
Owen Anderson0616dff2007-07-09 06:50:06 +00001077 rhsValid |= set.test(VN.lookup(U->getOperand(1)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001078 if (rhsValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001079 rhsValid = !dependsOnInvoke(U->getOperand(1));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001080
Owen Anderson7b317d22007-06-27 17:03:03 +00001081 bool thirdValid = !isa<Instruction>(U->getOperand(2));
Owen Anderson0616dff2007-07-09 06:50:06 +00001082 thirdValid |= set.test(VN.lookup(U->getOperand(2)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001083 if (thirdValid)
Owen Anderson7b317d22007-06-27 17:03:03 +00001084 thirdValid = !dependsOnInvoke(U->getOperand(2));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001085
Owen Anderson68cb52e2007-06-27 17:38:29 +00001086 if (!lhsValid || !rhsValid || !thirdValid) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001087 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001088 set.reset(VN.lookup(U));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001089 }
Owen Anderson56533222007-07-03 23:51:19 +00001090
1091 // Handle varargs ops
1092 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(v)) {
1093 bool ptrValid = !isa<Instruction>(U->getPointerOperand());
Owen Anderson0616dff2007-07-09 06:50:06 +00001094 ptrValid |= set.test(VN.lookup(U->getPointerOperand()));
Owen Anderson56533222007-07-03 23:51:19 +00001095 if (ptrValid)
1096 ptrValid = !dependsOnInvoke(U->getPointerOperand());
1097
1098 bool varValid = true;
1099 for (GetElementPtrInst::op_iterator I = U->idx_begin(), E = U->idx_end();
1100 I != E; ++I)
1101 if (varValid) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001102 varValid &= !isa<Instruction>(*I) || set.test(VN.lookup(*I));
Owen Anderson56533222007-07-03 23:51:19 +00001103 varValid &= !dependsOnInvoke(*I);
1104 }
1105
1106 if (!ptrValid || !varValid) {
1107 set.erase(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001108 set.reset(VN.lookup(U));
Owen Anderson56533222007-07-03 23:51:19 +00001109 }
Owen Andersona724ac12007-06-03 05:55:58 +00001110 }
Owen Andersonea12a062007-05-29 21:53:49 +00001111 }
1112}
1113
Owen Anderson9cb56012007-06-21 00:19:05 +00001114/// topo_sort - Given a set of values, sort them by topological
1115/// order into the provided vector.
Owen Anderson19bc4a82007-07-19 06:37:56 +00001116void GVNPRE::topo_sort(ValueNumberedSet& set, SmallVector<Value*, 8>& vec) {
Owen Andersona20f35d2007-06-28 00:34:34 +00001117 SmallPtrSet<Value*, 16> visited;
Owen Anderson19bc4a82007-07-19 06:37:56 +00001118 SmallVector<Value*, 8> stack;
Owen Anderson0616dff2007-07-09 06:50:06 +00001119 for (ValueNumberedSet::iterator I = set.begin(), E = set.end();
Owen Anderson64758042007-06-22 21:31:16 +00001120 I != E; ++I) {
1121 if (visited.count(*I) == 0)
1122 stack.push_back(*I);
1123
1124 while (!stack.empty()) {
1125 Value* e = stack.back();
Owen Anderson216394f2007-07-03 18:37:08 +00001126
1127 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001128 if (CastInst* U = dyn_cast<CastInst>(e)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001129 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1130
1131 if (l != 0 && isa<Instruction>(l) &&
1132 visited.count(l) == 0)
1133 stack.push_back(l);
1134 else {
1135 vec.push_back(e);
1136 visited.insert(e);
1137 stack.pop_back();
1138 }
1139
Owen Anderson7b317d22007-06-27 17:03:03 +00001140 // Handle binary ops
Owen Anderson216394f2007-07-03 18:37:08 +00001141 } else if (isa<BinaryOperator>(e) || isa<CmpInst>(e) ||
Owen Anderson7b317d22007-06-27 17:03:03 +00001142 isa<ExtractElementInst>(e)) {
1143 User* U = cast<User>(e);
1144 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1145 Value* r = find_leader(set, VN.lookup(U->getOperand(1)));
Owen Anderson64758042007-06-22 21:31:16 +00001146
1147 if (l != 0 && isa<Instruction>(l) &&
1148 visited.count(l) == 0)
1149 stack.push_back(l);
1150 else if (r != 0 && isa<Instruction>(r) &&
1151 visited.count(r) == 0)
1152 stack.push_back(r);
1153 else {
1154 vec.push_back(e);
1155 visited.insert(e);
1156 stack.pop_back();
1157 }
Owen Andersona724ac12007-06-03 05:55:58 +00001158
Owen Anderson7b317d22007-06-27 17:03:03 +00001159 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001160 } else if (isa<InsertElementInst>(e) || isa<ShuffleVectorInst>(e) ||
1161 isa<SelectInst>(e)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001162 User* U = cast<User>(e);
1163 Value* l = find_leader(set, VN.lookup(U->getOperand(0)));
1164 Value* r = find_leader(set, VN.lookup(U->getOperand(1)));
1165 Value* m = find_leader(set, VN.lookup(U->getOperand(2)));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001166
1167 if (l != 0 && isa<Instruction>(l) &&
1168 visited.count(l) == 0)
1169 stack.push_back(l);
1170 else if (r != 0 && isa<Instruction>(r) &&
1171 visited.count(r) == 0)
1172 stack.push_back(r);
1173 else if (m != 0 && isa<Instruction>(m) &&
1174 visited.count(m) == 0)
Owen Andersondf30b632007-07-04 18:26:18 +00001175 stack.push_back(m);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001176 else {
1177 vec.push_back(e);
1178 visited.insert(e);
1179 stack.pop_back();
1180 }
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001181
Owen Anderson56533222007-07-03 23:51:19 +00001182 // Handle vararg ops
1183 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(e)) {
1184 Value* p = find_leader(set, VN.lookup(U->getPointerOperand()));
1185
1186 if (p != 0 && isa<Instruction>(p) &&
1187 visited.count(p) == 0)
1188 stack.push_back(p);
1189 else {
1190 bool push_va = false;
1191 for (GetElementPtrInst::op_iterator I = U->idx_begin(),
1192 E = U->idx_end(); I != E; ++I) {
1193 Value * v = find_leader(set, VN.lookup(*I));
1194 if (v != 0 && isa<Instruction>(v) && visited.count(v) == 0) {
1195 stack.push_back(v);
1196 push_va = true;
1197 }
1198 }
1199
1200 if (!push_va) {
1201 vec.push_back(e);
1202 visited.insert(e);
1203 stack.pop_back();
1204 }
1205 }
1206
Owen Anderson7b317d22007-06-27 17:03:03 +00001207 // Handle opaque ops
Owen Anderson64758042007-06-22 21:31:16 +00001208 } else {
Owen Andersona724ac12007-06-03 05:55:58 +00001209 visited.insert(e);
Owen Anderson139fe842007-06-09 18:35:31 +00001210 vec.push_back(e);
Owen Anderson64758042007-06-22 21:31:16 +00001211 stack.pop_back();
Owen Anderson139fe842007-06-09 18:35:31 +00001212 }
Owen Anderson243f3482007-05-31 22:44:11 +00001213 }
Owen Anderson64758042007-06-22 21:31:16 +00001214
1215 stack.clear();
Owen Anderson243f3482007-05-31 22:44:11 +00001216 }
1217}
1218
Owen Anderson9cb56012007-06-21 00:19:05 +00001219/// dump - Dump a set of values to standard error
Owen Anderson0616dff2007-07-09 06:50:06 +00001220void GVNPRE::dump(ValueNumberedSet& s) const {
Owen Andersoncdf8efd2007-05-29 23:15:21 +00001221 DOUT << "{ ";
Owen Anderson0616dff2007-07-09 06:50:06 +00001222 for (ValueNumberedSet::iterator I = s.begin(), E = s.end();
Owen Anderson0fa6b372007-06-03 22:02:14 +00001223 I != E; ++I) {
Owen Anderson890e1a02007-06-28 23:51:21 +00001224 DOUT << "" << VN.lookup(*I) << ": ";
Owen Anderson0fa6b372007-06-03 22:02:14 +00001225 DEBUG((*I)->dump());
1226 }
1227 DOUT << "}\n\n";
1228}
1229
Owen Anderson9cb56012007-06-21 00:19:05 +00001230/// elimination - Phase 3 of the main algorithm. Perform full redundancy
1231/// elimination by walking the dominator tree and removing any instruction that
1232/// is dominated by another instruction with the same value number.
Owen Anderson3eaca712007-06-20 22:10:02 +00001233bool GVNPRE::elimination() {
Owen Anderson3eaca712007-06-20 22:10:02 +00001234 bool changed_function = false;
1235
Owen Anderson19bc4a82007-07-19 06:37:56 +00001236 SmallVector<std::pair<Instruction*, Value*>, 8> replace;
1237 SmallVector<Instruction*, 8> erase;
Owen Anderson239e7122007-06-12 16:57:50 +00001238
1239 DominatorTree& DT = getAnalysis<DominatorTree>();
1240
1241 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
1242 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1243 BasicBlock* BB = DI->getBlock();
1244
Owen Anderson239e7122007-06-12 16:57:50 +00001245 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1246 BI != BE; ++BI) {
1247
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001248 if (isa<BinaryOperator>(BI) || isa<CmpInst>(BI) ||
1249 isa<ShuffleVectorInst>(BI) || isa<InsertElementInst>(BI) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001250 isa<ExtractElementInst>(BI) || isa<SelectInst>(BI) ||
Owen Anderson56533222007-07-03 23:51:19 +00001251 isa<CastInst>(BI) || isa<GetElementPtrInst>(BI)) {
Owen Andersona05a81b2007-07-10 00:09:25 +00001252
Owen Anderson9fed5892007-08-02 18:20:52 +00001253 if (availableOut[BB].test(VN.lookup(BI)) &&
1254 !availableOut[BB].count(BI)) {
Owen Andersona05a81b2007-07-10 00:09:25 +00001255 Value *leader = find_leader(availableOut[BB], VN.lookup(BI));
Owen Anderson239e7122007-06-12 16:57:50 +00001256 if (Instruction* Instr = dyn_cast<Instruction>(leader))
1257 if (Instr->getParent() != 0 && Instr != BI) {
1258 replace.push_back(std::make_pair(BI, leader));
1259 erase.push_back(BI);
1260 ++NumEliminated;
1261 }
Owen Andersona05a81b2007-07-10 00:09:25 +00001262 }
Owen Anderson239e7122007-06-12 16:57:50 +00001263 }
1264 }
1265 }
1266
1267 while (!replace.empty()) {
1268 std::pair<Instruction*, Value*> rep = replace.back();
1269 replace.pop_back();
1270 rep.first->replaceAllUsesWith(rep.second);
Owen Anderson0304b2b2007-06-20 18:30:20 +00001271 changed_function = true;
Owen Anderson239e7122007-06-12 16:57:50 +00001272 }
1273
Owen Anderson9fed5892007-08-02 18:20:52 +00001274 for (SmallVector<Instruction*, 8>::iterator I = erase.begin(),
1275 E = erase.end(); I != E; ++I)
Owen Anderson239e7122007-06-12 16:57:50 +00001276 (*I)->eraseFromParent();
Owen Anderson3eaca712007-06-20 22:10:02 +00001277
1278 return changed_function;
Owen Anderson239e7122007-06-12 16:57:50 +00001279}
1280
Owen Anderson9cb56012007-06-21 00:19:05 +00001281/// cleanup - Delete any extraneous values that were created to represent
1282/// expressions without leaders.
Owen Anderson239e7122007-06-12 16:57:50 +00001283void GVNPRE::cleanup() {
1284 while (!createdExpressions.empty()) {
1285 Instruction* I = createdExpressions.back();
1286 createdExpressions.pop_back();
1287
1288 delete I;
1289 }
1290}
1291
Owen Anderson9cb56012007-06-21 00:19:05 +00001292/// buildsets_availout - When calculating availability, handle an instruction
1293/// by inserting it into the appropriate sets
Owen Anderson3eaca712007-06-20 22:10:02 +00001294void GVNPRE::buildsets_availout(BasicBlock::iterator I,
Owen Anderson0616dff2007-07-09 06:50:06 +00001295 ValueNumberedSet& currAvail,
1296 ValueNumberedSet& currPhis,
1297 ValueNumberedSet& currExps,
1298 SmallPtrSet<Value*, 16>& currTemps) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001299 // Handle PHI nodes
Owen Anderson3eaca712007-06-20 22:10:02 +00001300 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001301 unsigned num = VN.lookup_or_add(p);
Owen Anderson12408462007-06-22 03:14:03 +00001302
Owen Anderson3eaca712007-06-20 22:10:02 +00001303 currPhis.insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001304 currPhis.set(num);
Owen Anderson216394f2007-07-03 18:37:08 +00001305
1306 // Handle unary ops
Owen Anderson3d6fac32007-07-03 19:01:42 +00001307 } else if (CastInst* U = dyn_cast<CastInst>(I)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001308 Value* leftValue = U->getOperand(0);
Owen Anderson3eaca712007-06-20 22:10:02 +00001309
Owen Anderson216394f2007-07-03 18:37:08 +00001310 unsigned num = VN.lookup_or_add(U);
Owen Anderson216394f2007-07-03 18:37:08 +00001311
1312 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001313 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson216394f2007-07-03 18:37:08 +00001314 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001315 currExps.set(VN.lookup(leftValue));
Owen Anderson216394f2007-07-03 18:37:08 +00001316 }
1317
Owen Anderson0616dff2007-07-09 06:50:06 +00001318 if (!currExps.test(num)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001319 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001320 currExps.set(num);
Owen Anderson216394f2007-07-03 18:37:08 +00001321 }
1322
Owen Anderson7b317d22007-06-27 17:03:03 +00001323 // Handle binary ops
1324 } else if (isa<BinaryOperator>(I) || isa<CmpInst>(I) ||
1325 isa<ExtractElementInst>(I)) {
1326 User* U = cast<User>(I);
1327 Value* leftValue = U->getOperand(0);
1328 Value* rightValue = U->getOperand(1);
Owen Anderson3eaca712007-06-20 22:10:02 +00001329
Owen Anderson7b317d22007-06-27 17:03:03 +00001330 unsigned num = VN.lookup_or_add(U);
Owen Anderson3eaca712007-06-20 22:10:02 +00001331
1332 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001333 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson12408462007-06-22 03:14:03 +00001334 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001335 currExps.set(VN.lookup(leftValue));
Owen Anderson12408462007-06-22 03:14:03 +00001336 }
1337
Owen Anderson3eaca712007-06-20 22:10:02 +00001338 if (isa<Instruction>(rightValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001339 if (!currExps.test(VN.lookup(rightValue))) {
Owen Anderson12408462007-06-22 03:14:03 +00001340 currExps.insert(rightValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001341 currExps.set(VN.lookup(rightValue));
Owen Anderson12408462007-06-22 03:14:03 +00001342 }
1343
Owen Anderson0616dff2007-07-09 06:50:06 +00001344 if (!currExps.test(num)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001345 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001346 currExps.set(num);
Owen Anderson12408462007-06-22 03:14:03 +00001347 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001348
Owen Anderson7b317d22007-06-27 17:03:03 +00001349 // Handle ternary ops
Owen Anderson890e1a02007-06-28 23:51:21 +00001350 } else if (isa<InsertElementInst>(I) || isa<ShuffleVectorInst>(I) ||
1351 isa<SelectInst>(I)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001352 User* U = cast<User>(I);
1353 Value* leftValue = U->getOperand(0);
1354 Value* rightValue = U->getOperand(1);
1355 Value* thirdValue = U->getOperand(2);
Owen Anderson3eaca712007-06-20 22:10:02 +00001356
Owen Anderson7b317d22007-06-27 17:03:03 +00001357 VN.lookup_or_add(U);
Owen Anderson12408462007-06-22 03:14:03 +00001358
Owen Anderson7b317d22007-06-27 17:03:03 +00001359 unsigned num = VN.lookup_or_add(U);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001360
1361 if (isa<Instruction>(leftValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001362 if (!currExps.test(VN.lookup(leftValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001363 currExps.insert(leftValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001364 currExps.set(VN.lookup(leftValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001365 }
1366 if (isa<Instruction>(rightValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001367 if (!currExps.test(VN.lookup(rightValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001368 currExps.insert(rightValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001369 currExps.set(VN.lookup(rightValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001370 }
1371 if (isa<Instruction>(thirdValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001372 if (!currExps.test(VN.lookup(thirdValue))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001373 currExps.insert(thirdValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001374 currExps.set(VN.lookup(thirdValue));
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001375 }
1376
Owen Anderson0616dff2007-07-09 06:50:06 +00001377 if (!currExps.test(num)) {
Owen Anderson7b317d22007-06-27 17:03:03 +00001378 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001379 currExps.set(num);
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001380 }
1381
Owen Anderson56533222007-07-03 23:51:19 +00001382 // Handle vararg ops
1383 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(I)) {
1384 Value* ptrValue = U->getPointerOperand();
1385
1386 VN.lookup_or_add(U);
1387
1388 unsigned num = VN.lookup_or_add(U);
Owen Anderson56533222007-07-03 23:51:19 +00001389
1390 if (isa<Instruction>(ptrValue))
Owen Anderson0616dff2007-07-09 06:50:06 +00001391 if (!currExps.test(VN.lookup(ptrValue))) {
Owen Anderson56533222007-07-03 23:51:19 +00001392 currExps.insert(ptrValue);
Owen Anderson0616dff2007-07-09 06:50:06 +00001393 currExps.set(VN.lookup(ptrValue));
Owen Anderson56533222007-07-03 23:51:19 +00001394 }
1395
1396 for (GetElementPtrInst::op_iterator OI = U->idx_begin(), OE = U->idx_end();
1397 OI != OE; ++OI)
Owen Anderson0616dff2007-07-09 06:50:06 +00001398 if (isa<Instruction>(*OI) && !currExps.test(VN.lookup(*OI))) {
Owen Anderson56533222007-07-03 23:51:19 +00001399 currExps.insert(*OI);
Owen Anderson0616dff2007-07-09 06:50:06 +00001400 currExps.set(VN.lookup(*OI));
Owen Anderson56533222007-07-03 23:51:19 +00001401 }
1402
Owen Anderson0616dff2007-07-09 06:50:06 +00001403 if (!currExps.test(VN.lookup(U))) {
Owen Anderson56533222007-07-03 23:51:19 +00001404 currExps.insert(U);
Owen Anderson0616dff2007-07-09 06:50:06 +00001405 currExps.set(num);
Owen Anderson56533222007-07-03 23:51:19 +00001406 }
1407
Owen Anderson7b317d22007-06-27 17:03:03 +00001408 // Handle opaque ops
1409 } else if (!I->isTerminator()){
Owen Anderson3eaca712007-06-20 22:10:02 +00001410 VN.lookup_or_add(I);
Owen Anderson12408462007-06-22 03:14:03 +00001411
Owen Anderson3eaca712007-06-20 22:10:02 +00001412 currTemps.insert(I);
1413 }
1414
1415 if (!I->isTerminator())
Owen Anderson0616dff2007-07-09 06:50:06 +00001416 if (!currAvail.test(VN.lookup(I))) {
Owen Anderson12408462007-06-22 03:14:03 +00001417 currAvail.insert(I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001418 currAvail.set(VN.lookup(I));
Owen Anderson12408462007-06-22 03:14:03 +00001419 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001420}
Owen Andersonea12a062007-05-29 21:53:49 +00001421
Owen Anderson9cb56012007-06-21 00:19:05 +00001422/// buildsets_anticout - When walking the postdom tree, calculate the ANTIC_OUT
1423/// set as a function of the ANTIC_IN set of the block's predecessors
Owen Anderson82575d82007-06-22 00:20:30 +00001424bool GVNPRE::buildsets_anticout(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +00001425 ValueNumberedSet& anticOut,
Owen Andersonb9781982007-07-19 03:32:44 +00001426 SmallPtrSet<BasicBlock*, 8>& visited) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001427 if (BB->getTerminator()->getNumSuccessors() == 1) {
Owen Andersonf62c44a2007-06-25 05:41:12 +00001428 if (BB->getTerminator()->getSuccessor(0) != BB &&
1429 visited.count(BB->getTerminator()->getSuccessor(0)) == 0) {
Owen Anderson82575d82007-06-22 00:20:30 +00001430 return true;
Owen Andersonf62c44a2007-06-25 05:41:12 +00001431 }
1432 else {
Owen Anderson3eaca712007-06-20 22:10:02 +00001433 phi_translate_set(anticipatedIn[BB->getTerminator()->getSuccessor(0)],
1434 BB, BB->getTerminator()->getSuccessor(0), anticOut);
Owen Andersonf62c44a2007-06-25 05:41:12 +00001435 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001436 } else if (BB->getTerminator()->getNumSuccessors() > 1) {
1437 BasicBlock* first = BB->getTerminator()->getSuccessor(0);
Owen Anderson0616dff2007-07-09 06:50:06 +00001438 for (ValueNumberedSet::iterator I = anticipatedIn[first].begin(),
1439 E = anticipatedIn[first].end(); I != E; ++I) {
1440 anticOut.insert(*I);
1441 anticOut.set(VN.lookup(*I));
1442 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001443
1444 for (unsigned i = 1; i < BB->getTerminator()->getNumSuccessors(); ++i) {
1445 BasicBlock* currSucc = BB->getTerminator()->getSuccessor(i);
Owen Anderson0616dff2007-07-09 06:50:06 +00001446 ValueNumberedSet& succAnticIn = anticipatedIn[currSucc];
Owen Anderson3eaca712007-06-20 22:10:02 +00001447
Owen Anderson19bc4a82007-07-19 06:37:56 +00001448 SmallVector<Value*, 16> temp;
Owen Anderson66fd9062007-06-21 17:57:53 +00001449
Owen Anderson0616dff2007-07-09 06:50:06 +00001450 for (ValueNumberedSet::iterator I = anticOut.begin(),
Owen Anderson66fd9062007-06-21 17:57:53 +00001451 E = anticOut.end(); I != E; ++I)
Owen Anderson0616dff2007-07-09 06:50:06 +00001452 if (!succAnticIn.test(VN.lookup(*I)))
Owen Anderson66fd9062007-06-21 17:57:53 +00001453 temp.push_back(*I);
1454
Owen Anderson19bc4a82007-07-19 06:37:56 +00001455 for (SmallVector<Value*, 16>::iterator I = temp.begin(), E = temp.end();
Owen Anderson0616dff2007-07-09 06:50:06 +00001456 I != E; ++I) {
Owen Anderson66fd9062007-06-21 17:57:53 +00001457 anticOut.erase(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001458 anticOut.reset(VN.lookup(*I));
1459 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001460 }
1461 }
Owen Anderson82575d82007-06-22 00:20:30 +00001462
1463 return false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001464}
1465
Owen Anderson9cb56012007-06-21 00:19:05 +00001466/// buildsets_anticin - Walk the postdom tree, calculating ANTIC_OUT for
1467/// each block. ANTIC_IN is then a function of ANTIC_OUT and the GEN
1468/// sets populated in buildsets_availout
Owen Anderson82575d82007-06-22 00:20:30 +00001469unsigned GVNPRE::buildsets_anticin(BasicBlock* BB,
Owen Anderson0616dff2007-07-09 06:50:06 +00001470 ValueNumberedSet& anticOut,
1471 ValueNumberedSet& currExps,
Owen Andersona20f35d2007-06-28 00:34:34 +00001472 SmallPtrSet<Value*, 16>& currTemps,
Owen Andersonb9781982007-07-19 03:32:44 +00001473 SmallPtrSet<BasicBlock*, 8>& visited) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001474 ValueNumberedSet& anticIn = anticipatedIn[BB];
Owen Anderson2106f612007-06-22 18:27:04 +00001475 unsigned old = anticIn.size();
Owen Anderson3eaca712007-06-20 22:10:02 +00001476
Owen Anderson82575d82007-06-22 00:20:30 +00001477 bool defer = buildsets_anticout(BB, anticOut, visited);
1478 if (defer)
1479 return 0;
Owen Anderson66fd9062007-06-21 17:57:53 +00001480
Owen Anderson3eaca712007-06-20 22:10:02 +00001481 anticIn.clear();
Owen Anderson66fd9062007-06-21 17:57:53 +00001482
Owen Anderson0616dff2007-07-09 06:50:06 +00001483 for (ValueNumberedSet::iterator I = anticOut.begin(),
Owen Anderson2106f612007-06-22 18:27:04 +00001484 E = anticOut.end(); I != E; ++I) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001485 anticIn.insert(*I);
1486 anticIn.set(VN.lookup(*I));
Owen Anderson3eaca712007-06-20 22:10:02 +00001487 }
Owen Anderson0616dff2007-07-09 06:50:06 +00001488 for (ValueNumberedSet::iterator I = currExps.begin(),
Owen Anderson2106f612007-06-22 18:27:04 +00001489 E = currExps.end(); I != E; ++I) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001490 if (!anticIn.test(VN.lookup(*I))) {
Owen Anderson2106f612007-06-22 18:27:04 +00001491 anticIn.insert(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001492 anticIn.set(VN.lookup(*I));
Owen Anderson2106f612007-06-22 18:27:04 +00001493 }
1494 }
1495
Owen Andersona20f35d2007-06-28 00:34:34 +00001496 for (SmallPtrSet<Value*, 16>::iterator I = currTemps.begin(),
Owen Anderson68cb52e2007-06-27 17:38:29 +00001497 E = currTemps.end(); I != E; ++I) {
Owen Anderson2106f612007-06-22 18:27:04 +00001498 anticIn.erase(*I);
Owen Anderson0616dff2007-07-09 06:50:06 +00001499 anticIn.reset(VN.lookup(*I));
Owen Anderson68cb52e2007-06-27 17:38:29 +00001500 }
Owen Anderson2106f612007-06-22 18:27:04 +00001501
Owen Anderson0616dff2007-07-09 06:50:06 +00001502 clean(anticIn);
Owen Anderson68cb52e2007-06-27 17:38:29 +00001503 anticOut.clear();
Owen Anderson3eaca712007-06-20 22:10:02 +00001504
Owen Anderson68cb52e2007-06-27 17:38:29 +00001505 if (old != anticIn.size())
Owen Anderson82575d82007-06-22 00:20:30 +00001506 return 2;
Owen Anderson68cb52e2007-06-27 17:38:29 +00001507 else
Owen Anderson82575d82007-06-22 00:20:30 +00001508 return 1;
Owen Anderson3eaca712007-06-20 22:10:02 +00001509}
1510
Owen Anderson9cb56012007-06-21 00:19:05 +00001511/// buildsets - Phase 1 of the main algorithm. Construct the AVAIL_OUT
1512/// and the ANTIC_IN sets.
Owen Anderson6032a5b2007-06-26 23:29:41 +00001513void GVNPRE::buildsets(Function& F) {
Owen Andersonb9781982007-07-19 03:32:44 +00001514 DenseMap<BasicBlock*, ValueNumberedSet> generatedExpressions;
1515 DenseMap<BasicBlock*, SmallPtrSet<Value*, 16> > generatedTemporaries;
Owen Anderson3eaca712007-06-20 22:10:02 +00001516
Owen Andersonea12a062007-05-29 21:53:49 +00001517 DominatorTree &DT = getAnalysis<DominatorTree>();
1518
Owen Anderson12112af2007-06-06 01:27:49 +00001519 // Phase 1, Part 1: calculate AVAIL_OUT
Owen Andersonea12a062007-05-29 21:53:49 +00001520
1521 // Top-down walk of the dominator tree
Devang Patel26042422007-06-04 00:32:22 +00001522 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
Owen Andersonea12a062007-05-29 21:53:49 +00001523 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1524
1525 // Get the sets to update for this block
Owen Anderson0616dff2007-07-09 06:50:06 +00001526 ValueNumberedSet& currExps = generatedExpressions[DI->getBlock()];
1527 ValueNumberedSet& currPhis = generatedPhis[DI->getBlock()];
Owen Andersona20f35d2007-06-28 00:34:34 +00001528 SmallPtrSet<Value*, 16>& currTemps = generatedTemporaries[DI->getBlock()];
Owen Anderson0616dff2007-07-09 06:50:06 +00001529 ValueNumberedSet& currAvail = availableOut[DI->getBlock()];
Owen Andersonea12a062007-05-29 21:53:49 +00001530
Owen Anderson086f5f32007-06-19 03:31:41 +00001531 BasicBlock* BB = DI->getBlock();
1532
1533 // A block inherits AVAIL_OUT from its dominator
Owen Andersondfa24352007-07-09 22:29:50 +00001534 if (DI->getIDom() != 0)
1535 currAvail = availableOut[DI->getIDom()->getBlock()];
Owen Anderson0616dff2007-07-09 06:50:06 +00001536
Owen Anderson086f5f32007-06-19 03:31:41 +00001537 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
Owen Anderson3eaca712007-06-20 22:10:02 +00001538 BI != BE; ++BI)
Owen Anderson12408462007-06-22 03:14:03 +00001539 buildsets_availout(BI, currAvail, currPhis, currExps,
Owen Anderson0616dff2007-07-09 06:50:06 +00001540 currTemps);
Owen Anderson086f5f32007-06-19 03:31:41 +00001541
Owen Andersonea12a062007-05-29 21:53:49 +00001542 }
Owen Andersonf62c44a2007-06-25 05:41:12 +00001543
1544 // Phase 1, Part 2: calculate ANTIC_IN
Owen Andersonea12a062007-05-29 21:53:49 +00001545
Owen Andersonb9781982007-07-19 03:32:44 +00001546 SmallPtrSet<BasicBlock*, 8> visited;
Owen Anderson6032a5b2007-06-26 23:29:41 +00001547 SmallPtrSet<BasicBlock*, 4> block_changed;
1548 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
1549 block_changed.insert(FI);
Owen Andersone3072b22007-05-29 23:26:30 +00001550
Owen Andersonea12a062007-05-29 21:53:49 +00001551 bool changed = true;
1552 unsigned iterations = 0;
Owen Anderson6032a5b2007-06-26 23:29:41 +00001553
Owen Andersonea12a062007-05-29 21:53:49 +00001554 while (changed) {
1555 changed = false;
Owen Anderson0616dff2007-07-09 06:50:06 +00001556 ValueNumberedSet anticOut;
Owen Andersonea12a062007-05-29 21:53:49 +00001557
Owen Anderson6032a5b2007-06-26 23:29:41 +00001558 // Postorder walk of the CFG
Owen Anderson9030d382007-06-25 18:25:31 +00001559 for (po_iterator<BasicBlock*> BBI = po_begin(&F.getEntryBlock()),
1560 BBE = po_end(&F.getEntryBlock()); BBI != BBE; ++BBI) {
Owen Andersonf62c44a2007-06-25 05:41:12 +00001561 BasicBlock* BB = *BBI;
Owen Anderson0e714662007-06-11 16:25:17 +00001562
Owen Anderson6032a5b2007-06-26 23:29:41 +00001563 if (block_changed.count(BB) != 0) {
1564 unsigned ret = buildsets_anticin(BB, anticOut,generatedExpressions[BB],
1565 generatedTemporaries[BB], visited);
Owen Anderson82575d82007-06-22 00:20:30 +00001566
Owen Anderson6032a5b2007-06-26 23:29:41 +00001567 if (ret == 0) {
1568 changed = true;
1569 continue;
1570 } else {
1571 visited.insert(BB);
1572
1573 if (ret == 2)
1574 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
1575 PI != PE; ++PI) {
1576 block_changed.insert(*PI);
1577 }
1578 else
1579 block_changed.erase(BB);
1580
1581 changed |= (ret == 2);
Owen Andersonf62c44a2007-06-25 05:41:12 +00001582 }
Owen Anderson82575d82007-06-22 00:20:30 +00001583 }
Owen Andersonea12a062007-05-29 21:53:49 +00001584 }
Owen Anderson5ea069f2007-06-04 18:05:26 +00001585
Owen Andersonea12a062007-05-29 21:53:49 +00001586 iterations++;
1587 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001588}
1589
Owen Anderson9cb56012007-06-21 00:19:05 +00001590/// insertion_pre - When a partial redundancy has been identified, eliminate it
1591/// by inserting appropriate values into the predecessors and a phi node in
1592/// the main block
Owen Anderson3eaca712007-06-20 22:10:02 +00001593void GVNPRE::insertion_pre(Value* e, BasicBlock* BB,
Owen Anderson19bc4a82007-07-19 06:37:56 +00001594 DenseMap<BasicBlock*, Value*>& avail,
Owen Anderson0616dff2007-07-09 06:50:06 +00001595 std::map<BasicBlock*, ValueNumberedSet>& new_sets) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001596 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
1597 Value* e2 = avail[*PI];
Owen Anderson0616dff2007-07-09 06:50:06 +00001598 if (!availableOut[*PI].test(VN.lookup(e2))) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001599 User* U = cast<User>(e2);
1600
1601 Value* s1 = 0;
1602 if (isa<BinaryOperator>(U->getOperand(0)) ||
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001603 isa<CmpInst>(U->getOperand(0)) ||
1604 isa<ShuffleVectorInst>(U->getOperand(0)) ||
1605 isa<ExtractElementInst>(U->getOperand(0)) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001606 isa<InsertElementInst>(U->getOperand(0)) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001607 isa<SelectInst>(U->getOperand(0)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001608 isa<CastInst>(U->getOperand(0)) ||
1609 isa<GetElementPtrInst>(U->getOperand(0)))
Owen Anderson3eaca712007-06-20 22:10:02 +00001610 s1 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(0)));
1611 else
1612 s1 = U->getOperand(0);
1613
1614 Value* s2 = 0;
Owen Anderson216394f2007-07-03 18:37:08 +00001615
1616 if (isa<BinaryOperator>(U) ||
1617 isa<CmpInst>(U) ||
1618 isa<ShuffleVectorInst>(U) ||
1619 isa<ExtractElementInst>(U) ||
1620 isa<InsertElementInst>(U) ||
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001621 isa<SelectInst>(U)) {
Owen Anderson216394f2007-07-03 18:37:08 +00001622 if (isa<BinaryOperator>(U->getOperand(1)) ||
1623 isa<CmpInst>(U->getOperand(1)) ||
1624 isa<ShuffleVectorInst>(U->getOperand(1)) ||
1625 isa<ExtractElementInst>(U->getOperand(1)) ||
1626 isa<InsertElementInst>(U->getOperand(1)) ||
1627 isa<SelectInst>(U->getOperand(1)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001628 isa<CastInst>(U->getOperand(1)) ||
1629 isa<GetElementPtrInst>(U->getOperand(1))) {
Owen Anderson216394f2007-07-03 18:37:08 +00001630 s2 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(1)));
1631 } else {
1632 s2 = U->getOperand(1);
1633 }
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001634 }
Owen Anderson7b317d22007-06-27 17:03:03 +00001635
1636 // Ternary Operators
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001637 Value* s3 = 0;
1638 if (isa<ShuffleVectorInst>(U) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001639 isa<InsertElementInst>(U) ||
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001640 isa<SelectInst>(U)) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001641 if (isa<BinaryOperator>(U->getOperand(2)) ||
1642 isa<CmpInst>(U->getOperand(2)) ||
1643 isa<ShuffleVectorInst>(U->getOperand(2)) ||
1644 isa<ExtractElementInst>(U->getOperand(2)) ||
Owen Anderson890e1a02007-06-28 23:51:21 +00001645 isa<InsertElementInst>(U->getOperand(2)) ||
Owen Anderson216394f2007-07-03 18:37:08 +00001646 isa<SelectInst>(U->getOperand(2)) ||
Owen Anderson56533222007-07-03 23:51:19 +00001647 isa<CastInst>(U->getOperand(2)) ||
1648 isa<GetElementPtrInst>(U->getOperand(2))) {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001649 s3 = find_leader(availableOut[*PI], VN.lookup(U->getOperand(2)));
Owen Anderson216394f2007-07-03 18:37:08 +00001650 } else {
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001651 s3 = U->getOperand(2);
Owen Anderson216394f2007-07-03 18:37:08 +00001652 }
Anton Korobeynikov07e6e562008-02-20 11:26:25 +00001653 }
Owen Anderson3eaca712007-06-20 22:10:02 +00001654
Owen Anderson56533222007-07-03 23:51:19 +00001655 // Vararg operators
Owen Anderson19bc4a82007-07-19 06:37:56 +00001656 SmallVector<Value*, 4> sVarargs;
Owen Anderson56533222007-07-03 23:51:19 +00001657 if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(U)) {
1658 for (GetElementPtrInst::op_iterator OI = G->idx_begin(),
1659 OE = G->idx_end(); OI != OE; ++OI) {
1660 if (isa<BinaryOperator>(*OI) ||
1661 isa<CmpInst>(*OI) ||
1662 isa<ShuffleVectorInst>(*OI) ||
1663 isa<ExtractElementInst>(*OI) ||
1664 isa<InsertElementInst>(*OI) ||
1665 isa<SelectInst>(*OI) ||
1666 isa<CastInst>(*OI) ||
1667 isa<GetElementPtrInst>(*OI)) {
1668 sVarargs.push_back(find_leader(availableOut[*PI],
1669 VN.lookup(*OI)));
1670 } else {
1671 sVarargs.push_back(*OI);
1672 }
1673 }
1674 }
1675
Owen Anderson3eaca712007-06-20 22:10:02 +00001676 Value* newVal = 0;
1677 if (BinaryOperator* BO = dyn_cast<BinaryOperator>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +00001678 newVal = BinaryOperator::Create(BO->getOpcode(), s1, s2,
Owen Anderson3eaca712007-06-20 22:10:02 +00001679 BO->getName()+".gvnpre",
1680 (*PI)->getTerminator());
1681 else if (CmpInst* C = dyn_cast<CmpInst>(U))
Owen Anderson333c4002009-07-09 23:48:35 +00001682 newVal = CmpInst::Create(*Context, C->getOpcode(),
1683 C->getPredicate(), s1, s2,
Owen Anderson3eaca712007-06-20 22:10:02 +00001684 C->getName()+".gvnpre",
1685 (*PI)->getTerminator());
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001686 else if (ShuffleVectorInst* S = dyn_cast<ShuffleVectorInst>(U))
1687 newVal = new ShuffleVectorInst(s1, s2, s3, S->getName()+".gvnpre",
1688 (*PI)->getTerminator());
1689 else if (InsertElementInst* S = dyn_cast<InsertElementInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001690 newVal = InsertElementInst::Create(s1, s2, s3, S->getName()+".gvnpre",
1691 (*PI)->getTerminator());
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001692 else if (ExtractElementInst* S = dyn_cast<ExtractElementInst>(U))
1693 newVal = new ExtractElementInst(s1, s2, S->getName()+".gvnpre",
1694 (*PI)->getTerminator());
Owen Anderson890e1a02007-06-28 23:51:21 +00001695 else if (SelectInst* S = dyn_cast<SelectInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001696 newVal = SelectInst::Create(s1, s2, s3, S->getName()+".gvnpre",
1697 (*PI)->getTerminator());
Owen Anderson216394f2007-07-03 18:37:08 +00001698 else if (CastInst* C = dyn_cast<CastInst>(U))
Gabor Greif7cbd8a32008-05-16 19:29:10 +00001699 newVal = CastInst::Create(C->getOpcode(), s1, C->getType(),
Owen Anderson216394f2007-07-03 18:37:08 +00001700 C->getName()+".gvnpre",
1701 (*PI)->getTerminator());
Owen Anderson56533222007-07-03 23:51:19 +00001702 else if (GetElementPtrInst* G = dyn_cast<GetElementPtrInst>(U))
Gabor Greif051a9502008-04-06 20:25:17 +00001703 newVal = GetElementPtrInst::Create(s1, sVarargs.begin(), sVarargs.end(),
1704 G->getName()+".gvnpre",
1705 (*PI)->getTerminator());
1706
Owen Anderson3eaca712007-06-20 22:10:02 +00001707 VN.add(newVal, VN.lookup(U));
1708
Owen Anderson0616dff2007-07-09 06:50:06 +00001709 ValueNumberedSet& predAvail = availableOut[*PI];
Owen Anderson3eaca712007-06-20 22:10:02 +00001710 val_replace(predAvail, newVal);
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001711 val_replace(new_sets[*PI], newVal);
Owen Anderson0616dff2007-07-09 06:50:06 +00001712 predAvail.set(VN.lookup(newVal));
Owen Anderson9cb56012007-06-21 00:19:05 +00001713
Owen Anderson19bc4a82007-07-19 06:37:56 +00001714 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001715 if (av != avail.end())
1716 avail.erase(av);
1717 avail.insert(std::make_pair(*PI, newVal));
1718
1719 ++NumInsertedVals;
1720 }
1721 }
1722
1723 PHINode* p = 0;
1724
1725 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
1726 if (p == 0)
Gabor Greif051a9502008-04-06 20:25:17 +00001727 p = PHINode::Create(avail[*PI]->getType(), "gvnpre-join", BB->begin());
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001728
Owen Anderson3eaca712007-06-20 22:10:02 +00001729 p->addIncoming(avail[*PI], *PI);
1730 }
1731
1732 VN.add(p, VN.lookup(e));
Owen Anderson3eaca712007-06-20 22:10:02 +00001733 val_replace(availableOut[BB], p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001734 availableOut[BB].set(VN.lookup(e));
Owen Andersonec5614b2007-07-06 20:29:43 +00001735 generatedPhis[BB].insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001736 generatedPhis[BB].set(VN.lookup(e));
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001737 new_sets[BB].insert(p);
Owen Anderson0616dff2007-07-09 06:50:06 +00001738 new_sets[BB].set(VN.lookup(e));
Owen Anderson3eaca712007-06-20 22:10:02 +00001739
1740 ++NumInsertedPhis;
1741}
1742
Owen Anderson9cb56012007-06-21 00:19:05 +00001743/// insertion_mergepoint - When walking the dom tree, check at each merge
1744/// block for the possibility of a partial redundancy. If present, eliminate it
Owen Anderson19bc4a82007-07-19 06:37:56 +00001745unsigned GVNPRE::insertion_mergepoint(SmallVector<Value*, 8>& workList,
Owen Anderson82575d82007-06-22 00:20:30 +00001746 df_iterator<DomTreeNode*>& D,
Owen Anderson0616dff2007-07-09 06:50:06 +00001747 std::map<BasicBlock*, ValueNumberedSet >& new_sets) {
Owen Anderson3eaca712007-06-20 22:10:02 +00001748 bool changed_function = false;
1749 bool new_stuff = false;
1750
1751 BasicBlock* BB = D->getBlock();
1752 for (unsigned i = 0; i < workList.size(); ++i) {
1753 Value* e = workList[i];
1754
Owen Anderson62cf8ba2007-06-27 04:10:46 +00001755 if (isa<BinaryOperator>(e) || isa<CmpInst>(e) ||
1756 isa<ExtractElementInst>(e) || isa<InsertElementInst>(e) ||
Owen Anderson56533222007-07-03 23:51:19 +00001757 isa<ShuffleVectorInst>(e) || isa<SelectInst>(e) || isa<CastInst>(e) ||
1758 isa<GetElementPtrInst>(e)) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001759 if (availableOut[D->getIDom()->getBlock()].test(VN.lookup(e)))
Owen Anderson3eaca712007-06-20 22:10:02 +00001760 continue;
1761
Owen Anderson19bc4a82007-07-19 06:37:56 +00001762 DenseMap<BasicBlock*, Value*> avail;
Owen Anderson3eaca712007-06-20 22:10:02 +00001763 bool by_some = false;
Owen Andersonec5614b2007-07-06 20:29:43 +00001764 bool all_same = true;
1765 Value * first_s = 0;
Owen Anderson3eaca712007-06-20 22:10:02 +00001766
1767 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;
1768 ++PI) {
1769 Value *e2 = phi_translate(e, *PI, BB);
1770 Value *e3 = find_leader(availableOut[*PI], VN.lookup(e2));
1771
1772 if (e3 == 0) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001773 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001774 if (av != avail.end())
1775 avail.erase(av);
1776 avail.insert(std::make_pair(*PI, e2));
Owen Andersonec5614b2007-07-06 20:29:43 +00001777 all_same = false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001778 } else {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001779 DenseMap<BasicBlock*, Value*>::iterator av = avail.find(*PI);
Owen Anderson3eaca712007-06-20 22:10:02 +00001780 if (av != avail.end())
1781 avail.erase(av);
1782 avail.insert(std::make_pair(*PI, e3));
1783
1784 by_some = true;
Owen Andersonec5614b2007-07-06 20:29:43 +00001785 if (first_s == 0)
1786 first_s = e3;
1787 else if (first_s != e3)
1788 all_same = false;
Owen Anderson3eaca712007-06-20 22:10:02 +00001789 }
1790 }
1791
Owen Andersonec5614b2007-07-06 20:29:43 +00001792 if (by_some && !all_same &&
Owen Anderson0616dff2007-07-09 06:50:06 +00001793 !generatedPhis[BB].test(VN.lookup(e))) {
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001794 insertion_pre(e, BB, avail, new_sets);
Owen Anderson3eaca712007-06-20 22:10:02 +00001795
1796 changed_function = true;
1797 new_stuff = true;
1798 }
1799 }
1800 }
1801
1802 unsigned retval = 0;
1803 if (changed_function)
1804 retval += 1;
1805 if (new_stuff)
1806 retval += 2;
1807
1808 return retval;
1809}
1810
Owen Anderson9cb56012007-06-21 00:19:05 +00001811/// insert - Phase 2 of the main algorithm. Walk the dominator tree looking for
1812/// merge points. When one is found, check for a partial redundancy. If one is
1813/// present, eliminate it. Repeat this walk until no changes are made.
Owen Anderson3eaca712007-06-20 22:10:02 +00001814bool GVNPRE::insertion(Function& F) {
1815 bool changed_function = false;
1816
1817 DominatorTree &DT = getAnalysis<DominatorTree>();
Owen Anderson397d4052007-06-08 01:03:01 +00001818
Owen Anderson0616dff2007-07-09 06:50:06 +00001819 std::map<BasicBlock*, ValueNumberedSet> new_sets;
Owen Anderson397d4052007-06-08 01:03:01 +00001820 bool new_stuff = true;
1821 while (new_stuff) {
1822 new_stuff = false;
Owen Anderson397d4052007-06-08 01:03:01 +00001823 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
1824 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1825 BasicBlock* BB = DI->getBlock();
1826
Owen Anderson0e714662007-06-11 16:25:17 +00001827 if (BB == 0)
1828 continue;
1829
Owen Anderson0616dff2007-07-09 06:50:06 +00001830 ValueNumberedSet& availOut = availableOut[BB];
1831 ValueNumberedSet& anticIn = anticipatedIn[BB];
Owen Anderson397d4052007-06-08 01:03:01 +00001832
1833 // Replace leaders with leaders inherited from dominator
1834 if (DI->getIDom() != 0) {
Owen Anderson0616dff2007-07-09 06:50:06 +00001835 ValueNumberedSet& dom_set = new_sets[DI->getIDom()->getBlock()];
1836 for (ValueNumberedSet::iterator I = dom_set.begin(),
Owen Anderson397d4052007-06-08 01:03:01 +00001837 E = dom_set.end(); I != E; ++I) {
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001838 val_replace(new_sets[BB], *I);
Owen Anderson086f5f32007-06-19 03:31:41 +00001839 val_replace(availOut, *I);
Owen Anderson397d4052007-06-08 01:03:01 +00001840 }
1841 }
1842
1843 // If there is more than one predecessor...
1844 if (pred_begin(BB) != pred_end(BB) && ++pred_begin(BB) != pred_end(BB)) {
Owen Anderson19bc4a82007-07-19 06:37:56 +00001845 SmallVector<Value*, 8> workList;
Owen Andersone8138ff2007-06-22 00:43:22 +00001846 workList.reserve(anticIn.size());
Owen Anderson397d4052007-06-08 01:03:01 +00001847 topo_sort(anticIn, workList);
1848
Owen Anderson2a5c9d82007-07-05 23:11:26 +00001849 unsigned result = insertion_mergepoint(workList, DI, new_sets);
Owen Anderson3eaca712007-06-20 22:10:02 +00001850 if (result & 1)
1851 changed_function = true;
1852 if (result & 2)
1853 new_stuff = true;
Owen Anderson397d4052007-06-08 01:03:01 +00001854 }
1855 }
Owen Anderson397d4052007-06-08 01:03:01 +00001856 }
Owen Anderson12112af2007-06-06 01:27:49 +00001857
Owen Anderson3eaca712007-06-20 22:10:02 +00001858 return changed_function;
1859}
1860
Owen Anderson9cb56012007-06-21 00:19:05 +00001861// GVNPRE::runOnFunction - This is the main transformation entry point for a
1862// function.
1863//
Owen Anderson3eaca712007-06-20 22:10:02 +00001864bool GVNPRE::runOnFunction(Function &F) {
Owen Anderson9cb56012007-06-21 00:19:05 +00001865 // Clean out global sets from any previous functions
Owen Anderson3eaca712007-06-20 22:10:02 +00001866 VN.clear();
1867 createdExpressions.clear();
1868 availableOut.clear();
1869 anticipatedIn.clear();
Owen Andersonec5614b2007-07-06 20:29:43 +00001870 generatedPhis.clear();
1871
Owen Anderson3eaca712007-06-20 22:10:02 +00001872 bool changed_function = false;
1873
1874 // Phase 1: BuildSets
Owen Anderson9cb56012007-06-21 00:19:05 +00001875 // This phase calculates the AVAIL_OUT and ANTIC_IN sets
Owen Anderson6032a5b2007-06-26 23:29:41 +00001876 buildsets(F);
Owen Anderson3eaca712007-06-20 22:10:02 +00001877
1878 // Phase 2: Insert
Owen Anderson9cb56012007-06-21 00:19:05 +00001879 // This phase inserts values to make partially redundant values
1880 // fully redundant
Owen Anderson3eaca712007-06-20 22:10:02 +00001881 changed_function |= insertion(F);
1882
Owen Anderson12112af2007-06-06 01:27:49 +00001883 // Phase 3: Eliminate
Owen Anderson9cb56012007-06-21 00:19:05 +00001884 // This phase performs trivial full redundancy elimination
Owen Anderson3eaca712007-06-20 22:10:02 +00001885 changed_function |= elimination();
Owen Anderson8338ff52007-06-08 20:44:02 +00001886
Owen Anderson397d4052007-06-08 01:03:01 +00001887 // Phase 4: Cleanup
Owen Anderson9cb56012007-06-21 00:19:05 +00001888 // This phase cleans up values that were created solely
1889 // as leaders for expressions
Owen Anderson239e7122007-06-12 16:57:50 +00001890 cleanup();
Owen Anderson397d4052007-06-08 01:03:01 +00001891
Owen Anderson0304b2b2007-06-20 18:30:20 +00001892 return changed_function;
Owen Andersonea12a062007-05-29 21:53:49 +00001893}