blob: 36c90f519f2fb57e19406209e1827c2a7ce4246f [file] [log] [blame]
Chris Lattner159b98f2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Anderson85c40642007-07-24 17:55:58 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-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 Anderson85c40642007-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 Criswell6e0aa282009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman9aac1db2008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Anderson85c40642007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Anderson85c40642007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson5d72a422007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Anderson85c40642007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patela7379552009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Anderson24be4c12009-07-03 00:17:18 +000025#include "llvm/LLVMContext.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000026#include "llvm/Value.h"
Owen Anderson85c40642007-07-24 17:55:58 +000027#include "llvm/ADT/DenseMap.h"
28#include "llvm/ADT/DepthFirstIterator.h"
Owen Andersona03e7862008-12-15 02:03:00 +000029#include "llvm/ADT/PostOrderIterator.h"
Owen Anderson85c40642007-07-24 17:55:58 +000030#include "llvm/ADT/SmallPtrSet.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/ADT/Statistic.h"
Owen Anderson5e9366f2007-10-18 19:39:33 +000033#include "llvm/Analysis/Dominators.h"
34#include "llvm/Analysis/AliasAnalysis.h"
Owen Anderson85c40642007-07-24 17:55:58 +000035#include "llvm/Analysis/MemoryDependenceAnalysis.h"
36#include "llvm/Support/CFG.h"
Owen Andersona2bf7662008-06-19 19:57:25 +000037#include "llvm/Support/CommandLine.h"
Chris Lattner9c5be3c2008-03-29 04:36:18 +000038#include "llvm/Support/Debug.h"
Edwin Török675d5622009-07-11 20:10:48 +000039#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar005975c2009-07-25 00:23:56 +000040#include "llvm/Support/raw_ostream.h"
Owen Andersonec747c42008-06-19 19:54:19 +000041#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesena19b67f2009-06-17 20:48:23 +000042#include "llvm/Transforms/Utils/Local.h"
Duncan Sands05f68372008-10-08 07:23:46 +000043#include <cstdio>
Owen Anderson85c40642007-07-24 17:55:58 +000044using namespace llvm;
45
Bill Wendling3858cae2008-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 Anderson7558f202008-07-15 16:28:06 +000049STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3858cae2008-12-22 22:14:07 +000050STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner1be83222008-03-22 04:13:49 +000051
Evan Cheng019a2e12008-06-20 01:01:07 +000052static cl::opt<bool> EnablePRE("enable-pre",
Owen Anderson3a053612008-07-17 19:41:00 +000053 cl::init(true), cl::Hidden);
Dan Gohman828f89f2009-06-15 18:30:15 +000054static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersona2bf7662008-06-19 19:57:25 +000055
Owen Anderson85c40642007-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 {
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +000064 struct Expression {
Dan Gohman7ce405e2009-06-04 22:49:04 +000065 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
66 UDIV, SDIV, FDIV, UREM, SREM,
Owen Anderson85c40642007-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 Anderson771d1122008-05-13 08:17:22 +000075 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Andersonb0cc5ed2008-06-19 17:25:39 +000076 EMPTY, TOMBSTONE };
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +000084 Value* function;
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +000096 else if (function != other.function)
97 return false;
Owen Anderson85c40642007-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 Wendling9b5d4b72008-12-22 22:16:31 +0000117 return !(*this == other);
Owen Anderson85c40642007-07-24 17:55:58 +0000118 }
119 };
120
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000121 class ValueTable {
Owen Anderson85c40642007-07-24 17:55:58 +0000122 private:
123 DenseMap<Value*, uint32_t> valueNumbering;
124 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000125 AliasAnalysis* AA;
126 MemoryDependenceAnalysis* MD;
127 DominatorTree* DT;
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +0000142 Expression create_expression(CallInst* C);
Owen Anderson771d1122008-05-13 08:17:22 +0000143 Expression create_expression(Constant* C);
Owen Anderson85c40642007-07-24 17:55:58 +0000144 public:
Dan Gohman936a6522009-04-01 16:37:47 +0000145 ValueTable() : nextValueNumber(1) { }
Owen Anderson85c40642007-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 Andersonbcf2bd52008-05-12 20:15:55 +0000152 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner02ca4422008-12-01 00:40:32 +0000153 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000154 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
155 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson8a8d13c2008-07-03 17:44:33 +0000156 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling2a023742008-12-22 21:36:08 +0000157 void verifyRemoved(const Value *) const;
Owen Anderson85c40642007-07-24 17:55:58 +0000158 };
159}
160
161namespace llvm {
Chris Lattner92eea072007-09-17 18:34:04 +0000162template <> struct DenseMapInfo<Expression> {
Owen Andersonbf8a3eb2007-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 Anderson85c40642007-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 Korobeynikov8522e1c2008-02-20 11:26:25 +0000178 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
179 (unsigned)((uintptr_t)e.type >> 9)) +
180 hash * 37;
Owen Anderson85c40642007-07-24 17:55:58 +0000181
Owen Andersonbf8a3eb2007-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 Anderson85c40642007-07-24 17:55:58 +0000184 hash = *I + hash * 37;
185
Anton Korobeynikov8522e1c2008-02-20 11:26:25 +0000186 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
187 (unsigned)((uintptr_t)e.function >> 9)) +
188 hash * 37;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000189
Owen Anderson85c40642007-07-24 17:55:58 +0000190 return hash;
191 }
Chris Lattner92eea072007-09-17 18:34:04 +0000192 static bool isEqual(const Expression &LHS, const Expression &RHS) {
193 return LHS == RHS;
194 }
Owen Anderson85c40642007-07-24 17:55:58 +0000195 static bool isPod() { return true; }
196};
197}
198
199//===----------------------------------------------------------------------===//
200// ValueTable Internal Functions
201//===----------------------------------------------------------------------===//
Chris Lattner3d7103e2008-03-21 21:14:38 +0000202Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson85c40642007-07-24 17:55:58 +0000203 switch(BO->getOpcode()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000204 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000205 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner3d7103e2008-03-21 21:14:38 +0000206 case Instruction::Add: return Expression::ADD;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000207 case Instruction::FAdd: return Expression::FADD;
Chris Lattner3d7103e2008-03-21 21:14:38 +0000208 case Instruction::Sub: return Expression::SUB;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000209 case Instruction::FSub: return Expression::FSUB;
Chris Lattner3d7103e2008-03-21 21:14:38 +0000210 case Instruction::Mul: return Expression::MUL;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000211 case Instruction::FMul: return Expression::FMUL;
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000224 }
225}
226
227Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewycky8f5253b2009-07-08 03:04:38 +0000228 if (isa<ICmpInst>(C)) {
Owen Anderson85c40642007-07-24 17:55:58 +0000229 switch (C->getPredicate()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000230 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000231 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000242 }
Nick Lewycky8f5253b2009-07-08 03:04:38 +0000243 } else {
244 switch (C->getPredicate()) {
245 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000246 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewycky8f5253b2009-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 Anderson85c40642007-07-24 17:55:58 +0000262 }
263}
264
Chris Lattner3d7103e2008-03-21 21:14:38 +0000265Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Anderson85c40642007-07-24 17:55:58 +0000266 switch(C->getOpcode()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000267 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000268 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000281 }
282}
283
Owen Anderson5e9366f2007-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 Anderson07f478f2008-04-11 05:11:49 +0000296 e.varargs.push_back(lookup_or_add(*I));
Owen Anderson5e9366f2007-10-18 19:39:33 +0000297
298 return e;
299}
300
Owen Anderson85c40642007-07-24 17:55:58 +0000301Expression ValueTable::create_expression(BinaryOperator* BO) {
302 Expression e;
303
Owen Anderson07f478f2008-04-11 05:11:49 +0000304 e.firstVN = lookup_or_add(BO->getOperand(0));
305 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000306 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000307 e.function = 0;
Owen Anderson85c40642007-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 Anderson07f478f2008-04-11 05:11:49 +0000317 e.firstVN = lookup_or_add(C->getOperand(0));
318 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000319 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000320 e.function = 0;
Owen Anderson85c40642007-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 Anderson07f478f2008-04-11 05:11:49 +0000330 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Anderson85c40642007-07-24 17:55:58 +0000331 e.secondVN = 0;
332 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000333 e.function = 0;
Owen Anderson85c40642007-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 Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000346 e.function = 0;
Owen Anderson85c40642007-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 Anderson07f478f2008-04-11 05:11:49 +0000356 e.firstVN = lookup_or_add(E->getOperand(0));
357 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000358 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000359 e.function = 0;
Owen Anderson85c40642007-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 Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000372 e.function = 0;
Owen Anderson85c40642007-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 Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000385 e.function = 0;
Owen Anderson85c40642007-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 Anderson771d1122008-05-13 08:17:22 +0000394
Owen Anderson07f478f2008-04-11 05:11:49 +0000395 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Anderson85c40642007-07-24 17:55:58 +0000396 e.secondVN = 0;
397 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000398 e.function = 0;
Owen Anderson85c40642007-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 Anderson07f478f2008-04-11 05:11:49 +0000404 e.varargs.push_back(lookup_or_add(*I));
Owen Anderson85c40642007-07-24 17:55:58 +0000405
406 return e;
407}
408
409//===----------------------------------------------------------------------===//
410// ValueTable External Functions
411//===----------------------------------------------------------------------===//
412
Owen Andersone6b4ff82008-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 Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +0000425 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson07f478f2008-04-11 05:11:49 +0000426 if (AA->doesNotAccessMemory(C)) {
Owen Anderson5e9366f2007-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 Andersona0b2b8e2008-04-17 05:36:50 +0000439 } else if (AA->onlyReadsMemory(C)) {
440 Expression e = create_expression(C);
441
Owen Anderson771d1122008-05-13 08:17:22 +0000442 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000443 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
444 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson771d1122008-05-13 08:17:22 +0000445 return nextValueNumber++;
446 }
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000447
Chris Lattner12cafbf2008-11-29 02:29:27 +0000448 MemDepResult local_dep = MD->getDependency(C);
Owen Anderson64fcc592008-05-13 23:18:30 +0000449
Chris Lattner4531da82008-12-05 21:04:20 +0000450 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Anderson64fcc592008-05-13 23:18:30 +0000451 valueNumbering.insert(std::make_pair(V, nextValueNumber));
452 return nextValueNumber++;
Chris Lattnerd33b6662008-11-30 23:39:23 +0000453 }
Chris Lattner4531da82008-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 Anderson64fcc592008-05-13 23:18:30 +0000459 valueNumbering.insert(std::make_pair(V, nextValueNumber));
460 return nextValueNumber++;
461 }
Chris Lattner4531da82008-12-05 21:04:20 +0000462
Chris Lattnerd33b6662008-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 Anderson64fcc592008-05-13 23:18:30 +0000475 }
Chris Lattner46876282008-12-01 01:15:42 +0000476
Chris Lattner4531da82008-12-05 21:04:20 +0000477 // Non-local case.
Chris Lattner46876282008-12-01 01:15:42 +0000478 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner35d5cf52008-12-09 19:38:05 +0000479 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattner4531da82008-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 Anderson3ebaca72008-05-13 13:41:23 +0000482 CallInst* cdep = 0;
Owen Anderson771d1122008-05-13 08:17:22 +0000483
Chris Lattnerd33b6662008-11-30 23:39:23 +0000484 // Check to see if we have a single dominating call instruction that is
485 // identical to C.
Chris Lattner46876282008-12-01 01:15:42 +0000486 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
487 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattnerd33b6662008-11-30 23:39:23 +0000488 // Ignore non-local dependencies.
489 if (I->second.isNonLocal())
490 continue;
Owen Anderson771d1122008-05-13 08:17:22 +0000491
Chris Lattnerd33b6662008-11-30 23:39:23 +0000492 // We don't handle non-depedencies. If we already have a call, reject
493 // instruction dependencies.
Chris Lattner4531da82008-12-05 21:04:20 +0000494 if (I->second.isClobber() || cdep != 0) {
Chris Lattnerd33b6662008-11-30 23:39:23 +0000495 cdep = 0;
496 break;
Owen Anderson771d1122008-05-13 08:17:22 +0000497 }
Chris Lattnerd33b6662008-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 Anderson771d1122008-05-13 08:17:22 +0000508 }
509
Owen Anderson3ebaca72008-05-13 13:41:23 +0000510 if (!cdep) {
Owen Anderson771d1122008-05-13 08:17:22 +0000511 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000512 return nextValueNumber++;
513 }
514
Chris Lattner4531da82008-12-05 21:04:20 +0000515 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson771d1122008-05-13 08:17:22 +0000516 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000517 return nextValueNumber++;
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000518 }
Chris Lattnerd33b6662008-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 Andersona0b2b8e2008-04-17 05:36:50 +0000531
Owen Anderson5e9366f2007-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 Anderson85c40642007-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 Lattner3d7103e2008-03-21 21:14:38 +0000650 assert(VI != valueNumbering.end() && "Value not numbered?");
651 return VI->second;
Owen Anderson85c40642007-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 Anderson5aff8002007-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 Wendling2a023742008-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 Anderson85c40642007-07-24 17:55:58 +0000675//===----------------------------------------------------------------------===//
Bill Wendling42f17f62008-12-22 22:32:22 +0000676// GVN Pass
Owen Anderson85c40642007-07-24 17:55:58 +0000677//===----------------------------------------------------------------------===//
678
679namespace {
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000680 struct ValueNumberScope {
Owen Anderson2a412722008-06-20 01:15:47 +0000681 ValueNumberScope* parent;
682 DenseMap<uint32_t, Value*> table;
683
684 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
685 };
686}
687
688namespace {
Owen Anderson85c40642007-07-24 17:55:58 +0000689
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000690 class GVN : public FunctionPass {
Owen Anderson85c40642007-07-24 17:55:58 +0000691 bool runOnFunction(Function &F);
692 public:
693 static char ID; // Pass identification, replacement for typeid
Dan Gohman26f8c272008-09-04 17:05:41 +0000694 GVN() : FunctionPass(&ID) { }
Owen Anderson85c40642007-07-24 17:55:58 +0000695
696 private:
Chris Lattner02ca4422008-12-01 00:40:32 +0000697 MemoryDependenceAnalysis *MD;
698 DominatorTree *DT;
699
Owen Anderson85c40642007-07-24 17:55:58 +0000700 ValueTable VN;
Owen Anderson2a412722008-06-20 01:15:47 +0000701 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Owen Anderson85c40642007-07-24 17:55:58 +0000702
Owen Anderson5b299672007-08-07 23:12:31 +0000703 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
704 PhiMapType phiMap;
705
706
Owen Anderson85c40642007-07-24 17:55:58 +0000707 // This transformation requires dominator postdominator info
708 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson85c40642007-07-24 17:55:58 +0000709 AU.addRequired<DominatorTree>();
710 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000711 AU.addRequired<AliasAnalysis>();
Owen Andersonaef6a922008-06-23 17:49:45 +0000712
713 AU.addPreserved<DominatorTree>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000714 AU.addPreserved<AliasAnalysis>();
Owen Anderson85c40642007-07-24 17:55:58 +0000715 }
716
717 // Helper fuctions
718 // FIXME: eliminate or document these better
Owen Anderson85c40642007-07-24 17:55:58 +0000719 bool processLoad(LoadInst* L,
Chris Lattner7de20452008-03-21 22:01:16 +0000720 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson85c40642007-07-24 17:55:58 +0000721 bool processInstruction(Instruction* I,
Chris Lattner7de20452008-03-21 22:01:16 +0000722 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000723 bool processNonLocalLoad(LoadInst* L,
Chris Lattner7de20452008-03-21 22:01:16 +0000724 SmallVectorImpl<Instruction*> &toErase);
Owen Andersona03e7862008-12-15 02:03:00 +0000725 bool processBlock(BasicBlock* BB);
Owen Anderson5e5e5612008-12-14 19:10:35 +0000726 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Andersonc6a31b92007-08-02 17:56:05 +0000727 DenseMap<BasicBlock*, Value*> &Phis,
728 bool top_level = false);
Owen Andersone6b4ff82008-06-18 21:41:49 +0000729 void dump(DenseMap<uint32_t, Value*>& d);
Owen Andersonbe168b32007-08-14 18:04:11 +0000730 bool iterateOnFunction(Function &F);
Owen Andersone02ad522007-08-16 22:51:56 +0000731 Value* CollapsePhi(PHINode* p);
Owen Andersone6b4ff82008-06-18 21:41:49 +0000732 bool performPRE(Function& F);
Owen Anderson2a412722008-06-20 01:15:47 +0000733 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Andersona03e7862008-12-15 02:03:00 +0000734 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopes274474b2008-10-10 16:25:50 +0000735 void cleanupGlobalSets();
Bill Wendling2a023742008-12-22 21:36:08 +0000736 void verifyRemoved(const Instruction *I) const;
Owen Anderson85c40642007-07-24 17:55:58 +0000737 };
738
739 char GVN::ID = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000740}
741
742// createGVNPass - The public interface to this file...
743FunctionPass *llvm::createGVNPass() { return new GVN(); }
744
745static RegisterPass<GVN> X("gvn",
746 "Global Value Numbering");
747
Owen Andersone6b4ff82008-06-18 21:41:49 +0000748void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5d72a422007-07-25 19:57:03 +0000749 printf("{\n");
Owen Andersone6b4ff82008-06-18 21:41:49 +0000750 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5d72a422007-07-25 19:57:03 +0000751 E = d.end(); I != E; ++I) {
Owen Andersone6b4ff82008-06-18 21:41:49 +0000752 printf("%d\n", I->first);
Owen Anderson5d72a422007-07-25 19:57:03 +0000753 I->second->dump();
754 }
755 printf("}\n");
756}
757
Owen Andersond68b1af2009-08-26 22:55:11 +0000758static bool isSafeReplacement(PHINode* p, Instruction* inst) {
759 if (!isa<PHINode>(inst))
760 return true;
761
762 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
763 UI != E; ++UI)
764 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
765 if (use_phi->getParent() == inst->getParent())
766 return false;
767
768 return true;
769}
770
Owen Andersone02ad522007-08-16 22:51:56 +0000771Value* GVN::CollapsePhi(PHINode* p) {
Dan Gohman798e5412009-09-03 15:34:35 +0000772 Value* constVal = p->hasConstantValue(DT);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000773 if (!constVal) return 0;
Owen Andersone02ad522007-08-16 22:51:56 +0000774
Chris Lattner3d7103e2008-03-21 21:14:38 +0000775 Instruction* inst = dyn_cast<Instruction>(constVal);
776 if (!inst)
777 return constVal;
778
Chris Lattner02ca4422008-12-01 00:40:32 +0000779 if (DT->dominates(inst, p))
Chris Lattner3d7103e2008-03-21 21:14:38 +0000780 if (isSafeReplacement(p, inst))
781 return inst;
Owen Andersone02ad522007-08-16 22:51:56 +0000782 return 0;
783}
Owen Anderson5d72a422007-07-25 19:57:03 +0000784
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000785/// GetValueForBlock - Get the value to use within the specified basic block.
786/// available values are in Phis.
Owen Anderson5e5e5612008-12-14 19:10:35 +0000787Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner3d7103e2008-03-21 21:14:38 +0000788 DenseMap<BasicBlock*, Value*> &Phis,
789 bool top_level) {
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000790
791 // If we have already computed this value, return the previously computed val.
Owen Andersoned7f9932007-08-03 19:59:35 +0000792 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
793 if (V != Phis.end() && !top_level) return V->second;
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000794
Owen Andersonc3714b22008-07-02 18:15:31 +0000795 // If the block is unreachable, just return undef, since this path
796 // can't actually occur at runtime.
Chris Lattner02ca4422008-12-01 00:40:32 +0000797 if (!DT->isReachableFromEntry(BB))
Owen Andersonb99ecca2009-07-30 23:03:37 +0000798 return Phis[BB] = UndefValue::get(orig->getType());
Owen Anderson72735372008-07-02 17:20:16 +0000799
Chris Lattner4bab29b2008-12-09 19:21:47 +0000800 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
801 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Andersoned7f9932007-08-03 19:59:35 +0000802 Phis[BB] = ret;
803 return ret;
Owen Anderson30463f12007-08-03 11:03:26 +0000804 }
Chris Lattner4bab29b2008-12-09 19:21:47 +0000805
806 // Get the number of predecessors of this block so we can reserve space later.
807 // If there is already a PHI in it, use the #preds from it, otherwise count.
808 // Getting it from the PHI is constant time.
809 unsigned NumPreds;
810 if (PHINode *ExistingPN = dyn_cast<PHINode>(BB->begin()))
811 NumPreds = ExistingPN->getNumIncomingValues();
812 else
813 NumPreds = std::distance(pred_begin(BB), pred_end(BB));
Chris Lattner3d7103e2008-03-21 21:14:38 +0000814
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000815 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
816 // now, then get values to fill in the incoming values for the PHI.
Gabor Greifd6da1d02008-04-06 20:25:17 +0000817 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
818 BB->begin());
Chris Lattner4bab29b2008-12-09 19:21:47 +0000819 PN->reserveOperandSpace(NumPreds);
Owen Andersoned7f9932007-08-03 19:59:35 +0000820
Chris Lattner4bab29b2008-12-09 19:21:47 +0000821 Phis.insert(std::make_pair(BB, PN));
Owen Anderson48a2c562007-07-30 16:57:08 +0000822
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000823 // Fill in the incoming values for the block.
Owen Anderson9f577412007-07-31 17:43:14 +0000824 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
825 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Anderson9f577412007-07-31 17:43:14 +0000826 PN->addIncoming(val, *PI);
827 }
Chris Lattner3d7103e2008-03-21 21:14:38 +0000828
Chris Lattner02ca4422008-12-01 00:40:32 +0000829 VN.getAliasAnalysis()->copyValue(orig, PN);
Owen Anderson9f577412007-07-31 17:43:14 +0000830
Owen Andersone0143452007-08-16 22:02:55 +0000831 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersone02ad522007-08-16 22:51:56 +0000832 Value* v = CollapsePhi(PN);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000833 if (!v) {
834 // Cache our phi construction results
Owen Anderson5e5e5612008-12-14 19:10:35 +0000835 if (LoadInst* L = dyn_cast<LoadInst>(orig))
836 phiMap[L->getPointerOperand()].insert(PN);
837 else
838 phiMap[orig].insert(PN);
839
Chris Lattner3d7103e2008-03-21 21:14:38 +0000840 return PN;
Owen Anderson9f577412007-07-31 17:43:14 +0000841 }
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000842
Chris Lattner3d7103e2008-03-21 21:14:38 +0000843 PN->replaceAllUsesWith(v);
Chris Lattnerf81b0142008-12-09 22:06:23 +0000844 if (isa<PointerType>(v->getType()))
845 MD->invalidateCachedPointerInfo(v);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000846
847 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
848 E = Phis.end(); I != E; ++I)
849 if (I->second == PN)
850 I->second = v;
851
Dan Gohman7e124382009-07-31 20:24:18 +0000852 DEBUG(errs() << "GVN removed: " << *PN << '\n');
Chris Lattner02ca4422008-12-01 00:40:32 +0000853 MD->removeInstruction(PN);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000854 PN->eraseFromParent();
Bill Wendling2a023742008-12-22 21:36:08 +0000855 DEBUG(verifyRemoved(PN));
Chris Lattner3d7103e2008-03-21 21:14:38 +0000856
857 Phis[BB] = v;
858 return v;
Owen Anderson5d72a422007-07-25 19:57:03 +0000859}
860
Chris Lattnerdcded152008-12-02 08:16:11 +0000861/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
862/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattner159b98f2008-12-05 07:49:08 +0000863/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
864/// map is actually a tri-state map with the following values:
865/// 0) we know the block *is not* fully available.
866/// 1) we know the block *is* fully available.
867/// 2) we do not know whether the block is fully available or not, but we are
868/// currently speculating that it will be.
869/// 3) we are speculating for this block and have used that to speculate for
870/// other blocks.
Chris Lattnerdcded152008-12-02 08:16:11 +0000871static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner159b98f2008-12-05 07:49:08 +0000872 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerdcded152008-12-02 08:16:11 +0000873 // Optimistically assume that the block is fully available and check to see
874 // if we already know about this block in one lookup.
Chris Lattner159b98f2008-12-05 07:49:08 +0000875 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
876 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerdcded152008-12-02 08:16:11 +0000877
878 // If the entry already existed for this block, return the precomputed value.
Chris Lattner159b98f2008-12-05 07:49:08 +0000879 if (!IV.second) {
880 // If this is a speculative "available" value, mark it as being used for
881 // speculation of other blocks.
882 if (IV.first->second == 2)
883 IV.first->second = 3;
884 return IV.first->second != 0;
885 }
Chris Lattnerdcded152008-12-02 08:16:11 +0000886
887 // Otherwise, see if it is fully available in all predecessors.
888 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
889
890 // If this block has no predecessors, it isn't live-in here.
891 if (PI == PE)
Chris Lattner159b98f2008-12-05 07:49:08 +0000892 goto SpeculationFailure;
Chris Lattnerdcded152008-12-02 08:16:11 +0000893
894 for (; PI != PE; ++PI)
895 // If the value isn't fully available in one of our predecessors, then it
896 // isn't fully available in this block either. Undo our previous
897 // optimistic assumption and bail out.
898 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattner159b98f2008-12-05 07:49:08 +0000899 goto SpeculationFailure;
Chris Lattnerdcded152008-12-02 08:16:11 +0000900
901 return true;
Chris Lattner159b98f2008-12-05 07:49:08 +0000902
903// SpeculationFailure - If we get here, we found out that this is not, after
904// all, a fully-available block. We have a problem if we speculated on this and
905// used the speculation to mark other blocks as available.
906SpeculationFailure:
907 char &BBVal = FullyAvailableBlocks[BB];
908
909 // If we didn't speculate on this, just return with it set to false.
910 if (BBVal == 2) {
911 BBVal = 0;
912 return false;
913 }
914
915 // If we did speculate on this value, we could have blocks set to 1 that are
916 // incorrect. Walk the (transitive) successors of this block and mark them as
917 // 0 if set to one.
918 SmallVector<BasicBlock*, 32> BBWorklist;
919 BBWorklist.push_back(BB);
920
921 while (!BBWorklist.empty()) {
922 BasicBlock *Entry = BBWorklist.pop_back_val();
923 // Note that this sets blocks to 0 (unavailable) if they happen to not
924 // already be in FullyAvailableBlocks. This is safe.
925 char &EntryVal = FullyAvailableBlocks[Entry];
926 if (EntryVal == 0) continue; // Already unavailable.
927
928 // Mark as unavailable.
929 EntryVal = 0;
930
931 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
932 BBWorklist.push_back(*I);
933 }
934
935 return false;
Chris Lattnerdcded152008-12-02 08:16:11 +0000936}
937
Owen Andersone0143452007-08-16 22:02:55 +0000938/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
939/// non-local by performing PHI construction.
Chris Lattnerdcded152008-12-02 08:16:11 +0000940bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner7de20452008-03-21 22:01:16 +0000941 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerdcded152008-12-02 08:16:11 +0000942 // Find the non-local dependencies of the load.
Chris Lattneraf713862008-12-09 19:25:07 +0000943 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
944 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
945 Deps);
Dan Gohman7e124382009-07-31 20:24:18 +0000946 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: "
947 // << Deps.size() << *LI << '\n');
Owen Anderson5d72a422007-07-25 19:57:03 +0000948
Owen Anderson90e717d2008-08-26 22:07:42 +0000949 // If we had to process more than one hundred blocks to find the
950 // dependencies, this load isn't worth worrying about. Optimizing
951 // it will be too expensive.
Chris Lattneraf713862008-12-09 19:25:07 +0000952 if (Deps.size() > 100)
Owen Anderson90e717d2008-08-26 22:07:42 +0000953 return false;
Chris Lattner8d1686f2008-12-18 00:51:32 +0000954
955 // If we had a phi translation failure, we'll have a single entry which is a
956 // clobber in the current block. Reject this early.
Edwin Török3ffffac2009-06-17 18:48:18 +0000957 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
958 DEBUG(
Dan Gohman0be10b02009-07-25 01:43:01 +0000959 errs() << "GVN: non-local load ";
960 WriteAsOperand(errs(), LI);
Dan Gohman7e124382009-07-31 20:24:18 +0000961 errs() << " is clobbered by " << *Deps[0].second.getInst() << '\n';
Edwin Török3ffffac2009-06-17 18:48:18 +0000962 );
Chris Lattner8d1686f2008-12-18 00:51:32 +0000963 return false;
Edwin Török3ffffac2009-06-17 18:48:18 +0000964 }
Owen Anderson90e717d2008-08-26 22:07:42 +0000965
Chris Lattnerdcded152008-12-02 08:16:11 +0000966 // Filter out useless results (non-locals, etc). Keep track of the blocks
967 // where we have a value available in repl, also keep track of whether we see
968 // dependencies that produce an unknown value for the load (such as a call
969 // that could potentially clobber the load).
970 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
971 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Owen Anderson5b299672007-08-07 23:12:31 +0000972
Chris Lattneraf713862008-12-09 19:25:07 +0000973 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
974 BasicBlock *DepBB = Deps[i].first;
975 MemDepResult DepInfo = Deps[i].second;
Chris Lattner46876282008-12-01 01:15:42 +0000976
Chris Lattner4531da82008-12-05 21:04:20 +0000977 if (DepInfo.isClobber()) {
978 UnavailableBlocks.push_back(DepBB);
979 continue;
980 }
981
982 Instruction *DepInst = DepInfo.getInst();
983
984 // Loading the allocation -> undef.
985 if (isa<AllocationInst>(DepInst)) {
Owen Andersonb99ecca2009-07-30 23:03:37 +0000986 ValuesPerBlock.push_back(std::make_pair(DepBB,
987 UndefValue::get(LI->getType())));
Chris Lattner46876282008-12-01 01:15:42 +0000988 continue;
989 }
Chris Lattner3d7103e2008-03-21 21:14:38 +0000990
Chris Lattneraf713862008-12-09 19:25:07 +0000991 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattnera207fe52008-12-01 01:31:36 +0000992 // Reject loads and stores that are to the same address but are of
993 // different types.
994 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
995 // of bitfield access, it would be interesting to optimize for it at some
996 // point.
Chris Lattnerdcded152008-12-02 08:16:11 +0000997 if (S->getOperand(0)->getType() != LI->getType()) {
998 UnavailableBlocks.push_back(DepBB);
999 continue;
1000 }
Chris Lattnera207fe52008-12-01 01:31:36 +00001001
Chris Lattnerdcded152008-12-02 08:16:11 +00001002 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattnera207fe52008-12-01 01:31:36 +00001003
Chris Lattneraf713862008-12-09 19:25:07 +00001004 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerdcded152008-12-02 08:16:11 +00001005 if (LD->getType() != LI->getType()) {
1006 UnavailableBlocks.push_back(DepBB);
1007 continue;
1008 }
Chris Lattnerdcded152008-12-02 08:16:11 +00001009 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5d72a422007-07-25 19:57:03 +00001010 } else {
Chris Lattnerdcded152008-12-02 08:16:11 +00001011 UnavailableBlocks.push_back(DepBB);
1012 continue;
Owen Anderson5d72a422007-07-25 19:57:03 +00001013 }
Chris Lattner3d7103e2008-03-21 21:14:38 +00001014 }
Owen Anderson5d72a422007-07-25 19:57:03 +00001015
Chris Lattnerdcded152008-12-02 08:16:11 +00001016 // If we have no predecessors that produce a known value for this load, exit
1017 // early.
1018 if (ValuesPerBlock.empty()) return false;
1019
1020 // If all of the instructions we depend on produce a known value for this
1021 // load, then it is fully redundant and we can use PHI insertion to compute
1022 // its value. Insert PHIs and remove the fully redundant value now.
1023 if (UnavailableBlocks.empty()) {
1024 // Use cached PHI construction information from previous runs
1025 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattneraf713862008-12-09 19:25:07 +00001026 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattnerdcded152008-12-02 08:16:11 +00001027 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1028 I != E; ++I) {
1029 if ((*I)->getParent() == LI->getParent()) {
Dan Gohman7e124382009-07-31 20:24:18 +00001030 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD #1: " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001031 LI->replaceAllUsesWith(*I);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001032 if (isa<PointerType>((*I)->getType()))
1033 MD->invalidateCachedPointerInfo(*I);
Chris Lattnerdcded152008-12-02 08:16:11 +00001034 toErase.push_back(LI);
1035 NumGVNLoad++;
1036 return true;
1037 }
1038
1039 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Anderson5b299672007-08-07 23:12:31 +00001040 }
Chris Lattner3d7103e2008-03-21 21:14:38 +00001041
Dan Gohman7e124382009-07-31 20:24:18 +00001042 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001043
1044 DenseMap<BasicBlock*, Value*> BlockReplValues;
1045 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1046 // Perform PHI construction.
1047 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1048 LI->replaceAllUsesWith(v);
Chris Lattnerfcbc3032008-12-15 03:46:38 +00001049
Chris Lattner0cb92f82009-02-12 07:00:35 +00001050 if (isa<PHINode>(v))
Chris Lattnerfcbc3032008-12-15 03:46:38 +00001051 v->takeName(LI);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001052 if (isa<PointerType>(v->getType()))
1053 MD->invalidateCachedPointerInfo(v);
Chris Lattnerdcded152008-12-02 08:16:11 +00001054 toErase.push_back(LI);
1055 NumGVNLoad++;
1056 return true;
1057 }
1058
1059 if (!EnablePRE || !EnableLoadPRE)
1060 return false;
1061
1062 // Okay, we have *some* definitions of the value. This means that the value
1063 // is available in some of our (transitive) predecessors. Lets think about
1064 // doing PRE of this load. This will involve inserting a new load into the
1065 // predecessor when it's not available. We could do this in general, but
1066 // prefer to not increase code size. As such, we only do this when we know
1067 // that we only have to insert *one* load (which means we're basically moving
1068 // the load, not inserting a new one).
1069
Owen Andersondd37b182009-05-31 09:03:40 +00001070 SmallPtrSet<BasicBlock *, 4> Blockers;
1071 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1072 Blockers.insert(UnavailableBlocks[i]);
1073
1074 // Lets find first basic block with more than one predecessor. Walk backwards
1075 // through predecessors if needed.
Chris Lattnerdcded152008-12-02 08:16:11 +00001076 BasicBlock *LoadBB = LI->getParent();
Owen Andersondd37b182009-05-31 09:03:40 +00001077 BasicBlock *TmpBB = LoadBB;
1078
1079 bool isSinglePred = false;
Dale Johannesena19b67f2009-06-17 20:48:23 +00001080 bool allSingleSucc = true;
Owen Andersondd37b182009-05-31 09:03:40 +00001081 while (TmpBB->getSinglePredecessor()) {
1082 isSinglePred = true;
1083 TmpBB = TmpBB->getSinglePredecessor();
1084 if (!TmpBB) // If haven't found any, bail now.
1085 return false;
1086 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1087 return false;
1088 if (Blockers.count(TmpBB))
1089 return false;
Dale Johannesena19b67f2009-06-17 20:48:23 +00001090 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1091 allSingleSucc = false;
Owen Andersondd37b182009-05-31 09:03:40 +00001092 }
1093
1094 assert(TmpBB);
1095 LoadBB = TmpBB;
Chris Lattnerdcded152008-12-02 08:16:11 +00001096
1097 // If we have a repl set with LI itself in it, this means we have a loop where
1098 // at least one of the values is LI. Since this means that we won't be able
1099 // to eliminate LI even if we insert uses in the other predecessors, we will
1100 // end up increasing code size. Reject this by scanning for LI.
1101 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1102 if (ValuesPerBlock[i].second == LI)
1103 return false;
1104
Owen Andersondd37b182009-05-31 09:03:40 +00001105 if (isSinglePred) {
1106 bool isHot = false;
1107 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1108 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
1109 // "Hot" Instruction is in some loop (because it dominates its dep.
1110 // instruction).
1111 if (DT->dominates(LI, I)) {
1112 isHot = true;
1113 break;
1114 }
1115
1116 // We are interested only in "hot" instructions. We don't want to do any
1117 // mis-optimizations here.
1118 if (!isHot)
1119 return false;
1120 }
1121
Chris Lattnerdcded152008-12-02 08:16:11 +00001122 // Okay, we have some hope :). Check to see if the loaded value is fully
1123 // available in all but one predecessor.
1124 // FIXME: If we could restructure the CFG, we could make a common pred with
1125 // all the preds that don't have an available LI and insert a new load into
1126 // that one block.
1127 BasicBlock *UnavailablePred = 0;
1128
Chris Lattner159b98f2008-12-05 07:49:08 +00001129 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerdcded152008-12-02 08:16:11 +00001130 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1131 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1132 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1133 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1134
1135 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1136 PI != E; ++PI) {
1137 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1138 continue;
1139
1140 // If this load is not available in multiple predecessors, reject it.
1141 if (UnavailablePred && UnavailablePred != *PI)
1142 return false;
1143 UnavailablePred = *PI;
1144 }
1145
1146 assert(UnavailablePred != 0 &&
1147 "Fully available value should be eliminated above!");
1148
1149 // If the loaded pointer is PHI node defined in this block, do PHI translation
1150 // to get its value in the predecessor.
1151 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
1152
1153 // Make sure the value is live in the predecessor. If it was defined by a
1154 // non-PHI instruction in this block, we don't know how to recompute it above.
1155 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1156 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
Daniel Dunbar005975c2009-07-25 00:23:56 +00001157 DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
Dan Gohman7e124382009-07-31 20:24:18 +00001158 << *LPInst << '\n' << *LI << "\n");
Chris Lattnerdcded152008-12-02 08:16:11 +00001159 return false;
1160 }
1161
1162 // We don't currently handle critical edges :(
1163 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbar005975c2009-07-25 00:23:56 +00001164 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
Dan Gohman7e124382009-07-31 20:24:18 +00001165 << UnavailablePred->getName() << "': " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001166 return false;
Owen Anderson5b299672007-08-07 23:12:31 +00001167 }
Dale Johannesena19b67f2009-06-17 20:48:23 +00001168
1169 // Make sure it is valid to move this load here. We have to watch out for:
1170 // @1 = getelementptr (i8* p, ...
1171 // test p and branch if == 0
1172 // load @1
1173 // It is valid to have the getelementptr before the test, even if p can be 0,
1174 // as getelementptr only does address arithmetic.
1175 // If we are not pushing the value through any multiple-successor blocks
1176 // we do not have this case. Otherwise, check that the load is safe to
1177 // put anywhere; this can be improved, but should be conservatively safe.
1178 if (!allSingleSucc &&
1179 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
1180 return false;
1181
Chris Lattnerdcded152008-12-02 08:16:11 +00001182 // Okay, we can eliminate this load by inserting a reload in the predecessor
1183 // and using PHI construction to get the value in the other predecessors, do
1184 // it.
Dan Gohman7e124382009-07-31 20:24:18 +00001185 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001186
1187 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1188 LI->getAlignment(),
1189 UnavailablePred->getTerminator());
1190
Owen Anderson1c057ee2009-05-29 05:37:54 +00001191 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1192 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1193 I != E; ++I)
1194 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
1195
Chris Lattnerdcded152008-12-02 08:16:11 +00001196 DenseMap<BasicBlock*, Value*> BlockReplValues;
1197 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1198 BlockReplValues[UnavailablePred] = NewLoad;
1199
1200 // Perform PHI construction.
1201 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1202 LI->replaceAllUsesWith(v);
Chris Lattner0cb92f82009-02-12 07:00:35 +00001203 if (isa<PHINode>(v))
Chris Lattnerfcbc3032008-12-15 03:46:38 +00001204 v->takeName(LI);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001205 if (isa<PointerType>(v->getType()))
1206 MD->invalidateCachedPointerInfo(v);
Chris Lattnerdcded152008-12-02 08:16:11 +00001207 toErase.push_back(LI);
1208 NumPRELoad++;
Owen Anderson5d72a422007-07-25 19:57:03 +00001209 return true;
1210}
1211
Owen Andersone0143452007-08-16 22:02:55 +00001212/// processLoad - Attempt to eliminate a load, first by eliminating it
1213/// locally, and then attempting non-local elimination if that fails.
Chris Lattner4531da82008-12-05 21:04:20 +00001214bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1215 if (L->isVolatile())
Owen Anderson85c40642007-07-24 17:55:58 +00001216 return false;
Owen Anderson85c40642007-07-24 17:55:58 +00001217
1218 Value* pointer = L->getPointerOperand();
Chris Lattner4531da82008-12-05 21:04:20 +00001219
Owen Anderson85c40642007-07-24 17:55:58 +00001220 // ... to a pointer that has been loaded from before...
Chris Lattner02ca4422008-12-01 00:40:32 +00001221 MemDepResult dep = MD->getDependency(L);
Owen Andersoncc8b3a82007-08-14 17:59:48 +00001222
Chris Lattner4531da82008-12-05 21:04:20 +00001223 // If the value isn't available, don't do anything!
Edwin Török47cf8842009-05-29 09:46:03 +00001224 if (dep.isClobber()) {
1225 DEBUG(
1226 // fast print dep, using operator<< on instruction would be too slow
Dan Gohman0be10b02009-07-25 01:43:01 +00001227 errs() << "GVN: load ";
1228 WriteAsOperand(errs(), L);
Edwin Török47cf8842009-05-29 09:46:03 +00001229 Instruction *I = dep.getInst();
Dan Gohman7e124382009-07-31 20:24:18 +00001230 errs() << " is clobbered by " << *I << '\n';
Edwin Török47cf8842009-05-29 09:46:03 +00001231 );
Chris Lattner4531da82008-12-05 21:04:20 +00001232 return false;
Edwin Török47cf8842009-05-29 09:46:03 +00001233 }
Chris Lattner4531da82008-12-05 21:04:20 +00001234
1235 // If it is defined in another block, try harder.
Chris Lattner4bab29b2008-12-09 19:21:47 +00001236 if (dep.isNonLocal())
Chris Lattner4531da82008-12-05 21:04:20 +00001237 return processNonLocalLoad(L, toErase);
Eli Friedman350307f2008-02-12 12:08:14 +00001238
Chris Lattner4531da82008-12-05 21:04:20 +00001239 Instruction *DepInst = dep.getInst();
1240 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1241 // Only forward substitute stores to loads of the same type.
1242 // FIXME: Could do better!
1243 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1244 return false;
1245
1246 // Remove it!
1247 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerf81b0142008-12-09 22:06:23 +00001248 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1249 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattner4531da82008-12-05 21:04:20 +00001250 toErase.push_back(L);
1251 NumGVNLoad++;
1252 return true;
1253 }
1254
1255 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1256 // Only forward substitute stores to loads of the same type.
1257 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1258 if (DepLI->getType() != L->getType())
1259 return false;
1260
1261 // Remove it!
1262 L->replaceAllUsesWith(DepLI);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001263 if (isa<PointerType>(DepLI->getType()))
1264 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner4531da82008-12-05 21:04:20 +00001265 toErase.push_back(L);
1266 NumGVNLoad++;
1267 return true;
1268 }
1269
Chris Lattner8ea60462008-11-30 01:39:32 +00001270 // If this load really doesn't depend on anything, then we must be loading an
1271 // undef value. This can happen when loading for a fresh allocation with no
1272 // intervening stores, for example.
Chris Lattner4531da82008-12-05 21:04:20 +00001273 if (isa<AllocationInst>(DepInst)) {
Owen Andersonb99ecca2009-07-30 23:03:37 +00001274 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Chris Lattner8ea60462008-11-30 01:39:32 +00001275 toErase.push_back(L);
Chris Lattner8ea60462008-11-30 01:39:32 +00001276 NumGVNLoad++;
Chris Lattner4531da82008-12-05 21:04:20 +00001277 return true;
Eli Friedman350307f2008-02-12 12:08:14 +00001278 }
1279
Chris Lattner4531da82008-12-05 21:04:20 +00001280 return false;
Owen Anderson85c40642007-07-24 17:55:58 +00001281}
1282
Owen Anderson2a412722008-06-20 01:15:47 +00001283Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Andersonaef6a922008-06-23 17:49:45 +00001284 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1285 if (I == localAvail.end())
1286 return 0;
1287
1288 ValueNumberScope* locals = I->second;
Owen Anderson2a412722008-06-20 01:15:47 +00001289
1290 while (locals) {
1291 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1292 if (I != locals->table.end())
1293 return I->second;
1294 else
1295 locals = locals->parent;
1296 }
1297
1298 return 0;
1299}
1300
Owen Andersona03e7862008-12-15 02:03:00 +00001301/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
1302/// by inheritance from the dominator fails, see if we can perform phi
1303/// construction to eliminate the redundancy.
1304Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1305 BasicBlock* BaseBlock = orig->getParent();
1306
1307 SmallPtrSet<BasicBlock*, 4> Visited;
1308 SmallVector<BasicBlock*, 8> Stack;
1309 Stack.push_back(BaseBlock);
1310
1311 DenseMap<BasicBlock*, Value*> Results;
1312
1313 // Walk backwards through our predecessors, looking for instances of the
1314 // value number we're looking for. Instances are recorded in the Results
1315 // map, which is then used to perform phi construction.
1316 while (!Stack.empty()) {
1317 BasicBlock* Current = Stack.back();
1318 Stack.pop_back();
1319
1320 // If we've walked all the way to a proper dominator, then give up. Cases
1321 // where the instance is in the dominator will have been caught by the fast
1322 // path, and any cases that require phi construction further than this are
1323 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1324 // time improvement.
1325 if (DT->properlyDominates(Current, orig->getParent())) return 0;
1326
1327 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1328 localAvail.find(Current);
1329 if (LA == localAvail.end()) return 0;
Chris Lattner6f33e552009-01-19 22:00:18 +00001330 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Andersona03e7862008-12-15 02:03:00 +00001331
1332 if (V != LA->second->table.end()) {
1333 // Found an instance, record it.
1334 Results.insert(std::make_pair(Current, V->second));
1335 continue;
1336 }
1337
1338 // If we reach the beginning of the function, then give up.
1339 if (pred_begin(Current) == pred_end(Current))
1340 return 0;
1341
1342 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1343 PI != PE; ++PI)
1344 if (Visited.insert(*PI))
1345 Stack.push_back(*PI);
1346 }
1347
1348 // If we didn't find instances, give up. Otherwise, perform phi construction.
1349 if (Results.size() == 0)
1350 return 0;
1351 else
1352 return GetValueForBlock(BaseBlock, orig, Results, true);
1353}
1354
Owen Andersonf631bb62007-08-14 18:16:29 +00001355/// processInstruction - When calculating availability, handle an instruction
Owen Anderson85c40642007-07-24 17:55:58 +00001356/// by inserting it into the appropriate sets
Owen Anderson9334fc62008-06-12 19:25:32 +00001357bool GVN::processInstruction(Instruction *I,
Chris Lattner7de20452008-03-21 22:01:16 +00001358 SmallVectorImpl<Instruction*> &toErase) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001359 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner4531da82008-12-05 21:04:20 +00001360 bool changed = processLoad(L, toErase);
Owen Andersone6b4ff82008-06-18 21:41:49 +00001361
1362 if (!changed) {
1363 unsigned num = VN.lookup_or_add(L);
Owen Anderson2a412722008-06-20 01:15:47 +00001364 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Andersone6b4ff82008-06-18 21:41:49 +00001365 }
1366
1367 return changed;
1368 }
1369
Owen Anderson8a8d13c2008-07-03 17:44:33 +00001370 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Andersone6b4ff82008-06-18 21:41:49 +00001371 unsigned num = VN.lookup_or_add(I);
Chris Lattner7de20452008-03-21 22:01:16 +00001372
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001373 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1374 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1375
1376 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1377 return false;
1378
1379 Value* branchCond = BI->getCondition();
1380 uint32_t condVN = VN.lookup_or_add(branchCond);
1381
1382 BasicBlock* trueSucc = BI->getSuccessor(0);
1383 BasicBlock* falseSucc = BI->getSuccessor(1);
1384
1385 if (trueSucc->getSinglePredecessor())
Owen Anderson4f720fa2009-07-31 17:39:07 +00001386 localAvail[trueSucc]->table[condVN] =
1387 ConstantInt::getTrue(trueSucc->getContext());
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001388 if (falseSucc->getSinglePredecessor())
Owen Anderson4f720fa2009-07-31 17:39:07 +00001389 localAvail[falseSucc]->table[condVN] =
1390 ConstantInt::getFalse(trueSucc->getContext());
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001391
1392 return false;
1393
Owen Andersonced50f82008-04-07 09:59:07 +00001394 // Allocations are always uniquely numbered, so we can save time and memory
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001395 // by fast failing them.
1396 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson2a412722008-06-20 01:15:47 +00001397 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonced50f82008-04-07 09:59:07 +00001398 return false;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001399 }
Owen Anderson85c40642007-07-24 17:55:58 +00001400
Owen Andersone0143452007-08-16 22:02:55 +00001401 // Collapse PHI nodes
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001402 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersone02ad522007-08-16 22:51:56 +00001403 Value* constVal = CollapsePhi(p);
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001404
1405 if (constVal) {
Owen Andersone02ad522007-08-16 22:51:56 +00001406 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1407 PI != PE; ++PI)
Chris Lattner4bab29b2008-12-09 19:21:47 +00001408 PI->second.erase(p);
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001409
Owen Andersone02ad522007-08-16 22:51:56 +00001410 p->replaceAllUsesWith(constVal);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001411 if (isa<PointerType>(constVal->getType()))
1412 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson575f2812008-12-23 00:49:51 +00001413 VN.erase(p);
1414
Owen Andersone02ad522007-08-16 22:51:56 +00001415 toErase.push_back(p);
Owen Andersone6b4ff82008-06-18 21:41:49 +00001416 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001417 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001418 }
Owen Anderson8a8d13c2008-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 Andersona03e7862008-12-15 02:03:00 +00001426 // Perform fast-path value-number based elimination of values inherited from
1427 // dominators.
Owen Anderson2a412722008-06-20 01:15:47 +00001428 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Andersonc772be72007-12-08 01:37:09 +00001429 // Remove it!
Owen Anderson5aff8002007-07-31 23:27:13 +00001430 VN.erase(I);
Owen Anderson85c40642007-07-24 17:55:58 +00001431 I->replaceAllUsesWith(repl);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001432 if (isa<PointerType>(repl->getType()))
1433 MD->invalidateCachedPointerInfo(repl);
Owen Anderson85c40642007-07-24 17:55:58 +00001434 toErase.push_back(I);
1435 return true;
Owen Andersona03e7862008-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 Anderson8a8d13c2008-07-03 17:44:33 +00001448 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001449 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson85c40642007-07-24 17:55:58 +00001450 }
1451
1452 return false;
1453}
1454
Bill Wendling42f17f62008-12-22 22:32:22 +00001455/// runOnFunction - This is the main transformation entry point for a function.
Owen Andersonbe168b32007-08-14 18:04:11 +00001456bool GVN::runOnFunction(Function& F) {
Chris Lattner02ca4422008-12-01 00:40:32 +00001457 MD = &getAnalysis<MemoryDependenceAnalysis>();
1458 DT = &getAnalysis<DominatorTree>();
Owen Andersonbcf2bd52008-05-12 20:15:55 +00001459 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner02ca4422008-12-01 00:40:32 +00001460 VN.setMemDep(MD);
1461 VN.setDomTree(DT);
Owen Anderson5e9366f2007-10-18 19:39:33 +00001462
Owen Andersonbe168b32007-08-14 18:04:11 +00001463 bool changed = false;
1464 bool shouldContinue = true;
1465
Owen Anderson26ed2572008-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 Andersonf59eef82008-07-17 00:01:40 +00001471 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1472 if (removedBlock) NumGVNBlocks++;
1473
1474 changed |= removedBlock;
Owen Anderson26ed2572008-07-16 17:52:31 +00001475 }
1476
Chris Lattner4bab29b2008-12-09 19:21:47 +00001477 unsigned Iteration = 0;
1478
Owen Andersonbe168b32007-08-14 18:04:11 +00001479 while (shouldContinue) {
Dan Gohman0be10b02009-07-25 01:43:01 +00001480 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Owen Andersonbe168b32007-08-14 18:04:11 +00001481 shouldContinue = iterateOnFunction(F);
1482 changed |= shouldContinue;
Chris Lattner4bab29b2008-12-09 19:21:47 +00001483 ++Iteration;
Owen Andersonbe168b32007-08-14 18:04:11 +00001484 }
1485
Owen Anderson916f4732008-07-18 18:03:38 +00001486 if (EnablePRE) {
Owen Anderson9c935902008-09-03 23:06:07 +00001487 bool PREChanged = true;
1488 while (PREChanged) {
1489 PREChanged = performPRE(F);
Owen Anderson916f4732008-07-18 18:03:38 +00001490 changed |= PREChanged;
Owen Anderson9c935902008-09-03 23:06:07 +00001491 }
Owen Anderson916f4732008-07-18 18:03:38 +00001492 }
Chris Lattner4bab29b2008-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 Lopes274474b2008-10-10 16:25:50 +00001497
1498 cleanupGlobalSets();
1499
Owen Andersonbe168b32007-08-14 18:04:11 +00001500 return changed;
1501}
1502
1503
Owen Andersona03e7862008-12-15 02:03:00 +00001504bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner4bab29b2008-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 Anderson9334fc62008-06-12 19:25:32 +00001507 SmallVector<Instruction*, 8> toErase;
Owen Anderson9334fc62008-06-12 19:25:32 +00001508 bool changed_function = false;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001509
Owen Anderson9334fc62008-06-12 19:25:32 +00001510 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1511 BI != BE;) {
Chris Lattner4531da82008-12-05 21:04:20 +00001512 changed_function |= processInstruction(BI, toErase);
Owen Anderson9334fc62008-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 Lattner02ca4422008-12-01 00:40:32 +00001527 E = toErase.end(); I != E; ++I) {
Dan Gohman7e124382009-07-31 20:24:18 +00001528 DEBUG(errs() << "GVN removed: " << **I << '\n');
Chris Lattner02ca4422008-12-01 00:40:32 +00001529 MD->removeInstruction(*I);
Owen Anderson9334fc62008-06-12 19:25:32 +00001530 (*I)->eraseFromParent();
Bill Wendling84049422008-12-22 21:57:30 +00001531 DEBUG(verifyRemoved(*I));
Chris Lattner02ca4422008-12-01 00:40:32 +00001532 }
Chris Lattner4bab29b2008-12-09 19:21:47 +00001533 toErase.clear();
Owen Anderson9334fc62008-06-12 19:25:32 +00001534
1535 if (AtStart)
1536 BI = BB->begin();
1537 else
1538 ++BI;
Owen Anderson9334fc62008-06-12 19:25:32 +00001539 }
1540
Owen Anderson9334fc62008-06-12 19:25:32 +00001541 return changed_function;
1542}
1543
Owen Andersone6b4ff82008-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 Lattner66a3a3e2008-12-01 07:35:54 +00001547 bool Changed = false;
Owen Andersonec747c42008-06-19 19:54:19 +00001548 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner3304b562008-12-01 07:29:03 +00001549 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersone6b4ff82008-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 Lattner66a3a3e2008-12-01 07:35:54 +00001559 Instruction *CurInst = BI++;
Duncan Sands2f500832009-05-06 06:49:50 +00001560
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001561 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
Owen Anderson35b47072009-08-13 21:58:54 +00001562 isa<PHINode>(CurInst) ||
1563 (CurInst->getType() == Type::getVoidTy(F.getContext())) ||
Duncan Sands2f500832009-05-06 06:49:50 +00001564 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell6e0aa282009-03-10 15:04:53 +00001565 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001566 continue;
Duncan Sands2f500832009-05-06 06:49:50 +00001567
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001568 uint32_t valno = VN.lookup(CurInst);
Owen Andersone6b4ff82008-06-18 21:41:49 +00001569
1570 // Look for the predecessors for PRE opportunities. We're
1571 // only trying to solve the basic diamond case, where
1572 // a value is computed in the successor and one predecessor,
1573 // but not the other. We also explicitly disallow cases
1574 // where the successor is its own predecessor, because they're
1575 // more complicated to get right.
1576 unsigned numWith = 0;
1577 unsigned numWithout = 0;
1578 BasicBlock* PREPred = 0;
Chris Lattner3304b562008-12-01 07:29:03 +00001579 predMap.clear();
1580
Owen Andersone6b4ff82008-06-18 21:41:49 +00001581 for (pred_iterator PI = pred_begin(CurrentBlock),
1582 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1583 // We're not interested in PRE where the block is its
Owen Anderson2a412722008-06-20 01:15:47 +00001584 // own predecessor, on in blocks with predecessors
1585 // that are not reachable.
1586 if (*PI == CurrentBlock) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001587 numWithout = 2;
Owen Anderson2a412722008-06-20 01:15:47 +00001588 break;
1589 } else if (!localAvail.count(*PI)) {
1590 numWithout = 2;
1591 break;
1592 }
1593
1594 DenseMap<uint32_t, Value*>::iterator predV =
1595 localAvail[*PI]->table.find(valno);
1596 if (predV == localAvail[*PI]->table.end()) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001597 PREPred = *PI;
1598 numWithout++;
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001599 } else if (predV->second == CurInst) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001600 numWithout = 2;
1601 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001602 predMap[*PI] = predV->second;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001603 numWith++;
1604 }
1605 }
1606
1607 // Don't do PRE when it might increase code size, i.e. when
1608 // we would need to insert instructions in more than one pred.
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001609 if (numWithout != 1 || numWith == 0)
Owen Andersone6b4ff82008-06-18 21:41:49 +00001610 continue;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001611
Owen Andersonec747c42008-06-19 19:54:19 +00001612 // We can't do PRE safely on a critical edge, so instead we schedule
1613 // the edge to be split and perform the PRE the next time we iterate
1614 // on the function.
1615 unsigned succNum = 0;
1616 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1617 i != e; ++i)
Owen Anderson9c935902008-09-03 23:06:07 +00001618 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonec747c42008-06-19 19:54:19 +00001619 succNum = i;
1620 break;
1621 }
1622
1623 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1624 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Andersonec747c42008-06-19 19:54:19 +00001625 continue;
1626 }
1627
Owen Andersone6b4ff82008-06-18 21:41:49 +00001628 // Instantiate the expression the in predecessor that lacked it.
1629 // Because we are going top-down through the block, all value numbers
1630 // will be available in the predecessor by the time we need them. Any
1631 // that weren't original present will have been instantiated earlier
1632 // in this loop.
Owen Anderson175b6542009-07-22 00:24:57 +00001633 Instruction* PREInstr = CurInst->clone(CurInst->getContext());
Owen Andersone6b4ff82008-06-18 21:41:49 +00001634 bool success = true;
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001635 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1636 Value *Op = PREInstr->getOperand(i);
1637 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1638 continue;
1639
1640 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1641 PREInstr->setOperand(i, V);
1642 } else {
1643 success = false;
1644 break;
Owen Anderson14c612f2008-07-11 20:05:13 +00001645 }
Owen Andersone6b4ff82008-06-18 21:41:49 +00001646 }
1647
1648 // Fail out if we encounter an operand that is not available in
1649 // the PRE predecessor. This is typically because of loads which
1650 // are not value numbered precisely.
1651 if (!success) {
1652 delete PREInstr;
Bill Wendling3858cae2008-12-22 22:14:07 +00001653 DEBUG(verifyRemoved(PREInstr));
Owen Andersone6b4ff82008-06-18 21:41:49 +00001654 continue;
1655 }
1656
1657 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001658 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson2a412722008-06-20 01:15:47 +00001659 predMap[PREPred] = PREInstr;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001660 VN.add(PREInstr, valno);
1661 NumGVNPRE++;
1662
1663 // Update the availability map to include the new instruction.
Owen Anderson2a412722008-06-20 01:15:47 +00001664 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Andersone6b4ff82008-06-18 21:41:49 +00001665
1666 // Create a PHI to make the value available in this block.
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001667 PHINode* Phi = PHINode::Create(CurInst->getType(),
1668 CurInst->getName() + ".pre-phi",
Owen Andersone6b4ff82008-06-18 21:41:49 +00001669 CurrentBlock->begin());
1670 for (pred_iterator PI = pred_begin(CurrentBlock),
1671 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson2a412722008-06-20 01:15:47 +00001672 Phi->addIncoming(predMap[*PI], *PI);
Owen Andersone6b4ff82008-06-18 21:41:49 +00001673
1674 VN.add(Phi, valno);
Owen Anderson2a412722008-06-20 01:15:47 +00001675 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001676
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001677 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001678 if (isa<PointerType>(Phi->getType()))
1679 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001680 VN.erase(CurInst);
Owen Andersone6b4ff82008-06-18 21:41:49 +00001681
Dan Gohman7e124382009-07-31 20:24:18 +00001682 DEBUG(errs() << "GVN PRE removed: " << *CurInst << '\n');
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001683 MD->removeInstruction(CurInst);
1684 CurInst->eraseFromParent();
Bill Wendling84049422008-12-22 21:57:30 +00001685 DEBUG(verifyRemoved(CurInst));
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001686 Changed = true;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001687 }
1688 }
1689
Owen Andersonec747c42008-06-19 19:54:19 +00001690 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov2e8710c2008-12-05 19:38:49 +00001691 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonec747c42008-06-19 19:54:19 +00001692 SplitCriticalEdge(I->first, I->second, this);
1693
Anton Korobeynikov2e8710c2008-12-05 19:38:49 +00001694 return Changed || toSplit.size();
Owen Andersone6b4ff82008-06-18 21:41:49 +00001695}
1696
Bill Wendling42f17f62008-12-22 22:32:22 +00001697/// iterateOnFunction - Executes one iteration of GVN
Owen Andersonbe168b32007-08-14 18:04:11 +00001698bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes274474b2008-10-10 16:25:50 +00001699 cleanupGlobalSets();
Chris Lattner98054902008-03-21 21:33:23 +00001700
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001701 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1702 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1703 if (DI->getIDom())
1704 localAvail[DI->getBlock()] =
1705 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1706 else
1707 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1708 }
1709
Owen Anderson85c40642007-07-24 17:55:58 +00001710 // Top-down walk of the dominator tree
Owen Andersone6b4ff82008-06-18 21:41:49 +00001711 bool changed = false;
Owen Andersonef136f52008-12-15 03:52:17 +00001712#if 0
1713 // Needed for value numbering with phi construction to work.
Owen Andersona03e7862008-12-15 02:03:00 +00001714 ReversePostOrderTraversal<Function*> RPOT(&F);
1715 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1716 RE = RPOT.end(); RI != RE; ++RI)
1717 changed |= processBlock(*RI);
Owen Andersonef136f52008-12-15 03:52:17 +00001718#else
1719 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1720 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1721 changed |= processBlock(DI->getBlock());
1722#endif
1723
Owen Anderson26ed2572008-07-16 17:52:31 +00001724 return changed;
Owen Anderson85c40642007-07-24 17:55:58 +00001725}
Nuno Lopes274474b2008-10-10 16:25:50 +00001726
1727void GVN::cleanupGlobalSets() {
1728 VN.clear();
1729 phiMap.clear();
1730
1731 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1732 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1733 delete I->second;
1734 localAvail.clear();
1735}
Bill Wendling2a023742008-12-22 21:36:08 +00001736
1737/// verifyRemoved - Verify that the specified instruction does not occur in our
1738/// internal data structures.
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001739void GVN::verifyRemoved(const Instruction *Inst) const {
1740 VN.verifyRemoved(Inst);
Bill Wendling3858cae2008-12-22 22:14:07 +00001741
1742 // Walk through the PHI map to make sure the instruction isn't hiding in there
1743 // somewhere.
1744 for (PhiMapType::iterator
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001745 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1746 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling3858cae2008-12-22 22:14:07 +00001747
1748 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001749 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1750 assert(*II != Inst && "Inst is still a value in PHI map!");
1751 }
1752 }
1753
1754 // Walk through the value number scope to make sure the instruction isn't
1755 // ferreted away in it.
1756 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1757 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1758 const ValueNumberScope *VNS = I->second;
1759
1760 while (VNS) {
1761 for (DenseMap<uint32_t, Value*>::iterator
1762 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1763 assert(II->second != Inst && "Inst still in value numbering scope!");
1764 }
1765
1766 VNS = VNS->parent;
Bill Wendling3858cae2008-12-22 22:14:07 +00001767 }
1768 }
Bill Wendling2a023742008-12-22 21:36:08 +00001769}