blob: f4a989844478f8e5a9cc20d292c50a18e5ca4fb1 [file] [log] [blame]
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Andersonab6ec2e2007-07-24 17:55:58 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Owen Andersonab6ec2e2007-07-24 17:55:58 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This pass performs global value numbering to eliminate fully redundant
11// instructions. It also performs simple dead load elimination.
12//
John Criswell073e4d12009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman5afc2742008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Andersonab6ec2e2007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson5e5599b2007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patele8c6d312009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000025#include "llvm/Value.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000026#include "llvm/ADT/DenseMap.h"
27#include "llvm/ADT/DepthFirstIterator.h"
Owen Andersonbfe133e2008-12-15 02:03:00 +000028#include "llvm/ADT/PostOrderIterator.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000029#include "llvm/ADT/SmallPtrSet.h"
30#include "llvm/ADT/SmallVector.h"
31#include "llvm/ADT/Statistic.h"
Owen Anderson09b83ba2007-10-18 19:39:33 +000032#include "llvm/Analysis/Dominators.h"
33#include "llvm/Analysis/AliasAnalysis.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000034#include "llvm/Analysis/MemoryDependenceAnalysis.h"
35#include "llvm/Support/CFG.h"
Owen Andersone780d662008-06-19 19:57:25 +000036#include "llvm/Support/CommandLine.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000037#include "llvm/Support/Compiler.h"
Chris Lattnerd528b212008-03-29 04:36:18 +000038#include "llvm/Support/Debug.h"
Owen Andersonfdf9f162008-06-19 19:54:19 +000039#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesen81b64632009-06-17 20:48:23 +000040#include "llvm/Transforms/Utils/Local.h"
Duncan Sands26ff6f92008-10-08 07:23:46 +000041#include <cstdio>
Owen Andersonab6ec2e2007-07-24 17:55:58 +000042using namespace llvm;
43
Bill Wendling3c793442008-12-22 22:14:07 +000044STATISTIC(NumGVNInstr, "Number of instructions deleted");
45STATISTIC(NumGVNLoad, "Number of loads deleted");
46STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
Owen Anderson53d546e2008-07-15 16:28:06 +000047STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3c793442008-12-22 22:14:07 +000048STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner168be762008-03-22 04:13:49 +000049
Evan Cheng9598f932008-06-20 01:01:07 +000050static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonaddbe3e2008-07-17 19:41:00 +000051 cl::init(true), cl::Hidden);
Dan Gohmana8f8a852009-06-15 18:30:15 +000052static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersone780d662008-06-19 19:57:25 +000053
Owen Andersonab6ec2e2007-07-24 17:55:58 +000054//===----------------------------------------------------------------------===//
55// ValueTable Class
56//===----------------------------------------------------------------------===//
57
58/// This class holds the mapping between values and value numbers. It is used
59/// as an efficient mechanism to determine the expression-wise equivalence of
60/// two values.
61namespace {
62 struct VISIBILITY_HIDDEN Expression {
Dan Gohmana5b96452009-06-04 22:49:04 +000063 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
64 UDIV, SDIV, FDIV, UREM, SREM,
Owen Andersonab6ec2e2007-07-24 17:55:58 +000065 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
66 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
67 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
68 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
69 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
70 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
71 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
72 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson69057b82008-05-13 08:17:22 +000073 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Anderson45d37012008-06-19 17:25:39 +000074 EMPTY, TOMBSTONE };
Owen Andersonab6ec2e2007-07-24 17:55:58 +000075
76 ExpressionOpcode opcode;
77 const Type* type;
78 uint32_t firstVN;
79 uint32_t secondVN;
80 uint32_t thirdVN;
81 SmallVector<uint32_t, 4> varargs;
Owen Anderson09b83ba2007-10-18 19:39:33 +000082 Value* function;
Owen Andersonab6ec2e2007-07-24 17:55:58 +000083
84 Expression() { }
85 Expression(ExpressionOpcode o) : opcode(o) { }
86
87 bool operator==(const Expression &other) const {
88 if (opcode != other.opcode)
89 return false;
90 else if (opcode == EMPTY || opcode == TOMBSTONE)
91 return true;
92 else if (type != other.type)
93 return false;
Owen Anderson09b83ba2007-10-18 19:39:33 +000094 else if (function != other.function)
95 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +000096 else if (firstVN != other.firstVN)
97 return false;
98 else if (secondVN != other.secondVN)
99 return false;
100 else if (thirdVN != other.thirdVN)
101 return false;
102 else {
103 if (varargs.size() != other.varargs.size())
104 return false;
105
106 for (size_t i = 0; i < varargs.size(); ++i)
107 if (varargs[i] != other.varargs[i])
108 return false;
109
110 return true;
111 }
112 }
113
114 bool operator!=(const Expression &other) const {
Bill Wendling86f01cb2008-12-22 22:16:31 +0000115 return !(*this == other);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000116 }
117 };
118
119 class VISIBILITY_HIDDEN ValueTable {
120 private:
121 DenseMap<Value*, uint32_t> valueNumbering;
122 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersonf7928602008-05-12 20:15:55 +0000123 AliasAnalysis* AA;
124 MemoryDependenceAnalysis* MD;
125 DominatorTree* DT;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000126
127 uint32_t nextValueNumber;
128
129 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
130 Expression::ExpressionOpcode getOpcode(CmpInst* C);
131 Expression::ExpressionOpcode getOpcode(CastInst* C);
132 Expression create_expression(BinaryOperator* BO);
133 Expression create_expression(CmpInst* C);
134 Expression create_expression(ShuffleVectorInst* V);
135 Expression create_expression(ExtractElementInst* C);
136 Expression create_expression(InsertElementInst* V);
137 Expression create_expression(SelectInst* V);
138 Expression create_expression(CastInst* C);
139 Expression create_expression(GetElementPtrInst* G);
Owen Anderson09b83ba2007-10-18 19:39:33 +0000140 Expression create_expression(CallInst* C);
Owen Anderson69057b82008-05-13 08:17:22 +0000141 Expression create_expression(Constant* C);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000142 public:
Dan Gohmanc4971722009-04-01 16:37:47 +0000143 ValueTable() : nextValueNumber(1) { }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000144 uint32_t lookup_or_add(Value* V);
145 uint32_t lookup(Value* V) const;
146 void add(Value* V, uint32_t num);
147 void clear();
148 void erase(Value* v);
149 unsigned size();
Owen Andersonf7928602008-05-12 20:15:55 +0000150 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner8541ede2008-12-01 00:40:32 +0000151 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonf7928602008-05-12 20:15:55 +0000152 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
153 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson3ea90a72008-07-03 17:44:33 +0000154 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling6b18a392008-12-22 21:36:08 +0000155 void verifyRemoved(const Value *) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000156 };
157}
158
159namespace llvm {
Chris Lattner0625bd62007-09-17 18:34:04 +0000160template <> struct DenseMapInfo<Expression> {
Owen Anderson9699a6e2007-08-02 18:16:06 +0000161 static inline Expression getEmptyKey() {
162 return Expression(Expression::EMPTY);
163 }
164
165 static inline Expression getTombstoneKey() {
166 return Expression(Expression::TOMBSTONE);
167 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000168
169 static unsigned getHashValue(const Expression e) {
170 unsigned hash = e.opcode;
171
172 hash = e.firstVN + hash * 37;
173 hash = e.secondVN + hash * 37;
174 hash = e.thirdVN + hash * 37;
175
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000176 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
177 (unsigned)((uintptr_t)e.type >> 9)) +
178 hash * 37;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000179
Owen Anderson9699a6e2007-08-02 18:16:06 +0000180 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
181 E = e.varargs.end(); I != E; ++I)
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000182 hash = *I + hash * 37;
183
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000184 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
185 (unsigned)((uintptr_t)e.function >> 9)) +
186 hash * 37;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000187
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000188 return hash;
189 }
Chris Lattner0625bd62007-09-17 18:34:04 +0000190 static bool isEqual(const Expression &LHS, const Expression &RHS) {
191 return LHS == RHS;
192 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000193 static bool isPod() { return true; }
194};
195}
196
197//===----------------------------------------------------------------------===//
198// ValueTable Internal Functions
199//===----------------------------------------------------------------------===//
Chris Lattner2876a642008-03-21 21:14:38 +0000200Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000201 switch(BO->getOpcode()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000202 default: // THIS SHOULD NEVER HAPPEN
203 assert(0 && "Binary operator with unknown opcode?");
204 case Instruction::Add: return Expression::ADD;
Dan Gohmana5b96452009-06-04 22:49:04 +0000205 case Instruction::FAdd: return Expression::FADD;
Chris Lattner2876a642008-03-21 21:14:38 +0000206 case Instruction::Sub: return Expression::SUB;
Dan Gohmana5b96452009-06-04 22:49:04 +0000207 case Instruction::FSub: return Expression::FSUB;
Chris Lattner2876a642008-03-21 21:14:38 +0000208 case Instruction::Mul: return Expression::MUL;
Dan Gohmana5b96452009-06-04 22:49:04 +0000209 case Instruction::FMul: return Expression::FMUL;
Chris Lattner2876a642008-03-21 21:14:38 +0000210 case Instruction::UDiv: return Expression::UDIV;
211 case Instruction::SDiv: return Expression::SDIV;
212 case Instruction::FDiv: return Expression::FDIV;
213 case Instruction::URem: return Expression::UREM;
214 case Instruction::SRem: return Expression::SREM;
215 case Instruction::FRem: return Expression::FREM;
216 case Instruction::Shl: return Expression::SHL;
217 case Instruction::LShr: return Expression::LSHR;
218 case Instruction::AShr: return Expression::ASHR;
219 case Instruction::And: return Expression::AND;
220 case Instruction::Or: return Expression::OR;
221 case Instruction::Xor: return Expression::XOR;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000222 }
223}
224
225Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nate Begeman65720c92008-05-18 19:49:05 +0000226 if (isa<ICmpInst>(C) || isa<VICmpInst>(C)) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000227 switch (C->getPredicate()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000228 default: // THIS SHOULD NEVER HAPPEN
229 assert(0 && "Comparison with unknown predicate?");
230 case ICmpInst::ICMP_EQ: return Expression::ICMPEQ;
231 case ICmpInst::ICMP_NE: return Expression::ICMPNE;
232 case ICmpInst::ICMP_UGT: return Expression::ICMPUGT;
233 case ICmpInst::ICMP_UGE: return Expression::ICMPUGE;
234 case ICmpInst::ICMP_ULT: return Expression::ICMPULT;
235 case ICmpInst::ICMP_ULE: return Expression::ICMPULE;
236 case ICmpInst::ICMP_SGT: return Expression::ICMPSGT;
237 case ICmpInst::ICMP_SGE: return Expression::ICMPSGE;
238 case ICmpInst::ICMP_SLT: return Expression::ICMPSLT;
239 case ICmpInst::ICMP_SLE: return Expression::ICMPSLE;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000240 }
Chris Lattner2876a642008-03-21 21:14:38 +0000241 }
Nate Begeman65720c92008-05-18 19:49:05 +0000242 assert((isa<FCmpInst>(C) || isa<VFCmpInst>(C)) && "Unknown compare");
Chris Lattner2876a642008-03-21 21:14:38 +0000243 switch (C->getPredicate()) {
244 default: // THIS SHOULD NEVER HAPPEN
245 assert(0 && "Comparison with unknown predicate?");
246 case FCmpInst::FCMP_OEQ: return Expression::FCMPOEQ;
247 case FCmpInst::FCMP_OGT: return Expression::FCMPOGT;
248 case FCmpInst::FCMP_OGE: return Expression::FCMPOGE;
249 case FCmpInst::FCMP_OLT: return Expression::FCMPOLT;
250 case FCmpInst::FCMP_OLE: return Expression::FCMPOLE;
251 case FCmpInst::FCMP_ONE: return Expression::FCMPONE;
252 case FCmpInst::FCMP_ORD: return Expression::FCMPORD;
253 case FCmpInst::FCMP_UNO: return Expression::FCMPUNO;
254 case FCmpInst::FCMP_UEQ: return Expression::FCMPUEQ;
255 case FCmpInst::FCMP_UGT: return Expression::FCMPUGT;
256 case FCmpInst::FCMP_UGE: return Expression::FCMPUGE;
257 case FCmpInst::FCMP_ULT: return Expression::FCMPULT;
258 case FCmpInst::FCMP_ULE: return Expression::FCMPULE;
259 case FCmpInst::FCMP_UNE: return Expression::FCMPUNE;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000260 }
261}
262
Chris Lattner2876a642008-03-21 21:14:38 +0000263Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000264 switch(C->getOpcode()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000265 default: // THIS SHOULD NEVER HAPPEN
266 assert(0 && "Cast operator with unknown opcode?");
267 case Instruction::Trunc: return Expression::TRUNC;
268 case Instruction::ZExt: return Expression::ZEXT;
269 case Instruction::SExt: return Expression::SEXT;
270 case Instruction::FPToUI: return Expression::FPTOUI;
271 case Instruction::FPToSI: return Expression::FPTOSI;
272 case Instruction::UIToFP: return Expression::UITOFP;
273 case Instruction::SIToFP: return Expression::SITOFP;
274 case Instruction::FPTrunc: return Expression::FPTRUNC;
275 case Instruction::FPExt: return Expression::FPEXT;
276 case Instruction::PtrToInt: return Expression::PTRTOINT;
277 case Instruction::IntToPtr: return Expression::INTTOPTR;
278 case Instruction::BitCast: return Expression::BITCAST;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000279 }
280}
281
Owen Anderson09b83ba2007-10-18 19:39:33 +0000282Expression ValueTable::create_expression(CallInst* C) {
283 Expression e;
284
285 e.type = C->getType();
286 e.firstVN = 0;
287 e.secondVN = 0;
288 e.thirdVN = 0;
289 e.function = C->getCalledFunction();
290 e.opcode = Expression::CALL;
291
292 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
293 I != E; ++I)
Owen Anderson1e73f292008-04-11 05:11:49 +0000294 e.varargs.push_back(lookup_or_add(*I));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000295
296 return e;
297}
298
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000299Expression ValueTable::create_expression(BinaryOperator* BO) {
300 Expression e;
301
Owen Anderson1e73f292008-04-11 05:11:49 +0000302 e.firstVN = lookup_or_add(BO->getOperand(0));
303 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000304 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000305 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000306 e.type = BO->getType();
307 e.opcode = getOpcode(BO);
308
309 return e;
310}
311
312Expression ValueTable::create_expression(CmpInst* C) {
313 Expression e;
314
Owen Anderson1e73f292008-04-11 05:11:49 +0000315 e.firstVN = lookup_or_add(C->getOperand(0));
316 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000317 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000318 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000319 e.type = C->getType();
320 e.opcode = getOpcode(C);
321
322 return e;
323}
324
325Expression ValueTable::create_expression(CastInst* C) {
326 Expression e;
327
Owen Anderson1e73f292008-04-11 05:11:49 +0000328 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000329 e.secondVN = 0;
330 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000331 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000332 e.type = C->getType();
333 e.opcode = getOpcode(C);
334
335 return e;
336}
337
338Expression ValueTable::create_expression(ShuffleVectorInst* S) {
339 Expression e;
340
Owen Anderson1e73f292008-04-11 05:11:49 +0000341 e.firstVN = lookup_or_add(S->getOperand(0));
342 e.secondVN = lookup_or_add(S->getOperand(1));
343 e.thirdVN = lookup_or_add(S->getOperand(2));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000344 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000345 e.type = S->getType();
346 e.opcode = Expression::SHUFFLE;
347
348 return e;
349}
350
351Expression ValueTable::create_expression(ExtractElementInst* E) {
352 Expression e;
353
Owen Anderson1e73f292008-04-11 05:11:49 +0000354 e.firstVN = lookup_or_add(E->getOperand(0));
355 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000356 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000357 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000358 e.type = E->getType();
359 e.opcode = Expression::EXTRACT;
360
361 return e;
362}
363
364Expression ValueTable::create_expression(InsertElementInst* I) {
365 Expression e;
366
Owen Anderson1e73f292008-04-11 05:11:49 +0000367 e.firstVN = lookup_or_add(I->getOperand(0));
368 e.secondVN = lookup_or_add(I->getOperand(1));
369 e.thirdVN = lookup_or_add(I->getOperand(2));
Owen Anderson09b83ba2007-10-18 19:39:33 +0000370 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000371 e.type = I->getType();
372 e.opcode = Expression::INSERT;
373
374 return e;
375}
376
377Expression ValueTable::create_expression(SelectInst* I) {
378 Expression e;
379
Owen Anderson1e73f292008-04-11 05:11:49 +0000380 e.firstVN = lookup_or_add(I->getCondition());
381 e.secondVN = lookup_or_add(I->getTrueValue());
382 e.thirdVN = lookup_or_add(I->getFalseValue());
Owen Anderson09b83ba2007-10-18 19:39:33 +0000383 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000384 e.type = I->getType();
385 e.opcode = Expression::SELECT;
386
387 return e;
388}
389
390Expression ValueTable::create_expression(GetElementPtrInst* G) {
391 Expression e;
Owen Anderson69057b82008-05-13 08:17:22 +0000392
Owen Anderson1e73f292008-04-11 05:11:49 +0000393 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000394 e.secondVN = 0;
395 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000396 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000397 e.type = G->getType();
398 e.opcode = Expression::GEP;
399
400 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
401 I != E; ++I)
Owen Anderson1e73f292008-04-11 05:11:49 +0000402 e.varargs.push_back(lookup_or_add(*I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000403
404 return e;
405}
406
407//===----------------------------------------------------------------------===//
408// ValueTable External Functions
409//===----------------------------------------------------------------------===//
410
Owen Anderson6a903bc2008-06-18 21:41:49 +0000411/// add - Insert a value into the table with a specified value number.
412void ValueTable::add(Value* V, uint32_t num) {
413 valueNumbering.insert(std::make_pair(V, num));
414}
415
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000416/// lookup_or_add - Returns the value number for the specified value, assigning
417/// it a new number if it did not have one before.
418uint32_t ValueTable::lookup_or_add(Value* V) {
419 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
420 if (VI != valueNumbering.end())
421 return VI->second;
422
Owen Anderson09b83ba2007-10-18 19:39:33 +0000423 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson1e73f292008-04-11 05:11:49 +0000424 if (AA->doesNotAccessMemory(C)) {
Owen Anderson09b83ba2007-10-18 19:39:33 +0000425 Expression e = create_expression(C);
426
427 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
428 if (EI != expressionNumbering.end()) {
429 valueNumbering.insert(std::make_pair(V, EI->second));
430 return EI->second;
431 } else {
432 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
433 valueNumbering.insert(std::make_pair(V, nextValueNumber));
434
435 return nextValueNumber++;
436 }
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000437 } else if (AA->onlyReadsMemory(C)) {
438 Expression e = create_expression(C);
439
Owen Anderson69057b82008-05-13 08:17:22 +0000440 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000441 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
442 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson69057b82008-05-13 08:17:22 +0000443 return nextValueNumber++;
444 }
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000445
Chris Lattner7f9c8a02008-11-29 02:29:27 +0000446 MemDepResult local_dep = MD->getDependency(C);
Owen Anderson17816b32008-05-13 23:18:30 +0000447
Chris Lattner0e3d6332008-12-05 21:04:20 +0000448 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000449 valueNumbering.insert(std::make_pair(V, nextValueNumber));
450 return nextValueNumber++;
Chris Lattner80c7d812008-11-30 23:39:23 +0000451 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000452
453 if (local_dep.isDef()) {
454 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
455
456 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000457 valueNumbering.insert(std::make_pair(V, nextValueNumber));
458 return nextValueNumber++;
459 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000460
Chris Lattner80c7d812008-11-30 23:39:23 +0000461 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
462 uint32_t c_vn = lookup_or_add(C->getOperand(i));
463 uint32_t cd_vn = lookup_or_add(local_cdep->getOperand(i));
464 if (c_vn != cd_vn) {
465 valueNumbering.insert(std::make_pair(V, nextValueNumber));
466 return nextValueNumber++;
467 }
468 }
469
470 uint32_t v = lookup_or_add(local_cdep);
471 valueNumbering.insert(std::make_pair(V, v));
472 return v;
Owen Anderson17816b32008-05-13 23:18:30 +0000473 }
Chris Lattner7e61daf2008-12-01 01:15:42 +0000474
Chris Lattner0e3d6332008-12-05 21:04:20 +0000475 // Non-local case.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000476 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner254314e2008-12-09 19:38:05 +0000477 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattner0e3d6332008-12-05 21:04:20 +0000478 // FIXME: call/call dependencies for readonly calls should return def, not
479 // clobber! Move the checking logic to MemDep!
Owen Anderson8c2391d2008-05-13 13:41:23 +0000480 CallInst* cdep = 0;
Owen Anderson69057b82008-05-13 08:17:22 +0000481
Chris Lattner80c7d812008-11-30 23:39:23 +0000482 // Check to see if we have a single dominating call instruction that is
483 // identical to C.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000484 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
485 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattner80c7d812008-11-30 23:39:23 +0000486 // Ignore non-local dependencies.
487 if (I->second.isNonLocal())
488 continue;
Owen Anderson69057b82008-05-13 08:17:22 +0000489
Chris Lattner80c7d812008-11-30 23:39:23 +0000490 // We don't handle non-depedencies. If we already have a call, reject
491 // instruction dependencies.
Chris Lattner0e3d6332008-12-05 21:04:20 +0000492 if (I->second.isClobber() || cdep != 0) {
Chris Lattner80c7d812008-11-30 23:39:23 +0000493 cdep = 0;
494 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000495 }
Chris Lattner80c7d812008-11-30 23:39:23 +0000496
497 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I->second.getInst());
498 // FIXME: All duplicated with non-local case.
499 if (NonLocalDepCall && DT->properlyDominates(I->first, C->getParent())){
500 cdep = NonLocalDepCall;
501 continue;
502 }
503
504 cdep = 0;
505 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000506 }
507
Owen Anderson8c2391d2008-05-13 13:41:23 +0000508 if (!cdep) {
Owen Anderson69057b82008-05-13 08:17:22 +0000509 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000510 return nextValueNumber++;
511 }
512
Chris Lattner0e3d6332008-12-05 21:04:20 +0000513 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson69057b82008-05-13 08:17:22 +0000514 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000515 return nextValueNumber++;
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000516 }
Chris Lattner80c7d812008-11-30 23:39:23 +0000517 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
518 uint32_t c_vn = lookup_or_add(C->getOperand(i));
519 uint32_t cd_vn = lookup_or_add(cdep->getOperand(i));
520 if (c_vn != cd_vn) {
521 valueNumbering.insert(std::make_pair(V, nextValueNumber));
522 return nextValueNumber++;
523 }
524 }
525
526 uint32_t v = lookup_or_add(cdep);
527 valueNumbering.insert(std::make_pair(V, v));
528 return v;
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000529
Owen Anderson09b83ba2007-10-18 19:39:33 +0000530 } else {
531 valueNumbering.insert(std::make_pair(V, nextValueNumber));
532 return nextValueNumber++;
533 }
534 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000535 Expression e = create_expression(BO);
536
537 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
538 if (EI != expressionNumbering.end()) {
539 valueNumbering.insert(std::make_pair(V, EI->second));
540 return EI->second;
541 } else {
542 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
543 valueNumbering.insert(std::make_pair(V, nextValueNumber));
544
545 return nextValueNumber++;
546 }
547 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
548 Expression e = create_expression(C);
549
550 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
551 if (EI != expressionNumbering.end()) {
552 valueNumbering.insert(std::make_pair(V, EI->second));
553 return EI->second;
554 } else {
555 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
556 valueNumbering.insert(std::make_pair(V, nextValueNumber));
557
558 return nextValueNumber++;
559 }
560 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
561 Expression e = create_expression(U);
562
563 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
564 if (EI != expressionNumbering.end()) {
565 valueNumbering.insert(std::make_pair(V, EI->second));
566 return EI->second;
567 } else {
568 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
569 valueNumbering.insert(std::make_pair(V, nextValueNumber));
570
571 return nextValueNumber++;
572 }
573 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
574 Expression e = create_expression(U);
575
576 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
577 if (EI != expressionNumbering.end()) {
578 valueNumbering.insert(std::make_pair(V, EI->second));
579 return EI->second;
580 } else {
581 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
582 valueNumbering.insert(std::make_pair(V, nextValueNumber));
583
584 return nextValueNumber++;
585 }
586 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
587 Expression e = create_expression(U);
588
589 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
590 if (EI != expressionNumbering.end()) {
591 valueNumbering.insert(std::make_pair(V, EI->second));
592 return EI->second;
593 } else {
594 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
595 valueNumbering.insert(std::make_pair(V, nextValueNumber));
596
597 return nextValueNumber++;
598 }
599 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
600 Expression e = create_expression(U);
601
602 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
603 if (EI != expressionNumbering.end()) {
604 valueNumbering.insert(std::make_pair(V, EI->second));
605 return EI->second;
606 } else {
607 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
608 valueNumbering.insert(std::make_pair(V, nextValueNumber));
609
610 return nextValueNumber++;
611 }
612 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
613 Expression e = create_expression(U);
614
615 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
616 if (EI != expressionNumbering.end()) {
617 valueNumbering.insert(std::make_pair(V, EI->second));
618 return EI->second;
619 } else {
620 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
621 valueNumbering.insert(std::make_pair(V, nextValueNumber));
622
623 return nextValueNumber++;
624 }
625 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
626 Expression e = create_expression(U);
627
628 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
629 if (EI != expressionNumbering.end()) {
630 valueNumbering.insert(std::make_pair(V, EI->second));
631 return EI->second;
632 } else {
633 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
634 valueNumbering.insert(std::make_pair(V, nextValueNumber));
635
636 return nextValueNumber++;
637 }
638 } else {
639 valueNumbering.insert(std::make_pair(V, nextValueNumber));
640 return nextValueNumber++;
641 }
642}
643
644/// lookup - Returns the value number of the specified value. Fails if
645/// the value has not yet been numbered.
646uint32_t ValueTable::lookup(Value* V) const {
647 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Chris Lattner2876a642008-03-21 21:14:38 +0000648 assert(VI != valueNumbering.end() && "Value not numbered?");
649 return VI->second;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000650}
651
652/// clear - Remove all entries from the ValueTable
653void ValueTable::clear() {
654 valueNumbering.clear();
655 expressionNumbering.clear();
656 nextValueNumber = 1;
657}
658
Owen Anderson10ffa862007-07-31 23:27:13 +0000659/// erase - Remove a value from the value numbering
660void ValueTable::erase(Value* V) {
661 valueNumbering.erase(V);
662}
663
Bill Wendling6b18a392008-12-22 21:36:08 +0000664/// verifyRemoved - Verify that the value is removed from all internal data
665/// structures.
666void ValueTable::verifyRemoved(const Value *V) const {
667 for (DenseMap<Value*, uint32_t>::iterator
668 I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
669 assert(I->first != V && "Inst still occurs in value numbering map!");
670 }
671}
672
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000673//===----------------------------------------------------------------------===//
Bill Wendling456e8852008-12-22 22:32:22 +0000674// GVN Pass
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000675//===----------------------------------------------------------------------===//
676
677namespace {
Owen Anderson1b3ea962008-06-20 01:15:47 +0000678 struct VISIBILITY_HIDDEN ValueNumberScope {
679 ValueNumberScope* parent;
680 DenseMap<uint32_t, Value*> table;
681
682 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
683 };
684}
685
686namespace {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000687
688 class VISIBILITY_HIDDEN GVN : public FunctionPass {
689 bool runOnFunction(Function &F);
690 public:
691 static char ID; // Pass identification, replacement for typeid
Dan Gohmana79db302008-09-04 17:05:41 +0000692 GVN() : FunctionPass(&ID) { }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000693
694 private:
Chris Lattner8541ede2008-12-01 00:40:32 +0000695 MemoryDependenceAnalysis *MD;
696 DominatorTree *DT;
697
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000698 ValueTable VN;
Owen Anderson1b3ea962008-06-20 01:15:47 +0000699 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000700
Owen Anderson0cc1a762007-08-07 23:12:31 +0000701 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
702 PhiMapType phiMap;
703
704
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000705 // This transformation requires dominator postdominator info
706 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000707 AU.addRequired<DominatorTree>();
708 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000709 AU.addRequired<AliasAnalysis>();
Owen Anderson54e02192008-06-23 17:49:45 +0000710
711 AU.addPreserved<DominatorTree>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000712 AU.addPreserved<AliasAnalysis>();
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000713 }
714
715 // Helper fuctions
716 // FIXME: eliminate or document these better
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000717 bool processLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000718 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000719 bool processInstruction(Instruction* I,
Chris Lattner804209d2008-03-21 22:01:16 +0000720 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson9699a6e2007-08-02 18:16:06 +0000721 bool processNonLocalLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000722 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000723 bool processBlock(BasicBlock* BB);
Owen Andersone34c2392008-12-14 19:10:35 +0000724 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Anderson0ac1fc82007-08-02 17:56:05 +0000725 DenseMap<BasicBlock*, Value*> &Phis,
726 bool top_level = false);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000727 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson676070d2007-08-14 18:04:11 +0000728 bool iterateOnFunction(Function &F);
Owen Andersonf5023a72007-08-16 22:51:56 +0000729 Value* CollapsePhi(PHINode* p);
Owen Anderson4cd516b2007-09-16 08:04:16 +0000730 bool isSafeReplacement(PHINode* p, Instruction* inst);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000731 bool performPRE(Function& F);
Owen Anderson1b3ea962008-06-20 01:15:47 +0000732 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Anderson53d546e2008-07-15 16:28:06 +0000733 bool mergeBlockIntoPredecessor(BasicBlock* BB);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000734 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopese3127f32008-10-10 16:25:50 +0000735 void cleanupGlobalSets();
Bill Wendling6b18a392008-12-22 21:36:08 +0000736 void verifyRemoved(const Instruction *I) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000737 };
738
739 char GVN::ID = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000740}
741
742// createGVNPass - The public interface to this file...
743FunctionPass *llvm::createGVNPass() { return new GVN(); }
744
745static RegisterPass<GVN> X("gvn",
746 "Global Value Numbering");
747
Owen Anderson6a903bc2008-06-18 21:41:49 +0000748void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5e5599b2007-07-25 19:57:03 +0000749 printf("{\n");
Owen Anderson6a903bc2008-06-18 21:41:49 +0000750 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5e5599b2007-07-25 19:57:03 +0000751 E = d.end(); I != E; ++I) {
Owen Anderson6a903bc2008-06-18 21:41:49 +0000752 printf("%d\n", I->first);
Owen Anderson5e5599b2007-07-25 19:57:03 +0000753 I->second->dump();
754 }
755 printf("}\n");
756}
757
Owen Andersonf5023a72007-08-16 22:51:56 +0000758Value* GVN::CollapsePhi(PHINode* p) {
Owen Andersonf5023a72007-08-16 22:51:56 +0000759 Value* constVal = p->hasConstantValue();
Chris Lattner2876a642008-03-21 21:14:38 +0000760 if (!constVal) return 0;
Owen Andersonf5023a72007-08-16 22:51:56 +0000761
Chris Lattner2876a642008-03-21 21:14:38 +0000762 Instruction* inst = dyn_cast<Instruction>(constVal);
763 if (!inst)
764 return constVal;
765
Chris Lattner8541ede2008-12-01 00:40:32 +0000766 if (DT->dominates(inst, p))
Chris Lattner2876a642008-03-21 21:14:38 +0000767 if (isSafeReplacement(p, inst))
768 return inst;
Owen Andersonf5023a72007-08-16 22:51:56 +0000769 return 0;
770}
Owen Anderson5e5599b2007-07-25 19:57:03 +0000771
Owen Anderson4cd516b2007-09-16 08:04:16 +0000772bool GVN::isSafeReplacement(PHINode* p, Instruction* inst) {
773 if (!isa<PHINode>(inst))
774 return true;
775
776 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
777 UI != E; ++UI)
778 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
779 if (use_phi->getParent() == inst->getParent())
780 return false;
781
782 return true;
783}
784
Owen Andersondbf23cc2007-07-26 18:26:51 +0000785/// GetValueForBlock - Get the value to use within the specified basic block.
786/// available values are in Phis.
Owen Andersone34c2392008-12-14 19:10:35 +0000787Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner2876a642008-03-21 21:14:38 +0000788 DenseMap<BasicBlock*, Value*> &Phis,
789 bool top_level) {
Owen Andersondbf23cc2007-07-26 18:26:51 +0000790
791 // If we have already computed this value, return the previously computed val.
Owen Anderson2d19aae2007-08-03 19:59:35 +0000792 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
793 if (V != Phis.end() && !top_level) return V->second;
Owen Andersondbf23cc2007-07-26 18:26:51 +0000794
Owen Anderson6acc7822008-07-02 18:15:31 +0000795 // If the block is unreachable, just return undef, since this path
796 // can't actually occur at runtime.
Chris Lattner8541ede2008-12-01 00:40:32 +0000797 if (!DT->isReachableFromEntry(BB))
Owen Anderson6acc7822008-07-02 18:15:31 +0000798 return Phis[BB] = UndefValue::get(orig->getType());
Owen Andersonb22a6402008-07-02 17:20:16 +0000799
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000800 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
801 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000802 Phis[BB] = ret;
803 return ret;
Owen Anderson774761c2007-08-03 11:03:26 +0000804 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000805
806 // Get the number of predecessors of this block so we can reserve space later.
807 // If there is already a PHI in it, use the #preds from it, otherwise count.
808 // Getting it from the PHI is constant time.
809 unsigned NumPreds;
810 if (PHINode *ExistingPN = dyn_cast<PHINode>(BB->begin()))
811 NumPreds = ExistingPN->getNumIncomingValues();
812 else
813 NumPreds = std::distance(pred_begin(BB), pred_end(BB));
Chris Lattner2876a642008-03-21 21:14:38 +0000814
Owen Andersondbf23cc2007-07-26 18:26:51 +0000815 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
816 // now, then get values to fill in the incoming values for the PHI.
Gabor Greife9ecc682008-04-06 20:25:17 +0000817 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
818 BB->begin());
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000819 PN->reserveOperandSpace(NumPreds);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000820
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000821 Phis.insert(std::make_pair(BB, PN));
Owen Andersond66e2852007-07-30 16:57:08 +0000822
Owen Andersondbf23cc2007-07-26 18:26:51 +0000823 // Fill in the incoming values for the block.
Owen Andersond58fa6b02007-07-31 17:43:14 +0000824 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
825 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Andersond58fa6b02007-07-31 17:43:14 +0000826 PN->addIncoming(val, *PI);
827 }
Chris Lattner2876a642008-03-21 21:14:38 +0000828
Chris Lattner8541ede2008-12-01 00:40:32 +0000829 VN.getAliasAnalysis()->copyValue(orig, PN);
Owen Andersond58fa6b02007-07-31 17:43:14 +0000830
Owen Anderson221a4362007-08-16 22:02:55 +0000831 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersonf5023a72007-08-16 22:51:56 +0000832 Value* v = CollapsePhi(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000833 if (!v) {
834 // Cache our phi construction results
Owen Andersone34c2392008-12-14 19:10:35 +0000835 if (LoadInst* L = dyn_cast<LoadInst>(orig))
836 phiMap[L->getPointerOperand()].insert(PN);
837 else
838 phiMap[orig].insert(PN);
839
Chris Lattner2876a642008-03-21 21:14:38 +0000840 return PN;
Owen Andersond58fa6b02007-07-31 17:43:14 +0000841 }
Owen Andersonf7928602008-05-12 20:15:55 +0000842
Chris Lattner2876a642008-03-21 21:14:38 +0000843 PN->replaceAllUsesWith(v);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +0000844 if (isa<PointerType>(v->getType()))
845 MD->invalidateCachedPointerInfo(v);
Chris Lattner2876a642008-03-21 21:14:38 +0000846
847 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
848 E = Phis.end(); I != E; ++I)
849 if (I->second == PN)
850 I->second = v;
851
Chris Lattner8541ede2008-12-01 00:40:32 +0000852 DEBUG(cerr << "GVN removed: " << *PN);
853 MD->removeInstruction(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000854 PN->eraseFromParent();
Bill Wendling6b18a392008-12-22 21:36:08 +0000855 DEBUG(verifyRemoved(PN));
Chris Lattner2876a642008-03-21 21:14:38 +0000856
857 Phis[BB] = v;
858 return v;
Owen Anderson5e5599b2007-07-25 19:57:03 +0000859}
860
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000861/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
862/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000863/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
864/// map is actually a tri-state map with the following values:
865/// 0) we know the block *is not* fully available.
866/// 1) we know the block *is* fully available.
867/// 2) we do not know whether the block is fully available or not, but we are
868/// currently speculating that it will be.
869/// 3) we are speculating for this block and have used that to speculate for
870/// other blocks.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000871static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000872 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000873 // Optimistically assume that the block is fully available and check to see
874 // if we already know about this block in one lookup.
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000875 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
876 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000877
878 // If the entry already existed for this block, return the precomputed value.
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000879 if (!IV.second) {
880 // If this is a speculative "available" value, mark it as being used for
881 // speculation of other blocks.
882 if (IV.first->second == 2)
883 IV.first->second = 3;
884 return IV.first->second != 0;
885 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000886
887 // Otherwise, see if it is fully available in all predecessors.
888 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
889
890 // If this block has no predecessors, it isn't live-in here.
891 if (PI == PE)
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000892 goto SpeculationFailure;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000893
894 for (; PI != PE; ++PI)
895 // If the value isn't fully available in one of our predecessors, then it
896 // isn't fully available in this block either. Undo our previous
897 // optimistic assumption and bail out.
898 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000899 goto SpeculationFailure;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000900
901 return true;
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000902
903// SpeculationFailure - If we get here, we found out that this is not, after
904// all, a fully-available block. We have a problem if we speculated on this and
905// used the speculation to mark other blocks as available.
906SpeculationFailure:
907 char &BBVal = FullyAvailableBlocks[BB];
908
909 // If we didn't speculate on this, just return with it set to false.
910 if (BBVal == 2) {
911 BBVal = 0;
912 return false;
913 }
914
915 // If we did speculate on this value, we could have blocks set to 1 that are
916 // incorrect. Walk the (transitive) successors of this block and mark them as
917 // 0 if set to one.
918 SmallVector<BasicBlock*, 32> BBWorklist;
919 BBWorklist.push_back(BB);
920
921 while (!BBWorklist.empty()) {
922 BasicBlock *Entry = BBWorklist.pop_back_val();
923 // Note that this sets blocks to 0 (unavailable) if they happen to not
924 // already be in FullyAvailableBlocks. This is safe.
925 char &EntryVal = FullyAvailableBlocks[Entry];
926 if (EntryVal == 0) continue; // Already unavailable.
927
928 // Mark as unavailable.
929 EntryVal = 0;
930
931 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
932 BBWorklist.push_back(*I);
933 }
934
935 return false;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000936}
937
Owen Anderson221a4362007-08-16 22:02:55 +0000938/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
939/// non-local by performing PHI construction.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000940bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner804209d2008-03-21 22:01:16 +0000941 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000942 // Find the non-local dependencies of the load.
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000943 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
944 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
945 Deps);
946 //DEBUG(cerr << "INVESTIGATING NONLOCAL LOAD: " << Deps.size() << *LI);
Owen Anderson5e5599b2007-07-25 19:57:03 +0000947
Owen Andersonb39e0de2008-08-26 22:07:42 +0000948 // If we had to process more than one hundred blocks to find the
949 // dependencies, this load isn't worth worrying about. Optimizing
950 // it will be too expensive.
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000951 if (Deps.size() > 100)
Owen Andersonb39e0de2008-08-26 22:07:42 +0000952 return false;
Chris Lattnerb6372932008-12-18 00:51:32 +0000953
954 // If we had a phi translation failure, we'll have a single entry which is a
955 // clobber in the current block. Reject this early.
Torok Edwinba93ea72009-06-17 18:48:18 +0000956 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
957 DEBUG(
958 DOUT << "GVN: non-local load ";
959 WriteAsOperand(*DOUT.stream(), LI);
960 DOUT << " is clobbered by " << *Deps[0].second.getInst();
961 );
Chris Lattnerb6372932008-12-18 00:51:32 +0000962 return false;
Torok Edwinba93ea72009-06-17 18:48:18 +0000963 }
Owen Andersonb39e0de2008-08-26 22:07:42 +0000964
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000965 // Filter out useless results (non-locals, etc). Keep track of the blocks
966 // where we have a value available in repl, also keep track of whether we see
967 // dependencies that produce an unknown value for the load (such as a call
968 // that could potentially clobber the load).
969 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
970 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Owen Anderson0cc1a762007-08-07 23:12:31 +0000971
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000972 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
973 BasicBlock *DepBB = Deps[i].first;
974 MemDepResult DepInfo = Deps[i].second;
Chris Lattner7e61daf2008-12-01 01:15:42 +0000975
Chris Lattner0e3d6332008-12-05 21:04:20 +0000976 if (DepInfo.isClobber()) {
977 UnavailableBlocks.push_back(DepBB);
978 continue;
979 }
980
981 Instruction *DepInst = DepInfo.getInst();
982
983 // Loading the allocation -> undef.
984 if (isa<AllocationInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000985 ValuesPerBlock.push_back(std::make_pair(DepBB,
986 UndefValue::get(LI->getType())));
Chris Lattner7e61daf2008-12-01 01:15:42 +0000987 continue;
988 }
Chris Lattner2876a642008-03-21 21:14:38 +0000989
Chris Lattnerb6fc4b82008-12-09 19:25:07 +0000990 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner9ce89952008-12-01 01:31:36 +0000991 // Reject loads and stores that are to the same address but are of
992 // different types.
993 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
994 // of bitfield access, it would be interesting to optimize for it at some
995 // point.
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000996 if (S->getOperand(0)->getType() != LI->getType()) {
997 UnavailableBlocks.push_back(DepBB);
998 continue;
999 }
Chris Lattner9ce89952008-12-01 01:31:36 +00001000
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001001 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Chris Lattner9ce89952008-12-01 01:31:36 +00001002
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001003 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001004 if (LD->getType() != LI->getType()) {
1005 UnavailableBlocks.push_back(DepBB);
1006 continue;
1007 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001008 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5e5599b2007-07-25 19:57:03 +00001009 } else {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001010 UnavailableBlocks.push_back(DepBB);
1011 continue;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001012 }
Chris Lattner2876a642008-03-21 21:14:38 +00001013 }
Owen Anderson5e5599b2007-07-25 19:57:03 +00001014
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001015 // If we have no predecessors that produce a known value for this load, exit
1016 // early.
1017 if (ValuesPerBlock.empty()) return false;
1018
1019 // If all of the instructions we depend on produce a known value for this
1020 // load, then it is fully redundant and we can use PHI insertion to compute
1021 // its value. Insert PHIs and remove the fully redundant value now.
1022 if (UnavailableBlocks.empty()) {
1023 // Use cached PHI construction information from previous runs
1024 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001025 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001026 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1027 I != E; ++I) {
1028 if ((*I)->getParent() == LI->getParent()) {
1029 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD #1: " << *LI);
1030 LI->replaceAllUsesWith(*I);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001031 if (isa<PointerType>((*I)->getType()))
1032 MD->invalidateCachedPointerInfo(*I);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001033 toErase.push_back(LI);
1034 NumGVNLoad++;
1035 return true;
1036 }
1037
1038 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Anderson0cc1a762007-08-07 23:12:31 +00001039 }
Chris Lattner2876a642008-03-21 21:14:38 +00001040
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001041 DEBUG(cerr << "GVN REMOVING NONLOCAL LOAD: " << *LI);
1042
1043 DenseMap<BasicBlock*, Value*> BlockReplValues;
1044 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1045 // Perform PHI construction.
1046 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1047 LI->replaceAllUsesWith(v);
Chris Lattner69131fd2008-12-15 03:46:38 +00001048
Chris Lattner096f44d2009-02-12 07:00:35 +00001049 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001050 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001051 if (isa<PointerType>(v->getType()))
1052 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001053 toErase.push_back(LI);
1054 NumGVNLoad++;
1055 return true;
1056 }
1057
1058 if (!EnablePRE || !EnableLoadPRE)
1059 return false;
1060
1061 // Okay, we have *some* definitions of the value. This means that the value
1062 // is available in some of our (transitive) predecessors. Lets think about
1063 // doing PRE of this load. This will involve inserting a new load into the
1064 // predecessor when it's not available. We could do this in general, but
1065 // prefer to not increase code size. As such, we only do this when we know
1066 // that we only have to insert *one* load (which means we're basically moving
1067 // the load, not inserting a new one).
1068
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001069 SmallPtrSet<BasicBlock *, 4> Blockers;
1070 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1071 Blockers.insert(UnavailableBlocks[i]);
1072
1073 // Lets find first basic block with more than one predecessor. Walk backwards
1074 // through predecessors if needed.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001075 BasicBlock *LoadBB = LI->getParent();
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001076 BasicBlock *TmpBB = LoadBB;
1077
1078 bool isSinglePred = false;
Dale Johannesen81b64632009-06-17 20:48:23 +00001079 bool allSingleSucc = true;
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001080 while (TmpBB->getSinglePredecessor()) {
1081 isSinglePred = true;
1082 TmpBB = TmpBB->getSinglePredecessor();
1083 if (!TmpBB) // If haven't found any, bail now.
1084 return false;
1085 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1086 return false;
1087 if (Blockers.count(TmpBB))
1088 return false;
Dale Johannesen81b64632009-06-17 20:48:23 +00001089 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1090 allSingleSucc = false;
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001091 }
1092
1093 assert(TmpBB);
1094 LoadBB = TmpBB;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001095
1096 // If we have a repl set with LI itself in it, this means we have a loop where
1097 // at least one of the values is LI. Since this means that we won't be able
1098 // to eliminate LI even if we insert uses in the other predecessors, we will
1099 // end up increasing code size. Reject this by scanning for LI.
1100 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1101 if (ValuesPerBlock[i].second == LI)
1102 return false;
1103
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001104 if (isSinglePred) {
1105 bool isHot = false;
1106 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1107 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
1108 // "Hot" Instruction is in some loop (because it dominates its dep.
1109 // instruction).
1110 if (DT->dominates(LI, I)) {
1111 isHot = true;
1112 break;
1113 }
1114
1115 // We are interested only in "hot" instructions. We don't want to do any
1116 // mis-optimizations here.
1117 if (!isHot)
1118 return false;
1119 }
1120
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001121 // Okay, we have some hope :). Check to see if the loaded value is fully
1122 // available in all but one predecessor.
1123 // FIXME: If we could restructure the CFG, we could make a common pred with
1124 // all the preds that don't have an available LI and insert a new load into
1125 // that one block.
1126 BasicBlock *UnavailablePred = 0;
1127
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001128 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001129 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1130 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1131 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1132 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1133
1134 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1135 PI != E; ++PI) {
1136 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1137 continue;
1138
1139 // If this load is not available in multiple predecessors, reject it.
1140 if (UnavailablePred && UnavailablePred != *PI)
1141 return false;
1142 UnavailablePred = *PI;
1143 }
1144
1145 assert(UnavailablePred != 0 &&
1146 "Fully available value should be eliminated above!");
1147
1148 // If the loaded pointer is PHI node defined in this block, do PHI translation
1149 // to get its value in the predecessor.
1150 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
1151
1152 // Make sure the value is live in the predecessor. If it was defined by a
1153 // non-PHI instruction in this block, we don't know how to recompute it above.
1154 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1155 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
1156 DEBUG(cerr << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
1157 << *LPInst << *LI << "\n");
1158 return false;
1159 }
1160
1161 // We don't currently handle critical edges :(
1162 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
1163 DEBUG(cerr << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
1164 << UnavailablePred->getName() << "': " << *LI);
1165 return false;
Owen Anderson0cc1a762007-08-07 23:12:31 +00001166 }
Dale Johannesen81b64632009-06-17 20:48:23 +00001167
1168 // Make sure it is valid to move this load here. We have to watch out for:
1169 // @1 = getelementptr (i8* p, ...
1170 // test p and branch if == 0
1171 // load @1
1172 // It is valid to have the getelementptr before the test, even if p can be 0,
1173 // as getelementptr only does address arithmetic.
1174 // If we are not pushing the value through any multiple-successor blocks
1175 // we do not have this case. Otherwise, check that the load is safe to
1176 // put anywhere; this can be improved, but should be conservatively safe.
1177 if (!allSingleSucc &&
1178 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
1179 return false;
1180
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001181 // Okay, we can eliminate this load by inserting a reload in the predecessor
1182 // and using PHI construction to get the value in the other predecessors, do
1183 // it.
Chris Lattnerc1008282008-12-05 17:04:12 +00001184 DEBUG(cerr << "GVN REMOVING PRE LOAD: " << *LI);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001185
1186 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1187 LI->getAlignment(),
1188 UnavailablePred->getTerminator());
1189
Owen Anderson04cfdd32009-05-29 05:37:54 +00001190 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1191 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1192 I != E; ++I)
1193 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
1194
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001195 DenseMap<BasicBlock*, Value*> BlockReplValues;
1196 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1197 BlockReplValues[UnavailablePred] = NewLoad;
1198
1199 // Perform PHI construction.
1200 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1201 LI->replaceAllUsesWith(v);
Chris Lattner096f44d2009-02-12 07:00:35 +00001202 if (isa<PHINode>(v))
Chris Lattner69131fd2008-12-15 03:46:38 +00001203 v->takeName(LI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001204 if (isa<PointerType>(v->getType()))
1205 MD->invalidateCachedPointerInfo(v);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001206 toErase.push_back(LI);
1207 NumPRELoad++;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001208 return true;
1209}
1210
Owen Anderson221a4362007-08-16 22:02:55 +00001211/// processLoad - Attempt to eliminate a load, first by eliminating it
1212/// locally, and then attempting non-local elimination if that fails.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001213bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1214 if (L->isVolatile())
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001215 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001216
1217 Value* pointer = L->getPointerOperand();
Chris Lattner0e3d6332008-12-05 21:04:20 +00001218
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001219 // ... to a pointer that has been loaded from before...
Chris Lattner8541ede2008-12-01 00:40:32 +00001220 MemDepResult dep = MD->getDependency(L);
Owen Andersona7b220f2007-08-14 17:59:48 +00001221
Chris Lattner0e3d6332008-12-05 21:04:20 +00001222 // If the value isn't available, don't do anything!
Torok Edwin72070282009-05-29 09:46:03 +00001223 if (dep.isClobber()) {
1224 DEBUG(
1225 // fast print dep, using operator<< on instruction would be too slow
1226 DOUT << "GVN: load ";
1227 WriteAsOperand(*DOUT.stream(), L);
1228 Instruction *I = dep.getInst();
Torok Edwin0b0ddb22009-05-29 16:58:36 +00001229 DOUT << " is clobbered by " << *I;
Torok Edwin72070282009-05-29 09:46:03 +00001230 );
Chris Lattner0e3d6332008-12-05 21:04:20 +00001231 return false;
Torok Edwin72070282009-05-29 09:46:03 +00001232 }
Chris Lattner0e3d6332008-12-05 21:04:20 +00001233
1234 // If it is defined in another block, try harder.
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001235 if (dep.isNonLocal())
Chris Lattner0e3d6332008-12-05 21:04:20 +00001236 return processNonLocalLoad(L, toErase);
Eli Friedman716c10c2008-02-12 12:08:14 +00001237
Chris Lattner0e3d6332008-12-05 21:04:20 +00001238 Instruction *DepInst = dep.getInst();
1239 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1240 // Only forward substitute stores to loads of the same type.
1241 // FIXME: Could do better!
1242 if (DepSI->getPointerOperand()->getType() != pointer->getType())
1243 return false;
1244
1245 // Remove it!
1246 L->replaceAllUsesWith(DepSI->getOperand(0));
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001247 if (isa<PointerType>(DepSI->getOperand(0)->getType()))
1248 MD->invalidateCachedPointerInfo(DepSI->getOperand(0));
Chris Lattner0e3d6332008-12-05 21:04:20 +00001249 toErase.push_back(L);
1250 NumGVNLoad++;
1251 return true;
1252 }
1253
1254 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
1255 // Only forward substitute stores to loads of the same type.
1256 // FIXME: Could do better! load i32 -> load i8 -> truncate on little endian.
1257 if (DepLI->getType() != L->getType())
1258 return false;
1259
1260 // Remove it!
1261 L->replaceAllUsesWith(DepLI);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001262 if (isa<PointerType>(DepLI->getType()))
1263 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner0e3d6332008-12-05 21:04:20 +00001264 toErase.push_back(L);
1265 NumGVNLoad++;
1266 return true;
1267 }
1268
Chris Lattner3ff6d012008-11-30 01:39:32 +00001269 // If this load really doesn't depend on anything, then we must be loading an
1270 // undef value. This can happen when loading for a fresh allocation with no
1271 // intervening stores, for example.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001272 if (isa<AllocationInst>(DepInst)) {
Chris Lattner3ff6d012008-11-30 01:39:32 +00001273 L->replaceAllUsesWith(UndefValue::get(L->getType()));
1274 toErase.push_back(L);
Chris Lattner3ff6d012008-11-30 01:39:32 +00001275 NumGVNLoad++;
Chris Lattner0e3d6332008-12-05 21:04:20 +00001276 return true;
Eli Friedman716c10c2008-02-12 12:08:14 +00001277 }
1278
Chris Lattner0e3d6332008-12-05 21:04:20 +00001279 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001280}
1281
Owen Anderson1b3ea962008-06-20 01:15:47 +00001282Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Anderson54e02192008-06-23 17:49:45 +00001283 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1284 if (I == localAvail.end())
1285 return 0;
1286
1287 ValueNumberScope* locals = I->second;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001288
1289 while (locals) {
1290 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1291 if (I != locals->table.end())
1292 return I->second;
1293 else
1294 locals = locals->parent;
1295 }
1296
1297 return 0;
1298}
1299
Owen Andersonbfe133e2008-12-15 02:03:00 +00001300/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
1301/// by inheritance from the dominator fails, see if we can perform phi
1302/// construction to eliminate the redundancy.
1303Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1304 BasicBlock* BaseBlock = orig->getParent();
1305
1306 SmallPtrSet<BasicBlock*, 4> Visited;
1307 SmallVector<BasicBlock*, 8> Stack;
1308 Stack.push_back(BaseBlock);
1309
1310 DenseMap<BasicBlock*, Value*> Results;
1311
1312 // Walk backwards through our predecessors, looking for instances of the
1313 // value number we're looking for. Instances are recorded in the Results
1314 // map, which is then used to perform phi construction.
1315 while (!Stack.empty()) {
1316 BasicBlock* Current = Stack.back();
1317 Stack.pop_back();
1318
1319 // If we've walked all the way to a proper dominator, then give up. Cases
1320 // where the instance is in the dominator will have been caught by the fast
1321 // path, and any cases that require phi construction further than this are
1322 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1323 // time improvement.
1324 if (DT->properlyDominates(Current, orig->getParent())) return 0;
1325
1326 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1327 localAvail.find(Current);
1328 if (LA == localAvail.end()) return 0;
Chris Lattner73d7fe52009-01-19 22:00:18 +00001329 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Owen Andersonbfe133e2008-12-15 02:03:00 +00001330
1331 if (V != LA->second->table.end()) {
1332 // Found an instance, record it.
1333 Results.insert(std::make_pair(Current, V->second));
1334 continue;
1335 }
1336
1337 // If we reach the beginning of the function, then give up.
1338 if (pred_begin(Current) == pred_end(Current))
1339 return 0;
1340
1341 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1342 PI != PE; ++PI)
1343 if (Visited.insert(*PI))
1344 Stack.push_back(*PI);
1345 }
1346
1347 // If we didn't find instances, give up. Otherwise, perform phi construction.
1348 if (Results.size() == 0)
1349 return 0;
1350 else
1351 return GetValueForBlock(BaseBlock, orig, Results, true);
1352}
1353
Owen Anderson398602a2007-08-14 18:16:29 +00001354/// processInstruction - When calculating availability, handle an instruction
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001355/// by inserting it into the appropriate sets
Owen Andersonaccdca12008-06-12 19:25:32 +00001356bool GVN::processInstruction(Instruction *I,
Chris Lattner804209d2008-03-21 22:01:16 +00001357 SmallVectorImpl<Instruction*> &toErase) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001358 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001359 bool changed = processLoad(L, toErase);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001360
1361 if (!changed) {
1362 unsigned num = VN.lookup_or_add(L);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001363 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001364 }
1365
1366 return changed;
1367 }
1368
Owen Anderson3ea90a72008-07-03 17:44:33 +00001369 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001370 unsigned num = VN.lookup_or_add(I);
Chris Lattner804209d2008-03-21 22:01:16 +00001371
Owen Anderson98f912b2009-04-01 23:53:49 +00001372 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1373 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1374
1375 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1376 return false;
1377
1378 Value* branchCond = BI->getCondition();
1379 uint32_t condVN = VN.lookup_or_add(branchCond);
1380
1381 BasicBlock* trueSucc = BI->getSuccessor(0);
1382 BasicBlock* falseSucc = BI->getSuccessor(1);
1383
1384 if (trueSucc->getSinglePredecessor())
1385 localAvail[trueSucc]->table[condVN] = ConstantInt::getTrue();
1386 if (falseSucc->getSinglePredecessor())
1387 localAvail[falseSucc]->table[condVN] = ConstantInt::getFalse();
1388
1389 return false;
1390
Owen Anderson0c1e6342008-04-07 09:59:07 +00001391 // Allocations are always uniquely numbered, so we can save time and memory
Owen Anderson98f912b2009-04-01 23:53:49 +00001392 // by fast failing them.
1393 } else if (isa<AllocationInst>(I) || isa<TerminatorInst>(I)) {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001394 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson0c1e6342008-04-07 09:59:07 +00001395 return false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001396 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001397
Owen Anderson221a4362007-08-16 22:02:55 +00001398 // Collapse PHI nodes
Owen Andersonbc271a02007-08-14 18:33:27 +00001399 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001400 Value* constVal = CollapsePhi(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001401
1402 if (constVal) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001403 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1404 PI != PE; ++PI)
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001405 PI->second.erase(p);
Owen Andersonbc271a02007-08-14 18:33:27 +00001406
Owen Andersonf5023a72007-08-16 22:51:56 +00001407 p->replaceAllUsesWith(constVal);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001408 if (isa<PointerType>(constVal->getType()))
1409 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson164274e2008-12-23 00:49:51 +00001410 VN.erase(p);
1411
Owen Andersonf5023a72007-08-16 22:51:56 +00001412 toErase.push_back(p);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001413 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001414 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonbc271a02007-08-14 18:33:27 +00001415 }
Owen Anderson3ea90a72008-07-03 17:44:33 +00001416
1417 // If the number we were assigned was a brand new VN, then we don't
1418 // need to do a lookup to see if the number already exists
1419 // somewhere in the domtree: it can't!
1420 } else if (num == nextNum) {
1421 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
1422
Owen Andersonbfe133e2008-12-15 02:03:00 +00001423 // Perform fast-path value-number based elimination of values inherited from
1424 // dominators.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001425 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson086b2c42007-12-08 01:37:09 +00001426 // Remove it!
Owen Anderson10ffa862007-07-31 23:27:13 +00001427 VN.erase(I);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001428 I->replaceAllUsesWith(repl);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001429 if (isa<PointerType>(repl->getType()))
1430 MD->invalidateCachedPointerInfo(repl);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001431 toErase.push_back(I);
1432 return true;
Owen Andersonbfe133e2008-12-15 02:03:00 +00001433
1434#if 0
1435 // Perform slow-pathvalue-number based elimination with phi construction.
1436 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1437 // Remove it!
1438 VN.erase(I);
1439 I->replaceAllUsesWith(repl);
1440 if (isa<PointerType>(repl->getType()))
1441 MD->invalidateCachedPointerInfo(repl);
1442 toErase.push_back(I);
1443 return true;
1444#endif
Owen Anderson3ea90a72008-07-03 17:44:33 +00001445 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001446 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001447 }
1448
1449 return false;
1450}
1451
Bill Wendling456e8852008-12-22 22:32:22 +00001452/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson676070d2007-08-14 18:04:11 +00001453bool GVN::runOnFunction(Function& F) {
Chris Lattner8541ede2008-12-01 00:40:32 +00001454 MD = &getAnalysis<MemoryDependenceAnalysis>();
1455 DT = &getAnalysis<DominatorTree>();
Owen Andersonf7928602008-05-12 20:15:55 +00001456 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner8541ede2008-12-01 00:40:32 +00001457 VN.setMemDep(MD);
1458 VN.setDomTree(DT);
Owen Anderson09b83ba2007-10-18 19:39:33 +00001459
Owen Anderson676070d2007-08-14 18:04:11 +00001460 bool changed = false;
1461 bool shouldContinue = true;
1462
Owen Andersonac310962008-07-16 17:52:31 +00001463 // Merge unconditional branches, allowing PRE to catch more
1464 // optimization opportunities.
1465 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1466 BasicBlock* BB = FI;
1467 ++FI;
Owen Andersonc0623812008-07-17 00:01:40 +00001468 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1469 if (removedBlock) NumGVNBlocks++;
1470
1471 changed |= removedBlock;
Owen Andersonac310962008-07-16 17:52:31 +00001472 }
1473
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001474 unsigned Iteration = 0;
1475
Owen Anderson676070d2007-08-14 18:04:11 +00001476 while (shouldContinue) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001477 DEBUG(cerr << "GVN iteration: " << Iteration << "\n");
Owen Anderson676070d2007-08-14 18:04:11 +00001478 shouldContinue = iterateOnFunction(F);
1479 changed |= shouldContinue;
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001480 ++Iteration;
Owen Anderson676070d2007-08-14 18:04:11 +00001481 }
1482
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001483 if (EnablePRE) {
Owen Anderson2fbfb702008-09-03 23:06:07 +00001484 bool PREChanged = true;
1485 while (PREChanged) {
1486 PREChanged = performPRE(F);
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001487 changed |= PREChanged;
Owen Anderson2fbfb702008-09-03 23:06:07 +00001488 }
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001489 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001490 // FIXME: Should perform GVN again after PRE does something. PRE can move
1491 // computations into blocks where they become fully redundant. Note that
1492 // we can't do this until PRE's critical edge splitting updates memdep.
1493 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopese3127f32008-10-10 16:25:50 +00001494
1495 cleanupGlobalSets();
1496
Owen Anderson676070d2007-08-14 18:04:11 +00001497 return changed;
1498}
1499
1500
Owen Andersonbfe133e2008-12-15 02:03:00 +00001501bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001502 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1503 // incrementing BI before processing an instruction).
Owen Andersonaccdca12008-06-12 19:25:32 +00001504 SmallVector<Instruction*, 8> toErase;
Owen Andersonaccdca12008-06-12 19:25:32 +00001505 bool changed_function = false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001506
Owen Andersonaccdca12008-06-12 19:25:32 +00001507 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1508 BI != BE;) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001509 changed_function |= processInstruction(BI, toErase);
Owen Andersonaccdca12008-06-12 19:25:32 +00001510 if (toErase.empty()) {
1511 ++BI;
1512 continue;
1513 }
1514
1515 // If we need some instructions deleted, do it now.
1516 NumGVNInstr += toErase.size();
1517
1518 // Avoid iterator invalidation.
1519 bool AtStart = BI == BB->begin();
1520 if (!AtStart)
1521 --BI;
1522
1523 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner8541ede2008-12-01 00:40:32 +00001524 E = toErase.end(); I != E; ++I) {
1525 DEBUG(cerr << "GVN removed: " << **I);
1526 MD->removeInstruction(*I);
Owen Andersonaccdca12008-06-12 19:25:32 +00001527 (*I)->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001528 DEBUG(verifyRemoved(*I));
Chris Lattner8541ede2008-12-01 00:40:32 +00001529 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001530 toErase.clear();
Owen Andersonaccdca12008-06-12 19:25:32 +00001531
1532 if (AtStart)
1533 BI = BB->begin();
1534 else
1535 ++BI;
Owen Andersonaccdca12008-06-12 19:25:32 +00001536 }
1537
Owen Andersonaccdca12008-06-12 19:25:32 +00001538 return changed_function;
1539}
1540
Owen Anderson6a903bc2008-06-18 21:41:49 +00001541/// performPRE - Perform a purely local form of PRE that looks for diamond
1542/// control flow patterns and attempts to perform simple PRE at the join point.
1543bool GVN::performPRE(Function& F) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001544 bool Changed = false;
Owen Andersonfdf9f162008-06-19 19:54:19 +00001545 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001546 DenseMap<BasicBlock*, Value*> predMap;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001547 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1548 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1549 BasicBlock* CurrentBlock = *DI;
1550
1551 // Nothing to PRE in the entry block.
1552 if (CurrentBlock == &F.getEntryBlock()) continue;
1553
1554 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1555 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001556 Instruction *CurInst = BI++;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001557
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001558 if (isa<AllocationInst>(CurInst) || isa<TerminatorInst>(CurInst) ||
John Criswell073e4d12009-03-10 15:04:53 +00001559 isa<PHINode>(CurInst) || (CurInst->getType() == Type::VoidTy) ||
Duncan Sands1efabaa2009-05-06 06:49:50 +00001560 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell073e4d12009-03-10 15:04:53 +00001561 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001562 continue;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001563
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001564 uint32_t valno = VN.lookup(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001565
1566 // Look for the predecessors for PRE opportunities. We're
1567 // only trying to solve the basic diamond case, where
1568 // a value is computed in the successor and one predecessor,
1569 // but not the other. We also explicitly disallow cases
1570 // where the successor is its own predecessor, because they're
1571 // more complicated to get right.
1572 unsigned numWith = 0;
1573 unsigned numWithout = 0;
1574 BasicBlock* PREPred = 0;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001575 predMap.clear();
1576
Owen Anderson6a903bc2008-06-18 21:41:49 +00001577 for (pred_iterator PI = pred_begin(CurrentBlock),
1578 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1579 // We're not interested in PRE where the block is its
Owen Anderson1b3ea962008-06-20 01:15:47 +00001580 // own predecessor, on in blocks with predecessors
1581 // that are not reachable.
1582 if (*PI == CurrentBlock) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001583 numWithout = 2;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001584 break;
1585 } else if (!localAvail.count(*PI)) {
1586 numWithout = 2;
1587 break;
1588 }
1589
1590 DenseMap<uint32_t, Value*>::iterator predV =
1591 localAvail[*PI]->table.find(valno);
1592 if (predV == localAvail[*PI]->table.end()) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001593 PREPred = *PI;
1594 numWithout++;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001595 } else if (predV->second == CurInst) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001596 numWithout = 2;
1597 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001598 predMap[*PI] = predV->second;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001599 numWith++;
1600 }
1601 }
1602
1603 // Don't do PRE when it might increase code size, i.e. when
1604 // we would need to insert instructions in more than one pred.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001605 if (numWithout != 1 || numWith == 0)
Owen Anderson6a903bc2008-06-18 21:41:49 +00001606 continue;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001607
Owen Andersonfdf9f162008-06-19 19:54:19 +00001608 // We can't do PRE safely on a critical edge, so instead we schedule
1609 // the edge to be split and perform the PRE the next time we iterate
1610 // on the function.
1611 unsigned succNum = 0;
1612 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1613 i != e; ++i)
Owen Anderson2fbfb702008-09-03 23:06:07 +00001614 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonfdf9f162008-06-19 19:54:19 +00001615 succNum = i;
1616 break;
1617 }
1618
1619 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1620 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Andersonfdf9f162008-06-19 19:54:19 +00001621 continue;
1622 }
1623
Owen Anderson6a903bc2008-06-18 21:41:49 +00001624 // Instantiate the expression the in predecessor that lacked it.
1625 // Because we are going top-down through the block, all value numbers
1626 // will be available in the predecessor by the time we need them. Any
1627 // that weren't original present will have been instantiated earlier
1628 // in this loop.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001629 Instruction* PREInstr = CurInst->clone();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001630 bool success = true;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001631 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1632 Value *Op = PREInstr->getOperand(i);
1633 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1634 continue;
1635
1636 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1637 PREInstr->setOperand(i, V);
1638 } else {
1639 success = false;
1640 break;
Owen Anderson8e462e92008-07-11 20:05:13 +00001641 }
Owen Anderson6a903bc2008-06-18 21:41:49 +00001642 }
1643
1644 // Fail out if we encounter an operand that is not available in
1645 // the PRE predecessor. This is typically because of loads which
1646 // are not value numbered precisely.
1647 if (!success) {
1648 delete PREInstr;
Bill Wendling3c793442008-12-22 22:14:07 +00001649 DEBUG(verifyRemoved(PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001650 continue;
1651 }
1652
1653 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001654 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson1b3ea962008-06-20 01:15:47 +00001655 predMap[PREPred] = PREInstr;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001656 VN.add(PREInstr, valno);
1657 NumGVNPRE++;
1658
1659 // Update the availability map to include the new instruction.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001660 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001661
1662 // Create a PHI to make the value available in this block.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001663 PHINode* Phi = PHINode::Create(CurInst->getType(),
1664 CurInst->getName() + ".pre-phi",
Owen Anderson6a903bc2008-06-18 21:41:49 +00001665 CurrentBlock->begin());
1666 for (pred_iterator PI = pred_begin(CurrentBlock),
1667 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson1b3ea962008-06-20 01:15:47 +00001668 Phi->addIncoming(predMap[*PI], *PI);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001669
1670 VN.add(Phi, valno);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001671 localAvail[CurrentBlock]->table[valno] = Phi;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001672
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001673 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001674 if (isa<PointerType>(Phi->getType()))
1675 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001676 VN.erase(CurInst);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001677
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001678 DEBUG(cerr << "GVN PRE removed: " << *CurInst);
1679 MD->removeInstruction(CurInst);
1680 CurInst->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001681 DEBUG(verifyRemoved(CurInst));
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001682 Changed = true;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001683 }
1684 }
1685
Owen Andersonfdf9f162008-06-19 19:54:19 +00001686 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001687 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonfdf9f162008-06-19 19:54:19 +00001688 SplitCriticalEdge(I->first, I->second, this);
1689
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001690 return Changed || toSplit.size();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001691}
1692
Bill Wendling456e8852008-12-22 22:32:22 +00001693/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson676070d2007-08-14 18:04:11 +00001694bool GVN::iterateOnFunction(Function &F) {
Nuno Lopese3127f32008-10-10 16:25:50 +00001695 cleanupGlobalSets();
Chris Lattnerbeb216d2008-03-21 21:33:23 +00001696
Owen Anderson98f912b2009-04-01 23:53:49 +00001697 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1698 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1699 if (DI->getIDom())
1700 localAvail[DI->getBlock()] =
1701 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1702 else
1703 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1704 }
1705
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001706 // Top-down walk of the dominator tree
Owen Anderson6a903bc2008-06-18 21:41:49 +00001707 bool changed = false;
Owen Anderson03aacba2008-12-15 03:52:17 +00001708#if 0
1709 // Needed for value numbering with phi construction to work.
Owen Andersonbfe133e2008-12-15 02:03:00 +00001710 ReversePostOrderTraversal<Function*> RPOT(&F);
1711 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1712 RE = RPOT.end(); RI != RE; ++RI)
1713 changed |= processBlock(*RI);
Owen Anderson03aacba2008-12-15 03:52:17 +00001714#else
1715 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1716 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1717 changed |= processBlock(DI->getBlock());
1718#endif
1719
Owen Andersonac310962008-07-16 17:52:31 +00001720 return changed;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001721}
Nuno Lopese3127f32008-10-10 16:25:50 +00001722
1723void GVN::cleanupGlobalSets() {
1724 VN.clear();
1725 phiMap.clear();
1726
1727 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1728 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1729 delete I->second;
1730 localAvail.clear();
1731}
Bill Wendling6b18a392008-12-22 21:36:08 +00001732
1733/// verifyRemoved - Verify that the specified instruction does not occur in our
1734/// internal data structures.
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001735void GVN::verifyRemoved(const Instruction *Inst) const {
1736 VN.verifyRemoved(Inst);
Bill Wendling3c793442008-12-22 22:14:07 +00001737
1738 // Walk through the PHI map to make sure the instruction isn't hiding in there
1739 // somewhere.
1740 for (PhiMapType::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001741 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1742 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling3c793442008-12-22 22:14:07 +00001743
1744 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001745 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1746 assert(*II != Inst && "Inst is still a value in PHI map!");
1747 }
1748 }
1749
1750 // Walk through the value number scope to make sure the instruction isn't
1751 // ferreted away in it.
1752 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1753 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1754 const ValueNumberScope *VNS = I->second;
1755
1756 while (VNS) {
1757 for (DenseMap<uint32_t, Value*>::iterator
1758 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1759 assert(II->second != Inst && "Inst still in value numbering scope!");
1760 }
1761
1762 VNS = VNS->parent;
Bill Wendling3c793442008-12-22 22:14:07 +00001763 }
1764 }
Bill Wendling6b18a392008-12-22 21:36:08 +00001765}