blob: 4de0f3dc7254109ea654a5671e07ee7d51889517 [file] [log] [blame]
Owen Anderson85c40642007-07-24 17:55:58 +00001//===- GVN.cpp - Eliminate redundant values and loads ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-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 Anderson85c40642007-07-24 17:55:58 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This pass performs global value numbering to eliminate fully redundant
11// instructions. It also performs simple dead load elimination.
12//
13//===----------------------------------------------------------------------===//
14
15#define DEBUG_TYPE "gvn"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000016
Owen Anderson85c40642007-07-24 17:55:58 +000017#include "llvm/Transforms/Scalar.h"
Owen Anderson5d72a422007-07-25 19:57:03 +000018#include "llvm/BasicBlock.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000019#include "llvm/Constants.h"
Owen Anderson85c40642007-07-24 17:55:58 +000020#include "llvm/DerivedTypes.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000021#include "llvm/Function.h"
Owen Anderson8d272d52008-02-12 21:15:18 +000022#include "llvm/IntrinsicInst.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000023#include "llvm/Instructions.h"
Owen Anderson282dd322008-02-18 09:24:53 +000024#include "llvm/ParameterAttributes.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000025#include "llvm/Value.h"
Owen Anderson85c40642007-07-24 17:55:58 +000026#include "llvm/ADT/BitVector.h"
27#include "llvm/ADT/DenseMap.h"
28#include "llvm/ADT/DepthFirstIterator.h"
29#include "llvm/ADT/SmallPtrSet.h"
30#include "llvm/ADT/SmallVector.h"
31#include "llvm/ADT/Statistic.h"
Owen Anderson5e9366f2007-10-18 19:39:33 +000032#include "llvm/Analysis/Dominators.h"
33#include "llvm/Analysis/AliasAnalysis.h"
Owen Anderson85c40642007-07-24 17:55:58 +000034#include "llvm/Analysis/MemoryDependenceAnalysis.h"
35#include "llvm/Support/CFG.h"
36#include "llvm/Support/Compiler.h"
37using namespace llvm;
38
39//===----------------------------------------------------------------------===//
40// ValueTable Class
41//===----------------------------------------------------------------------===//
42
43/// This class holds the mapping between values and value numbers. It is used
44/// as an efficient mechanism to determine the expression-wise equivalence of
45/// two values.
46namespace {
47 struct VISIBILITY_HIDDEN Expression {
48 enum ExpressionOpcode { ADD, SUB, MUL, UDIV, SDIV, FDIV, UREM, SREM,
49 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
50 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
51 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
52 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
53 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
54 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
55 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
56 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson5e9366f2007-10-18 19:39:33 +000057 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, EMPTY,
Owen Anderson85c40642007-07-24 17:55:58 +000058 TOMBSTONE };
59
60 ExpressionOpcode opcode;
61 const Type* type;
62 uint32_t firstVN;
63 uint32_t secondVN;
64 uint32_t thirdVN;
65 SmallVector<uint32_t, 4> varargs;
Owen Anderson5e9366f2007-10-18 19:39:33 +000066 Value* function;
Owen Anderson85c40642007-07-24 17:55:58 +000067
68 Expression() { }
69 Expression(ExpressionOpcode o) : opcode(o) { }
70
71 bool operator==(const Expression &other) const {
72 if (opcode != other.opcode)
73 return false;
74 else if (opcode == EMPTY || opcode == TOMBSTONE)
75 return true;
76 else if (type != other.type)
77 return false;
Owen Anderson5e9366f2007-10-18 19:39:33 +000078 else if (function != other.function)
79 return false;
Owen Anderson85c40642007-07-24 17:55:58 +000080 else if (firstVN != other.firstVN)
81 return false;
82 else if (secondVN != other.secondVN)
83 return false;
84 else if (thirdVN != other.thirdVN)
85 return false;
86 else {
87 if (varargs.size() != other.varargs.size())
88 return false;
89
90 for (size_t i = 0; i < varargs.size(); ++i)
91 if (varargs[i] != other.varargs[i])
92 return false;
93
94 return true;
95 }
96 }
97
98 bool operator!=(const Expression &other) const {
99 if (opcode != other.opcode)
100 return true;
101 else if (opcode == EMPTY || opcode == TOMBSTONE)
102 return false;
103 else if (type != other.type)
104 return true;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000105 else if (function != other.function)
106 return true;
Owen Anderson85c40642007-07-24 17:55:58 +0000107 else if (firstVN != other.firstVN)
108 return true;
109 else if (secondVN != other.secondVN)
110 return true;
111 else if (thirdVN != other.thirdVN)
112 return true;
113 else {
114 if (varargs.size() != other.varargs.size())
115 return true;
116
117 for (size_t i = 0; i < varargs.size(); ++i)
118 if (varargs[i] != other.varargs[i])
119 return true;
120
121 return false;
122 }
123 }
124 };
125
126 class VISIBILITY_HIDDEN ValueTable {
127 private:
128 DenseMap<Value*, uint32_t> valueNumbering;
129 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000130 AliasAnalysis* AA;
Owen Anderson85c40642007-07-24 17:55:58 +0000131
132 uint32_t nextValueNumber;
133
134 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
135 Expression::ExpressionOpcode getOpcode(CmpInst* C);
136 Expression::ExpressionOpcode getOpcode(CastInst* C);
137 Expression create_expression(BinaryOperator* BO);
138 Expression create_expression(CmpInst* C);
139 Expression create_expression(ShuffleVectorInst* V);
140 Expression create_expression(ExtractElementInst* C);
141 Expression create_expression(InsertElementInst* V);
142 Expression create_expression(SelectInst* V);
143 Expression create_expression(CastInst* C);
144 Expression create_expression(GetElementPtrInst* G);
Owen Anderson5e9366f2007-10-18 19:39:33 +0000145 Expression create_expression(CallInst* C);
Owen Anderson85c40642007-07-24 17:55:58 +0000146 public:
Owen Anderson5e9366f2007-10-18 19:39:33 +0000147 ValueTable() : nextValueNumber(1) { }
Owen Anderson85c40642007-07-24 17:55:58 +0000148 uint32_t lookup_or_add(Value* V);
149 uint32_t lookup(Value* V) const;
150 void add(Value* V, uint32_t num);
151 void clear();
152 void erase(Value* v);
153 unsigned size();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000154 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Owen Anderson343797c2007-11-26 07:17:19 +0000155 uint32_t hash_operand(Value* v);
Owen Anderson85c40642007-07-24 17:55:58 +0000156 };
157}
158
159namespace llvm {
Chris Lattner92eea072007-09-17 18:34:04 +0000160template <> struct DenseMapInfo<Expression> {
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000161 static inline Expression getEmptyKey() {
162 return Expression(Expression::EMPTY);
163 }
164
165 static inline Expression getTombstoneKey() {
166 return Expression(Expression::TOMBSTONE);
167 }
Owen Anderson85c40642007-07-24 17:55:58 +0000168
169 static unsigned getHashValue(const Expression e) {
170 unsigned hash = e.opcode;
171
172 hash = e.firstVN + hash * 37;
173 hash = e.secondVN + hash * 37;
174 hash = e.thirdVN + hash * 37;
175
176 hash = (unsigned)((uintptr_t)e.type >> 4) ^
177 (unsigned)((uintptr_t)e.type >> 9) +
178 hash * 37;
179
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000180 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
181 E = e.varargs.end(); I != E; ++I)
Owen Anderson85c40642007-07-24 17:55:58 +0000182 hash = *I + hash * 37;
183
Owen Anderson5e9366f2007-10-18 19:39:33 +0000184 hash = (unsigned)((uintptr_t)e.function >> 4) ^
185 (unsigned)((uintptr_t)e.function >> 9) +
186 hash * 37;
187
Owen Anderson85c40642007-07-24 17:55:58 +0000188 return hash;
189 }
Chris Lattner92eea072007-09-17 18:34:04 +0000190 static bool isEqual(const Expression &LHS, const Expression &RHS) {
191 return LHS == RHS;
192 }
Owen Anderson85c40642007-07-24 17:55:58 +0000193 static bool isPod() { return true; }
194};
195}
196
197//===----------------------------------------------------------------------===//
198// ValueTable Internal Functions
199//===----------------------------------------------------------------------===//
200Expression::ExpressionOpcode
201 ValueTable::getOpcode(BinaryOperator* BO) {
202 switch(BO->getOpcode()) {
203 case Instruction::Add:
204 return Expression::ADD;
205 case Instruction::Sub:
206 return Expression::SUB;
207 case Instruction::Mul:
208 return Expression::MUL;
209 case Instruction::UDiv:
210 return Expression::UDIV;
211 case Instruction::SDiv:
212 return Expression::SDIV;
213 case Instruction::FDiv:
214 return Expression::FDIV;
215 case Instruction::URem:
216 return Expression::UREM;
217 case Instruction::SRem:
218 return Expression::SREM;
219 case Instruction::FRem:
220 return Expression::FREM;
221 case Instruction::Shl:
222 return Expression::SHL;
223 case Instruction::LShr:
224 return Expression::LSHR;
225 case Instruction::AShr:
226 return Expression::ASHR;
227 case Instruction::And:
228 return Expression::AND;
229 case Instruction::Or:
230 return Expression::OR;
231 case Instruction::Xor:
232 return Expression::XOR;
233
234 // THIS SHOULD NEVER HAPPEN
235 default:
236 assert(0 && "Binary operator with unknown opcode?");
237 return Expression::ADD;
238 }
239}
240
241Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
242 if (C->getOpcode() == Instruction::ICmp) {
243 switch (C->getPredicate()) {
244 case ICmpInst::ICMP_EQ:
245 return Expression::ICMPEQ;
246 case ICmpInst::ICMP_NE:
247 return Expression::ICMPNE;
248 case ICmpInst::ICMP_UGT:
249 return Expression::ICMPUGT;
250 case ICmpInst::ICMP_UGE:
251 return Expression::ICMPUGE;
252 case ICmpInst::ICMP_ULT:
253 return Expression::ICMPULT;
254 case ICmpInst::ICMP_ULE:
255 return Expression::ICMPULE;
256 case ICmpInst::ICMP_SGT:
257 return Expression::ICMPSGT;
258 case ICmpInst::ICMP_SGE:
259 return Expression::ICMPSGE;
260 case ICmpInst::ICMP_SLT:
261 return Expression::ICMPSLT;
262 case ICmpInst::ICMP_SLE:
263 return Expression::ICMPSLE;
264
265 // THIS SHOULD NEVER HAPPEN
266 default:
267 assert(0 && "Comparison with unknown predicate?");
268 return Expression::ICMPEQ;
269 }
270 } else {
271 switch (C->getPredicate()) {
272 case FCmpInst::FCMP_OEQ:
273 return Expression::FCMPOEQ;
274 case FCmpInst::FCMP_OGT:
275 return Expression::FCMPOGT;
276 case FCmpInst::FCMP_OGE:
277 return Expression::FCMPOGE;
278 case FCmpInst::FCMP_OLT:
279 return Expression::FCMPOLT;
280 case FCmpInst::FCMP_OLE:
281 return Expression::FCMPOLE;
282 case FCmpInst::FCMP_ONE:
283 return Expression::FCMPONE;
284 case FCmpInst::FCMP_ORD:
285 return Expression::FCMPORD;
286 case FCmpInst::FCMP_UNO:
287 return Expression::FCMPUNO;
288 case FCmpInst::FCMP_UEQ:
289 return Expression::FCMPUEQ;
290 case FCmpInst::FCMP_UGT:
291 return Expression::FCMPUGT;
292 case FCmpInst::FCMP_UGE:
293 return Expression::FCMPUGE;
294 case FCmpInst::FCMP_ULT:
295 return Expression::FCMPULT;
296 case FCmpInst::FCMP_ULE:
297 return Expression::FCMPULE;
298 case FCmpInst::FCMP_UNE:
299 return Expression::FCMPUNE;
300
301 // THIS SHOULD NEVER HAPPEN
302 default:
303 assert(0 && "Comparison with unknown predicate?");
304 return Expression::FCMPOEQ;
305 }
306 }
307}
308
309Expression::ExpressionOpcode
310 ValueTable::getOpcode(CastInst* C) {
311 switch(C->getOpcode()) {
312 case Instruction::Trunc:
313 return Expression::TRUNC;
314 case Instruction::ZExt:
315 return Expression::ZEXT;
316 case Instruction::SExt:
317 return Expression::SEXT;
318 case Instruction::FPToUI:
319 return Expression::FPTOUI;
320 case Instruction::FPToSI:
321 return Expression::FPTOSI;
322 case Instruction::UIToFP:
323 return Expression::UITOFP;
324 case Instruction::SIToFP:
325 return Expression::SITOFP;
326 case Instruction::FPTrunc:
327 return Expression::FPTRUNC;
328 case Instruction::FPExt:
329 return Expression::FPEXT;
330 case Instruction::PtrToInt:
331 return Expression::PTRTOINT;
332 case Instruction::IntToPtr:
333 return Expression::INTTOPTR;
334 case Instruction::BitCast:
335 return Expression::BITCAST;
336
337 // THIS SHOULD NEVER HAPPEN
338 default:
339 assert(0 && "Cast operator with unknown opcode?");
340 return Expression::BITCAST;
341 }
342}
343
Owen Anderson343797c2007-11-26 07:17:19 +0000344uint32_t ValueTable::hash_operand(Value* v) {
345 if (CallInst* CI = dyn_cast<CallInst>(v))
Duncan Sands00b24b52007-12-01 07:51:45 +0000346 if (!AA->doesNotAccessMemory(CI))
Owen Anderson343797c2007-11-26 07:17:19 +0000347 return nextValueNumber++;
348
349 return lookup_or_add(v);
350}
351
Owen Anderson5e9366f2007-10-18 19:39:33 +0000352Expression ValueTable::create_expression(CallInst* C) {
353 Expression e;
354
355 e.type = C->getType();
356 e.firstVN = 0;
357 e.secondVN = 0;
358 e.thirdVN = 0;
359 e.function = C->getCalledFunction();
360 e.opcode = Expression::CALL;
361
362 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
363 I != E; ++I)
Owen Anderson343797c2007-11-26 07:17:19 +0000364 e.varargs.push_back(hash_operand(*I));
Owen Anderson5e9366f2007-10-18 19:39:33 +0000365
366 return e;
367}
368
Owen Anderson85c40642007-07-24 17:55:58 +0000369Expression ValueTable::create_expression(BinaryOperator* BO) {
370 Expression e;
371
Owen Anderson343797c2007-11-26 07:17:19 +0000372 e.firstVN = hash_operand(BO->getOperand(0));
373 e.secondVN = hash_operand(BO->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000374 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000375 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000376 e.type = BO->getType();
377 e.opcode = getOpcode(BO);
378
379 return e;
380}
381
382Expression ValueTable::create_expression(CmpInst* C) {
383 Expression e;
384
Owen Anderson343797c2007-11-26 07:17:19 +0000385 e.firstVN = hash_operand(C->getOperand(0));
386 e.secondVN = hash_operand(C->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000387 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000388 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000389 e.type = C->getType();
390 e.opcode = getOpcode(C);
391
392 return e;
393}
394
395Expression ValueTable::create_expression(CastInst* C) {
396 Expression e;
397
Owen Anderson343797c2007-11-26 07:17:19 +0000398 e.firstVN = hash_operand(C->getOperand(0));
Owen Anderson85c40642007-07-24 17:55:58 +0000399 e.secondVN = 0;
400 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000401 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000402 e.type = C->getType();
403 e.opcode = getOpcode(C);
404
405 return e;
406}
407
408Expression ValueTable::create_expression(ShuffleVectorInst* S) {
409 Expression e;
410
Owen Anderson343797c2007-11-26 07:17:19 +0000411 e.firstVN = hash_operand(S->getOperand(0));
412 e.secondVN = hash_operand(S->getOperand(1));
413 e.thirdVN = hash_operand(S->getOperand(2));
Owen Anderson5e9366f2007-10-18 19:39:33 +0000414 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000415 e.type = S->getType();
416 e.opcode = Expression::SHUFFLE;
417
418 return e;
419}
420
421Expression ValueTable::create_expression(ExtractElementInst* E) {
422 Expression e;
423
Owen Anderson343797c2007-11-26 07:17:19 +0000424 e.firstVN = hash_operand(E->getOperand(0));
425 e.secondVN = hash_operand(E->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000426 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000427 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000428 e.type = E->getType();
429 e.opcode = Expression::EXTRACT;
430
431 return e;
432}
433
434Expression ValueTable::create_expression(InsertElementInst* I) {
435 Expression e;
436
Owen Anderson343797c2007-11-26 07:17:19 +0000437 e.firstVN = hash_operand(I->getOperand(0));
438 e.secondVN = hash_operand(I->getOperand(1));
439 e.thirdVN = hash_operand(I->getOperand(2));
Owen Anderson5e9366f2007-10-18 19:39:33 +0000440 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000441 e.type = I->getType();
442 e.opcode = Expression::INSERT;
443
444 return e;
445}
446
447Expression ValueTable::create_expression(SelectInst* I) {
448 Expression e;
449
Owen Anderson343797c2007-11-26 07:17:19 +0000450 e.firstVN = hash_operand(I->getCondition());
451 e.secondVN = hash_operand(I->getTrueValue());
452 e.thirdVN = hash_operand(I->getFalseValue());
Owen Anderson5e9366f2007-10-18 19:39:33 +0000453 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000454 e.type = I->getType();
455 e.opcode = Expression::SELECT;
456
457 return e;
458}
459
460Expression ValueTable::create_expression(GetElementPtrInst* G) {
461 Expression e;
462
Owen Anderson343797c2007-11-26 07:17:19 +0000463 e.firstVN = hash_operand(G->getPointerOperand());
Owen Anderson85c40642007-07-24 17:55:58 +0000464 e.secondVN = 0;
465 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000466 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000467 e.type = G->getType();
468 e.opcode = Expression::GEP;
469
470 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
471 I != E; ++I)
Owen Anderson343797c2007-11-26 07:17:19 +0000472 e.varargs.push_back(hash_operand(*I));
Owen Anderson85c40642007-07-24 17:55:58 +0000473
474 return e;
475}
476
477//===----------------------------------------------------------------------===//
478// ValueTable External Functions
479//===----------------------------------------------------------------------===//
480
481/// lookup_or_add - Returns the value number for the specified value, assigning
482/// it a new number if it did not have one before.
483uint32_t ValueTable::lookup_or_add(Value* V) {
484 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
485 if (VI != valueNumbering.end())
486 return VI->second;
487
Owen Anderson5e9366f2007-10-18 19:39:33 +0000488 if (CallInst* C = dyn_cast<CallInst>(V)) {
Duncan Sands00b24b52007-12-01 07:51:45 +0000489 if (AA->onlyReadsMemory(C)) { // includes doesNotAccessMemory
Owen Anderson5e9366f2007-10-18 19:39:33 +0000490 Expression e = create_expression(C);
491
492 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
493 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 {
503 valueNumbering.insert(std::make_pair(V, nextValueNumber));
504 return nextValueNumber++;
505 }
506 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Anderson85c40642007-07-24 17:55:58 +0000507 Expression e = create_expression(BO);
508
509 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
510 if (EI != expressionNumbering.end()) {
511 valueNumbering.insert(std::make_pair(V, EI->second));
512 return EI->second;
513 } else {
514 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
515 valueNumbering.insert(std::make_pair(V, nextValueNumber));
516
517 return nextValueNumber++;
518 }
519 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
520 Expression e = create_expression(C);
521
522 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
523 if (EI != expressionNumbering.end()) {
524 valueNumbering.insert(std::make_pair(V, EI->second));
525 return EI->second;
526 } else {
527 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
528 valueNumbering.insert(std::make_pair(V, nextValueNumber));
529
530 return nextValueNumber++;
531 }
532 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
533 Expression e = create_expression(U);
534
535 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
536 if (EI != expressionNumbering.end()) {
537 valueNumbering.insert(std::make_pair(V, EI->second));
538 return EI->second;
539 } else {
540 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
541 valueNumbering.insert(std::make_pair(V, nextValueNumber));
542
543 return nextValueNumber++;
544 }
545 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
546 Expression e = create_expression(U);
547
548 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
549 if (EI != expressionNumbering.end()) {
550 valueNumbering.insert(std::make_pair(V, EI->second));
551 return EI->second;
552 } else {
553 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
554 valueNumbering.insert(std::make_pair(V, nextValueNumber));
555
556 return nextValueNumber++;
557 }
558 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
559 Expression e = create_expression(U);
560
561 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
562 if (EI != expressionNumbering.end()) {
563 valueNumbering.insert(std::make_pair(V, EI->second));
564 return EI->second;
565 } else {
566 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
567 valueNumbering.insert(std::make_pair(V, nextValueNumber));
568
569 return nextValueNumber++;
570 }
571 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
572 Expression e = create_expression(U);
573
574 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
575 if (EI != expressionNumbering.end()) {
576 valueNumbering.insert(std::make_pair(V, EI->second));
577 return EI->second;
578 } else {
579 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
580 valueNumbering.insert(std::make_pair(V, nextValueNumber));
581
582 return nextValueNumber++;
583 }
584 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
585 Expression e = create_expression(U);
586
587 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
588 if (EI != expressionNumbering.end()) {
589 valueNumbering.insert(std::make_pair(V, EI->second));
590 return EI->second;
591 } else {
592 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
593 valueNumbering.insert(std::make_pair(V, nextValueNumber));
594
595 return nextValueNumber++;
596 }
597 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
598 Expression e = create_expression(U);
599
600 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
601 if (EI != expressionNumbering.end()) {
602 valueNumbering.insert(std::make_pair(V, EI->second));
603 return EI->second;
604 } else {
605 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
606 valueNumbering.insert(std::make_pair(V, nextValueNumber));
607
608 return nextValueNumber++;
609 }
610 } else {
611 valueNumbering.insert(std::make_pair(V, nextValueNumber));
612 return nextValueNumber++;
613 }
614}
615
616/// lookup - Returns the value number of the specified value. Fails if
617/// the value has not yet been numbered.
618uint32_t ValueTable::lookup(Value* V) const {
619 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
620 if (VI != valueNumbering.end())
621 return VI->second;
622 else
623 assert(0 && "Value not numbered?");
624
625 return 0;
626}
627
628/// clear - Remove all entries from the ValueTable
629void ValueTable::clear() {
630 valueNumbering.clear();
631 expressionNumbering.clear();
632 nextValueNumber = 1;
633}
634
Owen Anderson5aff8002007-07-31 23:27:13 +0000635/// erase - Remove a value from the value numbering
636void ValueTable::erase(Value* V) {
637 valueNumbering.erase(V);
638}
639
Owen Anderson85c40642007-07-24 17:55:58 +0000640//===----------------------------------------------------------------------===//
641// ValueNumberedSet Class
642//===----------------------------------------------------------------------===//
643namespace {
644class ValueNumberedSet {
645 private:
646 SmallPtrSet<Value*, 8> contents;
647 BitVector numbers;
648 public:
649 ValueNumberedSet() { numbers.resize(1); }
650 ValueNumberedSet(const ValueNumberedSet& other) {
651 numbers = other.numbers;
652 contents = other.contents;
653 }
654
655 typedef SmallPtrSet<Value*, 8>::iterator iterator;
656
657 iterator begin() { return contents.begin(); }
658 iterator end() { return contents.end(); }
659
660 bool insert(Value* v) { return contents.insert(v); }
661 void insert(iterator I, iterator E) { contents.insert(I, E); }
662 void erase(Value* v) { contents.erase(v); }
663 unsigned count(Value* v) { return contents.count(v); }
664 size_t size() { return contents.size(); }
665
666 void set(unsigned i) {
667 if (i >= numbers.size())
668 numbers.resize(i+1);
669
670 numbers.set(i);
671 }
672
673 void operator=(const ValueNumberedSet& other) {
674 contents = other.contents;
675 numbers = other.numbers;
676 }
677
678 void reset(unsigned i) {
679 if (i < numbers.size())
680 numbers.reset(i);
681 }
682
683 bool test(unsigned i) {
684 if (i >= numbers.size())
685 return false;
686
687 return numbers.test(i);
688 }
689
690 void clear() {
691 contents.clear();
692 numbers.clear();
693 }
694};
695}
696
697//===----------------------------------------------------------------------===//
698// GVN Pass
699//===----------------------------------------------------------------------===//
700
701namespace {
702
703 class VISIBILITY_HIDDEN GVN : public FunctionPass {
704 bool runOnFunction(Function &F);
705 public:
706 static char ID; // Pass identification, replacement for typeid
707 GVN() : FunctionPass((intptr_t)&ID) { }
708
709 private:
710 ValueTable VN;
711
712 DenseMap<BasicBlock*, ValueNumberedSet> availableOut;
713
Owen Anderson5b299672007-08-07 23:12:31 +0000714 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
715 PhiMapType phiMap;
716
717
Owen Anderson85c40642007-07-24 17:55:58 +0000718 // This transformation requires dominator postdominator info
719 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
720 AU.setPreservesCFG();
721 AU.addRequired<DominatorTree>();
722 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000723 AU.addRequired<AliasAnalysis>();
724 AU.addPreserved<AliasAnalysis>();
Owen Anderson85c40642007-07-24 17:55:58 +0000725 AU.addPreserved<MemoryDependenceAnalysis>();
726 }
727
728 // Helper fuctions
729 // FIXME: eliminate or document these better
730 Value* find_leader(ValueNumberedSet& vals, uint32_t v) ;
731 void val_insert(ValueNumberedSet& s, Value* v);
732 bool processLoad(LoadInst* L,
733 DenseMap<Value*, LoadInst*>& lastLoad,
734 SmallVector<Instruction*, 4>& toErase);
735 bool processInstruction(Instruction* I,
736 ValueNumberedSet& currAvail,
737 DenseMap<Value*, LoadInst*>& lastSeenLoad,
738 SmallVector<Instruction*, 4>& toErase);
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000739 bool processNonLocalLoad(LoadInst* L,
740 SmallVector<Instruction*, 4>& toErase);
Owen Andersonba958332008-02-19 03:09:45 +0000741 bool processMemCpy(MemCpyInst* M, MemCpyInst* MDep,
742 SmallVector<Instruction*, 4>& toErase);
Owen Anderson282dd322008-02-18 09:24:53 +0000743 bool performReturnSlotOptzn(MemCpyInst* cpy, CallInst* C,
744 SmallVector<Instruction*, 4>& toErase);
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000745 Value *GetValueForBlock(BasicBlock *BB, LoadInst* orig,
Owen Andersonc6a31b92007-08-02 17:56:05 +0000746 DenseMap<BasicBlock*, Value*> &Phis,
747 bool top_level = false);
Owen Anderson5d72a422007-07-25 19:57:03 +0000748 void dump(DenseMap<BasicBlock*, Value*>& d);
Owen Andersonbe168b32007-08-14 18:04:11 +0000749 bool iterateOnFunction(Function &F);
Owen Andersone02ad522007-08-16 22:51:56 +0000750 Value* CollapsePhi(PHINode* p);
Owen Anderson19625972007-09-16 08:04:16 +0000751 bool isSafeReplacement(PHINode* p, Instruction* inst);
Owen Anderson85c40642007-07-24 17:55:58 +0000752 };
753
754 char GVN::ID = 0;
755
756}
757
758// createGVNPass - The public interface to this file...
759FunctionPass *llvm::createGVNPass() { return new GVN(); }
760
761static RegisterPass<GVN> X("gvn",
762 "Global Value Numbering");
763
764STATISTIC(NumGVNInstr, "Number of instructions deleted");
765STATISTIC(NumGVNLoad, "Number of loads deleted");
766
767/// find_leader - Given a set and a value number, return the first
768/// element of the set with that value number, or 0 if no such element
769/// is present
770Value* GVN::find_leader(ValueNumberedSet& vals, uint32_t v) {
771 if (!vals.test(v))
772 return 0;
773
774 for (ValueNumberedSet::iterator I = vals.begin(), E = vals.end();
775 I != E; ++I)
776 if (v == VN.lookup(*I))
777 return *I;
778
779 assert(0 && "No leader found, but present bit is set?");
780 return 0;
781}
782
783/// val_insert - Insert a value into a set only if there is not a value
784/// with the same value number already in the set
785void GVN::val_insert(ValueNumberedSet& s, Value* v) {
786 uint32_t num = VN.lookup(v);
787 if (!s.test(num))
788 s.insert(v);
789}
790
Owen Anderson5d72a422007-07-25 19:57:03 +0000791void GVN::dump(DenseMap<BasicBlock*, Value*>& d) {
792 printf("{\n");
793 for (DenseMap<BasicBlock*, Value*>::iterator I = d.begin(),
794 E = d.end(); I != E; ++I) {
795 if (I->second == MemoryDependenceAnalysis::None)
796 printf("None\n");
797 else
798 I->second->dump();
799 }
800 printf("}\n");
801}
802
Owen Andersone02ad522007-08-16 22:51:56 +0000803Value* GVN::CollapsePhi(PHINode* p) {
804 DominatorTree &DT = getAnalysis<DominatorTree>();
805 Value* constVal = p->hasConstantValue();
806
807 if (constVal) {
808 if (Instruction* inst = dyn_cast<Instruction>(constVal)) {
809 if (DT.dominates(inst, p))
Owen Anderson19625972007-09-16 08:04:16 +0000810 if (isSafeReplacement(p, inst))
811 return inst;
Owen Andersone02ad522007-08-16 22:51:56 +0000812 } else {
813 return constVal;
814 }
815 }
816
817 return 0;
818}
Owen Anderson5d72a422007-07-25 19:57:03 +0000819
Owen Anderson19625972007-09-16 08:04:16 +0000820bool GVN::isSafeReplacement(PHINode* p, Instruction* inst) {
821 if (!isa<PHINode>(inst))
822 return true;
823
824 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
825 UI != E; ++UI)
826 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
827 if (use_phi->getParent() == inst->getParent())
828 return false;
829
830 return true;
831}
832
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000833/// GetValueForBlock - Get the value to use within the specified basic block.
834/// available values are in Phis.
835Value *GVN::GetValueForBlock(BasicBlock *BB, LoadInst* orig,
Owen Andersonc6a31b92007-08-02 17:56:05 +0000836 DenseMap<BasicBlock*, Value*> &Phis,
837 bool top_level) {
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000838
839 // If we have already computed this value, return the previously computed val.
Owen Andersoned7f9932007-08-03 19:59:35 +0000840 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
841 if (V != Phis.end() && !top_level) return V->second;
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000842
Owen Anderson3f75d122007-08-01 22:01:54 +0000843 BasicBlock* singlePred = BB->getSinglePredecessor();
Owen Anderson30463f12007-08-03 11:03:26 +0000844 if (singlePred) {
Owen Andersoned7f9932007-08-03 19:59:35 +0000845 Value *ret = GetValueForBlock(singlePred, orig, Phis);
846 Phis[BB] = ret;
847 return ret;
Owen Anderson30463f12007-08-03 11:03:26 +0000848 }
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000849 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
850 // now, then get values to fill in the incoming values for the PHI.
851 PHINode *PN = new PHINode(orig->getType(), orig->getName()+".rle",
852 BB->begin());
853 PN->reserveOperandSpace(std::distance(pred_begin(BB), pred_end(BB)));
Owen Andersoned7f9932007-08-03 19:59:35 +0000854
855 if (Phis.count(BB) == 0)
856 Phis.insert(std::make_pair(BB, PN));
Owen Anderson48a2c562007-07-30 16:57:08 +0000857
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000858 // Fill in the incoming values for the block.
Owen Anderson9f577412007-07-31 17:43:14 +0000859 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
860 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Anderson9f577412007-07-31 17:43:14 +0000861
862 PN->addIncoming(val, *PI);
863 }
Nick Lewycky8fba1d02008-02-14 07:11:24 +0000864 AliasAnalysis& AA = getAnalysis<AliasAnalysis>();
865 AA.copyValue(orig, PN);
Owen Anderson9f577412007-07-31 17:43:14 +0000866
Owen Andersone0143452007-08-16 22:02:55 +0000867 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersone02ad522007-08-16 22:51:56 +0000868 Value* v = CollapsePhi(PN);
Owen Andersonf631bb62007-08-14 18:16:29 +0000869 if (v) {
Owen Andersone02ad522007-08-16 22:51:56 +0000870 MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
Owen Andersonf631bb62007-08-14 18:16:29 +0000871
Owen Andersone02ad522007-08-16 22:51:56 +0000872 MD.removeInstruction(PN);
873 PN->replaceAllUsesWith(v);
Owen Andersonf631bb62007-08-14 18:16:29 +0000874
Owen Andersone02ad522007-08-16 22:51:56 +0000875 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
876 E = Phis.end(); I != E; ++I)
877 if (I->second == PN)
878 I->second = v;
Owen Andersonf631bb62007-08-14 18:16:29 +0000879
Owen Andersone02ad522007-08-16 22:51:56 +0000880 PN->eraseFromParent();
Owen Andersonf631bb62007-08-14 18:16:29 +0000881
Owen Andersone02ad522007-08-16 22:51:56 +0000882 Phis[BB] = v;
Owen Andersonf631bb62007-08-14 18:16:29 +0000883
Owen Andersone02ad522007-08-16 22:51:56 +0000884 return v;
Owen Anderson9f577412007-07-31 17:43:14 +0000885 }
886
Owen Andersone0143452007-08-16 22:02:55 +0000887 // Cache our phi construction results
Owen Anderson5b299672007-08-07 23:12:31 +0000888 phiMap[orig->getPointerOperand()].insert(PN);
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000889 return PN;
Owen Anderson5d72a422007-07-25 19:57:03 +0000890}
891
Owen Andersone0143452007-08-16 22:02:55 +0000892/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
893/// non-local by performing PHI construction.
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000894bool GVN::processNonLocalLoad(LoadInst* L,
895 SmallVector<Instruction*, 4>& toErase) {
Owen Anderson5d72a422007-07-25 19:57:03 +0000896 MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
897
Owen Andersone0143452007-08-16 22:02:55 +0000898 // Find the non-local dependencies of the load
Owen Anderson5d72a422007-07-25 19:57:03 +0000899 DenseMap<BasicBlock*, Value*> deps;
Owen Anderson3f75d122007-08-01 22:01:54 +0000900 MD.getNonLocalDependency(L, deps);
Owen Anderson5d72a422007-07-25 19:57:03 +0000901
902 DenseMap<BasicBlock*, Value*> repl;
Owen Anderson5b299672007-08-07 23:12:31 +0000903
Owen Andersone0143452007-08-16 22:02:55 +0000904 // Filter out useless results (non-locals, etc)
Owen Anderson5d72a422007-07-25 19:57:03 +0000905 for (DenseMap<BasicBlock*, Value*>::iterator I = deps.begin(), E = deps.end();
906 I != E; ++I)
907 if (I->second == MemoryDependenceAnalysis::None) {
908 return false;
Owen Andersonb484d1f2007-07-30 17:29:24 +0000909 } else if (I->second == MemoryDependenceAnalysis::NonLocal) {
910 continue;
Owen Anderson05749072007-09-21 03:53:52 +0000911 } else if (StoreInst* S = dyn_cast<StoreInst>(I->second)) {
Owen Anderson5d72a422007-07-25 19:57:03 +0000912 if (S->getPointerOperand() == L->getPointerOperand())
Owen Anderson5b299672007-08-07 23:12:31 +0000913 repl[I->first] = S->getOperand(0);
Owen Anderson5d72a422007-07-25 19:57:03 +0000914 else
915 return false;
916 } else if (LoadInst* LD = dyn_cast<LoadInst>(I->second)) {
917 if (LD->getPointerOperand() == L->getPointerOperand())
Owen Anderson5b299672007-08-07 23:12:31 +0000918 repl[I->first] = LD;
Owen Anderson5d72a422007-07-25 19:57:03 +0000919 else
920 return false;
921 } else {
922 return false;
923 }
924
Owen Andersone0143452007-08-16 22:02:55 +0000925 // Use cached PHI construction information from previous runs
Owen Anderson5b299672007-08-07 23:12:31 +0000926 SmallPtrSet<Instruction*, 4>& p = phiMap[L->getPointerOperand()];
927 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
928 I != E; ++I) {
929 if ((*I)->getParent() == L->getParent()) {
930 MD.removeInstruction(L);
931 L->replaceAllUsesWith(*I);
932 toErase.push_back(L);
933 NumGVNLoad++;
934
935 return true;
936 } else {
937 repl.insert(std::make_pair((*I)->getParent(), *I));
938 }
939 }
940
Owen Andersone0143452007-08-16 22:02:55 +0000941 // Perform PHI construction
Owen Anderson6ce3ae22007-07-25 22:03:06 +0000942 SmallPtrSet<BasicBlock*, 4> visited;
Owen Andersonc6a31b92007-08-02 17:56:05 +0000943 Value* v = GetValueForBlock(L->getParent(), L, repl, true);
Owen Anderson5d72a422007-07-25 19:57:03 +0000944
945 MD.removeInstruction(L);
946 L->replaceAllUsesWith(v);
947 toErase.push_back(L);
Owen Anderson5b299672007-08-07 23:12:31 +0000948 NumGVNLoad++;
Owen Anderson5d72a422007-07-25 19:57:03 +0000949
950 return true;
951}
952
Owen Andersone0143452007-08-16 22:02:55 +0000953/// processLoad - Attempt to eliminate a load, first by eliminating it
954/// locally, and then attempting non-local elimination if that fails.
Owen Anderson85c40642007-07-24 17:55:58 +0000955bool GVN::processLoad(LoadInst* L,
956 DenseMap<Value*, LoadInst*>& lastLoad,
957 SmallVector<Instruction*, 4>& toErase) {
958 if (L->isVolatile()) {
959 lastLoad[L->getPointerOperand()] = L;
960 return false;
961 }
962
963 Value* pointer = L->getPointerOperand();
964 LoadInst*& last = lastLoad[pointer];
965
966 // ... to a pointer that has been loaded from before...
967 MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
Owen Andersoncc8b3a82007-08-14 17:59:48 +0000968 bool removedNonLocal = false;
Owen Anderson935e39b2007-08-09 04:42:44 +0000969 Instruction* dep = MD.getDependency(L);
Owen Anderson5d72a422007-07-25 19:57:03 +0000970 if (dep == MemoryDependenceAnalysis::NonLocal &&
Owen Andersoncc8b3a82007-08-14 17:59:48 +0000971 L->getParent() != &L->getParent()->getParent()->getEntryBlock()) {
972 removedNonLocal = processNonLocalLoad(L, toErase);
973
974 if (!removedNonLocal)
975 last = L;
976
977 return removedNonLocal;
978 }
979
980
Owen Anderson85c40642007-07-24 17:55:58 +0000981 bool deletedLoad = false;
982
Owen Andersone0143452007-08-16 22:02:55 +0000983 // Walk up the dependency chain until we either find
984 // a dependency we can use, or we can't walk any further
Owen Anderson85c40642007-07-24 17:55:58 +0000985 while (dep != MemoryDependenceAnalysis::None &&
986 dep != MemoryDependenceAnalysis::NonLocal &&
987 (isa<LoadInst>(dep) || isa<StoreInst>(dep))) {
988 // ... that depends on a store ...
989 if (StoreInst* S = dyn_cast<StoreInst>(dep)) {
990 if (S->getPointerOperand() == pointer) {
991 // Remove it!
992 MD.removeInstruction(L);
993
994 L->replaceAllUsesWith(S->getOperand(0));
995 toErase.push_back(L);
996 deletedLoad = true;
997 NumGVNLoad++;
998 }
999
1000 // Whether we removed it or not, we can't
1001 // go any further
1002 break;
1003 } else if (!last) {
1004 // If we don't depend on a store, and we haven't
1005 // been loaded before, bail.
1006 break;
1007 } else if (dep == last) {
1008 // Remove it!
1009 MD.removeInstruction(L);
1010
1011 L->replaceAllUsesWith(last);
1012 toErase.push_back(L);
1013 deletedLoad = true;
1014 NumGVNLoad++;
1015
1016 break;
1017 } else {
Owen Anderson935e39b2007-08-09 04:42:44 +00001018 dep = MD.getDependency(L, dep);
Owen Anderson85c40642007-07-24 17:55:58 +00001019 }
1020 }
Eli Friedman350307f2008-02-12 12:08:14 +00001021
1022 if (dep != MemoryDependenceAnalysis::None &&
1023 dep != MemoryDependenceAnalysis::NonLocal &&
1024 isa<AllocationInst>(dep)) {
1025 // Check that this load is actually from the
1026 // allocation we found
1027 Value* v = L->getOperand(0);
1028 while (true) {
1029 if (BitCastInst *BC = dyn_cast<BitCastInst>(v))
1030 v = BC->getOperand(0);
1031 else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(v))
1032 v = GEP->getOperand(0);
1033 else
1034 break;
1035 }
1036 if (v == dep) {
1037 // If this load depends directly on an allocation, there isn't
1038 // anything stored there; therefore, we can optimize this load
1039 // to undef.
1040 MD.removeInstruction(L);
1041
1042 L->replaceAllUsesWith(UndefValue::get(L->getType()));
1043 toErase.push_back(L);
1044 deletedLoad = true;
1045 NumGVNLoad++;
1046 }
1047 }
1048
Owen Anderson85c40642007-07-24 17:55:58 +00001049 if (!deletedLoad)
1050 last = L;
1051
1052 return deletedLoad;
1053}
1054
Owen Anderson282dd322008-02-18 09:24:53 +00001055/// performReturnSlotOptzn - takes a memcpy and a call that it depends on,
1056/// and checks for the possibility of a return slot optimization by having
1057/// the call write its result directly into the callees return parameter
1058/// rather than using memcpy
1059bool GVN::performReturnSlotOptzn(MemCpyInst* cpy, CallInst* C,
1060 SmallVector<Instruction*, 4>& toErase) {
1061 // Check that we're copying to an argument...
1062 Value* cpyDest = cpy->getDest();
1063 if (!isa<Argument>(cpyDest))
1064 return false;
1065
1066 // And that the argument is the return slot
1067 Argument* sretArg = cast<Argument>(cpyDest);
1068 if (!sretArg->hasStructRetAttr())
1069 return false;
1070
1071 // Make sure the return slot is otherwise dead
1072 std::set<User*> useList(sretArg->use_begin(), sretArg->use_end());
1073 while (!useList.empty()) {
1074 User* UI = *useList.begin();
1075
1076 if (isa<GetElementPtrInst>(UI) || isa<BitCastInst>(UI)) {
1077 useList.insert(UI->use_begin(), UI->use_end());
1078 useList.erase(UI);
1079 } else if (UI == cpy)
1080 useList.erase(UI);
1081 else
1082 return false;
1083 }
1084
1085 // Make sure the call cannot modify the return slot in some unpredicted way
1086 AliasAnalysis& AA = getAnalysis<AliasAnalysis>();
1087 if (AA.getModRefInfo(C, cpy->getRawDest(), ~0UL) != AliasAnalysis::NoModRef)
1088 return false;
1089
1090 // If all checks passed, then we can perform the transformation
1091 CallSite CS = CallSite::get(C);
Owen Anderson50ae8ca2008-02-19 03:15:29 +00001092 if (CS.getArgument(0)->getType() != cpyDest->getType())
1093 return false;
Owen Anderson282dd322008-02-18 09:24:53 +00001094
Owen Anderson50ae8ca2008-02-19 03:15:29 +00001095 CS.setArgument(0, cpyDest);
Owen Anderson282dd322008-02-18 09:24:53 +00001096
1097 MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
1098 MD.dropInstruction(C);
1099
1100 // Remove the memcpy
1101 toErase.push_back(cpy);
1102
1103 return true;
1104}
1105
Owen Anderson8d272d52008-02-12 21:15:18 +00001106/// processMemCpy - perform simplication of memcpy's. If we have memcpy A which
1107/// copies X to Y, and memcpy B which copies Y to Z, then we can rewrite B to be
1108/// a memcpy from X to Z (or potentially a memmove, depending on circumstances).
1109/// This allows later passes to remove the first memcpy altogether.
Owen Andersonba958332008-02-19 03:09:45 +00001110bool GVN::processMemCpy(MemCpyInst* M, MemCpyInst* MDep,
Owen Anderson8d272d52008-02-12 21:15:18 +00001111 SmallVector<Instruction*, 4>& toErase) {
Owen Anderson8d272d52008-02-12 21:15:18 +00001112 // We can only transforms memcpy's where the dest of one is the source of the
1113 // other
Owen Anderson8d272d52008-02-12 21:15:18 +00001114 if (M->getSource() != MDep->getDest())
1115 return false;
1116
1117 // Second, the length of the memcpy's must be the same, or the preceeding one
1118 // must be larger than the following one.
1119 ConstantInt* C1 = dyn_cast<ConstantInt>(MDep->getLength());
1120 ConstantInt* C2 = dyn_cast<ConstantInt>(M->getLength());
1121 if (!C1 || !C2)
1122 return false;
1123
1124 uint64_t CpySize = C1->getValue().getZExtValue();
1125 uint64_t DepSize = C2->getValue().getZExtValue();
1126
1127 if (DepSize < CpySize)
1128 return false;
1129
1130 // Finally, we have to make sure that the dest of the second does not
1131 // alias the source of the first
1132 AliasAnalysis& AA = getAnalysis<AliasAnalysis>();
1133 if (AA.alias(M->getRawDest(), CpySize, MDep->getRawSource(), DepSize) !=
1134 AliasAnalysis::NoAlias)
1135 return false;
1136 else if (AA.alias(M->getRawDest(), CpySize, M->getRawSource(), CpySize) !=
1137 AliasAnalysis::NoAlias)
1138 return false;
1139 else if (AA.alias(MDep->getRawDest(), DepSize, MDep->getRawSource(), DepSize)
1140 != AliasAnalysis::NoAlias)
1141 return false;
1142
1143 // If all checks passed, then we can transform these memcpy's
Owen Andersonba958332008-02-19 03:09:45 +00001144 Function* MemCpyFun = Intrinsic::getDeclaration(
Owen Anderson8d272d52008-02-12 21:15:18 +00001145 M->getParent()->getParent()->getParent(),
Owen Andersonba958332008-02-19 03:09:45 +00001146 M->getIntrinsicID());
Owen Anderson8d272d52008-02-12 21:15:18 +00001147
1148 std::vector<Value*> args;
1149 args.push_back(M->getRawDest());
1150 args.push_back(MDep->getRawSource());
1151 args.push_back(M->getLength());
1152 args.push_back(M->getAlignment());
1153
Owen Andersonba958332008-02-19 03:09:45 +00001154 CallInst* C = new CallInst(MemCpyFun, args.begin(), args.end(), "", M);
Owen Anderson8d272d52008-02-12 21:15:18 +00001155
Owen Andersonba958332008-02-19 03:09:45 +00001156 MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
Owen Anderson8d272d52008-02-12 21:15:18 +00001157 if (MD.getDependency(C) == MDep) {
1158 MD.dropInstruction(M);
1159 toErase.push_back(M);
1160 return true;
1161 } else {
1162 MD.removeInstruction(C);
1163 toErase.push_back(C);
1164 return false;
1165 }
1166}
1167
Owen Andersonf631bb62007-08-14 18:16:29 +00001168/// processInstruction - When calculating availability, handle an instruction
Owen Anderson85c40642007-07-24 17:55:58 +00001169/// by inserting it into the appropriate sets
1170bool GVN::processInstruction(Instruction* I,
1171 ValueNumberedSet& currAvail,
1172 DenseMap<Value*, LoadInst*>& lastSeenLoad,
1173 SmallVector<Instruction*, 4>& toErase) {
1174 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
1175 return processLoad(L, lastSeenLoad, toErase);
Owen Anderson8d272d52008-02-12 21:15:18 +00001176 } else if (MemCpyInst* M = dyn_cast<MemCpyInst>(I)) {
Owen Andersonba958332008-02-19 03:09:45 +00001177 MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
1178
1179 // The are two possible optimizations we can do for memcpy:
1180 // a) memcpy-memcpy xform which exposes redundance for DSE
1181 // b) call-memcpy xform for sret return slot optimization
1182 Instruction* dep = MD.getDependency(M);
1183 if (dep == MemoryDependenceAnalysis::None ||
1184 dep == MemoryDependenceAnalysis::NonLocal)
1185 return false;
1186 else if (CallInst* C = dyn_cast<CallInst>(dep)) {
1187 if (!isa<MemCpyInst>(C))
1188 return performReturnSlotOptzn(M, C, toErase);
1189 } else if (!isa<MemCpyInst>(dep))
1190 return false;
1191
1192 return processMemCpy(M, cast<MemCpyInst>(dep), toErase);
Owen Anderson85c40642007-07-24 17:55:58 +00001193 }
1194
1195 unsigned num = VN.lookup_or_add(I);
1196
Owen Andersone0143452007-08-16 22:02:55 +00001197 // Collapse PHI nodes
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001198 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersone02ad522007-08-16 22:51:56 +00001199 Value* constVal = CollapsePhi(p);
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001200
1201 if (constVal) {
Owen Andersone02ad522007-08-16 22:51:56 +00001202 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1203 PI != PE; ++PI)
1204 if (PI->second.count(p))
1205 PI->second.erase(p);
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001206
Owen Andersone02ad522007-08-16 22:51:56 +00001207 p->replaceAllUsesWith(constVal);
1208 toErase.push_back(p);
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001209 }
Owen Andersone0143452007-08-16 22:02:55 +00001210 // Perform value-number based elimination
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001211 } else if (currAvail.test(num)) {
Owen Anderson85c40642007-07-24 17:55:58 +00001212 Value* repl = find_leader(currAvail, num);
1213
Owen Anderson8b6f04e2007-11-26 02:26:36 +00001214 if (CallInst* CI = dyn_cast<CallInst>(I)) {
1215 AliasAnalysis& AA = getAnalysis<AliasAnalysis>();
Duncan Sands00b24b52007-12-01 07:51:45 +00001216 if (!AA.doesNotAccessMemory(CI)) {
Owen Anderson8b6f04e2007-11-26 02:26:36 +00001217 MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
Owen Andersonfb3f6f22007-11-29 18:02:22 +00001218 if (cast<Instruction>(repl)->getParent() != CI->getParent() ||
1219 MD.getDependency(CI) != MD.getDependency(cast<CallInst>(repl))) {
Owen Anderson8b6f04e2007-11-26 02:26:36 +00001220 // There must be an intervening may-alias store, so nothing from
1221 // this point on will be able to be replaced with the preceding call
1222 currAvail.erase(repl);
1223 currAvail.insert(I);
1224
1225 return false;
1226 }
1227 }
1228 }
1229
Owen Andersonc772be72007-12-08 01:37:09 +00001230 // Remove it!
1231 MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
1232 MD.removeInstruction(I);
1233
Owen Anderson5aff8002007-07-31 23:27:13 +00001234 VN.erase(I);
Owen Anderson85c40642007-07-24 17:55:58 +00001235 I->replaceAllUsesWith(repl);
1236 toErase.push_back(I);
1237 return true;
1238 } else if (!I->isTerminator()) {
1239 currAvail.set(num);
1240 currAvail.insert(I);
1241 }
1242
1243 return false;
1244}
1245
1246// GVN::runOnFunction - This is the main transformation entry point for a
1247// function.
1248//
Owen Andersonbe168b32007-08-14 18:04:11 +00001249bool GVN::runOnFunction(Function& F) {
Owen Anderson5e9366f2007-10-18 19:39:33 +00001250 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
1251
Owen Andersonbe168b32007-08-14 18:04:11 +00001252 bool changed = false;
1253 bool shouldContinue = true;
1254
1255 while (shouldContinue) {
1256 shouldContinue = iterateOnFunction(F);
1257 changed |= shouldContinue;
1258 }
1259
1260 return changed;
1261}
1262
1263
1264// GVN::iterateOnFunction - Executes one iteration of GVN
1265bool GVN::iterateOnFunction(Function &F) {
Owen Anderson85c40642007-07-24 17:55:58 +00001266 // Clean out global sets from any previous functions
1267 VN.clear();
1268 availableOut.clear();
Owen Anderson5b299672007-08-07 23:12:31 +00001269 phiMap.clear();
Owen Anderson85c40642007-07-24 17:55:58 +00001270
1271 bool changed_function = false;
1272
1273 DominatorTree &DT = getAnalysis<DominatorTree>();
1274
1275 SmallVector<Instruction*, 4> toErase;
1276
1277 // Top-down walk of the dominator tree
1278 for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
1279 E = df_end(DT.getRootNode()); DI != E; ++DI) {
1280
1281 // Get the set to update for this block
1282 ValueNumberedSet& currAvail = availableOut[DI->getBlock()];
1283 DenseMap<Value*, LoadInst*> lastSeenLoad;
1284
1285 BasicBlock* BB = DI->getBlock();
1286
1287 // A block inherits AVAIL_OUT from its dominator
1288 if (DI->getIDom() != 0)
1289 currAvail = availableOut[DI->getIDom()->getBlock()];
1290
1291 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
Owen Andersonc0403802007-07-30 21:26:39 +00001292 BI != BE; ) {
Owen Andersonbf8a3eb2007-08-02 18:16:06 +00001293 changed_function |= processInstruction(BI, currAvail,
1294 lastSeenLoad, toErase);
Owen Anderson5d72a422007-07-25 19:57:03 +00001295
1296 NumGVNInstr += toErase.size();
1297
Owen Andersonc0403802007-07-30 21:26:39 +00001298 // Avoid iterator invalidation
1299 ++BI;
Owen Andersonc772be72007-12-08 01:37:09 +00001300
Owen Anderson5d72a422007-07-25 19:57:03 +00001301 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Owen Anderson8d272d52008-02-12 21:15:18 +00001302 E = toErase.end(); I != E; ++I) {
Owen Anderson5d72a422007-07-25 19:57:03 +00001303 (*I)->eraseFromParent();
Owen Anderson8d272d52008-02-12 21:15:18 +00001304 }
Owen Andersonc772be72007-12-08 01:37:09 +00001305
Owen Anderson5d72a422007-07-25 19:57:03 +00001306 toErase.clear();
Owen Anderson85c40642007-07-24 17:55:58 +00001307 }
1308 }
1309
Owen Anderson85c40642007-07-24 17:55:58 +00001310 return changed_function;
1311}