blob: 673d38b7f3ae6dc6c19a302363a786833bc4850f [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);
Bill Wendling006459e2009-05-29 20:38:16 +000051cl::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.
955 if (Deps.size() == 1 && Deps[0].second.isClobber())
956 return false;
Owen Andersonb39e0de2008-08-26 22:07:42 +0000957
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000958 // Filter out useless results (non-locals, etc). Keep track of the blocks
959 // where we have a value available in repl, also keep track of whether we see
960 // dependencies that produce an unknown value for the load (such as a call
961 // that could potentially clobber the load).
962 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
963 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Owen Anderson0cc1a762007-08-07 23:12:31 +0000964
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000965 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
966 BasicBlock *DepBB = Deps[i].first;
967 MemDepResult DepInfo = Deps[i].second;
Chris Lattner7e61daf2008-12-01 01:15:42 +0000968
Chris Lattner0e3d6332008-12-05 21:04:20 +0000969 if (DepInfo.isClobber()) {
970 UnavailableBlocks.push_back(DepBB);
971 continue;
972 }
973
974 Instruction *DepInst = DepInfo.getInst();
975
976 // Loading the allocation -> undef.
977 if (isa<AllocationInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000978 ValuesPerBlock.push_back(std::make_pair(DepBB,
979 UndefValue::get(LI->getType())));
Chris Lattner7e61daf2008-12-01 01:15:42 +0000980 continue;
981 }
Chris Lattner2876a642008-03-21 21:14:38 +0000982
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000983 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner9ce89952008-12-01 01:31:36 +0000984 // Reject loads and stores that are to the same address but are of
985 // different types.
986 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
987 // of bitfield access, it would be interesting to optimize for it at some
988 // point.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000989 if (S->getOperand(0)->getType() != LI->getType()) {
990 UnavailableBlocks.push_back(DepBB);
991 continue;
992 }
Chris Lattner9ce89952008-12-01 01:31:36 +0000993
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000994 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattner9ce89952008-12-01 01:31:36 +0000995
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000996 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000997 if (LD->getType() != LI->getType()) {
998 UnavailableBlocks.push_back(DepBB);
999 continue;
1000 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001001 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5e5599b2007-07-25 19:57:03 +00001002 } else {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001003 UnavailableBlocks.push_back(DepBB);
1004 continue;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001005 }
Chris Lattner2876a642008-03-21 21:14:38 +00001006 }
Owen Anderson5e5599b2007-07-25 19:57:03 +00001007
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001008 // If we have no predecessors that produce a known value for this load, exit
1009 // early.
1010 if (ValuesPerBlock.empty()) return false;
1011
1012 // If all of the instructions we depend on produce a known value for this
1013 // load, then it is fully redundant and we can use PHI insertion to compute
1014 // its value. Insert PHIs and remove the fully redundant value now.
1015 if (UnavailableBlocks.empty()) {
1016 // Use cached PHI construction information from previous runs
1017 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001018 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001019 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1020 I != E; ++I) {
1021 if ((*I)->getParent() == LI->getParent()) {
1022 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD #1: " << *LI);
1023 LI->replaceAllUsesWith(*I);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001024 if (isa<PointerType>((*I)->getType()))
1025 MD->invalidateCachedPointerInfo(*I);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001026 toErase.push_back(LI);
1027 NumGVNLoad++;
1028 return true;
1029 }
1030
1031 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Anderson0cc1a762007-08-07 23:12:31 +00001032 }
Chris Lattner2876a642008-03-21 21:14:38 +00001033
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001034 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD: " << *LI);
1035
1036 DenseMap<BasicBlock*, Value*> BlockReplValues;
1037 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1038 // Perform PHI construction.
1039 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1040 LI->replaceAllUsesWith(v);
Chris Lattner69131fd2008-12-15 03:46:38 +00001041
Chris Lattner096f44d2009-02-12 07:00:35 +00001042 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001043 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001044 if (isa<PointerType>(v->getType()))
1045 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001046 toErase.push_back(LI);
1047 NumGVNLoad++;
1048 return true;
1049 }
1050
1051 if (!EnablePRE || !EnableLoadPRE)
1052 return false;
1053
1054 // Okay, we have *some* definitions of the value. This means that the value
1055 // is available in some of our (transitive) predecessors. Lets think about
1056 // doing PRE of this load. This will involve inserting a new load into the
1057 // predecessor when it's not available. We could do this in general, but
1058 // prefer to not increase code size. As such, we only do this when we know
1059 // that we only have to insert *one* load (which means we're basically moving
1060 // the load, not inserting a new one).
1061
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001062 SmallPtrSet<BasicBlock *, 4> Blockers;
1063 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1064 Blockers.insert(UnavailableBlocks[i]);
1065
1066 // Lets find first basic block with more than one predecessor. Walk backwards
1067 // through predecessors if needed.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001068 BasicBlock *LoadBB = LI->getParent();
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001069 BasicBlock *TmpBB = LoadBB;
1070
1071 bool isSinglePred = false;
1072 while (TmpBB->getSinglePredecessor()) {
1073 isSinglePred = true;
1074 TmpBB = TmpBB->getSinglePredecessor();
1075 if (!TmpBB) // If haven't found any, bail now.
1076 return false;
1077 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1078 return false;
1079 if (Blockers.count(TmpBB))
1080 return false;
1081 }
1082
1083 assert(TmpBB);
1084 LoadBB = TmpBB;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001085
1086 // If we have a repl set with LI itself in it, this means we have a loop where
1087 // at least one of the values is LI. Since this means that we won't be able
1088 // to eliminate LI even if we insert uses in the other predecessors, we will
1089 // end up increasing code size. Reject this by scanning for LI.
1090 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1091 if (ValuesPerBlock[i].second == LI)
1092 return false;
1093
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001094 if (isSinglePred) {
1095 bool isHot = false;
1096 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1097 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
1098 // "Hot" Instruction is in some loop (because it dominates its dep.
1099 // instruction).
1100 if (DT->dominates(LI, I)) {
1101 isHot = true;
1102 break;
1103 }
1104
1105 // We are interested only in "hot" instructions. We don't want to do any
1106 // mis-optimizations here.
1107 if (!isHot)
1108 return false;
1109 }
1110
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001111 // Okay, we have some hope :). Check to see if the loaded value is fully
1112 // available in all but one predecessor.
1113 // FIXME: If we could restructure the CFG, we could make a common pred with
1114 // all the preds that don't have an available LI and insert a new load into
1115 // that one block.
1116 BasicBlock *UnavailablePred = 0;
1117
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001118 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001119 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1120 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1121 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1122 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1123
1124 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1125 PI != E; ++PI) {
1126 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1127 continue;
1128
1129 // If this load is not available in multiple predecessors, reject it.
1130 if (UnavailablePred && UnavailablePred != *PI)
1131 return false;
1132 UnavailablePred = *PI;
1133 }
1134
1135 assert(UnavailablePred != 0 &&
1136 "Fully available value should be eliminated above!");
1137
1138 // If the loaded pointer is PHI node defined in this block, do PHI translation
1139 // to get its value in the predecessor.
1140 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
1141
1142 // Make sure the value is live in the predecessor. If it was defined by a
1143 // non-PHI instruction in this block, we don't know how to recompute it above.
1144 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1145 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
1146 DEBUG(cerr << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
1147 << *LPInst << *LI << "\n");
1148 return false;
1149 }
1150
1151 // We don't currently handle critical edges :(
1152 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
1153 DEBUG(cerr << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
1154 << UnavailablePred->getName() << "': " << *LI);
1155 return false;
Owen Anderson0cc1a762007-08-07 23:12:31 +00001156 }
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001157
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001158 // Okay, we can eliminate this load by inserting a reload in the predecessor
1159 // and using PHI construction to get the value in the other predecessors, do
1160 // it.
Chris Lattnerc1008282008-12-05 17:04:12 +00001161 DEBUG(cerr << "GVN REMOVING PRE LOAD: " << *LI);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001162
1163 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1164 LI->getAlignment(),
1165 UnavailablePred->getTerminator());
1166
Owen Anderson04cfdd32009-05-29 05:37:54 +00001167 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1168 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1169 I != E; ++I)
1170 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
1171
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001172 DenseMap<BasicBlock*, Value*> BlockReplValues;
1173 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1174 BlockReplValues[UnavailablePred] = NewLoad;
1175
1176 // Perform PHI construction.
1177 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1178 LI->replaceAllUsesWith(v);
Chris Lattner096f44d2009-02-12 07:00:35 +00001179 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001180 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001181 if (isa<PointerType>(v->getType()))
1182 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001183 toErase.push_back(LI);
1184 NumPRELoad++;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001185 return true;
1186}
1187
Owen Anderson221a4362007-08-16 22:02:55 +00001188/// processLoad - Attempt to eliminate a load, first by eliminating it
1189/// locally, and then attempting non-local elimination if that fails.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001190bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1191 if (L->isVolatile())
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001192 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001193
1194 Value* pointer = L->getPointerOperand();
Chris Lattner0e3d6332008-12-05 21:04:20 +00001195
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001196 // ... to a pointer that has been loaded from before...
Chris Lattner8541ede2008-12-01 00:40:32 +00001197 MemDepResult dep = MD->getDependency(L);
Owen Andersona7b220f2007-08-14 17:59:48 +00001198
Chris Lattner0e3d6332008-12-05 21:04:20 +00001199 // If the value isn't available, don't do anything!
Torok Edwin72070282009-05-29 09:46:03 +00001200 if (dep.isClobber()) {
1201 DEBUG(
1202 // fast print dep, using operator<< on instruction would be too slow
1203 DOUT << "GVN: load ";
1204 WriteAsOperand(*DOUT.stream(), L);
1205 Instruction *I = dep.getInst();
Torok Edwin0b0ddb22009-05-29 16:58:36 +00001206 DOUT << " is clobbered by " << *I;
Torok Edwin72070282009-05-29 09:46:03 +00001207 );
Chris Lattner0e3d6332008-12-05 21:04:20 +00001208 return false;
Torok Edwin72070282009-05-29 09:46:03 +00001209 }
Chris Lattner0e3d6332008-12-05 21:04:20 +00001210
1211 // If it is defined in another block, try harder.
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001212 if (dep.isNonLocal())
Chris Lattner0e3d6332008-12-05 21:04:20 +00001213 return processNonLocalLoad(L, toErase);
Eli Friedman716c10c2008-02-12 12:08:14 +00001214
Chris Lattner0e3d6332008-12-05 21:04:20 +00001215 Instruction *DepInst = dep.getInst();
1216 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1217 // Only forward substitute stores to loads of the same type.
1218 // FIXME: Could do better!
1219 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1220 return false;
1221
1222 // Remove it!
1223 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001224 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1225 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattner0e3d6332008-12-05 21:04:20 +00001226 toErase.push_back(L);
1227 NumGVNLoad++;
1228 return true;
1229 }
1230
1231 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1232 // Only forward substitute stores to loads of the same type.
1233 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1234 if (DepLI->getType() != L->getType())
1235 return false;
1236
1237 // Remove it!
1238 L->replaceAllUsesWith(DepLI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001239 if (isa<PointerType>(DepLI->getType()))
1240 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner0e3d6332008-12-05 21:04:20 +00001241 toErase.push_back(L);
1242 NumGVNLoad++;
1243 return true;
1244 }
1245
Chris Lattner3ff6d012008-11-30 01:39:32 +00001246 // If this load really doesn't depend on anything, then we must be loading an
1247 // undef value. This can happen when loading for a fresh allocation with no
1248 // intervening stores, for example.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001249 if (isa<AllocationInst>(DepInst)) {
Chris Lattner3ff6d012008-11-30 01:39:32 +00001250 L->replaceAllUsesWith(UndefValue::get(L->getType()));
1251 toErase.push_back(L);
Chris Lattner3ff6d012008-11-30 01:39:32 +00001252 NumGVNLoad++;
Chris Lattner0e3d6332008-12-05 21:04:20 +00001253 return true;
Eli Friedman716c10c2008-02-12 12:08:14 +00001254 }
1255
Chris Lattner0e3d6332008-12-05 21:04:20 +00001256 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001257}
1258
Owen Anderson1b3ea962008-06-20 01:15:47 +00001259Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Anderson54e02192008-06-23 17:49:45 +00001260 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1261 if (I == localAvail.end())
1262 return 0;
1263
1264 ValueNumberScope* locals = I->second;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001265
1266 while (locals) {
1267 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1268 if (I != locals->table.end())
1269 return I->second;
1270 else
1271 locals = locals->parent;
1272 }
1273
1274 return 0;
1275}
1276
Owen Andersonbfe133e2008-12-15 02:03:00 +00001277/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
1278/// by inheritance from the dominator fails, see if we can perform phi
1279/// construction to eliminate the redundancy.
1280Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1281 BasicBlock* BaseBlock = orig->getParent();
1282
1283 SmallPtrSet<BasicBlock*, 4> Visited;
1284 SmallVector<BasicBlock*, 8> Stack;
1285 Stack.push_back(BaseBlock);
1286
1287 DenseMap<BasicBlock*, Value*> Results;
1288
1289 // Walk backwards through our predecessors, looking for instances of the
1290 // value number we're looking for. Instances are recorded in the Results
1291 // map, which is then used to perform phi construction.
1292 while (!Stack.empty()) {
1293 BasicBlock* Current = Stack.back();
1294 Stack.pop_back();
1295
1296 // If we've walked all the way to a proper dominator, then give up. Cases
1297 // where the instance is in the dominator will have been caught by the fast
1298 // path, and any cases that require phi construction further than this are
1299 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1300 // time improvement.
1301 if (DT->properlyDominates(Current, orig->getParent())) return 0;
1302
1303 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1304 localAvail.find(Current);
1305 if (LA == localAvail.end()) return 0;
Chris Lattner73d7fe52009-01-19 22:00:18 +00001306 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Andersonbfe133e2008-12-15 02:03:00 +00001307
1308 if (V != LA->second->table.end()) {
1309 // Found an instance, record it.
1310 Results.insert(std::make_pair(Current, V->second));
1311 continue;
1312 }
1313
1314 // If we reach the beginning of the function, then give up.
1315 if (pred_begin(Current) == pred_end(Current))
1316 return 0;
1317
1318 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1319 PI != PE; ++PI)
1320 if (Visited.insert(*PI))
1321 Stack.push_back(*PI);
1322 }
1323
1324 // If we didn't find instances, give up. Otherwise, perform phi construction.
1325 if (Results.size() == 0)
1326 return 0;
1327 else
1328 return GetValueForBlock(BaseBlock, orig, Results, true);
1329}
1330
Owen Anderson398602a2007-08-14 18:16:29 +00001331/// processInstruction - When calculating availability, handle an instruction
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001332/// by inserting it into the appropriate sets
Owen Andersonaccdca12008-06-12 19:25:32 +00001333bool GVN::processInstruction(Instruction *I,
Chris Lattner804209d2008-03-21 22:01:16 +00001334 SmallVectorImpl<Instruction*> &toErase) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001335 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001336 bool changed = processLoad(L, toErase);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001337
1338 if (!changed) {
1339 unsigned num = VN.lookup_or_add(L);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001340 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001341 }
1342
1343 return changed;
1344 }
1345
Owen Anderson3ea90a72008-07-03 17:44:33 +00001346 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001347 unsigned num = VN.lookup_or_add(I);
Chris Lattner804209d2008-03-21 22:01:16 +00001348
Owen Anderson98f912b2009-04-01 23:53:49 +00001349 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1350 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1351
1352 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1353 return false;
1354
1355 Value* branchCond = BI->getCondition();
1356 uint32_t condVN = VN.lookup_or_add(branchCond);
1357
1358 BasicBlock* trueSucc = BI->getSuccessor(0);
1359 BasicBlock* falseSucc = BI->getSuccessor(1);
1360
1361 if (trueSucc->getSinglePredecessor())
1362 localAvail[trueSucc]->table[condVN] = ConstantInt::getTrue();
1363 if (falseSucc->getSinglePredecessor())
1364 localAvail[falseSucc]->table[condVN] = ConstantInt::getFalse();
1365
1366 return false;
1367
Owen Anderson0c1e6342008-04-07 09:59:07 +00001368 // Allocations are always uniquely numbered, so we can save time and memory
Owen Anderson98f912b2009-04-01 23:53:49 +00001369 // by fast failing them.
1370 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001371 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson0c1e6342008-04-07 09:59:07 +00001372 return false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001373 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001374
Owen Anderson221a4362007-08-16 22:02:55 +00001375 // Collapse PHI nodes
Owen Andersonbc271a02007-08-14 18:33:27 +00001376 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001377 Value* constVal = CollapsePhi(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001378
1379 if (constVal) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001380 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1381 PI != PE; ++PI)
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001382 PI->second.erase(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001383
Owen Andersonf5023a72007-08-16 22:51:56 +00001384 p->replaceAllUsesWith(constVal);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001385 if (isa<PointerType>(constVal->getType()))
1386 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson164274e2008-12-23 00:49:51 +00001387 VN.erase(p);
1388
Owen Andersonf5023a72007-08-16 22:51:56 +00001389 toErase.push_back(p);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001390 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001391 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonbc271a02007-08-14 18:33:27 +00001392 }
Owen Anderson3ea90a72008-07-03 17:44:33 +00001393
1394 // If the number we were assigned was a brand new VN, then we don't
1395 // need to do a lookup to see if the number already exists
1396 // somewhere in the domtree: it can't!
1397 } else if (num == nextNum) {
1398 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1399
Owen Andersonbfe133e2008-12-15 02:03:00 +00001400 // Perform fast-path value-number based elimination of values inherited from
1401 // dominators.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001402 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson086b2c42007-12-08 01:37:09 +00001403 // Remove it!
Owen Anderson10ffa862007-07-31 23:27:13 +00001404 VN.erase(I);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001405 I->replaceAllUsesWith(repl);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001406 if (isa<PointerType>(repl->getType()))
1407 MD->invalidateCachedPointerInfo(repl);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001408 toErase.push_back(I);
1409 return true;
Owen Andersonbfe133e2008-12-15 02:03:00 +00001410
1411#if 0
1412 // Perform slow-pathvalue-number based elimination with phi construction.
1413 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1414 // Remove it!
1415 VN.erase(I);
1416 I->replaceAllUsesWith(repl);
1417 if (isa<PointerType>(repl->getType()))
1418 MD->invalidateCachedPointerInfo(repl);
1419 toErase.push_back(I);
1420 return true;
1421#endif
Owen Anderson3ea90a72008-07-03 17:44:33 +00001422 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001423 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001424 }
1425
1426 return false;
1427}
1428
Bill Wendling456e8852008-12-22 22:32:22 +00001429/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson676070d2007-08-14 18:04:11 +00001430bool GVN::runOnFunction(Function& F) {
Chris Lattner8541ede2008-12-01 00:40:32 +00001431 MD = &getAnalysis<MemoryDependenceAnalysis>();
1432 DT = &getAnalysis<DominatorTree>();
Owen Andersonf7928602008-05-12 20:15:55 +00001433 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner8541ede2008-12-01 00:40:32 +00001434 VN.setMemDep(MD);
1435 VN.setDomTree(DT);
Owen Anderson09b83ba2007-10-18 19:39:33 +00001436
Owen Anderson676070d2007-08-14 18:04:11 +00001437 bool changed = false;
1438 bool shouldContinue = true;
1439
Owen Andersonac310962008-07-16 17:52:31 +00001440 // Merge unconditional branches, allowing PRE to catch more
1441 // optimization opportunities.
1442 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1443 BasicBlock* BB = FI;
1444 ++FI;
Owen Andersonc0623812008-07-17 00:01:40 +00001445 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1446 if (removedBlock) NumGVNBlocks++;
1447
1448 changed |= removedBlock;
Owen Andersonac310962008-07-16 17:52:31 +00001449 }
1450
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001451 unsigned Iteration = 0;
1452
Owen Anderson676070d2007-08-14 18:04:11 +00001453 while (shouldContinue) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001454 DEBUG(cerr << "GVN iteration: " << Iteration << "\n");
Owen Anderson676070d2007-08-14 18:04:11 +00001455 shouldContinue = iterateOnFunction(F);
1456 changed |= shouldContinue;
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001457 ++Iteration;
Owen Anderson676070d2007-08-14 18:04:11 +00001458 }
1459
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001460 if (EnablePRE) {
Owen Anderson2fbfb702008-09-03 23:06:07 +00001461 bool PREChanged = true;
1462 while (PREChanged) {
1463 PREChanged = performPRE(F);
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001464 changed |= PREChanged;
Owen Anderson2fbfb702008-09-03 23:06:07 +00001465 }
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001466 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001467 // FIXME: Should perform GVN again after PRE does something. PRE can move
1468 // computations into blocks where they become fully redundant. Note that
1469 // we can't do this until PRE's critical edge splitting updates memdep.
1470 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopese3127f32008-10-10 16:25:50 +00001471
1472 cleanupGlobalSets();
1473
Owen Anderson676070d2007-08-14 18:04:11 +00001474 return changed;
1475}
1476
1477
Owen Andersonbfe133e2008-12-15 02:03:00 +00001478bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001479 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1480 // incrementing BI before processing an instruction).
Owen Andersonaccdca12008-06-12 19:25:32 +00001481 SmallVector<Instruction*, 8> toErase;
Owen Andersonaccdca12008-06-12 19:25:32 +00001482 bool changed_function = false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001483
Owen Andersonaccdca12008-06-12 19:25:32 +00001484 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1485 BI != BE;) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001486 changed_function |= processInstruction(BI, toErase);
Owen Andersonaccdca12008-06-12 19:25:32 +00001487 if (toErase.empty()) {
1488 ++BI;
1489 continue;
1490 }
1491
1492 // If we need some instructions deleted, do it now.
1493 NumGVNInstr += toErase.size();
1494
1495 // Avoid iterator invalidation.
1496 bool AtStart = BI == BB->begin();
1497 if (!AtStart)
1498 --BI;
1499
1500 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner8541ede2008-12-01 00:40:32 +00001501 E = toErase.end(); I != E; ++I) {
1502 DEBUG(cerr << "GVN removed: " << **I);
1503 MD->removeInstruction(*I);
Owen Andersonaccdca12008-06-12 19:25:32 +00001504 (*I)->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001505 DEBUG(verifyRemoved(*I));
Chris Lattner8541ede2008-12-01 00:40:32 +00001506 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001507 toErase.clear();
Owen Andersonaccdca12008-06-12 19:25:32 +00001508
1509 if (AtStart)
1510 BI = BB->begin();
1511 else
1512 ++BI;
Owen Andersonaccdca12008-06-12 19:25:32 +00001513 }
1514
Owen Andersonaccdca12008-06-12 19:25:32 +00001515 return changed_function;
1516}
1517
Owen Anderson6a903bc2008-06-18 21:41:49 +00001518/// performPRE - Perform a purely local form of PRE that looks for diamond
1519/// control flow patterns and attempts to perform simple PRE at the join point.
1520bool GVN::performPRE(Function& F) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001521 bool Changed = false;
Owen Andersonfdf9f162008-06-19 19:54:19 +00001522 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001523 DenseMap<BasicBlock*, Value*> predMap;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001524 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1525 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1526 BasicBlock* CurrentBlock = *DI;
1527
1528 // Nothing to PRE in the entry block.
1529 if (CurrentBlock == &F.getEntryBlock()) continue;
1530
1531 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1532 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001533 Instruction *CurInst = BI++;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001534
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001535 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
John Criswell073e4d12009-03-10 15:04:53 +00001536 isa<PHINode>(CurInst) || (CurInst->getType() == Type::VoidTy) ||
Duncan Sands1efabaa2009-05-06 06:49:50 +00001537 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell073e4d12009-03-10 15:04:53 +00001538 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001539 continue;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001540
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001541 uint32_t valno = VN.lookup(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001542
1543 // Look for the predecessors for PRE opportunities. We're
1544 // only trying to solve the basic diamond case, where
1545 // a value is computed in the successor and one predecessor,
1546 // but not the other. We also explicitly disallow cases
1547 // where the successor is its own predecessor, because they're
1548 // more complicated to get right.
1549 unsigned numWith = 0;
1550 unsigned numWithout = 0;
1551 BasicBlock* PREPred = 0;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001552 predMap.clear();
1553
Owen Anderson6a903bc2008-06-18 21:41:49 +00001554 for (pred_iterator PI = pred_begin(CurrentBlock),
1555 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1556 // We're not interested in PRE where the block is its
Owen Anderson1b3ea962008-06-20 01:15:47 +00001557 // own predecessor, on in blocks with predecessors
1558 // that are not reachable.
1559 if (*PI == CurrentBlock) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001560 numWithout = 2;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001561 break;
1562 } else if (!localAvail.count(*PI)) {
1563 numWithout = 2;
1564 break;
1565 }
1566
1567 DenseMap<uint32_t, Value*>::iterator predV =
1568 localAvail[*PI]->table.find(valno);
1569 if (predV == localAvail[*PI]->table.end()) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001570 PREPred = *PI;
1571 numWithout++;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001572 } else if (predV->second == CurInst) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001573 numWithout = 2;
1574 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001575 predMap[*PI] = predV->second;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001576 numWith++;
1577 }
1578 }
1579
1580 // Don't do PRE when it might increase code size, i.e. when
1581 // we would need to insert instructions in more than one pred.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001582 if (numWithout != 1 || numWith == 0)
Owen Anderson6a903bc2008-06-18 21:41:49 +00001583 continue;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001584
Owen Andersonfdf9f162008-06-19 19:54:19 +00001585 // We can't do PRE safely on a critical edge, so instead we schedule
1586 // the edge to be split and perform the PRE the next time we iterate
1587 // on the function.
1588 unsigned succNum = 0;
1589 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1590 i != e; ++i)
Owen Anderson2fbfb702008-09-03 23:06:07 +00001591 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonfdf9f162008-06-19 19:54:19 +00001592 succNum = i;
1593 break;
1594 }
1595
1596 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1597 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Andersonfdf9f162008-06-19 19:54:19 +00001598 continue;
1599 }
1600
Owen Anderson6a903bc2008-06-18 21:41:49 +00001601 // Instantiate the expression the in predecessor that lacked it.
1602 // Because we are going top-down through the block, all value numbers
1603 // will be available in the predecessor by the time we need them. Any
1604 // that weren't original present will have been instantiated earlier
1605 // in this loop.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001606 Instruction* PREInstr = CurInst->clone();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001607 bool success = true;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001608 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1609 Value *Op = PREInstr->getOperand(i);
1610 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1611 continue;
1612
1613 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1614 PREInstr->setOperand(i, V);
1615 } else {
1616 success = false;
1617 break;
Owen Anderson8e462e92008-07-11 20:05:13 +00001618 }
Owen Anderson6a903bc2008-06-18 21:41:49 +00001619 }
1620
1621 // Fail out if we encounter an operand that is not available in
1622 // the PRE predecessor. This is typically because of loads which
1623 // are not value numbered precisely.
1624 if (!success) {
1625 delete PREInstr;
Bill Wendling3c793442008-12-22 22:14:07 +00001626 DEBUG(verifyRemoved(PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001627 continue;
1628 }
1629
1630 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001631 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson1b3ea962008-06-20 01:15:47 +00001632 predMap[PREPred] = PREInstr;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001633 VN.add(PREInstr, valno);
1634 NumGVNPRE++;
1635
1636 // Update the availability map to include the new instruction.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001637 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001638
1639 // Create a PHI to make the value available in this block.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001640 PHINode* Phi = PHINode::Create(CurInst->getType(),
1641 CurInst->getName() + ".pre-phi",
Owen Anderson6a903bc2008-06-18 21:41:49 +00001642 CurrentBlock->begin());
1643 for (pred_iterator PI = pred_begin(CurrentBlock),
1644 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson1b3ea962008-06-20 01:15:47 +00001645 Phi->addIncoming(predMap[*PI], *PI);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001646
1647 VN.add(Phi, valno);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001648 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001649
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001650 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001651 if (isa<PointerType>(Phi->getType()))
1652 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001653 VN.erase(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001654
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001655 DEBUG(cerr << "GVN PRE removed: " << *CurInst);
1656 MD->removeInstruction(CurInst);
1657 CurInst->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001658 DEBUG(verifyRemoved(CurInst));
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001659 Changed = true;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001660 }
1661 }
1662
Owen Andersonfdf9f162008-06-19 19:54:19 +00001663 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001664 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonfdf9f162008-06-19 19:54:19 +00001665 SplitCriticalEdge(I->first, I->second, this);
1666
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001667 return Changed || toSplit.size();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001668}
1669
Bill Wendling456e8852008-12-22 22:32:22 +00001670/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson676070d2007-08-14 18:04:11 +00001671bool GVN::iterateOnFunction(Function &F) {
Nuno Lopese3127f32008-10-10 16:25:50 +00001672 cleanupGlobalSets();
Chris Lattnerbeb216d2008-03-21 21:33:23 +00001673
Owen Anderson98f912b2009-04-01 23:53:49 +00001674 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1675 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1676 if (DI->getIDom())
1677 localAvail[DI->getBlock()] =
1678 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1679 else
1680 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1681 }
1682
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001683 // Top-down walk of the dominator tree
Owen Anderson6a903bc2008-06-18 21:41:49 +00001684 bool changed = false;
Owen Anderson03aacba2008-12-15 03:52:17 +00001685#if 0
1686 // Needed for value numbering with phi construction to work.
Owen Andersonbfe133e2008-12-15 02:03:00 +00001687 ReversePostOrderTraversal<Function*> RPOT(&F);
1688 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1689 RE = RPOT.end(); RI != RE; ++RI)
1690 changed |= processBlock(*RI);
Owen Anderson03aacba2008-12-15 03:52:17 +00001691#else
1692 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1693 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1694 changed |= processBlock(DI->getBlock());
1695#endif
1696
Owen Andersonac310962008-07-16 17:52:31 +00001697 return changed;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001698}
Nuno Lopese3127f32008-10-10 16:25:50 +00001699
1700void GVN::cleanupGlobalSets() {
1701 VN.clear();
1702 phiMap.clear();
1703
1704 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1705 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1706 delete I->second;
1707 localAvail.clear();
1708}
Bill Wendling6b18a392008-12-22 21:36:08 +00001709
1710/// verifyRemoved - Verify that the specified instruction does not occur in our
1711/// internal data structures.
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001712void GVN::verifyRemoved(const Instruction *Inst) const {
1713 VN.verifyRemoved(Inst);
Bill Wendling3c793442008-12-22 22:14:07 +00001714
1715 // Walk through the PHI map to make sure the instruction isn't hiding in there
1716 // somewhere.
1717 for (PhiMapType::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001718 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1719 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling3c793442008-12-22 22:14:07 +00001720
1721 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001722 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1723 assert(*II != Inst && "Inst is still a value in PHI map!");
1724 }
1725 }
1726
1727 // Walk through the value number scope to make sure the instruction isn't
1728 // ferreted away in it.
1729 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1730 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1731 const ValueNumberScope *VNS = I->second;
1732
1733 while (VNS) {
1734 for (DenseMap<uint32_t, Value*>::iterator
1735 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1736 assert(II->second != Inst && "Inst still in value numbering scope!");
1737 }
1738
1739 VNS = VNS->parent;
Bill Wendling3c793442008-12-22 22:14:07 +00001740 }
1741 }
Bill Wendling6b18a392008-12-22 21:36:08 +00001742}