blob: 21a52891933b8ef920c358af74332b3b1b8fc11e [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 Andersond672ecb2009-07-03 00:17:18 +000025#include "llvm/LLVMContext.h"
Owen Anderson45537912007-07-26 18:26:51 +000026#include "llvm/Value.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000027#include "llvm/ADT/DenseMap.h"
28#include "llvm/ADT/DepthFirstIterator.h"
Owen Anderson255dafc2008-12-15 02:03:00 +000029#include "llvm/ADT/PostOrderIterator.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000030#include "llvm/ADT/SmallPtrSet.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/ADT/Statistic.h"
Owen Andersonb388ca92007-10-18 19:39:33 +000033#include "llvm/Analysis/Dominators.h"
34#include "llvm/Analysis/AliasAnalysis.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000035#include "llvm/Analysis/MemoryDependenceAnalysis.h"
36#include "llvm/Support/CFG.h"
Owen Andersonaa0b6342008-06-19 19:57:25 +000037#include "llvm/Support/CommandLine.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000038#include "llvm/Support/Compiler.h"
Chris Lattner9f8a6a72008-03-29 04:36:18 +000039#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000040#include "llvm/Support/ErrorHandling.h"
Daniel Dunbarce63ffb2009-07-25 00:23:56 +000041#include "llvm/Support/raw_ostream.h"
Owen Anderson5c274ee2008-06-19 19:54:19 +000042#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesen42c3f552009-06-17 20:48:23 +000043#include "llvm/Transforms/Utils/Local.h"
Duncan Sands4520dd22008-10-08 07:23:46 +000044#include <cstdio>
Owen Anderson1ad2cb72007-07-24 17:55:58 +000045using namespace llvm;
46
Bill Wendling70ded192008-12-22 22:14:07 +000047STATISTIC(NumGVNInstr, "Number of instructions deleted");
48STATISTIC(NumGVNLoad, "Number of loads deleted");
49STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
Owen Anderson961edc82008-07-15 16:28:06 +000050STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling70ded192008-12-22 22:14:07 +000051STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattnerd27290d2008-03-22 04:13:49 +000052
Evan Cheng88d11c02008-06-20 01:01:07 +000053static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonc2b856e2008-07-17 19:41:00 +000054 cl::init(true), cl::Hidden);
Dan Gohmanc915c952009-06-15 18:30:15 +000055static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersonaa0b6342008-06-19 19:57:25 +000056
Owen Anderson1ad2cb72007-07-24 17:55:58 +000057//===----------------------------------------------------------------------===//
58// ValueTable Class
59//===----------------------------------------------------------------------===//
60
61/// This class holds the mapping between values and value numbers. It is used
62/// as an efficient mechanism to determine the expression-wise equivalence of
63/// two values.
64namespace {
65 struct VISIBILITY_HIDDEN Expression {
Dan Gohmanae3a0be2009-06-04 22:49:04 +000066 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
67 UDIV, SDIV, FDIV, UREM, SREM,
Owen Anderson1ad2cb72007-07-24 17:55:58 +000068 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
69 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
70 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
71 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
72 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
73 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
74 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
75 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson3b3f58c2008-05-13 08:17:22 +000076 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Anderson3cd8eb32008-06-19 17:25:39 +000077 EMPTY, TOMBSTONE };
Owen Anderson1ad2cb72007-07-24 17:55:58 +000078
79 ExpressionOpcode opcode;
80 const Type* type;
81 uint32_t firstVN;
82 uint32_t secondVN;
83 uint32_t thirdVN;
84 SmallVector<uint32_t, 4> varargs;
Owen Andersonb388ca92007-10-18 19:39:33 +000085 Value* function;
Owen Anderson1ad2cb72007-07-24 17:55:58 +000086
87 Expression() { }
88 Expression(ExpressionOpcode o) : opcode(o) { }
89
90 bool operator==(const Expression &other) const {
91 if (opcode != other.opcode)
92 return false;
93 else if (opcode == EMPTY || opcode == TOMBSTONE)
94 return true;
95 else if (type != other.type)
96 return false;
Owen Andersonb388ca92007-10-18 19:39:33 +000097 else if (function != other.function)
98 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +000099 else if (firstVN != other.firstVN)
100 return false;
101 else if (secondVN != other.secondVN)
102 return false;
103 else if (thirdVN != other.thirdVN)
104 return false;
105 else {
106 if (varargs.size() != other.varargs.size())
107 return false;
108
109 for (size_t i = 0; i < varargs.size(); ++i)
110 if (varargs[i] != other.varargs[i])
111 return false;
112
113 return true;
114 }
115 }
116
117 bool operator!=(const Expression &other) const {
Bill Wendling75f02ee2008-12-22 22:16:31 +0000118 return !(*this == other);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000119 }
120 };
121
122 class VISIBILITY_HIDDEN ValueTable {
123 private:
124 DenseMap<Value*, uint32_t> valueNumbering;
125 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersona472c4a2008-05-12 20:15:55 +0000126 AliasAnalysis* AA;
127 MemoryDependenceAnalysis* MD;
128 DominatorTree* DT;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000129
130 uint32_t nextValueNumber;
131
132 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
133 Expression::ExpressionOpcode getOpcode(CmpInst* C);
134 Expression::ExpressionOpcode getOpcode(CastInst* C);
135 Expression create_expression(BinaryOperator* BO);
136 Expression create_expression(CmpInst* C);
137 Expression create_expression(ShuffleVectorInst* V);
138 Expression create_expression(ExtractElementInst* C);
139 Expression create_expression(InsertElementInst* V);
140 Expression create_expression(SelectInst* V);
141 Expression create_expression(CastInst* C);
142 Expression create_expression(GetElementPtrInst* G);
Owen Andersonb388ca92007-10-18 19:39:33 +0000143 Expression create_expression(CallInst* C);
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000144 Expression create_expression(Constant* C);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000145 public:
Dan Gohmane63c4a22009-04-01 16:37:47 +0000146 ValueTable() : nextValueNumber(1) { }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000147 uint32_t lookup_or_add(Value* V);
148 uint32_t lookup(Value* V) const;
149 void add(Value* V, uint32_t num);
150 void clear();
151 void erase(Value* v);
152 unsigned size();
Owen Andersona472c4a2008-05-12 20:15:55 +0000153 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner663e4412008-12-01 00:40:32 +0000154 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersona472c4a2008-05-12 20:15:55 +0000155 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
156 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson0ae33ef2008-07-03 17:44:33 +0000157 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling246dbbb2008-12-22 21:36:08 +0000158 void verifyRemoved(const Value *) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000159 };
160}
161
162namespace llvm {
Chris Lattner76c1b972007-09-17 18:34:04 +0000163template <> struct DenseMapInfo<Expression> {
Owen Anderson830db6a2007-08-02 18:16:06 +0000164 static inline Expression getEmptyKey() {
165 return Expression(Expression::EMPTY);
166 }
167
168 static inline Expression getTombstoneKey() {
169 return Expression(Expression::TOMBSTONE);
170 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000171
172 static unsigned getHashValue(const Expression e) {
173 unsigned hash = e.opcode;
174
175 hash = e.firstVN + hash * 37;
176 hash = e.secondVN + hash * 37;
177 hash = e.thirdVN + hash * 37;
178
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000179 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
180 (unsigned)((uintptr_t)e.type >> 9)) +
181 hash * 37;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000182
Owen Anderson830db6a2007-08-02 18:16:06 +0000183 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
184 E = e.varargs.end(); I != E; ++I)
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000185 hash = *I + hash * 37;
186
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000187 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
188 (unsigned)((uintptr_t)e.function >> 9)) +
189 hash * 37;
Owen Andersonb388ca92007-10-18 19:39:33 +0000190
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000191 return hash;
192 }
Chris Lattner76c1b972007-09-17 18:34:04 +0000193 static bool isEqual(const Expression &LHS, const Expression &RHS) {
194 return LHS == RHS;
195 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000196 static bool isPod() { return true; }
197};
198}
199
200//===----------------------------------------------------------------------===//
201// ValueTable Internal Functions
202//===----------------------------------------------------------------------===//
Chris Lattner88365bb2008-03-21 21:14:38 +0000203Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000204 switch(BO->getOpcode()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000205 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000206 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000207 case Instruction::Add: return Expression::ADD;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000208 case Instruction::FAdd: return Expression::FADD;
Chris Lattner88365bb2008-03-21 21:14:38 +0000209 case Instruction::Sub: return Expression::SUB;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000210 case Instruction::FSub: return Expression::FSUB;
Chris Lattner88365bb2008-03-21 21:14:38 +0000211 case Instruction::Mul: return Expression::MUL;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000212 case Instruction::FMul: return Expression::FMUL;
Chris Lattner88365bb2008-03-21 21:14:38 +0000213 case Instruction::UDiv: return Expression::UDIV;
214 case Instruction::SDiv: return Expression::SDIV;
215 case Instruction::FDiv: return Expression::FDIV;
216 case Instruction::URem: return Expression::UREM;
217 case Instruction::SRem: return Expression::SREM;
218 case Instruction::FRem: return Expression::FREM;
219 case Instruction::Shl: return Expression::SHL;
220 case Instruction::LShr: return Expression::LSHR;
221 case Instruction::AShr: return Expression::ASHR;
222 case Instruction::And: return Expression::AND;
223 case Instruction::Or: return Expression::OR;
224 case Instruction::Xor: return Expression::XOR;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000225 }
226}
227
228Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000229 if (isa<ICmpInst>(C)) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000230 switch (C->getPredicate()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000231 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000232 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000233 case ICmpInst::ICMP_EQ: return Expression::ICMPEQ;
234 case ICmpInst::ICMP_NE: return Expression::ICMPNE;
235 case ICmpInst::ICMP_UGT: return Expression::ICMPUGT;
236 case ICmpInst::ICMP_UGE: return Expression::ICMPUGE;
237 case ICmpInst::ICMP_ULT: return Expression::ICMPULT;
238 case ICmpInst::ICMP_ULE: return Expression::ICMPULE;
239 case ICmpInst::ICMP_SGT: return Expression::ICMPSGT;
240 case ICmpInst::ICMP_SGE: return Expression::ICMPSGE;
241 case ICmpInst::ICMP_SLT: return Expression::ICMPSLT;
242 case ICmpInst::ICMP_SLE: return Expression::ICMPSLE;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000243 }
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000244 } else {
245 switch (C->getPredicate()) {
246 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000247 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000248 case FCmpInst::FCMP_OEQ: return Expression::FCMPOEQ;
249 case FCmpInst::FCMP_OGT: return Expression::FCMPOGT;
250 case FCmpInst::FCMP_OGE: return Expression::FCMPOGE;
251 case FCmpInst::FCMP_OLT: return Expression::FCMPOLT;
252 case FCmpInst::FCMP_OLE: return Expression::FCMPOLE;
253 case FCmpInst::FCMP_ONE: return Expression::FCMPONE;
254 case FCmpInst::FCMP_ORD: return Expression::FCMPORD;
255 case FCmpInst::FCMP_UNO: return Expression::FCMPUNO;
256 case FCmpInst::FCMP_UEQ: return Expression::FCMPUEQ;
257 case FCmpInst::FCMP_UGT: return Expression::FCMPUGT;
258 case FCmpInst::FCMP_UGE: return Expression::FCMPUGE;
259 case FCmpInst::FCMP_ULT: return Expression::FCMPULT;
260 case FCmpInst::FCMP_ULE: return Expression::FCMPULE;
261 case FCmpInst::FCMP_UNE: return Expression::FCMPUNE;
262 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000263 }
264}
265
Chris Lattner88365bb2008-03-21 21:14:38 +0000266Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000267 switch(C->getOpcode()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000268 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000269 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000270 case Instruction::Trunc: return Expression::TRUNC;
271 case Instruction::ZExt: return Expression::ZEXT;
272 case Instruction::SExt: return Expression::SEXT;
273 case Instruction::FPToUI: return Expression::FPTOUI;
274 case Instruction::FPToSI: return Expression::FPTOSI;
275 case Instruction::UIToFP: return Expression::UITOFP;
276 case Instruction::SIToFP: return Expression::SITOFP;
277 case Instruction::FPTrunc: return Expression::FPTRUNC;
278 case Instruction::FPExt: return Expression::FPEXT;
279 case Instruction::PtrToInt: return Expression::PTRTOINT;
280 case Instruction::IntToPtr: return Expression::INTTOPTR;
281 case Instruction::BitCast: return Expression::BITCAST;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000282 }
283}
284
Owen Andersonb388ca92007-10-18 19:39:33 +0000285Expression ValueTable::create_expression(CallInst* C) {
286 Expression e;
287
288 e.type = C->getType();
289 e.firstVN = 0;
290 e.secondVN = 0;
291 e.thirdVN = 0;
292 e.function = C->getCalledFunction();
293 e.opcode = Expression::CALL;
294
295 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
296 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000297 e.varargs.push_back(lookup_or_add(*I));
Owen Andersonb388ca92007-10-18 19:39:33 +0000298
299 return e;
300}
301
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000302Expression ValueTable::create_expression(BinaryOperator* BO) {
303 Expression e;
304
Owen Anderson8f46c782008-04-11 05:11:49 +0000305 e.firstVN = lookup_or_add(BO->getOperand(0));
306 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000307 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000308 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000309 e.type = BO->getType();
310 e.opcode = getOpcode(BO);
311
312 return e;
313}
314
315Expression ValueTable::create_expression(CmpInst* C) {
316 Expression e;
317
Owen Anderson8f46c782008-04-11 05:11:49 +0000318 e.firstVN = lookup_or_add(C->getOperand(0));
319 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000320 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000321 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000322 e.type = C->getType();
323 e.opcode = getOpcode(C);
324
325 return e;
326}
327
328Expression ValueTable::create_expression(CastInst* C) {
329 Expression e;
330
Owen Anderson8f46c782008-04-11 05:11:49 +0000331 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000332 e.secondVN = 0;
333 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000334 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000335 e.type = C->getType();
336 e.opcode = getOpcode(C);
337
338 return e;
339}
340
341Expression ValueTable::create_expression(ShuffleVectorInst* S) {
342 Expression e;
343
Owen Anderson8f46c782008-04-11 05:11:49 +0000344 e.firstVN = lookup_or_add(S->getOperand(0));
345 e.secondVN = lookup_or_add(S->getOperand(1));
346 e.thirdVN = lookup_or_add(S->getOperand(2));
Owen Andersonb388ca92007-10-18 19:39:33 +0000347 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000348 e.type = S->getType();
349 e.opcode = Expression::SHUFFLE;
350
351 return e;
352}
353
354Expression ValueTable::create_expression(ExtractElementInst* E) {
355 Expression e;
356
Owen Anderson8f46c782008-04-11 05:11:49 +0000357 e.firstVN = lookup_or_add(E->getOperand(0));
358 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000359 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000360 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000361 e.type = E->getType();
362 e.opcode = Expression::EXTRACT;
363
364 return e;
365}
366
367Expression ValueTable::create_expression(InsertElementInst* I) {
368 Expression e;
369
Owen Anderson8f46c782008-04-11 05:11:49 +0000370 e.firstVN = lookup_or_add(I->getOperand(0));
371 e.secondVN = lookup_or_add(I->getOperand(1));
372 e.thirdVN = lookup_or_add(I->getOperand(2));
Owen Andersonb388ca92007-10-18 19:39:33 +0000373 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000374 e.type = I->getType();
375 e.opcode = Expression::INSERT;
376
377 return e;
378}
379
380Expression ValueTable::create_expression(SelectInst* I) {
381 Expression e;
382
Owen Anderson8f46c782008-04-11 05:11:49 +0000383 e.firstVN = lookup_or_add(I->getCondition());
384 e.secondVN = lookup_or_add(I->getTrueValue());
385 e.thirdVN = lookup_or_add(I->getFalseValue());
Owen Andersonb388ca92007-10-18 19:39:33 +0000386 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000387 e.type = I->getType();
388 e.opcode = Expression::SELECT;
389
390 return e;
391}
392
393Expression ValueTable::create_expression(GetElementPtrInst* G) {
394 Expression e;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000395
Owen Anderson8f46c782008-04-11 05:11:49 +0000396 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000397 e.secondVN = 0;
398 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000399 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000400 e.type = G->getType();
401 e.opcode = Expression::GEP;
402
403 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
404 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000405 e.varargs.push_back(lookup_or_add(*I));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000406
407 return e;
408}
409
410//===----------------------------------------------------------------------===//
411// ValueTable External Functions
412//===----------------------------------------------------------------------===//
413
Owen Andersonb2303722008-06-18 21:41:49 +0000414/// add - Insert a value into the table with a specified value number.
415void ValueTable::add(Value* V, uint32_t num) {
416 valueNumbering.insert(std::make_pair(V, num));
417}
418
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000419/// lookup_or_add - Returns the value number for the specified value, assigning
420/// it a new number if it did not have one before.
421uint32_t ValueTable::lookup_or_add(Value* V) {
422 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
423 if (VI != valueNumbering.end())
424 return VI->second;
425
Owen Andersonb388ca92007-10-18 19:39:33 +0000426 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson8f46c782008-04-11 05:11:49 +0000427 if (AA->doesNotAccessMemory(C)) {
Owen Andersonb388ca92007-10-18 19:39:33 +0000428 Expression e = create_expression(C);
429
430 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
431 if (EI != expressionNumbering.end()) {
432 valueNumbering.insert(std::make_pair(V, EI->second));
433 return EI->second;
434 } else {
435 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
436 valueNumbering.insert(std::make_pair(V, nextValueNumber));
437
438 return nextValueNumber++;
439 }
Owen Anderson241f6532008-04-17 05:36:50 +0000440 } else if (AA->onlyReadsMemory(C)) {
441 Expression e = create_expression(C);
442
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000443 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Anderson241f6532008-04-17 05:36:50 +0000444 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
445 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000446 return nextValueNumber++;
447 }
Owen Anderson241f6532008-04-17 05:36:50 +0000448
Chris Lattner4c724002008-11-29 02:29:27 +0000449 MemDepResult local_dep = MD->getDependency(C);
Owen Andersonc4f406e2008-05-13 23:18:30 +0000450
Chris Lattnerb51deb92008-12-05 21:04:20 +0000451 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Andersonc4f406e2008-05-13 23:18:30 +0000452 valueNumbering.insert(std::make_pair(V, nextValueNumber));
453 return nextValueNumber++;
Chris Lattner1440ac52008-11-30 23:39:23 +0000454 }
Chris Lattnerb51deb92008-12-05 21:04:20 +0000455
456 if (local_dep.isDef()) {
457 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
458
459 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Andersonc4f406e2008-05-13 23:18:30 +0000460 valueNumbering.insert(std::make_pair(V, nextValueNumber));
461 return nextValueNumber++;
462 }
Chris Lattnerb51deb92008-12-05 21:04:20 +0000463
Chris Lattner1440ac52008-11-30 23:39:23 +0000464 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
465 uint32_t c_vn = lookup_or_add(C->getOperand(i));
466 uint32_t cd_vn = lookup_or_add(local_cdep->getOperand(i));
467 if (c_vn != cd_vn) {
468 valueNumbering.insert(std::make_pair(V, nextValueNumber));
469 return nextValueNumber++;
470 }
471 }
472
473 uint32_t v = lookup_or_add(local_cdep);
474 valueNumbering.insert(std::make_pair(V, v));
475 return v;
Owen Andersonc4f406e2008-05-13 23:18:30 +0000476 }
Chris Lattnerbf145d62008-12-01 01:15:42 +0000477
Chris Lattnerb51deb92008-12-05 21:04:20 +0000478 // Non-local case.
Chris Lattnerbf145d62008-12-01 01:15:42 +0000479 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner1559b362008-12-09 19:38:05 +0000480 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattnerb51deb92008-12-05 21:04:20 +0000481 // FIXME: call/call dependencies for readonly calls should return def, not
482 // clobber! Move the checking logic to MemDep!
Owen Anderson16db1f72008-05-13 13:41:23 +0000483 CallInst* cdep = 0;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000484
Chris Lattner1440ac52008-11-30 23:39:23 +0000485 // Check to see if we have a single dominating call instruction that is
486 // identical to C.
Chris Lattnerbf145d62008-12-01 01:15:42 +0000487 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
488 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattner1440ac52008-11-30 23:39:23 +0000489 // Ignore non-local dependencies.
490 if (I->second.isNonLocal())
491 continue;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000492
Chris Lattner1440ac52008-11-30 23:39:23 +0000493 // We don't handle non-depedencies. If we already have a call, reject
494 // instruction dependencies.
Chris Lattnerb51deb92008-12-05 21:04:20 +0000495 if (I->second.isClobber() || cdep != 0) {
Chris Lattner1440ac52008-11-30 23:39:23 +0000496 cdep = 0;
497 break;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000498 }
Chris Lattner1440ac52008-11-30 23:39:23 +0000499
500 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I->second.getInst());
501 // FIXME: All duplicated with non-local case.
502 if (NonLocalDepCall && DT->properlyDominates(I->first, C->getParent())){
503 cdep = NonLocalDepCall;
504 continue;
505 }
506
507 cdep = 0;
508 break;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000509 }
510
Owen Anderson16db1f72008-05-13 13:41:23 +0000511 if (!cdep) {
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000512 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson241f6532008-04-17 05:36:50 +0000513 return nextValueNumber++;
514 }
515
Chris Lattnerb51deb92008-12-05 21:04:20 +0000516 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000517 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson241f6532008-04-17 05:36:50 +0000518 return nextValueNumber++;
Owen Anderson241f6532008-04-17 05:36:50 +0000519 }
Chris Lattner1440ac52008-11-30 23:39:23 +0000520 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
521 uint32_t c_vn = lookup_or_add(C->getOperand(i));
522 uint32_t cd_vn = lookup_or_add(cdep->getOperand(i));
523 if (c_vn != cd_vn) {
524 valueNumbering.insert(std::make_pair(V, nextValueNumber));
525 return nextValueNumber++;
526 }
527 }
528
529 uint32_t v = lookup_or_add(cdep);
530 valueNumbering.insert(std::make_pair(V, v));
531 return v;
Owen Anderson241f6532008-04-17 05:36:50 +0000532
Owen Andersonb388ca92007-10-18 19:39:33 +0000533 } else {
534 valueNumbering.insert(std::make_pair(V, nextValueNumber));
535 return nextValueNumber++;
536 }
537 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000538 Expression e = create_expression(BO);
539
540 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
541 if (EI != expressionNumbering.end()) {
542 valueNumbering.insert(std::make_pair(V, EI->second));
543 return EI->second;
544 } else {
545 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
546 valueNumbering.insert(std::make_pair(V, nextValueNumber));
547
548 return nextValueNumber++;
549 }
550 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
551 Expression e = create_expression(C);
552
553 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
554 if (EI != expressionNumbering.end()) {
555 valueNumbering.insert(std::make_pair(V, EI->second));
556 return EI->second;
557 } else {
558 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
559 valueNumbering.insert(std::make_pair(V, nextValueNumber));
560
561 return nextValueNumber++;
562 }
563 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
564 Expression e = create_expression(U);
565
566 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
567 if (EI != expressionNumbering.end()) {
568 valueNumbering.insert(std::make_pair(V, EI->second));
569 return EI->second;
570 } else {
571 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
572 valueNumbering.insert(std::make_pair(V, nextValueNumber));
573
574 return nextValueNumber++;
575 }
576 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
577 Expression e = create_expression(U);
578
579 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
580 if (EI != expressionNumbering.end()) {
581 valueNumbering.insert(std::make_pair(V, EI->second));
582 return EI->second;
583 } else {
584 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
585 valueNumbering.insert(std::make_pair(V, nextValueNumber));
586
587 return nextValueNumber++;
588 }
589 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
590 Expression e = create_expression(U);
591
592 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
593 if (EI != expressionNumbering.end()) {
594 valueNumbering.insert(std::make_pair(V, EI->second));
595 return EI->second;
596 } else {
597 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
598 valueNumbering.insert(std::make_pair(V, nextValueNumber));
599
600 return nextValueNumber++;
601 }
602 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
603 Expression e = create_expression(U);
604
605 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
606 if (EI != expressionNumbering.end()) {
607 valueNumbering.insert(std::make_pair(V, EI->second));
608 return EI->second;
609 } else {
610 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
611 valueNumbering.insert(std::make_pair(V, nextValueNumber));
612
613 return nextValueNumber++;
614 }
615 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
616 Expression e = create_expression(U);
617
618 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
619 if (EI != expressionNumbering.end()) {
620 valueNumbering.insert(std::make_pair(V, EI->second));
621 return EI->second;
622 } else {
623 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
624 valueNumbering.insert(std::make_pair(V, nextValueNumber));
625
626 return nextValueNumber++;
627 }
628 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
629 Expression e = create_expression(U);
630
631 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
632 if (EI != expressionNumbering.end()) {
633 valueNumbering.insert(std::make_pair(V, EI->second));
634 return EI->second;
635 } else {
636 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
637 valueNumbering.insert(std::make_pair(V, nextValueNumber));
638
639 return nextValueNumber++;
640 }
641 } else {
642 valueNumbering.insert(std::make_pair(V, nextValueNumber));
643 return nextValueNumber++;
644 }
645}
646
647/// lookup - Returns the value number of the specified value. Fails if
648/// the value has not yet been numbered.
649uint32_t ValueTable::lookup(Value* V) const {
650 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Chris Lattner88365bb2008-03-21 21:14:38 +0000651 assert(VI != valueNumbering.end() && "Value not numbered?");
652 return VI->second;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000653}
654
655/// clear - Remove all entries from the ValueTable
656void ValueTable::clear() {
657 valueNumbering.clear();
658 expressionNumbering.clear();
659 nextValueNumber = 1;
660}
661
Owen Andersonbf7d0bc2007-07-31 23:27:13 +0000662/// erase - Remove a value from the value numbering
663void ValueTable::erase(Value* V) {
664 valueNumbering.erase(V);
665}
666
Bill Wendling246dbbb2008-12-22 21:36:08 +0000667/// verifyRemoved - Verify that the value is removed from all internal data
668/// structures.
669void ValueTable::verifyRemoved(const Value *V) const {
670 for (DenseMap<Value*, uint32_t>::iterator
671 I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
672 assert(I->first != V && "Inst still occurs in value numbering map!");
673 }
674}
675
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000676//===----------------------------------------------------------------------===//
Bill Wendling30788b82008-12-22 22:32:22 +0000677// GVN Pass
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000678//===----------------------------------------------------------------------===//
679
680namespace {
Owen Anderson6fafe842008-06-20 01:15:47 +0000681 struct VISIBILITY_HIDDEN ValueNumberScope {
682 ValueNumberScope* parent;
683 DenseMap<uint32_t, Value*> table;
684
685 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
686 };
687}
688
689namespace {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000690
691 class VISIBILITY_HIDDEN GVN : public FunctionPass {
692 bool runOnFunction(Function &F);
693 public:
694 static char ID; // Pass identification, replacement for typeid
Dan Gohmanae73dc12008-09-04 17:05:41 +0000695 GVN() : FunctionPass(&ID) { }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000696
697 private:
Chris Lattner663e4412008-12-01 00:40:32 +0000698 MemoryDependenceAnalysis *MD;
699 DominatorTree *DT;
700
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000701 ValueTable VN;
Owen Anderson6fafe842008-06-20 01:15:47 +0000702 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000703
Owen Andersona37226a2007-08-07 23:12:31 +0000704 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
705 PhiMapType phiMap;
706
707
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000708 // This transformation requires dominator postdominator info
709 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000710 AU.addRequired<DominatorTree>();
711 AU.addRequired<MemoryDependenceAnalysis>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000712 AU.addRequired<AliasAnalysis>();
Owen Andersonb70a5712008-06-23 17:49:45 +0000713
714 AU.addPreserved<DominatorTree>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000715 AU.addPreserved<AliasAnalysis>();
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000716 }
717
718 // Helper fuctions
719 // FIXME: eliminate or document these better
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000720 bool processLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000721 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000722 bool processInstruction(Instruction* I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000723 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson830db6a2007-08-02 18:16:06 +0000724 bool processNonLocalLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000725 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson255dafc2008-12-15 02:03:00 +0000726 bool processBlock(BasicBlock* BB);
Owen Andersoncbe1d942008-12-14 19:10:35 +0000727 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Anderson1c2763d2007-08-02 17:56:05 +0000728 DenseMap<BasicBlock*, Value*> &Phis,
729 bool top_level = false);
Owen Andersonb2303722008-06-18 21:41:49 +0000730 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson3e75a422007-08-14 18:04:11 +0000731 bool iterateOnFunction(Function &F);
Owen Anderson1defe2d2007-08-16 22:51:56 +0000732 Value* CollapsePhi(PHINode* p);
Owen Anderson24866862007-09-16 08:04:16 +0000733 bool isSafeReplacement(PHINode* p, Instruction* inst);
Owen Andersonb2303722008-06-18 21:41:49 +0000734 bool performPRE(Function& F);
Owen Anderson6fafe842008-06-20 01:15:47 +0000735 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Anderson961edc82008-07-15 16:28:06 +0000736 bool mergeBlockIntoPredecessor(BasicBlock* BB);
Owen Anderson255dafc2008-12-15 02:03:00 +0000737 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +0000738 void cleanupGlobalSets();
Bill Wendling246dbbb2008-12-22 21:36:08 +0000739 void verifyRemoved(const Instruction *I) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000740 };
741
742 char GVN::ID = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000743}
744
745// createGVNPass - The public interface to this file...
746FunctionPass *llvm::createGVNPass() { return new GVN(); }
747
748static RegisterPass<GVN> X("gvn",
749 "Global Value Numbering");
750
Owen Andersonb2303722008-06-18 21:41:49 +0000751void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson0cd32032007-07-25 19:57:03 +0000752 printf("{\n");
Owen Andersonb2303722008-06-18 21:41:49 +0000753 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson0cd32032007-07-25 19:57:03 +0000754 E = d.end(); I != E; ++I) {
Owen Andersonb2303722008-06-18 21:41:49 +0000755 printf("%d\n", I->first);
Owen Anderson0cd32032007-07-25 19:57:03 +0000756 I->second->dump();
757 }
758 printf("}\n");
759}
760
Owen Anderson1defe2d2007-08-16 22:51:56 +0000761Value* GVN::CollapsePhi(PHINode* p) {
Owen Anderson1defe2d2007-08-16 22:51:56 +0000762 Value* constVal = p->hasConstantValue();
Chris Lattner88365bb2008-03-21 21:14:38 +0000763 if (!constVal) return 0;
Owen Anderson1defe2d2007-08-16 22:51:56 +0000764
Chris Lattner88365bb2008-03-21 21:14:38 +0000765 Instruction* inst = dyn_cast<Instruction>(constVal);
766 if (!inst)
767 return constVal;
768
Chris Lattner663e4412008-12-01 00:40:32 +0000769 if (DT->dominates(inst, p))
Chris Lattner88365bb2008-03-21 21:14:38 +0000770 if (isSafeReplacement(p, inst))
771 return inst;
Owen Anderson1defe2d2007-08-16 22:51:56 +0000772 return 0;
773}
Owen Anderson0cd32032007-07-25 19:57:03 +0000774
Owen Anderson24866862007-09-16 08:04:16 +0000775bool GVN::isSafeReplacement(PHINode* p, Instruction* inst) {
776 if (!isa<PHINode>(inst))
777 return true;
778
779 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
780 UI != E; ++UI)
781 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
782 if (use_phi->getParent() == inst->getParent())
783 return false;
784
785 return true;
786}
787
Owen Anderson45537912007-07-26 18:26:51 +0000788/// GetValueForBlock - Get the value to use within the specified basic block.
789/// available values are in Phis.
Owen Andersoncbe1d942008-12-14 19:10:35 +0000790Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner88365bb2008-03-21 21:14:38 +0000791 DenseMap<BasicBlock*, Value*> &Phis,
792 bool top_level) {
Owen Anderson45537912007-07-26 18:26:51 +0000793
794 // If we have already computed this value, return the previously computed val.
Owen Andersonab870272007-08-03 19:59:35 +0000795 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
796 if (V != Phis.end() && !top_level) return V->second;
Owen Anderson45537912007-07-26 18:26:51 +0000797
Owen Andersoncb29a4f2008-07-02 18:15:31 +0000798 // If the block is unreachable, just return undef, since this path
799 // can't actually occur at runtime.
Chris Lattner663e4412008-12-01 00:40:32 +0000800 if (!DT->isReachableFromEntry(BB))
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000801 return Phis[BB] = UndefValue::get(orig->getType());
Owen Andersonf2aa1602008-07-02 17:20:16 +0000802
Chris Lattnerae199312008-12-09 19:21:47 +0000803 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
804 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Andersonab870272007-08-03 19:59:35 +0000805 Phis[BB] = ret;
806 return ret;
Owen Anderson4b55c3b2007-08-03 11:03:26 +0000807 }
Chris Lattnerae199312008-12-09 19:21:47 +0000808
809 // Get the number of predecessors of this block so we can reserve space later.
810 // If there is already a PHI in it, use the #preds from it, otherwise count.
811 // Getting it from the PHI is constant time.
812 unsigned NumPreds;
813 if (PHINode *ExistingPN = dyn_cast<PHINode>(BB->begin()))
814 NumPreds = ExistingPN->getNumIncomingValues();
815 else
816 NumPreds = std::distance(pred_begin(BB), pred_end(BB));
Chris Lattner88365bb2008-03-21 21:14:38 +0000817
Owen Anderson45537912007-07-26 18:26:51 +0000818 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
819 // now, then get values to fill in the incoming values for the PHI.
Gabor Greif051a9502008-04-06 20:25:17 +0000820 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
821 BB->begin());
Chris Lattnerae199312008-12-09 19:21:47 +0000822 PN->reserveOperandSpace(NumPreds);
Owen Andersonab870272007-08-03 19:59:35 +0000823
Chris Lattnerae199312008-12-09 19:21:47 +0000824 Phis.insert(std::make_pair(BB, PN));
Owen Anderson4f9ba7c2007-07-30 16:57:08 +0000825
Owen Anderson45537912007-07-26 18:26:51 +0000826 // Fill in the incoming values for the block.
Owen Anderson054ab942007-07-31 17:43:14 +0000827 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
828 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Anderson054ab942007-07-31 17:43:14 +0000829 PN->addIncoming(val, *PI);
830 }
Chris Lattner88365bb2008-03-21 21:14:38 +0000831
Chris Lattner663e4412008-12-01 00:40:32 +0000832 VN.getAliasAnalysis()->copyValue(orig, PN);
Owen Anderson054ab942007-07-31 17:43:14 +0000833
Owen Anderson62bc33c2007-08-16 22:02:55 +0000834 // Attempt to collapse PHI nodes that are trivially redundant
Owen Anderson1defe2d2007-08-16 22:51:56 +0000835 Value* v = CollapsePhi(PN);
Chris Lattner88365bb2008-03-21 21:14:38 +0000836 if (!v) {
837 // Cache our phi construction results
Owen Andersoncbe1d942008-12-14 19:10:35 +0000838 if (LoadInst* L = dyn_cast<LoadInst>(orig))
839 phiMap[L->getPointerOperand()].insert(PN);
840 else
841 phiMap[orig].insert(PN);
842
Chris Lattner88365bb2008-03-21 21:14:38 +0000843 return PN;
Owen Anderson054ab942007-07-31 17:43:14 +0000844 }
Owen Andersona472c4a2008-05-12 20:15:55 +0000845
Chris Lattner88365bb2008-03-21 21:14:38 +0000846 PN->replaceAllUsesWith(v);
Chris Lattnerbc99be12008-12-09 22:06:23 +0000847 if (isa<PointerType>(v->getType()))
848 MD->invalidateCachedPointerInfo(v);
Chris Lattner88365bb2008-03-21 21:14:38 +0000849
850 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
851 E = Phis.end(); I != E; ++I)
852 if (I->second == PN)
853 I->second = v;
854
Dan Gohman2a298992009-07-31 20:24:18 +0000855 DEBUG(errs() << "GVN removed: " << *PN << '\n');
Chris Lattner663e4412008-12-01 00:40:32 +0000856 MD->removeInstruction(PN);
Chris Lattner88365bb2008-03-21 21:14:38 +0000857 PN->eraseFromParent();
Bill Wendling246dbbb2008-12-22 21:36:08 +0000858 DEBUG(verifyRemoved(PN));
Chris Lattner88365bb2008-03-21 21:14:38 +0000859
860 Phis[BB] = v;
861 return v;
Owen Anderson0cd32032007-07-25 19:57:03 +0000862}
863
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000864/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
865/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattner72bc70d2008-12-05 07:49:08 +0000866/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
867/// map is actually a tri-state map with the following values:
868/// 0) we know the block *is not* fully available.
869/// 1) we know the block *is* fully available.
870/// 2) we do not know whether the block is fully available or not, but we are
871/// currently speculating that it will be.
872/// 3) we are speculating for this block and have used that to speculate for
873/// other blocks.
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000874static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner72bc70d2008-12-05 07:49:08 +0000875 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000876 // Optimistically assume that the block is fully available and check to see
877 // if we already know about this block in one lookup.
Chris Lattner72bc70d2008-12-05 07:49:08 +0000878 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
879 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000880
881 // If the entry already existed for this block, return the precomputed value.
Chris Lattner72bc70d2008-12-05 07:49:08 +0000882 if (!IV.second) {
883 // If this is a speculative "available" value, mark it as being used for
884 // speculation of other blocks.
885 if (IV.first->second == 2)
886 IV.first->second = 3;
887 return IV.first->second != 0;
888 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000889
890 // Otherwise, see if it is fully available in all predecessors.
891 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
892
893 // If this block has no predecessors, it isn't live-in here.
894 if (PI == PE)
Chris Lattner72bc70d2008-12-05 07:49:08 +0000895 goto SpeculationFailure;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000896
897 for (; PI != PE; ++PI)
898 // If the value isn't fully available in one of our predecessors, then it
899 // isn't fully available in this block either. Undo our previous
900 // optimistic assumption and bail out.
901 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattner72bc70d2008-12-05 07:49:08 +0000902 goto SpeculationFailure;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000903
904 return true;
Chris Lattner72bc70d2008-12-05 07:49:08 +0000905
906// SpeculationFailure - If we get here, we found out that this is not, after
907// all, a fully-available block. We have a problem if we speculated on this and
908// used the speculation to mark other blocks as available.
909SpeculationFailure:
910 char &BBVal = FullyAvailableBlocks[BB];
911
912 // If we didn't speculate on this, just return with it set to false.
913 if (BBVal == 2) {
914 BBVal = 0;
915 return false;
916 }
917
918 // If we did speculate on this value, we could have blocks set to 1 that are
919 // incorrect. Walk the (transitive) successors of this block and mark them as
920 // 0 if set to one.
921 SmallVector<BasicBlock*, 32> BBWorklist;
922 BBWorklist.push_back(BB);
923
924 while (!BBWorklist.empty()) {
925 BasicBlock *Entry = BBWorklist.pop_back_val();
926 // Note that this sets blocks to 0 (unavailable) if they happen to not
927 // already be in FullyAvailableBlocks. This is safe.
928 char &EntryVal = FullyAvailableBlocks[Entry];
929 if (EntryVal == 0) continue; // Already unavailable.
930
931 // Mark as unavailable.
932 EntryVal = 0;
933
934 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
935 BBWorklist.push_back(*I);
936 }
937
938 return false;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000939}
940
Owen Anderson62bc33c2007-08-16 22:02:55 +0000941/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
942/// non-local by performing PHI construction.
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000943bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000944 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000945 // Find the non-local dependencies of the load.
Chris Lattner91bcf642008-12-09 19:25:07 +0000946 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
947 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
948 Deps);
Dan Gohman2a298992009-07-31 20:24:18 +0000949 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: "
950 // << Deps.size() << *LI << '\n');
Owen Anderson0cd32032007-07-25 19:57:03 +0000951
Owen Anderson516eb1c2008-08-26 22:07:42 +0000952 // If we had to process more than one hundred blocks to find the
953 // dependencies, this load isn't worth worrying about. Optimizing
954 // it will be too expensive.
Chris Lattner91bcf642008-12-09 19:25:07 +0000955 if (Deps.size() > 100)
Owen Anderson516eb1c2008-08-26 22:07:42 +0000956 return false;
Chris Lattner5f4f84b2008-12-18 00:51:32 +0000957
958 // If we had a phi translation failure, we'll have a single entry which is a
959 // clobber in the current block. Reject this early.
Torok Edwin4306b1a2009-06-17 18:48:18 +0000960 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
961 DEBUG(
Dan Gohmanfd87a542009-07-25 01:43:01 +0000962 errs() << "GVN: non-local load ";
963 WriteAsOperand(errs(), LI);
Dan Gohman2a298992009-07-31 20:24:18 +0000964 errs() << " is clobbered by " << *Deps[0].second.getInst() << '\n';
Torok Edwin4306b1a2009-06-17 18:48:18 +0000965 );
Chris Lattner5f4f84b2008-12-18 00:51:32 +0000966 return false;
Torok Edwin4306b1a2009-06-17 18:48:18 +0000967 }
Owen Anderson516eb1c2008-08-26 22:07:42 +0000968
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000969 // Filter out useless results (non-locals, etc). Keep track of the blocks
970 // where we have a value available in repl, also keep track of whether we see
971 // dependencies that produce an unknown value for the load (such as a call
972 // that could potentially clobber the load).
973 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
974 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Owen Andersona37226a2007-08-07 23:12:31 +0000975
Chris Lattner91bcf642008-12-09 19:25:07 +0000976 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
977 BasicBlock *DepBB = Deps[i].first;
978 MemDepResult DepInfo = Deps[i].second;
Chris Lattnerbf145d62008-12-01 01:15:42 +0000979
Chris Lattnerb51deb92008-12-05 21:04:20 +0000980 if (DepInfo.isClobber()) {
981 UnavailableBlocks.push_back(DepBB);
982 continue;
983 }
984
985 Instruction *DepInst = DepInfo.getInst();
986
987 // Loading the allocation -> undef.
988 if (isa<AllocationInst>(DepInst)) {
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000989 ValuesPerBlock.push_back(std::make_pair(DepBB,
990 UndefValue::get(LI->getType())));
Chris Lattnerbf145d62008-12-01 01:15:42 +0000991 continue;
992 }
Chris Lattner88365bb2008-03-21 21:14:38 +0000993
Chris Lattner91bcf642008-12-09 19:25:07 +0000994 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner978796e2008-12-01 01:31:36 +0000995 // Reject loads and stores that are to the same address but are of
996 // different types.
997 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
998 // of bitfield access, it would be interesting to optimize for it at some
999 // point.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001000 if (S->getOperand(0)->getType() != LI->getType()) {
1001 UnavailableBlocks.push_back(DepBB);
1002 continue;
1003 }
Chris Lattner978796e2008-12-01 01:31:36 +00001004
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001005 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattner978796e2008-12-01 01:31:36 +00001006
Chris Lattner91bcf642008-12-09 19:25:07 +00001007 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001008 if (LD->getType() != LI->getType()) {
1009 UnavailableBlocks.push_back(DepBB);
1010 continue;
1011 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001012 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson0cd32032007-07-25 19:57:03 +00001013 } else {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001014 UnavailableBlocks.push_back(DepBB);
1015 continue;
Owen Anderson0cd32032007-07-25 19:57:03 +00001016 }
Chris Lattner88365bb2008-03-21 21:14:38 +00001017 }
Owen Anderson0cd32032007-07-25 19:57:03 +00001018
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001019 // If we have no predecessors that produce a known value for this load, exit
1020 // early.
1021 if (ValuesPerBlock.empty()) return false;
1022
1023 // If all of the instructions we depend on produce a known value for this
1024 // load, then it is fully redundant and we can use PHI insertion to compute
1025 // its value. Insert PHIs and remove the fully redundant value now.
1026 if (UnavailableBlocks.empty()) {
1027 // Use cached PHI construction information from previous runs
1028 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattner91bcf642008-12-09 19:25:07 +00001029 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001030 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1031 I != E; ++I) {
1032 if ((*I)->getParent() == LI->getParent()) {
Dan Gohman2a298992009-07-31 20:24:18 +00001033 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD #1: " << *LI << '\n');
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001034 LI->replaceAllUsesWith(*I);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001035 if (isa<PointerType>((*I)->getType()))
1036 MD->invalidateCachedPointerInfo(*I);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001037 toErase.push_back(LI);
1038 NumGVNLoad++;
1039 return true;
1040 }
1041
1042 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Andersona37226a2007-08-07 23:12:31 +00001043 }
Chris Lattner88365bb2008-03-21 21:14:38 +00001044
Dan Gohman2a298992009-07-31 20:24:18 +00001045 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001046
1047 DenseMap<BasicBlock*, Value*> BlockReplValues;
1048 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1049 // Perform PHI construction.
1050 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1051 LI->replaceAllUsesWith(v);
Chris Lattnerf3313162008-12-15 03:46:38 +00001052
Chris Lattner0aefc0e2009-02-12 07:00:35 +00001053 if (isa<PHINode>(v))
Chris Lattnerf3313162008-12-15 03:46:38 +00001054 v->takeName(LI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001055 if (isa<PointerType>(v->getType()))
1056 MD->invalidateCachedPointerInfo(v);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001057 toErase.push_back(LI);
1058 NumGVNLoad++;
1059 return true;
1060 }
1061
1062 if (!EnablePRE || !EnableLoadPRE)
1063 return false;
1064
1065 // Okay, we have *some* definitions of the value. This means that the value
1066 // is available in some of our (transitive) predecessors. Lets think about
1067 // doing PRE of this load. This will involve inserting a new load into the
1068 // predecessor when it's not available. We could do this in general, but
1069 // prefer to not increase code size. As such, we only do this when we know
1070 // that we only have to insert *one* load (which means we're basically moving
1071 // the load, not inserting a new one).
1072
Owen Anderson88554df2009-05-31 09:03:40 +00001073 SmallPtrSet<BasicBlock *, 4> Blockers;
1074 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1075 Blockers.insert(UnavailableBlocks[i]);
1076
1077 // Lets find first basic block with more than one predecessor. Walk backwards
1078 // through predecessors if needed.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001079 BasicBlock *LoadBB = LI->getParent();
Owen Anderson88554df2009-05-31 09:03:40 +00001080 BasicBlock *TmpBB = LoadBB;
1081
1082 bool isSinglePred = false;
Dale Johannesen42c3f552009-06-17 20:48:23 +00001083 bool allSingleSucc = true;
Owen Anderson88554df2009-05-31 09:03:40 +00001084 while (TmpBB->getSinglePredecessor()) {
1085 isSinglePred = true;
1086 TmpBB = TmpBB->getSinglePredecessor();
1087 if (!TmpBB) // If haven't found any, bail now.
1088 return false;
1089 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1090 return false;
1091 if (Blockers.count(TmpBB))
1092 return false;
Dale Johannesen42c3f552009-06-17 20:48:23 +00001093 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1094 allSingleSucc = false;
Owen Anderson88554df2009-05-31 09:03:40 +00001095 }
1096
1097 assert(TmpBB);
1098 LoadBB = TmpBB;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001099
1100 // If we have a repl set with LI itself in it, this means we have a loop where
1101 // at least one of the values is LI. Since this means that we won't be able
1102 // to eliminate LI even if we insert uses in the other predecessors, we will
1103 // end up increasing code size. Reject this by scanning for LI.
1104 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1105 if (ValuesPerBlock[i].second == LI)
1106 return false;
1107
Owen Anderson88554df2009-05-31 09:03:40 +00001108 if (isSinglePred) {
1109 bool isHot = false;
1110 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1111 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
1112 // "Hot" Instruction is in some loop (because it dominates its dep.
1113 // instruction).
1114 if (DT->dominates(LI, I)) {
1115 isHot = true;
1116 break;
1117 }
1118
1119 // We are interested only in "hot" instructions. We don't want to do any
1120 // mis-optimizations here.
1121 if (!isHot)
1122 return false;
1123 }
1124
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001125 // Okay, we have some hope :). Check to see if the loaded value is fully
1126 // available in all but one predecessor.
1127 // FIXME: If we could restructure the CFG, we could make a common pred with
1128 // all the preds that don't have an available LI and insert a new load into
1129 // that one block.
1130 BasicBlock *UnavailablePred = 0;
1131
Chris Lattner72bc70d2008-12-05 07:49:08 +00001132 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001133 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1134 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1135 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1136 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1137
1138 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1139 PI != E; ++PI) {
1140 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1141 continue;
1142
1143 // If this load is not available in multiple predecessors, reject it.
1144 if (UnavailablePred && UnavailablePred != *PI)
1145 return false;
1146 UnavailablePred = *PI;
1147 }
1148
1149 assert(UnavailablePred != 0 &&
1150 "Fully available value should be eliminated above!");
1151
1152 // If the loaded pointer is PHI node defined in this block, do PHI translation
1153 // to get its value in the predecessor.
1154 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
1155
1156 // Make sure the value is live in the predecessor. If it was defined by a
1157 // non-PHI instruction in this block, we don't know how to recompute it above.
1158 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1159 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
Daniel Dunbarce63ffb2009-07-25 00:23:56 +00001160 DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
Dan Gohman2a298992009-07-31 20:24:18 +00001161 << *LPInst << '\n' << *LI << "\n");
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001162 return false;
1163 }
1164
1165 // We don't currently handle critical edges :(
1166 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbarce63ffb2009-07-25 00:23:56 +00001167 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
Dan Gohman2a298992009-07-31 20:24:18 +00001168 << UnavailablePred->getName() << "': " << *LI << '\n');
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001169 return false;
Owen Andersona37226a2007-08-07 23:12:31 +00001170 }
Dale Johannesen42c3f552009-06-17 20:48:23 +00001171
1172 // Make sure it is valid to move this load here. We have to watch out for:
1173 // @1 = getelementptr (i8* p, ...
1174 // test p and branch if == 0
1175 // load @1
1176 // It is valid to have the getelementptr before the test, even if p can be 0,
1177 // as getelementptr only does address arithmetic.
1178 // If we are not pushing the value through any multiple-successor blocks
1179 // we do not have this case. Otherwise, check that the load is safe to
1180 // put anywhere; this can be improved, but should be conservatively safe.
1181 if (!allSingleSucc &&
1182 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
1183 return false;
1184
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001185 // Okay, we can eliminate this load by inserting a reload in the predecessor
1186 // and using PHI construction to get the value in the other predecessors, do
1187 // it.
Dan Gohman2a298992009-07-31 20:24:18 +00001188 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001189
1190 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1191 LI->getAlignment(),
1192 UnavailablePred->getTerminator());
1193
Owen Anderson246ddf52009-05-29 05:37:54 +00001194 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1195 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1196 I != E; ++I)
1197 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
1198
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001199 DenseMap<BasicBlock*, Value*> BlockReplValues;
1200 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1201 BlockReplValues[UnavailablePred] = NewLoad;
1202
1203 // Perform PHI construction.
1204 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1205 LI->replaceAllUsesWith(v);
Chris Lattner0aefc0e2009-02-12 07:00:35 +00001206 if (isa<PHINode>(v))
Chris Lattnerf3313162008-12-15 03:46:38 +00001207 v->takeName(LI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001208 if (isa<PointerType>(v->getType()))
1209 MD->invalidateCachedPointerInfo(v);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001210 toErase.push_back(LI);
1211 NumPRELoad++;
Owen Anderson0cd32032007-07-25 19:57:03 +00001212 return true;
1213}
1214
Owen Anderson62bc33c2007-08-16 22:02:55 +00001215/// processLoad - Attempt to eliminate a load, first by eliminating it
1216/// locally, and then attempting non-local elimination if that fails.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001217bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1218 if (L->isVolatile())
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001219 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001220
1221 Value* pointer = L->getPointerOperand();
Chris Lattnerb51deb92008-12-05 21:04:20 +00001222
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001223 // ... to a pointer that has been loaded from before...
Chris Lattner663e4412008-12-01 00:40:32 +00001224 MemDepResult dep = MD->getDependency(L);
Owen Anderson8e8278e2007-08-14 17:59:48 +00001225
Chris Lattnerb51deb92008-12-05 21:04:20 +00001226 // If the value isn't available, don't do anything!
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001227 if (dep.isClobber()) {
1228 DEBUG(
1229 // fast print dep, using operator<< on instruction would be too slow
Dan Gohmanfd87a542009-07-25 01:43:01 +00001230 errs() << "GVN: load ";
1231 WriteAsOperand(errs(), L);
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001232 Instruction *I = dep.getInst();
Dan Gohman2a298992009-07-31 20:24:18 +00001233 errs() << " is clobbered by " << *I << '\n';
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001234 );
Chris Lattnerb51deb92008-12-05 21:04:20 +00001235 return false;
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001236 }
Chris Lattnerb51deb92008-12-05 21:04:20 +00001237
1238 // If it is defined in another block, try harder.
Chris Lattnerae199312008-12-09 19:21:47 +00001239 if (dep.isNonLocal())
Chris Lattnerb51deb92008-12-05 21:04:20 +00001240 return processNonLocalLoad(L, toErase);
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001241
Chris Lattnerb51deb92008-12-05 21:04:20 +00001242 Instruction *DepInst = dep.getInst();
1243 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1244 // Only forward substitute stores to loads of the same type.
1245 // FIXME: Could do better!
1246 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1247 return false;
1248
1249 // Remove it!
1250 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerbc99be12008-12-09 22:06:23 +00001251 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1252 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattnerb51deb92008-12-05 21:04:20 +00001253 toErase.push_back(L);
1254 NumGVNLoad++;
1255 return true;
1256 }
1257
1258 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1259 // Only forward substitute stores to loads of the same type.
1260 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1261 if (DepLI->getType() != L->getType())
1262 return false;
1263
1264 // Remove it!
1265 L->replaceAllUsesWith(DepLI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001266 if (isa<PointerType>(DepLI->getType()))
1267 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001268 toErase.push_back(L);
1269 NumGVNLoad++;
1270 return true;
1271 }
1272
Chris Lattner237a8282008-11-30 01:39:32 +00001273 // If this load really doesn't depend on anything, then we must be loading an
1274 // undef value. This can happen when loading for a fresh allocation with no
1275 // intervening stores, for example.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001276 if (isa<AllocationInst>(DepInst)) {
Owen Anderson9e9a0d52009-07-30 23:03:37 +00001277 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Chris Lattner237a8282008-11-30 01:39:32 +00001278 toErase.push_back(L);
Chris Lattner237a8282008-11-30 01:39:32 +00001279 NumGVNLoad++;
Chris Lattnerb51deb92008-12-05 21:04:20 +00001280 return true;
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001281 }
1282
Chris Lattnerb51deb92008-12-05 21:04:20 +00001283 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001284}
1285
Owen Anderson6fafe842008-06-20 01:15:47 +00001286Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Andersonb70a5712008-06-23 17:49:45 +00001287 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1288 if (I == localAvail.end())
1289 return 0;
1290
1291 ValueNumberScope* locals = I->second;
Owen Anderson6fafe842008-06-20 01:15:47 +00001292
1293 while (locals) {
1294 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1295 if (I != locals->table.end())
1296 return I->second;
1297 else
1298 locals = locals->parent;
1299 }
1300
1301 return 0;
1302}
1303
Owen Anderson255dafc2008-12-15 02:03:00 +00001304/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
1305/// by inheritance from the dominator fails, see if we can perform phi
1306/// construction to eliminate the redundancy.
1307Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1308 BasicBlock* BaseBlock = orig->getParent();
1309
1310 SmallPtrSet<BasicBlock*, 4> Visited;
1311 SmallVector<BasicBlock*, 8> Stack;
1312 Stack.push_back(BaseBlock);
1313
1314 DenseMap<BasicBlock*, Value*> Results;
1315
1316 // Walk backwards through our predecessors, looking for instances of the
1317 // value number we're looking for. Instances are recorded in the Results
1318 // map, which is then used to perform phi construction.
1319 while (!Stack.empty()) {
1320 BasicBlock* Current = Stack.back();
1321 Stack.pop_back();
1322
1323 // If we've walked all the way to a proper dominator, then give up. Cases
1324 // where the instance is in the dominator will have been caught by the fast
1325 // path, and any cases that require phi construction further than this are
1326 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1327 // time improvement.
1328 if (DT->properlyDominates(Current, orig->getParent())) return 0;
1329
1330 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1331 localAvail.find(Current);
1332 if (LA == localAvail.end()) return 0;
Chris Lattner2f39b292009-01-19 22:00:18 +00001333 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Anderson255dafc2008-12-15 02:03:00 +00001334
1335 if (V != LA->second->table.end()) {
1336 // Found an instance, record it.
1337 Results.insert(std::make_pair(Current, V->second));
1338 continue;
1339 }
1340
1341 // If we reach the beginning of the function, then give up.
1342 if (pred_begin(Current) == pred_end(Current))
1343 return 0;
1344
1345 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1346 PI != PE; ++PI)
1347 if (Visited.insert(*PI))
1348 Stack.push_back(*PI);
1349 }
1350
1351 // If we didn't find instances, give up. Otherwise, perform phi construction.
1352 if (Results.size() == 0)
1353 return 0;
1354 else
1355 return GetValueForBlock(BaseBlock, orig, Results, true);
1356}
1357
Owen Anderson36057c72007-08-14 18:16:29 +00001358/// processInstruction - When calculating availability, handle an instruction
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001359/// by inserting it into the appropriate sets
Owen Andersonaf4240a2008-06-12 19:25:32 +00001360bool GVN::processInstruction(Instruction *I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001361 SmallVectorImpl<Instruction*> &toErase) {
Owen Andersonb2303722008-06-18 21:41:49 +00001362 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattnerb51deb92008-12-05 21:04:20 +00001363 bool changed = processLoad(L, toErase);
Owen Andersonb2303722008-06-18 21:41:49 +00001364
1365 if (!changed) {
1366 unsigned num = VN.lookup_or_add(L);
Owen Anderson6fafe842008-06-20 01:15:47 +00001367 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Andersonb2303722008-06-18 21:41:49 +00001368 }
1369
1370 return changed;
1371 }
1372
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001373 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Andersonb2303722008-06-18 21:41:49 +00001374 unsigned num = VN.lookup_or_add(I);
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001375
Owen Andersone8a290f2009-04-01 23:53:49 +00001376 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1377 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1378
1379 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1380 return false;
1381
1382 Value* branchCond = BI->getCondition();
1383 uint32_t condVN = VN.lookup_or_add(branchCond);
1384
1385 BasicBlock* trueSucc = BI->getSuccessor(0);
1386 BasicBlock* falseSucc = BI->getSuccessor(1);
1387
1388 if (trueSucc->getSinglePredecessor())
Owen Anderson5defacc2009-07-31 17:39:07 +00001389 localAvail[trueSucc]->table[condVN] =
1390 ConstantInt::getTrue(trueSucc->getContext());
Owen Andersone8a290f2009-04-01 23:53:49 +00001391 if (falseSucc->getSinglePredecessor())
Owen Anderson5defacc2009-07-31 17:39:07 +00001392 localAvail[falseSucc]->table[condVN] =
1393 ConstantInt::getFalse(trueSucc->getContext());
Owen Andersone8a290f2009-04-01 23:53:49 +00001394
1395 return false;
1396
Owen Andersone5ffa902008-04-07 09:59:07 +00001397 // Allocations are always uniquely numbered, so we can save time and memory
Owen Andersone8a290f2009-04-01 23:53:49 +00001398 // by fast failing them.
1399 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson6fafe842008-06-20 01:15:47 +00001400 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersone5ffa902008-04-07 09:59:07 +00001401 return false;
Owen Andersonb2303722008-06-18 21:41:49 +00001402 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001403
Owen Anderson62bc33c2007-08-16 22:02:55 +00001404 // Collapse PHI nodes
Owen Anderson31f49672007-08-14 18:33:27 +00001405 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001406 Value* constVal = CollapsePhi(p);
Owen Anderson31f49672007-08-14 18:33:27 +00001407
1408 if (constVal) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001409 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1410 PI != PE; ++PI)
Chris Lattnerae199312008-12-09 19:21:47 +00001411 PI->second.erase(p);
Owen Anderson31f49672007-08-14 18:33:27 +00001412
Owen Anderson1defe2d2007-08-16 22:51:56 +00001413 p->replaceAllUsesWith(constVal);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001414 if (isa<PointerType>(constVal->getType()))
1415 MD->invalidateCachedPointerInfo(constVal);
Owen Andersonae53c932008-12-23 00:49:51 +00001416 VN.erase(p);
1417
Owen Anderson1defe2d2007-08-16 22:51:56 +00001418 toErase.push_back(p);
Owen Andersonb2303722008-06-18 21:41:49 +00001419 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001420 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson31f49672007-08-14 18:33:27 +00001421 }
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001422
1423 // If the number we were assigned was a brand new VN, then we don't
1424 // need to do a lookup to see if the number already exists
1425 // somewhere in the domtree: it can't!
1426 } else if (num == nextNum) {
1427 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1428
Owen Anderson255dafc2008-12-15 02:03:00 +00001429 // Perform fast-path value-number based elimination of values inherited from
1430 // dominators.
Owen Anderson6fafe842008-06-20 01:15:47 +00001431 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson5fc4aba2007-12-08 01:37:09 +00001432 // Remove it!
Owen Andersonbf7d0bc2007-07-31 23:27:13 +00001433 VN.erase(I);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001434 I->replaceAllUsesWith(repl);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001435 if (isa<PointerType>(repl->getType()))
1436 MD->invalidateCachedPointerInfo(repl);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001437 toErase.push_back(I);
1438 return true;
Owen Anderson255dafc2008-12-15 02:03:00 +00001439
1440#if 0
1441 // Perform slow-pathvalue-number based elimination with phi construction.
1442 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1443 // Remove it!
1444 VN.erase(I);
1445 I->replaceAllUsesWith(repl);
1446 if (isa<PointerType>(repl->getType()))
1447 MD->invalidateCachedPointerInfo(repl);
1448 toErase.push_back(I);
1449 return true;
1450#endif
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001451 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001452 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001453 }
1454
1455 return false;
1456}
1457
Bill Wendling30788b82008-12-22 22:32:22 +00001458/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson3e75a422007-08-14 18:04:11 +00001459bool GVN::runOnFunction(Function& F) {
Chris Lattner663e4412008-12-01 00:40:32 +00001460 MD = &getAnalysis<MemoryDependenceAnalysis>();
1461 DT = &getAnalysis<DominatorTree>();
Owen Andersona472c4a2008-05-12 20:15:55 +00001462 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner663e4412008-12-01 00:40:32 +00001463 VN.setMemDep(MD);
1464 VN.setDomTree(DT);
Owen Andersonb388ca92007-10-18 19:39:33 +00001465
Owen Anderson3e75a422007-08-14 18:04:11 +00001466 bool changed = false;
1467 bool shouldContinue = true;
1468
Owen Anderson5d0af032008-07-16 17:52:31 +00001469 // Merge unconditional branches, allowing PRE to catch more
1470 // optimization opportunities.
1471 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1472 BasicBlock* BB = FI;
1473 ++FI;
Owen Andersonb31b06d2008-07-17 00:01:40 +00001474 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1475 if (removedBlock) NumGVNBlocks++;
1476
1477 changed |= removedBlock;
Owen Anderson5d0af032008-07-16 17:52:31 +00001478 }
1479
Chris Lattnerae199312008-12-09 19:21:47 +00001480 unsigned Iteration = 0;
1481
Owen Anderson3e75a422007-08-14 18:04:11 +00001482 while (shouldContinue) {
Dan Gohmanfd87a542009-07-25 01:43:01 +00001483 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Owen Anderson3e75a422007-08-14 18:04:11 +00001484 shouldContinue = iterateOnFunction(F);
1485 changed |= shouldContinue;
Chris Lattnerae199312008-12-09 19:21:47 +00001486 ++Iteration;
Owen Anderson3e75a422007-08-14 18:04:11 +00001487 }
1488
Owen Andersone98c54c2008-07-18 18:03:38 +00001489 if (EnablePRE) {
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001490 bool PREChanged = true;
1491 while (PREChanged) {
1492 PREChanged = performPRE(F);
Owen Andersone98c54c2008-07-18 18:03:38 +00001493 changed |= PREChanged;
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001494 }
Owen Andersone98c54c2008-07-18 18:03:38 +00001495 }
Chris Lattnerae199312008-12-09 19:21:47 +00001496 // FIXME: Should perform GVN again after PRE does something. PRE can move
1497 // computations into blocks where they become fully redundant. Note that
1498 // we can't do this until PRE's critical edge splitting updates memdep.
1499 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001500
1501 cleanupGlobalSets();
1502
Owen Anderson3e75a422007-08-14 18:04:11 +00001503 return changed;
1504}
1505
1506
Owen Anderson255dafc2008-12-15 02:03:00 +00001507bool GVN::processBlock(BasicBlock* BB) {
Chris Lattnerae199312008-12-09 19:21:47 +00001508 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1509 // incrementing BI before processing an instruction).
Owen Andersonaf4240a2008-06-12 19:25:32 +00001510 SmallVector<Instruction*, 8> toErase;
Owen Andersonaf4240a2008-06-12 19:25:32 +00001511 bool changed_function = false;
Owen Andersonb2303722008-06-18 21:41:49 +00001512
Owen Andersonaf4240a2008-06-12 19:25:32 +00001513 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1514 BI != BE;) {
Chris Lattnerb51deb92008-12-05 21:04:20 +00001515 changed_function |= processInstruction(BI, toErase);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001516 if (toErase.empty()) {
1517 ++BI;
1518 continue;
1519 }
1520
1521 // If we need some instructions deleted, do it now.
1522 NumGVNInstr += toErase.size();
1523
1524 // Avoid iterator invalidation.
1525 bool AtStart = BI == BB->begin();
1526 if (!AtStart)
1527 --BI;
1528
1529 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner663e4412008-12-01 00:40:32 +00001530 E = toErase.end(); I != E; ++I) {
Dan Gohman2a298992009-07-31 20:24:18 +00001531 DEBUG(errs() << "GVN removed: " << **I << '\n');
Chris Lattner663e4412008-12-01 00:40:32 +00001532 MD->removeInstruction(*I);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001533 (*I)->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00001534 DEBUG(verifyRemoved(*I));
Chris Lattner663e4412008-12-01 00:40:32 +00001535 }
Chris Lattnerae199312008-12-09 19:21:47 +00001536 toErase.clear();
Owen Andersonaf4240a2008-06-12 19:25:32 +00001537
1538 if (AtStart)
1539 BI = BB->begin();
1540 else
1541 ++BI;
Owen Andersonaf4240a2008-06-12 19:25:32 +00001542 }
1543
Owen Andersonaf4240a2008-06-12 19:25:32 +00001544 return changed_function;
1545}
1546
Owen Andersonb2303722008-06-18 21:41:49 +00001547/// performPRE - Perform a purely local form of PRE that looks for diamond
1548/// control flow patterns and attempts to perform simple PRE at the join point.
1549bool GVN::performPRE(Function& F) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001550 bool Changed = false;
Owen Anderson5c274ee2008-06-19 19:54:19 +00001551 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner09713792008-12-01 07:29:03 +00001552 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersonb2303722008-06-18 21:41:49 +00001553 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1554 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1555 BasicBlock* CurrentBlock = *DI;
1556
1557 // Nothing to PRE in the entry block.
1558 if (CurrentBlock == &F.getEntryBlock()) continue;
1559
1560 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1561 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001562 Instruction *CurInst = BI++;
Duncan Sands7af1c782009-05-06 06:49:50 +00001563
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001564 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
John Criswell090c0a22009-03-10 15:04:53 +00001565 isa<PHINode>(CurInst) || (CurInst->getType() == Type::VoidTy) ||
Duncan Sands7af1c782009-05-06 06:49:50 +00001566 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell090c0a22009-03-10 15:04:53 +00001567 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001568 continue;
Duncan Sands7af1c782009-05-06 06:49:50 +00001569
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001570 uint32_t valno = VN.lookup(CurInst);
Owen Andersonb2303722008-06-18 21:41:49 +00001571
1572 // Look for the predecessors for PRE opportunities. We're
1573 // only trying to solve the basic diamond case, where
1574 // a value is computed in the successor and one predecessor,
1575 // but not the other. We also explicitly disallow cases
1576 // where the successor is its own predecessor, because they're
1577 // more complicated to get right.
1578 unsigned numWith = 0;
1579 unsigned numWithout = 0;
1580 BasicBlock* PREPred = 0;
Chris Lattner09713792008-12-01 07:29:03 +00001581 predMap.clear();
1582
Owen Andersonb2303722008-06-18 21:41:49 +00001583 for (pred_iterator PI = pred_begin(CurrentBlock),
1584 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1585 // We're not interested in PRE where the block is its
Owen Anderson6fafe842008-06-20 01:15:47 +00001586 // own predecessor, on in blocks with predecessors
1587 // that are not reachable.
1588 if (*PI == CurrentBlock) {
Owen Andersonb2303722008-06-18 21:41:49 +00001589 numWithout = 2;
Owen Anderson6fafe842008-06-20 01:15:47 +00001590 break;
1591 } else if (!localAvail.count(*PI)) {
1592 numWithout = 2;
1593 break;
1594 }
1595
1596 DenseMap<uint32_t, Value*>::iterator predV =
1597 localAvail[*PI]->table.find(valno);
1598 if (predV == localAvail[*PI]->table.end()) {
Owen Andersonb2303722008-06-18 21:41:49 +00001599 PREPred = *PI;
1600 numWithout++;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001601 } else if (predV->second == CurInst) {
Owen Andersonb2303722008-06-18 21:41:49 +00001602 numWithout = 2;
1603 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001604 predMap[*PI] = predV->second;
Owen Andersonb2303722008-06-18 21:41:49 +00001605 numWith++;
1606 }
1607 }
1608
1609 // Don't do PRE when it might increase code size, i.e. when
1610 // we would need to insert instructions in more than one pred.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001611 if (numWithout != 1 || numWith == 0)
Owen Andersonb2303722008-06-18 21:41:49 +00001612 continue;
Owen Andersonb2303722008-06-18 21:41:49 +00001613
Owen Anderson5c274ee2008-06-19 19:54:19 +00001614 // We can't do PRE safely on a critical edge, so instead we schedule
1615 // the edge to be split and perform the PRE the next time we iterate
1616 // on the function.
1617 unsigned succNum = 0;
1618 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1619 i != e; ++i)
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001620 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Anderson5c274ee2008-06-19 19:54:19 +00001621 succNum = i;
1622 break;
1623 }
1624
1625 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1626 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Anderson5c274ee2008-06-19 19:54:19 +00001627 continue;
1628 }
1629
Owen Andersonb2303722008-06-18 21:41:49 +00001630 // Instantiate the expression the in predecessor that lacked it.
1631 // Because we are going top-down through the block, all value numbers
1632 // will be available in the predecessor by the time we need them. Any
1633 // that weren't original present will have been instantiated earlier
1634 // in this loop.
Owen Andersone922c022009-07-22 00:24:57 +00001635 Instruction* PREInstr = CurInst->clone(CurInst->getContext());
Owen Andersonb2303722008-06-18 21:41:49 +00001636 bool success = true;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001637 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1638 Value *Op = PREInstr->getOperand(i);
1639 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1640 continue;
1641
1642 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1643 PREInstr->setOperand(i, V);
1644 } else {
1645 success = false;
1646 break;
Owen Andersonc45996b2008-07-11 20:05:13 +00001647 }
Owen Andersonb2303722008-06-18 21:41:49 +00001648 }
1649
1650 // Fail out if we encounter an operand that is not available in
1651 // the PRE predecessor. This is typically because of loads which
1652 // are not value numbered precisely.
1653 if (!success) {
1654 delete PREInstr;
Bill Wendling70ded192008-12-22 22:14:07 +00001655 DEBUG(verifyRemoved(PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00001656 continue;
1657 }
1658
1659 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001660 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson6fafe842008-06-20 01:15:47 +00001661 predMap[PREPred] = PREInstr;
Owen Andersonb2303722008-06-18 21:41:49 +00001662 VN.add(PREInstr, valno);
1663 NumGVNPRE++;
1664
1665 // Update the availability map to include the new instruction.
Owen Anderson6fafe842008-06-20 01:15:47 +00001666 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00001667
1668 // Create a PHI to make the value available in this block.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001669 PHINode* Phi = PHINode::Create(CurInst->getType(),
1670 CurInst->getName() + ".pre-phi",
Owen Andersonb2303722008-06-18 21:41:49 +00001671 CurrentBlock->begin());
1672 for (pred_iterator PI = pred_begin(CurrentBlock),
1673 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson6fafe842008-06-20 01:15:47 +00001674 Phi->addIncoming(predMap[*PI], *PI);
Owen Andersonb2303722008-06-18 21:41:49 +00001675
1676 VN.add(Phi, valno);
Owen Anderson6fafe842008-06-20 01:15:47 +00001677 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Andersonb2303722008-06-18 21:41:49 +00001678
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001679 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001680 if (isa<PointerType>(Phi->getType()))
1681 MD->invalidateCachedPointerInfo(Phi);
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001682 VN.erase(CurInst);
Owen Andersonb2303722008-06-18 21:41:49 +00001683
Dan Gohman2a298992009-07-31 20:24:18 +00001684 DEBUG(errs() << "GVN PRE removed: " << *CurInst << '\n');
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001685 MD->removeInstruction(CurInst);
1686 CurInst->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00001687 DEBUG(verifyRemoved(CurInst));
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001688 Changed = true;
Owen Andersonb2303722008-06-18 21:41:49 +00001689 }
1690 }
1691
Owen Anderson5c274ee2008-06-19 19:54:19 +00001692 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov64b53562008-12-05 19:38:49 +00001693 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Anderson5c274ee2008-06-19 19:54:19 +00001694 SplitCriticalEdge(I->first, I->second, this);
1695
Anton Korobeynikov64b53562008-12-05 19:38:49 +00001696 return Changed || toSplit.size();
Owen Andersonb2303722008-06-18 21:41:49 +00001697}
1698
Bill Wendling30788b82008-12-22 22:32:22 +00001699/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson3e75a422007-08-14 18:04:11 +00001700bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001701 cleanupGlobalSets();
Chris Lattner2e607012008-03-21 21:33:23 +00001702
Owen Andersone8a290f2009-04-01 23:53:49 +00001703 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1704 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1705 if (DI->getIDom())
1706 localAvail[DI->getBlock()] =
1707 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1708 else
1709 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1710 }
1711
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001712 // Top-down walk of the dominator tree
Owen Andersonb2303722008-06-18 21:41:49 +00001713 bool changed = false;
Owen Andersonc34d1122008-12-15 03:52:17 +00001714#if 0
1715 // Needed for value numbering with phi construction to work.
Owen Anderson255dafc2008-12-15 02:03:00 +00001716 ReversePostOrderTraversal<Function*> RPOT(&F);
1717 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1718 RE = RPOT.end(); RI != RE; ++RI)
1719 changed |= processBlock(*RI);
Owen Andersonc34d1122008-12-15 03:52:17 +00001720#else
1721 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1722 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1723 changed |= processBlock(DI->getBlock());
1724#endif
1725
Owen Anderson5d0af032008-07-16 17:52:31 +00001726 return changed;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001727}
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001728
1729void GVN::cleanupGlobalSets() {
1730 VN.clear();
1731 phiMap.clear();
1732
1733 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1734 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1735 delete I->second;
1736 localAvail.clear();
1737}
Bill Wendling246dbbb2008-12-22 21:36:08 +00001738
1739/// verifyRemoved - Verify that the specified instruction does not occur in our
1740/// internal data structures.
Bill Wendling6d463f22008-12-22 22:28:56 +00001741void GVN::verifyRemoved(const Instruction *Inst) const {
1742 VN.verifyRemoved(Inst);
Bill Wendling70ded192008-12-22 22:14:07 +00001743
1744 // Walk through the PHI map to make sure the instruction isn't hiding in there
1745 // somewhere.
1746 for (PhiMapType::iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00001747 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1748 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling70ded192008-12-22 22:14:07 +00001749
1750 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00001751 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1752 assert(*II != Inst && "Inst is still a value in PHI map!");
1753 }
1754 }
1755
1756 // Walk through the value number scope to make sure the instruction isn't
1757 // ferreted away in it.
1758 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1759 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1760 const ValueNumberScope *VNS = I->second;
1761
1762 while (VNS) {
1763 for (DenseMap<uint32_t, Value*>::iterator
1764 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1765 assert(II->second != Inst && "Inst still in value numbering scope!");
1766 }
1767
1768 VNS = VNS->parent;
Bill Wendling70ded192008-12-22 22:14:07 +00001769 }
1770 }
Bill Wendling246dbbb2008-12-22 21:36:08 +00001771}