blob: e7be98506b99f53e9a2092487a39536db7400615 [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 Andersonb5618da2009-07-03 00:17:18 +000025#include "llvm/LLVMContext.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000026#include "llvm/Value.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000027#include "llvm/ADT/DenseMap.h"
28#include "llvm/ADT/DepthFirstIterator.h"
Owen Andersonbfe133e2008-12-15 02:03:00 +000029#include "llvm/ADT/PostOrderIterator.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000030#include "llvm/ADT/SmallPtrSet.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/ADT/Statistic.h"
Owen Anderson09b83ba2007-10-18 19:39:33 +000033#include "llvm/Analysis/Dominators.h"
34#include "llvm/Analysis/AliasAnalysis.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000035#include "llvm/Analysis/MemoryDependenceAnalysis.h"
36#include "llvm/Support/CFG.h"
Owen Andersone780d662008-06-19 19:57:25 +000037#include "llvm/Support/CommandLine.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000038#include "llvm/Support/Compiler.h"
Chris Lattnerd528b212008-03-29 04:36:18 +000039#include "llvm/Support/Debug.h"
Torok Edwin56d06592009-07-11 20:10:48 +000040#include "llvm/Support/ErrorHandling.h"
Owen Andersonfdf9f162008-06-19 19:54:19 +000041#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesen81b64632009-06-17 20:48:23 +000042#include "llvm/Transforms/Utils/Local.h"
Duncan Sands26ff6f92008-10-08 07:23:46 +000043#include <cstdio>
Owen Andersonab6ec2e2007-07-24 17:55:58 +000044using namespace llvm;
45
Bill Wendling3c793442008-12-22 22:14:07 +000046STATISTIC(NumGVNInstr, "Number of instructions deleted");
47STATISTIC(NumGVNLoad, "Number of loads deleted");
48STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
Owen Anderson53d546e2008-07-15 16:28:06 +000049STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3c793442008-12-22 22:14:07 +000050STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner168be762008-03-22 04:13:49 +000051
Evan Cheng9598f932008-06-20 01:01:07 +000052static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonaddbe3e2008-07-17 19:41:00 +000053 cl::init(true), cl::Hidden);
Dan Gohmana8f8a852009-06-15 18:30:15 +000054static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersone780d662008-06-19 19:57:25 +000055
Owen Andersonab6ec2e2007-07-24 17:55:58 +000056//===----------------------------------------------------------------------===//
57// ValueTable Class
58//===----------------------------------------------------------------------===//
59
60/// This class holds the mapping between values and value numbers. It is used
61/// as an efficient mechanism to determine the expression-wise equivalence of
62/// two values.
63namespace {
64 struct VISIBILITY_HIDDEN Expression {
Dan Gohmana5b96452009-06-04 22:49:04 +000065 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
66 UDIV, SDIV, FDIV, UREM, SREM,
Owen Andersonab6ec2e2007-07-24 17:55:58 +000067 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
68 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
69 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
70 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
71 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
72 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
73 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
74 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson69057b82008-05-13 08:17:22 +000075 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Anderson45d37012008-06-19 17:25:39 +000076 EMPTY, TOMBSTONE };
Owen Andersonab6ec2e2007-07-24 17:55:58 +000077
78 ExpressionOpcode opcode;
79 const Type* type;
80 uint32_t firstVN;
81 uint32_t secondVN;
82 uint32_t thirdVN;
83 SmallVector<uint32_t, 4> varargs;
Owen Anderson09b83ba2007-10-18 19:39:33 +000084 Value* function;
Owen Andersonab6ec2e2007-07-24 17:55:58 +000085
86 Expression() { }
87 Expression(ExpressionOpcode o) : opcode(o) { }
88
89 bool operator==(const Expression &other) const {
90 if (opcode != other.opcode)
91 return false;
92 else if (opcode == EMPTY || opcode == TOMBSTONE)
93 return true;
94 else if (type != other.type)
95 return false;
Owen Anderson09b83ba2007-10-18 19:39:33 +000096 else if (function != other.function)
97 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +000098 else if (firstVN != other.firstVN)
99 return false;
100 else if (secondVN != other.secondVN)
101 return false;
102 else if (thirdVN != other.thirdVN)
103 return false;
104 else {
105 if (varargs.size() != other.varargs.size())
106 return false;
107
108 for (size_t i = 0; i < varargs.size(); ++i)
109 if (varargs[i] != other.varargs[i])
110 return false;
111
112 return true;
113 }
114 }
115
116 bool operator!=(const Expression &other) const {
Bill Wendling86f01cb2008-12-22 22:16:31 +0000117 return !(*this == other);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000118 }
119 };
120
121 class VISIBILITY_HIDDEN ValueTable {
122 private:
123 DenseMap<Value*, uint32_t> valueNumbering;
124 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersonf7928602008-05-12 20:15:55 +0000125 AliasAnalysis* AA;
126 MemoryDependenceAnalysis* MD;
127 DominatorTree* DT;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000128
129 uint32_t nextValueNumber;
130
131 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
132 Expression::ExpressionOpcode getOpcode(CmpInst* C);
133 Expression::ExpressionOpcode getOpcode(CastInst* C);
134 Expression create_expression(BinaryOperator* BO);
135 Expression create_expression(CmpInst* C);
136 Expression create_expression(ShuffleVectorInst* V);
137 Expression create_expression(ExtractElementInst* C);
138 Expression create_expression(InsertElementInst* V);
139 Expression create_expression(SelectInst* V);
140 Expression create_expression(CastInst* C);
141 Expression create_expression(GetElementPtrInst* G);
Owen Anderson09b83ba2007-10-18 19:39:33 +0000142 Expression create_expression(CallInst* C);
Owen Anderson69057b82008-05-13 08:17:22 +0000143 Expression create_expression(Constant* C);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000144 public:
Dan Gohmanc4971722009-04-01 16:37:47 +0000145 ValueTable() : nextValueNumber(1) { }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000146 uint32_t lookup_or_add(Value* V);
147 uint32_t lookup(Value* V) const;
148 void add(Value* V, uint32_t num);
149 void clear();
150 void erase(Value* v);
151 unsigned size();
Owen Andersonf7928602008-05-12 20:15:55 +0000152 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner8541ede2008-12-01 00:40:32 +0000153 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonf7928602008-05-12 20:15:55 +0000154 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
155 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson3ea90a72008-07-03 17:44:33 +0000156 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling6b18a392008-12-22 21:36:08 +0000157 void verifyRemoved(const Value *) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000158 };
159}
160
161namespace llvm {
Chris Lattner0625bd62007-09-17 18:34:04 +0000162template <> struct DenseMapInfo<Expression> {
Owen Anderson9699a6e2007-08-02 18:16:06 +0000163 static inline Expression getEmptyKey() {
164 return Expression(Expression::EMPTY);
165 }
166
167 static inline Expression getTombstoneKey() {
168 return Expression(Expression::TOMBSTONE);
169 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000170
171 static unsigned getHashValue(const Expression e) {
172 unsigned hash = e.opcode;
173
174 hash = e.firstVN + hash * 37;
175 hash = e.secondVN + hash * 37;
176 hash = e.thirdVN + hash * 37;
177
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000178 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
179 (unsigned)((uintptr_t)e.type >> 9)) +
180 hash * 37;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000181
Owen Anderson9699a6e2007-08-02 18:16:06 +0000182 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
183 E = e.varargs.end(); I != E; ++I)
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000184 hash = *I + hash * 37;
185
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000186 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
187 (unsigned)((uintptr_t)e.function >> 9)) +
188 hash * 37;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000189
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000190 return hash;
191 }
Chris Lattner0625bd62007-09-17 18:34:04 +0000192 static bool isEqual(const Expression &LHS, const Expression &RHS) {
193 return LHS == RHS;
194 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000195 static bool isPod() { return true; }
196};
197}
198
199//===----------------------------------------------------------------------===//
200// ValueTable Internal Functions
201//===----------------------------------------------------------------------===//
Chris Lattner2876a642008-03-21 21:14:38 +0000202Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000203 switch(BO->getOpcode()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000204 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000205 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner2876a642008-03-21 21:14:38 +0000206 case Instruction::Add: return Expression::ADD;
Dan Gohmana5b96452009-06-04 22:49:04 +0000207 case Instruction::FAdd: return Expression::FADD;
Chris Lattner2876a642008-03-21 21:14:38 +0000208 case Instruction::Sub: return Expression::SUB;
Dan Gohmana5b96452009-06-04 22:49:04 +0000209 case Instruction::FSub: return Expression::FSUB;
Chris Lattner2876a642008-03-21 21:14:38 +0000210 case Instruction::Mul: return Expression::MUL;
Dan Gohmana5b96452009-06-04 22:49:04 +0000211 case Instruction::FMul: return Expression::FMUL;
Chris Lattner2876a642008-03-21 21:14:38 +0000212 case Instruction::UDiv: return Expression::UDIV;
213 case Instruction::SDiv: return Expression::SDIV;
214 case Instruction::FDiv: return Expression::FDIV;
215 case Instruction::URem: return Expression::UREM;
216 case Instruction::SRem: return Expression::SREM;
217 case Instruction::FRem: return Expression::FREM;
218 case Instruction::Shl: return Expression::SHL;
219 case Instruction::LShr: return Expression::LSHR;
220 case Instruction::AShr: return Expression::ASHR;
221 case Instruction::And: return Expression::AND;
222 case Instruction::Or: return Expression::OR;
223 case Instruction::Xor: return Expression::XOR;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000224 }
225}
226
227Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000228 if (isa<ICmpInst>(C)) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000229 switch (C->getPredicate()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000230 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000231 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner2876a642008-03-21 21:14:38 +0000232 case ICmpInst::ICMP_EQ: return Expression::ICMPEQ;
233 case ICmpInst::ICMP_NE: return Expression::ICMPNE;
234 case ICmpInst::ICMP_UGT: return Expression::ICMPUGT;
235 case ICmpInst::ICMP_UGE: return Expression::ICMPUGE;
236 case ICmpInst::ICMP_ULT: return Expression::ICMPULT;
237 case ICmpInst::ICMP_ULE: return Expression::ICMPULE;
238 case ICmpInst::ICMP_SGT: return Expression::ICMPSGT;
239 case ICmpInst::ICMP_SGE: return Expression::ICMPSGE;
240 case ICmpInst::ICMP_SLT: return Expression::ICMPSLT;
241 case ICmpInst::ICMP_SLE: return Expression::ICMPSLE;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000242 }
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000243 } else {
244 switch (C->getPredicate()) {
245 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000246 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000247 case FCmpInst::FCMP_OEQ: return Expression::FCMPOEQ;
248 case FCmpInst::FCMP_OGT: return Expression::FCMPOGT;
249 case FCmpInst::FCMP_OGE: return Expression::FCMPOGE;
250 case FCmpInst::FCMP_OLT: return Expression::FCMPOLT;
251 case FCmpInst::FCMP_OLE: return Expression::FCMPOLE;
252 case FCmpInst::FCMP_ONE: return Expression::FCMPONE;
253 case FCmpInst::FCMP_ORD: return Expression::FCMPORD;
254 case FCmpInst::FCMP_UNO: return Expression::FCMPUNO;
255 case FCmpInst::FCMP_UEQ: return Expression::FCMPUEQ;
256 case FCmpInst::FCMP_UGT: return Expression::FCMPUGT;
257 case FCmpInst::FCMP_UGE: return Expression::FCMPUGE;
258 case FCmpInst::FCMP_ULT: return Expression::FCMPULT;
259 case FCmpInst::FCMP_ULE: return Expression::FCMPULE;
260 case FCmpInst::FCMP_UNE: return Expression::FCMPUNE;
261 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000262 }
263}
264
Chris Lattner2876a642008-03-21 21:14:38 +0000265Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000266 switch(C->getOpcode()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000267 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000268 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner2876a642008-03-21 21:14:38 +0000269 case Instruction::Trunc: return Expression::TRUNC;
270 case Instruction::ZExt: return Expression::ZEXT;
271 case Instruction::SExt: return Expression::SEXT;
272 case Instruction::FPToUI: return Expression::FPTOUI;
273 case Instruction::FPToSI: return Expression::FPTOSI;
274 case Instruction::UIToFP: return Expression::UITOFP;
275 case Instruction::SIToFP: return Expression::SITOFP;
276 case Instruction::FPTrunc: return Expression::FPTRUNC;
277 case Instruction::FPExt: return Expression::FPEXT;
278 case Instruction::PtrToInt: return Expression::PTRTOINT;
279 case Instruction::IntToPtr: return Expression::INTTOPTR;
280 case Instruction::BitCast: return Expression::BITCAST;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000281 }
282}
283
Owen Anderson09b83ba2007-10-18 19:39:33 +0000284Expression ValueTable::create_expression(CallInst* C) {
285 Expression e;
286
287 e.type = C->getType();
288 e.firstVN = 0;
289 e.secondVN = 0;
290 e.thirdVN = 0;
291 e.function = C->getCalledFunction();
292 e.opcode = Expression::CALL;
293
294 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
295 I != E; ++I)
Owen Anderson1e73f292008-04-11 05:11:49 +0000296 e.varargs.push_back(lookup_or_add(*I));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000297
298 return e;
299}
300
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000301Expression ValueTable::create_expression(BinaryOperator* BO) {
302 Expression e;
303
Owen Anderson1e73f292008-04-11 05:11:49 +0000304 e.firstVN = lookup_or_add(BO->getOperand(0));
305 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000306 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000307 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000308 e.type = BO->getType();
309 e.opcode = getOpcode(BO);
310
311 return e;
312}
313
314Expression ValueTable::create_expression(CmpInst* C) {
315 Expression e;
316
Owen Anderson1e73f292008-04-11 05:11:49 +0000317 e.firstVN = lookup_or_add(C->getOperand(0));
318 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000319 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000320 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000321 e.type = C->getType();
322 e.opcode = getOpcode(C);
323
324 return e;
325}
326
327Expression ValueTable::create_expression(CastInst* C) {
328 Expression e;
329
Owen Anderson1e73f292008-04-11 05:11:49 +0000330 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000331 e.secondVN = 0;
332 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000333 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000334 e.type = C->getType();
335 e.opcode = getOpcode(C);
336
337 return e;
338}
339
340Expression ValueTable::create_expression(ShuffleVectorInst* S) {
341 Expression e;
342
Owen Anderson1e73f292008-04-11 05:11:49 +0000343 e.firstVN = lookup_or_add(S->getOperand(0));
344 e.secondVN = lookup_or_add(S->getOperand(1));
345 e.thirdVN = lookup_or_add(S->getOperand(2));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000346 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000347 e.type = S->getType();
348 e.opcode = Expression::SHUFFLE;
349
350 return e;
351}
352
353Expression ValueTable::create_expression(ExtractElementInst* E) {
354 Expression e;
355
Owen Anderson1e73f292008-04-11 05:11:49 +0000356 e.firstVN = lookup_or_add(E->getOperand(0));
357 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000358 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000359 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000360 e.type = E->getType();
361 e.opcode = Expression::EXTRACT;
362
363 return e;
364}
365
366Expression ValueTable::create_expression(InsertElementInst* I) {
367 Expression e;
368
Owen Anderson1e73f292008-04-11 05:11:49 +0000369 e.firstVN = lookup_or_add(I->getOperand(0));
370 e.secondVN = lookup_or_add(I->getOperand(1));
371 e.thirdVN = lookup_or_add(I->getOperand(2));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000372 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000373 e.type = I->getType();
374 e.opcode = Expression::INSERT;
375
376 return e;
377}
378
379Expression ValueTable::create_expression(SelectInst* I) {
380 Expression e;
381
Owen Anderson1e73f292008-04-11 05:11:49 +0000382 e.firstVN = lookup_or_add(I->getCondition());
383 e.secondVN = lookup_or_add(I->getTrueValue());
384 e.thirdVN = lookup_or_add(I->getFalseValue());
Owen Anderson09b83ba2007-10-18 19:39:33 +0000385 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000386 e.type = I->getType();
387 e.opcode = Expression::SELECT;
388
389 return e;
390}
391
392Expression ValueTable::create_expression(GetElementPtrInst* G) {
393 Expression e;
Owen Anderson69057b82008-05-13 08:17:22 +0000394
Owen Anderson1e73f292008-04-11 05:11:49 +0000395 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000396 e.secondVN = 0;
397 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000398 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000399 e.type = G->getType();
400 e.opcode = Expression::GEP;
401
402 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
403 I != E; ++I)
Owen Anderson1e73f292008-04-11 05:11:49 +0000404 e.varargs.push_back(lookup_or_add(*I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000405
406 return e;
407}
408
409//===----------------------------------------------------------------------===//
410// ValueTable External Functions
411//===----------------------------------------------------------------------===//
412
Owen Anderson6a903bc2008-06-18 21:41:49 +0000413/// add - Insert a value into the table with a specified value number.
414void ValueTable::add(Value* V, uint32_t num) {
415 valueNumbering.insert(std::make_pair(V, num));
416}
417
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000418/// lookup_or_add - Returns the value number for the specified value, assigning
419/// it a new number if it did not have one before.
420uint32_t ValueTable::lookup_or_add(Value* V) {
421 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
422 if (VI != valueNumbering.end())
423 return VI->second;
424
Owen Anderson09b83ba2007-10-18 19:39:33 +0000425 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson1e73f292008-04-11 05:11:49 +0000426 if (AA->doesNotAccessMemory(C)) {
Owen Anderson09b83ba2007-10-18 19:39:33 +0000427 Expression e = create_expression(C);
428
429 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
430 if (EI != expressionNumbering.end()) {
431 valueNumbering.insert(std::make_pair(V, EI->second));
432 return EI->second;
433 } else {
434 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
435 valueNumbering.insert(std::make_pair(V, nextValueNumber));
436
437 return nextValueNumber++;
438 }
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000439 } else if (AA->onlyReadsMemory(C)) {
440 Expression e = create_expression(C);
441
Owen Anderson69057b82008-05-13 08:17:22 +0000442 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000443 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
444 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson69057b82008-05-13 08:17:22 +0000445 return nextValueNumber++;
446 }
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000447
Chris Lattner7f9c8a02008-11-29 02:29:27 +0000448 MemDepResult local_dep = MD->getDependency(C);
Owen Anderson17816b32008-05-13 23:18:30 +0000449
Chris Lattner0e3d6332008-12-05 21:04:20 +0000450 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000451 valueNumbering.insert(std::make_pair(V, nextValueNumber));
452 return nextValueNumber++;
Chris Lattner80c7d812008-11-30 23:39:23 +0000453 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000454
455 if (local_dep.isDef()) {
456 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
457
458 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000459 valueNumbering.insert(std::make_pair(V, nextValueNumber));
460 return nextValueNumber++;
461 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000462
Chris Lattner80c7d812008-11-30 23:39:23 +0000463 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
464 uint32_t c_vn = lookup_or_add(C->getOperand(i));
465 uint32_t cd_vn = lookup_or_add(local_cdep->getOperand(i));
466 if (c_vn != cd_vn) {
467 valueNumbering.insert(std::make_pair(V, nextValueNumber));
468 return nextValueNumber++;
469 }
470 }
471
472 uint32_t v = lookup_or_add(local_cdep);
473 valueNumbering.insert(std::make_pair(V, v));
474 return v;
Owen Anderson17816b32008-05-13 23:18:30 +0000475 }
Chris Lattner7e61daf2008-12-01 01:15:42 +0000476
Chris Lattner0e3d6332008-12-05 21:04:20 +0000477 // Non-local case.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000478 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner254314e2008-12-09 19:38:05 +0000479 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattner0e3d6332008-12-05 21:04:20 +0000480 // FIXME: call/call dependencies for readonly calls should return def, not
481 // clobber! Move the checking logic to MemDep!
Owen Anderson8c2391d2008-05-13 13:41:23 +0000482 CallInst* cdep = 0;
Owen Anderson69057b82008-05-13 08:17:22 +0000483
Chris Lattner80c7d812008-11-30 23:39:23 +0000484 // Check to see if we have a single dominating call instruction that is
485 // identical to C.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000486 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
487 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattner80c7d812008-11-30 23:39:23 +0000488 // Ignore non-local dependencies.
489 if (I->second.isNonLocal())
490 continue;
Owen Anderson69057b82008-05-13 08:17:22 +0000491
Chris Lattner80c7d812008-11-30 23:39:23 +0000492 // We don't handle non-depedencies. If we already have a call, reject
493 // instruction dependencies.
Chris Lattner0e3d6332008-12-05 21:04:20 +0000494 if (I->second.isClobber() || cdep != 0) {
Chris Lattner80c7d812008-11-30 23:39:23 +0000495 cdep = 0;
496 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000497 }
Chris Lattner80c7d812008-11-30 23:39:23 +0000498
499 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I->second.getInst());
500 // FIXME: All duplicated with non-local case.
501 if (NonLocalDepCall && DT->properlyDominates(I->first, C->getParent())){
502 cdep = NonLocalDepCall;
503 continue;
504 }
505
506 cdep = 0;
507 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000508 }
509
Owen Anderson8c2391d2008-05-13 13:41:23 +0000510 if (!cdep) {
Owen Anderson69057b82008-05-13 08:17:22 +0000511 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000512 return nextValueNumber++;
513 }
514
Chris Lattner0e3d6332008-12-05 21:04:20 +0000515 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson69057b82008-05-13 08:17:22 +0000516 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000517 return nextValueNumber++;
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000518 }
Chris Lattner80c7d812008-11-30 23:39:23 +0000519 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
520 uint32_t c_vn = lookup_or_add(C->getOperand(i));
521 uint32_t cd_vn = lookup_or_add(cdep->getOperand(i));
522 if (c_vn != cd_vn) {
523 valueNumbering.insert(std::make_pair(V, nextValueNumber));
524 return nextValueNumber++;
525 }
526 }
527
528 uint32_t v = lookup_or_add(cdep);
529 valueNumbering.insert(std::make_pair(V, v));
530 return v;
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000531
Owen Anderson09b83ba2007-10-18 19:39:33 +0000532 } else {
533 valueNumbering.insert(std::make_pair(V, nextValueNumber));
534 return nextValueNumber++;
535 }
536 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000537 Expression e = create_expression(BO);
538
539 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
540 if (EI != expressionNumbering.end()) {
541 valueNumbering.insert(std::make_pair(V, EI->second));
542 return EI->second;
543 } else {
544 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
545 valueNumbering.insert(std::make_pair(V, nextValueNumber));
546
547 return nextValueNumber++;
548 }
549 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
550 Expression e = create_expression(C);
551
552 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
553 if (EI != expressionNumbering.end()) {
554 valueNumbering.insert(std::make_pair(V, EI->second));
555 return EI->second;
556 } else {
557 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
558 valueNumbering.insert(std::make_pair(V, nextValueNumber));
559
560 return nextValueNumber++;
561 }
562 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
563 Expression e = create_expression(U);
564
565 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
566 if (EI != expressionNumbering.end()) {
567 valueNumbering.insert(std::make_pair(V, EI->second));
568 return EI->second;
569 } else {
570 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
571 valueNumbering.insert(std::make_pair(V, nextValueNumber));
572
573 return nextValueNumber++;
574 }
575 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
576 Expression e = create_expression(U);
577
578 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
579 if (EI != expressionNumbering.end()) {
580 valueNumbering.insert(std::make_pair(V, EI->second));
581 return EI->second;
582 } else {
583 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
584 valueNumbering.insert(std::make_pair(V, nextValueNumber));
585
586 return nextValueNumber++;
587 }
588 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
589 Expression e = create_expression(U);
590
591 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
592 if (EI != expressionNumbering.end()) {
593 valueNumbering.insert(std::make_pair(V, EI->second));
594 return EI->second;
595 } else {
596 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
597 valueNumbering.insert(std::make_pair(V, nextValueNumber));
598
599 return nextValueNumber++;
600 }
601 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
602 Expression e = create_expression(U);
603
604 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
605 if (EI != expressionNumbering.end()) {
606 valueNumbering.insert(std::make_pair(V, EI->second));
607 return EI->second;
608 } else {
609 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
610 valueNumbering.insert(std::make_pair(V, nextValueNumber));
611
612 return nextValueNumber++;
613 }
614 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
615 Expression e = create_expression(U);
616
617 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
618 if (EI != expressionNumbering.end()) {
619 valueNumbering.insert(std::make_pair(V, EI->second));
620 return EI->second;
621 } else {
622 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
623 valueNumbering.insert(std::make_pair(V, nextValueNumber));
624
625 return nextValueNumber++;
626 }
627 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
628 Expression e = create_expression(U);
629
630 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
631 if (EI != expressionNumbering.end()) {
632 valueNumbering.insert(std::make_pair(V, EI->second));
633 return EI->second;
634 } else {
635 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
636 valueNumbering.insert(std::make_pair(V, nextValueNumber));
637
638 return nextValueNumber++;
639 }
640 } else {
641 valueNumbering.insert(std::make_pair(V, nextValueNumber));
642 return nextValueNumber++;
643 }
644}
645
646/// lookup - Returns the value number of the specified value. Fails if
647/// the value has not yet been numbered.
648uint32_t ValueTable::lookup(Value* V) const {
649 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Chris Lattner2876a642008-03-21 21:14:38 +0000650 assert(VI != valueNumbering.end() && "Value not numbered?");
651 return VI->second;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000652}
653
654/// clear - Remove all entries from the ValueTable
655void ValueTable::clear() {
656 valueNumbering.clear();
657 expressionNumbering.clear();
658 nextValueNumber = 1;
659}
660
Owen Anderson10ffa862007-07-31 23:27:13 +0000661/// erase - Remove a value from the value numbering
662void ValueTable::erase(Value* V) {
663 valueNumbering.erase(V);
664}
665
Bill Wendling6b18a392008-12-22 21:36:08 +0000666/// verifyRemoved - Verify that the value is removed from all internal data
667/// structures.
668void ValueTable::verifyRemoved(const Value *V) const {
669 for (DenseMap<Value*, uint32_t>::iterator
670 I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
671 assert(I->first != V && "Inst still occurs in value numbering map!");
672 }
673}
674
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000675//===----------------------------------------------------------------------===//
Bill Wendling456e8852008-12-22 22:32:22 +0000676// GVN Pass
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000677//===----------------------------------------------------------------------===//
678
679namespace {
Owen Anderson1b3ea962008-06-20 01:15:47 +0000680 struct VISIBILITY_HIDDEN ValueNumberScope {
681 ValueNumberScope* parent;
682 DenseMap<uint32_t, Value*> table;
683
684 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
685 };
686}
687
688namespace {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000689
690 class VISIBILITY_HIDDEN GVN : public FunctionPass {
691 bool runOnFunction(Function &F);
692 public:
693 static char ID; // Pass identification, replacement for typeid
Dan Gohmana79db302008-09-04 17:05:41 +0000694 GVN() : FunctionPass(&ID) { }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000695
696 private:
Chris Lattner8541ede2008-12-01 00:40:32 +0000697 MemoryDependenceAnalysis *MD;
698 DominatorTree *DT;
699
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000700 ValueTable VN;
Owen Anderson1b3ea962008-06-20 01:15:47 +0000701 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000702
Owen Anderson0cc1a762007-08-07 23:12:31 +0000703 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
704 PhiMapType phiMap;
705
706
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000707 // This transformation requires dominator postdominator info
708 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000709 AU.addRequired<DominatorTree>();
710 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000711 AU.addRequired<AliasAnalysis>();
Owen Anderson54e02192008-06-23 17:49:45 +0000712
713 AU.addPreserved<DominatorTree>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000714 AU.addPreserved<AliasAnalysis>();
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000715 }
716
717 // Helper fuctions
718 // FIXME: eliminate or document these better
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000719 bool processLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000720 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000721 bool processInstruction(Instruction* I,
Chris Lattner804209d2008-03-21 22:01:16 +0000722 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson9699a6e2007-08-02 18:16:06 +0000723 bool processNonLocalLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000724 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000725 bool processBlock(BasicBlock* BB);
Owen Andersone34c2392008-12-14 19:10:35 +0000726 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Anderson0ac1fc82007-08-02 17:56:05 +0000727 DenseMap<BasicBlock*, Value*> &Phis,
728 bool top_level = false);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000729 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson676070d2007-08-14 18:04:11 +0000730 bool iterateOnFunction(Function &F);
Owen Andersonf5023a72007-08-16 22:51:56 +0000731 Value* CollapsePhi(PHINode* p);
Owen Anderson4cd516b2007-09-16 08:04:16 +0000732 bool isSafeReplacement(PHINode* p, Instruction* inst);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000733 bool performPRE(Function& F);
Owen Anderson1b3ea962008-06-20 01:15:47 +0000734 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Anderson53d546e2008-07-15 16:28:06 +0000735 bool mergeBlockIntoPredecessor(BasicBlock* BB);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000736 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopese3127f32008-10-10 16:25:50 +0000737 void cleanupGlobalSets();
Bill Wendling6b18a392008-12-22 21:36:08 +0000738 void verifyRemoved(const Instruction *I) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000739 };
740
741 char GVN::ID = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000742}
743
744// createGVNPass - The public interface to this file...
745FunctionPass *llvm::createGVNPass() { return new GVN(); }
746
747static RegisterPass<GVN> X("gvn",
748 "Global Value Numbering");
749
Owen Anderson6a903bc2008-06-18 21:41:49 +0000750void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5e5599b2007-07-25 19:57:03 +0000751 printf("{\n");
Owen Anderson6a903bc2008-06-18 21:41:49 +0000752 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5e5599b2007-07-25 19:57:03 +0000753 E = d.end(); I != E; ++I) {
Owen Anderson6a903bc2008-06-18 21:41:49 +0000754 printf("%d\n", I->first);
Owen Anderson5e5599b2007-07-25 19:57:03 +0000755 I->second->dump();
756 }
757 printf("}\n");
758}
759
Owen Andersonf5023a72007-08-16 22:51:56 +0000760Value* GVN::CollapsePhi(PHINode* p) {
Owen Andersonf5023a72007-08-16 22:51:56 +0000761 Value* constVal = p->hasConstantValue();
Chris Lattner2876a642008-03-21 21:14:38 +0000762 if (!constVal) return 0;
Owen Andersonf5023a72007-08-16 22:51:56 +0000763
Chris Lattner2876a642008-03-21 21:14:38 +0000764 Instruction* inst = dyn_cast<Instruction>(constVal);
765 if (!inst)
766 return constVal;
767
Chris Lattner8541ede2008-12-01 00:40:32 +0000768 if (DT->dominates(inst, p))
Chris Lattner2876a642008-03-21 21:14:38 +0000769 if (isSafeReplacement(p, inst))
770 return inst;
Owen Andersonf5023a72007-08-16 22:51:56 +0000771 return 0;
772}
Owen Anderson5e5599b2007-07-25 19:57:03 +0000773
Owen Anderson4cd516b2007-09-16 08:04:16 +0000774bool GVN::isSafeReplacement(PHINode* p, Instruction* inst) {
775 if (!isa<PHINode>(inst))
776 return true;
777
778 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
779 UI != E; ++UI)
780 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
781 if (use_phi->getParent() == inst->getParent())
782 return false;
783
784 return true;
785}
786
Owen Andersondbf23cc2007-07-26 18:26:51 +0000787/// GetValueForBlock - Get the value to use within the specified basic block.
788/// available values are in Phis.
Owen Andersone34c2392008-12-14 19:10:35 +0000789Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner2876a642008-03-21 21:14:38 +0000790 DenseMap<BasicBlock*, Value*> &Phis,
791 bool top_level) {
Owen Andersondbf23cc2007-07-26 18:26:51 +0000792
793 // If we have already computed this value, return the previously computed val.
Owen Anderson2d19aae2007-08-03 19:59:35 +0000794 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
795 if (V != Phis.end() && !top_level) return V->second;
Owen Andersondbf23cc2007-07-26 18:26:51 +0000796
Owen Anderson6acc7822008-07-02 18:15:31 +0000797 // If the block is unreachable, just return undef, since this path
798 // can't actually occur at runtime.
Chris Lattner8541ede2008-12-01 00:40:32 +0000799 if (!DT->isReachableFromEntry(BB))
Owen Andersonb5618da2009-07-03 00:17:18 +0000800 return Phis[BB] = Context->getUndef(orig->getType());
Owen Andersonb22a6402008-07-02 17:20:16 +0000801
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000802 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
803 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000804 Phis[BB] = ret;
805 return ret;
Owen Anderson774761c2007-08-03 11:03:26 +0000806 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000807
808 // Get the number of predecessors of this block so we can reserve space later.
809 // If there is already a PHI in it, use the #preds from it, otherwise count.
810 // Getting it from the PHI is constant time.
811 unsigned NumPreds;
812 if (PHINode *ExistingPN = dyn_cast<PHINode>(BB->begin()))
813 NumPreds = ExistingPN->getNumIncomingValues();
814 else
815 NumPreds = std::distance(pred_begin(BB), pred_end(BB));
Chris Lattner2876a642008-03-21 21:14:38 +0000816
Owen Andersondbf23cc2007-07-26 18:26:51 +0000817 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
818 // now, then get values to fill in the incoming values for the PHI.
Gabor Greife9ecc682008-04-06 20:25:17 +0000819 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
820 BB->begin());
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000821 PN->reserveOperandSpace(NumPreds);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000822
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000823 Phis.insert(std::make_pair(BB, PN));
Owen Andersond66e2852007-07-30 16:57:08 +0000824
Owen Andersondbf23cc2007-07-26 18:26:51 +0000825 // Fill in the incoming values for the block.
Owen Andersond58fa6b02007-07-31 17:43:14 +0000826 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
827 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Andersond58fa6b02007-07-31 17:43:14 +0000828 PN->addIncoming(val, *PI);
829 }
Chris Lattner2876a642008-03-21 21:14:38 +0000830
Chris Lattner8541ede2008-12-01 00:40:32 +0000831 VN.getAliasAnalysis()->copyValue(orig, PN);
Owen Andersond58fa6b02007-07-31 17:43:14 +0000832
Owen Anderson221a4362007-08-16 22:02:55 +0000833 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersonf5023a72007-08-16 22:51:56 +0000834 Value* v = CollapsePhi(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000835 if (!v) {
836 // Cache our phi construction results
Owen Andersone34c2392008-12-14 19:10:35 +0000837 if (LoadInst* L = dyn_cast<LoadInst>(orig))
838 phiMap[L->getPointerOperand()].insert(PN);
839 else
840 phiMap[orig].insert(PN);
841
Chris Lattner2876a642008-03-21 21:14:38 +0000842 return PN;
Owen Andersond58fa6b02007-07-31 17:43:14 +0000843 }
Owen Andersonf7928602008-05-12 20:15:55 +0000844
Chris Lattner2876a642008-03-21 21:14:38 +0000845 PN->replaceAllUsesWith(v);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +0000846 if (isa<PointerType>(v->getType()))
847 MD->invalidateCachedPointerInfo(v);
Chris Lattner2876a642008-03-21 21:14:38 +0000848
849 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
850 E = Phis.end(); I != E; ++I)
851 if (I->second == PN)
852 I->second = v;
853
Chris Lattner8541ede2008-12-01 00:40:32 +0000854 DEBUG(cerr << "GVN removed: " << *PN);
855 MD->removeInstruction(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000856 PN->eraseFromParent();
Bill Wendling6b18a392008-12-22 21:36:08 +0000857 DEBUG(verifyRemoved(PN));
Chris Lattner2876a642008-03-21 21:14:38 +0000858
859 Phis[BB] = v;
860 return v;
Owen Anderson5e5599b2007-07-25 19:57:03 +0000861}
862
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000863/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
864/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000865/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
866/// map is actually a tri-state map with the following values:
867/// 0) we know the block *is not* fully available.
868/// 1) we know the block *is* fully available.
869/// 2) we do not know whether the block is fully available or not, but we are
870/// currently speculating that it will be.
871/// 3) we are speculating for this block and have used that to speculate for
872/// other blocks.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000873static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000874 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000875 // Optimistically assume that the block is fully available and check to see
876 // if we already know about this block in one lookup.
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000877 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
878 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000879
880 // If the entry already existed for this block, return the precomputed value.
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000881 if (!IV.second) {
882 // If this is a speculative "available" value, mark it as being used for
883 // speculation of other blocks.
884 if (IV.first->second == 2)
885 IV.first->second = 3;
886 return IV.first->second != 0;
887 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000888
889 // Otherwise, see if it is fully available in all predecessors.
890 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
891
892 // If this block has no predecessors, it isn't live-in here.
893 if (PI == PE)
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000894 goto SpeculationFailure;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000895
896 for (; PI != PE; ++PI)
897 // If the value isn't fully available in one of our predecessors, then it
898 // isn't fully available in this block either. Undo our previous
899 // optimistic assumption and bail out.
900 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000901 goto SpeculationFailure;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000902
903 return true;
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000904
905// SpeculationFailure - If we get here, we found out that this is not, after
906// all, a fully-available block. We have a problem if we speculated on this and
907// used the speculation to mark other blocks as available.
908SpeculationFailure:
909 char &BBVal = FullyAvailableBlocks[BB];
910
911 // If we didn't speculate on this, just return with it set to false.
912 if (BBVal == 2) {
913 BBVal = 0;
914 return false;
915 }
916
917 // If we did speculate on this value, we could have blocks set to 1 that are
918 // incorrect. Walk the (transitive) successors of this block and mark them as
919 // 0 if set to one.
920 SmallVector<BasicBlock*, 32> BBWorklist;
921 BBWorklist.push_back(BB);
922
923 while (!BBWorklist.empty()) {
924 BasicBlock *Entry = BBWorklist.pop_back_val();
925 // Note that this sets blocks to 0 (unavailable) if they happen to not
926 // already be in FullyAvailableBlocks. This is safe.
927 char &EntryVal = FullyAvailableBlocks[Entry];
928 if (EntryVal == 0) continue; // Already unavailable.
929
930 // Mark as unavailable.
931 EntryVal = 0;
932
933 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
934 BBWorklist.push_back(*I);
935 }
936
937 return false;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000938}
939
Owen Anderson221a4362007-08-16 22:02:55 +0000940/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
941/// non-local by performing PHI construction.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000942bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner804209d2008-03-21 22:01:16 +0000943 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000944 // Find the non-local dependencies of the load.
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000945 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
946 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
947 Deps);
948 //DEBUG(cerr << "INVESTIGATING NONLOCAL LOAD: " << Deps.size() << *LI);
Owen Anderson5e5599b2007-07-25 19:57:03 +0000949
Owen Andersonb39e0de2008-08-26 22:07:42 +0000950 // If we had to process more than one hundred blocks to find the
951 // dependencies, this load isn't worth worrying about. Optimizing
952 // it will be too expensive.
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000953 if (Deps.size() > 100)
Owen Andersonb39e0de2008-08-26 22:07:42 +0000954 return false;
Chris Lattnerb6372932008-12-18 00:51:32 +0000955
956 // If we had a phi translation failure, we'll have a single entry which is a
957 // clobber in the current block. Reject this early.
Torok Edwinba93ea72009-06-17 18:48:18 +0000958 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
959 DEBUG(
960 DOUT << "GVN: non-local load ";
961 WriteAsOperand(*DOUT.stream(), LI);
962 DOUT << " is clobbered by " << *Deps[0].second.getInst();
963 );
Chris Lattnerb6372932008-12-18 00:51:32 +0000964 return false;
Torok Edwinba93ea72009-06-17 18:48:18 +0000965 }
Owen Andersonb39e0de2008-08-26 22:07:42 +0000966
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000967 // Filter out useless results (non-locals, etc). Keep track of the blocks
968 // where we have a value available in repl, also keep track of whether we see
969 // dependencies that produce an unknown value for the load (such as a call
970 // that could potentially clobber the load).
971 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
972 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Owen Anderson0cc1a762007-08-07 23:12:31 +0000973
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000974 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
975 BasicBlock *DepBB = Deps[i].first;
976 MemDepResult DepInfo = Deps[i].second;
Chris Lattner7e61daf2008-12-01 01:15:42 +0000977
Chris Lattner0e3d6332008-12-05 21:04:20 +0000978 if (DepInfo.isClobber()) {
979 UnavailableBlocks.push_back(DepBB);
980 continue;
981 }
982
983 Instruction *DepInst = DepInfo.getInst();
984
985 // Loading the allocation -> undef.
986 if (isa<AllocationInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000987 ValuesPerBlock.push_back(std::make_pair(DepBB,
Owen Andersonb5618da2009-07-03 00:17:18 +0000988 Context->getUndef(LI->getType())));
Chris Lattner7e61daf2008-12-01 01:15:42 +0000989 continue;
990 }
Chris Lattner2876a642008-03-21 21:14:38 +0000991
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000992 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner9ce89952008-12-01 01:31:36 +0000993 // Reject loads and stores that are to the same address but are of
994 // different types.
995 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
996 // of bitfield access, it would be interesting to optimize for it at some
997 // point.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000998 if (S->getOperand(0)->getType() != LI->getType()) {
999 UnavailableBlocks.push_back(DepBB);
1000 continue;
1001 }
Chris Lattner9ce89952008-12-01 01:31:36 +00001002
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001003 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattner9ce89952008-12-01 01:31:36 +00001004
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001005 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001006 if (LD->getType() != LI->getType()) {
1007 UnavailableBlocks.push_back(DepBB);
1008 continue;
1009 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001010 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5e5599b2007-07-25 19:57:03 +00001011 } else {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001012 UnavailableBlocks.push_back(DepBB);
1013 continue;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001014 }
Chris Lattner2876a642008-03-21 21:14:38 +00001015 }
Owen Anderson5e5599b2007-07-25 19:57:03 +00001016
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001017 // If we have no predecessors that produce a known value for this load, exit
1018 // early.
1019 if (ValuesPerBlock.empty()) return false;
1020
1021 // If all of the instructions we depend on produce a known value for this
1022 // load, then it is fully redundant and we can use PHI insertion to compute
1023 // its value. Insert PHIs and remove the fully redundant value now.
1024 if (UnavailableBlocks.empty()) {
1025 // Use cached PHI construction information from previous runs
1026 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001027 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001028 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1029 I != E; ++I) {
1030 if ((*I)->getParent() == LI->getParent()) {
1031 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD #1: " << *LI);
1032 LI->replaceAllUsesWith(*I);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001033 if (isa<PointerType>((*I)->getType()))
1034 MD->invalidateCachedPointerInfo(*I);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001035 toErase.push_back(LI);
1036 NumGVNLoad++;
1037 return true;
1038 }
1039
1040 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Anderson0cc1a762007-08-07 23:12:31 +00001041 }
Chris Lattner2876a642008-03-21 21:14:38 +00001042
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001043 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD: " << *LI);
1044
1045 DenseMap<BasicBlock*, Value*> BlockReplValues;
1046 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1047 // Perform PHI construction.
1048 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1049 LI->replaceAllUsesWith(v);
Chris Lattner69131fd2008-12-15 03:46:38 +00001050
Chris Lattner096f44d2009-02-12 07:00:35 +00001051 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001052 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001053 if (isa<PointerType>(v->getType()))
1054 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001055 toErase.push_back(LI);
1056 NumGVNLoad++;
1057 return true;
1058 }
1059
1060 if (!EnablePRE || !EnableLoadPRE)
1061 return false;
1062
1063 // Okay, we have *some* definitions of the value. This means that the value
1064 // is available in some of our (transitive) predecessors. Lets think about
1065 // doing PRE of this load. This will involve inserting a new load into the
1066 // predecessor when it's not available. We could do this in general, but
1067 // prefer to not increase code size. As such, we only do this when we know
1068 // that we only have to insert *one* load (which means we're basically moving
1069 // the load, not inserting a new one).
1070
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001071 SmallPtrSet<BasicBlock *, 4> Blockers;
1072 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1073 Blockers.insert(UnavailableBlocks[i]);
1074
1075 // Lets find first basic block with more than one predecessor. Walk backwards
1076 // through predecessors if needed.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001077 BasicBlock *LoadBB = LI->getParent();
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001078 BasicBlock *TmpBB = LoadBB;
1079
1080 bool isSinglePred = false;
Dale Johannesen81b64632009-06-17 20:48:23 +00001081 bool allSingleSucc = true;
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001082 while (TmpBB->getSinglePredecessor()) {
1083 isSinglePred = true;
1084 TmpBB = TmpBB->getSinglePredecessor();
1085 if (!TmpBB) // If haven't found any, bail now.
1086 return false;
1087 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1088 return false;
1089 if (Blockers.count(TmpBB))
1090 return false;
Dale Johannesen81b64632009-06-17 20:48:23 +00001091 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1092 allSingleSucc = false;
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001093 }
1094
1095 assert(TmpBB);
1096 LoadBB = TmpBB;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001097
1098 // If we have a repl set with LI itself in it, this means we have a loop where
1099 // at least one of the values is LI. Since this means that we won't be able
1100 // to eliminate LI even if we insert uses in the other predecessors, we will
1101 // end up increasing code size. Reject this by scanning for LI.
1102 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1103 if (ValuesPerBlock[i].second == LI)
1104 return false;
1105
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001106 if (isSinglePred) {
1107 bool isHot = false;
1108 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1109 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
1110 // "Hot" Instruction is in some loop (because it dominates its dep.
1111 // instruction).
1112 if (DT->dominates(LI, I)) {
1113 isHot = true;
1114 break;
1115 }
1116
1117 // We are interested only in "hot" instructions. We don't want to do any
1118 // mis-optimizations here.
1119 if (!isHot)
1120 return false;
1121 }
1122
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001123 // Okay, we have some hope :). Check to see if the loaded value is fully
1124 // available in all but one predecessor.
1125 // FIXME: If we could restructure the CFG, we could make a common pred with
1126 // all the preds that don't have an available LI and insert a new load into
1127 // that one block.
1128 BasicBlock *UnavailablePred = 0;
1129
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001130 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001131 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1132 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1133 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1134 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1135
1136 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1137 PI != E; ++PI) {
1138 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1139 continue;
1140
1141 // If this load is not available in multiple predecessors, reject it.
1142 if (UnavailablePred && UnavailablePred != *PI)
1143 return false;
1144 UnavailablePred = *PI;
1145 }
1146
1147 assert(UnavailablePred != 0 &&
1148 "Fully available value should be eliminated above!");
1149
1150 // If the loaded pointer is PHI node defined in this block, do PHI translation
1151 // to get its value in the predecessor.
1152 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
1153
1154 // Make sure the value is live in the predecessor. If it was defined by a
1155 // non-PHI instruction in this block, we don't know how to recompute it above.
1156 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1157 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
1158 DEBUG(cerr << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
1159 << *LPInst << *LI << "\n");
1160 return false;
1161 }
1162
1163 // We don't currently handle critical edges :(
1164 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
1165 DEBUG(cerr << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
1166 << UnavailablePred->getName() << "': " << *LI);
1167 return false;
Owen Anderson0cc1a762007-08-07 23:12:31 +00001168 }
Dale Johannesen81b64632009-06-17 20:48:23 +00001169
1170 // Make sure it is valid to move this load here. We have to watch out for:
1171 // @1 = getelementptr (i8* p, ...
1172 // test p and branch if == 0
1173 // load @1
1174 // It is valid to have the getelementptr before the test, even if p can be 0,
1175 // as getelementptr only does address arithmetic.
1176 // If we are not pushing the value through any multiple-successor blocks
1177 // we do not have this case. Otherwise, check that the load is safe to
1178 // put anywhere; this can be improved, but should be conservatively safe.
1179 if (!allSingleSucc &&
1180 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
1181 return false;
1182
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001183 // Okay, we can eliminate this load by inserting a reload in the predecessor
1184 // and using PHI construction to get the value in the other predecessors, do
1185 // it.
Chris Lattnerc1008282008-12-05 17:04:12 +00001186 DEBUG(cerr << "GVN REMOVING PRE LOAD: " << *LI);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001187
1188 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1189 LI->getAlignment(),
1190 UnavailablePred->getTerminator());
1191
Owen Anderson04cfdd32009-05-29 05:37:54 +00001192 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1193 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1194 I != E; ++I)
1195 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
1196
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001197 DenseMap<BasicBlock*, Value*> BlockReplValues;
1198 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1199 BlockReplValues[UnavailablePred] = NewLoad;
1200
1201 // Perform PHI construction.
1202 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1203 LI->replaceAllUsesWith(v);
Chris Lattner096f44d2009-02-12 07:00:35 +00001204 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001205 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001206 if (isa<PointerType>(v->getType()))
1207 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001208 toErase.push_back(LI);
1209 NumPRELoad++;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001210 return true;
1211}
1212
Owen Anderson221a4362007-08-16 22:02:55 +00001213/// processLoad - Attempt to eliminate a load, first by eliminating it
1214/// locally, and then attempting non-local elimination if that fails.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001215bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1216 if (L->isVolatile())
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001217 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001218
1219 Value* pointer = L->getPointerOperand();
Chris Lattner0e3d6332008-12-05 21:04:20 +00001220
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001221 // ... to a pointer that has been loaded from before...
Chris Lattner8541ede2008-12-01 00:40:32 +00001222 MemDepResult dep = MD->getDependency(L);
Owen Andersona7b220f2007-08-14 17:59:48 +00001223
Chris Lattner0e3d6332008-12-05 21:04:20 +00001224 // If the value isn't available, don't do anything!
Torok Edwin72070282009-05-29 09:46:03 +00001225 if (dep.isClobber()) {
1226 DEBUG(
1227 // fast print dep, using operator<< on instruction would be too slow
1228 DOUT << "GVN: load ";
1229 WriteAsOperand(*DOUT.stream(), L);
1230 Instruction *I = dep.getInst();
Torok Edwin0b0ddb22009-05-29 16:58:36 +00001231 DOUT << " is clobbered by " << *I;
Torok Edwin72070282009-05-29 09:46:03 +00001232 );
Chris Lattner0e3d6332008-12-05 21:04:20 +00001233 return false;
Torok Edwin72070282009-05-29 09:46:03 +00001234 }
Chris Lattner0e3d6332008-12-05 21:04:20 +00001235
1236 // If it is defined in another block, try harder.
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001237 if (dep.isNonLocal())
Chris Lattner0e3d6332008-12-05 21:04:20 +00001238 return processNonLocalLoad(L, toErase);
Eli Friedman716c10c2008-02-12 12:08:14 +00001239
Chris Lattner0e3d6332008-12-05 21:04:20 +00001240 Instruction *DepInst = dep.getInst();
1241 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1242 // Only forward substitute stores to loads of the same type.
1243 // FIXME: Could do better!
1244 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1245 return false;
1246
1247 // Remove it!
1248 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001249 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1250 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattner0e3d6332008-12-05 21:04:20 +00001251 toErase.push_back(L);
1252 NumGVNLoad++;
1253 return true;
1254 }
1255
1256 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1257 // Only forward substitute stores to loads of the same type.
1258 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1259 if (DepLI->getType() != L->getType())
1260 return false;
1261
1262 // Remove it!
1263 L->replaceAllUsesWith(DepLI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001264 if (isa<PointerType>(DepLI->getType()))
1265 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner0e3d6332008-12-05 21:04:20 +00001266 toErase.push_back(L);
1267 NumGVNLoad++;
1268 return true;
1269 }
1270
Chris Lattner3ff6d012008-11-30 01:39:32 +00001271 // If this load really doesn't depend on anything, then we must be loading an
1272 // undef value. This can happen when loading for a fresh allocation with no
1273 // intervening stores, for example.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001274 if (isa<AllocationInst>(DepInst)) {
Owen Andersonb5618da2009-07-03 00:17:18 +00001275 L->replaceAllUsesWith(Context->getUndef(L->getType()));
Chris Lattner3ff6d012008-11-30 01:39:32 +00001276 toErase.push_back(L);
Chris Lattner3ff6d012008-11-30 01:39:32 +00001277 NumGVNLoad++;
Chris Lattner0e3d6332008-12-05 21:04:20 +00001278 return true;
Eli Friedman716c10c2008-02-12 12:08:14 +00001279 }
1280
Chris Lattner0e3d6332008-12-05 21:04:20 +00001281 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001282}
1283
Owen Anderson1b3ea962008-06-20 01:15:47 +00001284Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Anderson54e02192008-06-23 17:49:45 +00001285 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1286 if (I == localAvail.end())
1287 return 0;
1288
1289 ValueNumberScope* locals = I->second;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001290
1291 while (locals) {
1292 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1293 if (I != locals->table.end())
1294 return I->second;
1295 else
1296 locals = locals->parent;
1297 }
1298
1299 return 0;
1300}
1301
Owen Andersonbfe133e2008-12-15 02:03:00 +00001302/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
1303/// by inheritance from the dominator fails, see if we can perform phi
1304/// construction to eliminate the redundancy.
1305Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1306 BasicBlock* BaseBlock = orig->getParent();
1307
1308 SmallPtrSet<BasicBlock*, 4> Visited;
1309 SmallVector<BasicBlock*, 8> Stack;
1310 Stack.push_back(BaseBlock);
1311
1312 DenseMap<BasicBlock*, Value*> Results;
1313
1314 // Walk backwards through our predecessors, looking for instances of the
1315 // value number we're looking for. Instances are recorded in the Results
1316 // map, which is then used to perform phi construction.
1317 while (!Stack.empty()) {
1318 BasicBlock* Current = Stack.back();
1319 Stack.pop_back();
1320
1321 // If we've walked all the way to a proper dominator, then give up. Cases
1322 // where the instance is in the dominator will have been caught by the fast
1323 // path, and any cases that require phi construction further than this are
1324 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1325 // time improvement.
1326 if (DT->properlyDominates(Current, orig->getParent())) return 0;
1327
1328 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1329 localAvail.find(Current);
1330 if (LA == localAvail.end()) return 0;
Chris Lattner73d7fe52009-01-19 22:00:18 +00001331 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Andersonbfe133e2008-12-15 02:03:00 +00001332
1333 if (V != LA->second->table.end()) {
1334 // Found an instance, record it.
1335 Results.insert(std::make_pair(Current, V->second));
1336 continue;
1337 }
1338
1339 // If we reach the beginning of the function, then give up.
1340 if (pred_begin(Current) == pred_end(Current))
1341 return 0;
1342
1343 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1344 PI != PE; ++PI)
1345 if (Visited.insert(*PI))
1346 Stack.push_back(*PI);
1347 }
1348
1349 // If we didn't find instances, give up. Otherwise, perform phi construction.
1350 if (Results.size() == 0)
1351 return 0;
1352 else
1353 return GetValueForBlock(BaseBlock, orig, Results, true);
1354}
1355
Owen Anderson398602a2007-08-14 18:16:29 +00001356/// processInstruction - When calculating availability, handle an instruction
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001357/// by inserting it into the appropriate sets
Owen Andersonaccdca12008-06-12 19:25:32 +00001358bool GVN::processInstruction(Instruction *I,
Chris Lattner804209d2008-03-21 22:01:16 +00001359 SmallVectorImpl<Instruction*> &toErase) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001360 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001361 bool changed = processLoad(L, toErase);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001362
1363 if (!changed) {
1364 unsigned num = VN.lookup_or_add(L);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001365 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001366 }
1367
1368 return changed;
1369 }
1370
Owen Anderson3ea90a72008-07-03 17:44:33 +00001371 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001372 unsigned num = VN.lookup_or_add(I);
Chris Lattner804209d2008-03-21 22:01:16 +00001373
Owen Anderson98f912b2009-04-01 23:53:49 +00001374 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1375 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1376
1377 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1378 return false;
1379
1380 Value* branchCond = BI->getCondition();
1381 uint32_t condVN = VN.lookup_or_add(branchCond);
1382
1383 BasicBlock* trueSucc = BI->getSuccessor(0);
1384 BasicBlock* falseSucc = BI->getSuccessor(1);
1385
1386 if (trueSucc->getSinglePredecessor())
Owen Andersonb5618da2009-07-03 00:17:18 +00001387 localAvail[trueSucc]->table[condVN] = Context->getConstantIntTrue();
Owen Anderson98f912b2009-04-01 23:53:49 +00001388 if (falseSucc->getSinglePredecessor())
Owen Andersonb5618da2009-07-03 00:17:18 +00001389 localAvail[falseSucc]->table[condVN] = Context->getConstantIntFalse();
Owen Anderson98f912b2009-04-01 23:53:49 +00001390
1391 return false;
1392
Owen Anderson0c1e6342008-04-07 09:59:07 +00001393 // Allocations are always uniquely numbered, so we can save time and memory
Owen Anderson98f912b2009-04-01 23:53:49 +00001394 // by fast failing them.
1395 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001396 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson0c1e6342008-04-07 09:59:07 +00001397 return false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001398 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001399
Owen Anderson221a4362007-08-16 22:02:55 +00001400 // Collapse PHI nodes
Owen Andersonbc271a02007-08-14 18:33:27 +00001401 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001402 Value* constVal = CollapsePhi(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001403
1404 if (constVal) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001405 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1406 PI != PE; ++PI)
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001407 PI->second.erase(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001408
Owen Andersonf5023a72007-08-16 22:51:56 +00001409 p->replaceAllUsesWith(constVal);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001410 if (isa<PointerType>(constVal->getType()))
1411 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson164274e2008-12-23 00:49:51 +00001412 VN.erase(p);
1413
Owen Andersonf5023a72007-08-16 22:51:56 +00001414 toErase.push_back(p);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001415 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001416 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonbc271a02007-08-14 18:33:27 +00001417 }
Owen Anderson3ea90a72008-07-03 17:44:33 +00001418
1419 // If the number we were assigned was a brand new VN, then we don't
1420 // need to do a lookup to see if the number already exists
1421 // somewhere in the domtree: it can't!
1422 } else if (num == nextNum) {
1423 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1424
Owen Andersonbfe133e2008-12-15 02:03:00 +00001425 // Perform fast-path value-number based elimination of values inherited from
1426 // dominators.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001427 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson086b2c42007-12-08 01:37:09 +00001428 // Remove it!
Owen Anderson10ffa862007-07-31 23:27:13 +00001429 VN.erase(I);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001430 I->replaceAllUsesWith(repl);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001431 if (isa<PointerType>(repl->getType()))
1432 MD->invalidateCachedPointerInfo(repl);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001433 toErase.push_back(I);
1434 return true;
Owen Andersonbfe133e2008-12-15 02:03:00 +00001435
1436#if 0
1437 // Perform slow-pathvalue-number based elimination with phi construction.
1438 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1439 // Remove it!
1440 VN.erase(I);
1441 I->replaceAllUsesWith(repl);
1442 if (isa<PointerType>(repl->getType()))
1443 MD->invalidateCachedPointerInfo(repl);
1444 toErase.push_back(I);
1445 return true;
1446#endif
Owen Anderson3ea90a72008-07-03 17:44:33 +00001447 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001448 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001449 }
1450
1451 return false;
1452}
1453
Bill Wendling456e8852008-12-22 22:32:22 +00001454/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson676070d2007-08-14 18:04:11 +00001455bool GVN::runOnFunction(Function& F) {
Chris Lattner8541ede2008-12-01 00:40:32 +00001456 MD = &getAnalysis<MemoryDependenceAnalysis>();
1457 DT = &getAnalysis<DominatorTree>();
Owen Andersonf7928602008-05-12 20:15:55 +00001458 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner8541ede2008-12-01 00:40:32 +00001459 VN.setMemDep(MD);
1460 VN.setDomTree(DT);
Owen Anderson09b83ba2007-10-18 19:39:33 +00001461
Owen Anderson676070d2007-08-14 18:04:11 +00001462 bool changed = false;
1463 bool shouldContinue = true;
1464
Owen Andersonac310962008-07-16 17:52:31 +00001465 // Merge unconditional branches, allowing PRE to catch more
1466 // optimization opportunities.
1467 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1468 BasicBlock* BB = FI;
1469 ++FI;
Owen Andersonc0623812008-07-17 00:01:40 +00001470 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1471 if (removedBlock) NumGVNBlocks++;
1472
1473 changed |= removedBlock;
Owen Andersonac310962008-07-16 17:52:31 +00001474 }
1475
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001476 unsigned Iteration = 0;
1477
Owen Anderson676070d2007-08-14 18:04:11 +00001478 while (shouldContinue) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001479 DEBUG(cerr << "GVN iteration: " << Iteration << "\n");
Owen Anderson676070d2007-08-14 18:04:11 +00001480 shouldContinue = iterateOnFunction(F);
1481 changed |= shouldContinue;
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001482 ++Iteration;
Owen Anderson676070d2007-08-14 18:04:11 +00001483 }
1484
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001485 if (EnablePRE) {
Owen Anderson2fbfb702008-09-03 23:06:07 +00001486 bool PREChanged = true;
1487 while (PREChanged) {
1488 PREChanged = performPRE(F);
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001489 changed |= PREChanged;
Owen Anderson2fbfb702008-09-03 23:06:07 +00001490 }
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001491 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001492 // FIXME: Should perform GVN again after PRE does something. PRE can move
1493 // computations into blocks where they become fully redundant. Note that
1494 // we can't do this until PRE's critical edge splitting updates memdep.
1495 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopese3127f32008-10-10 16:25:50 +00001496
1497 cleanupGlobalSets();
1498
Owen Anderson676070d2007-08-14 18:04:11 +00001499 return changed;
1500}
1501
1502
Owen Andersonbfe133e2008-12-15 02:03:00 +00001503bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001504 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1505 // incrementing BI before processing an instruction).
Owen Andersonaccdca12008-06-12 19:25:32 +00001506 SmallVector<Instruction*, 8> toErase;
Owen Andersonaccdca12008-06-12 19:25:32 +00001507 bool changed_function = false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001508
Owen Andersonaccdca12008-06-12 19:25:32 +00001509 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1510 BI != BE;) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001511 changed_function |= processInstruction(BI, toErase);
Owen Andersonaccdca12008-06-12 19:25:32 +00001512 if (toErase.empty()) {
1513 ++BI;
1514 continue;
1515 }
1516
1517 // If we need some instructions deleted, do it now.
1518 NumGVNInstr += toErase.size();
1519
1520 // Avoid iterator invalidation.
1521 bool AtStart = BI == BB->begin();
1522 if (!AtStart)
1523 --BI;
1524
1525 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner8541ede2008-12-01 00:40:32 +00001526 E = toErase.end(); I != E; ++I) {
1527 DEBUG(cerr << "GVN removed: " << **I);
1528 MD->removeInstruction(*I);
Owen Andersonaccdca12008-06-12 19:25:32 +00001529 (*I)->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001530 DEBUG(verifyRemoved(*I));
Chris Lattner8541ede2008-12-01 00:40:32 +00001531 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001532 toErase.clear();
Owen Andersonaccdca12008-06-12 19:25:32 +00001533
1534 if (AtStart)
1535 BI = BB->begin();
1536 else
1537 ++BI;
Owen Andersonaccdca12008-06-12 19:25:32 +00001538 }
1539
Owen Andersonaccdca12008-06-12 19:25:32 +00001540 return changed_function;
1541}
1542
Owen Anderson6a903bc2008-06-18 21:41:49 +00001543/// performPRE - Perform a purely local form of PRE that looks for diamond
1544/// control flow patterns and attempts to perform simple PRE at the join point.
1545bool GVN::performPRE(Function& F) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001546 bool Changed = false;
Owen Andersonfdf9f162008-06-19 19:54:19 +00001547 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001548 DenseMap<BasicBlock*, Value*> predMap;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001549 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1550 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1551 BasicBlock* CurrentBlock = *DI;
1552
1553 // Nothing to PRE in the entry block.
1554 if (CurrentBlock == &F.getEntryBlock()) continue;
1555
1556 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1557 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001558 Instruction *CurInst = BI++;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001559
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001560 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
John Criswell073e4d12009-03-10 15:04:53 +00001561 isa<PHINode>(CurInst) || (CurInst->getType() == Type::VoidTy) ||
Duncan Sands1efabaa2009-05-06 06:49:50 +00001562 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell073e4d12009-03-10 15:04:53 +00001563 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001564 continue;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001565
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001566 uint32_t valno = VN.lookup(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001567
1568 // Look for the predecessors for PRE opportunities. We're
1569 // only trying to solve the basic diamond case, where
1570 // a value is computed in the successor and one predecessor,
1571 // but not the other. We also explicitly disallow cases
1572 // where the successor is its own predecessor, because they're
1573 // more complicated to get right.
1574 unsigned numWith = 0;
1575 unsigned numWithout = 0;
1576 BasicBlock* PREPred = 0;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001577 predMap.clear();
1578
Owen Anderson6a903bc2008-06-18 21:41:49 +00001579 for (pred_iterator PI = pred_begin(CurrentBlock),
1580 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1581 // We're not interested in PRE where the block is its
Owen Anderson1b3ea962008-06-20 01:15:47 +00001582 // own predecessor, on in blocks with predecessors
1583 // that are not reachable.
1584 if (*PI == CurrentBlock) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001585 numWithout = 2;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001586 break;
1587 } else if (!localAvail.count(*PI)) {
1588 numWithout = 2;
1589 break;
1590 }
1591
1592 DenseMap<uint32_t, Value*>::iterator predV =
1593 localAvail[*PI]->table.find(valno);
1594 if (predV == localAvail[*PI]->table.end()) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001595 PREPred = *PI;
1596 numWithout++;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001597 } else if (predV->second == CurInst) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001598 numWithout = 2;
1599 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001600 predMap[*PI] = predV->second;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001601 numWith++;
1602 }
1603 }
1604
1605 // Don't do PRE when it might increase code size, i.e. when
1606 // we would need to insert instructions in more than one pred.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001607 if (numWithout != 1 || numWith == 0)
Owen Anderson6a903bc2008-06-18 21:41:49 +00001608 continue;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001609
Owen Andersonfdf9f162008-06-19 19:54:19 +00001610 // We can't do PRE safely on a critical edge, so instead we schedule
1611 // the edge to be split and perform the PRE the next time we iterate
1612 // on the function.
1613 unsigned succNum = 0;
1614 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1615 i != e; ++i)
Owen Anderson2fbfb702008-09-03 23:06:07 +00001616 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonfdf9f162008-06-19 19:54:19 +00001617 succNum = i;
1618 break;
1619 }
1620
1621 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1622 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Andersonfdf9f162008-06-19 19:54:19 +00001623 continue;
1624 }
1625
Owen Anderson6a903bc2008-06-18 21:41:49 +00001626 // Instantiate the expression the in predecessor that lacked it.
1627 // Because we are going top-down through the block, all value numbers
1628 // will be available in the predecessor by the time we need them. Any
1629 // that weren't original present will have been instantiated earlier
1630 // in this loop.
Owen Anderson1e5f00e2009-07-09 23:48:35 +00001631 Instruction* PREInstr = CurInst->clone(*Context);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001632 bool success = true;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001633 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1634 Value *Op = PREInstr->getOperand(i);
1635 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1636 continue;
1637
1638 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1639 PREInstr->setOperand(i, V);
1640 } else {
1641 success = false;
1642 break;
Owen Anderson8e462e92008-07-11 20:05:13 +00001643 }
Owen Anderson6a903bc2008-06-18 21:41:49 +00001644 }
1645
1646 // Fail out if we encounter an operand that is not available in
1647 // the PRE predecessor. This is typically because of loads which
1648 // are not value numbered precisely.
1649 if (!success) {
1650 delete PREInstr;
Bill Wendling3c793442008-12-22 22:14:07 +00001651 DEBUG(verifyRemoved(PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001652 continue;
1653 }
1654
1655 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001656 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson1b3ea962008-06-20 01:15:47 +00001657 predMap[PREPred] = PREInstr;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001658 VN.add(PREInstr, valno);
1659 NumGVNPRE++;
1660
1661 // Update the availability map to include the new instruction.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001662 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001663
1664 // Create a PHI to make the value available in this block.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001665 PHINode* Phi = PHINode::Create(CurInst->getType(),
1666 CurInst->getName() + ".pre-phi",
Owen Anderson6a903bc2008-06-18 21:41:49 +00001667 CurrentBlock->begin());
1668 for (pred_iterator PI = pred_begin(CurrentBlock),
1669 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson1b3ea962008-06-20 01:15:47 +00001670 Phi->addIncoming(predMap[*PI], *PI);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001671
1672 VN.add(Phi, valno);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001673 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001674
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001675 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001676 if (isa<PointerType>(Phi->getType()))
1677 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001678 VN.erase(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001679
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001680 DEBUG(cerr << "GVN PRE removed: " << *CurInst);
1681 MD->removeInstruction(CurInst);
1682 CurInst->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001683 DEBUG(verifyRemoved(CurInst));
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001684 Changed = true;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001685 }
1686 }
1687
Owen Andersonfdf9f162008-06-19 19:54:19 +00001688 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001689 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonfdf9f162008-06-19 19:54:19 +00001690 SplitCriticalEdge(I->first, I->second, this);
1691
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001692 return Changed || toSplit.size();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001693}
1694
Bill Wendling456e8852008-12-22 22:32:22 +00001695/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson676070d2007-08-14 18:04:11 +00001696bool GVN::iterateOnFunction(Function &F) {
Nuno Lopese3127f32008-10-10 16:25:50 +00001697 cleanupGlobalSets();
Chris Lattnerbeb216d2008-03-21 21:33:23 +00001698
Owen Anderson98f912b2009-04-01 23:53:49 +00001699 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1700 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1701 if (DI->getIDom())
1702 localAvail[DI->getBlock()] =
1703 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1704 else
1705 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1706 }
1707
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001708 // Top-down walk of the dominator tree
Owen Anderson6a903bc2008-06-18 21:41:49 +00001709 bool changed = false;
Owen Anderson03aacba2008-12-15 03:52:17 +00001710#if 0
1711 // Needed for value numbering with phi construction to work.
Owen Andersonbfe133e2008-12-15 02:03:00 +00001712 ReversePostOrderTraversal<Function*> RPOT(&F);
1713 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1714 RE = RPOT.end(); RI != RE; ++RI)
1715 changed |= processBlock(*RI);
Owen Anderson03aacba2008-12-15 03:52:17 +00001716#else
1717 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1718 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1719 changed |= processBlock(DI->getBlock());
1720#endif
1721
Owen Andersonac310962008-07-16 17:52:31 +00001722 return changed;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001723}
Nuno Lopese3127f32008-10-10 16:25:50 +00001724
1725void GVN::cleanupGlobalSets() {
1726 VN.clear();
1727 phiMap.clear();
1728
1729 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1730 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1731 delete I->second;
1732 localAvail.clear();
1733}
Bill Wendling6b18a392008-12-22 21:36:08 +00001734
1735/// verifyRemoved - Verify that the specified instruction does not occur in our
1736/// internal data structures.
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001737void GVN::verifyRemoved(const Instruction *Inst) const {
1738 VN.verifyRemoved(Inst);
Bill Wendling3c793442008-12-22 22:14:07 +00001739
1740 // Walk through the PHI map to make sure the instruction isn't hiding in there
1741 // somewhere.
1742 for (PhiMapType::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001743 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1744 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling3c793442008-12-22 22:14:07 +00001745
1746 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001747 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1748 assert(*II != Inst && "Inst is still a value in PHI map!");
1749 }
1750 }
1751
1752 // Walk through the value number scope to make sure the instruction isn't
1753 // ferreted away in it.
1754 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1755 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1756 const ValueNumberScope *VNS = I->second;
1757
1758 while (VNS) {
1759 for (DenseMap<uint32_t, Value*>::iterator
1760 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1761 assert(II->second != Inst && "Inst still in value numbering scope!");
1762 }
1763
1764 VNS = VNS->parent;
Bill Wendling3c793442008-12-22 22:14:07 +00001765 }
1766 }
Bill Wendling6b18a392008-12-22 21:36:08 +00001767}