blob: a1263822bca7e1eacdd5c6920c526d9797f04a80 [file] [log] [blame]
Chris Lattner72bc70d2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Anderson1ad2cb72007-07-24 17:55:58 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-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 Anderson1ad2cb72007-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 Criswell090c0a22009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman845f5242008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Anderson1ad2cb72007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson0cd32032007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Anderson45537912007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Anderson45537912007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patelc64bc162009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Andersond672ecb2009-07-03 00:17:18 +000025#include "llvm/LLVMContext.h"
Owen Anderson45537912007-07-26 18:26:51 +000026#include "llvm/Value.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000027#include "llvm/ADT/DenseMap.h"
28#include "llvm/ADT/DepthFirstIterator.h"
Owen Anderson255dafc2008-12-15 02:03:00 +000029#include "llvm/ADT/PostOrderIterator.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000030#include "llvm/ADT/SmallPtrSet.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/ADT/Statistic.h"
Owen Andersonb388ca92007-10-18 19:39:33 +000033#include "llvm/Analysis/Dominators.h"
34#include "llvm/Analysis/AliasAnalysis.h"
Victor Hernandez83d63912009-09-18 22:35:49 +000035#include "llvm/Analysis/MallocHelper.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000036#include "llvm/Analysis/MemoryDependenceAnalysis.h"
37#include "llvm/Support/CFG.h"
Owen Andersonaa0b6342008-06-19 19:57:25 +000038#include "llvm/Support/CommandLine.h"
Chris Lattner9f8a6a72008-03-29 04:36:18 +000039#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000040#include "llvm/Support/ErrorHandling.h"
Daniel Dunbarce63ffb2009-07-25 00:23:56 +000041#include "llvm/Support/raw_ostream.h"
Chris Lattnerbb6495c2009-09-20 19:03:47 +000042#include "llvm/Target/TargetData.h"
Owen Anderson5c274ee2008-06-19 19:54:19 +000043#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesen42c3f552009-06-17 20:48:23 +000044#include "llvm/Transforms/Utils/Local.h"
Duncan Sands4520dd22008-10-08 07:23:46 +000045#include <cstdio>
Owen Anderson1ad2cb72007-07-24 17:55:58 +000046using namespace llvm;
47
Bill Wendling70ded192008-12-22 22:14:07 +000048STATISTIC(NumGVNInstr, "Number of instructions deleted");
49STATISTIC(NumGVNLoad, "Number of loads deleted");
50STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
Owen Anderson961edc82008-07-15 16:28:06 +000051STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling70ded192008-12-22 22:14:07 +000052STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattnerd27290d2008-03-22 04:13:49 +000053
Evan Cheng88d11c02008-06-20 01:01:07 +000054static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonc2b856e2008-07-17 19:41:00 +000055 cl::init(true), cl::Hidden);
Dan Gohmanc915c952009-06-15 18:30:15 +000056static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersonaa0b6342008-06-19 19:57:25 +000057
Owen Anderson1ad2cb72007-07-24 17:55:58 +000058//===----------------------------------------------------------------------===//
59// ValueTable Class
60//===----------------------------------------------------------------------===//
61
62/// This class holds the mapping between values and value numbers. It is used
63/// as an efficient mechanism to determine the expression-wise equivalence of
64/// two values.
65namespace {
Chris Lattner3e8b6632009-09-02 06:11:42 +000066 struct Expression {
Dan Gohmanae3a0be2009-06-04 22:49:04 +000067 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
68 UDIV, SDIV, FDIV, UREM, SREM,
Daniel Dunbara279bc32009-09-20 02:20:51 +000069 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
70 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
71 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
72 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
73 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
Owen Anderson1ad2cb72007-07-24 17:55:58 +000074 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
75 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
Daniel Dunbara279bc32009-09-20 02:20:51 +000076 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson3b3f58c2008-05-13 08:17:22 +000077 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Anderson3cd8eb32008-06-19 17:25:39 +000078 EMPTY, TOMBSTONE };
Owen Anderson1ad2cb72007-07-24 17:55:58 +000079
80 ExpressionOpcode opcode;
81 const Type* type;
82 uint32_t firstVN;
83 uint32_t secondVN;
84 uint32_t thirdVN;
85 SmallVector<uint32_t, 4> varargs;
Owen Andersonb388ca92007-10-18 19:39:33 +000086 Value* function;
Daniel Dunbara279bc32009-09-20 02:20:51 +000087
Owen Anderson1ad2cb72007-07-24 17:55:58 +000088 Expression() { }
89 Expression(ExpressionOpcode o) : opcode(o) { }
Daniel Dunbara279bc32009-09-20 02:20:51 +000090
Owen Anderson1ad2cb72007-07-24 17:55:58 +000091 bool operator==(const Expression &other) const {
92 if (opcode != other.opcode)
93 return false;
94 else if (opcode == EMPTY || opcode == TOMBSTONE)
95 return true;
96 else if (type != other.type)
97 return false;
Owen Andersonb388ca92007-10-18 19:39:33 +000098 else if (function != other.function)
99 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000100 else if (firstVN != other.firstVN)
101 return false;
102 else if (secondVN != other.secondVN)
103 return false;
104 else if (thirdVN != other.thirdVN)
105 return false;
106 else {
107 if (varargs.size() != other.varargs.size())
108 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000109
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000110 for (size_t i = 0; i < varargs.size(); ++i)
111 if (varargs[i] != other.varargs[i])
112 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000113
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000114 return true;
115 }
116 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000117
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000118 bool operator!=(const Expression &other) const {
Bill Wendling75f02ee2008-12-22 22:16:31 +0000119 return !(*this == other);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000120 }
121 };
Daniel Dunbara279bc32009-09-20 02:20:51 +0000122
Chris Lattner3e8b6632009-09-02 06:11:42 +0000123 class ValueTable {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000124 private:
125 DenseMap<Value*, uint32_t> valueNumbering;
126 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersona472c4a2008-05-12 20:15:55 +0000127 AliasAnalysis* AA;
128 MemoryDependenceAnalysis* MD;
129 DominatorTree* DT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000130
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000131 uint32_t nextValueNumber;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000132
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000133 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
134 Expression::ExpressionOpcode getOpcode(CmpInst* C);
135 Expression::ExpressionOpcode getOpcode(CastInst* C);
136 Expression create_expression(BinaryOperator* BO);
137 Expression create_expression(CmpInst* C);
138 Expression create_expression(ShuffleVectorInst* V);
139 Expression create_expression(ExtractElementInst* C);
140 Expression create_expression(InsertElementInst* V);
141 Expression create_expression(SelectInst* V);
142 Expression create_expression(CastInst* C);
143 Expression create_expression(GetElementPtrInst* G);
Owen Andersonb388ca92007-10-18 19:39:33 +0000144 Expression create_expression(CallInst* C);
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000145 Expression create_expression(Constant* C);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000146 public:
Dan Gohmane63c4a22009-04-01 16:37:47 +0000147 ValueTable() : nextValueNumber(1) { }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000148 uint32_t lookup_or_add(Value* V);
149 uint32_t lookup(Value* V) const;
150 void add(Value* V, uint32_t num);
151 void clear();
152 void erase(Value* v);
153 unsigned size();
Owen Andersona472c4a2008-05-12 20:15:55 +0000154 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner663e4412008-12-01 00:40:32 +0000155 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersona472c4a2008-05-12 20:15:55 +0000156 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
157 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson0ae33ef2008-07-03 17:44:33 +0000158 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling246dbbb2008-12-22 21:36:08 +0000159 void verifyRemoved(const Value *) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000160 };
161}
162
163namespace llvm {
Chris Lattner76c1b972007-09-17 18:34:04 +0000164template <> struct DenseMapInfo<Expression> {
Owen Anderson830db6a2007-08-02 18:16:06 +0000165 static inline Expression getEmptyKey() {
166 return Expression(Expression::EMPTY);
167 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000168
Owen Anderson830db6a2007-08-02 18:16:06 +0000169 static inline Expression getTombstoneKey() {
170 return Expression(Expression::TOMBSTONE);
171 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000172
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000173 static unsigned getHashValue(const Expression e) {
174 unsigned hash = e.opcode;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000175
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000176 hash = e.firstVN + hash * 37;
177 hash = e.secondVN + hash * 37;
178 hash = e.thirdVN + hash * 37;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000179
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000180 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
181 (unsigned)((uintptr_t)e.type >> 9)) +
182 hash * 37;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000183
Owen Anderson830db6a2007-08-02 18:16:06 +0000184 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
185 E = e.varargs.end(); I != E; ++I)
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000186 hash = *I + hash * 37;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000187
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000188 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
189 (unsigned)((uintptr_t)e.function >> 9)) +
190 hash * 37;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000191
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000192 return hash;
193 }
Chris Lattner76c1b972007-09-17 18:34:04 +0000194 static bool isEqual(const Expression &LHS, const Expression &RHS) {
195 return LHS == RHS;
196 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000197 static bool isPod() { return true; }
198};
199}
200
201//===----------------------------------------------------------------------===//
202// ValueTable Internal Functions
203//===----------------------------------------------------------------------===//
Chris Lattner88365bb2008-03-21 21:14:38 +0000204Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000205 switch(BO->getOpcode()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000206 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000207 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000208 case Instruction::Add: return Expression::ADD;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000209 case Instruction::FAdd: return Expression::FADD;
Chris Lattner88365bb2008-03-21 21:14:38 +0000210 case Instruction::Sub: return Expression::SUB;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000211 case Instruction::FSub: return Expression::FSUB;
Chris Lattner88365bb2008-03-21 21:14:38 +0000212 case Instruction::Mul: return Expression::MUL;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000213 case Instruction::FMul: return Expression::FMUL;
Chris Lattner88365bb2008-03-21 21:14:38 +0000214 case Instruction::UDiv: return Expression::UDIV;
215 case Instruction::SDiv: return Expression::SDIV;
216 case Instruction::FDiv: return Expression::FDIV;
217 case Instruction::URem: return Expression::UREM;
218 case Instruction::SRem: return Expression::SREM;
219 case Instruction::FRem: return Expression::FREM;
220 case Instruction::Shl: return Expression::SHL;
221 case Instruction::LShr: return Expression::LSHR;
222 case Instruction::AShr: return Expression::ASHR;
223 case Instruction::And: return Expression::AND;
224 case Instruction::Or: return Expression::OR;
225 case Instruction::Xor: return Expression::XOR;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000226 }
227}
228
229Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000230 if (isa<ICmpInst>(C)) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000231 switch (C->getPredicate()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000232 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000233 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000234 case ICmpInst::ICMP_EQ: return Expression::ICMPEQ;
235 case ICmpInst::ICMP_NE: return Expression::ICMPNE;
236 case ICmpInst::ICMP_UGT: return Expression::ICMPUGT;
237 case ICmpInst::ICMP_UGE: return Expression::ICMPUGE;
238 case ICmpInst::ICMP_ULT: return Expression::ICMPULT;
239 case ICmpInst::ICMP_ULE: return Expression::ICMPULE;
240 case ICmpInst::ICMP_SGT: return Expression::ICMPSGT;
241 case ICmpInst::ICMP_SGE: return Expression::ICMPSGE;
242 case ICmpInst::ICMP_SLT: return Expression::ICMPSLT;
243 case ICmpInst::ICMP_SLE: return Expression::ICMPSLE;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000244 }
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000245 } else {
246 switch (C->getPredicate()) {
247 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000248 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000249 case FCmpInst::FCMP_OEQ: return Expression::FCMPOEQ;
250 case FCmpInst::FCMP_OGT: return Expression::FCMPOGT;
251 case FCmpInst::FCMP_OGE: return Expression::FCMPOGE;
252 case FCmpInst::FCMP_OLT: return Expression::FCMPOLT;
253 case FCmpInst::FCMP_OLE: return Expression::FCMPOLE;
254 case FCmpInst::FCMP_ONE: return Expression::FCMPONE;
255 case FCmpInst::FCMP_ORD: return Expression::FCMPORD;
256 case FCmpInst::FCMP_UNO: return Expression::FCMPUNO;
257 case FCmpInst::FCMP_UEQ: return Expression::FCMPUEQ;
258 case FCmpInst::FCMP_UGT: return Expression::FCMPUGT;
259 case FCmpInst::FCMP_UGE: return Expression::FCMPUGE;
260 case FCmpInst::FCMP_ULT: return Expression::FCMPULT;
261 case FCmpInst::FCMP_ULE: return Expression::FCMPULE;
262 case FCmpInst::FCMP_UNE: return Expression::FCMPUNE;
263 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000264 }
265}
266
Chris Lattner88365bb2008-03-21 21:14:38 +0000267Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000268 switch(C->getOpcode()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000269 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000270 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000271 case Instruction::Trunc: return Expression::TRUNC;
272 case Instruction::ZExt: return Expression::ZEXT;
273 case Instruction::SExt: return Expression::SEXT;
274 case Instruction::FPToUI: return Expression::FPTOUI;
275 case Instruction::FPToSI: return Expression::FPTOSI;
276 case Instruction::UIToFP: return Expression::UITOFP;
277 case Instruction::SIToFP: return Expression::SITOFP;
278 case Instruction::FPTrunc: return Expression::FPTRUNC;
279 case Instruction::FPExt: return Expression::FPEXT;
280 case Instruction::PtrToInt: return Expression::PTRTOINT;
281 case Instruction::IntToPtr: return Expression::INTTOPTR;
282 case Instruction::BitCast: return Expression::BITCAST;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000283 }
284}
285
Owen Andersonb388ca92007-10-18 19:39:33 +0000286Expression ValueTable::create_expression(CallInst* C) {
287 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000288
Owen Andersonb388ca92007-10-18 19:39:33 +0000289 e.type = C->getType();
290 e.firstVN = 0;
291 e.secondVN = 0;
292 e.thirdVN = 0;
293 e.function = C->getCalledFunction();
294 e.opcode = Expression::CALL;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000295
Owen Andersonb388ca92007-10-18 19:39:33 +0000296 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
297 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000298 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000299
Owen Andersonb388ca92007-10-18 19:39:33 +0000300 return e;
301}
302
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000303Expression ValueTable::create_expression(BinaryOperator* BO) {
304 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000305
Owen Anderson8f46c782008-04-11 05:11:49 +0000306 e.firstVN = lookup_or_add(BO->getOperand(0));
307 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000308 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000309 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000310 e.type = BO->getType();
311 e.opcode = getOpcode(BO);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000312
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000313 return e;
314}
315
316Expression ValueTable::create_expression(CmpInst* C) {
317 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000318
Owen Anderson8f46c782008-04-11 05:11:49 +0000319 e.firstVN = lookup_or_add(C->getOperand(0));
320 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000321 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000322 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000323 e.type = C->getType();
324 e.opcode = getOpcode(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000325
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000326 return e;
327}
328
329Expression ValueTable::create_expression(CastInst* C) {
330 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000331
Owen Anderson8f46c782008-04-11 05:11:49 +0000332 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000333 e.secondVN = 0;
334 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000335 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000336 e.type = C->getType();
337 e.opcode = getOpcode(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000338
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000339 return e;
340}
341
342Expression ValueTable::create_expression(ShuffleVectorInst* S) {
343 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000344
Owen Anderson8f46c782008-04-11 05:11:49 +0000345 e.firstVN = lookup_or_add(S->getOperand(0));
346 e.secondVN = lookup_or_add(S->getOperand(1));
347 e.thirdVN = lookup_or_add(S->getOperand(2));
Owen Andersonb388ca92007-10-18 19:39:33 +0000348 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000349 e.type = S->getType();
350 e.opcode = Expression::SHUFFLE;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000351
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000352 return e;
353}
354
355Expression ValueTable::create_expression(ExtractElementInst* E) {
356 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000357
Owen Anderson8f46c782008-04-11 05:11:49 +0000358 e.firstVN = lookup_or_add(E->getOperand(0));
359 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000360 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000361 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000362 e.type = E->getType();
363 e.opcode = Expression::EXTRACT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000364
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000365 return e;
366}
367
368Expression ValueTable::create_expression(InsertElementInst* I) {
369 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000370
Owen Anderson8f46c782008-04-11 05:11:49 +0000371 e.firstVN = lookup_or_add(I->getOperand(0));
372 e.secondVN = lookup_or_add(I->getOperand(1));
373 e.thirdVN = lookup_or_add(I->getOperand(2));
Owen Andersonb388ca92007-10-18 19:39:33 +0000374 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000375 e.type = I->getType();
376 e.opcode = Expression::INSERT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000377
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000378 return e;
379}
380
381Expression ValueTable::create_expression(SelectInst* I) {
382 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000383
Owen Anderson8f46c782008-04-11 05:11:49 +0000384 e.firstVN = lookup_or_add(I->getCondition());
385 e.secondVN = lookup_or_add(I->getTrueValue());
386 e.thirdVN = lookup_or_add(I->getFalseValue());
Owen Andersonb388ca92007-10-18 19:39:33 +0000387 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000388 e.type = I->getType();
389 e.opcode = Expression::SELECT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000390
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000391 return e;
392}
393
394Expression ValueTable::create_expression(GetElementPtrInst* G) {
395 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000396
Owen Anderson8f46c782008-04-11 05:11:49 +0000397 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000398 e.secondVN = 0;
399 e.thirdVN = 0;
Owen Andersonb388ca92007-10-18 19:39:33 +0000400 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000401 e.type = G->getType();
402 e.opcode = Expression::GEP;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000403
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000404 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
405 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000406 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000407
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000408 return e;
409}
410
411//===----------------------------------------------------------------------===//
412// ValueTable External Functions
413//===----------------------------------------------------------------------===//
414
Owen Andersonb2303722008-06-18 21:41:49 +0000415/// add - Insert a value into the table with a specified value number.
416void ValueTable::add(Value* V, uint32_t num) {
417 valueNumbering.insert(std::make_pair(V, num));
418}
419
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000420/// lookup_or_add - Returns the value number for the specified value, assigning
421/// it a new number if it did not have one before.
422uint32_t ValueTable::lookup_or_add(Value* V) {
423 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
424 if (VI != valueNumbering.end())
425 return VI->second;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000426
Owen Andersonb388ca92007-10-18 19:39:33 +0000427 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson8f46c782008-04-11 05:11:49 +0000428 if (AA->doesNotAccessMemory(C)) {
Owen Andersonb388ca92007-10-18 19:39:33 +0000429 Expression e = create_expression(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000430
Owen Andersonb388ca92007-10-18 19:39:33 +0000431 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
432 if (EI != expressionNumbering.end()) {
433 valueNumbering.insert(std::make_pair(V, EI->second));
434 return EI->second;
435 } else {
436 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
437 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000438
Owen Andersonb388ca92007-10-18 19:39:33 +0000439 return nextValueNumber++;
440 }
Owen Anderson241f6532008-04-17 05:36:50 +0000441 } else if (AA->onlyReadsMemory(C)) {
442 Expression e = create_expression(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000443
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000444 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Anderson241f6532008-04-17 05:36:50 +0000445 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
446 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000447 return nextValueNumber++;
448 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000449
Chris Lattner4c724002008-11-29 02:29:27 +0000450 MemDepResult local_dep = MD->getDependency(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000451
Chris Lattnerb51deb92008-12-05 21:04:20 +0000452 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Andersonc4f406e2008-05-13 23:18:30 +0000453 valueNumbering.insert(std::make_pair(V, nextValueNumber));
454 return nextValueNumber++;
Chris Lattner1440ac52008-11-30 23:39:23 +0000455 }
Chris Lattnerb51deb92008-12-05 21:04:20 +0000456
457 if (local_dep.isDef()) {
458 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
Daniel Dunbara279bc32009-09-20 02:20:51 +0000459
Chris Lattnerb51deb92008-12-05 21:04:20 +0000460 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Andersonc4f406e2008-05-13 23:18:30 +0000461 valueNumbering.insert(std::make_pair(V, nextValueNumber));
462 return nextValueNumber++;
463 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000464
Chris Lattner1440ac52008-11-30 23:39:23 +0000465 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
466 uint32_t c_vn = lookup_or_add(C->getOperand(i));
467 uint32_t cd_vn = lookup_or_add(local_cdep->getOperand(i));
468 if (c_vn != cd_vn) {
469 valueNumbering.insert(std::make_pair(V, nextValueNumber));
470 return nextValueNumber++;
471 }
472 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000473
Chris Lattner1440ac52008-11-30 23:39:23 +0000474 uint32_t v = lookup_or_add(local_cdep);
475 valueNumbering.insert(std::make_pair(V, v));
476 return v;
Owen Andersonc4f406e2008-05-13 23:18:30 +0000477 }
Chris Lattnerbf145d62008-12-01 01:15:42 +0000478
Chris Lattnerb51deb92008-12-05 21:04:20 +0000479 // Non-local case.
Daniel Dunbara279bc32009-09-20 02:20:51 +0000480 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner1559b362008-12-09 19:38:05 +0000481 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattnerb51deb92008-12-05 21:04:20 +0000482 // FIXME: call/call dependencies for readonly calls should return def, not
483 // clobber! Move the checking logic to MemDep!
Owen Anderson16db1f72008-05-13 13:41:23 +0000484 CallInst* cdep = 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000485
Chris Lattner1440ac52008-11-30 23:39:23 +0000486 // Check to see if we have a single dominating call instruction that is
487 // identical to C.
Chris Lattnerbf145d62008-12-01 01:15:42 +0000488 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
489 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattner1440ac52008-11-30 23:39:23 +0000490 // Ignore non-local dependencies.
491 if (I->second.isNonLocal())
492 continue;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000493
Chris Lattner1440ac52008-11-30 23:39:23 +0000494 // We don't handle non-depedencies. If we already have a call, reject
495 // instruction dependencies.
Chris Lattnerb51deb92008-12-05 21:04:20 +0000496 if (I->second.isClobber() || cdep != 0) {
Chris Lattner1440ac52008-11-30 23:39:23 +0000497 cdep = 0;
498 break;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000499 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000500
Chris Lattner1440ac52008-11-30 23:39:23 +0000501 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I->second.getInst());
502 // FIXME: All duplicated with non-local case.
503 if (NonLocalDepCall && DT->properlyDominates(I->first, C->getParent())){
504 cdep = NonLocalDepCall;
505 continue;
506 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000507
Chris Lattner1440ac52008-11-30 23:39:23 +0000508 cdep = 0;
509 break;
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000510 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000511
Owen Anderson16db1f72008-05-13 13:41:23 +0000512 if (!cdep) {
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000513 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson241f6532008-04-17 05:36:50 +0000514 return nextValueNumber++;
515 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000516
Chris Lattnerb51deb92008-12-05 21:04:20 +0000517 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000518 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson241f6532008-04-17 05:36:50 +0000519 return nextValueNumber++;
Owen Anderson241f6532008-04-17 05:36:50 +0000520 }
Chris Lattner1440ac52008-11-30 23:39:23 +0000521 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
522 uint32_t c_vn = lookup_or_add(C->getOperand(i));
523 uint32_t cd_vn = lookup_or_add(cdep->getOperand(i));
524 if (c_vn != cd_vn) {
525 valueNumbering.insert(std::make_pair(V, nextValueNumber));
526 return nextValueNumber++;
527 }
528 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000529
Chris Lattner1440ac52008-11-30 23:39:23 +0000530 uint32_t v = lookup_or_add(cdep);
531 valueNumbering.insert(std::make_pair(V, v));
532 return v;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000533
Owen Andersonb388ca92007-10-18 19:39:33 +0000534 } else {
535 valueNumbering.insert(std::make_pair(V, nextValueNumber));
536 return nextValueNumber++;
537 }
538 } else if (BinaryOperator* BO = dyn_cast<BinaryOperator>(V)) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000539 Expression e = create_expression(BO);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000540
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000541 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
542 if (EI != expressionNumbering.end()) {
543 valueNumbering.insert(std::make_pair(V, EI->second));
544 return EI->second;
545 } else {
546 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
547 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000548
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000549 return nextValueNumber++;
550 }
551 } else if (CmpInst* C = dyn_cast<CmpInst>(V)) {
552 Expression e = create_expression(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000553
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000554 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
555 if (EI != expressionNumbering.end()) {
556 valueNumbering.insert(std::make_pair(V, EI->second));
557 return EI->second;
558 } else {
559 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
560 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000561
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000562 return nextValueNumber++;
563 }
564 } else if (ShuffleVectorInst* U = dyn_cast<ShuffleVectorInst>(V)) {
565 Expression e = create_expression(U);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000566
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000567 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
568 if (EI != expressionNumbering.end()) {
569 valueNumbering.insert(std::make_pair(V, EI->second));
570 return EI->second;
571 } else {
572 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
573 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000574
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000575 return nextValueNumber++;
576 }
577 } else if (ExtractElementInst* U = dyn_cast<ExtractElementInst>(V)) {
578 Expression e = create_expression(U);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000579
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000580 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
581 if (EI != expressionNumbering.end()) {
582 valueNumbering.insert(std::make_pair(V, EI->second));
583 return EI->second;
584 } else {
585 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
586 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000587
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000588 return nextValueNumber++;
589 }
590 } else if (InsertElementInst* U = dyn_cast<InsertElementInst>(V)) {
591 Expression e = create_expression(U);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000592
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000593 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
594 if (EI != expressionNumbering.end()) {
595 valueNumbering.insert(std::make_pair(V, EI->second));
596 return EI->second;
597 } else {
598 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
599 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000600
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000601 return nextValueNumber++;
602 }
603 } else if (SelectInst* U = dyn_cast<SelectInst>(V)) {
604 Expression e = create_expression(U);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000605
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000606 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
607 if (EI != expressionNumbering.end()) {
608 valueNumbering.insert(std::make_pair(V, EI->second));
609 return EI->second;
610 } else {
611 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
612 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000613
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000614 return nextValueNumber++;
615 }
616 } else if (CastInst* U = dyn_cast<CastInst>(V)) {
617 Expression e = create_expression(U);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000618
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000619 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
620 if (EI != expressionNumbering.end()) {
621 valueNumbering.insert(std::make_pair(V, EI->second));
622 return EI->second;
623 } else {
624 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
625 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000626
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000627 return nextValueNumber++;
628 }
629 } else if (GetElementPtrInst* U = dyn_cast<GetElementPtrInst>(V)) {
630 Expression e = create_expression(U);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000631
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000632 DenseMap<Expression, uint32_t>::iterator EI = expressionNumbering.find(e);
633 if (EI != expressionNumbering.end()) {
634 valueNumbering.insert(std::make_pair(V, EI->second));
635 return EI->second;
636 } else {
637 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
638 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000639
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000640 return nextValueNumber++;
641 }
642 } else {
643 valueNumbering.insert(std::make_pair(V, nextValueNumber));
644 return nextValueNumber++;
645 }
646}
647
648/// lookup - Returns the value number of the specified value. Fails if
649/// the value has not yet been numbered.
650uint32_t ValueTable::lookup(Value* V) const {
651 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
Chris Lattner88365bb2008-03-21 21:14:38 +0000652 assert(VI != valueNumbering.end() && "Value not numbered?");
653 return VI->second;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000654}
655
656/// clear - Remove all entries from the ValueTable
657void ValueTable::clear() {
658 valueNumbering.clear();
659 expressionNumbering.clear();
660 nextValueNumber = 1;
661}
662
Owen Andersonbf7d0bc2007-07-31 23:27:13 +0000663/// erase - Remove a value from the value numbering
664void ValueTable::erase(Value* V) {
665 valueNumbering.erase(V);
666}
667
Bill Wendling246dbbb2008-12-22 21:36:08 +0000668/// verifyRemoved - Verify that the value is removed from all internal data
669/// structures.
670void ValueTable::verifyRemoved(const Value *V) const {
671 for (DenseMap<Value*, uint32_t>::iterator
672 I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
673 assert(I->first != V && "Inst still occurs in value numbering map!");
674 }
675}
676
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000677//===----------------------------------------------------------------------===//
Bill Wendling30788b82008-12-22 22:32:22 +0000678// GVN Pass
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000679//===----------------------------------------------------------------------===//
680
681namespace {
Chris Lattner3e8b6632009-09-02 06:11:42 +0000682 struct ValueNumberScope {
Owen Anderson6fafe842008-06-20 01:15:47 +0000683 ValueNumberScope* parent;
684 DenseMap<uint32_t, Value*> table;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000685
Owen Anderson6fafe842008-06-20 01:15:47 +0000686 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
687 };
688}
689
690namespace {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000691
Chris Lattner3e8b6632009-09-02 06:11:42 +0000692 class GVN : public FunctionPass {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000693 bool runOnFunction(Function &F);
694 public:
695 static char ID; // Pass identification, replacement for typeid
Dan Gohmanae73dc12008-09-04 17:05:41 +0000696 GVN() : FunctionPass(&ID) { }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000697
698 private:
Chris Lattner663e4412008-12-01 00:40:32 +0000699 MemoryDependenceAnalysis *MD;
700 DominatorTree *DT;
701
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000702 ValueTable VN;
Owen Anderson6fafe842008-06-20 01:15:47 +0000703 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000704
Owen Andersona37226a2007-08-07 23:12:31 +0000705 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
706 PhiMapType phiMap;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000707
708
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000709 // This transformation requires dominator postdominator info
710 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000711 AU.addRequired<DominatorTree>();
712 AU.addRequired<MemoryDependenceAnalysis>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000713 AU.addRequired<AliasAnalysis>();
Daniel Dunbara279bc32009-09-20 02:20:51 +0000714
Owen Andersonb70a5712008-06-23 17:49:45 +0000715 AU.addPreserved<DominatorTree>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000716 AU.addPreserved<AliasAnalysis>();
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000717 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000718
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000719 // Helper fuctions
720 // FIXME: eliminate or document these better
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000721 bool processLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000722 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000723 bool processInstruction(Instruction* I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000724 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson830db6a2007-08-02 18:16:06 +0000725 bool processNonLocalLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000726 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson255dafc2008-12-15 02:03:00 +0000727 bool processBlock(BasicBlock* BB);
Owen Andersoncbe1d942008-12-14 19:10:35 +0000728 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Anderson1c2763d2007-08-02 17:56:05 +0000729 DenseMap<BasicBlock*, Value*> &Phis,
730 bool top_level = false);
Owen Andersonb2303722008-06-18 21:41:49 +0000731 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson3e75a422007-08-14 18:04:11 +0000732 bool iterateOnFunction(Function &F);
Owen Anderson1defe2d2007-08-16 22:51:56 +0000733 Value* CollapsePhi(PHINode* p);
Owen Andersonb2303722008-06-18 21:41:49 +0000734 bool performPRE(Function& F);
Owen Anderson6fafe842008-06-20 01:15:47 +0000735 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Anderson255dafc2008-12-15 02:03:00 +0000736 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +0000737 void cleanupGlobalSets();
Bill Wendling246dbbb2008-12-22 21:36:08 +0000738 void verifyRemoved(const Instruction *I) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000739 };
Daniel Dunbara279bc32009-09-20 02:20:51 +0000740
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000741 char GVN::ID = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000742}
743
744// createGVNPass - The public interface to this file...
745FunctionPass *llvm::createGVNPass() { return new GVN(); }
746
747static RegisterPass<GVN> X("gvn",
748 "Global Value Numbering");
749
Owen Andersonb2303722008-06-18 21:41:49 +0000750void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson0cd32032007-07-25 19:57:03 +0000751 printf("{\n");
Owen Andersonb2303722008-06-18 21:41:49 +0000752 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson0cd32032007-07-25 19:57:03 +0000753 E = d.end(); I != E; ++I) {
Owen Andersonb2303722008-06-18 21:41:49 +0000754 printf("%d\n", I->first);
Owen Anderson0cd32032007-07-25 19:57:03 +0000755 I->second->dump();
756 }
757 printf("}\n");
758}
759
Owen Anderson4eebf0b2009-08-26 22:55:11 +0000760static bool isSafeReplacement(PHINode* p, Instruction* inst) {
761 if (!isa<PHINode>(inst))
762 return true;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000763
Owen Anderson4eebf0b2009-08-26 22:55:11 +0000764 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
765 UI != E; ++UI)
766 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
767 if (use_phi->getParent() == inst->getParent())
768 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000769
Owen Anderson4eebf0b2009-08-26 22:55:11 +0000770 return true;
771}
772
Owen Anderson1defe2d2007-08-16 22:51:56 +0000773Value* GVN::CollapsePhi(PHINode* p) {
Dan Gohmanbccfc242009-09-03 15:34:35 +0000774 Value* constVal = p->hasConstantValue(DT);
Chris Lattner88365bb2008-03-21 21:14:38 +0000775 if (!constVal) return 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000776
Chris Lattner88365bb2008-03-21 21:14:38 +0000777 Instruction* inst = dyn_cast<Instruction>(constVal);
778 if (!inst)
779 return constVal;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000780
Chris Lattner663e4412008-12-01 00:40:32 +0000781 if (DT->dominates(inst, p))
Chris Lattner88365bb2008-03-21 21:14:38 +0000782 if (isSafeReplacement(p, inst))
783 return inst;
Owen Anderson1defe2d2007-08-16 22:51:56 +0000784 return 0;
785}
Owen Anderson0cd32032007-07-25 19:57:03 +0000786
Owen Anderson45537912007-07-26 18:26:51 +0000787/// GetValueForBlock - Get the value to use within the specified basic block.
788/// available values are in Phis.
Owen Andersoncbe1d942008-12-14 19:10:35 +0000789Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner88365bb2008-03-21 21:14:38 +0000790 DenseMap<BasicBlock*, Value*> &Phis,
Daniel Dunbara279bc32009-09-20 02:20:51 +0000791 bool top_level) {
792
Owen Anderson45537912007-07-26 18:26:51 +0000793 // If we have already computed this value, return the previously computed val.
Owen Andersonab870272007-08-03 19:59:35 +0000794 DenseMap<BasicBlock*, Value*>::iterator V = Phis.find(BB);
795 if (V != Phis.end() && !top_level) return V->second;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000796
Owen Andersoncb29a4f2008-07-02 18:15:31 +0000797 // If the block is unreachable, just return undef, since this path
798 // can't actually occur at runtime.
Chris Lattner663e4412008-12-01 00:40:32 +0000799 if (!DT->isReachableFromEntry(BB))
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000800 return Phis[BB] = UndefValue::get(orig->getType());
Daniel Dunbara279bc32009-09-20 02:20:51 +0000801
Chris Lattnerae199312008-12-09 19:21:47 +0000802 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
803 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Andersonab870272007-08-03 19:59:35 +0000804 Phis[BB] = ret;
805 return ret;
Owen Anderson4b55c3b2007-08-03 11:03:26 +0000806 }
Chris Lattnerae199312008-12-09 19:21:47 +0000807
808 // Get the number of predecessors of this block so we can reserve space later.
809 // If there is already a PHI in it, use the #preds from it, otherwise count.
810 // Getting it from the PHI is constant time.
811 unsigned NumPreds;
812 if (PHINode *ExistingPN = dyn_cast<PHINode>(BB->begin()))
813 NumPreds = ExistingPN->getNumIncomingValues();
814 else
815 NumPreds = std::distance(pred_begin(BB), pred_end(BB));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000816
Owen Anderson45537912007-07-26 18:26:51 +0000817 // Otherwise, the idom is the loop, so we need to insert a PHI node. Do so
818 // now, then get values to fill in the incoming values for the PHI.
Gabor Greif051a9502008-04-06 20:25:17 +0000819 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
820 BB->begin());
Chris Lattnerae199312008-12-09 19:21:47 +0000821 PN->reserveOperandSpace(NumPreds);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000822
Chris Lattnerae199312008-12-09 19:21:47 +0000823 Phis.insert(std::make_pair(BB, PN));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000824
Owen Anderson45537912007-07-26 18:26:51 +0000825 // Fill in the incoming values for the block.
Owen Anderson054ab942007-07-31 17:43:14 +0000826 for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
827 Value* val = GetValueForBlock(*PI, orig, Phis);
Owen Anderson054ab942007-07-31 17:43:14 +0000828 PN->addIncoming(val, *PI);
829 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000830
Chris Lattner663e4412008-12-01 00:40:32 +0000831 VN.getAliasAnalysis()->copyValue(orig, PN);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000832
Owen Anderson62bc33c2007-08-16 22:02:55 +0000833 // Attempt to collapse PHI nodes that are trivially redundant
Owen Anderson1defe2d2007-08-16 22:51:56 +0000834 Value* v = CollapsePhi(PN);
Chris Lattner88365bb2008-03-21 21:14:38 +0000835 if (!v) {
836 // Cache our phi construction results
Owen Andersoncbe1d942008-12-14 19:10:35 +0000837 if (LoadInst* L = dyn_cast<LoadInst>(orig))
838 phiMap[L->getPointerOperand()].insert(PN);
839 else
840 phiMap[orig].insert(PN);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000841
Chris Lattner88365bb2008-03-21 21:14:38 +0000842 return PN;
Owen Anderson054ab942007-07-31 17:43:14 +0000843 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000844
Chris Lattner88365bb2008-03-21 21:14:38 +0000845 PN->replaceAllUsesWith(v);
Chris Lattnerbc99be12008-12-09 22:06:23 +0000846 if (isa<PointerType>(v->getType()))
847 MD->invalidateCachedPointerInfo(v);
Chris Lattner88365bb2008-03-21 21:14:38 +0000848
849 for (DenseMap<BasicBlock*, Value*>::iterator I = Phis.begin(),
850 E = Phis.end(); I != E; ++I)
851 if (I->second == PN)
852 I->second = v;
853
Dan Gohman2a298992009-07-31 20:24:18 +0000854 DEBUG(errs() << "GVN removed: " << *PN << '\n');
Chris Lattner663e4412008-12-01 00:40:32 +0000855 MD->removeInstruction(PN);
Chris Lattner88365bb2008-03-21 21:14:38 +0000856 PN->eraseFromParent();
Bill Wendling246dbbb2008-12-22 21:36:08 +0000857 DEBUG(verifyRemoved(PN));
Chris Lattner88365bb2008-03-21 21:14:38 +0000858
859 Phis[BB] = v;
860 return v;
Owen Anderson0cd32032007-07-25 19:57:03 +0000861}
862
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000863/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
864/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattner72bc70d2008-12-05 07:49:08 +0000865/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
866/// map is actually a tri-state map with the following values:
867/// 0) we know the block *is not* fully available.
868/// 1) we know the block *is* fully available.
869/// 2) we do not know whether the block is fully available or not, but we are
870/// currently speculating that it will be.
871/// 3) we are speculating for this block and have used that to speculate for
872/// other blocks.
Daniel Dunbara279bc32009-09-20 02:20:51 +0000873static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner72bc70d2008-12-05 07:49:08 +0000874 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000875 // Optimistically assume that the block is fully available and check to see
876 // if we already know about this block in one lookup.
Daniel Dunbara279bc32009-09-20 02:20:51 +0000877 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
Chris Lattner72bc70d2008-12-05 07:49:08 +0000878 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000879
880 // If the entry already existed for this block, return the precomputed value.
Chris Lattner72bc70d2008-12-05 07:49:08 +0000881 if (!IV.second) {
882 // If this is a speculative "available" value, mark it as being used for
883 // speculation of other blocks.
884 if (IV.first->second == 2)
885 IV.first->second = 3;
886 return IV.first->second != 0;
887 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000888
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000889 // Otherwise, see if it is fully available in all predecessors.
890 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000891
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000892 // If this block has no predecessors, it isn't live-in here.
893 if (PI == PE)
Chris Lattner72bc70d2008-12-05 07:49:08 +0000894 goto SpeculationFailure;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000895
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000896 for (; PI != PE; ++PI)
897 // If the value isn't fully available in one of our predecessors, then it
898 // isn't fully available in this block either. Undo our previous
899 // optimistic assumption and bail out.
900 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattner72bc70d2008-12-05 07:49:08 +0000901 goto SpeculationFailure;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000902
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000903 return true;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000904
Chris Lattner72bc70d2008-12-05 07:49:08 +0000905// SpeculationFailure - If we get here, we found out that this is not, after
906// all, a fully-available block. We have a problem if we speculated on this and
907// used the speculation to mark other blocks as available.
908SpeculationFailure:
909 char &BBVal = FullyAvailableBlocks[BB];
Daniel Dunbara279bc32009-09-20 02:20:51 +0000910
Chris Lattner72bc70d2008-12-05 07:49:08 +0000911 // If we didn't speculate on this, just return with it set to false.
912 if (BBVal == 2) {
913 BBVal = 0;
914 return false;
915 }
916
917 // If we did speculate on this value, we could have blocks set to 1 that are
918 // incorrect. Walk the (transitive) successors of this block and mark them as
919 // 0 if set to one.
920 SmallVector<BasicBlock*, 32> BBWorklist;
921 BBWorklist.push_back(BB);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000922
Chris Lattner72bc70d2008-12-05 07:49:08 +0000923 while (!BBWorklist.empty()) {
924 BasicBlock *Entry = BBWorklist.pop_back_val();
925 // Note that this sets blocks to 0 (unavailable) if they happen to not
926 // already be in FullyAvailableBlocks. This is safe.
927 char &EntryVal = FullyAvailableBlocks[Entry];
928 if (EntryVal == 0) continue; // Already unavailable.
929
930 // Mark as unavailable.
931 EntryVal = 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000932
Chris Lattner72bc70d2008-12-05 07:49:08 +0000933 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
934 BBWorklist.push_back(*I);
935 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000936
Chris Lattner72bc70d2008-12-05 07:49:08 +0000937 return false;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000938}
939
Owen Anderson62bc33c2007-08-16 22:02:55 +0000940/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
941/// non-local by performing PHI construction.
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000942bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000943 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000944 // Find the non-local dependencies of the load.
Daniel Dunbara279bc32009-09-20 02:20:51 +0000945 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
Chris Lattner91bcf642008-12-09 19:25:07 +0000946 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
947 Deps);
Dan Gohman2a298992009-07-31 20:24:18 +0000948 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: "
949 // << Deps.size() << *LI << '\n');
Daniel Dunbara279bc32009-09-20 02:20:51 +0000950
Owen Anderson516eb1c2008-08-26 22:07:42 +0000951 // If we had to process more than one hundred blocks to find the
952 // dependencies, this load isn't worth worrying about. Optimizing
953 // it will be too expensive.
Chris Lattner91bcf642008-12-09 19:25:07 +0000954 if (Deps.size() > 100)
Owen Anderson516eb1c2008-08-26 22:07:42 +0000955 return false;
Chris Lattner5f4f84b2008-12-18 00:51:32 +0000956
957 // If we had a phi translation failure, we'll have a single entry which is a
958 // clobber in the current block. Reject this early.
Torok Edwin4306b1a2009-06-17 18:48:18 +0000959 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
960 DEBUG(
Dan Gohmanfd87a542009-07-25 01:43:01 +0000961 errs() << "GVN: non-local load ";
962 WriteAsOperand(errs(), LI);
Dan Gohman2a298992009-07-31 20:24:18 +0000963 errs() << " is clobbered by " << *Deps[0].second.getInst() << '\n';
Torok Edwin4306b1a2009-06-17 18:48:18 +0000964 );
Chris Lattner5f4f84b2008-12-18 00:51:32 +0000965 return false;
Torok Edwin4306b1a2009-06-17 18:48:18 +0000966 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000967
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000968 // Filter out useless results (non-locals, etc). Keep track of the blocks
969 // where we have a value available in repl, also keep track of whether we see
970 // dependencies that produce an unknown value for the load (such as a call
971 // that could potentially clobber the load).
972 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
973 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000974
Chris Lattner91bcf642008-12-09 19:25:07 +0000975 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
976 BasicBlock *DepBB = Deps[i].first;
977 MemDepResult DepInfo = Deps[i].second;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000978
Chris Lattnerb51deb92008-12-05 21:04:20 +0000979 if (DepInfo.isClobber()) {
980 UnavailableBlocks.push_back(DepBB);
981 continue;
982 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000983
Chris Lattnerb51deb92008-12-05 21:04:20 +0000984 Instruction *DepInst = DepInfo.getInst();
Daniel Dunbara279bc32009-09-20 02:20:51 +0000985
Chris Lattnerb51deb92008-12-05 21:04:20 +0000986 // Loading the allocation -> undef.
Victor Hernandez83d63912009-09-18 22:35:49 +0000987 if (isa<AllocationInst>(DepInst) || isMalloc(DepInst)) {
Daniel Dunbara279bc32009-09-20 02:20:51 +0000988 ValuesPerBlock.push_back(std::make_pair(DepBB,
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000989 UndefValue::get(LI->getType())));
Chris Lattnerbf145d62008-12-01 01:15:42 +0000990 continue;
991 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000992
Chris Lattner91bcf642008-12-09 19:25:07 +0000993 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Daniel Dunbara279bc32009-09-20 02:20:51 +0000994 // Reject loads and stores that are to the same address but are of
Chris Lattner978796e2008-12-01 01:31:36 +0000995 // different types.
996 // NOTE: 403.gcc does have this case (e.g. in readonly_fields_p) because
997 // of bitfield access, it would be interesting to optimize for it at some
998 // point.
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000999 if (S->getOperand(0)->getType() != LI->getType()) {
1000 UnavailableBlocks.push_back(DepBB);
1001 continue;
1002 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001003
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001004 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Daniel Dunbara279bc32009-09-20 02:20:51 +00001005
Chris Lattner91bcf642008-12-09 19:25:07 +00001006 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001007 if (LD->getType() != LI->getType()) {
1008 UnavailableBlocks.push_back(DepBB);
1009 continue;
1010 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001011 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson0cd32032007-07-25 19:57:03 +00001012 } else {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001013 UnavailableBlocks.push_back(DepBB);
1014 continue;
Owen Anderson0cd32032007-07-25 19:57:03 +00001015 }
Chris Lattner88365bb2008-03-21 21:14:38 +00001016 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001017
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001018 // If we have no predecessors that produce a known value for this load, exit
1019 // early.
1020 if (ValuesPerBlock.empty()) return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001021
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001022 // If all of the instructions we depend on produce a known value for this
1023 // load, then it is fully redundant and we can use PHI insertion to compute
1024 // its value. Insert PHIs and remove the fully redundant value now.
1025 if (UnavailableBlocks.empty()) {
1026 // Use cached PHI construction information from previous runs
1027 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattner91bcf642008-12-09 19:25:07 +00001028 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001029 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1030 I != E; ++I) {
1031 if ((*I)->getParent() == LI->getParent()) {
Dan Gohman2a298992009-07-31 20:24:18 +00001032 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD #1: " << *LI << '\n');
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001033 LI->replaceAllUsesWith(*I);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001034 if (isa<PointerType>((*I)->getType()))
1035 MD->invalidateCachedPointerInfo(*I);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001036 toErase.push_back(LI);
1037 NumGVNLoad++;
1038 return true;
1039 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001040
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001041 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Andersona37226a2007-08-07 23:12:31 +00001042 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001043
Dan Gohman2a298992009-07-31 20:24:18 +00001044 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Daniel Dunbara279bc32009-09-20 02:20:51 +00001045
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001046 DenseMap<BasicBlock*, Value*> BlockReplValues;
1047 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1048 // Perform PHI construction.
1049 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1050 LI->replaceAllUsesWith(v);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001051
Chris Lattner0aefc0e2009-02-12 07:00:35 +00001052 if (isa<PHINode>(v))
Chris Lattnerf3313162008-12-15 03:46:38 +00001053 v->takeName(LI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001054 if (isa<PointerType>(v->getType()))
1055 MD->invalidateCachedPointerInfo(v);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001056 toErase.push_back(LI);
1057 NumGVNLoad++;
1058 return true;
1059 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001060
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001061 if (!EnablePRE || !EnableLoadPRE)
1062 return false;
1063
1064 // Okay, we have *some* definitions of the value. This means that the value
1065 // is available in some of our (transitive) predecessors. Lets think about
1066 // doing PRE of this load. This will involve inserting a new load into the
1067 // predecessor when it's not available. We could do this in general, but
1068 // prefer to not increase code size. As such, we only do this when we know
1069 // that we only have to insert *one* load (which means we're basically moving
1070 // the load, not inserting a new one).
Daniel Dunbara279bc32009-09-20 02:20:51 +00001071
Owen Anderson88554df2009-05-31 09:03:40 +00001072 SmallPtrSet<BasicBlock *, 4> Blockers;
1073 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1074 Blockers.insert(UnavailableBlocks[i]);
1075
1076 // Lets find first basic block with more than one predecessor. Walk backwards
1077 // through predecessors if needed.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001078 BasicBlock *LoadBB = LI->getParent();
Owen Anderson88554df2009-05-31 09:03:40 +00001079 BasicBlock *TmpBB = LoadBB;
1080
1081 bool isSinglePred = false;
Dale Johannesen42c3f552009-06-17 20:48:23 +00001082 bool allSingleSucc = true;
Owen Anderson88554df2009-05-31 09:03:40 +00001083 while (TmpBB->getSinglePredecessor()) {
1084 isSinglePred = true;
1085 TmpBB = TmpBB->getSinglePredecessor();
1086 if (!TmpBB) // If haven't found any, bail now.
1087 return false;
1088 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1089 return false;
1090 if (Blockers.count(TmpBB))
1091 return false;
Dale Johannesen42c3f552009-06-17 20:48:23 +00001092 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1093 allSingleSucc = false;
Owen Anderson88554df2009-05-31 09:03:40 +00001094 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001095
Owen Anderson88554df2009-05-31 09:03:40 +00001096 assert(TmpBB);
1097 LoadBB = TmpBB;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001098
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001099 // If we have a repl set with LI itself in it, this means we have a loop where
1100 // at least one of the values is LI. Since this means that we won't be able
1101 // to eliminate LI even if we insert uses in the other predecessors, we will
1102 // end up increasing code size. Reject this by scanning for LI.
1103 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1104 if (ValuesPerBlock[i].second == LI)
1105 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001106
Owen Anderson88554df2009-05-31 09:03:40 +00001107 if (isSinglePred) {
1108 bool isHot = false;
1109 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1110 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
Daniel Dunbara279bc32009-09-20 02:20:51 +00001111 // "Hot" Instruction is in some loop (because it dominates its dep.
1112 // instruction).
1113 if (DT->dominates(LI, I)) {
1114 isHot = true;
1115 break;
1116 }
Owen Anderson88554df2009-05-31 09:03:40 +00001117
1118 // We are interested only in "hot" instructions. We don't want to do any
1119 // mis-optimizations here.
1120 if (!isHot)
1121 return false;
1122 }
1123
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001124 // Okay, we have some hope :). Check to see if the loaded value is fully
1125 // available in all but one predecessor.
1126 // FIXME: If we could restructure the CFG, we could make a common pred with
1127 // all the preds that don't have an available LI and insert a new load into
1128 // that one block.
1129 BasicBlock *UnavailablePred = 0;
1130
Chris Lattner72bc70d2008-12-05 07:49:08 +00001131 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001132 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1133 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1134 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1135 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1136
1137 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1138 PI != E; ++PI) {
1139 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1140 continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001141
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001142 // If this load is not available in multiple predecessors, reject it.
1143 if (UnavailablePred && UnavailablePred != *PI)
1144 return false;
1145 UnavailablePred = *PI;
1146 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001147
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001148 assert(UnavailablePred != 0 &&
1149 "Fully available value should be eliminated above!");
Daniel Dunbara279bc32009-09-20 02:20:51 +00001150
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001151 // If the loaded pointer is PHI node defined in this block, do PHI translation
1152 // to get its value in the predecessor.
1153 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001154
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001155 // Make sure the value is live in the predecessor. If it was defined by a
1156 // non-PHI instruction in this block, we don't know how to recompute it above.
1157 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1158 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
Daniel Dunbarce63ffb2009-07-25 00:23:56 +00001159 DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
Dan Gohman2a298992009-07-31 20:24:18 +00001160 << *LPInst << '\n' << *LI << "\n");
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001161 return false;
1162 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001163
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001164 // We don't currently handle critical edges :(
1165 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbarce63ffb2009-07-25 00:23:56 +00001166 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
Dan Gohman2a298992009-07-31 20:24:18 +00001167 << UnavailablePred->getName() << "': " << *LI << '\n');
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001168 return false;
Owen Andersona37226a2007-08-07 23:12:31 +00001169 }
Dale Johannesen42c3f552009-06-17 20:48:23 +00001170
1171 // Make sure it is valid to move this load here. We have to watch out for:
1172 // @1 = getelementptr (i8* p, ...
1173 // test p and branch if == 0
1174 // load @1
1175 // It is valid to have the getelementptr before the test, even if p can be 0,
1176 // as getelementptr only does address arithmetic.
1177 // If we are not pushing the value through any multiple-successor blocks
1178 // we do not have this case. Otherwise, check that the load is safe to
1179 // put anywhere; this can be improved, but should be conservatively safe.
1180 if (!allSingleSucc &&
1181 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
1182 return false;
1183
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001184 // Okay, we can eliminate this load by inserting a reload in the predecessor
1185 // and using PHI construction to get the value in the other predecessors, do
1186 // it.
Dan Gohman2a298992009-07-31 20:24:18 +00001187 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Daniel Dunbara279bc32009-09-20 02:20:51 +00001188
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001189 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1190 LI->getAlignment(),
1191 UnavailablePred->getTerminator());
Daniel Dunbara279bc32009-09-20 02:20:51 +00001192
Owen Anderson246ddf52009-05-29 05:37:54 +00001193 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1194 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1195 I != E; ++I)
1196 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Daniel Dunbara279bc32009-09-20 02:20:51 +00001197
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001198 DenseMap<BasicBlock*, Value*> BlockReplValues;
1199 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1200 BlockReplValues[UnavailablePred] = NewLoad;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001201
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001202 // Perform PHI construction.
1203 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1204 LI->replaceAllUsesWith(v);
Chris Lattner0aefc0e2009-02-12 07:00:35 +00001205 if (isa<PHINode>(v))
Chris Lattnerf3313162008-12-15 03:46:38 +00001206 v->takeName(LI);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001207 if (isa<PointerType>(v->getType()))
1208 MD->invalidateCachedPointerInfo(v);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001209 toErase.push_back(LI);
1210 NumPRELoad++;
Owen Anderson0cd32032007-07-25 19:57:03 +00001211 return true;
1212}
1213
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001214/// CoerceAvailableValueToLoadType - If we saw a store of a value to memory, and
1215/// then a load from a must-aliased pointer of a different type, try to coerce
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001216/// the stored value. LoadedTy is the type of the load we want to replace and
1217/// InsertPt is the place to insert new instructions.
1218///
1219/// If we can't do it, return null.
1220static Value *CoerceAvailableValueToLoadType(Value *StoredVal,
1221 const Type *LoadedTy,
1222 Instruction *InsertPt,
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001223 const TargetData &TD) {
1224 const Type *StoredValTy = StoredVal->getType();
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001225
1226 uint64_t StoreSize = TD.getTypeSizeInBits(StoredValTy);
1227 uint64_t LoadSize = TD.getTypeSizeInBits(LoadedTy);
1228
1229 // If the store and reload are the same size, we can always reuse it.
1230 if (StoreSize == LoadSize) {
1231 if (isa<PointerType>(StoredValTy) && isa<PointerType>(LoadedTy)) {
1232 // Pointer to Pointer -> use bitcast.
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001233 return new BitCastInst(StoredVal, LoadedTy, "", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001234 }
1235
1236 // Convert source pointers to integers, which can be bitcast.
1237 if (isa<PointerType>(StoredValTy)) {
1238 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001239 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001240 }
1241
1242 const Type *TypeToCastTo = LoadedTy;
1243 if (isa<PointerType>(TypeToCastTo))
1244 TypeToCastTo = TD.getIntPtrType(StoredValTy->getContext());
1245
1246 if (StoredValTy != TypeToCastTo)
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001247 StoredVal = new BitCastInst(StoredVal, TypeToCastTo, "", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001248
1249 // Cast to pointer if the load needs a pointer type.
1250 if (isa<PointerType>(LoadedTy))
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001251 StoredVal = new IntToPtrInst(StoredVal, LoadedTy, "", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001252
1253 return StoredVal;
1254 }
1255
1256 // If the loaded value is smaller than the available value, then we can
1257 // extract out a piece from it. If the available value is too small, then we
1258 // can't do anything.
1259 if (StoreSize < LoadSize)
1260 return 0;
1261
1262 // Convert source pointers to integers, which can be manipulated.
1263 if (isa<PointerType>(StoredValTy)) {
1264 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001265 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001266 }
1267
1268 // Convert vectors and fp to integer, which can be manipulated.
1269 if (!isa<IntegerType>(StoredValTy)) {
1270 StoredValTy = IntegerType::get(StoredValTy->getContext(), StoreSize);
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001271 StoredVal = new BitCastInst(StoredVal, StoredValTy, "", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001272 }
1273
1274 // If this is a big-endian system, we need to shift the value down to the low
1275 // bits so that a truncate will work.
1276 if (TD.isBigEndian()) {
1277 Constant *Val = ConstantInt::get(StoredVal->getType(), StoreSize-LoadSize);
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001278 StoredVal = BinaryOperator::CreateLShr(StoredVal, Val, "tmp", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001279 }
1280
1281 // Truncate the integer to the right size now.
1282 const Type *NewIntTy = IntegerType::get(StoredValTy->getContext(), LoadSize);
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001283 StoredVal = new TruncInst(StoredVal, NewIntTy, "trunc", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001284
1285 if (LoadedTy == NewIntTy)
1286 return StoredVal;
1287
1288 // If the result is a pointer, inttoptr.
1289 if (isa<PointerType>(LoadedTy))
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001290 return new IntToPtrInst(StoredVal, LoadedTy, "inttoptr", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001291
1292 // Otherwise, bitcast.
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001293 return new BitCastInst(StoredVal, LoadedTy, "bitcast", InsertPt);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001294}
1295
1296
Owen Anderson62bc33c2007-08-16 22:02:55 +00001297/// processLoad - Attempt to eliminate a load, first by eliminating it
1298/// locally, and then attempting non-local elimination if that fails.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001299bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1300 if (L->isVolatile())
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001301 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001302
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001303 // ... to a pointer that has been loaded from before...
Chris Lattner663e4412008-12-01 00:40:32 +00001304 MemDepResult dep = MD->getDependency(L);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001305
Chris Lattnerb51deb92008-12-05 21:04:20 +00001306 // If the value isn't available, don't do anything!
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001307 if (dep.isClobber()) {
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001308 // FIXME: In the future, we should handle things like:
1309 // store i32 123, i32* %P
1310 // %A = bitcast i32* %P to i8*
1311 // %B = gep i8* %A, i32 1
1312 // %C = load i8* %B
1313 //
1314 // We could do that by recognizing if the clobber instructions are obviously
1315 // a common base + constant offset, and if the previous store (or memset)
1316 // completely covers this load. This sort of thing can happen in bitfield
1317 // access code.
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001318 DEBUG(
1319 // fast print dep, using operator<< on instruction would be too slow
Dan Gohmanfd87a542009-07-25 01:43:01 +00001320 errs() << "GVN: load ";
1321 WriteAsOperand(errs(), L);
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001322 Instruction *I = dep.getInst();
Dan Gohman2a298992009-07-31 20:24:18 +00001323 errs() << " is clobbered by " << *I << '\n';
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001324 );
Chris Lattnerb51deb92008-12-05 21:04:20 +00001325 return false;
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001326 }
Chris Lattnerb51deb92008-12-05 21:04:20 +00001327
1328 // If it is defined in another block, try harder.
Chris Lattnerae199312008-12-09 19:21:47 +00001329 if (dep.isNonLocal())
Chris Lattnerb51deb92008-12-05 21:04:20 +00001330 return processNonLocalLoad(L, toErase);
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001331
Chris Lattnerb51deb92008-12-05 21:04:20 +00001332 Instruction *DepInst = dep.getInst();
1333 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001334 Value *StoredVal = DepSI->getOperand(0);
1335
1336 // The store and load are to a must-aliased pointer, but they may not
1337 // actually have the same type. See if we know how to reuse the stored
1338 // value (depending on its type).
1339 const TargetData *TD = 0;
1340 if (StoredVal->getType() != L->getType() &&
1341 (TD = getAnalysisIfAvailable<TargetData>())) {
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001342 StoredVal = CoerceAvailableValueToLoadType(StoredVal, L->getType(), L, *TD);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001343 if (StoredVal == 0)
1344 return false;
1345
1346 DEBUG(errs() << "GVN COERCED STORE:\n" << *DepSI << '\n' << *StoredVal
1347 << '\n' << *L << "\n\n\n");
1348 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001349
Chris Lattnerb51deb92008-12-05 21:04:20 +00001350 // Remove it!
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001351 L->replaceAllUsesWith(StoredVal);
1352 if (isa<PointerType>(StoredVal->getType()))
1353 MD->invalidateCachedPointerInfo(StoredVal);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001354 toErase.push_back(L);
1355 NumGVNLoad++;
1356 return true;
1357 }
1358
1359 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001360 Value *AvailableVal = DepLI;
1361
1362 // The loads are of a must-aliased pointer, but they may not actually have
1363 // the same type. See if we know how to reuse the previously loaded value
1364 // (depending on its type).
1365 const TargetData *TD = 0;
1366 if (DepLI->getType() != L->getType() &&
1367 (TD = getAnalysisIfAvailable<TargetData>())) {
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001368 AvailableVal = CoerceAvailableValueToLoadType(DepLI, L->getType(), L, *TD);
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001369 if (AvailableVal == 0)
1370 return false;
1371
1372 DEBUG(errs() << "GVN COERCED LOAD:\n" << *DepLI << "\n" << *AvailableVal
1373 << "\n" << *L << "\n\n\n");
1374 }
1375
Chris Lattnerb51deb92008-12-05 21:04:20 +00001376 // Remove it!
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001377 L->replaceAllUsesWith(AvailableVal);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001378 if (isa<PointerType>(DepLI->getType()))
1379 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001380 toErase.push_back(L);
1381 NumGVNLoad++;
1382 return true;
1383 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001384
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001385 // FIXME: We should handle memset/memcpy/memmove as dependent instructions to
1386 // forward the value if available.
Chris Lattner6af4b7c2009-09-20 19:31:14 +00001387 //if (isa<MemIntrinsic>(DepInst))
1388 // errs() << "LOAD DEPENDS ON MEM: " << *L << "\n" << *DepInst << "\n\n";
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001389
1390
Chris Lattner237a8282008-11-30 01:39:32 +00001391 // If this load really doesn't depend on anything, then we must be loading an
1392 // undef value. This can happen when loading for a fresh allocation with no
1393 // intervening stores, for example.
Victor Hernandez83d63912009-09-18 22:35:49 +00001394 if (isa<AllocationInst>(DepInst) || isMalloc(DepInst)) {
Owen Anderson9e9a0d52009-07-30 23:03:37 +00001395 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Chris Lattner237a8282008-11-30 01:39:32 +00001396 toErase.push_back(L);
Chris Lattner237a8282008-11-30 01:39:32 +00001397 NumGVNLoad++;
Chris Lattnerb51deb92008-12-05 21:04:20 +00001398 return true;
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001399 }
1400
Chris Lattnerb51deb92008-12-05 21:04:20 +00001401 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001402}
1403
Owen Anderson6fafe842008-06-20 01:15:47 +00001404Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Andersonb70a5712008-06-23 17:49:45 +00001405 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1406 if (I == localAvail.end())
1407 return 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001408
Owen Andersonb70a5712008-06-23 17:49:45 +00001409 ValueNumberScope* locals = I->second;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001410
Owen Anderson6fafe842008-06-20 01:15:47 +00001411 while (locals) {
1412 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1413 if (I != locals->table.end())
1414 return I->second;
1415 else
1416 locals = locals->parent;
1417 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001418
Owen Anderson6fafe842008-06-20 01:15:47 +00001419 return 0;
1420}
1421
Owen Anderson255dafc2008-12-15 02:03:00 +00001422/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
Daniel Dunbara279bc32009-09-20 02:20:51 +00001423/// by inheritance from the dominator fails, see if we can perform phi
Owen Anderson255dafc2008-12-15 02:03:00 +00001424/// construction to eliminate the redundancy.
1425Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1426 BasicBlock* BaseBlock = orig->getParent();
Daniel Dunbara279bc32009-09-20 02:20:51 +00001427
Owen Anderson255dafc2008-12-15 02:03:00 +00001428 SmallPtrSet<BasicBlock*, 4> Visited;
1429 SmallVector<BasicBlock*, 8> Stack;
1430 Stack.push_back(BaseBlock);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001431
Owen Anderson255dafc2008-12-15 02:03:00 +00001432 DenseMap<BasicBlock*, Value*> Results;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001433
Owen Anderson255dafc2008-12-15 02:03:00 +00001434 // Walk backwards through our predecessors, looking for instances of the
1435 // value number we're looking for. Instances are recorded in the Results
1436 // map, which is then used to perform phi construction.
1437 while (!Stack.empty()) {
1438 BasicBlock* Current = Stack.back();
1439 Stack.pop_back();
Daniel Dunbara279bc32009-09-20 02:20:51 +00001440
Owen Anderson255dafc2008-12-15 02:03:00 +00001441 // If we've walked all the way to a proper dominator, then give up. Cases
1442 // where the instance is in the dominator will have been caught by the fast
1443 // path, and any cases that require phi construction further than this are
1444 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1445 // time improvement.
1446 if (DT->properlyDominates(Current, orig->getParent())) return 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001447
Owen Anderson255dafc2008-12-15 02:03:00 +00001448 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1449 localAvail.find(Current);
1450 if (LA == localAvail.end()) return 0;
Chris Lattner2f39b292009-01-19 22:00:18 +00001451 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001452
Owen Anderson255dafc2008-12-15 02:03:00 +00001453 if (V != LA->second->table.end()) {
1454 // Found an instance, record it.
1455 Results.insert(std::make_pair(Current, V->second));
1456 continue;
1457 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001458
Owen Anderson255dafc2008-12-15 02:03:00 +00001459 // If we reach the beginning of the function, then give up.
1460 if (pred_begin(Current) == pred_end(Current))
1461 return 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001462
Owen Anderson255dafc2008-12-15 02:03:00 +00001463 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1464 PI != PE; ++PI)
1465 if (Visited.insert(*PI))
1466 Stack.push_back(*PI);
1467 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001468
Owen Anderson255dafc2008-12-15 02:03:00 +00001469 // If we didn't find instances, give up. Otherwise, perform phi construction.
1470 if (Results.size() == 0)
1471 return 0;
1472 else
1473 return GetValueForBlock(BaseBlock, orig, Results, true);
1474}
1475
Owen Anderson36057c72007-08-14 18:16:29 +00001476/// processInstruction - When calculating availability, handle an instruction
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001477/// by inserting it into the appropriate sets
Owen Andersonaf4240a2008-06-12 19:25:32 +00001478bool GVN::processInstruction(Instruction *I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001479 SmallVectorImpl<Instruction*> &toErase) {
Owen Andersonb2303722008-06-18 21:41:49 +00001480 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattnerb51deb92008-12-05 21:04:20 +00001481 bool changed = processLoad(L, toErase);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001482
Owen Andersonb2303722008-06-18 21:41:49 +00001483 if (!changed) {
1484 unsigned num = VN.lookup_or_add(L);
Owen Anderson6fafe842008-06-20 01:15:47 +00001485 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Andersonb2303722008-06-18 21:41:49 +00001486 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001487
Owen Andersonb2303722008-06-18 21:41:49 +00001488 return changed;
1489 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001490
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001491 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Andersonb2303722008-06-18 21:41:49 +00001492 unsigned num = VN.lookup_or_add(I);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001493
Owen Andersone8a290f2009-04-01 23:53:49 +00001494 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1495 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Daniel Dunbara279bc32009-09-20 02:20:51 +00001496
Owen Andersone8a290f2009-04-01 23:53:49 +00001497 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1498 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001499
Owen Andersone8a290f2009-04-01 23:53:49 +00001500 Value* branchCond = BI->getCondition();
1501 uint32_t condVN = VN.lookup_or_add(branchCond);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001502
Owen Andersone8a290f2009-04-01 23:53:49 +00001503 BasicBlock* trueSucc = BI->getSuccessor(0);
1504 BasicBlock* falseSucc = BI->getSuccessor(1);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001505
Owen Andersone8a290f2009-04-01 23:53:49 +00001506 if (trueSucc->getSinglePredecessor())
Daniel Dunbara279bc32009-09-20 02:20:51 +00001507 localAvail[trueSucc]->table[condVN] =
Owen Anderson5defacc2009-07-31 17:39:07 +00001508 ConstantInt::getTrue(trueSucc->getContext());
Owen Andersone8a290f2009-04-01 23:53:49 +00001509 if (falseSucc->getSinglePredecessor())
Owen Anderson5defacc2009-07-31 17:39:07 +00001510 localAvail[falseSucc]->table[condVN] =
1511 ConstantInt::getFalse(trueSucc->getContext());
Owen Andersone8a290f2009-04-01 23:53:49 +00001512
1513 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001514
Owen Andersone5ffa902008-04-07 09:59:07 +00001515 // Allocations are always uniquely numbered, so we can save time and memory
Daniel Dunbara279bc32009-09-20 02:20:51 +00001516 // by fast failing them.
Victor Hernandez83d63912009-09-18 22:35:49 +00001517 } else if (isa<AllocationInst>(I) || isMalloc(I) || isa<TerminatorInst>(I)) {
Owen Anderson6fafe842008-06-20 01:15:47 +00001518 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersone5ffa902008-04-07 09:59:07 +00001519 return false;
Owen Andersonb2303722008-06-18 21:41:49 +00001520 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001521
Owen Anderson62bc33c2007-08-16 22:02:55 +00001522 // Collapse PHI nodes
Owen Anderson31f49672007-08-14 18:33:27 +00001523 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001524 Value* constVal = CollapsePhi(p);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001525
Owen Anderson31f49672007-08-14 18:33:27 +00001526 if (constVal) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001527 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1528 PI != PE; ++PI)
Chris Lattnerae199312008-12-09 19:21:47 +00001529 PI->second.erase(p);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001530
Owen Anderson1defe2d2007-08-16 22:51:56 +00001531 p->replaceAllUsesWith(constVal);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001532 if (isa<PointerType>(constVal->getType()))
1533 MD->invalidateCachedPointerInfo(constVal);
Owen Andersonae53c932008-12-23 00:49:51 +00001534 VN.erase(p);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001535
Owen Anderson1defe2d2007-08-16 22:51:56 +00001536 toErase.push_back(p);
Owen Andersonb2303722008-06-18 21:41:49 +00001537 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001538 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson31f49672007-08-14 18:33:27 +00001539 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001540
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001541 // If the number we were assigned was a brand new VN, then we don't
1542 // need to do a lookup to see if the number already exists
1543 // somewhere in the domtree: it can't!
1544 } else if (num == nextNum) {
1545 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Daniel Dunbara279bc32009-09-20 02:20:51 +00001546
Owen Anderson255dafc2008-12-15 02:03:00 +00001547 // Perform fast-path value-number based elimination of values inherited from
1548 // dominators.
Owen Anderson6fafe842008-06-20 01:15:47 +00001549 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson5fc4aba2007-12-08 01:37:09 +00001550 // Remove it!
Owen Andersonbf7d0bc2007-07-31 23:27:13 +00001551 VN.erase(I);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001552 I->replaceAllUsesWith(repl);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001553 if (isa<PointerType>(repl->getType()))
1554 MD->invalidateCachedPointerInfo(repl);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001555 toErase.push_back(I);
1556 return true;
Owen Anderson255dafc2008-12-15 02:03:00 +00001557
1558#if 0
1559 // Perform slow-pathvalue-number based elimination with phi construction.
1560 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1561 // Remove it!
1562 VN.erase(I);
1563 I->replaceAllUsesWith(repl);
1564 if (isa<PointerType>(repl->getType()))
1565 MD->invalidateCachedPointerInfo(repl);
1566 toErase.push_back(I);
1567 return true;
1568#endif
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001569 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001570 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001571 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001572
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001573 return false;
1574}
1575
Bill Wendling30788b82008-12-22 22:32:22 +00001576/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson3e75a422007-08-14 18:04:11 +00001577bool GVN::runOnFunction(Function& F) {
Chris Lattner663e4412008-12-01 00:40:32 +00001578 MD = &getAnalysis<MemoryDependenceAnalysis>();
1579 DT = &getAnalysis<DominatorTree>();
Owen Andersona472c4a2008-05-12 20:15:55 +00001580 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner663e4412008-12-01 00:40:32 +00001581 VN.setMemDep(MD);
1582 VN.setDomTree(DT);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001583
Owen Anderson3e75a422007-08-14 18:04:11 +00001584 bool changed = false;
1585 bool shouldContinue = true;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001586
Owen Anderson5d0af032008-07-16 17:52:31 +00001587 // Merge unconditional branches, allowing PRE to catch more
1588 // optimization opportunities.
1589 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1590 BasicBlock* BB = FI;
1591 ++FI;
Owen Andersonb31b06d2008-07-17 00:01:40 +00001592 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1593 if (removedBlock) NumGVNBlocks++;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001594
Owen Andersonb31b06d2008-07-17 00:01:40 +00001595 changed |= removedBlock;
Owen Anderson5d0af032008-07-16 17:52:31 +00001596 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001597
Chris Lattnerae199312008-12-09 19:21:47 +00001598 unsigned Iteration = 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001599
Owen Anderson3e75a422007-08-14 18:04:11 +00001600 while (shouldContinue) {
Dan Gohmanfd87a542009-07-25 01:43:01 +00001601 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Owen Anderson3e75a422007-08-14 18:04:11 +00001602 shouldContinue = iterateOnFunction(F);
1603 changed |= shouldContinue;
Chris Lattnerae199312008-12-09 19:21:47 +00001604 ++Iteration;
Owen Anderson3e75a422007-08-14 18:04:11 +00001605 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001606
Owen Andersone98c54c2008-07-18 18:03:38 +00001607 if (EnablePRE) {
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001608 bool PREChanged = true;
1609 while (PREChanged) {
1610 PREChanged = performPRE(F);
Owen Andersone98c54c2008-07-18 18:03:38 +00001611 changed |= PREChanged;
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001612 }
Owen Andersone98c54c2008-07-18 18:03:38 +00001613 }
Chris Lattnerae199312008-12-09 19:21:47 +00001614 // FIXME: Should perform GVN again after PRE does something. PRE can move
1615 // computations into blocks where they become fully redundant. Note that
1616 // we can't do this until PRE's critical edge splitting updates memdep.
1617 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001618
1619 cleanupGlobalSets();
1620
Owen Anderson3e75a422007-08-14 18:04:11 +00001621 return changed;
1622}
1623
1624
Owen Anderson255dafc2008-12-15 02:03:00 +00001625bool GVN::processBlock(BasicBlock* BB) {
Chris Lattnerae199312008-12-09 19:21:47 +00001626 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1627 // incrementing BI before processing an instruction).
Owen Andersonaf4240a2008-06-12 19:25:32 +00001628 SmallVector<Instruction*, 8> toErase;
Owen Andersonaf4240a2008-06-12 19:25:32 +00001629 bool changed_function = false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001630
Owen Andersonaf4240a2008-06-12 19:25:32 +00001631 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1632 BI != BE;) {
Chris Lattnerb51deb92008-12-05 21:04:20 +00001633 changed_function |= processInstruction(BI, toErase);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001634 if (toErase.empty()) {
1635 ++BI;
1636 continue;
1637 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001638
Owen Andersonaf4240a2008-06-12 19:25:32 +00001639 // If we need some instructions deleted, do it now.
1640 NumGVNInstr += toErase.size();
Daniel Dunbara279bc32009-09-20 02:20:51 +00001641
Owen Andersonaf4240a2008-06-12 19:25:32 +00001642 // Avoid iterator invalidation.
1643 bool AtStart = BI == BB->begin();
1644 if (!AtStart)
1645 --BI;
1646
1647 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner663e4412008-12-01 00:40:32 +00001648 E = toErase.end(); I != E; ++I) {
Dan Gohman2a298992009-07-31 20:24:18 +00001649 DEBUG(errs() << "GVN removed: " << **I << '\n');
Chris Lattner663e4412008-12-01 00:40:32 +00001650 MD->removeInstruction(*I);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001651 (*I)->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00001652 DEBUG(verifyRemoved(*I));
Chris Lattner663e4412008-12-01 00:40:32 +00001653 }
Chris Lattnerae199312008-12-09 19:21:47 +00001654 toErase.clear();
Owen Andersonaf4240a2008-06-12 19:25:32 +00001655
1656 if (AtStart)
1657 BI = BB->begin();
1658 else
1659 ++BI;
Owen Andersonaf4240a2008-06-12 19:25:32 +00001660 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001661
Owen Andersonaf4240a2008-06-12 19:25:32 +00001662 return changed_function;
1663}
1664
Owen Andersonb2303722008-06-18 21:41:49 +00001665/// performPRE - Perform a purely local form of PRE that looks for diamond
1666/// control flow patterns and attempts to perform simple PRE at the join point.
1667bool GVN::performPRE(Function& F) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001668 bool Changed = false;
Owen Anderson5c274ee2008-06-19 19:54:19 +00001669 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner09713792008-12-01 07:29:03 +00001670 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersonb2303722008-06-18 21:41:49 +00001671 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1672 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1673 BasicBlock* CurrentBlock = *DI;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001674
Owen Andersonb2303722008-06-18 21:41:49 +00001675 // Nothing to PRE in the entry block.
1676 if (CurrentBlock == &F.getEntryBlock()) continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001677
Owen Andersonb2303722008-06-18 21:41:49 +00001678 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1679 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001680 Instruction *CurInst = BI++;
Duncan Sands7af1c782009-05-06 06:49:50 +00001681
Victor Hernandez83d63912009-09-18 22:35:49 +00001682 if (isa<AllocationInst>(CurInst) || isMalloc(CurInst) ||
1683 isa<TerminatorInst>(CurInst) || isa<PHINode>(CurInst) ||
Owen Anderson1d0be152009-08-13 21:58:54 +00001684 (CurInst->getType() == Type::getVoidTy(F.getContext())) ||
Duncan Sands7af1c782009-05-06 06:49:50 +00001685 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell090c0a22009-03-10 15:04:53 +00001686 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001687 continue;
Duncan Sands7af1c782009-05-06 06:49:50 +00001688
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001689 uint32_t valno = VN.lookup(CurInst);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001690
Owen Andersonb2303722008-06-18 21:41:49 +00001691 // Look for the predecessors for PRE opportunities. We're
1692 // only trying to solve the basic diamond case, where
1693 // a value is computed in the successor and one predecessor,
1694 // but not the other. We also explicitly disallow cases
1695 // where the successor is its own predecessor, because they're
1696 // more complicated to get right.
1697 unsigned numWith = 0;
1698 unsigned numWithout = 0;
1699 BasicBlock* PREPred = 0;
Chris Lattner09713792008-12-01 07:29:03 +00001700 predMap.clear();
1701
Owen Andersonb2303722008-06-18 21:41:49 +00001702 for (pred_iterator PI = pred_begin(CurrentBlock),
1703 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1704 // We're not interested in PRE where the block is its
Owen Anderson6fafe842008-06-20 01:15:47 +00001705 // own predecessor, on in blocks with predecessors
1706 // that are not reachable.
1707 if (*PI == CurrentBlock) {
Owen Andersonb2303722008-06-18 21:41:49 +00001708 numWithout = 2;
Owen Anderson6fafe842008-06-20 01:15:47 +00001709 break;
1710 } else if (!localAvail.count(*PI)) {
1711 numWithout = 2;
1712 break;
1713 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001714
1715 DenseMap<uint32_t, Value*>::iterator predV =
Owen Anderson6fafe842008-06-20 01:15:47 +00001716 localAvail[*PI]->table.find(valno);
1717 if (predV == localAvail[*PI]->table.end()) {
Owen Andersonb2303722008-06-18 21:41:49 +00001718 PREPred = *PI;
1719 numWithout++;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001720 } else if (predV->second == CurInst) {
Owen Andersonb2303722008-06-18 21:41:49 +00001721 numWithout = 2;
1722 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00001723 predMap[*PI] = predV->second;
Owen Andersonb2303722008-06-18 21:41:49 +00001724 numWith++;
1725 }
1726 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001727
Owen Andersonb2303722008-06-18 21:41:49 +00001728 // Don't do PRE when it might increase code size, i.e. when
1729 // we would need to insert instructions in more than one pred.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001730 if (numWithout != 1 || numWith == 0)
Owen Andersonb2303722008-06-18 21:41:49 +00001731 continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001732
Owen Anderson5c274ee2008-06-19 19:54:19 +00001733 // We can't do PRE safely on a critical edge, so instead we schedule
1734 // the edge to be split and perform the PRE the next time we iterate
1735 // on the function.
1736 unsigned succNum = 0;
1737 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1738 i != e; ++i)
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001739 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Anderson5c274ee2008-06-19 19:54:19 +00001740 succNum = i;
1741 break;
1742 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001743
Owen Anderson5c274ee2008-06-19 19:54:19 +00001744 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1745 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Anderson5c274ee2008-06-19 19:54:19 +00001746 continue;
1747 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001748
Owen Andersonb2303722008-06-18 21:41:49 +00001749 // Instantiate the expression the in predecessor that lacked it.
1750 // Because we are going top-down through the block, all value numbers
1751 // will be available in the predecessor by the time we need them. Any
1752 // that weren't original present will have been instantiated earlier
1753 // in this loop.
Owen Andersone922c022009-07-22 00:24:57 +00001754 Instruction* PREInstr = CurInst->clone(CurInst->getContext());
Owen Andersonb2303722008-06-18 21:41:49 +00001755 bool success = true;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001756 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1757 Value *Op = PREInstr->getOperand(i);
1758 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1759 continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001760
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001761 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1762 PREInstr->setOperand(i, V);
1763 } else {
1764 success = false;
1765 break;
Owen Andersonc45996b2008-07-11 20:05:13 +00001766 }
Owen Andersonb2303722008-06-18 21:41:49 +00001767 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001768
Owen Andersonb2303722008-06-18 21:41:49 +00001769 // Fail out if we encounter an operand that is not available in
Daniel Dunbara279bc32009-09-20 02:20:51 +00001770 // the PRE predecessor. This is typically because of loads which
Owen Andersonb2303722008-06-18 21:41:49 +00001771 // are not value numbered precisely.
1772 if (!success) {
1773 delete PREInstr;
Bill Wendling70ded192008-12-22 22:14:07 +00001774 DEBUG(verifyRemoved(PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00001775 continue;
1776 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001777
Owen Andersonb2303722008-06-18 21:41:49 +00001778 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001779 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson6fafe842008-06-20 01:15:47 +00001780 predMap[PREPred] = PREInstr;
Owen Andersonb2303722008-06-18 21:41:49 +00001781 VN.add(PREInstr, valno);
1782 NumGVNPRE++;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001783
Owen Andersonb2303722008-06-18 21:41:49 +00001784 // Update the availability map to include the new instruction.
Owen Anderson6fafe842008-06-20 01:15:47 +00001785 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Daniel Dunbara279bc32009-09-20 02:20:51 +00001786
Owen Andersonb2303722008-06-18 21:41:49 +00001787 // Create a PHI to make the value available in this block.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001788 PHINode* Phi = PHINode::Create(CurInst->getType(),
1789 CurInst->getName() + ".pre-phi",
Owen Andersonb2303722008-06-18 21:41:49 +00001790 CurrentBlock->begin());
1791 for (pred_iterator PI = pred_begin(CurrentBlock),
1792 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson6fafe842008-06-20 01:15:47 +00001793 Phi->addIncoming(predMap[*PI], *PI);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001794
Owen Andersonb2303722008-06-18 21:41:49 +00001795 VN.add(Phi, valno);
Owen Anderson6fafe842008-06-20 01:15:47 +00001796 localAvail[CurrentBlock]->table[valno] = Phi;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001797
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001798 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001799 if (isa<PointerType>(Phi->getType()))
1800 MD->invalidateCachedPointerInfo(Phi);
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001801 VN.erase(CurInst);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001802
Dan Gohman2a298992009-07-31 20:24:18 +00001803 DEBUG(errs() << "GVN PRE removed: " << *CurInst << '\n');
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001804 MD->removeInstruction(CurInst);
1805 CurInst->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00001806 DEBUG(verifyRemoved(CurInst));
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00001807 Changed = true;
Owen Andersonb2303722008-06-18 21:41:49 +00001808 }
1809 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001810
Owen Anderson5c274ee2008-06-19 19:54:19 +00001811 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov64b53562008-12-05 19:38:49 +00001812 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Anderson5c274ee2008-06-19 19:54:19 +00001813 SplitCriticalEdge(I->first, I->second, this);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001814
Anton Korobeynikov64b53562008-12-05 19:38:49 +00001815 return Changed || toSplit.size();
Owen Andersonb2303722008-06-18 21:41:49 +00001816}
1817
Bill Wendling30788b82008-12-22 22:32:22 +00001818/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson3e75a422007-08-14 18:04:11 +00001819bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001820 cleanupGlobalSets();
Chris Lattner2e607012008-03-21 21:33:23 +00001821
Owen Andersone8a290f2009-04-01 23:53:49 +00001822 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1823 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1824 if (DI->getIDom())
1825 localAvail[DI->getBlock()] =
1826 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1827 else
1828 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1829 }
1830
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001831 // Top-down walk of the dominator tree
Owen Andersonb2303722008-06-18 21:41:49 +00001832 bool changed = false;
Owen Andersonc34d1122008-12-15 03:52:17 +00001833#if 0
1834 // Needed for value numbering with phi construction to work.
Owen Anderson255dafc2008-12-15 02:03:00 +00001835 ReversePostOrderTraversal<Function*> RPOT(&F);
1836 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1837 RE = RPOT.end(); RI != RE; ++RI)
1838 changed |= processBlock(*RI);
Owen Andersonc34d1122008-12-15 03:52:17 +00001839#else
1840 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1841 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1842 changed |= processBlock(DI->getBlock());
1843#endif
1844
Owen Anderson5d0af032008-07-16 17:52:31 +00001845 return changed;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001846}
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001847
1848void GVN::cleanupGlobalSets() {
1849 VN.clear();
1850 phiMap.clear();
1851
1852 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1853 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1854 delete I->second;
1855 localAvail.clear();
1856}
Bill Wendling246dbbb2008-12-22 21:36:08 +00001857
1858/// verifyRemoved - Verify that the specified instruction does not occur in our
1859/// internal data structures.
Bill Wendling6d463f22008-12-22 22:28:56 +00001860void GVN::verifyRemoved(const Instruction *Inst) const {
1861 VN.verifyRemoved(Inst);
Bill Wendling70ded192008-12-22 22:14:07 +00001862
1863 // Walk through the PHI map to make sure the instruction isn't hiding in there
1864 // somewhere.
1865 for (PhiMapType::iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00001866 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1867 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling70ded192008-12-22 22:14:07 +00001868
1869 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00001870 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1871 assert(*II != Inst && "Inst is still a value in PHI map!");
1872 }
1873 }
1874
1875 // Walk through the value number scope to make sure the instruction isn't
1876 // ferreted away in it.
1877 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1878 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1879 const ValueNumberScope *VNS = I->second;
1880
1881 while (VNS) {
1882 for (DenseMap<uint32_t, Value*>::iterator
1883 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1884 assert(II->second != Inst && "Inst still in value numbering scope!");
1885 }
1886
1887 VNS = VNS->parent;
Bill Wendling70ded192008-12-22 22:14:07 +00001888 }
1889 }
Bill Wendling246dbbb2008-12-22 21:36:08 +00001890}