blob: 1e89ef7b22d0a2ddfe02d51d7deade62db84f15d [file] [log] [blame]
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Andersonab6ec2e2007-07-24 17:55:58 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-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 Andersonab6ec2e2007-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 Criswell073e4d12009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman5afc2742008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Andersonab6ec2e2007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson5e5599b2007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patele8c6d312009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000025#include "llvm/Value.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000026#include "llvm/ADT/DenseMap.h"
27#include "llvm/ADT/DepthFirstIterator.h"
Owen Andersonbfe133e2008-12-15 02:03:00 +000028#include "llvm/ADT/PostOrderIterator.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000029#include "llvm/ADT/SmallPtrSet.h"
30#include "llvm/ADT/SmallVector.h"
31#include "llvm/ADT/Statistic.h"
Owen Anderson09b83ba2007-10-18 19:39:33 +000032#include "llvm/Analysis/Dominators.h"
33#include "llvm/Analysis/AliasAnalysis.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000034#include "llvm/Analysis/MemoryDependenceAnalysis.h"
35#include "llvm/Support/CFG.h"
Owen Andersone780d662008-06-19 19:57:25 +000036#include "llvm/Support/CommandLine.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000037#include "llvm/Support/Compiler.h"
Chris Lattnerd528b212008-03-29 04:36:18 +000038#include "llvm/Support/Debug.h"
Owen Andersonfdf9f162008-06-19 19:54:19 +000039#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Duncan Sands26ff6f92008-10-08 07:23:46 +000040#include <cstdio>
Owen Andersonab6ec2e2007-07-24 17:55:58 +000041using namespace llvm;
42
Bill Wendling3c793442008-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 Anderson53d546e2008-07-15 16:28:06 +000046STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3c793442008-12-22 22:14:07 +000047STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner168be762008-03-22 04:13:49 +000048
Evan Cheng9598f932008-06-20 01:01:07 +000049static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonaddbe3e2008-07-17 19:41:00 +000050 cl::init(true), cl::Hidden);
Dan Gohmana8f8a852009-06-15 18:30:15 +000051static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersone780d662008-06-19 19:57:25 +000052
Owen Andersonab6ec2e2007-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 Gohmana5b96452009-06-04 22:49:04 +000062 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
63 UDIV, SDIV, FDIV, UREM, SREM,
Owen Andersonab6ec2e2007-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 Anderson69057b82008-05-13 08:17:22 +000072 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Anderson45d37012008-06-19 17:25:39 +000073 EMPTY, TOMBSTONE };
Owen Andersonab6ec2e2007-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 Anderson09b83ba2007-10-18 19:39:33 +000081 Value* function;
Owen Andersonab6ec2e2007-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 Anderson09b83ba2007-10-18 19:39:33 +000093 else if (function != other.function)
94 return false;
Owen Andersonab6ec2e2007-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 Wendling86f01cb2008-12-22 22:16:31 +0000114 return !(*this == other);
Owen Andersonab6ec2e2007-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 Andersonf7928602008-05-12 20:15:55 +0000122 AliasAnalysis* AA;
123 MemoryDependenceAnalysis* MD;
124 DominatorTree* DT;
Owen Andersonab6ec2e2007-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 Anderson09b83ba2007-10-18 19:39:33 +0000139 Expression create_expression(CallInst* C);
Owen Anderson69057b82008-05-13 08:17:22 +0000140 Expression create_expression(Constant* C);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000141 public:
Dan Gohmanc4971722009-04-01 16:37:47 +0000142 ValueTable() : nextValueNumber(1) { }
Owen Andersonab6ec2e2007-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 Andersonf7928602008-05-12 20:15:55 +0000149 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner8541ede2008-12-01 00:40:32 +0000150 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonf7928602008-05-12 20:15:55 +0000151 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
152 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson3ea90a72008-07-03 17:44:33 +0000153 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling6b18a392008-12-22 21:36:08 +0000154 void verifyRemoved(const Value *) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000155 };
156}
157
158namespace llvm {
Chris Lattner0625bd62007-09-17 18:34:04 +0000159template <> struct DenseMapInfo<Expression> {
Owen Anderson9699a6e2007-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 Andersonab6ec2e2007-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 Korobeynikov1bfd1212008-02-20 11:26:25 +0000175 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
176 (unsigned)((uintptr_t)e.type >> 9)) +
177 hash * 37;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000178
Owen Anderson9699a6e2007-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 Andersonab6ec2e2007-07-24 17:55:58 +0000181 hash = *I + hash * 37;
182
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000183 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
184 (unsigned)((uintptr_t)e.function >> 9)) +
185 hash * 37;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000186
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000187 return hash;
188 }
Chris Lattner0625bd62007-09-17 18:34:04 +0000189 static bool isEqual(const Expression &LHS, const Expression &RHS) {
190 return LHS == RHS;
191 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000192 static bool isPod() { return true; }
193};
194}
195
196//===----------------------------------------------------------------------===//
197// ValueTable Internal Functions
198//===----------------------------------------------------------------------===//
Chris Lattner2876a642008-03-21 21:14:38 +0000199Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000200 switch(BO->getOpcode()) {
Chris Lattner2876a642008-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 Gohmana5b96452009-06-04 22:49:04 +0000204 case Instruction::FAdd: return Expression::FADD;
Chris Lattner2876a642008-03-21 21:14:38 +0000205 case Instruction::Sub: return Expression::SUB;
Dan Gohmana5b96452009-06-04 22:49:04 +0000206 case Instruction::FSub: return Expression::FSUB;
Chris Lattner2876a642008-03-21 21:14:38 +0000207 case Instruction::Mul: return Expression::MUL;
Dan Gohmana5b96452009-06-04 22:49:04 +0000208 case Instruction::FMul: return Expression::FMUL;
Chris Lattner2876a642008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000221 }
222}
223
224Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nate Begeman65720c92008-05-18 19:49:05 +0000225 if (isa<ICmpInst>(C) || isa<VICmpInst>(C)) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000226 switch (C->getPredicate()) {
Chris Lattner2876a642008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000239 }
Chris Lattner2876a642008-03-21 21:14:38 +0000240 }
Nate Begeman65720c92008-05-18 19:49:05 +0000241 assert((isa<FCmpInst>(C) || isa<VFCmpInst>(C)) && "Unknown compare");
Chris Lattner2876a642008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000259 }
260}
261
Chris Lattner2876a642008-03-21 21:14:38 +0000262Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000263 switch(C->getOpcode()) {
Chris Lattner2876a642008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000278 }
279}
280
Owen Anderson09b83ba2007-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 Anderson1e73f292008-04-11 05:11:49 +0000293 e.varargs.push_back(lookup_or_add(*I));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000294
295 return e;
296}
297
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000298Expression ValueTable::create_expression(BinaryOperator* BO) {
299 Expression e;
300
Owen Anderson1e73f292008-04-11 05:11:49 +0000301 e.firstVN = lookup_or_add(BO->getOperand(0));
302 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000303 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000304 e.function = 0;
Owen Andersonab6ec2e2007-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 Anderson1e73f292008-04-11 05:11:49 +0000314 e.firstVN = lookup_or_add(C->getOperand(0));
315 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000316 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000317 e.function = 0;
Owen Andersonab6ec2e2007-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 Anderson1e73f292008-04-11 05:11:49 +0000327 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000328 e.secondVN = 0;
329 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000330 e.function = 0;
Owen Andersonab6ec2e2007-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 Anderson1e73f292008-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 Anderson09b83ba2007-10-18 19:39:33 +0000343 e.function = 0;
Owen Andersonab6ec2e2007-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 Anderson1e73f292008-04-11 05:11:49 +0000353 e.firstVN = lookup_or_add(E->getOperand(0));
354 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000355 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000356 e.function = 0;
Owen Andersonab6ec2e2007-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 Anderson1e73f292008-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 Anderson09b83ba2007-10-18 19:39:33 +0000369 e.function = 0;
Owen Andersonab6ec2e2007-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 Anderson1e73f292008-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 Anderson09b83ba2007-10-18 19:39:33 +0000382 e.function = 0;
Owen Andersonab6ec2e2007-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 Anderson69057b82008-05-13 08:17:22 +0000391
Owen Anderson1e73f292008-04-11 05:11:49 +0000392 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000393 e.secondVN = 0;
394 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000395 e.function = 0;
Owen Andersonab6ec2e2007-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 Anderson1e73f292008-04-11 05:11:49 +0000401 e.varargs.push_back(lookup_or_add(*I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000402
403 return e;
404}
405
406//===----------------------------------------------------------------------===//
407// ValueTable External Functions
408//===----------------------------------------------------------------------===//
409
Owen Anderson6a903bc2008-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 Andersonab6ec2e2007-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 Anderson09b83ba2007-10-18 19:39:33 +0000422 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson1e73f292008-04-11 05:11:49 +0000423 if (AA->doesNotAccessMemory(C)) {
Owen Anderson09b83ba2007-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 Andersonf9ae76d2008-04-17 05:36:50 +0000436 } else if (AA->onlyReadsMemory(C)) {
437 Expression e = create_expression(C);
438
Owen Anderson69057b82008-05-13 08:17:22 +0000439 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000440 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
441 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson69057b82008-05-13 08:17:22 +0000442 return nextValueNumber++;
443 }
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000444
Chris Lattner7f9c8a02008-11-29 02:29:27 +0000445 MemDepResult local_dep = MD->getDependency(C);
Owen Anderson17816b32008-05-13 23:18:30 +0000446
Chris Lattner0e3d6332008-12-05 21:04:20 +0000447 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000448 valueNumbering.insert(std::make_pair(V, nextValueNumber));
449 return nextValueNumber++;
Chris Lattner80c7d812008-11-30 23:39:23 +0000450 }
Chris Lattner0e3d6332008-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 Anderson17816b32008-05-13 23:18:30 +0000456 valueNumbering.insert(std::make_pair(V, nextValueNumber));
457 return nextValueNumber++;
458 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000459
Chris Lattner80c7d812008-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 Anderson17816b32008-05-13 23:18:30 +0000472 }
Chris Lattner7e61daf2008-12-01 01:15:42 +0000473
Chris Lattner0e3d6332008-12-05 21:04:20 +0000474 // Non-local case.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000475 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner254314e2008-12-09 19:38:05 +0000476 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattner0e3d6332008-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 Anderson8c2391d2008-05-13 13:41:23 +0000479 CallInst* cdep = 0;
Owen Anderson69057b82008-05-13 08:17:22 +0000480
Chris Lattner80c7d812008-11-30 23:39:23 +0000481 // Check to see if we have a single dominating call instruction that is
482 // identical to C.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000483 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
484 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattner80c7d812008-11-30 23:39:23 +0000485 // Ignore non-local dependencies.
486 if (I->second.isNonLocal())
487 continue;
Owen Anderson69057b82008-05-13 08:17:22 +0000488
Chris Lattner80c7d812008-11-30 23:39:23 +0000489 // We don't handle non-depedencies. If we already have a call, reject
490 // instruction dependencies.
Chris Lattner0e3d6332008-12-05 21:04:20 +0000491 if (I->second.isClobber() || cdep != 0) {
Chris Lattner80c7d812008-11-30 23:39:23 +0000492 cdep = 0;
493 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000494 }
Chris Lattner80c7d812008-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 Anderson69057b82008-05-13 08:17:22 +0000505 }
506
Owen Anderson8c2391d2008-05-13 13:41:23 +0000507 if (!cdep) {
Owen Anderson69057b82008-05-13 08:17:22 +0000508 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000509 return nextValueNumber++;
510 }
511
Chris Lattner0e3d6332008-12-05 21:04:20 +0000512 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson69057b82008-05-13 08:17:22 +0000513 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000514 return nextValueNumber++;
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000515 }
Chris Lattner80c7d812008-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 Andersonf9ae76d2008-04-17 05:36:50 +0000528
Owen Anderson09b83ba2007-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 Andersonab6ec2e2007-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 Lattner2876a642008-03-21 21:14:38 +0000647 assert(VI != valueNumbering.end() && "Value not numbered?");
648 return VI->second;
Owen Andersonab6ec2e2007-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 Anderson10ffa862007-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 Wendling6b18a392008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000672//===----------------------------------------------------------------------===//
Bill Wendling456e8852008-12-22 22:32:22 +0000673// GVN Pass
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000674//===----------------------------------------------------------------------===//
675
676namespace {
Owen Anderson1b3ea962008-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 Andersonab6ec2e2007-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 Gohmana79db302008-09-04 17:05:41 +0000691 GVN() : FunctionPass(&ID) { }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000692
693 private:
Chris Lattner8541ede2008-12-01 00:40:32 +0000694 MemoryDependenceAnalysis *MD;
695 DominatorTree *DT;
696
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000697 ValueTable VN;
Owen Anderson1b3ea962008-06-20 01:15:47 +0000698 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000699
Owen Anderson0cc1a762007-08-07 23:12:31 +0000700 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
701 PhiMapType phiMap;
702
703
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000704 // This transformation requires dominator postdominator info
705 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000706 AU.addRequired<DominatorTree>();
707 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000708 AU.addRequired<AliasAnalysis>();
Owen Anderson54e02192008-06-23 17:49:45 +0000709
710 AU.addPreserved<DominatorTree>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000711 AU.addPreserved<AliasAnalysis>();
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000712 }
713
714 // Helper fuctions
715 // FIXME: eliminate or document these better
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000716 bool processLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000717 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000718 bool processInstruction(Instruction* I,
Chris Lattner804209d2008-03-21 22:01:16 +0000719 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson9699a6e2007-08-02 18:16:06 +0000720 bool processNonLocalLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000721 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000722 bool processBlock(BasicBlock* BB);
Owen Andersone34c2392008-12-14 19:10:35 +0000723 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Anderson0ac1fc82007-08-02 17:56:05 +0000724 DenseMap<BasicBlock*, Value*> &Phis,
725 bool top_level = false);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000726 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson676070d2007-08-14 18:04:11 +0000727 bool iterateOnFunction(Function &F);
Owen Andersonf5023a72007-08-16 22:51:56 +0000728 Value* CollapsePhi(PHINode* p);
Owen Anderson4cd516b2007-09-16 08:04:16 +0000729 bool isSafeReplacement(PHINode* p, Instruction* inst);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000730 bool performPRE(Function& F);
Owen Anderson1b3ea962008-06-20 01:15:47 +0000731 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Anderson53d546e2008-07-15 16:28:06 +0000732 bool mergeBlockIntoPredecessor(BasicBlock* BB);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000733 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopese3127f32008-10-10 16:25:50 +0000734 void cleanupGlobalSets();
Bill Wendling6b18a392008-12-22 21:36:08 +0000735 void verifyRemoved(const Instruction *I) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000736 };
737
738 char GVN::ID = 0;
Owen Andersonab6ec2e2007-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 Anderson6a903bc2008-06-18 21:41:49 +0000747void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5e5599b2007-07-25 19:57:03 +0000748 printf("{\n");
Owen Anderson6a903bc2008-06-18 21:41:49 +0000749 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5e5599b2007-07-25 19:57:03 +0000750 E = d.end(); I != E; ++I) {
Owen Anderson6a903bc2008-06-18 21:41:49 +0000751 printf("%d\n", I->first);
Owen Anderson5e5599b2007-07-25 19:57:03 +0000752 I->second->dump();
753 }
754 printf("}\n");
755}
756
Owen Andersonf5023a72007-08-16 22:51:56 +0000757Value* GVN::CollapsePhi(PHINode* p) {
Owen Andersonf5023a72007-08-16 22:51:56 +0000758 Value* constVal = p->hasConstantValue();
Chris Lattner2876a642008-03-21 21:14:38 +0000759 if (!constVal) return 0;
Owen Andersonf5023a72007-08-16 22:51:56 +0000760
Chris Lattner2876a642008-03-21 21:14:38 +0000761 Instruction* inst = dyn_cast<Instruction>(constVal);
762 if (!inst)
763 return constVal;
764
Chris Lattner8541ede2008-12-01 00:40:32 +0000765 if (DT->dominates(inst, p))
Chris Lattner2876a642008-03-21 21:14:38 +0000766 if (isSafeReplacement(p, inst))
767 return inst;
Owen Andersonf5023a72007-08-16 22:51:56 +0000768 return 0;
769}
Owen Anderson5e5599b2007-07-25 19:57:03 +0000770
Owen Anderson4cd516b2007-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 Andersondbf23cc2007-07-26 18:26:51 +0000784/// GetValueForBlock - Get the value to use within the specified basic block.
785/// available values are in Phis.
Owen Andersone34c2392008-12-14 19:10:35 +0000786Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner2876a642008-03-21 21:14:38 +0000787 DenseMap<BasicBlock*, Value*> &Phis,
788 bool top_level) {
Owen Andersondbf23cc2007-07-26 18:26:51 +0000789
790 // If we have already computed this value, return the previously computed val.
Owen Anderson2d19aae2007-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 Andersondbf23cc2007-07-26 18:26:51 +0000793
Owen Anderson6acc7822008-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 Lattner8541ede2008-12-01 00:40:32 +0000796 if (!DT->isReachableFromEntry(BB))
Owen Anderson6acc7822008-07-02 18:15:31 +0000797 return Phis[BB] = UndefValue::get(orig->getType());
Owen Andersonb22a6402008-07-02 17:20:16 +0000798
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000799 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
800 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000801 Phis[BB] = ret;
802 return ret;
Owen Anderson774761c2007-08-03 11:03:26 +0000803 }
Chris Lattner0a5a8d52008-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 Lattner2876a642008-03-21 21:14:38 +0000813
Owen Andersondbf23cc2007-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 Greife9ecc682008-04-06 20:25:17 +0000816 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
817 BB->begin());
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000818 PN->reserveOperandSpace(NumPreds);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000819
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000820 Phis.insert(std::make_pair(BB, PN));
Owen Andersond66e2852007-07-30 16:57:08 +0000821
Owen Andersondbf23cc2007-07-26 18:26:51 +0000822 // Fill in the incoming values for the block.
Owen Andersond58fa6b02007-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 Andersond58fa6b02007-07-31 17:43:14 +0000825 PN->addIncoming(val, *PI);
826 }
Chris Lattner2876a642008-03-21 21:14:38 +0000827
Chris Lattner8541ede2008-12-01 00:40:32 +0000828 VN.getAliasAnalysis()->copyValue(orig, PN);
Owen Andersond58fa6b02007-07-31 17:43:14 +0000829
Owen Anderson221a4362007-08-16 22:02:55 +0000830 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersonf5023a72007-08-16 22:51:56 +0000831 Value* v = CollapsePhi(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000832 if (!v) {
833 // Cache our phi construction results
Owen Andersone34c2392008-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 Lattner2876a642008-03-21 21:14:38 +0000839 return PN;
Owen Andersond58fa6b02007-07-31 17:43:14 +0000840 }
Owen Andersonf7928602008-05-12 20:15:55 +0000841
Chris Lattner2876a642008-03-21 21:14:38 +0000842 PN->replaceAllUsesWith(v);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +0000843 if (isa<PointerType>(v->getType()))
844 MD->invalidateCachedPointerInfo(v);
Chris Lattner2876a642008-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 Lattner8541ede2008-12-01 00:40:32 +0000851 DEBUG(cerr << "GVN removed: " << *PN);
852 MD->removeInstruction(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000853 PN->eraseFromParent();
Bill Wendling6b18a392008-12-22 21:36:08 +0000854 DEBUG(verifyRemoved(PN));
Chris Lattner2876a642008-03-21 21:14:38 +0000855
856 Phis[BB] = v;
857 return v;
Owen Anderson5e5599b2007-07-25 19:57:03 +0000858}
859
Chris Lattner1db9bbe2008-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 Lattnerd2a653a2008-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 Lattner1db9bbe2008-12-02 08:16:11 +0000870static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000871 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattner1db9bbe2008-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 Lattnerd2a653a2008-12-05 07:49:08 +0000874 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
875 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000876
877 // If the entry already existed for this block, return the precomputed value.
Chris Lattnerd2a653a2008-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 Lattner1db9bbe2008-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 Lattnerd2a653a2008-12-05 07:49:08 +0000891 goto SpeculationFailure;
Chris Lattner1db9bbe2008-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 Lattnerd2a653a2008-12-05 07:49:08 +0000898 goto SpeculationFailure;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000899
900 return true;
Chris Lattnerd2a653a2008-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 Lattner1db9bbe2008-12-02 08:16:11 +0000935}
936
Owen Anderson221a4362007-08-16 22:02:55 +0000937/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
938/// non-local by performing PHI construction.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000939bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner804209d2008-03-21 22:01:16 +0000940 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000941 // Find the non-local dependencies of the load.
Chris Lattnerb6fc4b82008-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 Anderson5e5599b2007-07-25 19:57:03 +0000946
Owen Andersonb39e0de2008-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 Lattnerb6fc4b82008-12-09 19:25:07 +0000950 if (Deps.size() > 100)
Owen Andersonb39e0de2008-08-26 22:07:42 +0000951 return false;
Chris Lattnerb6372932008-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 Edwinba93ea72009-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 Lattnerb6372932008-12-18 00:51:32 +0000961 return false;
Torok Edwinba93ea72009-06-17 18:48:18 +0000962 }
Owen Andersonb39e0de2008-08-26 22:07:42 +0000963
Chris Lattner1db9bbe2008-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 Anderson0cc1a762007-08-07 23:12:31 +0000970
Chris Lattnerb6fc4b82008-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 Lattner7e61daf2008-12-01 01:15:42 +0000974
Chris Lattner0e3d6332008-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 Lattner1db9bbe2008-12-02 08:16:11 +0000984 ValuesPerBlock.push_back(std::make_pair(DepBB,
985 UndefValue::get(LI->getType())));
Chris Lattner7e61daf2008-12-01 01:15:42 +0000986 continue;
987 }
Chris Lattner2876a642008-03-21 21:14:38 +0000988
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000989 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner9ce89952008-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 Lattner1db9bbe2008-12-02 08:16:11 +0000995 if (S->getOperand(0)->getType() != LI->getType()) {
996 UnavailableBlocks.push_back(DepBB);
997 continue;
998 }
Chris Lattner9ce89952008-12-01 01:31:36 +0000999
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001000 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattner9ce89952008-12-01 01:31:36 +00001001
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001002 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001003 if (LD->getType() != LI->getType()) {
1004 UnavailableBlocks.push_back(DepBB);
1005 continue;
1006 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001007 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5e5599b2007-07-25 19:57:03 +00001008 } else {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001009 UnavailableBlocks.push_back(DepBB);
1010 continue;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001011 }
Chris Lattner2876a642008-03-21 21:14:38 +00001012 }
Owen Anderson5e5599b2007-07-25 19:57:03 +00001013
Chris Lattner1db9bbe2008-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 Lattnerb6fc4b82008-12-09 19:25:07 +00001024 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattner1db9bbe2008-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 Lattnerfa9f99a2008-12-09 22:06:23 +00001030 if (isa<PointerType>((*I)->getType()))
1031 MD->invalidateCachedPointerInfo(*I);
Chris Lattner1db9bbe2008-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 Anderson0cc1a762007-08-07 23:12:31 +00001038 }
Chris Lattner2876a642008-03-21 21:14:38 +00001039
Chris Lattner1db9bbe2008-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 Lattner69131fd2008-12-15 03:46:38 +00001047
Chris Lattner096f44d2009-02-12 07:00:35 +00001048 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001049 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001050 if (isa<PointerType>(v->getType()))
1051 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-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 Andersoncc0c75c2009-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 Lattner1db9bbe2008-12-02 08:16:11 +00001074 BasicBlock *LoadBB = LI->getParent();
Owen Andersoncc0c75c2009-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 Lattner1db9bbe2008-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 Andersoncc0c75c2009-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 Lattner1db9bbe2008-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 Lattnerd2a653a2008-12-05 07:49:08 +00001124 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattner1db9bbe2008-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 Anderson0cc1a762007-08-07 23:12:31 +00001162 }
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001163
Chris Lattner1db9bbe2008-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 Lattnerc1008282008-12-05 17:04:12 +00001167 DEBUG(cerr << "GVN REMOVING PRE LOAD: " << *LI);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001168
1169 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1170 LI->getAlignment(),
1171 UnavailablePred->getTerminator());
1172
Owen Anderson04cfdd32009-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 Lattner1db9bbe2008-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 Lattner096f44d2009-02-12 07:00:35 +00001185 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001186 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001187 if (isa<PointerType>(v->getType()))
1188 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001189 toErase.push_back(LI);
1190 NumPRELoad++;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001191 return true;
1192}
1193
Owen Anderson221a4362007-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 Lattner0e3d6332008-12-05 21:04:20 +00001196bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1197 if (L->isVolatile())
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001198 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001199
1200 Value* pointer = L->getPointerOperand();
Chris Lattner0e3d6332008-12-05 21:04:20 +00001201
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001202 // ... to a pointer that has been loaded from before...
Chris Lattner8541ede2008-12-01 00:40:32 +00001203 MemDepResult dep = MD->getDependency(L);
Owen Andersona7b220f2007-08-14 17:59:48 +00001204
Chris Lattner0e3d6332008-12-05 21:04:20 +00001205 // If the value isn't available, don't do anything!
Torok Edwin72070282009-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 Edwin0b0ddb22009-05-29 16:58:36 +00001212 DOUT << " is clobbered by " << *I;
Torok Edwin72070282009-05-29 09:46:03 +00001213 );
Chris Lattner0e3d6332008-12-05 21:04:20 +00001214 return false;
Torok Edwin72070282009-05-29 09:46:03 +00001215 }
Chris Lattner0e3d6332008-12-05 21:04:20 +00001216
1217 // If it is defined in another block, try harder.
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001218 if (dep.isNonLocal())
Chris Lattner0e3d6332008-12-05 21:04:20 +00001219 return processNonLocalLoad(L, toErase);
Eli Friedman716c10c2008-02-12 12:08:14 +00001220
Chris Lattner0e3d6332008-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 Lattnerfa9f99a2008-12-09 22:06:23 +00001230 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1231 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattner0e3d6332008-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 Lattnerfa9f99a2008-12-09 22:06:23 +00001245 if (isa<PointerType>(DepLI->getType()))
1246 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner0e3d6332008-12-05 21:04:20 +00001247 toErase.push_back(L);
1248 NumGVNLoad++;
1249 return true;
1250 }
1251
Chris Lattner3ff6d012008-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 Lattner0e3d6332008-12-05 21:04:20 +00001255 if (isa<AllocationInst>(DepInst)) {
Chris Lattner3ff6d012008-11-30 01:39:32 +00001256 L->replaceAllUsesWith(UndefValue::get(L->getType()));
1257 toErase.push_back(L);
Chris Lattner3ff6d012008-11-30 01:39:32 +00001258 NumGVNLoad++;
Chris Lattner0e3d6332008-12-05 21:04:20 +00001259 return true;
Eli Friedman716c10c2008-02-12 12:08:14 +00001260 }
1261
Chris Lattner0e3d6332008-12-05 21:04:20 +00001262 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001263}
1264
Owen Anderson1b3ea962008-06-20 01:15:47 +00001265Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Anderson54e02192008-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 Anderson1b3ea962008-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 Andersonbfe133e2008-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 Lattner73d7fe52009-01-19 22:00:18 +00001312 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Andersonbfe133e2008-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 Anderson398602a2007-08-14 18:16:29 +00001337/// processInstruction - When calculating availability, handle an instruction
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001338/// by inserting it into the appropriate sets
Owen Andersonaccdca12008-06-12 19:25:32 +00001339bool GVN::processInstruction(Instruction *I,
Chris Lattner804209d2008-03-21 22:01:16 +00001340 SmallVectorImpl<Instruction*> &toErase) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001341 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001342 bool changed = processLoad(L, toErase);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001343
1344 if (!changed) {
1345 unsigned num = VN.lookup_or_add(L);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001346 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001347 }
1348
1349 return changed;
1350 }
1351
Owen Anderson3ea90a72008-07-03 17:44:33 +00001352 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001353 unsigned num = VN.lookup_or_add(I);
Chris Lattner804209d2008-03-21 22:01:16 +00001354
Owen Anderson98f912b2009-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 Anderson0c1e6342008-04-07 09:59:07 +00001374 // Allocations are always uniquely numbered, so we can save time and memory
Owen Anderson98f912b2009-04-01 23:53:49 +00001375 // by fast failing them.
1376 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001377 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson0c1e6342008-04-07 09:59:07 +00001378 return false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001379 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001380
Owen Anderson221a4362007-08-16 22:02:55 +00001381 // Collapse PHI nodes
Owen Andersonbc271a02007-08-14 18:33:27 +00001382 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001383 Value* constVal = CollapsePhi(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001384
1385 if (constVal) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001386 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1387 PI != PE; ++PI)
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001388 PI->second.erase(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001389
Owen Andersonf5023a72007-08-16 22:51:56 +00001390 p->replaceAllUsesWith(constVal);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001391 if (isa<PointerType>(constVal->getType()))
1392 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson164274e2008-12-23 00:49:51 +00001393 VN.erase(p);
1394
Owen Andersonf5023a72007-08-16 22:51:56 +00001395 toErase.push_back(p);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001396 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001397 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonbc271a02007-08-14 18:33:27 +00001398 }
Owen Anderson3ea90a72008-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 Andersonbfe133e2008-12-15 02:03:00 +00001406 // Perform fast-path value-number based elimination of values inherited from
1407 // dominators.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001408 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson086b2c42007-12-08 01:37:09 +00001409 // Remove it!
Owen Anderson10ffa862007-07-31 23:27:13 +00001410 VN.erase(I);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001411 I->replaceAllUsesWith(repl);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001412 if (isa<PointerType>(repl->getType()))
1413 MD->invalidateCachedPointerInfo(repl);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001414 toErase.push_back(I);
1415 return true;
Owen Andersonbfe133e2008-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 Anderson3ea90a72008-07-03 17:44:33 +00001428 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001429 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001430 }
1431
1432 return false;
1433}
1434
Bill Wendling456e8852008-12-22 22:32:22 +00001435/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson676070d2007-08-14 18:04:11 +00001436bool GVN::runOnFunction(Function& F) {
Chris Lattner8541ede2008-12-01 00:40:32 +00001437 MD = &getAnalysis<MemoryDependenceAnalysis>();
1438 DT = &getAnalysis<DominatorTree>();
Owen Andersonf7928602008-05-12 20:15:55 +00001439 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner8541ede2008-12-01 00:40:32 +00001440 VN.setMemDep(MD);
1441 VN.setDomTree(DT);
Owen Anderson09b83ba2007-10-18 19:39:33 +00001442
Owen Anderson676070d2007-08-14 18:04:11 +00001443 bool changed = false;
1444 bool shouldContinue = true;
1445
Owen Andersonac310962008-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 Andersonc0623812008-07-17 00:01:40 +00001451 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1452 if (removedBlock) NumGVNBlocks++;
1453
1454 changed |= removedBlock;
Owen Andersonac310962008-07-16 17:52:31 +00001455 }
1456
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001457 unsigned Iteration = 0;
1458
Owen Anderson676070d2007-08-14 18:04:11 +00001459 while (shouldContinue) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001460 DEBUG(cerr << "GVN iteration: " << Iteration << "\n");
Owen Anderson676070d2007-08-14 18:04:11 +00001461 shouldContinue = iterateOnFunction(F);
1462 changed |= shouldContinue;
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001463 ++Iteration;
Owen Anderson676070d2007-08-14 18:04:11 +00001464 }
1465
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001466 if (EnablePRE) {
Owen Anderson2fbfb702008-09-03 23:06:07 +00001467 bool PREChanged = true;
1468 while (PREChanged) {
1469 PREChanged = performPRE(F);
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001470 changed |= PREChanged;
Owen Anderson2fbfb702008-09-03 23:06:07 +00001471 }
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001472 }
Chris Lattner0a5a8d52008-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 Lopese3127f32008-10-10 16:25:50 +00001477
1478 cleanupGlobalSets();
1479
Owen Anderson676070d2007-08-14 18:04:11 +00001480 return changed;
1481}
1482
1483
Owen Andersonbfe133e2008-12-15 02:03:00 +00001484bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner0a5a8d52008-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 Andersonaccdca12008-06-12 19:25:32 +00001487 SmallVector<Instruction*, 8> toErase;
Owen Andersonaccdca12008-06-12 19:25:32 +00001488 bool changed_function = false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001489
Owen Andersonaccdca12008-06-12 19:25:32 +00001490 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1491 BI != BE;) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001492 changed_function |= processInstruction(BI, toErase);
Owen Andersonaccdca12008-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 Lattner8541ede2008-12-01 00:40:32 +00001507 E = toErase.end(); I != E; ++I) {
1508 DEBUG(cerr << "GVN removed: " << **I);
1509 MD->removeInstruction(*I);
Owen Andersonaccdca12008-06-12 19:25:32 +00001510 (*I)->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001511 DEBUG(verifyRemoved(*I));
Chris Lattner8541ede2008-12-01 00:40:32 +00001512 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001513 toErase.clear();
Owen Andersonaccdca12008-06-12 19:25:32 +00001514
1515 if (AtStart)
1516 BI = BB->begin();
1517 else
1518 ++BI;
Owen Andersonaccdca12008-06-12 19:25:32 +00001519 }
1520
Owen Andersonaccdca12008-06-12 19:25:32 +00001521 return changed_function;
1522}
1523
Owen Anderson6a903bc2008-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 Lattner6f5bf6a2008-12-01 07:35:54 +00001527 bool Changed = false;
Owen Andersonfdf9f162008-06-19 19:54:19 +00001528 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001529 DenseMap<BasicBlock*, Value*> predMap;
Owen Anderson6a903bc2008-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 Lattner6f5bf6a2008-12-01 07:35:54 +00001539 Instruction *CurInst = BI++;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001540
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001541 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
John Criswell073e4d12009-03-10 15:04:53 +00001542 isa<PHINode>(CurInst) || (CurInst->getType() == Type::VoidTy) ||
Duncan Sands1efabaa2009-05-06 06:49:50 +00001543 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell073e4d12009-03-10 15:04:53 +00001544 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001545 continue;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001546
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001547 uint32_t valno = VN.lookup(CurInst);
Owen Anderson6a903bc2008-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 Lattnerf00aae42008-12-01 07:29:03 +00001558 predMap.clear();
1559
Owen Anderson6a903bc2008-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 Anderson1b3ea962008-06-20 01:15:47 +00001563 // own predecessor, on in blocks with predecessors
1564 // that are not reachable.
1565 if (*PI == CurrentBlock) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001566 numWithout = 2;
Owen Anderson1b3ea962008-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 Anderson6a903bc2008-06-18 21:41:49 +00001576 PREPred = *PI;
1577 numWithout++;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001578 } else if (predV->second == CurInst) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001579 numWithout = 2;
1580 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001581 predMap[*PI] = predV->second;
Owen Anderson6a903bc2008-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 Lattner6f5bf6a2008-12-01 07:35:54 +00001588 if (numWithout != 1 || numWith == 0)
Owen Anderson6a903bc2008-06-18 21:41:49 +00001589 continue;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001590
Owen Andersonfdf9f162008-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 Anderson2fbfb702008-09-03 23:06:07 +00001597 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonfdf9f162008-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 Andersonfdf9f162008-06-19 19:54:19 +00001604 continue;
1605 }
1606
Owen Anderson6a903bc2008-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 Lattner6f5bf6a2008-12-01 07:35:54 +00001612 Instruction* PREInstr = CurInst->clone();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001613 bool success = true;
Chris Lattner6f5bf6a2008-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 Anderson8e462e92008-07-11 20:05:13 +00001624 }
Owen Anderson6a903bc2008-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 Wendling3c793442008-12-22 22:14:07 +00001632 DEBUG(verifyRemoved(PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001633 continue;
1634 }
1635
1636 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001637 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson1b3ea962008-06-20 01:15:47 +00001638 predMap[PREPred] = PREInstr;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001639 VN.add(PREInstr, valno);
1640 NumGVNPRE++;
1641
1642 // Update the availability map to include the new instruction.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001643 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001644
1645 // Create a PHI to make the value available in this block.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001646 PHINode* Phi = PHINode::Create(CurInst->getType(),
1647 CurInst->getName() + ".pre-phi",
Owen Anderson6a903bc2008-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 Anderson1b3ea962008-06-20 01:15:47 +00001651 Phi->addIncoming(predMap[*PI], *PI);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001652
1653 VN.add(Phi, valno);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001654 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001655
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001656 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001657 if (isa<PointerType>(Phi->getType()))
1658 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001659 VN.erase(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001660
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001661 DEBUG(cerr << "GVN PRE removed: " << *CurInst);
1662 MD->removeInstruction(CurInst);
1663 CurInst->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001664 DEBUG(verifyRemoved(CurInst));
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001665 Changed = true;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001666 }
1667 }
1668
Owen Andersonfdf9f162008-06-19 19:54:19 +00001669 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001670 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonfdf9f162008-06-19 19:54:19 +00001671 SplitCriticalEdge(I->first, I->second, this);
1672
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001673 return Changed || toSplit.size();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001674}
1675
Bill Wendling456e8852008-12-22 22:32:22 +00001676/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson676070d2007-08-14 18:04:11 +00001677bool GVN::iterateOnFunction(Function &F) {
Nuno Lopese3127f32008-10-10 16:25:50 +00001678 cleanupGlobalSets();
Chris Lattnerbeb216d2008-03-21 21:33:23 +00001679
Owen Anderson98f912b2009-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 Andersonab6ec2e2007-07-24 17:55:58 +00001689 // Top-down walk of the dominator tree
Owen Anderson6a903bc2008-06-18 21:41:49 +00001690 bool changed = false;
Owen Anderson03aacba2008-12-15 03:52:17 +00001691#if 0
1692 // Needed for value numbering with phi construction to work.
Owen Andersonbfe133e2008-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 Anderson03aacba2008-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 Andersonac310962008-07-16 17:52:31 +00001703 return changed;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001704}
Nuno Lopese3127f32008-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 Wendling6b18a392008-12-22 21:36:08 +00001715
1716/// verifyRemoved - Verify that the specified instruction does not occur in our
1717/// internal data structures.
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001718void GVN::verifyRemoved(const Instruction *Inst) const {
1719 VN.verifyRemoved(Inst);
Bill Wendling3c793442008-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 Wendlinge7f08e72008-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 Wendling3c793442008-12-22 22:14:07 +00001726
1727 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlinge7f08e72008-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 Wendling3c793442008-12-22 22:14:07 +00001746 }
1747 }
Bill Wendling6b18a392008-12-22 21:36:08 +00001748}