blob: c36f5e1791e48a6da5360f83ccf449e2ed445a9d [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"
Victor Hernandez48c3c542009-09-18 22:35:49 +000035#include "llvm/Analysis/MallocHelper.h"
Owen Anderson85c40642007-07-24 17:55:58 +000036#include "llvm/Analysis/MemoryDependenceAnalysis.h"
37#include "llvm/Support/CFG.h"
Owen Andersona2bf7662008-06-19 19:57:25 +000038#include "llvm/Support/CommandLine.h"
Chris Lattner9c5be3c2008-03-29 04:36:18 +000039#include "llvm/Support/Debug.h"
Edwin Török675d5622009-07-11 20:10:48 +000040#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar005975c2009-07-25 00:23:56 +000041#include "llvm/Support/raw_ostream.h"
Owen Andersonec747c42008-06-19 19:54:19 +000042#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesena19b67f2009-06-17 20:48:23 +000043#include "llvm/Transforms/Utils/Local.h"
Duncan Sands05f68372008-10-08 07:23:46 +000044#include <cstdio>
Owen Anderson85c40642007-07-24 17:55:58 +000045using namespace llvm;
46
Bill Wendling3858cae2008-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 Anderson7558f202008-07-15 16:28:06 +000050STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3858cae2008-12-22 22:14:07 +000051STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner1be83222008-03-22 04:13:49 +000052
Evan Cheng019a2e12008-06-20 01:01:07 +000053static cl::opt<bool> EnablePRE("enable-pre",
Owen Anderson3a053612008-07-17 19:41:00 +000054 cl::init(true), cl::Hidden);
Dan Gohman828f89f2009-06-15 18:30:15 +000055static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersona2bf7662008-06-19 19:57:25 +000056
Owen Anderson85c40642007-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 {
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +000065 struct Expression {
Dan Gohman7ce405e2009-06-04 22:49:04 +000066 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
67 UDIV, SDIV, FDIV, UREM, SREM,
Daniel Dunbar3be44e62009-09-20 02:20:51 +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,
Owen Anderson85c40642007-07-24 17:55:58 +000073 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
74 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
Daniel Dunbar3be44e62009-09-20 02:20:51 +000075 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson771d1122008-05-13 08:17:22 +000076 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Andersonb0cc5ed2008-06-19 17:25:39 +000077 EMPTY, TOMBSTONE };
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +000085 Value* function;
Daniel Dunbar3be44e62009-09-20 02:20:51 +000086
Owen Anderson85c40642007-07-24 17:55:58 +000087 Expression() { }
88 Expression(ExpressionOpcode o) : opcode(o) { }
Daniel Dunbar3be44e62009-09-20 02:20:51 +000089
Owen Anderson85c40642007-07-24 17:55:58 +000090 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 Anderson5e9366f2007-10-18 19:39:33 +000097 else if (function != other.function)
98 return false;
Owen Anderson85c40642007-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;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000108
Owen Anderson85c40642007-07-24 17:55:58 +0000109 for (size_t i = 0; i < varargs.size(); ++i)
110 if (varargs[i] != other.varargs[i])
111 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000112
Owen Anderson85c40642007-07-24 17:55:58 +0000113 return true;
114 }
115 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000116
Owen Anderson85c40642007-07-24 17:55:58 +0000117 bool operator!=(const Expression &other) const {
Bill Wendling9b5d4b72008-12-22 22:16:31 +0000118 return !(*this == other);
Owen Anderson85c40642007-07-24 17:55:58 +0000119 }
120 };
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000121
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000122 class ValueTable {
Owen Anderson85c40642007-07-24 17:55:58 +0000123 private:
124 DenseMap<Value*, uint32_t> valueNumbering;
125 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000126 AliasAnalysis* AA;
127 MemoryDependenceAnalysis* MD;
128 DominatorTree* DT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000129
Owen Anderson85c40642007-07-24 17:55:58 +0000130 uint32_t nextValueNumber;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000131
Owen Anderson85c40642007-07-24 17:55:58 +0000132 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 Anderson5e9366f2007-10-18 19:39:33 +0000143 Expression create_expression(CallInst* C);
Owen Anderson771d1122008-05-13 08:17:22 +0000144 Expression create_expression(Constant* C);
Owen Anderson85c40642007-07-24 17:55:58 +0000145 public:
Dan Gohman936a6522009-04-01 16:37:47 +0000146 ValueTable() : nextValueNumber(1) { }
Owen Anderson85c40642007-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 Andersonbcf2bd52008-05-12 20:15:55 +0000153 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner02ca4422008-12-01 00:40:32 +0000154 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000155 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
156 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson8a8d13c2008-07-03 17:44:33 +0000157 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling2a023742008-12-22 21:36:08 +0000158 void verifyRemoved(const Value *) const;
Owen Anderson85c40642007-07-24 17:55:58 +0000159 };
160}
161
162namespace llvm {
Chris Lattner92eea072007-09-17 18:34:04 +0000163template <> struct DenseMapInfo<Expression> {
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000164 static inline Expression getEmptyKey() {
165 return Expression(Expression::EMPTY);
166 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000167
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000168 static inline Expression getTombstoneKey() {
169 return Expression(Expression::TOMBSTONE);
170 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000171
Owen Anderson85c40642007-07-24 17:55:58 +0000172 static unsigned getHashValue(const Expression e) {
173 unsigned hash = e.opcode;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000174
Owen Anderson85c40642007-07-24 17:55:58 +0000175 hash = e.firstVN + hash * 37;
176 hash = e.secondVN + hash * 37;
177 hash = e.thirdVN + hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000178
Anton Korobeynikov8522e1c2008-02-20 11:26:25 +0000179 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
180 (unsigned)((uintptr_t)e.type >> 9)) +
181 hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000182
Owen Andersonbf8a3eb2007-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 Anderson85c40642007-07-24 17:55:58 +0000185 hash = *I + hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000186
Anton Korobeynikov8522e1c2008-02-20 11:26:25 +0000187 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
188 (unsigned)((uintptr_t)e.function >> 9)) +
189 hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000190
Owen Anderson85c40642007-07-24 17:55:58 +0000191 return hash;
192 }
Chris Lattner92eea072007-09-17 18:34:04 +0000193 static bool isEqual(const Expression &LHS, const Expression &RHS) {
194 return LHS == RHS;
195 }
Owen Anderson85c40642007-07-24 17:55:58 +0000196 static bool isPod() { return true; }
197};
198}
199
200//===----------------------------------------------------------------------===//
201// ValueTable Internal Functions
202//===----------------------------------------------------------------------===//
Chris Lattner3d7103e2008-03-21 21:14:38 +0000203Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson85c40642007-07-24 17:55:58 +0000204 switch(BO->getOpcode()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000205 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000206 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner3d7103e2008-03-21 21:14:38 +0000207 case Instruction::Add: return Expression::ADD;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000208 case Instruction::FAdd: return Expression::FADD;
Chris Lattner3d7103e2008-03-21 21:14:38 +0000209 case Instruction::Sub: return Expression::SUB;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000210 case Instruction::FSub: return Expression::FSUB;
Chris Lattner3d7103e2008-03-21 21:14:38 +0000211 case Instruction::Mul: return Expression::MUL;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000212 case Instruction::FMul: return Expression::FMUL;
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000225 }
226}
227
228Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewycky8f5253b2009-07-08 03:04:38 +0000229 if (isa<ICmpInst>(C)) {
Owen Anderson85c40642007-07-24 17:55:58 +0000230 switch (C->getPredicate()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000231 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000232 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000243 }
Nick Lewycky8f5253b2009-07-08 03:04:38 +0000244 } else {
245 switch (C->getPredicate()) {
246 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000247 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewycky8f5253b2009-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 Anderson85c40642007-07-24 17:55:58 +0000263 }
264}
265
Chris Lattner3d7103e2008-03-21 21:14:38 +0000266Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Anderson85c40642007-07-24 17:55:58 +0000267 switch(C->getOpcode()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000268 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000269 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000282 }
283}
284
Owen Anderson5e9366f2007-10-18 19:39:33 +0000285Expression ValueTable::create_expression(CallInst* C) {
286 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000287
Owen Anderson5e9366f2007-10-18 19:39:33 +0000288 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;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000294
Owen Anderson5e9366f2007-10-18 19:39:33 +0000295 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
296 I != E; ++I)
Owen Anderson07f478f2008-04-11 05:11:49 +0000297 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000298
Owen Anderson5e9366f2007-10-18 19:39:33 +0000299 return e;
300}
301
Owen Anderson85c40642007-07-24 17:55:58 +0000302Expression ValueTable::create_expression(BinaryOperator* BO) {
303 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000304
Owen Anderson07f478f2008-04-11 05:11:49 +0000305 e.firstVN = lookup_or_add(BO->getOperand(0));
306 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000307 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000308 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000309 e.type = BO->getType();
310 e.opcode = getOpcode(BO);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000311
Owen Anderson85c40642007-07-24 17:55:58 +0000312 return e;
313}
314
315Expression ValueTable::create_expression(CmpInst* C) {
316 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000317
Owen Anderson07f478f2008-04-11 05:11:49 +0000318 e.firstVN = lookup_or_add(C->getOperand(0));
319 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000320 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000321 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000322 e.type = C->getType();
323 e.opcode = getOpcode(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000324
Owen Anderson85c40642007-07-24 17:55:58 +0000325 return e;
326}
327
328Expression ValueTable::create_expression(CastInst* C) {
329 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000330
Owen Anderson07f478f2008-04-11 05:11:49 +0000331 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Anderson85c40642007-07-24 17:55:58 +0000332 e.secondVN = 0;
333 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000334 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000335 e.type = C->getType();
336 e.opcode = getOpcode(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000337
Owen Anderson85c40642007-07-24 17:55:58 +0000338 return e;
339}
340
341Expression ValueTable::create_expression(ShuffleVectorInst* S) {
342 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000343
Owen Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000347 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000348 e.type = S->getType();
349 e.opcode = Expression::SHUFFLE;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000350
Owen Anderson85c40642007-07-24 17:55:58 +0000351 return e;
352}
353
354Expression ValueTable::create_expression(ExtractElementInst* E) {
355 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000356
Owen Anderson07f478f2008-04-11 05:11:49 +0000357 e.firstVN = lookup_or_add(E->getOperand(0));
358 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000359 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000360 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000361 e.type = E->getType();
362 e.opcode = Expression::EXTRACT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000363
Owen Anderson85c40642007-07-24 17:55:58 +0000364 return e;
365}
366
367Expression ValueTable::create_expression(InsertElementInst* I) {
368 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000369
Owen Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000373 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000374 e.type = I->getType();
375 e.opcode = Expression::INSERT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000376
Owen Anderson85c40642007-07-24 17:55:58 +0000377 return e;
378}
379
380Expression ValueTable::create_expression(SelectInst* I) {
381 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000382
Owen Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000386 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000387 e.type = I->getType();
388 e.opcode = Expression::SELECT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000389
Owen Anderson85c40642007-07-24 17:55:58 +0000390 return e;
391}
392
393Expression ValueTable::create_expression(GetElementPtrInst* G) {
394 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000395
Owen Anderson07f478f2008-04-11 05:11:49 +0000396 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Anderson85c40642007-07-24 17:55:58 +0000397 e.secondVN = 0;
398 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000399 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000400 e.type = G->getType();
401 e.opcode = Expression::GEP;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000402
Owen Anderson85c40642007-07-24 17:55:58 +0000403 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
404 I != E; ++I)
Owen Anderson07f478f2008-04-11 05:11:49 +0000405 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000406
Owen Anderson85c40642007-07-24 17:55:58 +0000407 return e;
408}
409
410//===----------------------------------------------------------------------===//
411// ValueTable External Functions
412//===----------------------------------------------------------------------===//
413
Owen Andersone6b4ff82008-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 Anderson85c40642007-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;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000425
Owen Anderson5e9366f2007-10-18 19:39:33 +0000426 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson07f478f2008-04-11 05:11:49 +0000427 if (AA->doesNotAccessMemory(C)) {
Owen Anderson5e9366f2007-10-18 19:39:33 +0000428 Expression e = create_expression(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000429
Owen Anderson5e9366f2007-10-18 19:39:33 +0000430 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000437
Owen Anderson5e9366f2007-10-18 19:39:33 +0000438 return nextValueNumber++;
439 }
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000440 } else if (AA->onlyReadsMemory(C)) {
441 Expression e = create_expression(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000442
Owen Anderson771d1122008-05-13 08:17:22 +0000443 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000444 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
445 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson771d1122008-05-13 08:17:22 +0000446 return nextValueNumber++;
447 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000448
Chris Lattner12cafbf2008-11-29 02:29:27 +0000449 MemDepResult local_dep = MD->getDependency(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000450
Chris Lattner4531da82008-12-05 21:04:20 +0000451 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Anderson64fcc592008-05-13 23:18:30 +0000452 valueNumbering.insert(std::make_pair(V, nextValueNumber));
453 return nextValueNumber++;
Chris Lattnerd33b6662008-11-30 23:39:23 +0000454 }
Chris Lattner4531da82008-12-05 21:04:20 +0000455
456 if (local_dep.isDef()) {
457 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000458
Chris Lattner4531da82008-12-05 21:04:20 +0000459 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson64fcc592008-05-13 23:18:30 +0000460 valueNumbering.insert(std::make_pair(V, nextValueNumber));
461 return nextValueNumber++;
462 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000463
Chris Lattnerd33b6662008-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 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000472
Chris Lattnerd33b6662008-11-30 23:39:23 +0000473 uint32_t v = lookup_or_add(local_cdep);
474 valueNumbering.insert(std::make_pair(V, v));
475 return v;
Owen Anderson64fcc592008-05-13 23:18:30 +0000476 }
Chris Lattner46876282008-12-01 01:15:42 +0000477
Chris Lattner4531da82008-12-05 21:04:20 +0000478 // Non-local case.
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000479 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner35d5cf52008-12-09 19:38:05 +0000480 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattner4531da82008-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 Anderson3ebaca72008-05-13 13:41:23 +0000483 CallInst* cdep = 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000484
Chris Lattnerd33b6662008-11-30 23:39:23 +0000485 // Check to see if we have a single dominating call instruction that is
486 // identical to C.
Chris Lattner46876282008-12-01 01:15:42 +0000487 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
488 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattnerd33b6662008-11-30 23:39:23 +0000489 // Ignore non-local dependencies.
490 if (I->second.isNonLocal())
491 continue;
Owen Anderson771d1122008-05-13 08:17:22 +0000492
Chris Lattnerd33b6662008-11-30 23:39:23 +0000493 // We don't handle non-depedencies. If we already have a call, reject
494 // instruction dependencies.
Chris Lattner4531da82008-12-05 21:04:20 +0000495 if (I->second.isClobber() || cdep != 0) {
Chris Lattnerd33b6662008-11-30 23:39:23 +0000496 cdep = 0;
497 break;
Owen Anderson771d1122008-05-13 08:17:22 +0000498 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000499
Chris Lattnerd33b6662008-11-30 23:39:23 +0000500 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 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000506
Chris Lattnerd33b6662008-11-30 23:39:23 +0000507 cdep = 0;
508 break;
Owen Anderson771d1122008-05-13 08:17:22 +0000509 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000510
Owen Anderson3ebaca72008-05-13 13:41:23 +0000511 if (!cdep) {
Owen Anderson771d1122008-05-13 08:17:22 +0000512 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000513 return nextValueNumber++;
514 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000515
Chris Lattner4531da82008-12-05 21:04:20 +0000516 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson771d1122008-05-13 08:17:22 +0000517 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000518 return nextValueNumber++;
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000519 }
Chris Lattnerd33b6662008-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 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000528
Chris Lattnerd33b6662008-11-30 23:39:23 +0000529 uint32_t v = lookup_or_add(cdep);
530 valueNumbering.insert(std::make_pair(V, v));
531 return v;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000532
Owen Anderson5e9366f2007-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 Anderson85c40642007-07-24 17:55:58 +0000538 Expression e = create_expression(BO);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000539
Owen Anderson85c40642007-07-24 17:55:58 +0000540 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000547
Owen Anderson85c40642007-07-24 17:55:58 +0000548 return nextValueNumber++;
549 }
550 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
551 Expression e = create_expression(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000552
Owen Anderson85c40642007-07-24 17:55:58 +0000553 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000560
Owen Anderson85c40642007-07-24 17:55:58 +0000561 return nextValueNumber++;
562 }
563 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
564 Expression e = create_expression(U);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000565
Owen Anderson85c40642007-07-24 17:55:58 +0000566 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000573
Owen Anderson85c40642007-07-24 17:55:58 +0000574 return nextValueNumber++;
575 }
576 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
577 Expression e = create_expression(U);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000578
Owen Anderson85c40642007-07-24 17:55:58 +0000579 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000586
Owen Anderson85c40642007-07-24 17:55:58 +0000587 return nextValueNumber++;
588 }
589 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
590 Expression e = create_expression(U);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000591
Owen Anderson85c40642007-07-24 17:55:58 +0000592 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000599
Owen Anderson85c40642007-07-24 17:55:58 +0000600 return nextValueNumber++;
601 }
602 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
603 Expression e = create_expression(U);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000604
Owen Anderson85c40642007-07-24 17:55:58 +0000605 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000612
Owen Anderson85c40642007-07-24 17:55:58 +0000613 return nextValueNumber++;
614 }
615 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
616 Expression e = create_expression(U);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000617
Owen Anderson85c40642007-07-24 17:55:58 +0000618 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000625
Owen Anderson85c40642007-07-24 17:55:58 +0000626 return nextValueNumber++;
627 }
628 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
629 Expression e = create_expression(U);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000630
Owen Anderson85c40642007-07-24 17:55:58 +0000631 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));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000638
Owen Anderson85c40642007-07-24 17:55:58 +0000639 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 Lattner3d7103e2008-03-21 21:14:38 +0000651 assert(VI != valueNumbering.end() && "Value not numbered?");
652 return VI->second;
Owen Anderson85c40642007-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 Anderson5aff8002007-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 Wendling2a023742008-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 Anderson85c40642007-07-24 17:55:58 +0000676//===----------------------------------------------------------------------===//
Bill Wendling42f17f62008-12-22 22:32:22 +0000677// GVN Pass
Owen Anderson85c40642007-07-24 17:55:58 +0000678//===----------------------------------------------------------------------===//
679
680namespace {
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000681 struct ValueNumberScope {
Owen Anderson2a412722008-06-20 01:15:47 +0000682 ValueNumberScope* parent;
683 DenseMap<uint32_t, Value*> table;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000684
Owen Anderson2a412722008-06-20 01:15:47 +0000685 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
686 };
687}
688
689namespace {
Owen Anderson85c40642007-07-24 17:55:58 +0000690
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000691 class GVN : public FunctionPass {
Owen Anderson85c40642007-07-24 17:55:58 +0000692 bool runOnFunction(Function &F);
693 public:
694 static char ID; // Pass identification, replacement for typeid
Dan Gohman26f8c272008-09-04 17:05:41 +0000695 GVN() : FunctionPass(&ID) { }
Owen Anderson85c40642007-07-24 17:55:58 +0000696
697 private:
Chris Lattner02ca4422008-12-01 00:40:32 +0000698 MemoryDependenceAnalysis *MD;
699 DominatorTree *DT;
700
Owen Anderson85c40642007-07-24 17:55:58 +0000701 ValueTable VN;
Owen Anderson2a412722008-06-20 01:15:47 +0000702 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000703
Owen Anderson5b299672007-08-07 23:12:31 +0000704 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
705 PhiMapType phiMap;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000706
707
Owen Anderson85c40642007-07-24 17:55:58 +0000708 // This transformation requires dominator postdominator info
709 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson85c40642007-07-24 17:55:58 +0000710 AU.addRequired<DominatorTree>();
711 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000712 AU.addRequired<AliasAnalysis>();
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000713
Owen Andersonaef6a922008-06-23 17:49:45 +0000714 AU.addPreserved<DominatorTree>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000715 AU.addPreserved<AliasAnalysis>();
Owen Anderson85c40642007-07-24 17:55:58 +0000716 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000717
Owen Anderson85c40642007-07-24 17:55:58 +0000718 // Helper fuctions
719 // FIXME: eliminate or document these better
Owen Anderson85c40642007-07-24 17:55:58 +0000720 bool processLoad(LoadInst* L,
Chris Lattner7de20452008-03-21 22:01:16 +0000721 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson85c40642007-07-24 17:55:58 +0000722 bool processInstruction(Instruction* I,
Chris Lattner7de20452008-03-21 22:01:16 +0000723 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000724 bool processNonLocalLoad(LoadInst* L,
Chris Lattner7de20452008-03-21 22:01:16 +0000725 SmallVectorImpl<Instruction*> &toErase);
Owen Andersona03e7862008-12-15 02:03:00 +0000726 bool processBlock(BasicBlock* BB);
Owen Anderson5e5e5612008-12-14 19:10:35 +0000727 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Andersonc6a31b92007-08-02 17:56:05 +0000728 DenseMap<BasicBlock*, Value*> &Phis,
729 bool top_level = false);
Owen Andersone6b4ff82008-06-18 21:41:49 +0000730 void dump(DenseMap<uint32_t, Value*>& d);
Owen Andersonbe168b32007-08-14 18:04:11 +0000731 bool iterateOnFunction(Function &F);
Owen Andersone02ad522007-08-16 22:51:56 +0000732 Value* CollapsePhi(PHINode* p);
Owen Andersone6b4ff82008-06-18 21:41:49 +0000733 bool performPRE(Function& F);
Owen Anderson2a412722008-06-20 01:15:47 +0000734 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Andersona03e7862008-12-15 02:03:00 +0000735 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopes274474b2008-10-10 16:25:50 +0000736 void cleanupGlobalSets();
Bill Wendling2a023742008-12-22 21:36:08 +0000737 void verifyRemoved(const Instruction *I) const;
Owen Anderson85c40642007-07-24 17:55:58 +0000738 };
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000739
Owen Anderson85c40642007-07-24 17:55:58 +0000740 char GVN::ID = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000741}
742
743// createGVNPass - The public interface to this file...
744FunctionPass *llvm::createGVNPass() { return new GVN(); }
745
746static RegisterPass<GVN> X("gvn",
747 "Global Value Numbering");
748
Owen Andersone6b4ff82008-06-18 21:41:49 +0000749void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5d72a422007-07-25 19:57:03 +0000750 printf("{\n");
Owen Andersone6b4ff82008-06-18 21:41:49 +0000751 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5d72a422007-07-25 19:57:03 +0000752 E = d.end(); I != E; ++I) {
Owen Andersone6b4ff82008-06-18 21:41:49 +0000753 printf("%d\n", I->first);
Owen Anderson5d72a422007-07-25 19:57:03 +0000754 I->second->dump();
755 }
756 printf("}\n");
757}
758
Owen Andersond68b1af2009-08-26 22:55:11 +0000759static bool isSafeReplacement(PHINode* p, Instruction* inst) {
760 if (!isa<PHINode>(inst))
761 return true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000762
Owen Andersond68b1af2009-08-26 22:55:11 +0000763 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
764 UI != E; ++UI)
765 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
766 if (use_phi->getParent() == inst->getParent())
767 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000768
Owen Andersond68b1af2009-08-26 22:55:11 +0000769 return true;
770}
771
Owen Andersone02ad522007-08-16 22:51:56 +0000772Value* GVN::CollapsePhi(PHINode* p) {
Dan Gohman798e5412009-09-03 15:34:35 +0000773 Value* constVal = p->hasConstantValue(DT);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000774 if (!constVal) return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000775
Chris Lattner3d7103e2008-03-21 21:14:38 +0000776 Instruction* inst = dyn_cast<Instruction>(constVal);
777 if (!inst)
778 return constVal;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000779
Chris Lattner02ca4422008-12-01 00:40:32 +0000780 if (DT->dominates(inst, p))
Chris Lattner3d7103e2008-03-21 21:14:38 +0000781 if (isSafeReplacement(p, inst))
782 return inst;
Owen Andersone02ad522007-08-16 22:51:56 +0000783 return 0;
784}
Owen Anderson5d72a422007-07-25 19:57:03 +0000785
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000786/// GetValueForBlock - Get the value to use within the specified basic block.
787/// available values are in Phis.
Owen Anderson5e5e5612008-12-14 19:10:35 +0000788Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner3d7103e2008-03-21 21:14:38 +0000789 DenseMap<BasicBlock*, Value*> &Phis,
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000790 bool top_level) {
791
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000792 // If we have already computed this value, return the previously computed val.
Owen Andersoned7f9932007-08-03 19:59:35 +0000793 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
794 if (V != Phis.end() && !top_level) return V->second;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000795
Owen Andersonc3714b22008-07-02 18:15:31 +0000796 // If the block is unreachable, just return undef, since this path
797 // can't actually occur at runtime.
Chris Lattner02ca4422008-12-01 00:40:32 +0000798 if (!DT->isReachableFromEntry(BB))
Owen Andersonb99ecca2009-07-30 23:03:37 +0000799 return Phis[BB] = UndefValue::get(orig->getType());
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000800
Chris Lattner4bab29b2008-12-09 19:21:47 +0000801 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
802 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Andersoned7f9932007-08-03 19:59:35 +0000803 Phis[BB] = ret;
804 return ret;
Owen Anderson30463f12007-08-03 11:03:26 +0000805 }
Chris Lattner4bab29b2008-12-09 19:21:47 +0000806
807 // Get the number of predecessors of this block so we can reserve space later.
808 // If there is already a PHI in it, use the #preds from it, otherwise count.
809 // Getting it from the PHI is constant time.
810 unsigned NumPreds;
811 if (PHINode *ExistingPN = dyn_cast<PHINode>(BB->begin()))
812 NumPreds = ExistingPN->getNumIncomingValues();
813 else
814 NumPreds = std::distance(pred_begin(BB), pred_end(BB));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000815
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000816 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
817 // now, then get values to fill in the incoming values for the PHI.
Gabor Greifd6da1d02008-04-06 20:25:17 +0000818 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
819 BB->begin());
Chris Lattner4bab29b2008-12-09 19:21:47 +0000820 PN->reserveOperandSpace(NumPreds);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000821
Chris Lattner4bab29b2008-12-09 19:21:47 +0000822 Phis.insert(std::make_pair(BB, PN));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000823
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000824 // Fill in the incoming values for the block.
Owen Anderson9f577412007-07-31 17:43:14 +0000825 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
826 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Anderson9f577412007-07-31 17:43:14 +0000827 PN->addIncoming(val, *PI);
828 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000829
Chris Lattner02ca4422008-12-01 00:40:32 +0000830 VN.getAliasAnalysis()->copyValue(orig, PN);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000831
Owen Andersone0143452007-08-16 22:02:55 +0000832 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersone02ad522007-08-16 22:51:56 +0000833 Value* v = CollapsePhi(PN);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000834 if (!v) {
835 // Cache our phi construction results
Owen Anderson5e5e5612008-12-14 19:10:35 +0000836 if (LoadInst* L = dyn_cast<LoadInst>(orig))
837 phiMap[L->getPointerOperand()].insert(PN);
838 else
839 phiMap[orig].insert(PN);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000840
Chris Lattner3d7103e2008-03-21 21:14:38 +0000841 return PN;
Owen Anderson9f577412007-07-31 17:43:14 +0000842 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000843
Chris Lattner3d7103e2008-03-21 21:14:38 +0000844 PN->replaceAllUsesWith(v);
Chris Lattnerf81b0142008-12-09 22:06:23 +0000845 if (isa<PointerType>(v->getType()))
846 MD->invalidateCachedPointerInfo(v);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000847
848 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
849 E = Phis.end(); I != E; ++I)
850 if (I->second == PN)
851 I->second = v;
852
Dan Gohman7e124382009-07-31 20:24:18 +0000853 DEBUG(errs() << "GVN removed: " << *PN << '\n');
Chris Lattner02ca4422008-12-01 00:40:32 +0000854 MD->removeInstruction(PN);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000855 PN->eraseFromParent();
Bill Wendling2a023742008-12-22 21:36:08 +0000856 DEBUG(verifyRemoved(PN));
Chris Lattner3d7103e2008-03-21 21:14:38 +0000857
858 Phis[BB] = v;
859 return v;
Owen Anderson5d72a422007-07-25 19:57:03 +0000860}
861
Chris Lattnerdcded152008-12-02 08:16:11 +0000862/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
863/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattner159b98f2008-12-05 07:49:08 +0000864/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
865/// map is actually a tri-state map with the following values:
866/// 0) we know the block *is not* fully available.
867/// 1) we know the block *is* fully available.
868/// 2) we do not know whether the block is fully available or not, but we are
869/// currently speculating that it will be.
870/// 3) we are speculating for this block and have used that to speculate for
871/// other blocks.
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000872static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner159b98f2008-12-05 07:49:08 +0000873 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerdcded152008-12-02 08:16:11 +0000874 // Optimistically assume that the block is fully available and check to see
875 // if we already know about this block in one lookup.
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000876 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
Chris Lattner159b98f2008-12-05 07:49:08 +0000877 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerdcded152008-12-02 08:16:11 +0000878
879 // If the entry already existed for this block, return the precomputed value.
Chris Lattner159b98f2008-12-05 07:49:08 +0000880 if (!IV.second) {
881 // If this is a speculative "available" value, mark it as being used for
882 // speculation of other blocks.
883 if (IV.first->second == 2)
884 IV.first->second = 3;
885 return IV.first->second != 0;
886 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000887
Chris Lattnerdcded152008-12-02 08:16:11 +0000888 // Otherwise, see if it is fully available in all predecessors.
889 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000890
Chris Lattnerdcded152008-12-02 08:16:11 +0000891 // If this block has no predecessors, it isn't live-in here.
892 if (PI == PE)
Chris Lattner159b98f2008-12-05 07:49:08 +0000893 goto SpeculationFailure;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000894
Chris Lattnerdcded152008-12-02 08:16:11 +0000895 for (; PI != PE; ++PI)
896 // If the value isn't fully available in one of our predecessors, then it
897 // isn't fully available in this block either. Undo our previous
898 // optimistic assumption and bail out.
899 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattner159b98f2008-12-05 07:49:08 +0000900 goto SpeculationFailure;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000901
Chris Lattnerdcded152008-12-02 08:16:11 +0000902 return true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000903
Chris Lattner159b98f2008-12-05 07:49:08 +0000904// SpeculationFailure - If we get here, we found out that this is not, after
905// all, a fully-available block. We have a problem if we speculated on this and
906// used the speculation to mark other blocks as available.
907SpeculationFailure:
908 char &BBVal = FullyAvailableBlocks[BB];
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000909
Chris Lattner159b98f2008-12-05 07:49:08 +0000910 // If we didn't speculate on this, just return with it set to false.
911 if (BBVal == 2) {
912 BBVal = 0;
913 return false;
914 }
915
916 // If we did speculate on this value, we could have blocks set to 1 that are
917 // incorrect. Walk the (transitive) successors of this block and mark them as
918 // 0 if set to one.
919 SmallVector<BasicBlock*, 32> BBWorklist;
920 BBWorklist.push_back(BB);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000921
Chris Lattner159b98f2008-12-05 07:49:08 +0000922 while (!BBWorklist.empty()) {
923 BasicBlock *Entry = BBWorklist.pop_back_val();
924 // Note that this sets blocks to 0 (unavailable) if they happen to not
925 // already be in FullyAvailableBlocks. This is safe.
926 char &EntryVal = FullyAvailableBlocks[Entry];
927 if (EntryVal == 0) continue; // Already unavailable.
928
929 // Mark as unavailable.
930 EntryVal = 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000931
Chris Lattner159b98f2008-12-05 07:49:08 +0000932 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
933 BBWorklist.push_back(*I);
934 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000935
Chris Lattner159b98f2008-12-05 07:49:08 +0000936 return false;
Chris Lattnerdcded152008-12-02 08:16:11 +0000937}
938
Owen Andersone0143452007-08-16 22:02:55 +0000939/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
940/// non-local by performing PHI construction.
Chris Lattnerdcded152008-12-02 08:16:11 +0000941bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner7de20452008-03-21 22:01:16 +0000942 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerdcded152008-12-02 08:16:11 +0000943 // Find the non-local dependencies of the load.
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000944 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
Chris Lattneraf713862008-12-09 19:25:07 +0000945 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
946 Deps);
Dan Gohman7e124382009-07-31 20:24:18 +0000947 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: "
948 // << Deps.size() << *LI << '\n');
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000949
Owen Anderson90e717d2008-08-26 22:07:42 +0000950 // If we had to process more than one hundred blocks to find the
951 // dependencies, this load isn't worth worrying about. Optimizing
952 // it will be too expensive.
Chris Lattneraf713862008-12-09 19:25:07 +0000953 if (Deps.size() > 100)
Owen Anderson90e717d2008-08-26 22:07:42 +0000954 return false;
Chris Lattner8d1686f2008-12-18 00:51:32 +0000955
956 // If we had a phi translation failure, we'll have a single entry which is a
957 // clobber in the current block. Reject this early.
Edwin Török3ffffac2009-06-17 18:48:18 +0000958 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
959 DEBUG(
Dan Gohman0be10b02009-07-25 01:43:01 +0000960 errs() << "GVN: non-local load ";
961 WriteAsOperand(errs(), LI);
Dan Gohman7e124382009-07-31 20:24:18 +0000962 errs() << " is clobbered by " << *Deps[0].second.getInst() << '\n';
Edwin Török3ffffac2009-06-17 18:48:18 +0000963 );
Chris Lattner8d1686f2008-12-18 00:51:32 +0000964 return false;
Edwin Török3ffffac2009-06-17 18:48:18 +0000965 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000966
Chris Lattnerdcded152008-12-02 08:16:11 +0000967 // Filter out useless results (non-locals, etc). Keep track of the blocks
968 // where we have a value available in repl, also keep track of whether we see
969 // dependencies that produce an unknown value for the load (such as a call
970 // that could potentially clobber the load).
971 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
972 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000973
Chris Lattneraf713862008-12-09 19:25:07 +0000974 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
975 BasicBlock *DepBB = Deps[i].first;
976 MemDepResult DepInfo = Deps[i].second;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000977
Chris Lattner4531da82008-12-05 21:04:20 +0000978 if (DepInfo.isClobber()) {
979 UnavailableBlocks.push_back(DepBB);
980 continue;
981 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000982
Chris Lattner4531da82008-12-05 21:04:20 +0000983 Instruction *DepInst = DepInfo.getInst();
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000984
Chris Lattner4531da82008-12-05 21:04:20 +0000985 // Loading the allocation -> undef.
Victor Hernandez48c3c542009-09-18 22:35:49 +0000986 if (isa<AllocationInst>(DepInst) || isMalloc(DepInst)) {
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000987 ValuesPerBlock.push_back(std::make_pair(DepBB,
Owen Andersonb99ecca2009-07-30 23:03:37 +0000988 UndefValue::get(LI->getType())));
Chris Lattner46876282008-12-01 01:15:42 +0000989 continue;
990 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000991
Chris Lattneraf713862008-12-09 19:25:07 +0000992 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000993 // Reject loads and stores that are to the same address but are of
Chris Lattnera207fe52008-12-01 01:31:36 +0000994 // different types.
995 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
996 // of bitfield access, it would be interesting to optimize for it at some
997 // point.
Chris Lattnerdcded152008-12-02 08:16:11 +0000998 if (S->getOperand(0)->getType() != LI->getType()) {
999 UnavailableBlocks.push_back(DepBB);
1000 continue;
1001 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001002
Chris Lattnerdcded152008-12-02 08:16:11 +00001003 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001004
Chris Lattneraf713862008-12-09 19:25:07 +00001005 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerdcded152008-12-02 08:16:11 +00001006 if (LD->getType() != LI->getType()) {
1007 UnavailableBlocks.push_back(DepBB);
1008 continue;
1009 }
Chris Lattnerdcded152008-12-02 08:16:11 +00001010 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5d72a422007-07-25 19:57:03 +00001011 } else {
Chris Lattnerdcded152008-12-02 08:16:11 +00001012 UnavailableBlocks.push_back(DepBB);
1013 continue;
Owen Anderson5d72a422007-07-25 19:57:03 +00001014 }
Chris Lattner3d7103e2008-03-21 21:14:38 +00001015 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001016
Chris Lattnerdcded152008-12-02 08:16:11 +00001017 // If we have no predecessors that produce a known value for this load, exit
1018 // early.
1019 if (ValuesPerBlock.empty()) return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001020
Chris Lattnerdcded152008-12-02 08:16:11 +00001021 // If all of the instructions we depend on produce a known value for this
1022 // load, then it is fully redundant and we can use PHI insertion to compute
1023 // its value. Insert PHIs and remove the fully redundant value now.
1024 if (UnavailableBlocks.empty()) {
1025 // Use cached PHI construction information from previous runs
1026 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattneraf713862008-12-09 19:25:07 +00001027 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattnerdcded152008-12-02 08:16:11 +00001028 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1029 I != E; ++I) {
1030 if ((*I)->getParent() == LI->getParent()) {
Dan Gohman7e124382009-07-31 20:24:18 +00001031 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD #1: " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001032 LI->replaceAllUsesWith(*I);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001033 if (isa<PointerType>((*I)->getType()))
1034 MD->invalidateCachedPointerInfo(*I);
Chris Lattnerdcded152008-12-02 08:16:11 +00001035 toErase.push_back(LI);
1036 NumGVNLoad++;
1037 return true;
1038 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001039
Chris Lattnerdcded152008-12-02 08:16:11 +00001040 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Anderson5b299672007-08-07 23:12:31 +00001041 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001042
Dan Gohman7e124382009-07-31 20:24:18 +00001043 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001044
Chris Lattnerdcded152008-12-02 08:16:11 +00001045 DenseMap<BasicBlock*, Value*> BlockReplValues;
1046 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1047 // Perform PHI construction.
1048 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1049 LI->replaceAllUsesWith(v);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001050
Chris Lattner0cb92f82009-02-12 07:00:35 +00001051 if (isa<PHINode>(v))
Chris Lattnerfcbc3032008-12-15 03:46:38 +00001052 v->takeName(LI);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001053 if (isa<PointerType>(v->getType()))
1054 MD->invalidateCachedPointerInfo(v);
Chris Lattnerdcded152008-12-02 08:16:11 +00001055 toErase.push_back(LI);
1056 NumGVNLoad++;
1057 return true;
1058 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001059
Chris Lattnerdcded152008-12-02 08:16:11 +00001060 if (!EnablePRE || !EnableLoadPRE)
1061 return false;
1062
1063 // Okay, we have *some* definitions of the value. This means that the value
1064 // is available in some of our (transitive) predecessors. Lets think about
1065 // doing PRE of this load. This will involve inserting a new load into the
1066 // predecessor when it's not available. We could do this in general, but
1067 // prefer to not increase code size. As such, we only do this when we know
1068 // that we only have to insert *one* load (which means we're basically moving
1069 // the load, not inserting a new one).
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001070
Owen Andersondd37b182009-05-31 09:03:40 +00001071 SmallPtrSet<BasicBlock *, 4> Blockers;
1072 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1073 Blockers.insert(UnavailableBlocks[i]);
1074
1075 // Lets find first basic block with more than one predecessor. Walk backwards
1076 // through predecessors if needed.
Chris Lattnerdcded152008-12-02 08:16:11 +00001077 BasicBlock *LoadBB = LI->getParent();
Owen Andersondd37b182009-05-31 09:03:40 +00001078 BasicBlock *TmpBB = LoadBB;
1079
1080 bool isSinglePred = false;
Dale Johannesena19b67f2009-06-17 20:48:23 +00001081 bool allSingleSucc = true;
Owen Andersondd37b182009-05-31 09:03:40 +00001082 while (TmpBB->getSinglePredecessor()) {
1083 isSinglePred = true;
1084 TmpBB = TmpBB->getSinglePredecessor();
1085 if (!TmpBB) // If haven't found any, bail now.
1086 return false;
1087 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1088 return false;
1089 if (Blockers.count(TmpBB))
1090 return false;
Dale Johannesena19b67f2009-06-17 20:48:23 +00001091 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1092 allSingleSucc = false;
Owen Andersondd37b182009-05-31 09:03:40 +00001093 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001094
Owen Andersondd37b182009-05-31 09:03:40 +00001095 assert(TmpBB);
1096 LoadBB = TmpBB;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001097
Chris Lattnerdcded152008-12-02 08:16:11 +00001098 // If we have a repl set with LI itself in it, this means we have a loop where
1099 // at least one of the values is LI. Since this means that we won't be able
1100 // to eliminate LI even if we insert uses in the other predecessors, we will
1101 // end up increasing code size. Reject this by scanning for LI.
1102 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1103 if (ValuesPerBlock[i].second == LI)
1104 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001105
Owen Andersondd37b182009-05-31 09:03:40 +00001106 if (isSinglePred) {
1107 bool isHot = false;
1108 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1109 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001110 // "Hot" Instruction is in some loop (because it dominates its dep.
1111 // instruction).
1112 if (DT->dominates(LI, I)) {
1113 isHot = true;
1114 break;
1115 }
Owen Andersondd37b182009-05-31 09:03:40 +00001116
1117 // We are interested only in "hot" instructions. We don't want to do any
1118 // mis-optimizations here.
1119 if (!isHot)
1120 return false;
1121 }
1122
Chris Lattnerdcded152008-12-02 08:16:11 +00001123 // Okay, we have some hope :). Check to see if the loaded value is fully
1124 // available in all but one predecessor.
1125 // FIXME: If we could restructure the CFG, we could make a common pred with
1126 // all the preds that don't have an available LI and insert a new load into
1127 // that one block.
1128 BasicBlock *UnavailablePred = 0;
1129
Chris Lattner159b98f2008-12-05 07:49:08 +00001130 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerdcded152008-12-02 08:16:11 +00001131 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1132 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1133 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1134 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1135
1136 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1137 PI != E; ++PI) {
1138 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1139 continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001140
Chris Lattnerdcded152008-12-02 08:16:11 +00001141 // If this load is not available in multiple predecessors, reject it.
1142 if (UnavailablePred && UnavailablePred != *PI)
1143 return false;
1144 UnavailablePred = *PI;
1145 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001146
Chris Lattnerdcded152008-12-02 08:16:11 +00001147 assert(UnavailablePred != 0 &&
1148 "Fully available value should be eliminated above!");
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001149
Chris Lattnerdcded152008-12-02 08:16:11 +00001150 // If the loaded pointer is PHI node defined in this block, do PHI translation
1151 // to get its value in the predecessor.
1152 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001153
Chris Lattnerdcded152008-12-02 08:16:11 +00001154 // Make sure the value is live in the predecessor. If it was defined by a
1155 // non-PHI instruction in this block, we don't know how to recompute it above.
1156 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1157 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
Daniel Dunbar005975c2009-07-25 00:23:56 +00001158 DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
Dan Gohman7e124382009-07-31 20:24:18 +00001159 << *LPInst << '\n' << *LI << "\n");
Chris Lattnerdcded152008-12-02 08:16:11 +00001160 return false;
1161 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001162
Chris Lattnerdcded152008-12-02 08:16:11 +00001163 // We don't currently handle critical edges :(
1164 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbar005975c2009-07-25 00:23:56 +00001165 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
Dan Gohman7e124382009-07-31 20:24:18 +00001166 << UnavailablePred->getName() << "': " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001167 return false;
Owen Anderson5b299672007-08-07 23:12:31 +00001168 }
Dale Johannesena19b67f2009-06-17 20:48:23 +00001169
1170 // Make sure it is valid to move this load here. We have to watch out for:
1171 // @1 = getelementptr (i8* p, ...
1172 // test p and branch if == 0
1173 // load @1
1174 // It is valid to have the getelementptr before the test, even if p can be 0,
1175 // as getelementptr only does address arithmetic.
1176 // If we are not pushing the value through any multiple-successor blocks
1177 // we do not have this case. Otherwise, check that the load is safe to
1178 // put anywhere; this can be improved, but should be conservatively safe.
1179 if (!allSingleSucc &&
1180 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
1181 return false;
1182
Chris Lattnerdcded152008-12-02 08:16:11 +00001183 // Okay, we can eliminate this load by inserting a reload in the predecessor
1184 // and using PHI construction to get the value in the other predecessors, do
1185 // it.
Dan Gohman7e124382009-07-31 20:24:18 +00001186 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001187
Chris Lattnerdcded152008-12-02 08:16:11 +00001188 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1189 LI->getAlignment(),
1190 UnavailablePred->getTerminator());
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001191
Owen Anderson1c057ee2009-05-29 05:37:54 +00001192 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1193 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1194 I != E; ++I)
1195 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001196
Chris Lattnerdcded152008-12-02 08:16:11 +00001197 DenseMap<BasicBlock*, Value*> BlockReplValues;
1198 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1199 BlockReplValues[UnavailablePred] = NewLoad;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001200
Chris Lattnerdcded152008-12-02 08:16:11 +00001201 // Perform PHI construction.
1202 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1203 LI->replaceAllUsesWith(v);
Chris Lattner0cb92f82009-02-12 07:00:35 +00001204 if (isa<PHINode>(v))
Chris Lattnerfcbc3032008-12-15 03:46:38 +00001205 v->takeName(LI);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001206 if (isa<PointerType>(v->getType()))
1207 MD->invalidateCachedPointerInfo(v);
Chris Lattnerdcded152008-12-02 08:16:11 +00001208 toErase.push_back(LI);
1209 NumPRELoad++;
Owen Anderson5d72a422007-07-25 19:57:03 +00001210 return true;
1211}
1212
Owen Andersone0143452007-08-16 22:02:55 +00001213/// processLoad - Attempt to eliminate a load, first by eliminating it
1214/// locally, and then attempting non-local elimination if that fails.
Chris Lattner4531da82008-12-05 21:04:20 +00001215bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1216 if (L->isVolatile())
Owen Anderson85c40642007-07-24 17:55:58 +00001217 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001218
Owen Anderson85c40642007-07-24 17:55:58 +00001219 Value* pointer = L->getPointerOperand();
Chris Lattner4531da82008-12-05 21:04:20 +00001220
Owen Anderson85c40642007-07-24 17:55:58 +00001221 // ... to a pointer that has been loaded from before...
Chris Lattner02ca4422008-12-01 00:40:32 +00001222 MemDepResult dep = MD->getDependency(L);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001223
Chris Lattner4531da82008-12-05 21:04:20 +00001224 // If the value isn't available, don't do anything!
Edwin Török47cf8842009-05-29 09:46:03 +00001225 if (dep.isClobber()) {
1226 DEBUG(
1227 // fast print dep, using operator<< on instruction would be too slow
Dan Gohman0be10b02009-07-25 01:43:01 +00001228 errs() << "GVN: load ";
1229 WriteAsOperand(errs(), L);
Edwin Török47cf8842009-05-29 09:46:03 +00001230 Instruction *I = dep.getInst();
Dan Gohman7e124382009-07-31 20:24:18 +00001231 errs() << " is clobbered by " << *I << '\n';
Edwin Török47cf8842009-05-29 09:46:03 +00001232 );
Chris Lattner4531da82008-12-05 21:04:20 +00001233 return false;
Edwin Török47cf8842009-05-29 09:46:03 +00001234 }
Chris Lattner4531da82008-12-05 21:04:20 +00001235
1236 // If it is defined in another block, try harder.
Chris Lattner4bab29b2008-12-09 19:21:47 +00001237 if (dep.isNonLocal())
Chris Lattner4531da82008-12-05 21:04:20 +00001238 return processNonLocalLoad(L, toErase);
Eli Friedman350307f2008-02-12 12:08:14 +00001239
Chris Lattner4531da82008-12-05 21:04:20 +00001240 Instruction *DepInst = dep.getInst();
1241 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1242 // Only forward substitute stores to loads of the same type.
1243 // FIXME: Could do better!
1244 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1245 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001246
Chris Lattner4531da82008-12-05 21:04:20 +00001247 // Remove it!
1248 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerf81b0142008-12-09 22:06:23 +00001249 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1250 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattner4531da82008-12-05 21:04:20 +00001251 toErase.push_back(L);
1252 NumGVNLoad++;
1253 return true;
1254 }
1255
1256 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1257 // Only forward substitute stores to loads of the same type.
1258 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1259 if (DepLI->getType() != L->getType())
1260 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001261
Chris Lattner4531da82008-12-05 21:04:20 +00001262 // Remove it!
1263 L->replaceAllUsesWith(DepLI);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001264 if (isa<PointerType>(DepLI->getType()))
1265 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner4531da82008-12-05 21:04:20 +00001266 toErase.push_back(L);
1267 NumGVNLoad++;
1268 return true;
1269 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001270
Chris Lattner8ea60462008-11-30 01:39:32 +00001271 // If this load really doesn't depend on anything, then we must be loading an
1272 // undef value. This can happen when loading for a fresh allocation with no
1273 // intervening stores, for example.
Victor Hernandez48c3c542009-09-18 22:35:49 +00001274 if (isa<AllocationInst>(DepInst) || isMalloc(DepInst)) {
Owen Andersonb99ecca2009-07-30 23:03:37 +00001275 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Chris Lattner8ea60462008-11-30 01:39:32 +00001276 toErase.push_back(L);
Chris Lattner8ea60462008-11-30 01:39:32 +00001277 NumGVNLoad++;
Chris Lattner4531da82008-12-05 21:04:20 +00001278 return true;
Eli Friedman350307f2008-02-12 12:08:14 +00001279 }
1280
Chris Lattner4531da82008-12-05 21:04:20 +00001281 return false;
Owen Anderson85c40642007-07-24 17:55:58 +00001282}
1283
Owen Anderson2a412722008-06-20 01:15:47 +00001284Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Andersonaef6a922008-06-23 17:49:45 +00001285 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1286 if (I == localAvail.end())
1287 return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001288
Owen Andersonaef6a922008-06-23 17:49:45 +00001289 ValueNumberScope* locals = I->second;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001290
Owen Anderson2a412722008-06-20 01:15:47 +00001291 while (locals) {
1292 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1293 if (I != locals->table.end())
1294 return I->second;
1295 else
1296 locals = locals->parent;
1297 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001298
Owen Anderson2a412722008-06-20 01:15:47 +00001299 return 0;
1300}
1301
Owen Andersona03e7862008-12-15 02:03:00 +00001302/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001303/// by inheritance from the dominator fails, see if we can perform phi
Owen Andersona03e7862008-12-15 02:03:00 +00001304/// construction to eliminate the redundancy.
1305Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1306 BasicBlock* BaseBlock = orig->getParent();
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001307
Owen Andersona03e7862008-12-15 02:03:00 +00001308 SmallPtrSet<BasicBlock*, 4> Visited;
1309 SmallVector<BasicBlock*, 8> Stack;
1310 Stack.push_back(BaseBlock);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001311
Owen Andersona03e7862008-12-15 02:03:00 +00001312 DenseMap<BasicBlock*, Value*> Results;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001313
Owen Andersona03e7862008-12-15 02:03:00 +00001314 // Walk backwards through our predecessors, looking for instances of the
1315 // value number we're looking for. Instances are recorded in the Results
1316 // map, which is then used to perform phi construction.
1317 while (!Stack.empty()) {
1318 BasicBlock* Current = Stack.back();
1319 Stack.pop_back();
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001320
Owen Andersona03e7862008-12-15 02:03:00 +00001321 // If we've walked all the way to a proper dominator, then give up. Cases
1322 // where the instance is in the dominator will have been caught by the fast
1323 // path, and any cases that require phi construction further than this are
1324 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1325 // time improvement.
1326 if (DT->properlyDominates(Current, orig->getParent())) return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001327
Owen Andersona03e7862008-12-15 02:03:00 +00001328 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1329 localAvail.find(Current);
1330 if (LA == localAvail.end()) return 0;
Chris Lattner6f33e552009-01-19 22:00:18 +00001331 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001332
Owen Andersona03e7862008-12-15 02:03:00 +00001333 if (V != LA->second->table.end()) {
1334 // Found an instance, record it.
1335 Results.insert(std::make_pair(Current, V->second));
1336 continue;
1337 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001338
Owen Andersona03e7862008-12-15 02:03:00 +00001339 // If we reach the beginning of the function, then give up.
1340 if (pred_begin(Current) == pred_end(Current))
1341 return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001342
Owen Andersona03e7862008-12-15 02:03:00 +00001343 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1344 PI != PE; ++PI)
1345 if (Visited.insert(*PI))
1346 Stack.push_back(*PI);
1347 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001348
Owen Andersona03e7862008-12-15 02:03:00 +00001349 // If we didn't find instances, give up. Otherwise, perform phi construction.
1350 if (Results.size() == 0)
1351 return 0;
1352 else
1353 return GetValueForBlock(BaseBlock, orig, Results, true);
1354}
1355
Owen Andersonf631bb62007-08-14 18:16:29 +00001356/// processInstruction - When calculating availability, handle an instruction
Owen Anderson85c40642007-07-24 17:55:58 +00001357/// by inserting it into the appropriate sets
Owen Anderson9334fc62008-06-12 19:25:32 +00001358bool GVN::processInstruction(Instruction *I,
Chris Lattner7de20452008-03-21 22:01:16 +00001359 SmallVectorImpl<Instruction*> &toErase) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001360 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner4531da82008-12-05 21:04:20 +00001361 bool changed = processLoad(L, toErase);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001362
Owen Andersone6b4ff82008-06-18 21:41:49 +00001363 if (!changed) {
1364 unsigned num = VN.lookup_or_add(L);
Owen Anderson2a412722008-06-20 01:15:47 +00001365 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Andersone6b4ff82008-06-18 21:41:49 +00001366 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001367
Owen Andersone6b4ff82008-06-18 21:41:49 +00001368 return changed;
1369 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001370
Owen Anderson8a8d13c2008-07-03 17:44:33 +00001371 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Andersone6b4ff82008-06-18 21:41:49 +00001372 unsigned num = VN.lookup_or_add(I);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001373
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001374 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1375 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001376
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001377 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1378 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001379
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001380 Value* branchCond = BI->getCondition();
1381 uint32_t condVN = VN.lookup_or_add(branchCond);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001382
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001383 BasicBlock* trueSucc = BI->getSuccessor(0);
1384 BasicBlock* falseSucc = BI->getSuccessor(1);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001385
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001386 if (trueSucc->getSinglePredecessor())
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001387 localAvail[trueSucc]->table[condVN] =
Owen Anderson4f720fa2009-07-31 17:39:07 +00001388 ConstantInt::getTrue(trueSucc->getContext());
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001389 if (falseSucc->getSinglePredecessor())
Owen Anderson4f720fa2009-07-31 17:39:07 +00001390 localAvail[falseSucc]->table[condVN] =
1391 ConstantInt::getFalse(trueSucc->getContext());
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001392
1393 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001394
Owen Andersonced50f82008-04-07 09:59:07 +00001395 // Allocations are always uniquely numbered, so we can save time and memory
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001396 // by fast failing them.
Victor Hernandez48c3c542009-09-18 22:35:49 +00001397 } else if (isa<AllocationInst>(I) || isMalloc(I) || isa<TerminatorInst>(I)) {
Owen Anderson2a412722008-06-20 01:15:47 +00001398 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonced50f82008-04-07 09:59:07 +00001399 return false;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001400 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001401
Owen Andersone0143452007-08-16 22:02:55 +00001402 // Collapse PHI nodes
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001403 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersone02ad522007-08-16 22:51:56 +00001404 Value* constVal = CollapsePhi(p);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001405
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001406 if (constVal) {
Owen Andersone02ad522007-08-16 22:51:56 +00001407 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1408 PI != PE; ++PI)
Chris Lattner4bab29b2008-12-09 19:21:47 +00001409 PI->second.erase(p);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001410
Owen Andersone02ad522007-08-16 22:51:56 +00001411 p->replaceAllUsesWith(constVal);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001412 if (isa<PointerType>(constVal->getType()))
1413 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson575f2812008-12-23 00:49:51 +00001414 VN.erase(p);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001415
Owen Andersone02ad522007-08-16 22:51:56 +00001416 toErase.push_back(p);
Owen Andersone6b4ff82008-06-18 21:41:49 +00001417 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001418 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001419 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001420
Owen Anderson8a8d13c2008-07-03 17:44:33 +00001421 // If the number we were assigned was a brand new VN, then we don't
1422 // need to do a lookup to see if the number already exists
1423 // somewhere in the domtree: it can't!
1424 } else if (num == nextNum) {
1425 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001426
Owen Andersona03e7862008-12-15 02:03:00 +00001427 // Perform fast-path value-number based elimination of values inherited from
1428 // dominators.
Owen Anderson2a412722008-06-20 01:15:47 +00001429 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Andersonc772be72007-12-08 01:37:09 +00001430 // Remove it!
Owen Anderson5aff8002007-07-31 23:27:13 +00001431 VN.erase(I);
Owen Anderson85c40642007-07-24 17:55:58 +00001432 I->replaceAllUsesWith(repl);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001433 if (isa<PointerType>(repl->getType()))
1434 MD->invalidateCachedPointerInfo(repl);
Owen Anderson85c40642007-07-24 17:55:58 +00001435 toErase.push_back(I);
1436 return true;
Owen Andersona03e7862008-12-15 02:03:00 +00001437
1438#if 0
1439 // Perform slow-pathvalue-number based elimination with phi construction.
1440 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1441 // Remove it!
1442 VN.erase(I);
1443 I->replaceAllUsesWith(repl);
1444 if (isa<PointerType>(repl->getType()))
1445 MD->invalidateCachedPointerInfo(repl);
1446 toErase.push_back(I);
1447 return true;
1448#endif
Owen Anderson8a8d13c2008-07-03 17:44:33 +00001449 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001450 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson85c40642007-07-24 17:55:58 +00001451 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001452
Owen Anderson85c40642007-07-24 17:55:58 +00001453 return false;
1454}
1455
Bill Wendling42f17f62008-12-22 22:32:22 +00001456/// runOnFunction - This is the main transformation entry point for a function.
Owen Andersonbe168b32007-08-14 18:04:11 +00001457bool GVN::runOnFunction(Function& F) {
Chris Lattner02ca4422008-12-01 00:40:32 +00001458 MD = &getAnalysis<MemoryDependenceAnalysis>();
1459 DT = &getAnalysis<DominatorTree>();
Owen Andersonbcf2bd52008-05-12 20:15:55 +00001460 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner02ca4422008-12-01 00:40:32 +00001461 VN.setMemDep(MD);
1462 VN.setDomTree(DT);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001463
Owen Andersonbe168b32007-08-14 18:04:11 +00001464 bool changed = false;
1465 bool shouldContinue = true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001466
Owen Anderson26ed2572008-07-16 17:52:31 +00001467 // Merge unconditional branches, allowing PRE to catch more
1468 // optimization opportunities.
1469 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1470 BasicBlock* BB = FI;
1471 ++FI;
Owen Andersonf59eef82008-07-17 00:01:40 +00001472 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1473 if (removedBlock) NumGVNBlocks++;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001474
Owen Andersonf59eef82008-07-17 00:01:40 +00001475 changed |= removedBlock;
Owen Anderson26ed2572008-07-16 17:52:31 +00001476 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001477
Chris Lattner4bab29b2008-12-09 19:21:47 +00001478 unsigned Iteration = 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001479
Owen Andersonbe168b32007-08-14 18:04:11 +00001480 while (shouldContinue) {
Dan Gohman0be10b02009-07-25 01:43:01 +00001481 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Owen Andersonbe168b32007-08-14 18:04:11 +00001482 shouldContinue = iterateOnFunction(F);
1483 changed |= shouldContinue;
Chris Lattner4bab29b2008-12-09 19:21:47 +00001484 ++Iteration;
Owen Andersonbe168b32007-08-14 18:04:11 +00001485 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001486
Owen Anderson916f4732008-07-18 18:03:38 +00001487 if (EnablePRE) {
Owen Anderson9c935902008-09-03 23:06:07 +00001488 bool PREChanged = true;
1489 while (PREChanged) {
1490 PREChanged = performPRE(F);
Owen Anderson916f4732008-07-18 18:03:38 +00001491 changed |= PREChanged;
Owen Anderson9c935902008-09-03 23:06:07 +00001492 }
Owen Anderson916f4732008-07-18 18:03:38 +00001493 }
Chris Lattner4bab29b2008-12-09 19:21:47 +00001494 // FIXME: Should perform GVN again after PRE does something. PRE can move
1495 // computations into blocks where they become fully redundant. Note that
1496 // we can't do this until PRE's critical edge splitting updates memdep.
1497 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopes274474b2008-10-10 16:25:50 +00001498
1499 cleanupGlobalSets();
1500
Owen Andersonbe168b32007-08-14 18:04:11 +00001501 return changed;
1502}
1503
1504
Owen Andersona03e7862008-12-15 02:03:00 +00001505bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner4bab29b2008-12-09 19:21:47 +00001506 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1507 // incrementing BI before processing an instruction).
Owen Anderson9334fc62008-06-12 19:25:32 +00001508 SmallVector<Instruction*, 8> toErase;
Owen Anderson9334fc62008-06-12 19:25:32 +00001509 bool changed_function = false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001510
Owen Anderson9334fc62008-06-12 19:25:32 +00001511 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1512 BI != BE;) {
Chris Lattner4531da82008-12-05 21:04:20 +00001513 changed_function |= processInstruction(BI, toErase);
Owen Anderson9334fc62008-06-12 19:25:32 +00001514 if (toErase.empty()) {
1515 ++BI;
1516 continue;
1517 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001518
Owen Anderson9334fc62008-06-12 19:25:32 +00001519 // If we need some instructions deleted, do it now.
1520 NumGVNInstr += toErase.size();
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001521
Owen Anderson9334fc62008-06-12 19:25:32 +00001522 // Avoid iterator invalidation.
1523 bool AtStart = BI == BB->begin();
1524 if (!AtStart)
1525 --BI;
1526
1527 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner02ca4422008-12-01 00:40:32 +00001528 E = toErase.end(); I != E; ++I) {
Dan Gohman7e124382009-07-31 20:24:18 +00001529 DEBUG(errs() << "GVN removed: " << **I << '\n');
Chris Lattner02ca4422008-12-01 00:40:32 +00001530 MD->removeInstruction(*I);
Owen Anderson9334fc62008-06-12 19:25:32 +00001531 (*I)->eraseFromParent();
Bill Wendling84049422008-12-22 21:57:30 +00001532 DEBUG(verifyRemoved(*I));
Chris Lattner02ca4422008-12-01 00:40:32 +00001533 }
Chris Lattner4bab29b2008-12-09 19:21:47 +00001534 toErase.clear();
Owen Anderson9334fc62008-06-12 19:25:32 +00001535
1536 if (AtStart)
1537 BI = BB->begin();
1538 else
1539 ++BI;
Owen Anderson9334fc62008-06-12 19:25:32 +00001540 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001541
Owen Anderson9334fc62008-06-12 19:25:32 +00001542 return changed_function;
1543}
1544
Owen Andersone6b4ff82008-06-18 21:41:49 +00001545/// performPRE - Perform a purely local form of PRE that looks for diamond
1546/// control flow patterns and attempts to perform simple PRE at the join point.
1547bool GVN::performPRE(Function& F) {
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001548 bool Changed = false;
Owen Andersonec747c42008-06-19 19:54:19 +00001549 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner3304b562008-12-01 07:29:03 +00001550 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001551 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1552 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1553 BasicBlock* CurrentBlock = *DI;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001554
Owen Andersone6b4ff82008-06-18 21:41:49 +00001555 // Nothing to PRE in the entry block.
1556 if (CurrentBlock == &F.getEntryBlock()) continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001557
Owen Andersone6b4ff82008-06-18 21:41:49 +00001558 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1559 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001560 Instruction *CurInst = BI++;
Duncan Sands2f500832009-05-06 06:49:50 +00001561
Victor Hernandez48c3c542009-09-18 22:35:49 +00001562 if (isa<AllocationInst>(CurInst) || isMalloc(CurInst) ||
1563 isa<TerminatorInst>(CurInst) || isa<PHINode>(CurInst) ||
Owen Anderson35b47072009-08-13 21:58:54 +00001564 (CurInst->getType() == Type::getVoidTy(F.getContext())) ||
Duncan Sands2f500832009-05-06 06:49:50 +00001565 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell6e0aa282009-03-10 15:04:53 +00001566 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001567 continue;
Duncan Sands2f500832009-05-06 06:49:50 +00001568
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001569 uint32_t valno = VN.lookup(CurInst);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001570
Owen Andersone6b4ff82008-06-18 21:41:49 +00001571 // Look for the predecessors for PRE opportunities. We're
1572 // only trying to solve the basic diamond case, where
1573 // a value is computed in the successor and one predecessor,
1574 // but not the other. We also explicitly disallow cases
1575 // where the successor is its own predecessor, because they're
1576 // more complicated to get right.
1577 unsigned numWith = 0;
1578 unsigned numWithout = 0;
1579 BasicBlock* PREPred = 0;
Chris Lattner3304b562008-12-01 07:29:03 +00001580 predMap.clear();
1581
Owen Andersone6b4ff82008-06-18 21:41:49 +00001582 for (pred_iterator PI = pred_begin(CurrentBlock),
1583 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1584 // We're not interested in PRE where the block is its
Owen Anderson2a412722008-06-20 01:15:47 +00001585 // own predecessor, on in blocks with predecessors
1586 // that are not reachable.
1587 if (*PI == CurrentBlock) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001588 numWithout = 2;
Owen Anderson2a412722008-06-20 01:15:47 +00001589 break;
1590 } else if (!localAvail.count(*PI)) {
1591 numWithout = 2;
1592 break;
1593 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001594
1595 DenseMap<uint32_t, Value*>::iterator predV =
Owen Anderson2a412722008-06-20 01:15:47 +00001596 localAvail[*PI]->table.find(valno);
1597 if (predV == localAvail[*PI]->table.end()) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001598 PREPred = *PI;
1599 numWithout++;
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001600 } else if (predV->second == CurInst) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001601 numWithout = 2;
1602 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001603 predMap[*PI] = predV->second;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001604 numWith++;
1605 }
1606 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001607
Owen Andersone6b4ff82008-06-18 21:41:49 +00001608 // Don't do PRE when it might increase code size, i.e. when
1609 // we would need to insert instructions in more than one pred.
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001610 if (numWithout != 1 || numWith == 0)
Owen Andersone6b4ff82008-06-18 21:41:49 +00001611 continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001612
Owen Andersonec747c42008-06-19 19:54:19 +00001613 // We can't do PRE safely on a critical edge, so instead we schedule
1614 // the edge to be split and perform the PRE the next time we iterate
1615 // on the function.
1616 unsigned succNum = 0;
1617 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1618 i != e; ++i)
Owen Anderson9c935902008-09-03 23:06:07 +00001619 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonec747c42008-06-19 19:54:19 +00001620 succNum = i;
1621 break;
1622 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001623
Owen Andersonec747c42008-06-19 19:54:19 +00001624 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1625 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Andersonec747c42008-06-19 19:54:19 +00001626 continue;
1627 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001628
Owen Andersone6b4ff82008-06-18 21:41:49 +00001629 // Instantiate the expression the in predecessor that lacked it.
1630 // Because we are going top-down through the block, all value numbers
1631 // will be available in the predecessor by the time we need them. Any
1632 // that weren't original present will have been instantiated earlier
1633 // in this loop.
Owen Anderson175b6542009-07-22 00:24:57 +00001634 Instruction* PREInstr = CurInst->clone(CurInst->getContext());
Owen Andersone6b4ff82008-06-18 21:41:49 +00001635 bool success = true;
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001636 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1637 Value *Op = PREInstr->getOperand(i);
1638 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1639 continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001640
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001641 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1642 PREInstr->setOperand(i, V);
1643 } else {
1644 success = false;
1645 break;
Owen Anderson14c612f2008-07-11 20:05:13 +00001646 }
Owen Andersone6b4ff82008-06-18 21:41:49 +00001647 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001648
Owen Andersone6b4ff82008-06-18 21:41:49 +00001649 // Fail out if we encounter an operand that is not available in
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001650 // the PRE predecessor. This is typically because of loads which
Owen Andersone6b4ff82008-06-18 21:41:49 +00001651 // are not value numbered precisely.
1652 if (!success) {
1653 delete PREInstr;
Bill Wendling3858cae2008-12-22 22:14:07 +00001654 DEBUG(verifyRemoved(PREInstr));
Owen Andersone6b4ff82008-06-18 21:41:49 +00001655 continue;
1656 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001657
Owen Andersone6b4ff82008-06-18 21:41:49 +00001658 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001659 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson2a412722008-06-20 01:15:47 +00001660 predMap[PREPred] = PREInstr;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001661 VN.add(PREInstr, valno);
1662 NumGVNPRE++;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001663
Owen Andersone6b4ff82008-06-18 21:41:49 +00001664 // Update the availability map to include the new instruction.
Owen Anderson2a412722008-06-20 01:15:47 +00001665 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001666
Owen Andersone6b4ff82008-06-18 21:41:49 +00001667 // Create a PHI to make the value available in this block.
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001668 PHINode* Phi = PHINode::Create(CurInst->getType(),
1669 CurInst->getName() + ".pre-phi",
Owen Andersone6b4ff82008-06-18 21:41:49 +00001670 CurrentBlock->begin());
1671 for (pred_iterator PI = pred_begin(CurrentBlock),
1672 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson2a412722008-06-20 01:15:47 +00001673 Phi->addIncoming(predMap[*PI], *PI);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001674
Owen Andersone6b4ff82008-06-18 21:41:49 +00001675 VN.add(Phi, valno);
Owen Anderson2a412722008-06-20 01:15:47 +00001676 localAvail[CurrentBlock]->table[valno] = Phi;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001677
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001678 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001679 if (isa<PointerType>(Phi->getType()))
1680 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001681 VN.erase(CurInst);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001682
Dan Gohman7e124382009-07-31 20:24:18 +00001683 DEBUG(errs() << "GVN PRE removed: " << *CurInst << '\n');
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001684 MD->removeInstruction(CurInst);
1685 CurInst->eraseFromParent();
Bill Wendling84049422008-12-22 21:57:30 +00001686 DEBUG(verifyRemoved(CurInst));
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001687 Changed = true;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001688 }
1689 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001690
Owen Andersonec747c42008-06-19 19:54:19 +00001691 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov2e8710c2008-12-05 19:38:49 +00001692 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonec747c42008-06-19 19:54:19 +00001693 SplitCriticalEdge(I->first, I->second, this);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001694
Anton Korobeynikov2e8710c2008-12-05 19:38:49 +00001695 return Changed || toSplit.size();
Owen Andersone6b4ff82008-06-18 21:41:49 +00001696}
1697
Bill Wendling42f17f62008-12-22 22:32:22 +00001698/// iterateOnFunction - Executes one iteration of GVN
Owen Andersonbe168b32007-08-14 18:04:11 +00001699bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes274474b2008-10-10 16:25:50 +00001700 cleanupGlobalSets();
Chris Lattner98054902008-03-21 21:33:23 +00001701
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001702 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1703 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1704 if (DI->getIDom())
1705 localAvail[DI->getBlock()] =
1706 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1707 else
1708 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1709 }
1710
Owen Anderson85c40642007-07-24 17:55:58 +00001711 // Top-down walk of the dominator tree
Owen Andersone6b4ff82008-06-18 21:41:49 +00001712 bool changed = false;
Owen Andersonef136f52008-12-15 03:52:17 +00001713#if 0
1714 // Needed for value numbering with phi construction to work.
Owen Andersona03e7862008-12-15 02:03:00 +00001715 ReversePostOrderTraversal<Function*> RPOT(&F);
1716 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1717 RE = RPOT.end(); RI != RE; ++RI)
1718 changed |= processBlock(*RI);
Owen Andersonef136f52008-12-15 03:52:17 +00001719#else
1720 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1721 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1722 changed |= processBlock(DI->getBlock());
1723#endif
1724
Owen Anderson26ed2572008-07-16 17:52:31 +00001725 return changed;
Owen Anderson85c40642007-07-24 17:55:58 +00001726}
Nuno Lopes274474b2008-10-10 16:25:50 +00001727
1728void GVN::cleanupGlobalSets() {
1729 VN.clear();
1730 phiMap.clear();
1731
1732 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1733 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1734 delete I->second;
1735 localAvail.clear();
1736}
Bill Wendling2a023742008-12-22 21:36:08 +00001737
1738/// verifyRemoved - Verify that the specified instruction does not occur in our
1739/// internal data structures.
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001740void GVN::verifyRemoved(const Instruction *Inst) const {
1741 VN.verifyRemoved(Inst);
Bill Wendling3858cae2008-12-22 22:14:07 +00001742
1743 // Walk through the PHI map to make sure the instruction isn't hiding in there
1744 // somewhere.
1745 for (PhiMapType::iterator
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001746 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1747 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling3858cae2008-12-22 22:14:07 +00001748
1749 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001750 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1751 assert(*II != Inst && "Inst is still a value in PHI map!");
1752 }
1753 }
1754
1755 // Walk through the value number scope to make sure the instruction isn't
1756 // ferreted away in it.
1757 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1758 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1759 const ValueNumberScope *VNS = I->second;
1760
1761 while (VNS) {
1762 for (DenseMap<uint32_t, Value*>::iterator
1763 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1764 assert(II->second != Inst && "Inst still in value numbering scope!");
1765 }
1766
1767 VNS = VNS->parent;
Bill Wendling3858cae2008-12-22 22:14:07 +00001768 }
1769 }
Bill Wendling2a023742008-12-22 21:36:08 +00001770}