blob: 0b0968af21c108234cde179a55db93f4881fbe3f [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"
Daniel Dunbar0dd5e1e2009-07-25 00:23:56 +000041#include "llvm/Support/raw_ostream.h"
Owen Andersonfdf9f162008-06-19 19:54:19 +000042#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesen81b64632009-06-17 20:48:23 +000043#include "llvm/Transforms/Utils/Local.h"
Duncan Sands26ff6f92008-10-08 07:23:46 +000044#include <cstdio>
Owen Andersonab6ec2e2007-07-24 17:55:58 +000045using namespace llvm;
46
Bill Wendling3c793442008-12-22 22:14:07 +000047STATISTIC(NumGVNInstr, "Number of instructions deleted");
48STATISTIC(NumGVNLoad, "Number of loads deleted");
49STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
Owen Anderson53d546e2008-07-15 16:28:06 +000050STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3c793442008-12-22 22:14:07 +000051STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner168be762008-03-22 04:13:49 +000052
Evan Cheng9598f932008-06-20 01:01:07 +000053static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonaddbe3e2008-07-17 19:41:00 +000054 cl::init(true), cl::Hidden);
Dan Gohmana8f8a852009-06-15 18:30:15 +000055static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersone780d662008-06-19 19:57:25 +000056
Owen Andersonab6ec2e2007-07-24 17:55:58 +000057//===----------------------------------------------------------------------===//
58// ValueTable Class
59//===----------------------------------------------------------------------===//
60
61/// This class holds the mapping between values and value numbers. It is used
62/// as an efficient mechanism to determine the expression-wise equivalence of
63/// two values.
64namespace {
65 struct VISIBILITY_HIDDEN Expression {
Dan Gohmana5b96452009-06-04 22:49:04 +000066 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
67 UDIV, SDIV, FDIV, UREM, SREM,
Owen Andersonab6ec2e2007-07-24 17:55:58 +000068 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
69 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
70 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
71 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
72 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
73 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
74 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
75 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson69057b82008-05-13 08:17:22 +000076 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Anderson45d37012008-06-19 17:25:39 +000077 EMPTY, TOMBSTONE };
Owen Andersonab6ec2e2007-07-24 17:55:58 +000078
79 ExpressionOpcode opcode;
80 const Type* type;
81 uint32_t firstVN;
82 uint32_t secondVN;
83 uint32_t thirdVN;
84 SmallVector<uint32_t, 4> varargs;
Owen Anderson09b83ba2007-10-18 19:39:33 +000085 Value* function;
Owen Andersonab6ec2e2007-07-24 17:55:58 +000086
87 Expression() { }
88 Expression(ExpressionOpcode o) : opcode(o) { }
89
90 bool operator==(const Expression &other) const {
91 if (opcode != other.opcode)
92 return false;
93 else if (opcode == EMPTY || opcode == TOMBSTONE)
94 return true;
95 else if (type != other.type)
96 return false;
Owen Anderson09b83ba2007-10-18 19:39:33 +000097 else if (function != other.function)
98 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +000099 else if (firstVN != other.firstVN)
100 return false;
101 else if (secondVN != other.secondVN)
102 return false;
103 else if (thirdVN != other.thirdVN)
104 return false;
105 else {
106 if (varargs.size() != other.varargs.size())
107 return false;
108
109 for (size_t i = 0; i < varargs.size(); ++i)
110 if (varargs[i] != other.varargs[i])
111 return false;
112
113 return true;
114 }
115 }
116
117 bool operator!=(const Expression &other) const {
Bill Wendling86f01cb2008-12-22 22:16:31 +0000118 return !(*this == other);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000119 }
120 };
121
122 class VISIBILITY_HIDDEN ValueTable {
123 private:
124 DenseMap<Value*, uint32_t> valueNumbering;
125 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersonf7928602008-05-12 20:15:55 +0000126 AliasAnalysis* AA;
127 MemoryDependenceAnalysis* MD;
128 DominatorTree* DT;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000129
130 uint32_t nextValueNumber;
131
132 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
133 Expression::ExpressionOpcode getOpcode(CmpInst* C);
134 Expression::ExpressionOpcode getOpcode(CastInst* C);
135 Expression create_expression(BinaryOperator* BO);
136 Expression create_expression(CmpInst* C);
137 Expression create_expression(ShuffleVectorInst* V);
138 Expression create_expression(ExtractElementInst* C);
139 Expression create_expression(InsertElementInst* V);
140 Expression create_expression(SelectInst* V);
141 Expression create_expression(CastInst* C);
142 Expression create_expression(GetElementPtrInst* G);
Owen Anderson09b83ba2007-10-18 19:39:33 +0000143 Expression create_expression(CallInst* C);
Owen Anderson69057b82008-05-13 08:17:22 +0000144 Expression create_expression(Constant* C);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000145 public:
Dan Gohmanc4971722009-04-01 16:37:47 +0000146 ValueTable() : nextValueNumber(1) { }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000147 uint32_t lookup_or_add(Value* V);
148 uint32_t lookup(Value* V) const;
149 void add(Value* V, uint32_t num);
150 void clear();
151 void erase(Value* v);
152 unsigned size();
Owen Andersonf7928602008-05-12 20:15:55 +0000153 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner8541ede2008-12-01 00:40:32 +0000154 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonf7928602008-05-12 20:15:55 +0000155 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
156 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson3ea90a72008-07-03 17:44:33 +0000157 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling6b18a392008-12-22 21:36:08 +0000158 void verifyRemoved(const Value *) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000159 };
160}
161
162namespace llvm {
Chris Lattner0625bd62007-09-17 18:34:04 +0000163template <> struct DenseMapInfo<Expression> {
Owen Anderson9699a6e2007-08-02 18:16:06 +0000164 static inline Expression getEmptyKey() {
165 return Expression(Expression::EMPTY);
166 }
167
168 static inline Expression getTombstoneKey() {
169 return Expression(Expression::TOMBSTONE);
170 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000171
172 static unsigned getHashValue(const Expression e) {
173 unsigned hash = e.opcode;
174
175 hash = e.firstVN + hash * 37;
176 hash = e.secondVN + hash * 37;
177 hash = e.thirdVN + hash * 37;
178
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000179 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
180 (unsigned)((uintptr_t)e.type >> 9)) +
181 hash * 37;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000182
Owen Anderson9699a6e2007-08-02 18:16:06 +0000183 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
184 E = e.varargs.end(); I != E; ++I)
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000185 hash = *I + hash * 37;
186
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000187 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
188 (unsigned)((uintptr_t)e.function >> 9)) +
189 hash * 37;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000190
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000191 return hash;
192 }
Chris Lattner0625bd62007-09-17 18:34:04 +0000193 static bool isEqual(const Expression &LHS, const Expression &RHS) {
194 return LHS == RHS;
195 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000196 static bool isPod() { return true; }
197};
198}
199
200//===----------------------------------------------------------------------===//
201// ValueTable Internal Functions
202//===----------------------------------------------------------------------===//
Chris Lattner2876a642008-03-21 21:14:38 +0000203Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000204 switch(BO->getOpcode()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000205 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000206 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner2876a642008-03-21 21:14:38 +0000207 case Instruction::Add: return Expression::ADD;
Dan Gohmana5b96452009-06-04 22:49:04 +0000208 case Instruction::FAdd: return Expression::FADD;
Chris Lattner2876a642008-03-21 21:14:38 +0000209 case Instruction::Sub: return Expression::SUB;
Dan Gohmana5b96452009-06-04 22:49:04 +0000210 case Instruction::FSub: return Expression::FSUB;
Chris Lattner2876a642008-03-21 21:14:38 +0000211 case Instruction::Mul: return Expression::MUL;
Dan Gohmana5b96452009-06-04 22:49:04 +0000212 case Instruction::FMul: return Expression::FMUL;
Chris Lattner2876a642008-03-21 21:14:38 +0000213 case Instruction::UDiv: return Expression::UDIV;
214 case Instruction::SDiv: return Expression::SDIV;
215 case Instruction::FDiv: return Expression::FDIV;
216 case Instruction::URem: return Expression::UREM;
217 case Instruction::SRem: return Expression::SREM;
218 case Instruction::FRem: return Expression::FREM;
219 case Instruction::Shl: return Expression::SHL;
220 case Instruction::LShr: return Expression::LSHR;
221 case Instruction::AShr: return Expression::ASHR;
222 case Instruction::And: return Expression::AND;
223 case Instruction::Or: return Expression::OR;
224 case Instruction::Xor: return Expression::XOR;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000225 }
226}
227
228Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000229 if (isa<ICmpInst>(C)) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000230 switch (C->getPredicate()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000231 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000232 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner2876a642008-03-21 21:14:38 +0000233 case ICmpInst::ICMP_EQ: return Expression::ICMPEQ;
234 case ICmpInst::ICMP_NE: return Expression::ICMPNE;
235 case ICmpInst::ICMP_UGT: return Expression::ICMPUGT;
236 case ICmpInst::ICMP_UGE: return Expression::ICMPUGE;
237 case ICmpInst::ICMP_ULT: return Expression::ICMPULT;
238 case ICmpInst::ICMP_ULE: return Expression::ICMPULE;
239 case ICmpInst::ICMP_SGT: return Expression::ICMPSGT;
240 case ICmpInst::ICMP_SGE: return Expression::ICMPSGE;
241 case ICmpInst::ICMP_SLT: return Expression::ICMPSLT;
242 case ICmpInst::ICMP_SLE: return Expression::ICMPSLE;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000243 }
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000244 } else {
245 switch (C->getPredicate()) {
246 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000247 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000248 case FCmpInst::FCMP_OEQ: return Expression::FCMPOEQ;
249 case FCmpInst::FCMP_OGT: return Expression::FCMPOGT;
250 case FCmpInst::FCMP_OGE: return Expression::FCMPOGE;
251 case FCmpInst::FCMP_OLT: return Expression::FCMPOLT;
252 case FCmpInst::FCMP_OLE: return Expression::FCMPOLE;
253 case FCmpInst::FCMP_ONE: return Expression::FCMPONE;
254 case FCmpInst::FCMP_ORD: return Expression::FCMPORD;
255 case FCmpInst::FCMP_UNO: return Expression::FCMPUNO;
256 case FCmpInst::FCMP_UEQ: return Expression::FCMPUEQ;
257 case FCmpInst::FCMP_UGT: return Expression::FCMPUGT;
258 case FCmpInst::FCMP_UGE: return Expression::FCMPUGE;
259 case FCmpInst::FCMP_ULT: return Expression::FCMPULT;
260 case FCmpInst::FCMP_ULE: return Expression::FCMPULE;
261 case FCmpInst::FCMP_UNE: return Expression::FCMPUNE;
262 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000263 }
264}
265
Chris Lattner2876a642008-03-21 21:14:38 +0000266Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000267 switch(C->getOpcode()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000268 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000269 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner2876a642008-03-21 21:14:38 +0000270 case Instruction::Trunc: return Expression::TRUNC;
271 case Instruction::ZExt: return Expression::ZEXT;
272 case Instruction::SExt: return Expression::SEXT;
273 case Instruction::FPToUI: return Expression::FPTOUI;
274 case Instruction::FPToSI: return Expression::FPTOSI;
275 case Instruction::UIToFP: return Expression::UITOFP;
276 case Instruction::SIToFP: return Expression::SITOFP;
277 case Instruction::FPTrunc: return Expression::FPTRUNC;
278 case Instruction::FPExt: return Expression::FPEXT;
279 case Instruction::PtrToInt: return Expression::PTRTOINT;
280 case Instruction::IntToPtr: return Expression::INTTOPTR;
281 case Instruction::BitCast: return Expression::BITCAST;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000282 }
283}
284
Owen Anderson09b83ba2007-10-18 19:39:33 +0000285Expression ValueTable::create_expression(CallInst* C) {
286 Expression e;
287
288 e.type = C->getType();
289 e.firstVN = 0;
290 e.secondVN = 0;
291 e.thirdVN = 0;
292 e.function = C->getCalledFunction();
293 e.opcode = Expression::CALL;
294
295 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
296 I != E; ++I)
Owen Anderson1e73f292008-04-11 05:11:49 +0000297 e.varargs.push_back(lookup_or_add(*I));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000298
299 return e;
300}
301
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000302Expression ValueTable::create_expression(BinaryOperator* BO) {
303 Expression e;
304
Owen Anderson1e73f292008-04-11 05:11:49 +0000305 e.firstVN = lookup_or_add(BO->getOperand(0));
306 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000307 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000308 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000309 e.type = BO->getType();
310 e.opcode = getOpcode(BO);
311
312 return e;
313}
314
315Expression ValueTable::create_expression(CmpInst* C) {
316 Expression e;
317
Owen Anderson1e73f292008-04-11 05:11:49 +0000318 e.firstVN = lookup_or_add(C->getOperand(0));
319 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000320 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000321 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000322 e.type = C->getType();
323 e.opcode = getOpcode(C);
324
325 return e;
326}
327
328Expression ValueTable::create_expression(CastInst* C) {
329 Expression e;
330
Owen Anderson1e73f292008-04-11 05:11:49 +0000331 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000332 e.secondVN = 0;
333 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000334 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000335 e.type = C->getType();
336 e.opcode = getOpcode(C);
337
338 return e;
339}
340
341Expression ValueTable::create_expression(ShuffleVectorInst* S) {
342 Expression e;
343
Owen Anderson1e73f292008-04-11 05:11:49 +0000344 e.firstVN = lookup_or_add(S->getOperand(0));
345 e.secondVN = lookup_or_add(S->getOperand(1));
346 e.thirdVN = lookup_or_add(S->getOperand(2));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000347 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000348 e.type = S->getType();
349 e.opcode = Expression::SHUFFLE;
350
351 return e;
352}
353
354Expression ValueTable::create_expression(ExtractElementInst* E) {
355 Expression e;
356
Owen Anderson1e73f292008-04-11 05:11:49 +0000357 e.firstVN = lookup_or_add(E->getOperand(0));
358 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000359 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000360 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000361 e.type = E->getType();
362 e.opcode = Expression::EXTRACT;
363
364 return e;
365}
366
367Expression ValueTable::create_expression(InsertElementInst* I) {
368 Expression e;
369
Owen Anderson1e73f292008-04-11 05:11:49 +0000370 e.firstVN = lookup_or_add(I->getOperand(0));
371 e.secondVN = lookup_or_add(I->getOperand(1));
372 e.thirdVN = lookup_or_add(I->getOperand(2));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000373 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000374 e.type = I->getType();
375 e.opcode = Expression::INSERT;
376
377 return e;
378}
379
380Expression ValueTable::create_expression(SelectInst* I) {
381 Expression e;
382
Owen Anderson1e73f292008-04-11 05:11:49 +0000383 e.firstVN = lookup_or_add(I->getCondition());
384 e.secondVN = lookup_or_add(I->getTrueValue());
385 e.thirdVN = lookup_or_add(I->getFalseValue());
Owen Anderson09b83ba2007-10-18 19:39:33 +0000386 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000387 e.type = I->getType();
388 e.opcode = Expression::SELECT;
389
390 return e;
391}
392
393Expression ValueTable::create_expression(GetElementPtrInst* G) {
394 Expression e;
Owen Anderson69057b82008-05-13 08:17:22 +0000395
Owen Anderson1e73f292008-04-11 05:11:49 +0000396 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000397 e.secondVN = 0;
398 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000399 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000400 e.type = G->getType();
401 e.opcode = Expression::GEP;
402
403 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
404 I != E; ++I)
Owen Anderson1e73f292008-04-11 05:11:49 +0000405 e.varargs.push_back(lookup_or_add(*I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000406
407 return e;
408}
409
410//===----------------------------------------------------------------------===//
411// ValueTable External Functions
412//===----------------------------------------------------------------------===//
413
Owen Anderson6a903bc2008-06-18 21:41:49 +0000414/// add - Insert a value into the table with a specified value number.
415void ValueTable::add(Value* V, uint32_t num) {
416 valueNumbering.insert(std::make_pair(V, num));
417}
418
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000419/// lookup_or_add - Returns the value number for the specified value, assigning
420/// it a new number if it did not have one before.
421uint32_t ValueTable::lookup_or_add(Value* V) {
422 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
423 if (VI != valueNumbering.end())
424 return VI->second;
425
Owen Anderson09b83ba2007-10-18 19:39:33 +0000426 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson1e73f292008-04-11 05:11:49 +0000427 if (AA->doesNotAccessMemory(C)) {
Owen Anderson09b83ba2007-10-18 19:39:33 +0000428 Expression e = create_expression(C);
429
430 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
431 if (EI != expressionNumbering.end()) {
432 valueNumbering.insert(std::make_pair(V, EI->second));
433 return EI->second;
434 } else {
435 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
436 valueNumbering.insert(std::make_pair(V, nextValueNumber));
437
438 return nextValueNumber++;
439 }
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000440 } else if (AA->onlyReadsMemory(C)) {
441 Expression e = create_expression(C);
442
Owen Anderson69057b82008-05-13 08:17:22 +0000443 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000444 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
445 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson69057b82008-05-13 08:17:22 +0000446 return nextValueNumber++;
447 }
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000448
Chris Lattner7f9c8a02008-11-29 02:29:27 +0000449 MemDepResult local_dep = MD->getDependency(C);
Owen Anderson17816b32008-05-13 23:18:30 +0000450
Chris Lattner0e3d6332008-12-05 21:04:20 +0000451 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000452 valueNumbering.insert(std::make_pair(V, nextValueNumber));
453 return nextValueNumber++;
Chris Lattner80c7d812008-11-30 23:39:23 +0000454 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000455
456 if (local_dep.isDef()) {
457 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
458
459 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000460 valueNumbering.insert(std::make_pair(V, nextValueNumber));
461 return nextValueNumber++;
462 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000463
Chris Lattner80c7d812008-11-30 23:39:23 +0000464 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
465 uint32_t c_vn = lookup_or_add(C->getOperand(i));
466 uint32_t cd_vn = lookup_or_add(local_cdep->getOperand(i));
467 if (c_vn != cd_vn) {
468 valueNumbering.insert(std::make_pair(V, nextValueNumber));
469 return nextValueNumber++;
470 }
471 }
472
473 uint32_t v = lookup_or_add(local_cdep);
474 valueNumbering.insert(std::make_pair(V, v));
475 return v;
Owen Anderson17816b32008-05-13 23:18:30 +0000476 }
Chris Lattner7e61daf2008-12-01 01:15:42 +0000477
Chris Lattner0e3d6332008-12-05 21:04:20 +0000478 // Non-local case.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000479 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner254314e2008-12-09 19:38:05 +0000480 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattner0e3d6332008-12-05 21:04:20 +0000481 // FIXME: call/call dependencies for readonly calls should return def, not
482 // clobber! Move the checking logic to MemDep!
Owen Anderson8c2391d2008-05-13 13:41:23 +0000483 CallInst* cdep = 0;
Owen Anderson69057b82008-05-13 08:17:22 +0000484
Chris Lattner80c7d812008-11-30 23:39:23 +0000485 // Check to see if we have a single dominating call instruction that is
486 // identical to C.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000487 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
488 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattner80c7d812008-11-30 23:39:23 +0000489 // Ignore non-local dependencies.
490 if (I->second.isNonLocal())
491 continue;
Owen Anderson69057b82008-05-13 08:17:22 +0000492
Chris Lattner80c7d812008-11-30 23:39:23 +0000493 // We don't handle non-depedencies. If we already have a call, reject
494 // instruction dependencies.
Chris Lattner0e3d6332008-12-05 21:04:20 +0000495 if (I->second.isClobber() || cdep != 0) {
Chris Lattner80c7d812008-11-30 23:39:23 +0000496 cdep = 0;
497 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000498 }
Chris Lattner80c7d812008-11-30 23:39:23 +0000499
500 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I->second.getInst());
501 // FIXME: All duplicated with non-local case.
502 if (NonLocalDepCall && DT->properlyDominates(I->first, C->getParent())){
503 cdep = NonLocalDepCall;
504 continue;
505 }
506
507 cdep = 0;
508 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000509 }
510
Owen Anderson8c2391d2008-05-13 13:41:23 +0000511 if (!cdep) {
Owen Anderson69057b82008-05-13 08:17:22 +0000512 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000513 return nextValueNumber++;
514 }
515
Chris Lattner0e3d6332008-12-05 21:04:20 +0000516 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson69057b82008-05-13 08:17:22 +0000517 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000518 return nextValueNumber++;
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000519 }
Chris Lattner80c7d812008-11-30 23:39:23 +0000520 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
521 uint32_t c_vn = lookup_or_add(C->getOperand(i));
522 uint32_t cd_vn = lookup_or_add(cdep->getOperand(i));
523 if (c_vn != cd_vn) {
524 valueNumbering.insert(std::make_pair(V, nextValueNumber));
525 return nextValueNumber++;
526 }
527 }
528
529 uint32_t v = lookup_or_add(cdep);
530 valueNumbering.insert(std::make_pair(V, v));
531 return v;
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000532
Owen Anderson09b83ba2007-10-18 19:39:33 +0000533 } else {
534 valueNumbering.insert(std::make_pair(V, nextValueNumber));
535 return nextValueNumber++;
536 }
537 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000538 Expression e = create_expression(BO);
539
540 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
541 if (EI != expressionNumbering.end()) {
542 valueNumbering.insert(std::make_pair(V, EI->second));
543 return EI->second;
544 } else {
545 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
546 valueNumbering.insert(std::make_pair(V, nextValueNumber));
547
548 return nextValueNumber++;
549 }
550 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
551 Expression e = create_expression(C);
552
553 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
554 if (EI != expressionNumbering.end()) {
555 valueNumbering.insert(std::make_pair(V, EI->second));
556 return EI->second;
557 } else {
558 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
559 valueNumbering.insert(std::make_pair(V, nextValueNumber));
560
561 return nextValueNumber++;
562 }
563 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
564 Expression e = create_expression(U);
565
566 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
567 if (EI != expressionNumbering.end()) {
568 valueNumbering.insert(std::make_pair(V, EI->second));
569 return EI->second;
570 } else {
571 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
572 valueNumbering.insert(std::make_pair(V, nextValueNumber));
573
574 return nextValueNumber++;
575 }
576 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
577 Expression e = create_expression(U);
578
579 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
580 if (EI != expressionNumbering.end()) {
581 valueNumbering.insert(std::make_pair(V, EI->second));
582 return EI->second;
583 } else {
584 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
585 valueNumbering.insert(std::make_pair(V, nextValueNumber));
586
587 return nextValueNumber++;
588 }
589 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
590 Expression e = create_expression(U);
591
592 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
593 if (EI != expressionNumbering.end()) {
594 valueNumbering.insert(std::make_pair(V, EI->second));
595 return EI->second;
596 } else {
597 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
598 valueNumbering.insert(std::make_pair(V, nextValueNumber));
599
600 return nextValueNumber++;
601 }
602 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
603 Expression e = create_expression(U);
604
605 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
606 if (EI != expressionNumbering.end()) {
607 valueNumbering.insert(std::make_pair(V, EI->second));
608 return EI->second;
609 } else {
610 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
611 valueNumbering.insert(std::make_pair(V, nextValueNumber));
612
613 return nextValueNumber++;
614 }
615 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
616 Expression e = create_expression(U);
617
618 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
619 if (EI != expressionNumbering.end()) {
620 valueNumbering.insert(std::make_pair(V, EI->second));
621 return EI->second;
622 } else {
623 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
624 valueNumbering.insert(std::make_pair(V, nextValueNumber));
625
626 return nextValueNumber++;
627 }
628 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
629 Expression e = create_expression(U);
630
631 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
632 if (EI != expressionNumbering.end()) {
633 valueNumbering.insert(std::make_pair(V, EI->second));
634 return EI->second;
635 } else {
636 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
637 valueNumbering.insert(std::make_pair(V, nextValueNumber));
638
639 return nextValueNumber++;
640 }
641 } else {
642 valueNumbering.insert(std::make_pair(V, nextValueNumber));
643 return nextValueNumber++;
644 }
645}
646
647/// lookup - Returns the value number of the specified value. Fails if
648/// the value has not yet been numbered.
649uint32_t ValueTable::lookup(Value* V) const {
650 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Chris Lattner2876a642008-03-21 21:14:38 +0000651 assert(VI != valueNumbering.end() && "Value not numbered?");
652 return VI->second;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000653}
654
655/// clear - Remove all entries from the ValueTable
656void ValueTable::clear() {
657 valueNumbering.clear();
658 expressionNumbering.clear();
659 nextValueNumber = 1;
660}
661
Owen Anderson10ffa862007-07-31 23:27:13 +0000662/// erase - Remove a value from the value numbering
663void ValueTable::erase(Value* V) {
664 valueNumbering.erase(V);
665}
666
Bill Wendling6b18a392008-12-22 21:36:08 +0000667/// verifyRemoved - Verify that the value is removed from all internal data
668/// structures.
669void ValueTable::verifyRemoved(const Value *V) const {
670 for (DenseMap<Value*, uint32_t>::iterator
671 I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
672 assert(I->first != V && "Inst still occurs in value numbering map!");
673 }
674}
675
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000676//===----------------------------------------------------------------------===//
Bill Wendling456e8852008-12-22 22:32:22 +0000677// GVN Pass
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000678//===----------------------------------------------------------------------===//
679
680namespace {
Owen Anderson1b3ea962008-06-20 01:15:47 +0000681 struct VISIBILITY_HIDDEN ValueNumberScope {
682 ValueNumberScope* parent;
683 DenseMap<uint32_t, Value*> table;
684
685 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
686 };
687}
688
689namespace {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000690
691 class VISIBILITY_HIDDEN GVN : public FunctionPass {
692 bool runOnFunction(Function &F);
693 public:
694 static char ID; // Pass identification, replacement for typeid
Dan Gohmana79db302008-09-04 17:05:41 +0000695 GVN() : FunctionPass(&ID) { }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000696
697 private:
Chris Lattner8541ede2008-12-01 00:40:32 +0000698 MemoryDependenceAnalysis *MD;
699 DominatorTree *DT;
700
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000701 ValueTable VN;
Owen Anderson1b3ea962008-06-20 01:15:47 +0000702 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000703
Owen Anderson0cc1a762007-08-07 23:12:31 +0000704 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
705 PhiMapType phiMap;
706
707
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000708 // This transformation requires dominator postdominator info
709 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000710 AU.addRequired<DominatorTree>();
711 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000712 AU.addRequired<AliasAnalysis>();
Owen Anderson54e02192008-06-23 17:49:45 +0000713
714 AU.addPreserved<DominatorTree>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000715 AU.addPreserved<AliasAnalysis>();
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000716 }
717
718 // Helper fuctions
719 // FIXME: eliminate or document these better
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000720 bool processLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000721 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000722 bool processInstruction(Instruction* I,
Chris Lattner804209d2008-03-21 22:01:16 +0000723 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson9699a6e2007-08-02 18:16:06 +0000724 bool processNonLocalLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000725 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000726 bool processBlock(BasicBlock* BB);
Owen Andersone34c2392008-12-14 19:10:35 +0000727 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Anderson0ac1fc82007-08-02 17:56:05 +0000728 DenseMap<BasicBlock*, Value*> &Phis,
729 bool top_level = false);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000730 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson676070d2007-08-14 18:04:11 +0000731 bool iterateOnFunction(Function &F);
Owen Andersonf5023a72007-08-16 22:51:56 +0000732 Value* CollapsePhi(PHINode* p);
Owen Anderson4cd516b2007-09-16 08:04:16 +0000733 bool isSafeReplacement(PHINode* p, Instruction* inst);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000734 bool performPRE(Function& F);
Owen Anderson1b3ea962008-06-20 01:15:47 +0000735 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Anderson53d546e2008-07-15 16:28:06 +0000736 bool mergeBlockIntoPredecessor(BasicBlock* BB);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000737 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopese3127f32008-10-10 16:25:50 +0000738 void cleanupGlobalSets();
Bill Wendling6b18a392008-12-22 21:36:08 +0000739 void verifyRemoved(const Instruction *I) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000740 };
741
742 char GVN::ID = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000743}
744
745// createGVNPass - The public interface to this file...
746FunctionPass *llvm::createGVNPass() { return new GVN(); }
747
748static RegisterPass<GVN> X("gvn",
749 "Global Value Numbering");
750
Owen Anderson6a903bc2008-06-18 21:41:49 +0000751void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5e5599b2007-07-25 19:57:03 +0000752 printf("{\n");
Owen Anderson6a903bc2008-06-18 21:41:49 +0000753 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5e5599b2007-07-25 19:57:03 +0000754 E = d.end(); I != E; ++I) {
Owen Anderson6a903bc2008-06-18 21:41:49 +0000755 printf("%d\n", I->first);
Owen Anderson5e5599b2007-07-25 19:57:03 +0000756 I->second->dump();
757 }
758 printf("}\n");
759}
760
Owen Andersonf5023a72007-08-16 22:51:56 +0000761Value* GVN::CollapsePhi(PHINode* p) {
Owen Andersonf5023a72007-08-16 22:51:56 +0000762 Value* constVal = p->hasConstantValue();
Chris Lattner2876a642008-03-21 21:14:38 +0000763 if (!constVal) return 0;
Owen Andersonf5023a72007-08-16 22:51:56 +0000764
Chris Lattner2876a642008-03-21 21:14:38 +0000765 Instruction* inst = dyn_cast<Instruction>(constVal);
766 if (!inst)
767 return constVal;
768
Chris Lattner8541ede2008-12-01 00:40:32 +0000769 if (DT->dominates(inst, p))
Chris Lattner2876a642008-03-21 21:14:38 +0000770 if (isSafeReplacement(p, inst))
771 return inst;
Owen Andersonf5023a72007-08-16 22:51:56 +0000772 return 0;
773}
Owen Anderson5e5599b2007-07-25 19:57:03 +0000774
Owen Anderson4cd516b2007-09-16 08:04:16 +0000775bool GVN::isSafeReplacement(PHINode* p, Instruction* inst) {
776 if (!isa<PHINode>(inst))
777 return true;
778
779 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
780 UI != E; ++UI)
781 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
782 if (use_phi->getParent() == inst->getParent())
783 return false;
784
785 return true;
786}
787
Owen Andersondbf23cc2007-07-26 18:26:51 +0000788/// GetValueForBlock - Get the value to use within the specified basic block.
789/// available values are in Phis.
Owen Andersone34c2392008-12-14 19:10:35 +0000790Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner2876a642008-03-21 21:14:38 +0000791 DenseMap<BasicBlock*, Value*> &Phis,
792 bool top_level) {
Owen Andersondbf23cc2007-07-26 18:26:51 +0000793
794 // If we have already computed this value, return the previously computed val.
Owen Anderson2d19aae2007-08-03 19:59:35 +0000795 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
796 if (V != Phis.end() && !top_level) return V->second;
Owen Andersondbf23cc2007-07-26 18:26:51 +0000797
Owen Anderson6acc7822008-07-02 18:15:31 +0000798 // If the block is unreachable, just return undef, since this path
799 // can't actually occur at runtime.
Chris Lattner8541ede2008-12-01 00:40:32 +0000800 if (!DT->isReachableFromEntry(BB))
Owen Anderson47db9412009-07-22 00:24:57 +0000801 return Phis[BB] = BB->getContext().getUndef(orig->getType());
Owen Andersonb22a6402008-07-02 17:20:16 +0000802
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000803 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
804 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000805 Phis[BB] = ret;
806 return ret;
Owen Anderson774761c2007-08-03 11:03:26 +0000807 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000808
809 // Get the number of predecessors of this block so we can reserve space later.
810 // If there is already a PHI in it, use the #preds from it, otherwise count.
811 // Getting it from the PHI is constant time.
812 unsigned NumPreds;
813 if (PHINode *ExistingPN = dyn_cast<PHINode>(BB->begin()))
814 NumPreds = ExistingPN->getNumIncomingValues();
815 else
816 NumPreds = std::distance(pred_begin(BB), pred_end(BB));
Chris Lattner2876a642008-03-21 21:14:38 +0000817
Owen Andersondbf23cc2007-07-26 18:26:51 +0000818 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
819 // now, then get values to fill in the incoming values for the PHI.
Gabor Greife9ecc682008-04-06 20:25:17 +0000820 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
821 BB->begin());
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000822 PN->reserveOperandSpace(NumPreds);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000823
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000824 Phis.insert(std::make_pair(BB, PN));
Owen Andersond66e2852007-07-30 16:57:08 +0000825
Owen Andersondbf23cc2007-07-26 18:26:51 +0000826 // Fill in the incoming values for the block.
Owen Andersond58fa6b02007-07-31 17:43:14 +0000827 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
828 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Andersond58fa6b02007-07-31 17:43:14 +0000829 PN->addIncoming(val, *PI);
830 }
Chris Lattner2876a642008-03-21 21:14:38 +0000831
Chris Lattner8541ede2008-12-01 00:40:32 +0000832 VN.getAliasAnalysis()->copyValue(orig, PN);
Owen Andersond58fa6b02007-07-31 17:43:14 +0000833
Owen Anderson221a4362007-08-16 22:02:55 +0000834 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersonf5023a72007-08-16 22:51:56 +0000835 Value* v = CollapsePhi(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000836 if (!v) {
837 // Cache our phi construction results
Owen Andersone34c2392008-12-14 19:10:35 +0000838 if (LoadInst* L = dyn_cast<LoadInst>(orig))
839 phiMap[L->getPointerOperand()].insert(PN);
840 else
841 phiMap[orig].insert(PN);
842
Chris Lattner2876a642008-03-21 21:14:38 +0000843 return PN;
Owen Andersond58fa6b02007-07-31 17:43:14 +0000844 }
Owen Andersonf7928602008-05-12 20:15:55 +0000845
Chris Lattner2876a642008-03-21 21:14:38 +0000846 PN->replaceAllUsesWith(v);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +0000847 if (isa<PointerType>(v->getType()))
848 MD->invalidateCachedPointerInfo(v);
Chris Lattner2876a642008-03-21 21:14:38 +0000849
850 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
851 E = Phis.end(); I != E; ++I)
852 if (I->second == PN)
853 I->second = v;
854
Dan Gohman1ddf98a2009-07-25 01:43:01 +0000855 DEBUG(errs() << "GVN removed: " << *PN);
Chris Lattner8541ede2008-12-01 00:40:32 +0000856 MD->removeInstruction(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000857 PN->eraseFromParent();
Bill Wendling6b18a392008-12-22 21:36:08 +0000858 DEBUG(verifyRemoved(PN));
Chris Lattner2876a642008-03-21 21:14:38 +0000859
860 Phis[BB] = v;
861 return v;
Owen Anderson5e5599b2007-07-25 19:57:03 +0000862}
863
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000864/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
865/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000866/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
867/// map is actually a tri-state map with the following values:
868/// 0) we know the block *is not* fully available.
869/// 1) we know the block *is* fully available.
870/// 2) we do not know whether the block is fully available or not, but we are
871/// currently speculating that it will be.
872/// 3) we are speculating for this block and have used that to speculate for
873/// other blocks.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000874static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000875 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000876 // Optimistically assume that the block is fully available and check to see
877 // if we already know about this block in one lookup.
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000878 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
879 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000880
881 // If the entry already existed for this block, return the precomputed value.
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000882 if (!IV.second) {
883 // If this is a speculative "available" value, mark it as being used for
884 // speculation of other blocks.
885 if (IV.first->second == 2)
886 IV.first->second = 3;
887 return IV.first->second != 0;
888 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000889
890 // Otherwise, see if it is fully available in all predecessors.
891 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
892
893 // If this block has no predecessors, it isn't live-in here.
894 if (PI == PE)
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000895 goto SpeculationFailure;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000896
897 for (; PI != PE; ++PI)
898 // If the value isn't fully available in one of our predecessors, then it
899 // isn't fully available in this block either. Undo our previous
900 // optimistic assumption and bail out.
901 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000902 goto SpeculationFailure;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000903
904 return true;
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000905
906// SpeculationFailure - If we get here, we found out that this is not, after
907// all, a fully-available block. We have a problem if we speculated on this and
908// used the speculation to mark other blocks as available.
909SpeculationFailure:
910 char &BBVal = FullyAvailableBlocks[BB];
911
912 // If we didn't speculate on this, just return with it set to false.
913 if (BBVal == 2) {
914 BBVal = 0;
915 return false;
916 }
917
918 // If we did speculate on this value, we could have blocks set to 1 that are
919 // incorrect. Walk the (transitive) successors of this block and mark them as
920 // 0 if set to one.
921 SmallVector<BasicBlock*, 32> BBWorklist;
922 BBWorklist.push_back(BB);
923
924 while (!BBWorklist.empty()) {
925 BasicBlock *Entry = BBWorklist.pop_back_val();
926 // Note that this sets blocks to 0 (unavailable) if they happen to not
927 // already be in FullyAvailableBlocks. This is safe.
928 char &EntryVal = FullyAvailableBlocks[Entry];
929 if (EntryVal == 0) continue; // Already unavailable.
930
931 // Mark as unavailable.
932 EntryVal = 0;
933
934 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
935 BBWorklist.push_back(*I);
936 }
937
938 return false;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000939}
940
Owen Anderson221a4362007-08-16 22:02:55 +0000941/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
942/// non-local by performing PHI construction.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000943bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner804209d2008-03-21 22:01:16 +0000944 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000945 // Find the non-local dependencies of the load.
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000946 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
947 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
948 Deps);
Dan Gohman1ddf98a2009-07-25 01:43:01 +0000949 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: " << Deps.size() << *LI);
Owen Anderson5e5599b2007-07-25 19:57:03 +0000950
Owen Andersonb39e0de2008-08-26 22:07:42 +0000951 // If we had to process more than one hundred blocks to find the
952 // dependencies, this load isn't worth worrying about. Optimizing
953 // it will be too expensive.
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000954 if (Deps.size() > 100)
Owen Andersonb39e0de2008-08-26 22:07:42 +0000955 return false;
Chris Lattnerb6372932008-12-18 00:51:32 +0000956
957 // If we had a phi translation failure, we'll have a single entry which is a
958 // clobber in the current block. Reject this early.
Torok Edwinba93ea72009-06-17 18:48:18 +0000959 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
960 DEBUG(
Dan Gohman1ddf98a2009-07-25 01:43:01 +0000961 errs() << "GVN: non-local load ";
962 WriteAsOperand(errs(), LI);
963 errs() << " is clobbered by " << *Deps[0].second.getInst();
Torok Edwinba93ea72009-06-17 18:48:18 +0000964 );
Chris Lattnerb6372932008-12-18 00:51:32 +0000965 return false;
Torok Edwinba93ea72009-06-17 18:48:18 +0000966 }
Owen Andersonb39e0de2008-08-26 22:07:42 +0000967
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000968 // Filter out useless results (non-locals, etc). Keep track of the blocks
969 // where we have a value available in repl, also keep track of whether we see
970 // dependencies that produce an unknown value for the load (such as a call
971 // that could potentially clobber the load).
972 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
973 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Owen Anderson0cc1a762007-08-07 23:12:31 +0000974
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000975 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
976 BasicBlock *DepBB = Deps[i].first;
977 MemDepResult DepInfo = Deps[i].second;
Chris Lattner7e61daf2008-12-01 01:15:42 +0000978
Chris Lattner0e3d6332008-12-05 21:04:20 +0000979 if (DepInfo.isClobber()) {
980 UnavailableBlocks.push_back(DepBB);
981 continue;
982 }
983
984 Instruction *DepInst = DepInfo.getInst();
985
986 // Loading the allocation -> undef.
987 if (isa<AllocationInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000988 ValuesPerBlock.push_back(std::make_pair(DepBB,
Owen Anderson47db9412009-07-22 00:24:57 +0000989 DepBB->getContext().getUndef(LI->getType())));
Chris Lattner7e61daf2008-12-01 01:15:42 +0000990 continue;
991 }
Chris Lattner2876a642008-03-21 21:14:38 +0000992
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000993 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner9ce89952008-12-01 01:31:36 +0000994 // Reject loads and stores that are to the same address but are of
995 // different types.
996 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
997 // of bitfield access, it would be interesting to optimize for it at some
998 // point.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000999 if (S->getOperand(0)->getType() != LI->getType()) {
1000 UnavailableBlocks.push_back(DepBB);
1001 continue;
1002 }
Chris Lattner9ce89952008-12-01 01:31:36 +00001003
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001004 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattner9ce89952008-12-01 01:31:36 +00001005
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001006 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001007 if (LD->getType() != LI->getType()) {
1008 UnavailableBlocks.push_back(DepBB);
1009 continue;
1010 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001011 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5e5599b2007-07-25 19:57:03 +00001012 } else {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001013 UnavailableBlocks.push_back(DepBB);
1014 continue;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001015 }
Chris Lattner2876a642008-03-21 21:14:38 +00001016 }
Owen Anderson5e5599b2007-07-25 19:57:03 +00001017
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001018 // If we have no predecessors that produce a known value for this load, exit
1019 // early.
1020 if (ValuesPerBlock.empty()) return false;
1021
1022 // If all of the instructions we depend on produce a known value for this
1023 // load, then it is fully redundant and we can use PHI insertion to compute
1024 // its value. Insert PHIs and remove the fully redundant value now.
1025 if (UnavailableBlocks.empty()) {
1026 // Use cached PHI construction information from previous runs
1027 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001028 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001029 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1030 I != E; ++I) {
1031 if ((*I)->getParent() == LI->getParent()) {
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001032 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD #1: " << *LI);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001033 LI->replaceAllUsesWith(*I);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001034 if (isa<PointerType>((*I)->getType()))
1035 MD->invalidateCachedPointerInfo(*I);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001036 toErase.push_back(LI);
1037 NumGVNLoad++;
1038 return true;
1039 }
1040
1041 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Anderson0cc1a762007-08-07 23:12:31 +00001042 }
Chris Lattner2876a642008-03-21 21:14:38 +00001043
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001044 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001045
1046 DenseMap<BasicBlock*, Value*> BlockReplValues;
1047 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1048 // Perform PHI construction.
1049 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1050 LI->replaceAllUsesWith(v);
Chris Lattner69131fd2008-12-15 03:46:38 +00001051
Chris Lattner096f44d2009-02-12 07:00:35 +00001052 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001053 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001054 if (isa<PointerType>(v->getType()))
1055 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001056 toErase.push_back(LI);
1057 NumGVNLoad++;
1058 return true;
1059 }
1060
1061 if (!EnablePRE || !EnableLoadPRE)
1062 return false;
1063
1064 // Okay, we have *some* definitions of the value. This means that the value
1065 // is available in some of our (transitive) predecessors. Lets think about
1066 // doing PRE of this load. This will involve inserting a new load into the
1067 // predecessor when it's not available. We could do this in general, but
1068 // prefer to not increase code size. As such, we only do this when we know
1069 // that we only have to insert *one* load (which means we're basically moving
1070 // the load, not inserting a new one).
1071
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001072 SmallPtrSet<BasicBlock *, 4> Blockers;
1073 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1074 Blockers.insert(UnavailableBlocks[i]);
1075
1076 // Lets find first basic block with more than one predecessor. Walk backwards
1077 // through predecessors if needed.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001078 BasicBlock *LoadBB = LI->getParent();
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001079 BasicBlock *TmpBB = LoadBB;
1080
1081 bool isSinglePred = false;
Dale Johannesen81b64632009-06-17 20:48:23 +00001082 bool allSingleSucc = true;
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001083 while (TmpBB->getSinglePredecessor()) {
1084 isSinglePred = true;
1085 TmpBB = TmpBB->getSinglePredecessor();
1086 if (!TmpBB) // If haven't found any, bail now.
1087 return false;
1088 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1089 return false;
1090 if (Blockers.count(TmpBB))
1091 return false;
Dale Johannesen81b64632009-06-17 20:48:23 +00001092 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1093 allSingleSucc = false;
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001094 }
1095
1096 assert(TmpBB);
1097 LoadBB = TmpBB;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001098
1099 // If we have a repl set with LI itself in it, this means we have a loop where
1100 // at least one of the values is LI. Since this means that we won't be able
1101 // to eliminate LI even if we insert uses in the other predecessors, we will
1102 // end up increasing code size. Reject this by scanning for LI.
1103 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1104 if (ValuesPerBlock[i].second == LI)
1105 return false;
1106
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001107 if (isSinglePred) {
1108 bool isHot = false;
1109 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1110 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
1111 // "Hot" Instruction is in some loop (because it dominates its dep.
1112 // instruction).
1113 if (DT->dominates(LI, I)) {
1114 isHot = true;
1115 break;
1116 }
1117
1118 // We are interested only in "hot" instructions. We don't want to do any
1119 // mis-optimizations here.
1120 if (!isHot)
1121 return false;
1122 }
1123
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001124 // Okay, we have some hope :). Check to see if the loaded value is fully
1125 // available in all but one predecessor.
1126 // FIXME: If we could restructure the CFG, we could make a common pred with
1127 // all the preds that don't have an available LI and insert a new load into
1128 // that one block.
1129 BasicBlock *UnavailablePred = 0;
1130
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001131 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001132 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1133 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1134 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1135 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1136
1137 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1138 PI != E; ++PI) {
1139 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1140 continue;
1141
1142 // If this load is not available in multiple predecessors, reject it.
1143 if (UnavailablePred && UnavailablePred != *PI)
1144 return false;
1145 UnavailablePred = *PI;
1146 }
1147
1148 assert(UnavailablePred != 0 &&
1149 "Fully available value should be eliminated above!");
1150
1151 // If the loaded pointer is PHI node defined in this block, do PHI translation
1152 // to get its value in the predecessor.
1153 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
1154
1155 // Make sure the value is live in the predecessor. If it was defined by a
1156 // non-PHI instruction in this block, we don't know how to recompute it above.
1157 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1158 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
Daniel Dunbar0dd5e1e2009-07-25 00:23:56 +00001159 DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
1160 << *LPInst << *LI << "\n");
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001161 return false;
1162 }
1163
1164 // We don't currently handle critical edges :(
1165 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbar0dd5e1e2009-07-25 00:23:56 +00001166 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
1167 << UnavailablePred->getName() << "': " << *LI);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001168 return false;
Owen Anderson0cc1a762007-08-07 23:12:31 +00001169 }
Dale Johannesen81b64632009-06-17 20:48:23 +00001170
1171 // Make sure it is valid to move this load here. We have to watch out for:
1172 // @1 = getelementptr (i8* p, ...
1173 // test p and branch if == 0
1174 // load @1
1175 // It is valid to have the getelementptr before the test, even if p can be 0,
1176 // as getelementptr only does address arithmetic.
1177 // If we are not pushing the value through any multiple-successor blocks
1178 // we do not have this case. Otherwise, check that the load is safe to
1179 // put anywhere; this can be improved, but should be conservatively safe.
1180 if (!allSingleSucc &&
1181 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
1182 return false;
1183
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001184 // Okay, we can eliminate this load by inserting a reload in the predecessor
1185 // and using PHI construction to get the value in the other predecessors, do
1186 // it.
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001187 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001188
1189 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1190 LI->getAlignment(),
1191 UnavailablePred->getTerminator());
1192
Owen Anderson04cfdd32009-05-29 05:37:54 +00001193 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1194 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1195 I != E; ++I)
1196 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
1197
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001198 DenseMap<BasicBlock*, Value*> BlockReplValues;
1199 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1200 BlockReplValues[UnavailablePred] = NewLoad;
1201
1202 // Perform PHI construction.
1203 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1204 LI->replaceAllUsesWith(v);
Chris Lattner096f44d2009-02-12 07:00:35 +00001205 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001206 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001207 if (isa<PointerType>(v->getType()))
1208 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001209 toErase.push_back(LI);
1210 NumPRELoad++;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001211 return true;
1212}
1213
Owen Anderson221a4362007-08-16 22:02:55 +00001214/// processLoad - Attempt to eliminate a load, first by eliminating it
1215/// locally, and then attempting non-local elimination if that fails.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001216bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1217 if (L->isVolatile())
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001218 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001219
1220 Value* pointer = L->getPointerOperand();
Chris Lattner0e3d6332008-12-05 21:04:20 +00001221
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001222 // ... to a pointer that has been loaded from before...
Chris Lattner8541ede2008-12-01 00:40:32 +00001223 MemDepResult dep = MD->getDependency(L);
Owen Andersona7b220f2007-08-14 17:59:48 +00001224
Chris Lattner0e3d6332008-12-05 21:04:20 +00001225 // If the value isn't available, don't do anything!
Torok Edwin72070282009-05-29 09:46:03 +00001226 if (dep.isClobber()) {
1227 DEBUG(
1228 // fast print dep, using operator<< on instruction would be too slow
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001229 errs() << "GVN: load ";
1230 WriteAsOperand(errs(), L);
Torok Edwin72070282009-05-29 09:46:03 +00001231 Instruction *I = dep.getInst();
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001232 errs() << " is clobbered by " << *I;
Torok Edwin72070282009-05-29 09:46:03 +00001233 );
Chris Lattner0e3d6332008-12-05 21:04:20 +00001234 return false;
Torok Edwin72070282009-05-29 09:46:03 +00001235 }
Chris Lattner0e3d6332008-12-05 21:04:20 +00001236
1237 // If it is defined in another block, try harder.
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001238 if (dep.isNonLocal())
Chris Lattner0e3d6332008-12-05 21:04:20 +00001239 return processNonLocalLoad(L, toErase);
Eli Friedman716c10c2008-02-12 12:08:14 +00001240
Chris Lattner0e3d6332008-12-05 21:04:20 +00001241 Instruction *DepInst = dep.getInst();
1242 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1243 // Only forward substitute stores to loads of the same type.
1244 // FIXME: Could do better!
1245 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1246 return false;
1247
1248 // Remove it!
1249 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001250 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1251 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattner0e3d6332008-12-05 21:04:20 +00001252 toErase.push_back(L);
1253 NumGVNLoad++;
1254 return true;
1255 }
1256
1257 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1258 // Only forward substitute stores to loads of the same type.
1259 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1260 if (DepLI->getType() != L->getType())
1261 return false;
1262
1263 // Remove it!
1264 L->replaceAllUsesWith(DepLI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001265 if (isa<PointerType>(DepLI->getType()))
1266 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner0e3d6332008-12-05 21:04:20 +00001267 toErase.push_back(L);
1268 NumGVNLoad++;
1269 return true;
1270 }
1271
Chris Lattner3ff6d012008-11-30 01:39:32 +00001272 // If this load really doesn't depend on anything, then we must be loading an
1273 // undef value. This can happen when loading for a fresh allocation with no
1274 // intervening stores, for example.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001275 if (isa<AllocationInst>(DepInst)) {
Owen Anderson47db9412009-07-22 00:24:57 +00001276 L->replaceAllUsesWith(DepInst->getContext().getUndef(L->getType()));
Chris Lattner3ff6d012008-11-30 01:39:32 +00001277 toErase.push_back(L);
Chris Lattner3ff6d012008-11-30 01:39:32 +00001278 NumGVNLoad++;
Chris Lattner0e3d6332008-12-05 21:04:20 +00001279 return true;
Eli Friedman716c10c2008-02-12 12:08:14 +00001280 }
1281
Chris Lattner0e3d6332008-12-05 21:04:20 +00001282 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001283}
1284
Owen Anderson1b3ea962008-06-20 01:15:47 +00001285Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Anderson54e02192008-06-23 17:49:45 +00001286 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1287 if (I == localAvail.end())
1288 return 0;
1289
1290 ValueNumberScope* locals = I->second;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001291
1292 while (locals) {
1293 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1294 if (I != locals->table.end())
1295 return I->second;
1296 else
1297 locals = locals->parent;
1298 }
1299
1300 return 0;
1301}
1302
Owen Andersonbfe133e2008-12-15 02:03:00 +00001303/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
1304/// by inheritance from the dominator fails, see if we can perform phi
1305/// construction to eliminate the redundancy.
1306Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1307 BasicBlock* BaseBlock = orig->getParent();
1308
1309 SmallPtrSet<BasicBlock*, 4> Visited;
1310 SmallVector<BasicBlock*, 8> Stack;
1311 Stack.push_back(BaseBlock);
1312
1313 DenseMap<BasicBlock*, Value*> Results;
1314
1315 // Walk backwards through our predecessors, looking for instances of the
1316 // value number we're looking for. Instances are recorded in the Results
1317 // map, which is then used to perform phi construction.
1318 while (!Stack.empty()) {
1319 BasicBlock* Current = Stack.back();
1320 Stack.pop_back();
1321
1322 // If we've walked all the way to a proper dominator, then give up. Cases
1323 // where the instance is in the dominator will have been caught by the fast
1324 // path, and any cases that require phi construction further than this are
1325 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1326 // time improvement.
1327 if (DT->properlyDominates(Current, orig->getParent())) return 0;
1328
1329 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1330 localAvail.find(Current);
1331 if (LA == localAvail.end()) return 0;
Chris Lattner73d7fe52009-01-19 22:00:18 +00001332 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Andersonbfe133e2008-12-15 02:03:00 +00001333
1334 if (V != LA->second->table.end()) {
1335 // Found an instance, record it.
1336 Results.insert(std::make_pair(Current, V->second));
1337 continue;
1338 }
1339
1340 // If we reach the beginning of the function, then give up.
1341 if (pred_begin(Current) == pred_end(Current))
1342 return 0;
1343
1344 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1345 PI != PE; ++PI)
1346 if (Visited.insert(*PI))
1347 Stack.push_back(*PI);
1348 }
1349
1350 // If we didn't find instances, give up. Otherwise, perform phi construction.
1351 if (Results.size() == 0)
1352 return 0;
1353 else
1354 return GetValueForBlock(BaseBlock, orig, Results, true);
1355}
1356
Owen Anderson398602a2007-08-14 18:16:29 +00001357/// processInstruction - When calculating availability, handle an instruction
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001358/// by inserting it into the appropriate sets
Owen Andersonaccdca12008-06-12 19:25:32 +00001359bool GVN::processInstruction(Instruction *I,
Chris Lattner804209d2008-03-21 22:01:16 +00001360 SmallVectorImpl<Instruction*> &toErase) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001361 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001362 bool changed = processLoad(L, toErase);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001363
1364 if (!changed) {
1365 unsigned num = VN.lookup_or_add(L);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001366 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001367 }
1368
1369 return changed;
1370 }
1371
Owen Anderson3ea90a72008-07-03 17:44:33 +00001372 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001373 unsigned num = VN.lookup_or_add(I);
Chris Lattner804209d2008-03-21 22:01:16 +00001374
Owen Anderson98f912b2009-04-01 23:53:49 +00001375 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1376 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1377
1378 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1379 return false;
1380
1381 Value* branchCond = BI->getCondition();
1382 uint32_t condVN = VN.lookup_or_add(branchCond);
1383
1384 BasicBlock* trueSucc = BI->getSuccessor(0);
1385 BasicBlock* falseSucc = BI->getSuccessor(1);
1386
1387 if (trueSucc->getSinglePredecessor())
Owen Anderson47db9412009-07-22 00:24:57 +00001388 localAvail[trueSucc]->table[condVN] = trueSucc->getContext().getTrue();
Owen Anderson98f912b2009-04-01 23:53:49 +00001389 if (falseSucc->getSinglePredecessor())
Owen Anderson47db9412009-07-22 00:24:57 +00001390 localAvail[falseSucc]->table[condVN] = trueSucc->getContext().getFalse();
Owen Anderson98f912b2009-04-01 23:53:49 +00001391
1392 return false;
1393
Owen Anderson0c1e6342008-04-07 09:59:07 +00001394 // Allocations are always uniquely numbered, so we can save time and memory
Owen Anderson98f912b2009-04-01 23:53:49 +00001395 // by fast failing them.
1396 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001397 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson0c1e6342008-04-07 09:59:07 +00001398 return false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001399 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001400
Owen Anderson221a4362007-08-16 22:02:55 +00001401 // Collapse PHI nodes
Owen Andersonbc271a02007-08-14 18:33:27 +00001402 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001403 Value* constVal = CollapsePhi(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001404
1405 if (constVal) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001406 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1407 PI != PE; ++PI)
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001408 PI->second.erase(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001409
Owen Andersonf5023a72007-08-16 22:51:56 +00001410 p->replaceAllUsesWith(constVal);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001411 if (isa<PointerType>(constVal->getType()))
1412 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson164274e2008-12-23 00:49:51 +00001413 VN.erase(p);
1414
Owen Andersonf5023a72007-08-16 22:51:56 +00001415 toErase.push_back(p);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001416 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001417 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonbc271a02007-08-14 18:33:27 +00001418 }
Owen Anderson3ea90a72008-07-03 17:44:33 +00001419
1420 // If the number we were assigned was a brand new VN, then we don't
1421 // need to do a lookup to see if the number already exists
1422 // somewhere in the domtree: it can't!
1423 } else if (num == nextNum) {
1424 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1425
Owen Andersonbfe133e2008-12-15 02:03:00 +00001426 // Perform fast-path value-number based elimination of values inherited from
1427 // dominators.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001428 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson086b2c42007-12-08 01:37:09 +00001429 // Remove it!
Owen Anderson10ffa862007-07-31 23:27:13 +00001430 VN.erase(I);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001431 I->replaceAllUsesWith(repl);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001432 if (isa<PointerType>(repl->getType()))
1433 MD->invalidateCachedPointerInfo(repl);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001434 toErase.push_back(I);
1435 return true;
Owen Andersonbfe133e2008-12-15 02:03:00 +00001436
1437#if 0
1438 // Perform slow-pathvalue-number based elimination with phi construction.
1439 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1440 // Remove it!
1441 VN.erase(I);
1442 I->replaceAllUsesWith(repl);
1443 if (isa<PointerType>(repl->getType()))
1444 MD->invalidateCachedPointerInfo(repl);
1445 toErase.push_back(I);
1446 return true;
1447#endif
Owen Anderson3ea90a72008-07-03 17:44:33 +00001448 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001449 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001450 }
1451
1452 return false;
1453}
1454
Bill Wendling456e8852008-12-22 22:32:22 +00001455/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson676070d2007-08-14 18:04:11 +00001456bool GVN::runOnFunction(Function& F) {
Chris Lattner8541ede2008-12-01 00:40:32 +00001457 MD = &getAnalysis<MemoryDependenceAnalysis>();
1458 DT = &getAnalysis<DominatorTree>();
Owen Andersonf7928602008-05-12 20:15:55 +00001459 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner8541ede2008-12-01 00:40:32 +00001460 VN.setMemDep(MD);
1461 VN.setDomTree(DT);
Owen Anderson09b83ba2007-10-18 19:39:33 +00001462
Owen Anderson676070d2007-08-14 18:04:11 +00001463 bool changed = false;
1464 bool shouldContinue = true;
1465
Owen Andersonac310962008-07-16 17:52:31 +00001466 // Merge unconditional branches, allowing PRE to catch more
1467 // optimization opportunities.
1468 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1469 BasicBlock* BB = FI;
1470 ++FI;
Owen Andersonc0623812008-07-17 00:01:40 +00001471 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1472 if (removedBlock) NumGVNBlocks++;
1473
1474 changed |= removedBlock;
Owen Andersonac310962008-07-16 17:52:31 +00001475 }
1476
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001477 unsigned Iteration = 0;
1478
Owen Anderson676070d2007-08-14 18:04:11 +00001479 while (shouldContinue) {
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001480 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Owen Anderson676070d2007-08-14 18:04:11 +00001481 shouldContinue = iterateOnFunction(F);
1482 changed |= shouldContinue;
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001483 ++Iteration;
Owen Anderson676070d2007-08-14 18:04:11 +00001484 }
1485
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001486 if (EnablePRE) {
Owen Anderson2fbfb702008-09-03 23:06:07 +00001487 bool PREChanged = true;
1488 while (PREChanged) {
1489 PREChanged = performPRE(F);
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001490 changed |= PREChanged;
Owen Anderson2fbfb702008-09-03 23:06:07 +00001491 }
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001492 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001493 // FIXME: Should perform GVN again after PRE does something. PRE can move
1494 // computations into blocks where they become fully redundant. Note that
1495 // we can't do this until PRE's critical edge splitting updates memdep.
1496 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopese3127f32008-10-10 16:25:50 +00001497
1498 cleanupGlobalSets();
1499
Owen Anderson676070d2007-08-14 18:04:11 +00001500 return changed;
1501}
1502
1503
Owen Andersonbfe133e2008-12-15 02:03:00 +00001504bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001505 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1506 // incrementing BI before processing an instruction).
Owen Andersonaccdca12008-06-12 19:25:32 +00001507 SmallVector<Instruction*, 8> toErase;
Owen Andersonaccdca12008-06-12 19:25:32 +00001508 bool changed_function = false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001509
Owen Andersonaccdca12008-06-12 19:25:32 +00001510 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1511 BI != BE;) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001512 changed_function |= processInstruction(BI, toErase);
Owen Andersonaccdca12008-06-12 19:25:32 +00001513 if (toErase.empty()) {
1514 ++BI;
1515 continue;
1516 }
1517
1518 // If we need some instructions deleted, do it now.
1519 NumGVNInstr += toErase.size();
1520
1521 // Avoid iterator invalidation.
1522 bool AtStart = BI == BB->begin();
1523 if (!AtStart)
1524 --BI;
1525
1526 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner8541ede2008-12-01 00:40:32 +00001527 E = toErase.end(); I != E; ++I) {
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001528 DEBUG(errs() << "GVN removed: " << **I);
Chris Lattner8541ede2008-12-01 00:40:32 +00001529 MD->removeInstruction(*I);
Owen Andersonaccdca12008-06-12 19:25:32 +00001530 (*I)->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001531 DEBUG(verifyRemoved(*I));
Chris Lattner8541ede2008-12-01 00:40:32 +00001532 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001533 toErase.clear();
Owen Andersonaccdca12008-06-12 19:25:32 +00001534
1535 if (AtStart)
1536 BI = BB->begin();
1537 else
1538 ++BI;
Owen Andersonaccdca12008-06-12 19:25:32 +00001539 }
1540
Owen Andersonaccdca12008-06-12 19:25:32 +00001541 return changed_function;
1542}
1543
Owen Anderson6a903bc2008-06-18 21:41:49 +00001544/// performPRE - Perform a purely local form of PRE that looks for diamond
1545/// control flow patterns and attempts to perform simple PRE at the join point.
1546bool GVN::performPRE(Function& F) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001547 bool Changed = false;
Owen Andersonfdf9f162008-06-19 19:54:19 +00001548 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001549 DenseMap<BasicBlock*, Value*> predMap;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001550 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1551 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1552 BasicBlock* CurrentBlock = *DI;
1553
1554 // Nothing to PRE in the entry block.
1555 if (CurrentBlock == &F.getEntryBlock()) continue;
1556
1557 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1558 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001559 Instruction *CurInst = BI++;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001560
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001561 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
John Criswell073e4d12009-03-10 15:04:53 +00001562 isa<PHINode>(CurInst) || (CurInst->getType() == Type::VoidTy) ||
Duncan Sands1efabaa2009-05-06 06:49:50 +00001563 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell073e4d12009-03-10 15:04:53 +00001564 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001565 continue;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001566
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001567 uint32_t valno = VN.lookup(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001568
1569 // Look for the predecessors for PRE opportunities. We're
1570 // only trying to solve the basic diamond case, where
1571 // a value is computed in the successor and one predecessor,
1572 // but not the other. We also explicitly disallow cases
1573 // where the successor is its own predecessor, because they're
1574 // more complicated to get right.
1575 unsigned numWith = 0;
1576 unsigned numWithout = 0;
1577 BasicBlock* PREPred = 0;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001578 predMap.clear();
1579
Owen Anderson6a903bc2008-06-18 21:41:49 +00001580 for (pred_iterator PI = pred_begin(CurrentBlock),
1581 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1582 // We're not interested in PRE where the block is its
Owen Anderson1b3ea962008-06-20 01:15:47 +00001583 // own predecessor, on in blocks with predecessors
1584 // that are not reachable.
1585 if (*PI == CurrentBlock) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001586 numWithout = 2;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001587 break;
1588 } else if (!localAvail.count(*PI)) {
1589 numWithout = 2;
1590 break;
1591 }
1592
1593 DenseMap<uint32_t, Value*>::iterator predV =
1594 localAvail[*PI]->table.find(valno);
1595 if (predV == localAvail[*PI]->table.end()) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001596 PREPred = *PI;
1597 numWithout++;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001598 } else if (predV->second == CurInst) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001599 numWithout = 2;
1600 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001601 predMap[*PI] = predV->second;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001602 numWith++;
1603 }
1604 }
1605
1606 // Don't do PRE when it might increase code size, i.e. when
1607 // we would need to insert instructions in more than one pred.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001608 if (numWithout != 1 || numWith == 0)
Owen Anderson6a903bc2008-06-18 21:41:49 +00001609 continue;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001610
Owen Andersonfdf9f162008-06-19 19:54:19 +00001611 // We can't do PRE safely on a critical edge, so instead we schedule
1612 // the edge to be split and perform the PRE the next time we iterate
1613 // on the function.
1614 unsigned succNum = 0;
1615 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1616 i != e; ++i)
Owen Anderson2fbfb702008-09-03 23:06:07 +00001617 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonfdf9f162008-06-19 19:54:19 +00001618 succNum = i;
1619 break;
1620 }
1621
1622 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1623 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Andersonfdf9f162008-06-19 19:54:19 +00001624 continue;
1625 }
1626
Owen Anderson6a903bc2008-06-18 21:41:49 +00001627 // Instantiate the expression the in predecessor that lacked it.
1628 // Because we are going top-down through the block, all value numbers
1629 // will be available in the predecessor by the time we need them. Any
1630 // that weren't original present will have been instantiated earlier
1631 // in this loop.
Owen Anderson47db9412009-07-22 00:24:57 +00001632 Instruction* PREInstr = CurInst->clone(CurInst->getContext());
Owen Anderson6a903bc2008-06-18 21:41:49 +00001633 bool success = true;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001634 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1635 Value *Op = PREInstr->getOperand(i);
1636 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1637 continue;
1638
1639 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1640 PREInstr->setOperand(i, V);
1641 } else {
1642 success = false;
1643 break;
Owen Anderson8e462e92008-07-11 20:05:13 +00001644 }
Owen Anderson6a903bc2008-06-18 21:41:49 +00001645 }
1646
1647 // Fail out if we encounter an operand that is not available in
1648 // the PRE predecessor. This is typically because of loads which
1649 // are not value numbered precisely.
1650 if (!success) {
1651 delete PREInstr;
Bill Wendling3c793442008-12-22 22:14:07 +00001652 DEBUG(verifyRemoved(PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001653 continue;
1654 }
1655
1656 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001657 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson1b3ea962008-06-20 01:15:47 +00001658 predMap[PREPred] = PREInstr;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001659 VN.add(PREInstr, valno);
1660 NumGVNPRE++;
1661
1662 // Update the availability map to include the new instruction.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001663 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001664
1665 // Create a PHI to make the value available in this block.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001666 PHINode* Phi = PHINode::Create(CurInst->getType(),
1667 CurInst->getName() + ".pre-phi",
Owen Anderson6a903bc2008-06-18 21:41:49 +00001668 CurrentBlock->begin());
1669 for (pred_iterator PI = pred_begin(CurrentBlock),
1670 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson1b3ea962008-06-20 01:15:47 +00001671 Phi->addIncoming(predMap[*PI], *PI);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001672
1673 VN.add(Phi, valno);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001674 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001675
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001676 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001677 if (isa<PointerType>(Phi->getType()))
1678 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001679 VN.erase(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001680
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001681 DEBUG(errs() << "GVN PRE removed: " << *CurInst);
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001682 MD->removeInstruction(CurInst);
1683 CurInst->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001684 DEBUG(verifyRemoved(CurInst));
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001685 Changed = true;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001686 }
1687 }
1688
Owen Andersonfdf9f162008-06-19 19:54:19 +00001689 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001690 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonfdf9f162008-06-19 19:54:19 +00001691 SplitCriticalEdge(I->first, I->second, this);
1692
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001693 return Changed || toSplit.size();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001694}
1695
Bill Wendling456e8852008-12-22 22:32:22 +00001696/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson676070d2007-08-14 18:04:11 +00001697bool GVN::iterateOnFunction(Function &F) {
Nuno Lopese3127f32008-10-10 16:25:50 +00001698 cleanupGlobalSets();
Chris Lattnerbeb216d2008-03-21 21:33:23 +00001699
Owen Anderson98f912b2009-04-01 23:53:49 +00001700 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1701 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1702 if (DI->getIDom())
1703 localAvail[DI->getBlock()] =
1704 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1705 else
1706 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1707 }
1708
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001709 // Top-down walk of the dominator tree
Owen Anderson6a903bc2008-06-18 21:41:49 +00001710 bool changed = false;
Owen Anderson03aacba2008-12-15 03:52:17 +00001711#if 0
1712 // Needed for value numbering with phi construction to work.
Owen Andersonbfe133e2008-12-15 02:03:00 +00001713 ReversePostOrderTraversal<Function*> RPOT(&F);
1714 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1715 RE = RPOT.end(); RI != RE; ++RI)
1716 changed |= processBlock(*RI);
Owen Anderson03aacba2008-12-15 03:52:17 +00001717#else
1718 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1719 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1720 changed |= processBlock(DI->getBlock());
1721#endif
1722
Owen Andersonac310962008-07-16 17:52:31 +00001723 return changed;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001724}
Nuno Lopese3127f32008-10-10 16:25:50 +00001725
1726void GVN::cleanupGlobalSets() {
1727 VN.clear();
1728 phiMap.clear();
1729
1730 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1731 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1732 delete I->second;
1733 localAvail.clear();
1734}
Bill Wendling6b18a392008-12-22 21:36:08 +00001735
1736/// verifyRemoved - Verify that the specified instruction does not occur in our
1737/// internal data structures.
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001738void GVN::verifyRemoved(const Instruction *Inst) const {
1739 VN.verifyRemoved(Inst);
Bill Wendling3c793442008-12-22 22:14:07 +00001740
1741 // Walk through the PHI map to make sure the instruction isn't hiding in there
1742 // somewhere.
1743 for (PhiMapType::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001744 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1745 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling3c793442008-12-22 22:14:07 +00001746
1747 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001748 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1749 assert(*II != Inst && "Inst is still a value in PHI map!");
1750 }
1751 }
1752
1753 // Walk through the value number scope to make sure the instruction isn't
1754 // ferreted away in it.
1755 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1756 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1757 const ValueNumberScope *VNS = I->second;
1758
1759 while (VNS) {
1760 for (DenseMap<uint32_t, Value*>::iterator
1761 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1762 assert(II->second != Inst && "Inst still in value numbering scope!");
1763 }
1764
1765 VNS = VNS->parent;
Bill Wendling3c793442008-12-22 22:14:07 +00001766 }
1767 }
Bill Wendling6b18a392008-12-22 21:36:08 +00001768}