blob: 673d38b7f3ae6dc6c19a302363a786833bc4850f [file] [log] [blame]
Chris Lattner72bc70d2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Anderson1ad2cb72007-07-24 17:55:58 +00002//
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 Anderson1ad2cb72007-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//
John Criswell090c0a22009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman845f5242008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Anderson1ad2cb72007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson0cd32032007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Anderson45537912007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Anderson45537912007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patelc64bc162009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Anderson45537912007-07-26 18:26:51 +000025#include "llvm/Value.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000026#include "llvm/ADT/DenseMap.h"
27#include "llvm/ADT/DepthFirstIterator.h"
Owen Anderson255dafc2008-12-15 02:03:00 +000028#include "llvm/ADT/PostOrderIterator.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000029#include "llvm/ADT/SmallPtrSet.h"
30#include "llvm/ADT/SmallVector.h"
31#include "llvm/ADT/Statistic.h"
Owen Andersonb388ca92007-10-18 19:39:33 +000032#include "llvm/Analysis/Dominators.h"
33#include "llvm/Analysis/AliasAnalysis.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000034#include "llvm/Analysis/MemoryDependenceAnalysis.h"
35#include "llvm/Support/CFG.h"
Owen Andersonaa0b6342008-06-19 19:57:25 +000036#include "llvm/Support/CommandLine.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000037#include "llvm/Support/Compiler.h"
Chris Lattner9f8a6a72008-03-29 04:36:18 +000038#include "llvm/Support/Debug.h"
Owen Anderson5c274ee2008-06-19 19:54:19 +000039#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Duncan Sands4520dd22008-10-08 07:23:46 +000040#include <cstdio>
Owen Anderson1ad2cb72007-07-24 17:55:58 +000041using namespace llvm;
42
Bill Wendling70ded192008-12-22 22:14:07 +000043STATISTIC(NumGVNInstr, "Number of instructions deleted");
44STATISTIC(NumGVNLoad, "Number of loads deleted");
45STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
Owen Anderson961edc82008-07-15 16:28:06 +000046STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling70ded192008-12-22 22:14:07 +000047STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattnerd27290d2008-03-22 04:13:49 +000048
Evan Cheng88d11c02008-06-20 01:01:07 +000049static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonc2b856e2008-07-17 19:41:00 +000050 cl::init(true), cl::Hidden);
Bill Wendling3c042962009-05-29 20:38:16 +000051cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersonaa0b6342008-06-19 19:57:25 +000052
Owen Anderson1ad2cb72007-07-24 17:55:58 +000053//===----------------------------------------------------------------------===//
54// ValueTable Class
55//===----------------------------------------------------------------------===//
56
57/// This class holds the mapping between values and value numbers. It is used
58/// as an efficient mechanism to determine the expression-wise equivalence of
59/// two values.
60namespace {
61 struct VISIBILITY_HIDDEN Expression {
Dan Gohmanae3a0be2009-06-04 22:49:04 +000062 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
63 UDIV, SDIV, FDIV, UREM, SREM,
Owen Anderson1ad2cb72007-07-24 17:55:58 +000064 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
65 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
66 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
67 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
68 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
69 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
70 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
71 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson3b3f58c2008-05-13 08:17:22 +000072 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Anderson3cd8eb32008-06-19 17:25:39 +000073 EMPTY, TOMBSTONE };
Owen Anderson1ad2cb72007-07-24 17:55:58 +000074
75 ExpressionOpcode opcode;
76 const Type* type;
77 uint32_t firstVN;
78 uint32_t secondVN;
79 uint32_t thirdVN;
80 SmallVector<uint32_t, 4> varargs;
Owen Andersonb388ca92007-10-18 19:39:33 +000081 Value* function;
Owen Anderson1ad2cb72007-07-24 17:55:58 +000082
83 Expression() { }
84 Expression(ExpressionOpcode o) : opcode(o) { }
85
86 bool operator==(const Expression &other) const {
87 if (opcode != other.opcode)
88 return false;
89 else if (opcode == EMPTY || opcode == TOMBSTONE)
90 return true;
91 else if (type != other.type)
92 return false;
Owen Andersonb388ca92007-10-18 19:39:33 +000093 else if (function != other.function)
94 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +000095 else if (firstVN != other.firstVN)
96 return false;
97 else if (secondVN != other.secondVN)
98 return false;
99 else if (thirdVN != other.thirdVN)
100 return false;
101 else {
102 if (varargs.size() != other.varargs.size())
103 return false;
104
105 for (size_t i = 0; i < varargs.size(); ++i)
106 if (varargs[i] != other.varargs[i])
107 return false;
108
109 return true;
110 }
111 }
112
113 bool operator!=(const Expression &other) const {
Bill Wendling75f02ee2008-12-22 22:16:31 +0000114 return !(*this == other);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000115 }
116 };
117
118 class VISIBILITY_HIDDEN ValueTable {
119 private:
120 DenseMap<Value*, uint32_t> valueNumbering;
121 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersona472c4a2008-05-12 20:15:55 +0000122 AliasAnalysis* AA;
123 MemoryDependenceAnalysis* MD;
124 DominatorTree* DT;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000125
126 uint32_t nextValueNumber;
127
128 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
129 Expression::ExpressionOpcode getOpcode(CmpInst* C);
130 Expression::ExpressionOpcode getOpcode(CastInst* C);
131 Expression create_expression(BinaryOperator* BO);
132 Expression create_expression(CmpInst* C);
133 Expression create_expression(ShuffleVectorInst* V);
134 Expression create_expression(ExtractElementInst* C);
135 Expression create_expression(InsertElementInst* V);
136 Expression create_expression(SelectInst* V);
137 Expression create_expression(CastInst* C);
138 Expression create_expression(GetElementPtrInst* G);
Owen Andersonb388ca92007-10-18 19:39:33 +0000139 Expression create_expression(CallInst* C);
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000140 Expression create_expression(Constant* C);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000141 public:
Dan Gohmane63c4a22009-04-01 16:37:47 +0000142 ValueTable() : nextValueNumber(1) { }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000143 uint32_t lookup_or_add(Value* V);
144 uint32_t lookup(Value* V) const;
145 void add(Value* V, uint32_t num);
146 void clear();
147 void erase(Value* v);
148 unsigned size();
Owen Andersona472c4a2008-05-12 20:15:55 +0000149 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner663e4412008-12-01 00:40:32 +0000150 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersona472c4a2008-05-12 20:15:55 +0000151 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
152 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson0ae33ef2008-07-03 17:44:33 +0000153 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling246dbbb2008-12-22 21:36:08 +0000154 void verifyRemoved(const Value *) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000155 };
156}
157
158namespace llvm {
Chris Lattner76c1b972007-09-17 18:34:04 +0000159template <> struct DenseMapInfo<Expression> {
Owen Anderson830db6a2007-08-02 18:16:06 +0000160 static inline Expression getEmptyKey() {
161 return Expression(Expression::EMPTY);
162 }
163
164 static inline Expression getTombstoneKey() {
165 return Expression(Expression::TOMBSTONE);
166 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000167
168 static unsigned getHashValue(const Expression e) {
169 unsigned hash = e.opcode;
170
171 hash = e.firstVN + hash * 37;
172 hash = e.secondVN + hash * 37;
173 hash = e.thirdVN + hash * 37;
174
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000175 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
176 (unsigned)((uintptr_t)e.type >> 9)) +
177 hash * 37;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000178
Owen Anderson830db6a2007-08-02 18:16:06 +0000179 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
180 E = e.varargs.end(); I != E; ++I)
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000181 hash = *I + hash * 37;
182
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000183 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
184 (unsigned)((uintptr_t)e.function >> 9)) +
185 hash * 37;
Owen Andersonb388ca92007-10-18 19:39:33 +0000186
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000187 return hash;
188 }
Chris Lattner76c1b972007-09-17 18:34:04 +0000189 static bool isEqual(const Expression &LHS, const Expression &RHS) {
190 return LHS == RHS;
191 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000192 static bool isPod() { return true; }
193};
194}
195
196//===----------------------------------------------------------------------===//
197// ValueTable Internal Functions
198//===----------------------------------------------------------------------===//
Chris Lattner88365bb2008-03-21 21:14:38 +0000199Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000200 switch(BO->getOpcode()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000201 default: // THIS SHOULD NEVER HAPPEN
202 assert(0 && "Binary operator with unknown opcode?");
203 case Instruction::Add: return Expression::ADD;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000204 case Instruction::FAdd: return Expression::FADD;
Chris Lattner88365bb2008-03-21 21:14:38 +0000205 case Instruction::Sub: return Expression::SUB;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000206 case Instruction::FSub: return Expression::FSUB;
Chris Lattner88365bb2008-03-21 21:14:38 +0000207 case Instruction::Mul: return Expression::MUL;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000208 case Instruction::FMul: return Expression::FMUL;
Chris Lattner88365bb2008-03-21 21:14:38 +0000209 case Instruction::UDiv: return Expression::UDIV;
210 case Instruction::SDiv: return Expression::SDIV;
211 case Instruction::FDiv: return Expression::FDIV;
212 case Instruction::URem: return Expression::UREM;
213 case Instruction::SRem: return Expression::SREM;
214 case Instruction::FRem: return Expression::FREM;
215 case Instruction::Shl: return Expression::SHL;
216 case Instruction::LShr: return Expression::LSHR;
217 case Instruction::AShr: return Expression::ASHR;
218 case Instruction::And: return Expression::AND;
219 case Instruction::Or: return Expression::OR;
220 case Instruction::Xor: return Expression::XOR;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000221 }
222}
223
224Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nate Begeman1d6e4092008-05-18 19:49:05 +0000225 if (isa<ICmpInst>(C) || isa<VICmpInst>(C)) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000226 switch (C->getPredicate()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000227 default: // THIS SHOULD NEVER HAPPEN
228 assert(0 && "Comparison with unknown predicate?");
229 case ICmpInst::ICMP_EQ: return Expression::ICMPEQ;
230 case ICmpInst::ICMP_NE: return Expression::ICMPNE;
231 case ICmpInst::ICMP_UGT: return Expression::ICMPUGT;
232 case ICmpInst::ICMP_UGE: return Expression::ICMPUGE;
233 case ICmpInst::ICMP_ULT: return Expression::ICMPULT;
234 case ICmpInst::ICMP_ULE: return Expression::ICMPULE;
235 case ICmpInst::ICMP_SGT: return Expression::ICMPSGT;
236 case ICmpInst::ICMP_SGE: return Expression::ICMPSGE;
237 case ICmpInst::ICMP_SLT: return Expression::ICMPSLT;
238 case ICmpInst::ICMP_SLE: return Expression::ICMPSLE;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000239 }
Chris Lattner88365bb2008-03-21 21:14:38 +0000240 }
Nate Begeman1d6e4092008-05-18 19:49:05 +0000241 assert((isa<FCmpInst>(C) || isa<VFCmpInst>(C)) && "Unknown compare");
Chris Lattner88365bb2008-03-21 21:14:38 +0000242 switch (C->getPredicate()) {
243 default: // THIS SHOULD NEVER HAPPEN
244 assert(0 && "Comparison with unknown predicate?");
245 case FCmpInst::FCMP_OEQ: return Expression::FCMPOEQ;
246 case FCmpInst::FCMP_OGT: return Expression::FCMPOGT;
247 case FCmpInst::FCMP_OGE: return Expression::FCMPOGE;
248 case FCmpInst::FCMP_OLT: return Expression::FCMPOLT;
249 case FCmpInst::FCMP_OLE: return Expression::FCMPOLE;
250 case FCmpInst::FCMP_ONE: return Expression::FCMPONE;
251 case FCmpInst::FCMP_ORD: return Expression::FCMPORD;
252 case FCmpInst::FCMP_UNO: return Expression::FCMPUNO;
253 case FCmpInst::FCMP_UEQ: return Expression::FCMPUEQ;
254 case FCmpInst::FCMP_UGT: return Expression::FCMPUGT;
255 case FCmpInst::FCMP_UGE: return Expression::FCMPUGE;
256 case FCmpInst::FCMP_ULT: return Expression::FCMPULT;
257 case FCmpInst::FCMP_ULE: return Expression::FCMPULE;
258 case FCmpInst::FCMP_UNE: return Expression::FCMPUNE;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000259 }
260}
261
Chris Lattner88365bb2008-03-21 21:14:38 +0000262Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000263 switch(C->getOpcode()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000264 default: // THIS SHOULD NEVER HAPPEN
265 assert(0 && "Cast operator with unknown opcode?");
266 case Instruction::Trunc: return Expression::TRUNC;
267 case Instruction::ZExt: return Expression::ZEXT;
268 case Instruction::SExt: return Expression::SEXT;
269 case Instruction::FPToUI: return Expression::FPTOUI;
270 case Instruction::FPToSI: return Expression::FPTOSI;
271 case Instruction::UIToFP: return Expression::UITOFP;
272 case Instruction::SIToFP: return Expression::SITOFP;
273 case Instruction::FPTrunc: return Expression::FPTRUNC;
274 case Instruction::FPExt: return Expression::FPEXT;
275 case Instruction::PtrToInt: return Expression::PTRTOINT;
276 case Instruction::IntToPtr: return Expression::INTTOPTR;
277 case Instruction::BitCast: return Expression::BITCAST;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000278 }
279}
280
Owen Andersonb388ca92007-10-18 19:39:33 +0000281Expression ValueTable::create_expression(CallInst* C) {
282 Expression e;
283
284 e.type = C->getType();
285 e.firstVN = 0;
286 e.secondVN = 0;
287 e.thirdVN = 0;
288 e.function = C->getCalledFunction();
289 e.opcode = Expression::CALL;
290
291 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
292 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000293 e.varargs.push_back(lookup_or_add(*I));
Owen Andersonb388ca92007-10-18 19:39:33 +0000294
295 return e;
296}
297
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000298Expression ValueTable::create_expression(BinaryOperator* BO) {
299 Expression e;
300
Owen Anderson8f46c782008-04-11 05:11:49 +0000301 e.firstVN = lookup_or_add(BO->getOperand(0));
302 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000303 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000304 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000305 e.type = BO->getType();
306 e.opcode = getOpcode(BO);
307
308 return e;
309}
310
311Expression ValueTable::create_expression(CmpInst* C) {
312 Expression e;
313
Owen Anderson8f46c782008-04-11 05:11:49 +0000314 e.firstVN = lookup_or_add(C->getOperand(0));
315 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000316 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000317 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000318 e.type = C->getType();
319 e.opcode = getOpcode(C);
320
321 return e;
322}
323
324Expression ValueTable::create_expression(CastInst* C) {
325 Expression e;
326
Owen Anderson8f46c782008-04-11 05:11:49 +0000327 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000328 e.secondVN = 0;
329 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000330 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000331 e.type = C->getType();
332 e.opcode = getOpcode(C);
333
334 return e;
335}
336
337Expression ValueTable::create_expression(ShuffleVectorInst* S) {
338 Expression e;
339
Owen Anderson8f46c782008-04-11 05:11:49 +0000340 e.firstVN = lookup_or_add(S->getOperand(0));
341 e.secondVN = lookup_or_add(S->getOperand(1));
342 e.thirdVN = lookup_or_add(S->getOperand(2));
Owen Andersonb388ca92007-10-18 19:39:33 +0000343 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000344 e.type = S->getType();
345 e.opcode = Expression::SHUFFLE;
346
347 return e;
348}
349
350Expression ValueTable::create_expression(ExtractElementInst* E) {
351 Expression e;
352
Owen Anderson8f46c782008-04-11 05:11:49 +0000353 e.firstVN = lookup_or_add(E->getOperand(0));
354 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000355 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000356 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000357 e.type = E->getType();
358 e.opcode = Expression::EXTRACT;
359
360 return e;
361}
362
363Expression ValueTable::create_expression(InsertElementInst* I) {
364 Expression e;
365
Owen Anderson8f46c782008-04-11 05:11:49 +0000366 e.firstVN = lookup_or_add(I->getOperand(0));
367 e.secondVN = lookup_or_add(I->getOperand(1));
368 e.thirdVN = lookup_or_add(I->getOperand(2));
Owen Andersonb388ca92007-10-18 19:39:33 +0000369 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000370 e.type = I->getType();
371 e.opcode = Expression::INSERT;
372
373 return e;
374}
375
376Expression ValueTable::create_expression(SelectInst* I) {
377 Expression e;
378
Owen Anderson8f46c782008-04-11 05:11:49 +0000379 e.firstVN = lookup_or_add(I->getCondition());
380 e.secondVN = lookup_or_add(I->getTrueValue());
381 e.thirdVN = lookup_or_add(I->getFalseValue());
Owen Andersonb388ca92007-10-18 19:39:33 +0000382 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000383 e.type = I->getType();
384 e.opcode = Expression::SELECT;
385
386 return e;
387}
388
389Expression ValueTable::create_expression(GetElementPtrInst* G) {
390 Expression e;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000391
Owen Anderson8f46c782008-04-11 05:11:49 +0000392 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000393 e.secondVN = 0;
394 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000395 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000396 e.type = G->getType();
397 e.opcode = Expression::GEP;
398
399 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
400 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000401 e.varargs.push_back(lookup_or_add(*I));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000402
403 return e;
404}
405
406//===----------------------------------------------------------------------===//
407// ValueTable External Functions
408//===----------------------------------------------------------------------===//
409
Owen Andersonb2303722008-06-18 21:41:49 +0000410/// add - Insert a value into the table with a specified value number.
411void ValueTable::add(Value* V, uint32_t num) {
412 valueNumbering.insert(std::make_pair(V, num));
413}
414
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000415/// lookup_or_add - Returns the value number for the specified value, assigning
416/// it a new number if it did not have one before.
417uint32_t ValueTable::lookup_or_add(Value* V) {
418 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
419 if (VI != valueNumbering.end())
420 return VI->second;
421
Owen Andersonb388ca92007-10-18 19:39:33 +0000422 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson8f46c782008-04-11 05:11:49 +0000423 if (AA->doesNotAccessMemory(C)) {
Owen Andersonb388ca92007-10-18 19:39:33 +0000424 Expression e = create_expression(C);
425
426 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
427 if (EI != expressionNumbering.end()) {
428 valueNumbering.insert(std::make_pair(V, EI->second));
429 return EI->second;
430 } else {
431 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
432 valueNumbering.insert(std::make_pair(V, nextValueNumber));
433
434 return nextValueNumber++;
435 }
Owen Anderson241f6532008-04-17 05:36:50 +0000436 } else if (AA->onlyReadsMemory(C)) {
437 Expression e = create_expression(C);
438
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000439 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Anderson241f6532008-04-17 05:36:50 +0000440 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
441 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000442 return nextValueNumber++;
443 }
Owen Anderson241f6532008-04-17 05:36:50 +0000444
Chris Lattner4c724002008-11-29 02:29:27 +0000445 MemDepResult local_dep = MD->getDependency(C);
Owen Andersonc4f406e2008-05-13 23:18:30 +0000446
Chris Lattnerb51deb92008-12-05 21:04:20 +0000447 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Andersonc4f406e2008-05-13 23:18:30 +0000448 valueNumbering.insert(std::make_pair(V, nextValueNumber));
449 return nextValueNumber++;
Chris Lattner1440ac52008-11-30 23:39:23 +0000450 }
Chris Lattnerb51deb92008-12-05 21:04:20 +0000451
452 if (local_dep.isDef()) {
453 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
454
455 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Andersonc4f406e2008-05-13 23:18:30 +0000456 valueNumbering.insert(std::make_pair(V, nextValueNumber));
457 return nextValueNumber++;
458 }
Chris Lattnerb51deb92008-12-05 21:04:20 +0000459
Chris Lattner1440ac52008-11-30 23:39:23 +0000460 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
461 uint32_t c_vn = lookup_or_add(C->getOperand(i));
462 uint32_t cd_vn = lookup_or_add(local_cdep->getOperand(i));
463 if (c_vn != cd_vn) {
464 valueNumbering.insert(std::make_pair(V, nextValueNumber));
465 return nextValueNumber++;
466 }
467 }
468
469 uint32_t v = lookup_or_add(local_cdep);
470 valueNumbering.insert(std::make_pair(V, v));
471 return v;
Owen Andersonc4f406e2008-05-13 23:18:30 +0000472 }
Chris Lattnerbf145d62008-12-01 01:15:42 +0000473
Chris Lattnerb51deb92008-12-05 21:04:20 +0000474 // Non-local case.
Chris Lattnerbf145d62008-12-01 01:15:42 +0000475 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner1559b362008-12-09 19:38:05 +0000476 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattnerb51deb92008-12-05 21:04:20 +0000477 // FIXME: call/call dependencies for readonly calls should return def, not
478 // clobber! Move the checking logic to MemDep!
Owen Anderson16db1f72008-05-13 13:41:23 +0000479 CallInst* cdep = 0;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000480
Chris Lattner1440ac52008-11-30 23:39:23 +0000481 // Check to see if we have a single dominating call instruction that is
482 // identical to C.
Chris Lattnerbf145d62008-12-01 01:15:42 +0000483 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
484 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattner1440ac52008-11-30 23:39:23 +0000485 // Ignore non-local dependencies.
486 if (I->second.isNonLocal())
487 continue;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000488
Chris Lattner1440ac52008-11-30 23:39:23 +0000489 // We don't handle non-depedencies. If we already have a call, reject
490 // instruction dependencies.
Chris Lattnerb51deb92008-12-05 21:04:20 +0000491 if (I->second.isClobber() || cdep != 0) {
Chris Lattner1440ac52008-11-30 23:39:23 +0000492 cdep = 0;
493 break;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000494 }
Chris Lattner1440ac52008-11-30 23:39:23 +0000495
496 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I->second.getInst());
497 // FIXME: All duplicated with non-local case.
498 if (NonLocalDepCall && DT->properlyDominates(I->first, C->getParent())){
499 cdep = NonLocalDepCall;
500 continue;
501 }
502
503 cdep = 0;
504 break;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000505 }
506
Owen Anderson16db1f72008-05-13 13:41:23 +0000507 if (!cdep) {
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000508 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson241f6532008-04-17 05:36:50 +0000509 return nextValueNumber++;
510 }
511
Chris Lattnerb51deb92008-12-05 21:04:20 +0000512 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000513 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson241f6532008-04-17 05:36:50 +0000514 return nextValueNumber++;
Owen Anderson241f6532008-04-17 05:36:50 +0000515 }
Chris Lattner1440ac52008-11-30 23:39:23 +0000516 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
517 uint32_t c_vn = lookup_or_add(C->getOperand(i));
518 uint32_t cd_vn = lookup_or_add(cdep->getOperand(i));
519 if (c_vn != cd_vn) {
520 valueNumbering.insert(std::make_pair(V, nextValueNumber));
521 return nextValueNumber++;
522 }
523 }
524
525 uint32_t v = lookup_or_add(cdep);
526 valueNumbering.insert(std::make_pair(V, v));
527 return v;
Owen Anderson241f6532008-04-17 05:36:50 +0000528
Owen Andersonb388ca92007-10-18 19:39:33 +0000529 } else {
530 valueNumbering.insert(std::make_pair(V, nextValueNumber));
531 return nextValueNumber++;
532 }
533 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000534 Expression e = create_expression(BO);
535
536 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
537 if (EI != expressionNumbering.end()) {
538 valueNumbering.insert(std::make_pair(V, EI->second));
539 return EI->second;
540 } else {
541 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
542 valueNumbering.insert(std::make_pair(V, nextValueNumber));
543
544 return nextValueNumber++;
545 }
546 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
547 Expression e = create_expression(C);
548
549 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
550 if (EI != expressionNumbering.end()) {
551 valueNumbering.insert(std::make_pair(V, EI->second));
552 return EI->second;
553 } else {
554 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
555 valueNumbering.insert(std::make_pair(V, nextValueNumber));
556
557 return nextValueNumber++;
558 }
559 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
560 Expression e = create_expression(U);
561
562 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
563 if (EI != expressionNumbering.end()) {
564 valueNumbering.insert(std::make_pair(V, EI->second));
565 return EI->second;
566 } else {
567 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
568 valueNumbering.insert(std::make_pair(V, nextValueNumber));
569
570 return nextValueNumber++;
571 }
572 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
573 Expression e = create_expression(U);
574
575 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
576 if (EI != expressionNumbering.end()) {
577 valueNumbering.insert(std::make_pair(V, EI->second));
578 return EI->second;
579 } else {
580 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
581 valueNumbering.insert(std::make_pair(V, nextValueNumber));
582
583 return nextValueNumber++;
584 }
585 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
586 Expression e = create_expression(U);
587
588 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
589 if (EI != expressionNumbering.end()) {
590 valueNumbering.insert(std::make_pair(V, EI->second));
591 return EI->second;
592 } else {
593 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
594 valueNumbering.insert(std::make_pair(V, nextValueNumber));
595
596 return nextValueNumber++;
597 }
598 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
599 Expression e = create_expression(U);
600
601 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
602 if (EI != expressionNumbering.end()) {
603 valueNumbering.insert(std::make_pair(V, EI->second));
604 return EI->second;
605 } else {
606 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
607 valueNumbering.insert(std::make_pair(V, nextValueNumber));
608
609 return nextValueNumber++;
610 }
611 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
612 Expression e = create_expression(U);
613
614 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
615 if (EI != expressionNumbering.end()) {
616 valueNumbering.insert(std::make_pair(V, EI->second));
617 return EI->second;
618 } else {
619 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
620 valueNumbering.insert(std::make_pair(V, nextValueNumber));
621
622 return nextValueNumber++;
623 }
624 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
625 Expression e = create_expression(U);
626
627 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
628 if (EI != expressionNumbering.end()) {
629 valueNumbering.insert(std::make_pair(V, EI->second));
630 return EI->second;
631 } else {
632 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
633 valueNumbering.insert(std::make_pair(V, nextValueNumber));
634
635 return nextValueNumber++;
636 }
637 } else {
638 valueNumbering.insert(std::make_pair(V, nextValueNumber));
639 return nextValueNumber++;
640 }
641}
642
643/// lookup - Returns the value number of the specified value. Fails if
644/// the value has not yet been numbered.
645uint32_t ValueTable::lookup(Value* V) const {
646 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Chris Lattner88365bb2008-03-21 21:14:38 +0000647 assert(VI != valueNumbering.end() && "Value not numbered?");
648 return VI->second;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000649}
650
651/// clear - Remove all entries from the ValueTable
652void ValueTable::clear() {
653 valueNumbering.clear();
654 expressionNumbering.clear();
655 nextValueNumber = 1;
656}
657
Owen Andersonbf7d0bc2007-07-31 23:27:13 +0000658/// erase - Remove a value from the value numbering
659void ValueTable::erase(Value* V) {
660 valueNumbering.erase(V);
661}
662
Bill Wendling246dbbb2008-12-22 21:36:08 +0000663/// verifyRemoved - Verify that the value is removed from all internal data
664/// structures.
665void ValueTable::verifyRemoved(const Value *V) const {
666 for (DenseMap<Value*, uint32_t>::iterator
667 I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
668 assert(I->first != V && "Inst still occurs in value numbering map!");
669 }
670}
671
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000672//===----------------------------------------------------------------------===//
Bill Wendling30788b82008-12-22 22:32:22 +0000673// GVN Pass
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000674//===----------------------------------------------------------------------===//
675
676namespace {
Owen Anderson6fafe842008-06-20 01:15:47 +0000677 struct VISIBILITY_HIDDEN ValueNumberScope {
678 ValueNumberScope* parent;
679 DenseMap<uint32_t, Value*> table;
680
681 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
682 };
683}
684
685namespace {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000686
687 class VISIBILITY_HIDDEN GVN : public FunctionPass {
688 bool runOnFunction(Function &F);
689 public:
690 static char ID; // Pass identification, replacement for typeid
Dan Gohmanae73dc12008-09-04 17:05:41 +0000691 GVN() : FunctionPass(&ID) { }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000692
693 private:
Chris Lattner663e4412008-12-01 00:40:32 +0000694 MemoryDependenceAnalysis *MD;
695 DominatorTree *DT;
696
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000697 ValueTable VN;
Owen Anderson6fafe842008-06-20 01:15:47 +0000698 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000699
Owen Andersona37226a2007-08-07 23:12:31 +0000700 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
701 PhiMapType phiMap;
702
703
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000704 // This transformation requires dominator postdominator info
705 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000706 AU.addRequired<DominatorTree>();
707 AU.addRequired<MemoryDependenceAnalysis>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000708 AU.addRequired<AliasAnalysis>();
Owen Andersonb70a5712008-06-23 17:49:45 +0000709
710 AU.addPreserved<DominatorTree>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000711 AU.addPreserved<AliasAnalysis>();
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000712 }
713
714 // Helper fuctions
715 // FIXME: eliminate or document these better
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000716 bool processLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000717 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000718 bool processInstruction(Instruction* I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000719 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson830db6a2007-08-02 18:16:06 +0000720 bool processNonLocalLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000721 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson255dafc2008-12-15 02:03:00 +0000722 bool processBlock(BasicBlock* BB);
Owen Andersoncbe1d942008-12-14 19:10:35 +0000723 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Anderson1c2763d2007-08-02 17:56:05 +0000724 DenseMap<BasicBlock*, Value*> &Phis,
725 bool top_level = false);
Owen Andersonb2303722008-06-18 21:41:49 +0000726 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson3e75a422007-08-14 18:04:11 +0000727 bool iterateOnFunction(Function &F);
Owen Anderson1defe2d2007-08-16 22:51:56 +0000728 Value* CollapsePhi(PHINode* p);
Owen Anderson24866862007-09-16 08:04:16 +0000729 bool isSafeReplacement(PHINode* p, Instruction* inst);
Owen Andersonb2303722008-06-18 21:41:49 +0000730 bool performPRE(Function& F);
Owen Anderson6fafe842008-06-20 01:15:47 +0000731 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Anderson961edc82008-07-15 16:28:06 +0000732 bool mergeBlockIntoPredecessor(BasicBlock* BB);
Owen Anderson255dafc2008-12-15 02:03:00 +0000733 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +0000734 void cleanupGlobalSets();
Bill Wendling246dbbb2008-12-22 21:36:08 +0000735 void verifyRemoved(const Instruction *I) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000736 };
737
738 char GVN::ID = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000739}
740
741// createGVNPass - The public interface to this file...
742FunctionPass *llvm::createGVNPass() { return new GVN(); }
743
744static RegisterPass<GVN> X("gvn",
745 "Global Value Numbering");
746
Owen Andersonb2303722008-06-18 21:41:49 +0000747void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson0cd32032007-07-25 19:57:03 +0000748 printf("{\n");
Owen Andersonb2303722008-06-18 21:41:49 +0000749 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson0cd32032007-07-25 19:57:03 +0000750 E = d.end(); I != E; ++I) {
Owen Andersonb2303722008-06-18 21:41:49 +0000751 printf("%d\n", I->first);
Owen Anderson0cd32032007-07-25 19:57:03 +0000752 I->second->dump();
753 }
754 printf("}\n");
755}
756
Owen Anderson1defe2d2007-08-16 22:51:56 +0000757Value* GVN::CollapsePhi(PHINode* p) {
Owen Anderson1defe2d2007-08-16 22:51:56 +0000758 Value* constVal = p->hasConstantValue();
Chris Lattner88365bb2008-03-21 21:14:38 +0000759 if (!constVal) return 0;
Owen Anderson1defe2d2007-08-16 22:51:56 +0000760
Chris Lattner88365bb2008-03-21 21:14:38 +0000761 Instruction* inst = dyn_cast<Instruction>(constVal);
762 if (!inst)
763 return constVal;
764
Chris Lattner663e4412008-12-01 00:40:32 +0000765 if (DT->dominates(inst, p))
Chris Lattner88365bb2008-03-21 21:14:38 +0000766 if (isSafeReplacement(p, inst))
767 return inst;
Owen Anderson1defe2d2007-08-16 22:51:56 +0000768 return 0;
769}
Owen Anderson0cd32032007-07-25 19:57:03 +0000770
Owen Anderson24866862007-09-16 08:04:16 +0000771bool GVN::isSafeReplacement(PHINode* p, Instruction* inst) {
772 if (!isa<PHINode>(inst))
773 return true;
774
775 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
776 UI != E; ++UI)
777 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
778 if (use_phi->getParent() == inst->getParent())
779 return false;
780
781 return true;
782}
783
Owen Anderson45537912007-07-26 18:26:51 +0000784/// GetValueForBlock - Get the value to use within the specified basic block.
785/// available values are in Phis.
Owen Andersoncbe1d942008-12-14 19:10:35 +0000786Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner88365bb2008-03-21 21:14:38 +0000787 DenseMap<BasicBlock*, Value*> &Phis,
788 bool top_level) {
Owen Anderson45537912007-07-26 18:26:51 +0000789
790 // If we have already computed this value, return the previously computed val.
Owen Andersonab870272007-08-03 19:59:35 +0000791 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
792 if (V != Phis.end() && !top_level) return V->second;
Owen Anderson45537912007-07-26 18:26:51 +0000793
Owen Andersoncb29a4f2008-07-02 18:15:31 +0000794 // If the block is unreachable, just return undef, since this path
795 // can't actually occur at runtime.
Chris Lattner663e4412008-12-01 00:40:32 +0000796 if (!DT->isReachableFromEntry(BB))
Owen Andersoncb29a4f2008-07-02 18:15:31 +0000797 return Phis[BB] = UndefValue::get(orig->getType());
Owen Andersonf2aa1602008-07-02 17:20:16 +0000798
Chris Lattnerae199312008-12-09 19:21:47 +0000799 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
800 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Andersonab870272007-08-03 19:59:35 +0000801 Phis[BB] = ret;
802 return ret;
Owen Anderson4b55c3b2007-08-03 11:03:26 +0000803 }
Chris Lattnerae199312008-12-09 19:21:47 +0000804
805 // Get the number of predecessors of this block so we can reserve space later.
806 // If there is already a PHI in it, use the #preds from it, otherwise count.
807 // Getting it from the PHI is constant time.
808 unsigned NumPreds;
809 if (PHINode *ExistingPN = dyn_cast<PHINode>(BB->begin()))
810 NumPreds = ExistingPN->getNumIncomingValues();
811 else
812 NumPreds = std::distance(pred_begin(BB), pred_end(BB));
Chris Lattner88365bb2008-03-21 21:14:38 +0000813
Owen Anderson45537912007-07-26 18:26:51 +0000814 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
815 // now, then get values to fill in the incoming values for the PHI.
Gabor Greif051a9502008-04-06 20:25:17 +0000816 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
817 BB->begin());
Chris Lattnerae199312008-12-09 19:21:47 +0000818 PN->reserveOperandSpace(NumPreds);
Owen Andersonab870272007-08-03 19:59:35 +0000819
Chris Lattnerae199312008-12-09 19:21:47 +0000820 Phis.insert(std::make_pair(BB, PN));
Owen Anderson4f9ba7c2007-07-30 16:57:08 +0000821
Owen Anderson45537912007-07-26 18:26:51 +0000822 // Fill in the incoming values for the block.
Owen Anderson054ab942007-07-31 17:43:14 +0000823 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
824 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Anderson054ab942007-07-31 17:43:14 +0000825 PN->addIncoming(val, *PI);
826 }
Chris Lattner88365bb2008-03-21 21:14:38 +0000827
Chris Lattner663e4412008-12-01 00:40:32 +0000828 VN.getAliasAnalysis()->copyValue(orig, PN);
Owen Anderson054ab942007-07-31 17:43:14 +0000829
Owen Anderson62bc33c2007-08-16 22:02:55 +0000830 // Attempt to collapse PHI nodes that are trivially redundant
Owen Anderson1defe2d2007-08-16 22:51:56 +0000831 Value* v = CollapsePhi(PN);
Chris Lattner88365bb2008-03-21 21:14:38 +0000832 if (!v) {
833 // Cache our phi construction results
Owen Andersoncbe1d942008-12-14 19:10:35 +0000834 if (LoadInst* L = dyn_cast<LoadInst>(orig))
835 phiMap[L->getPointerOperand()].insert(PN);
836 else
837 phiMap[orig].insert(PN);
838
Chris Lattner88365bb2008-03-21 21:14:38 +0000839 return PN;
Owen Anderson054ab942007-07-31 17:43:14 +0000840 }
Owen Andersona472c4a2008-05-12 20:15:55 +0000841
Chris Lattner88365bb2008-03-21 21:14:38 +0000842 PN->replaceAllUsesWith(v);
Chris Lattnerbc99be12008-12-09 22:06:23 +0000843 if (isa<PointerType>(v->getType()))
844 MD->invalidateCachedPointerInfo(v);
Chris Lattner88365bb2008-03-21 21:14:38 +0000845
846 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
847 E = Phis.end(); I != E; ++I)
848 if (I->second == PN)
849 I->second = v;
850
Chris Lattner663e4412008-12-01 00:40:32 +0000851 DEBUG(cerr << "GVN removed: " << *PN);
852 MD->removeInstruction(PN);
Chris Lattner88365bb2008-03-21 21:14:38 +0000853 PN->eraseFromParent();
Bill Wendling246dbbb2008-12-22 21:36:08 +0000854 DEBUG(verifyRemoved(PN));
Chris Lattner88365bb2008-03-21 21:14:38 +0000855
856 Phis[BB] = v;
857 return v;
Owen Anderson0cd32032007-07-25 19:57:03 +0000858}
859
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000860/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
861/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattner72bc70d2008-12-05 07:49:08 +0000862/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
863/// map is actually a tri-state map with the following values:
864/// 0) we know the block *is not* fully available.
865/// 1) we know the block *is* fully available.
866/// 2) we do not know whether the block is fully available or not, but we are
867/// currently speculating that it will be.
868/// 3) we are speculating for this block and have used that to speculate for
869/// other blocks.
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000870static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner72bc70d2008-12-05 07:49:08 +0000871 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000872 // Optimistically assume that the block is fully available and check to see
873 // if we already know about this block in one lookup.
Chris Lattner72bc70d2008-12-05 07:49:08 +0000874 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
875 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000876
877 // If the entry already existed for this block, return the precomputed value.
Chris Lattner72bc70d2008-12-05 07:49:08 +0000878 if (!IV.second) {
879 // If this is a speculative "available" value, mark it as being used for
880 // speculation of other blocks.
881 if (IV.first->second == 2)
882 IV.first->second = 3;
883 return IV.first->second != 0;
884 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000885
886 // Otherwise, see if it is fully available in all predecessors.
887 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
888
889 // If this block has no predecessors, it isn't live-in here.
890 if (PI == PE)
Chris Lattner72bc70d2008-12-05 07:49:08 +0000891 goto SpeculationFailure;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000892
893 for (; PI != PE; ++PI)
894 // If the value isn't fully available in one of our predecessors, then it
895 // isn't fully available in this block either. Undo our previous
896 // optimistic assumption and bail out.
897 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattner72bc70d2008-12-05 07:49:08 +0000898 goto SpeculationFailure;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000899
900 return true;
Chris Lattner72bc70d2008-12-05 07:49:08 +0000901
902// SpeculationFailure - If we get here, we found out that this is not, after
903// all, a fully-available block. We have a problem if we speculated on this and
904// used the speculation to mark other blocks as available.
905SpeculationFailure:
906 char &BBVal = FullyAvailableBlocks[BB];
907
908 // If we didn't speculate on this, just return with it set to false.
909 if (BBVal == 2) {
910 BBVal = 0;
911 return false;
912 }
913
914 // If we did speculate on this value, we could have blocks set to 1 that are
915 // incorrect. Walk the (transitive) successors of this block and mark them as
916 // 0 if set to one.
917 SmallVector<BasicBlock*, 32> BBWorklist;
918 BBWorklist.push_back(BB);
919
920 while (!BBWorklist.empty()) {
921 BasicBlock *Entry = BBWorklist.pop_back_val();
922 // Note that this sets blocks to 0 (unavailable) if they happen to not
923 // already be in FullyAvailableBlocks. This is safe.
924 char &EntryVal = FullyAvailableBlocks[Entry];
925 if (EntryVal == 0) continue; // Already unavailable.
926
927 // Mark as unavailable.
928 EntryVal = 0;
929
930 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
931 BBWorklist.push_back(*I);
932 }
933
934 return false;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000935}
936
Owen Anderson62bc33c2007-08-16 22:02:55 +0000937/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
938/// non-local by performing PHI construction.
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000939bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000940 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000941 // Find the non-local dependencies of the load.
Chris Lattner91bcf642008-12-09 19:25:07 +0000942 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
943 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
944 Deps);
945 //DEBUG(cerr << "INVESTIGATING NONLOCAL LOAD: " << Deps.size() << *LI);
Owen Anderson0cd32032007-07-25 19:57:03 +0000946
Owen Anderson516eb1c2008-08-26 22:07:42 +0000947 // If we had to process more than one hundred blocks to find the
948 // dependencies, this load isn't worth worrying about. Optimizing
949 // it will be too expensive.
Chris Lattner91bcf642008-12-09 19:25:07 +0000950 if (Deps.size() > 100)
Owen Anderson516eb1c2008-08-26 22:07:42 +0000951 return false;
Chris Lattner5f4f84b2008-12-18 00:51:32 +0000952
953 // If we had a phi translation failure, we'll have a single entry which is a
954 // clobber in the current block. Reject this early.
955 if (Deps.size() == 1 && Deps[0].second.isClobber())
956 return false;
Owen Anderson516eb1c2008-08-26 22:07:42 +0000957
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000958 // Filter out useless results (non-locals, etc). Keep track of the blocks
959 // where we have a value available in repl, also keep track of whether we see
960 // dependencies that produce an unknown value for the load (such as a call
961 // that could potentially clobber the load).
962 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
963 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Owen Andersona37226a2007-08-07 23:12:31 +0000964
Chris Lattner91bcf642008-12-09 19:25:07 +0000965 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
966 BasicBlock *DepBB = Deps[i].first;
967 MemDepResult DepInfo = Deps[i].second;
Chris Lattnerbf145d62008-12-01 01:15:42 +0000968
Chris Lattnerb51deb92008-12-05 21:04:20 +0000969 if (DepInfo.isClobber()) {
970 UnavailableBlocks.push_back(DepBB);
971 continue;
972 }
973
974 Instruction *DepInst = DepInfo.getInst();
975
976 // Loading the allocation -> undef.
977 if (isa<AllocationInst>(DepInst)) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000978 ValuesPerBlock.push_back(std::make_pair(DepBB,
979 UndefValue::get(LI->getType())));
Chris Lattnerbf145d62008-12-01 01:15:42 +0000980 continue;
981 }
Chris Lattner88365bb2008-03-21 21:14:38 +0000982
Chris Lattner91bcf642008-12-09 19:25:07 +0000983 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner978796e2008-12-01 01:31:36 +0000984 // Reject loads and stores that are to the same address but are of
985 // different types.
986 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
987 // of bitfield access, it would be interesting to optimize for it at some
988 // point.
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000989 if (S->getOperand(0)->getType() != LI->getType()) {
990 UnavailableBlocks.push_back(DepBB);
991 continue;
992 }
Chris Lattner978796e2008-12-01 01:31:36 +0000993
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000994 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattner978796e2008-12-01 01:31:36 +0000995
Chris Lattner91bcf642008-12-09 19:25:07 +0000996 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000997 if (LD->getType() != LI->getType()) {
998 UnavailableBlocks.push_back(DepBB);
999 continue;
1000 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001001 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson0cd32032007-07-25 19:57:03 +00001002 } else {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001003 UnavailableBlocks.push_back(DepBB);
1004 continue;
Owen Anderson0cd32032007-07-25 19:57:03 +00001005 }
Chris Lattner88365bb2008-03-21 21:14:38 +00001006 }
Owen Anderson0cd32032007-07-25 19:57:03 +00001007
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001008 // If we have no predecessors that produce a known value for this load, exit
1009 // early.
1010 if (ValuesPerBlock.empty()) return false;
1011
1012 // If all of the instructions we depend on produce a known value for this
1013 // load, then it is fully redundant and we can use PHI insertion to compute
1014 // its value. Insert PHIs and remove the fully redundant value now.
1015 if (UnavailableBlocks.empty()) {
1016 // Use cached PHI construction information from previous runs
1017 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattner91bcf642008-12-09 19:25:07 +00001018 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001019 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1020 I != E; ++I) {
1021 if ((*I)->getParent() == LI->getParent()) {
1022 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD #1: " << *LI);
1023 LI->replaceAllUsesWith(*I);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001024 if (isa<PointerType>((*I)->getType()))
1025 MD->invalidateCachedPointerInfo(*I);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001026 toErase.push_back(LI);
1027 NumGVNLoad++;
1028 return true;
1029 }
1030
1031 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Andersona37226a2007-08-07 23:12:31 +00001032 }
Chris Lattner88365bb2008-03-21 21:14:38 +00001033
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001034 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD: " << *LI);
1035
1036 DenseMap<BasicBlock*, Value*> BlockReplValues;
1037 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1038 // Perform PHI construction.
1039 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1040 LI->replaceAllUsesWith(v);
Chris Lattnerf3313162008-12-15 03:46:38 +00001041
Chris Lattner0aefc0e2009-02-12 07:00:35 +00001042 if (isa<PHINode>(v))
Chris Lattnerf3313162008-12-15 03:46:38 +00001043 v->takeName(LI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001044 if (isa<PointerType>(v->getType()))
1045 MD->invalidateCachedPointerInfo(v);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001046 toErase.push_back(LI);
1047 NumGVNLoad++;
1048 return true;
1049 }
1050
1051 if (!EnablePRE || !EnableLoadPRE)
1052 return false;
1053
1054 // Okay, we have *some* definitions of the value. This means that the value
1055 // is available in some of our (transitive) predecessors. Lets think about
1056 // doing PRE of this load. This will involve inserting a new load into the
1057 // predecessor when it's not available. We could do this in general, but
1058 // prefer to not increase code size. As such, we only do this when we know
1059 // that we only have to insert *one* load (which means we're basically moving
1060 // the load, not inserting a new one).
1061
Owen Anderson88554df2009-05-31 09:03:40 +00001062 SmallPtrSet<BasicBlock *, 4> Blockers;
1063 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1064 Blockers.insert(UnavailableBlocks[i]);
1065
1066 // Lets find first basic block with more than one predecessor. Walk backwards
1067 // through predecessors if needed.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001068 BasicBlock *LoadBB = LI->getParent();
Owen Anderson88554df2009-05-31 09:03:40 +00001069 BasicBlock *TmpBB = LoadBB;
1070
1071 bool isSinglePred = false;
1072 while (TmpBB->getSinglePredecessor()) {
1073 isSinglePred = true;
1074 TmpBB = TmpBB->getSinglePredecessor();
1075 if (!TmpBB) // If haven't found any, bail now.
1076 return false;
1077 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1078 return false;
1079 if (Blockers.count(TmpBB))
1080 return false;
1081 }
1082
1083 assert(TmpBB);
1084 LoadBB = TmpBB;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001085
1086 // If we have a repl set with LI itself in it, this means we have a loop where
1087 // at least one of the values is LI. Since this means that we won't be able
1088 // to eliminate LI even if we insert uses in the other predecessors, we will
1089 // end up increasing code size. Reject this by scanning for LI.
1090 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1091 if (ValuesPerBlock[i].second == LI)
1092 return false;
1093
Owen Anderson88554df2009-05-31 09:03:40 +00001094 if (isSinglePred) {
1095 bool isHot = false;
1096 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1097 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
1098 // "Hot" Instruction is in some loop (because it dominates its dep.
1099 // instruction).
1100 if (DT->dominates(LI, I)) {
1101 isHot = true;
1102 break;
1103 }
1104
1105 // We are interested only in "hot" instructions. We don't want to do any
1106 // mis-optimizations here.
1107 if (!isHot)
1108 return false;
1109 }
1110
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001111 // Okay, we have some hope :). Check to see if the loaded value is fully
1112 // available in all but one predecessor.
1113 // FIXME: If we could restructure the CFG, we could make a common pred with
1114 // all the preds that don't have an available LI and insert a new load into
1115 // that one block.
1116 BasicBlock *UnavailablePred = 0;
1117
Chris Lattner72bc70d2008-12-05 07:49:08 +00001118 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001119 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1120 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1121 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1122 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1123
1124 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1125 PI != E; ++PI) {
1126 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1127 continue;
1128
1129 // If this load is not available in multiple predecessors, reject it.
1130 if (UnavailablePred && UnavailablePred != *PI)
1131 return false;
1132 UnavailablePred = *PI;
1133 }
1134
1135 assert(UnavailablePred != 0 &&
1136 "Fully available value should be eliminated above!");
1137
1138 // If the loaded pointer is PHI node defined in this block, do PHI translation
1139 // to get its value in the predecessor.
1140 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
1141
1142 // Make sure the value is live in the predecessor. If it was defined by a
1143 // non-PHI instruction in this block, we don't know how to recompute it above.
1144 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1145 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
1146 DEBUG(cerr << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
1147 << *LPInst << *LI << "\n");
1148 return false;
1149 }
1150
1151 // We don't currently handle critical edges :(
1152 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
1153 DEBUG(cerr << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
1154 << UnavailablePred->getName() << "': " << *LI);
1155 return false;
Owen Andersona37226a2007-08-07 23:12:31 +00001156 }
Chris Lattner72bc70d2008-12-05 07:49:08 +00001157
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001158 // Okay, we can eliminate this load by inserting a reload in the predecessor
1159 // and using PHI construction to get the value in the other predecessors, do
1160 // it.
Chris Lattner7f7c7362008-12-05 17:04:12 +00001161 DEBUG(cerr << "GVN REMOVING PRE LOAD: " << *LI);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001162
1163 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1164 LI->getAlignment(),
1165 UnavailablePred->getTerminator());
1166
Owen Anderson246ddf52009-05-29 05:37:54 +00001167 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1168 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1169 I != E; ++I)
1170 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
1171
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001172 DenseMap<BasicBlock*, Value*> BlockReplValues;
1173 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1174 BlockReplValues[UnavailablePred] = NewLoad;
1175
1176 // Perform PHI construction.
1177 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1178 LI->replaceAllUsesWith(v);
Chris Lattner0aefc0e2009-02-12 07:00:35 +00001179 if (isa<PHINode>(v))
Chris Lattnerf3313162008-12-15 03:46:38 +00001180 v->takeName(LI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001181 if (isa<PointerType>(v->getType()))
1182 MD->invalidateCachedPointerInfo(v);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001183 toErase.push_back(LI);
1184 NumPRELoad++;
Owen Anderson0cd32032007-07-25 19:57:03 +00001185 return true;
1186}
1187
Owen Anderson62bc33c2007-08-16 22:02:55 +00001188/// processLoad - Attempt to eliminate a load, first by eliminating it
1189/// locally, and then attempting non-local elimination if that fails.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001190bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1191 if (L->isVolatile())
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001192 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001193
1194 Value* pointer = L->getPointerOperand();
Chris Lattnerb51deb92008-12-05 21:04:20 +00001195
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001196 // ... to a pointer that has been loaded from before...
Chris Lattner663e4412008-12-01 00:40:32 +00001197 MemDepResult dep = MD->getDependency(L);
Owen Anderson8e8278e2007-08-14 17:59:48 +00001198
Chris Lattnerb51deb92008-12-05 21:04:20 +00001199 // If the value isn't available, don't do anything!
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001200 if (dep.isClobber()) {
1201 DEBUG(
1202 // fast print dep, using operator<< on instruction would be too slow
1203 DOUT << "GVN: load ";
1204 WriteAsOperand(*DOUT.stream(), L);
1205 Instruction *I = dep.getInst();
Torok Edwin70ac1422009-05-29 16:58:36 +00001206 DOUT << " is clobbered by " << *I;
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001207 );
Chris Lattnerb51deb92008-12-05 21:04:20 +00001208 return false;
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001209 }
Chris Lattnerb51deb92008-12-05 21:04:20 +00001210
1211 // If it is defined in another block, try harder.
Chris Lattnerae199312008-12-09 19:21:47 +00001212 if (dep.isNonLocal())
Chris Lattnerb51deb92008-12-05 21:04:20 +00001213 return processNonLocalLoad(L, toErase);
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001214
Chris Lattnerb51deb92008-12-05 21:04:20 +00001215 Instruction *DepInst = dep.getInst();
1216 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1217 // Only forward substitute stores to loads of the same type.
1218 // FIXME: Could do better!
1219 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1220 return false;
1221
1222 // Remove it!
1223 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerbc99be12008-12-09 22:06:23 +00001224 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1225 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattnerb51deb92008-12-05 21:04:20 +00001226 toErase.push_back(L);
1227 NumGVNLoad++;
1228 return true;
1229 }
1230
1231 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1232 // Only forward substitute stores to loads of the same type.
1233 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1234 if (DepLI->getType() != L->getType())
1235 return false;
1236
1237 // Remove it!
1238 L->replaceAllUsesWith(DepLI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001239 if (isa<PointerType>(DepLI->getType()))
1240 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001241 toErase.push_back(L);
1242 NumGVNLoad++;
1243 return true;
1244 }
1245
Chris Lattner237a8282008-11-30 01:39:32 +00001246 // If this load really doesn't depend on anything, then we must be loading an
1247 // undef value. This can happen when loading for a fresh allocation with no
1248 // intervening stores, for example.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001249 if (isa<AllocationInst>(DepInst)) {
Chris Lattner237a8282008-11-30 01:39:32 +00001250 L->replaceAllUsesWith(UndefValue::get(L->getType()));
1251 toErase.push_back(L);
Chris Lattner237a8282008-11-30 01:39:32 +00001252 NumGVNLoad++;
Chris Lattnerb51deb92008-12-05 21:04:20 +00001253 return true;
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001254 }
1255
Chris Lattnerb51deb92008-12-05 21:04:20 +00001256 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001257}
1258
Owen Anderson6fafe842008-06-20 01:15:47 +00001259Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Andersonb70a5712008-06-23 17:49:45 +00001260 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1261 if (I == localAvail.end())
1262 return 0;
1263
1264 ValueNumberScope* locals = I->second;
Owen Anderson6fafe842008-06-20 01:15:47 +00001265
1266 while (locals) {
1267 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1268 if (I != locals->table.end())
1269 return I->second;
1270 else
1271 locals = locals->parent;
1272 }
1273
1274 return 0;
1275}
1276
Owen Anderson255dafc2008-12-15 02:03:00 +00001277/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
1278/// by inheritance from the dominator fails, see if we can perform phi
1279/// construction to eliminate the redundancy.
1280Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1281 BasicBlock* BaseBlock = orig->getParent();
1282
1283 SmallPtrSet<BasicBlock*, 4> Visited;
1284 SmallVector<BasicBlock*, 8> Stack;
1285 Stack.push_back(BaseBlock);
1286
1287 DenseMap<BasicBlock*, Value*> Results;
1288
1289 // Walk backwards through our predecessors, looking for instances of the
1290 // value number we're looking for. Instances are recorded in the Results
1291 // map, which is then used to perform phi construction.
1292 while (!Stack.empty()) {
1293 BasicBlock* Current = Stack.back();
1294 Stack.pop_back();
1295
1296 // If we've walked all the way to a proper dominator, then give up. Cases
1297 // where the instance is in the dominator will have been caught by the fast
1298 // path, and any cases that require phi construction further than this are
1299 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1300 // time improvement.
1301 if (DT->properlyDominates(Current, orig->getParent())) return 0;
1302
1303 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1304 localAvail.find(Current);
1305 if (LA == localAvail.end()) return 0;
Chris Lattner2f39b292009-01-19 22:00:18 +00001306 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Anderson255dafc2008-12-15 02:03:00 +00001307
1308 if (V != LA->second->table.end()) {
1309 // Found an instance, record it.
1310 Results.insert(std::make_pair(Current, V->second));
1311 continue;
1312 }
1313
1314 // If we reach the beginning of the function, then give up.
1315 if (pred_begin(Current) == pred_end(Current))
1316 return 0;
1317
1318 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1319 PI != PE; ++PI)
1320 if (Visited.insert(*PI))
1321 Stack.push_back(*PI);
1322 }
1323
1324 // If we didn't find instances, give up. Otherwise, perform phi construction.
1325 if (Results.size() == 0)
1326 return 0;
1327 else
1328 return GetValueForBlock(BaseBlock, orig, Results, true);
1329}
1330
Owen Anderson36057c72007-08-14 18:16:29 +00001331/// processInstruction - When calculating availability, handle an instruction
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001332/// by inserting it into the appropriate sets
Owen Andersonaf4240a2008-06-12 19:25:32 +00001333bool GVN::processInstruction(Instruction *I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001334 SmallVectorImpl<Instruction*> &toErase) {
Owen Andersonb2303722008-06-18 21:41:49 +00001335 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattnerb51deb92008-12-05 21:04:20 +00001336 bool changed = processLoad(L, toErase);
Owen Andersonb2303722008-06-18 21:41:49 +00001337
1338 if (!changed) {
1339 unsigned num = VN.lookup_or_add(L);
Owen Anderson6fafe842008-06-20 01:15:47 +00001340 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Andersonb2303722008-06-18 21:41:49 +00001341 }
1342
1343 return changed;
1344 }
1345
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001346 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Andersonb2303722008-06-18 21:41:49 +00001347 unsigned num = VN.lookup_or_add(I);
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001348
Owen Andersone8a290f2009-04-01 23:53:49 +00001349 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1350 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1351
1352 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1353 return false;
1354
1355 Value* branchCond = BI->getCondition();
1356 uint32_t condVN = VN.lookup_or_add(branchCond);
1357
1358 BasicBlock* trueSucc = BI->getSuccessor(0);
1359 BasicBlock* falseSucc = BI->getSuccessor(1);
1360
1361 if (trueSucc->getSinglePredecessor())
1362 localAvail[trueSucc]->table[condVN] = ConstantInt::getTrue();
1363 if (falseSucc->getSinglePredecessor())
1364 localAvail[falseSucc]->table[condVN] = ConstantInt::getFalse();
1365
1366 return false;
1367
Owen Andersone5ffa902008-04-07 09:59:07 +00001368 // Allocations are always uniquely numbered, so we can save time and memory
Owen Andersone8a290f2009-04-01 23:53:49 +00001369 // by fast failing them.
1370 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson6fafe842008-06-20 01:15:47 +00001371 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersone5ffa902008-04-07 09:59:07 +00001372 return false;
Owen Andersonb2303722008-06-18 21:41:49 +00001373 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001374
Owen Anderson62bc33c2007-08-16 22:02:55 +00001375 // Collapse PHI nodes
Owen Anderson31f49672007-08-14 18:33:27 +00001376 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001377 Value* constVal = CollapsePhi(p);
Owen Anderson31f49672007-08-14 18:33:27 +00001378
1379 if (constVal) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001380 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1381 PI != PE; ++PI)
Chris Lattnerae199312008-12-09 19:21:47 +00001382 PI->second.erase(p);
Owen Anderson31f49672007-08-14 18:33:27 +00001383
Owen Anderson1defe2d2007-08-16 22:51:56 +00001384 p->replaceAllUsesWith(constVal);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001385 if (isa<PointerType>(constVal->getType()))
1386 MD->invalidateCachedPointerInfo(constVal);
Owen Andersonae53c932008-12-23 00:49:51 +00001387 VN.erase(p);
1388
Owen Anderson1defe2d2007-08-16 22:51:56 +00001389 toErase.push_back(p);
Owen Andersonb2303722008-06-18 21:41:49 +00001390 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001391 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson31f49672007-08-14 18:33:27 +00001392 }
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001393
1394 // If the number we were assigned was a brand new VN, then we don't
1395 // need to do a lookup to see if the number already exists
1396 // somewhere in the domtree: it can't!
1397 } else if (num == nextNum) {
1398 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1399
Owen Anderson255dafc2008-12-15 02:03:00 +00001400 // Perform fast-path value-number based elimination of values inherited from
1401 // dominators.
Owen Anderson6fafe842008-06-20 01:15:47 +00001402 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson5fc4aba2007-12-08 01:37:09 +00001403 // Remove it!
Owen Andersonbf7d0bc2007-07-31 23:27:13 +00001404 VN.erase(I);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001405 I->replaceAllUsesWith(repl);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001406 if (isa<PointerType>(repl->getType()))
1407 MD->invalidateCachedPointerInfo(repl);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001408 toErase.push_back(I);
1409 return true;
Owen Anderson255dafc2008-12-15 02:03:00 +00001410
1411#if 0
1412 // Perform slow-pathvalue-number based elimination with phi construction.
1413 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1414 // Remove it!
1415 VN.erase(I);
1416 I->replaceAllUsesWith(repl);
1417 if (isa<PointerType>(repl->getType()))
1418 MD->invalidateCachedPointerInfo(repl);
1419 toErase.push_back(I);
1420 return true;
1421#endif
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001422 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001423 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001424 }
1425
1426 return false;
1427}
1428
Bill Wendling30788b82008-12-22 22:32:22 +00001429/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson3e75a422007-08-14 18:04:11 +00001430bool GVN::runOnFunction(Function& F) {
Chris Lattner663e4412008-12-01 00:40:32 +00001431 MD = &getAnalysis<MemoryDependenceAnalysis>();
1432 DT = &getAnalysis<DominatorTree>();
Owen Andersona472c4a2008-05-12 20:15:55 +00001433 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner663e4412008-12-01 00:40:32 +00001434 VN.setMemDep(MD);
1435 VN.setDomTree(DT);
Owen Andersonb388ca92007-10-18 19:39:33 +00001436
Owen Anderson3e75a422007-08-14 18:04:11 +00001437 bool changed = false;
1438 bool shouldContinue = true;
1439
Owen Anderson5d0af032008-07-16 17:52:31 +00001440 // Merge unconditional branches, allowing PRE to catch more
1441 // optimization opportunities.
1442 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1443 BasicBlock* BB = FI;
1444 ++FI;
Owen Andersonb31b06d2008-07-17 00:01:40 +00001445 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1446 if (removedBlock) NumGVNBlocks++;
1447
1448 changed |= removedBlock;
Owen Anderson5d0af032008-07-16 17:52:31 +00001449 }
1450
Chris Lattnerae199312008-12-09 19:21:47 +00001451 unsigned Iteration = 0;
1452
Owen Anderson3e75a422007-08-14 18:04:11 +00001453 while (shouldContinue) {
Chris Lattnerae199312008-12-09 19:21:47 +00001454 DEBUG(cerr << "GVN iteration: " << Iteration << "\n");
Owen Anderson3e75a422007-08-14 18:04:11 +00001455 shouldContinue = iterateOnFunction(F);
1456 changed |= shouldContinue;
Chris Lattnerae199312008-12-09 19:21:47 +00001457 ++Iteration;
Owen Anderson3e75a422007-08-14 18:04:11 +00001458 }
1459
Owen Andersone98c54c2008-07-18 18:03:38 +00001460 if (EnablePRE) {
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001461 bool PREChanged = true;
1462 while (PREChanged) {
1463 PREChanged = performPRE(F);
Owen Andersone98c54c2008-07-18 18:03:38 +00001464 changed |= PREChanged;
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001465 }
Owen Andersone98c54c2008-07-18 18:03:38 +00001466 }
Chris Lattnerae199312008-12-09 19:21:47 +00001467 // FIXME: Should perform GVN again after PRE does something. PRE can move
1468 // computations into blocks where they become fully redundant. Note that
1469 // we can't do this until PRE's critical edge splitting updates memdep.
1470 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001471
1472 cleanupGlobalSets();
1473
Owen Anderson3e75a422007-08-14 18:04:11 +00001474 return changed;
1475}
1476
1477
Owen Anderson255dafc2008-12-15 02:03:00 +00001478bool GVN::processBlock(BasicBlock* BB) {
Chris Lattnerae199312008-12-09 19:21:47 +00001479 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1480 // incrementing BI before processing an instruction).
Owen Andersonaf4240a2008-06-12 19:25:32 +00001481 SmallVector<Instruction*, 8> toErase;
Owen Andersonaf4240a2008-06-12 19:25:32 +00001482 bool changed_function = false;
Owen Andersonb2303722008-06-18 21:41:49 +00001483
Owen Andersonaf4240a2008-06-12 19:25:32 +00001484 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1485 BI != BE;) {
Chris Lattnerb51deb92008-12-05 21:04:20 +00001486 changed_function |= processInstruction(BI, toErase);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001487 if (toErase.empty()) {
1488 ++BI;
1489 continue;
1490 }
1491
1492 // If we need some instructions deleted, do it now.
1493 NumGVNInstr += toErase.size();
1494
1495 // Avoid iterator invalidation.
1496 bool AtStart = BI == BB->begin();
1497 if (!AtStart)
1498 --BI;
1499
1500 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner663e4412008-12-01 00:40:32 +00001501 E = toErase.end(); I != E; ++I) {
1502 DEBUG(cerr << "GVN removed: " << **I);
1503 MD->removeInstruction(*I);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001504 (*I)->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00001505 DEBUG(verifyRemoved(*I));
Chris Lattner663e4412008-12-01 00:40:32 +00001506 }
Chris Lattnerae199312008-12-09 19:21:47 +00001507 toErase.clear();
Owen Andersonaf4240a2008-06-12 19:25:32 +00001508
1509 if (AtStart)
1510 BI = BB->begin();
1511 else
1512 ++BI;
Owen Andersonaf4240a2008-06-12 19:25:32 +00001513 }
1514
Owen Andersonaf4240a2008-06-12 19:25:32 +00001515 return changed_function;
1516}
1517
Owen Andersonb2303722008-06-18 21:41:49 +00001518/// performPRE - Perform a purely local form of PRE that looks for diamond
1519/// control flow patterns and attempts to perform simple PRE at the join point.
1520bool GVN::performPRE(Function& F) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001521 bool Changed = false;
Owen Anderson5c274ee2008-06-19 19:54:19 +00001522 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner09713792008-12-01 07:29:03 +00001523 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersonb2303722008-06-18 21:41:49 +00001524 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1525 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1526 BasicBlock* CurrentBlock = *DI;
1527
1528 // Nothing to PRE in the entry block.
1529 if (CurrentBlock == &F.getEntryBlock()) continue;
1530
1531 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1532 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001533 Instruction *CurInst = BI++;
Duncan Sands7af1c782009-05-06 06:49:50 +00001534
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001535 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
John Criswell090c0a22009-03-10 15:04:53 +00001536 isa<PHINode>(CurInst) || (CurInst->getType() == Type::VoidTy) ||
Duncan Sands7af1c782009-05-06 06:49:50 +00001537 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell090c0a22009-03-10 15:04:53 +00001538 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001539 continue;
Duncan Sands7af1c782009-05-06 06:49:50 +00001540
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001541 uint32_t valno = VN.lookup(CurInst);
Owen Andersonb2303722008-06-18 21:41:49 +00001542
1543 // Look for the predecessors for PRE opportunities. We're
1544 // only trying to solve the basic diamond case, where
1545 // a value is computed in the successor and one predecessor,
1546 // but not the other. We also explicitly disallow cases
1547 // where the successor is its own predecessor, because they're
1548 // more complicated to get right.
1549 unsigned numWith = 0;
1550 unsigned numWithout = 0;
1551 BasicBlock* PREPred = 0;
Chris Lattner09713792008-12-01 07:29:03 +00001552 predMap.clear();
1553
Owen Andersonb2303722008-06-18 21:41:49 +00001554 for (pred_iterator PI = pred_begin(CurrentBlock),
1555 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1556 // We're not interested in PRE where the block is its
Owen Anderson6fafe842008-06-20 01:15:47 +00001557 // own predecessor, on in blocks with predecessors
1558 // that are not reachable.
1559 if (*PI == CurrentBlock) {
Owen Andersonb2303722008-06-18 21:41:49 +00001560 numWithout = 2;
Owen Anderson6fafe842008-06-20 01:15:47 +00001561 break;
1562 } else if (!localAvail.count(*PI)) {
1563 numWithout = 2;
1564 break;
1565 }
1566
1567 DenseMap<uint32_t, Value*>::iterator predV =
1568 localAvail[*PI]->table.find(valno);
1569 if (predV == localAvail[*PI]->table.end()) {
Owen Andersonb2303722008-06-18 21:41:49 +00001570 PREPred = *PI;
1571 numWithout++;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001572 } else if (predV->second == CurInst) {
Owen Andersonb2303722008-06-18 21:41:49 +00001573 numWithout = 2;
1574 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001575 predMap[*PI] = predV->second;
Owen Andersonb2303722008-06-18 21:41:49 +00001576 numWith++;
1577 }
1578 }
1579
1580 // Don't do PRE when it might increase code size, i.e. when
1581 // we would need to insert instructions in more than one pred.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001582 if (numWithout != 1 || numWith == 0)
Owen Andersonb2303722008-06-18 21:41:49 +00001583 continue;
Owen Andersonb2303722008-06-18 21:41:49 +00001584
Owen Anderson5c274ee2008-06-19 19:54:19 +00001585 // We can't do PRE safely on a critical edge, so instead we schedule
1586 // the edge to be split and perform the PRE the next time we iterate
1587 // on the function.
1588 unsigned succNum = 0;
1589 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1590 i != e; ++i)
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001591 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Anderson5c274ee2008-06-19 19:54:19 +00001592 succNum = i;
1593 break;
1594 }
1595
1596 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1597 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Anderson5c274ee2008-06-19 19:54:19 +00001598 continue;
1599 }
1600
Owen Andersonb2303722008-06-18 21:41:49 +00001601 // Instantiate the expression the in predecessor that lacked it.
1602 // Because we are going top-down through the block, all value numbers
1603 // will be available in the predecessor by the time we need them. Any
1604 // that weren't original present will have been instantiated earlier
1605 // in this loop.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001606 Instruction* PREInstr = CurInst->clone();
Owen Andersonb2303722008-06-18 21:41:49 +00001607 bool success = true;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001608 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1609 Value *Op = PREInstr->getOperand(i);
1610 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1611 continue;
1612
1613 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1614 PREInstr->setOperand(i, V);
1615 } else {
1616 success = false;
1617 break;
Owen Andersonc45996b2008-07-11 20:05:13 +00001618 }
Owen Andersonb2303722008-06-18 21:41:49 +00001619 }
1620
1621 // Fail out if we encounter an operand that is not available in
1622 // the PRE predecessor. This is typically because of loads which
1623 // are not value numbered precisely.
1624 if (!success) {
1625 delete PREInstr;
Bill Wendling70ded192008-12-22 22:14:07 +00001626 DEBUG(verifyRemoved(PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00001627 continue;
1628 }
1629
1630 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001631 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson6fafe842008-06-20 01:15:47 +00001632 predMap[PREPred] = PREInstr;
Owen Andersonb2303722008-06-18 21:41:49 +00001633 VN.add(PREInstr, valno);
1634 NumGVNPRE++;
1635
1636 // Update the availability map to include the new instruction.
Owen Anderson6fafe842008-06-20 01:15:47 +00001637 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00001638
1639 // Create a PHI to make the value available in this block.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001640 PHINode* Phi = PHINode::Create(CurInst->getType(),
1641 CurInst->getName() + ".pre-phi",
Owen Andersonb2303722008-06-18 21:41:49 +00001642 CurrentBlock->begin());
1643 for (pred_iterator PI = pred_begin(CurrentBlock),
1644 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson6fafe842008-06-20 01:15:47 +00001645 Phi->addIncoming(predMap[*PI], *PI);
Owen Andersonb2303722008-06-18 21:41:49 +00001646
1647 VN.add(Phi, valno);
Owen Anderson6fafe842008-06-20 01:15:47 +00001648 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Andersonb2303722008-06-18 21:41:49 +00001649
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001650 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001651 if (isa<PointerType>(Phi->getType()))
1652 MD->invalidateCachedPointerInfo(Phi);
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001653 VN.erase(CurInst);
Owen Andersonb2303722008-06-18 21:41:49 +00001654
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001655 DEBUG(cerr << "GVN PRE removed: " << *CurInst);
1656 MD->removeInstruction(CurInst);
1657 CurInst->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00001658 DEBUG(verifyRemoved(CurInst));
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001659 Changed = true;
Owen Andersonb2303722008-06-18 21:41:49 +00001660 }
1661 }
1662
Owen Anderson5c274ee2008-06-19 19:54:19 +00001663 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov64b53562008-12-05 19:38:49 +00001664 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Anderson5c274ee2008-06-19 19:54:19 +00001665 SplitCriticalEdge(I->first, I->second, this);
1666
Anton Korobeynikov64b53562008-12-05 19:38:49 +00001667 return Changed || toSplit.size();
Owen Andersonb2303722008-06-18 21:41:49 +00001668}
1669
Bill Wendling30788b82008-12-22 22:32:22 +00001670/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson3e75a422007-08-14 18:04:11 +00001671bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001672 cleanupGlobalSets();
Chris Lattner2e607012008-03-21 21:33:23 +00001673
Owen Andersone8a290f2009-04-01 23:53:49 +00001674 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1675 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1676 if (DI->getIDom())
1677 localAvail[DI->getBlock()] =
1678 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1679 else
1680 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1681 }
1682
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001683 // Top-down walk of the dominator tree
Owen Andersonb2303722008-06-18 21:41:49 +00001684 bool changed = false;
Owen Andersonc34d1122008-12-15 03:52:17 +00001685#if 0
1686 // Needed for value numbering with phi construction to work.
Owen Anderson255dafc2008-12-15 02:03:00 +00001687 ReversePostOrderTraversal<Function*> RPOT(&F);
1688 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1689 RE = RPOT.end(); RI != RE; ++RI)
1690 changed |= processBlock(*RI);
Owen Andersonc34d1122008-12-15 03:52:17 +00001691#else
1692 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1693 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1694 changed |= processBlock(DI->getBlock());
1695#endif
1696
Owen Anderson5d0af032008-07-16 17:52:31 +00001697 return changed;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001698}
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001699
1700void GVN::cleanupGlobalSets() {
1701 VN.clear();
1702 phiMap.clear();
1703
1704 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1705 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1706 delete I->second;
1707 localAvail.clear();
1708}
Bill Wendling246dbbb2008-12-22 21:36:08 +00001709
1710/// verifyRemoved - Verify that the specified instruction does not occur in our
1711/// internal data structures.
Bill Wendling6d463f22008-12-22 22:28:56 +00001712void GVN::verifyRemoved(const Instruction *Inst) const {
1713 VN.verifyRemoved(Inst);
Bill Wendling70ded192008-12-22 22:14:07 +00001714
1715 // Walk through the PHI map to make sure the instruction isn't hiding in there
1716 // somewhere.
1717 for (PhiMapType::iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00001718 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1719 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling70ded192008-12-22 22:14:07 +00001720
1721 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00001722 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1723 assert(*II != Inst && "Inst is still a value in PHI map!");
1724 }
1725 }
1726
1727 // Walk through the value number scope to make sure the instruction isn't
1728 // ferreted away in it.
1729 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1730 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1731 const ValueNumberScope *VNS = I->second;
1732
1733 while (VNS) {
1734 for (DenseMap<uint32_t, Value*>::iterator
1735 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1736 assert(II->second != Inst && "Inst still in value numbering scope!");
1737 }
1738
1739 VNS = VNS->parent;
Bill Wendling70ded192008-12-22 22:14:07 +00001740 }
1741 }
Bill Wendling246dbbb2008-12-22 21:36:08 +00001742}