blob: 1e89ef7b22d0a2ddfe02d51d7deade62db84f15d [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);
Dan Gohmanc915c952009-06-15 18:30:15 +000051static cl::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.
Torok Edwin4306b1a2009-06-17 18:48:18 +0000955 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
956 DEBUG(
957 DOUT << "GVN: non-local load ";
958 WriteAsOperand(*DOUT.stream(), LI);
959 DOUT << " is clobbered by " << *Deps[0].second.getInst();
960 );
Chris Lattner5f4f84b2008-12-18 00:51:32 +0000961 return false;
Torok Edwin4306b1a2009-06-17 18:48:18 +0000962 }
Owen Anderson516eb1c2008-08-26 22:07:42 +0000963
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000964 // Filter out useless results (non-locals, etc). Keep track of the blocks
965 // where we have a value available in repl, also keep track of whether we see
966 // dependencies that produce an unknown value for the load (such as a call
967 // that could potentially clobber the load).
968 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
969 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Owen Andersona37226a2007-08-07 23:12:31 +0000970
Chris Lattner91bcf642008-12-09 19:25:07 +0000971 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
972 BasicBlock *DepBB = Deps[i].first;
973 MemDepResult DepInfo = Deps[i].second;
Chris Lattnerbf145d62008-12-01 01:15:42 +0000974
Chris Lattnerb51deb92008-12-05 21:04:20 +0000975 if (DepInfo.isClobber()) {
976 UnavailableBlocks.push_back(DepBB);
977 continue;
978 }
979
980 Instruction *DepInst = DepInfo.getInst();
981
982 // Loading the allocation -> undef.
983 if (isa<AllocationInst>(DepInst)) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000984 ValuesPerBlock.push_back(std::make_pair(DepBB,
985 UndefValue::get(LI->getType())));
Chris Lattnerbf145d62008-12-01 01:15:42 +0000986 continue;
987 }
Chris Lattner88365bb2008-03-21 21:14:38 +0000988
Chris Lattner91bcf642008-12-09 19:25:07 +0000989 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner978796e2008-12-01 01:31:36 +0000990 // Reject loads and stores that are to the same address but are of
991 // different types.
992 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
993 // of bitfield access, it would be interesting to optimize for it at some
994 // point.
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000995 if (S->getOperand(0)->getType() != LI->getType()) {
996 UnavailableBlocks.push_back(DepBB);
997 continue;
998 }
Chris Lattner978796e2008-12-01 01:31:36 +0000999
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001000 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattner978796e2008-12-01 01:31:36 +00001001
Chris Lattner91bcf642008-12-09 19:25:07 +00001002 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001003 if (LD->getType() != LI->getType()) {
1004 UnavailableBlocks.push_back(DepBB);
1005 continue;
1006 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001007 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson0cd32032007-07-25 19:57:03 +00001008 } else {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001009 UnavailableBlocks.push_back(DepBB);
1010 continue;
Owen Anderson0cd32032007-07-25 19:57:03 +00001011 }
Chris Lattner88365bb2008-03-21 21:14:38 +00001012 }
Owen Anderson0cd32032007-07-25 19:57:03 +00001013
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001014 // If we have no predecessors that produce a known value for this load, exit
1015 // early.
1016 if (ValuesPerBlock.empty()) return false;
1017
1018 // If all of the instructions we depend on produce a known value for this
1019 // load, then it is fully redundant and we can use PHI insertion to compute
1020 // its value. Insert PHIs and remove the fully redundant value now.
1021 if (UnavailableBlocks.empty()) {
1022 // Use cached PHI construction information from previous runs
1023 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattner91bcf642008-12-09 19:25:07 +00001024 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001025 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1026 I != E; ++I) {
1027 if ((*I)->getParent() == LI->getParent()) {
1028 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD #1: " << *LI);
1029 LI->replaceAllUsesWith(*I);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001030 if (isa<PointerType>((*I)->getType()))
1031 MD->invalidateCachedPointerInfo(*I);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001032 toErase.push_back(LI);
1033 NumGVNLoad++;
1034 return true;
1035 }
1036
1037 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Andersona37226a2007-08-07 23:12:31 +00001038 }
Chris Lattner88365bb2008-03-21 21:14:38 +00001039
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001040 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD: " << *LI);
1041
1042 DenseMap<BasicBlock*, Value*> BlockReplValues;
1043 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1044 // Perform PHI construction.
1045 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1046 LI->replaceAllUsesWith(v);
Chris Lattnerf3313162008-12-15 03:46:38 +00001047
Chris Lattner0aefc0e2009-02-12 07:00:35 +00001048 if (isa<PHINode>(v))
Chris Lattnerf3313162008-12-15 03:46:38 +00001049 v->takeName(LI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001050 if (isa<PointerType>(v->getType()))
1051 MD->invalidateCachedPointerInfo(v);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001052 toErase.push_back(LI);
1053 NumGVNLoad++;
1054 return true;
1055 }
1056
1057 if (!EnablePRE || !EnableLoadPRE)
1058 return false;
1059
1060 // Okay, we have *some* definitions of the value. This means that the value
1061 // is available in some of our (transitive) predecessors. Lets think about
1062 // doing PRE of this load. This will involve inserting a new load into the
1063 // predecessor when it's not available. We could do this in general, but
1064 // prefer to not increase code size. As such, we only do this when we know
1065 // that we only have to insert *one* load (which means we're basically moving
1066 // the load, not inserting a new one).
1067
Owen Anderson88554df2009-05-31 09:03:40 +00001068 SmallPtrSet<BasicBlock *, 4> Blockers;
1069 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1070 Blockers.insert(UnavailableBlocks[i]);
1071
1072 // Lets find first basic block with more than one predecessor. Walk backwards
1073 // through predecessors if needed.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001074 BasicBlock *LoadBB = LI->getParent();
Owen Anderson88554df2009-05-31 09:03:40 +00001075 BasicBlock *TmpBB = LoadBB;
1076
1077 bool isSinglePred = false;
1078 while (TmpBB->getSinglePredecessor()) {
1079 isSinglePred = true;
1080 TmpBB = TmpBB->getSinglePredecessor();
1081 if (!TmpBB) // If haven't found any, bail now.
1082 return false;
1083 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1084 return false;
1085 if (Blockers.count(TmpBB))
1086 return false;
1087 }
1088
1089 assert(TmpBB);
1090 LoadBB = TmpBB;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001091
1092 // If we have a repl set with LI itself in it, this means we have a loop where
1093 // at least one of the values is LI. Since this means that we won't be able
1094 // to eliminate LI even if we insert uses in the other predecessors, we will
1095 // end up increasing code size. Reject this by scanning for LI.
1096 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1097 if (ValuesPerBlock[i].second == LI)
1098 return false;
1099
Owen Anderson88554df2009-05-31 09:03:40 +00001100 if (isSinglePred) {
1101 bool isHot = false;
1102 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1103 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
1104 // "Hot" Instruction is in some loop (because it dominates its dep.
1105 // instruction).
1106 if (DT->dominates(LI, I)) {
1107 isHot = true;
1108 break;
1109 }
1110
1111 // We are interested only in "hot" instructions. We don't want to do any
1112 // mis-optimizations here.
1113 if (!isHot)
1114 return false;
1115 }
1116
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001117 // Okay, we have some hope :). Check to see if the loaded value is fully
1118 // available in all but one predecessor.
1119 // FIXME: If we could restructure the CFG, we could make a common pred with
1120 // all the preds that don't have an available LI and insert a new load into
1121 // that one block.
1122 BasicBlock *UnavailablePred = 0;
1123
Chris Lattner72bc70d2008-12-05 07:49:08 +00001124 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001125 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1126 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1127 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1128 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1129
1130 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1131 PI != E; ++PI) {
1132 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1133 continue;
1134
1135 // If this load is not available in multiple predecessors, reject it.
1136 if (UnavailablePred && UnavailablePred != *PI)
1137 return false;
1138 UnavailablePred = *PI;
1139 }
1140
1141 assert(UnavailablePred != 0 &&
1142 "Fully available value should be eliminated above!");
1143
1144 // If the loaded pointer is PHI node defined in this block, do PHI translation
1145 // to get its value in the predecessor.
1146 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
1147
1148 // Make sure the value is live in the predecessor. If it was defined by a
1149 // non-PHI instruction in this block, we don't know how to recompute it above.
1150 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1151 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
1152 DEBUG(cerr << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
1153 << *LPInst << *LI << "\n");
1154 return false;
1155 }
1156
1157 // We don't currently handle critical edges :(
1158 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
1159 DEBUG(cerr << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
1160 << UnavailablePred->getName() << "': " << *LI);
1161 return false;
Owen Andersona37226a2007-08-07 23:12:31 +00001162 }
Chris Lattner72bc70d2008-12-05 07:49:08 +00001163
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001164 // Okay, we can eliminate this load by inserting a reload in the predecessor
1165 // and using PHI construction to get the value in the other predecessors, do
1166 // it.
Chris Lattner7f7c7362008-12-05 17:04:12 +00001167 DEBUG(cerr << "GVN REMOVING PRE LOAD: " << *LI);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001168
1169 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1170 LI->getAlignment(),
1171 UnavailablePred->getTerminator());
1172
Owen Anderson246ddf52009-05-29 05:37:54 +00001173 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1174 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1175 I != E; ++I)
1176 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
1177
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001178 DenseMap<BasicBlock*, Value*> BlockReplValues;
1179 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1180 BlockReplValues[UnavailablePred] = NewLoad;
1181
1182 // Perform PHI construction.
1183 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1184 LI->replaceAllUsesWith(v);
Chris Lattner0aefc0e2009-02-12 07:00:35 +00001185 if (isa<PHINode>(v))
Chris Lattnerf3313162008-12-15 03:46:38 +00001186 v->takeName(LI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001187 if (isa<PointerType>(v->getType()))
1188 MD->invalidateCachedPointerInfo(v);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001189 toErase.push_back(LI);
1190 NumPRELoad++;
Owen Anderson0cd32032007-07-25 19:57:03 +00001191 return true;
1192}
1193
Owen Anderson62bc33c2007-08-16 22:02:55 +00001194/// processLoad - Attempt to eliminate a load, first by eliminating it
1195/// locally, and then attempting non-local elimination if that fails.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001196bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1197 if (L->isVolatile())
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001198 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001199
1200 Value* pointer = L->getPointerOperand();
Chris Lattnerb51deb92008-12-05 21:04:20 +00001201
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001202 // ... to a pointer that has been loaded from before...
Chris Lattner663e4412008-12-01 00:40:32 +00001203 MemDepResult dep = MD->getDependency(L);
Owen Anderson8e8278e2007-08-14 17:59:48 +00001204
Chris Lattnerb51deb92008-12-05 21:04:20 +00001205 // If the value isn't available, don't do anything!
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001206 if (dep.isClobber()) {
1207 DEBUG(
1208 // fast print dep, using operator<< on instruction would be too slow
1209 DOUT << "GVN: load ";
1210 WriteAsOperand(*DOUT.stream(), L);
1211 Instruction *I = dep.getInst();
Torok Edwin70ac1422009-05-29 16:58:36 +00001212 DOUT << " is clobbered by " << *I;
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001213 );
Chris Lattnerb51deb92008-12-05 21:04:20 +00001214 return false;
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001215 }
Chris Lattnerb51deb92008-12-05 21:04:20 +00001216
1217 // If it is defined in another block, try harder.
Chris Lattnerae199312008-12-09 19:21:47 +00001218 if (dep.isNonLocal())
Chris Lattnerb51deb92008-12-05 21:04:20 +00001219 return processNonLocalLoad(L, toErase);
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001220
Chris Lattnerb51deb92008-12-05 21:04:20 +00001221 Instruction *DepInst = dep.getInst();
1222 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1223 // Only forward substitute stores to loads of the same type.
1224 // FIXME: Could do better!
1225 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1226 return false;
1227
1228 // Remove it!
1229 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerbc99be12008-12-09 22:06:23 +00001230 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1231 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattnerb51deb92008-12-05 21:04:20 +00001232 toErase.push_back(L);
1233 NumGVNLoad++;
1234 return true;
1235 }
1236
1237 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1238 // Only forward substitute stores to loads of the same type.
1239 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1240 if (DepLI->getType() != L->getType())
1241 return false;
1242
1243 // Remove it!
1244 L->replaceAllUsesWith(DepLI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001245 if (isa<PointerType>(DepLI->getType()))
1246 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001247 toErase.push_back(L);
1248 NumGVNLoad++;
1249 return true;
1250 }
1251
Chris Lattner237a8282008-11-30 01:39:32 +00001252 // If this load really doesn't depend on anything, then we must be loading an
1253 // undef value. This can happen when loading for a fresh allocation with no
1254 // intervening stores, for example.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001255 if (isa<AllocationInst>(DepInst)) {
Chris Lattner237a8282008-11-30 01:39:32 +00001256 L->replaceAllUsesWith(UndefValue::get(L->getType()));
1257 toErase.push_back(L);
Chris Lattner237a8282008-11-30 01:39:32 +00001258 NumGVNLoad++;
Chris Lattnerb51deb92008-12-05 21:04:20 +00001259 return true;
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001260 }
1261
Chris Lattnerb51deb92008-12-05 21:04:20 +00001262 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001263}
1264
Owen Anderson6fafe842008-06-20 01:15:47 +00001265Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Andersonb70a5712008-06-23 17:49:45 +00001266 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1267 if (I == localAvail.end())
1268 return 0;
1269
1270 ValueNumberScope* locals = I->second;
Owen Anderson6fafe842008-06-20 01:15:47 +00001271
1272 while (locals) {
1273 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1274 if (I != locals->table.end())
1275 return I->second;
1276 else
1277 locals = locals->parent;
1278 }
1279
1280 return 0;
1281}
1282
Owen Anderson255dafc2008-12-15 02:03:00 +00001283/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
1284/// by inheritance from the dominator fails, see if we can perform phi
1285/// construction to eliminate the redundancy.
1286Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1287 BasicBlock* BaseBlock = orig->getParent();
1288
1289 SmallPtrSet<BasicBlock*, 4> Visited;
1290 SmallVector<BasicBlock*, 8> Stack;
1291 Stack.push_back(BaseBlock);
1292
1293 DenseMap<BasicBlock*, Value*> Results;
1294
1295 // Walk backwards through our predecessors, looking for instances of the
1296 // value number we're looking for. Instances are recorded in the Results
1297 // map, which is then used to perform phi construction.
1298 while (!Stack.empty()) {
1299 BasicBlock* Current = Stack.back();
1300 Stack.pop_back();
1301
1302 // If we've walked all the way to a proper dominator, then give up. Cases
1303 // where the instance is in the dominator will have been caught by the fast
1304 // path, and any cases that require phi construction further than this are
1305 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1306 // time improvement.
1307 if (DT->properlyDominates(Current, orig->getParent())) return 0;
1308
1309 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1310 localAvail.find(Current);
1311 if (LA == localAvail.end()) return 0;
Chris Lattner2f39b292009-01-19 22:00:18 +00001312 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Anderson255dafc2008-12-15 02:03:00 +00001313
1314 if (V != LA->second->table.end()) {
1315 // Found an instance, record it.
1316 Results.insert(std::make_pair(Current, V->second));
1317 continue;
1318 }
1319
1320 // If we reach the beginning of the function, then give up.
1321 if (pred_begin(Current) == pred_end(Current))
1322 return 0;
1323
1324 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1325 PI != PE; ++PI)
1326 if (Visited.insert(*PI))
1327 Stack.push_back(*PI);
1328 }
1329
1330 // If we didn't find instances, give up. Otherwise, perform phi construction.
1331 if (Results.size() == 0)
1332 return 0;
1333 else
1334 return GetValueForBlock(BaseBlock, orig, Results, true);
1335}
1336
Owen Anderson36057c72007-08-14 18:16:29 +00001337/// processInstruction - When calculating availability, handle an instruction
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001338/// by inserting it into the appropriate sets
Owen Andersonaf4240a2008-06-12 19:25:32 +00001339bool GVN::processInstruction(Instruction *I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001340 SmallVectorImpl<Instruction*> &toErase) {
Owen Andersonb2303722008-06-18 21:41:49 +00001341 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattnerb51deb92008-12-05 21:04:20 +00001342 bool changed = processLoad(L, toErase);
Owen Andersonb2303722008-06-18 21:41:49 +00001343
1344 if (!changed) {
1345 unsigned num = VN.lookup_or_add(L);
Owen Anderson6fafe842008-06-20 01:15:47 +00001346 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Andersonb2303722008-06-18 21:41:49 +00001347 }
1348
1349 return changed;
1350 }
1351
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001352 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Andersonb2303722008-06-18 21:41:49 +00001353 unsigned num = VN.lookup_or_add(I);
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001354
Owen Andersone8a290f2009-04-01 23:53:49 +00001355 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1356 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1357
1358 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1359 return false;
1360
1361 Value* branchCond = BI->getCondition();
1362 uint32_t condVN = VN.lookup_or_add(branchCond);
1363
1364 BasicBlock* trueSucc = BI->getSuccessor(0);
1365 BasicBlock* falseSucc = BI->getSuccessor(1);
1366
1367 if (trueSucc->getSinglePredecessor())
1368 localAvail[trueSucc]->table[condVN] = ConstantInt::getTrue();
1369 if (falseSucc->getSinglePredecessor())
1370 localAvail[falseSucc]->table[condVN] = ConstantInt::getFalse();
1371
1372 return false;
1373
Owen Andersone5ffa902008-04-07 09:59:07 +00001374 // Allocations are always uniquely numbered, so we can save time and memory
Owen Andersone8a290f2009-04-01 23:53:49 +00001375 // by fast failing them.
1376 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson6fafe842008-06-20 01:15:47 +00001377 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersone5ffa902008-04-07 09:59:07 +00001378 return false;
Owen Andersonb2303722008-06-18 21:41:49 +00001379 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001380
Owen Anderson62bc33c2007-08-16 22:02:55 +00001381 // Collapse PHI nodes
Owen Anderson31f49672007-08-14 18:33:27 +00001382 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001383 Value* constVal = CollapsePhi(p);
Owen Anderson31f49672007-08-14 18:33:27 +00001384
1385 if (constVal) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001386 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1387 PI != PE; ++PI)
Chris Lattnerae199312008-12-09 19:21:47 +00001388 PI->second.erase(p);
Owen Anderson31f49672007-08-14 18:33:27 +00001389
Owen Anderson1defe2d2007-08-16 22:51:56 +00001390 p->replaceAllUsesWith(constVal);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001391 if (isa<PointerType>(constVal->getType()))
1392 MD->invalidateCachedPointerInfo(constVal);
Owen Andersonae53c932008-12-23 00:49:51 +00001393 VN.erase(p);
1394
Owen Anderson1defe2d2007-08-16 22:51:56 +00001395 toErase.push_back(p);
Owen Andersonb2303722008-06-18 21:41:49 +00001396 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001397 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson31f49672007-08-14 18:33:27 +00001398 }
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001399
1400 // If the number we were assigned was a brand new VN, then we don't
1401 // need to do a lookup to see if the number already exists
1402 // somewhere in the domtree: it can't!
1403 } else if (num == nextNum) {
1404 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1405
Owen Anderson255dafc2008-12-15 02:03:00 +00001406 // Perform fast-path value-number based elimination of values inherited from
1407 // dominators.
Owen Anderson6fafe842008-06-20 01:15:47 +00001408 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson5fc4aba2007-12-08 01:37:09 +00001409 // Remove it!
Owen Andersonbf7d0bc2007-07-31 23:27:13 +00001410 VN.erase(I);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001411 I->replaceAllUsesWith(repl);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001412 if (isa<PointerType>(repl->getType()))
1413 MD->invalidateCachedPointerInfo(repl);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001414 toErase.push_back(I);
1415 return true;
Owen Anderson255dafc2008-12-15 02:03:00 +00001416
1417#if 0
1418 // Perform slow-pathvalue-number based elimination with phi construction.
1419 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1420 // Remove it!
1421 VN.erase(I);
1422 I->replaceAllUsesWith(repl);
1423 if (isa<PointerType>(repl->getType()))
1424 MD->invalidateCachedPointerInfo(repl);
1425 toErase.push_back(I);
1426 return true;
1427#endif
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001428 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001429 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001430 }
1431
1432 return false;
1433}
1434
Bill Wendling30788b82008-12-22 22:32:22 +00001435/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson3e75a422007-08-14 18:04:11 +00001436bool GVN::runOnFunction(Function& F) {
Chris Lattner663e4412008-12-01 00:40:32 +00001437 MD = &getAnalysis<MemoryDependenceAnalysis>();
1438 DT = &getAnalysis<DominatorTree>();
Owen Andersona472c4a2008-05-12 20:15:55 +00001439 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner663e4412008-12-01 00:40:32 +00001440 VN.setMemDep(MD);
1441 VN.setDomTree(DT);
Owen Andersonb388ca92007-10-18 19:39:33 +00001442
Owen Anderson3e75a422007-08-14 18:04:11 +00001443 bool changed = false;
1444 bool shouldContinue = true;
1445
Owen Anderson5d0af032008-07-16 17:52:31 +00001446 // Merge unconditional branches, allowing PRE to catch more
1447 // optimization opportunities.
1448 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1449 BasicBlock* BB = FI;
1450 ++FI;
Owen Andersonb31b06d2008-07-17 00:01:40 +00001451 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1452 if (removedBlock) NumGVNBlocks++;
1453
1454 changed |= removedBlock;
Owen Anderson5d0af032008-07-16 17:52:31 +00001455 }
1456
Chris Lattnerae199312008-12-09 19:21:47 +00001457 unsigned Iteration = 0;
1458
Owen Anderson3e75a422007-08-14 18:04:11 +00001459 while (shouldContinue) {
Chris Lattnerae199312008-12-09 19:21:47 +00001460 DEBUG(cerr << "GVN iteration: " << Iteration << "\n");
Owen Anderson3e75a422007-08-14 18:04:11 +00001461 shouldContinue = iterateOnFunction(F);
1462 changed |= shouldContinue;
Chris Lattnerae199312008-12-09 19:21:47 +00001463 ++Iteration;
Owen Anderson3e75a422007-08-14 18:04:11 +00001464 }
1465
Owen Andersone98c54c2008-07-18 18:03:38 +00001466 if (EnablePRE) {
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001467 bool PREChanged = true;
1468 while (PREChanged) {
1469 PREChanged = performPRE(F);
Owen Andersone98c54c2008-07-18 18:03:38 +00001470 changed |= PREChanged;
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001471 }
Owen Andersone98c54c2008-07-18 18:03:38 +00001472 }
Chris Lattnerae199312008-12-09 19:21:47 +00001473 // FIXME: Should perform GVN again after PRE does something. PRE can move
1474 // computations into blocks where they become fully redundant. Note that
1475 // we can't do this until PRE's critical edge splitting updates memdep.
1476 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001477
1478 cleanupGlobalSets();
1479
Owen Anderson3e75a422007-08-14 18:04:11 +00001480 return changed;
1481}
1482
1483
Owen Anderson255dafc2008-12-15 02:03:00 +00001484bool GVN::processBlock(BasicBlock* BB) {
Chris Lattnerae199312008-12-09 19:21:47 +00001485 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1486 // incrementing BI before processing an instruction).
Owen Andersonaf4240a2008-06-12 19:25:32 +00001487 SmallVector<Instruction*, 8> toErase;
Owen Andersonaf4240a2008-06-12 19:25:32 +00001488 bool changed_function = false;
Owen Andersonb2303722008-06-18 21:41:49 +00001489
Owen Andersonaf4240a2008-06-12 19:25:32 +00001490 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1491 BI != BE;) {
Chris Lattnerb51deb92008-12-05 21:04:20 +00001492 changed_function |= processInstruction(BI, toErase);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001493 if (toErase.empty()) {
1494 ++BI;
1495 continue;
1496 }
1497
1498 // If we need some instructions deleted, do it now.
1499 NumGVNInstr += toErase.size();
1500
1501 // Avoid iterator invalidation.
1502 bool AtStart = BI == BB->begin();
1503 if (!AtStart)
1504 --BI;
1505
1506 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner663e4412008-12-01 00:40:32 +00001507 E = toErase.end(); I != E; ++I) {
1508 DEBUG(cerr << "GVN removed: " << **I);
1509 MD->removeInstruction(*I);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001510 (*I)->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00001511 DEBUG(verifyRemoved(*I));
Chris Lattner663e4412008-12-01 00:40:32 +00001512 }
Chris Lattnerae199312008-12-09 19:21:47 +00001513 toErase.clear();
Owen Andersonaf4240a2008-06-12 19:25:32 +00001514
1515 if (AtStart)
1516 BI = BB->begin();
1517 else
1518 ++BI;
Owen Andersonaf4240a2008-06-12 19:25:32 +00001519 }
1520
Owen Andersonaf4240a2008-06-12 19:25:32 +00001521 return changed_function;
1522}
1523
Owen Andersonb2303722008-06-18 21:41:49 +00001524/// performPRE - Perform a purely local form of PRE that looks for diamond
1525/// control flow patterns and attempts to perform simple PRE at the join point.
1526bool GVN::performPRE(Function& F) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001527 bool Changed = false;
Owen Anderson5c274ee2008-06-19 19:54:19 +00001528 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner09713792008-12-01 07:29:03 +00001529 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersonb2303722008-06-18 21:41:49 +00001530 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1531 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1532 BasicBlock* CurrentBlock = *DI;
1533
1534 // Nothing to PRE in the entry block.
1535 if (CurrentBlock == &F.getEntryBlock()) continue;
1536
1537 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1538 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001539 Instruction *CurInst = BI++;
Duncan Sands7af1c782009-05-06 06:49:50 +00001540
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001541 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
John Criswell090c0a22009-03-10 15:04:53 +00001542 isa<PHINode>(CurInst) || (CurInst->getType() == Type::VoidTy) ||
Duncan Sands7af1c782009-05-06 06:49:50 +00001543 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell090c0a22009-03-10 15:04:53 +00001544 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001545 continue;
Duncan Sands7af1c782009-05-06 06:49:50 +00001546
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001547 uint32_t valno = VN.lookup(CurInst);
Owen Andersonb2303722008-06-18 21:41:49 +00001548
1549 // Look for the predecessors for PRE opportunities. We're
1550 // only trying to solve the basic diamond case, where
1551 // a value is computed in the successor and one predecessor,
1552 // but not the other. We also explicitly disallow cases
1553 // where the successor is its own predecessor, because they're
1554 // more complicated to get right.
1555 unsigned numWith = 0;
1556 unsigned numWithout = 0;
1557 BasicBlock* PREPred = 0;
Chris Lattner09713792008-12-01 07:29:03 +00001558 predMap.clear();
1559
Owen Andersonb2303722008-06-18 21:41:49 +00001560 for (pred_iterator PI = pred_begin(CurrentBlock),
1561 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1562 // We're not interested in PRE where the block is its
Owen Anderson6fafe842008-06-20 01:15:47 +00001563 // own predecessor, on in blocks with predecessors
1564 // that are not reachable.
1565 if (*PI == CurrentBlock) {
Owen Andersonb2303722008-06-18 21:41:49 +00001566 numWithout = 2;
Owen Anderson6fafe842008-06-20 01:15:47 +00001567 break;
1568 } else if (!localAvail.count(*PI)) {
1569 numWithout = 2;
1570 break;
1571 }
1572
1573 DenseMap<uint32_t, Value*>::iterator predV =
1574 localAvail[*PI]->table.find(valno);
1575 if (predV == localAvail[*PI]->table.end()) {
Owen Andersonb2303722008-06-18 21:41:49 +00001576 PREPred = *PI;
1577 numWithout++;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001578 } else if (predV->second == CurInst) {
Owen Andersonb2303722008-06-18 21:41:49 +00001579 numWithout = 2;
1580 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001581 predMap[*PI] = predV->second;
Owen Andersonb2303722008-06-18 21:41:49 +00001582 numWith++;
1583 }
1584 }
1585
1586 // Don't do PRE when it might increase code size, i.e. when
1587 // we would need to insert instructions in more than one pred.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001588 if (numWithout != 1 || numWith == 0)
Owen Andersonb2303722008-06-18 21:41:49 +00001589 continue;
Owen Andersonb2303722008-06-18 21:41:49 +00001590
Owen Anderson5c274ee2008-06-19 19:54:19 +00001591 // We can't do PRE safely on a critical edge, so instead we schedule
1592 // the edge to be split and perform the PRE the next time we iterate
1593 // on the function.
1594 unsigned succNum = 0;
1595 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1596 i != e; ++i)
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001597 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Anderson5c274ee2008-06-19 19:54:19 +00001598 succNum = i;
1599 break;
1600 }
1601
1602 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1603 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Anderson5c274ee2008-06-19 19:54:19 +00001604 continue;
1605 }
1606
Owen Andersonb2303722008-06-18 21:41:49 +00001607 // Instantiate the expression the in predecessor that lacked it.
1608 // Because we are going top-down through the block, all value numbers
1609 // will be available in the predecessor by the time we need them. Any
1610 // that weren't original present will have been instantiated earlier
1611 // in this loop.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001612 Instruction* PREInstr = CurInst->clone();
Owen Andersonb2303722008-06-18 21:41:49 +00001613 bool success = true;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001614 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1615 Value *Op = PREInstr->getOperand(i);
1616 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1617 continue;
1618
1619 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1620 PREInstr->setOperand(i, V);
1621 } else {
1622 success = false;
1623 break;
Owen Andersonc45996b2008-07-11 20:05:13 +00001624 }
Owen Andersonb2303722008-06-18 21:41:49 +00001625 }
1626
1627 // Fail out if we encounter an operand that is not available in
1628 // the PRE predecessor. This is typically because of loads which
1629 // are not value numbered precisely.
1630 if (!success) {
1631 delete PREInstr;
Bill Wendling70ded192008-12-22 22:14:07 +00001632 DEBUG(verifyRemoved(PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00001633 continue;
1634 }
1635
1636 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001637 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson6fafe842008-06-20 01:15:47 +00001638 predMap[PREPred] = PREInstr;
Owen Andersonb2303722008-06-18 21:41:49 +00001639 VN.add(PREInstr, valno);
1640 NumGVNPRE++;
1641
1642 // Update the availability map to include the new instruction.
Owen Anderson6fafe842008-06-20 01:15:47 +00001643 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00001644
1645 // Create a PHI to make the value available in this block.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001646 PHINode* Phi = PHINode::Create(CurInst->getType(),
1647 CurInst->getName() + ".pre-phi",
Owen Andersonb2303722008-06-18 21:41:49 +00001648 CurrentBlock->begin());
1649 for (pred_iterator PI = pred_begin(CurrentBlock),
1650 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson6fafe842008-06-20 01:15:47 +00001651 Phi->addIncoming(predMap[*PI], *PI);
Owen Andersonb2303722008-06-18 21:41:49 +00001652
1653 VN.add(Phi, valno);
Owen Anderson6fafe842008-06-20 01:15:47 +00001654 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Andersonb2303722008-06-18 21:41:49 +00001655
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001656 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001657 if (isa<PointerType>(Phi->getType()))
1658 MD->invalidateCachedPointerInfo(Phi);
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001659 VN.erase(CurInst);
Owen Andersonb2303722008-06-18 21:41:49 +00001660
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001661 DEBUG(cerr << "GVN PRE removed: " << *CurInst);
1662 MD->removeInstruction(CurInst);
1663 CurInst->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00001664 DEBUG(verifyRemoved(CurInst));
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001665 Changed = true;
Owen Andersonb2303722008-06-18 21:41:49 +00001666 }
1667 }
1668
Owen Anderson5c274ee2008-06-19 19:54:19 +00001669 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov64b53562008-12-05 19:38:49 +00001670 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Anderson5c274ee2008-06-19 19:54:19 +00001671 SplitCriticalEdge(I->first, I->second, this);
1672
Anton Korobeynikov64b53562008-12-05 19:38:49 +00001673 return Changed || toSplit.size();
Owen Andersonb2303722008-06-18 21:41:49 +00001674}
1675
Bill Wendling30788b82008-12-22 22:32:22 +00001676/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson3e75a422007-08-14 18:04:11 +00001677bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001678 cleanupGlobalSets();
Chris Lattner2e607012008-03-21 21:33:23 +00001679
Owen Andersone8a290f2009-04-01 23:53:49 +00001680 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1681 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1682 if (DI->getIDom())
1683 localAvail[DI->getBlock()] =
1684 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1685 else
1686 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1687 }
1688
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001689 // Top-down walk of the dominator tree
Owen Andersonb2303722008-06-18 21:41:49 +00001690 bool changed = false;
Owen Andersonc34d1122008-12-15 03:52:17 +00001691#if 0
1692 // Needed for value numbering with phi construction to work.
Owen Anderson255dafc2008-12-15 02:03:00 +00001693 ReversePostOrderTraversal<Function*> RPOT(&F);
1694 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1695 RE = RPOT.end(); RI != RE; ++RI)
1696 changed |= processBlock(*RI);
Owen Andersonc34d1122008-12-15 03:52:17 +00001697#else
1698 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1699 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1700 changed |= processBlock(DI->getBlock());
1701#endif
1702
Owen Anderson5d0af032008-07-16 17:52:31 +00001703 return changed;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001704}
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001705
1706void GVN::cleanupGlobalSets() {
1707 VN.clear();
1708 phiMap.clear();
1709
1710 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1711 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1712 delete I->second;
1713 localAvail.clear();
1714}
Bill Wendling246dbbb2008-12-22 21:36:08 +00001715
1716/// verifyRemoved - Verify that the specified instruction does not occur in our
1717/// internal data structures.
Bill Wendling6d463f22008-12-22 22:28:56 +00001718void GVN::verifyRemoved(const Instruction *Inst) const {
1719 VN.verifyRemoved(Inst);
Bill Wendling70ded192008-12-22 22:14:07 +00001720
1721 // Walk through the PHI map to make sure the instruction isn't hiding in there
1722 // somewhere.
1723 for (PhiMapType::iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00001724 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1725 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling70ded192008-12-22 22:14:07 +00001726
1727 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00001728 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1729 assert(*II != Inst && "Inst is still a value in PHI map!");
1730 }
1731 }
1732
1733 // Walk through the value number scope to make sure the instruction isn't
1734 // ferreted away in it.
1735 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1736 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1737 const ValueNumberScope *VNS = I->second;
1738
1739 while (VNS) {
1740 for (DenseMap<uint32_t, Value*>::iterator
1741 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1742 assert(II->second != Inst && "Inst still in value numbering scope!");
1743 }
1744
1745 VNS = VNS->parent;
Bill Wendling70ded192008-12-22 22:14:07 +00001746 }
1747 }
Bill Wendling246dbbb2008-12-22 21:36:08 +00001748}