blob: d8418ec1ef44ff79869e07ca74b627dae32b13ef [file] [log] [blame]
Chris Lattner159b98f2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Anderson85c40642007-07-24 17:55:58 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Owen Anderson85c40642007-07-24 17:55:58 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This pass performs global value numbering to eliminate fully redundant
11// instructions. It also performs simple dead load elimination.
12//
John Criswell6e0aa282009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman9aac1db2008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Anderson85c40642007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Anderson85c40642007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson5d72a422007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Anderson85c40642007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patela7379552009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Anderson24be4c12009-07-03 00:17:18 +000025#include "llvm/LLVMContext.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000026#include "llvm/Value.h"
Owen Anderson85c40642007-07-24 17:55:58 +000027#include "llvm/ADT/DenseMap.h"
28#include "llvm/ADT/DepthFirstIterator.h"
Owen Andersona03e7862008-12-15 02:03:00 +000029#include "llvm/ADT/PostOrderIterator.h"
Owen Anderson85c40642007-07-24 17:55:58 +000030#include "llvm/ADT/SmallPtrSet.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/ADT/Statistic.h"
Owen Anderson5e9366f2007-10-18 19:39:33 +000033#include "llvm/Analysis/Dominators.h"
34#include "llvm/Analysis/AliasAnalysis.h"
Victor Hernandez48c3c542009-09-18 22:35:49 +000035#include "llvm/Analysis/MallocHelper.h"
Owen Anderson85c40642007-07-24 17:55:58 +000036#include "llvm/Analysis/MemoryDependenceAnalysis.h"
37#include "llvm/Support/CFG.h"
Owen Andersona2bf7662008-06-19 19:57:25 +000038#include "llvm/Support/CommandLine.h"
Chris Lattner9c5be3c2008-03-29 04:36:18 +000039#include "llvm/Support/Debug.h"
Edwin Török675d5622009-07-11 20:10:48 +000040#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar005975c2009-07-25 00:23:56 +000041#include "llvm/Support/raw_ostream.h"
Chris Lattner7741aa52009-09-20 19:03:47 +000042#include "llvm/Target/TargetData.h"
Owen Andersonec747c42008-06-19 19:54:19 +000043#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesena19b67f2009-06-17 20:48:23 +000044#include "llvm/Transforms/Utils/Local.h"
Duncan Sands05f68372008-10-08 07:23:46 +000045#include <cstdio>
Owen Anderson85c40642007-07-24 17:55:58 +000046using namespace llvm;
47
Bill Wendling3858cae2008-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 Anderson7558f202008-07-15 16:28:06 +000051STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3858cae2008-12-22 22:14:07 +000052STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner1be83222008-03-22 04:13:49 +000053
Evan Cheng019a2e12008-06-20 01:01:07 +000054static cl::opt<bool> EnablePRE("enable-pre",
Owen Anderson3a053612008-07-17 19:41:00 +000055 cl::init(true), cl::Hidden);
Dan Gohman828f89f2009-06-15 18:30:15 +000056static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersona2bf7662008-06-19 19:57:25 +000057
Owen Anderson85c40642007-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 Lattnerfa2d1ba2009-09-02 06:11:42 +000066 struct Expression {
Dan Gohman7ce405e2009-06-04 22:49:04 +000067 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
68 UDIV, SDIV, FDIV, UREM, SREM,
Daniel Dunbar3be44e62009-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 Anderson85c40642007-07-24 17:55:58 +000074 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
75 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
Daniel Dunbar3be44e62009-09-20 02:20:51 +000076 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson771d1122008-05-13 08:17:22 +000077 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Andersonb0cc5ed2008-06-19 17:25:39 +000078 EMPTY, TOMBSTONE };
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +000086 Value* function;
Daniel Dunbar3be44e62009-09-20 02:20:51 +000087
Owen Anderson85c40642007-07-24 17:55:58 +000088 Expression() { }
89 Expression(ExpressionOpcode o) : opcode(o) { }
Daniel Dunbar3be44e62009-09-20 02:20:51 +000090
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +000098 else if (function != other.function)
99 return false;
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000109
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000113
Owen Anderson85c40642007-07-24 17:55:58 +0000114 return true;
115 }
116 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000117
Owen Anderson85c40642007-07-24 17:55:58 +0000118 bool operator!=(const Expression &other) const {
Bill Wendling9b5d4b72008-12-22 22:16:31 +0000119 return !(*this == other);
Owen Anderson85c40642007-07-24 17:55:58 +0000120 }
121 };
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000122
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000123 class ValueTable {
Owen Anderson85c40642007-07-24 17:55:58 +0000124 private:
125 DenseMap<Value*, uint32_t> valueNumbering;
126 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000127 AliasAnalysis* AA;
128 MemoryDependenceAnalysis* MD;
129 DominatorTree* DT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000130
Owen Anderson85c40642007-07-24 17:55:58 +0000131 uint32_t nextValueNumber;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000132
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +0000144 Expression create_expression(CallInst* C);
Owen Anderson771d1122008-05-13 08:17:22 +0000145 Expression create_expression(Constant* C);
Owen Anderson85c40642007-07-24 17:55:58 +0000146 public:
Dan Gohman936a6522009-04-01 16:37:47 +0000147 ValueTable() : nextValueNumber(1) { }
Owen Anderson85c40642007-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 Andersonbcf2bd52008-05-12 20:15:55 +0000154 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner02ca4422008-12-01 00:40:32 +0000155 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000156 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
157 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson8a8d13c2008-07-03 17:44:33 +0000158 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling2a023742008-12-22 21:36:08 +0000159 void verifyRemoved(const Value *) const;
Owen Anderson85c40642007-07-24 17:55:58 +0000160 };
161}
162
163namespace llvm {
Chris Lattner92eea072007-09-17 18:34:04 +0000164template <> struct DenseMapInfo<Expression> {
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000165 static inline Expression getEmptyKey() {
166 return Expression(Expression::EMPTY);
167 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000168
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000169 static inline Expression getTombstoneKey() {
170 return Expression(Expression::TOMBSTONE);
171 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000172
Owen Anderson85c40642007-07-24 17:55:58 +0000173 static unsigned getHashValue(const Expression e) {
174 unsigned hash = e.opcode;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000175
Owen Anderson85c40642007-07-24 17:55:58 +0000176 hash = e.firstVN + hash * 37;
177 hash = e.secondVN + hash * 37;
178 hash = e.thirdVN + hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000179
Anton Korobeynikov8522e1c2008-02-20 11:26:25 +0000180 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
181 (unsigned)((uintptr_t)e.type >> 9)) +
182 hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000183
Owen Andersonbf8a3eb2007-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 Anderson85c40642007-07-24 17:55:58 +0000186 hash = *I + hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000187
Anton Korobeynikov8522e1c2008-02-20 11:26:25 +0000188 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
189 (unsigned)((uintptr_t)e.function >> 9)) +
190 hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000191
Owen Anderson85c40642007-07-24 17:55:58 +0000192 return hash;
193 }
Chris Lattner92eea072007-09-17 18:34:04 +0000194 static bool isEqual(const Expression &LHS, const Expression &RHS) {
195 return LHS == RHS;
196 }
Owen Anderson85c40642007-07-24 17:55:58 +0000197 static bool isPod() { return true; }
198};
199}
200
201//===----------------------------------------------------------------------===//
202// ValueTable Internal Functions
203//===----------------------------------------------------------------------===//
Chris Lattner3d7103e2008-03-21 21:14:38 +0000204Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson85c40642007-07-24 17:55:58 +0000205 switch(BO->getOpcode()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000206 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000207 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner3d7103e2008-03-21 21:14:38 +0000208 case Instruction::Add: return Expression::ADD;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000209 case Instruction::FAdd: return Expression::FADD;
Chris Lattner3d7103e2008-03-21 21:14:38 +0000210 case Instruction::Sub: return Expression::SUB;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000211 case Instruction::FSub: return Expression::FSUB;
Chris Lattner3d7103e2008-03-21 21:14:38 +0000212 case Instruction::Mul: return Expression::MUL;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000213 case Instruction::FMul: return Expression::FMUL;
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000226 }
227}
228
229Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewycky8f5253b2009-07-08 03:04:38 +0000230 if (isa<ICmpInst>(C)) {
Owen Anderson85c40642007-07-24 17:55:58 +0000231 switch (C->getPredicate()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000232 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000233 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000244 }
Nick Lewycky8f5253b2009-07-08 03:04:38 +0000245 } else {
246 switch (C->getPredicate()) {
247 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000248 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewycky8f5253b2009-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 Anderson85c40642007-07-24 17:55:58 +0000264 }
265}
266
Chris Lattner3d7103e2008-03-21 21:14:38 +0000267Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Anderson85c40642007-07-24 17:55:58 +0000268 switch(C->getOpcode()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000269 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000270 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000283 }
284}
285
Owen Anderson5e9366f2007-10-18 19:39:33 +0000286Expression ValueTable::create_expression(CallInst* C) {
287 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000288
Owen Anderson5e9366f2007-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 Dunbar3be44e62009-09-20 02:20:51 +0000295
Owen Anderson5e9366f2007-10-18 19:39:33 +0000296 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
297 I != E; ++I)
Owen Anderson07f478f2008-04-11 05:11:49 +0000298 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000299
Owen Anderson5e9366f2007-10-18 19:39:33 +0000300 return e;
301}
302
Owen Anderson85c40642007-07-24 17:55:58 +0000303Expression ValueTable::create_expression(BinaryOperator* BO) {
304 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000305
Owen Anderson07f478f2008-04-11 05:11:49 +0000306 e.firstVN = lookup_or_add(BO->getOperand(0));
307 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000308 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000309 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000310 e.type = BO->getType();
311 e.opcode = getOpcode(BO);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000312
Owen Anderson85c40642007-07-24 17:55:58 +0000313 return e;
314}
315
316Expression ValueTable::create_expression(CmpInst* C) {
317 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000318
Owen Anderson07f478f2008-04-11 05:11:49 +0000319 e.firstVN = lookup_or_add(C->getOperand(0));
320 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000321 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000322 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000323 e.type = C->getType();
324 e.opcode = getOpcode(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000325
Owen Anderson85c40642007-07-24 17:55:58 +0000326 return e;
327}
328
329Expression ValueTable::create_expression(CastInst* C) {
330 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000331
Owen Anderson07f478f2008-04-11 05:11:49 +0000332 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Anderson85c40642007-07-24 17:55:58 +0000333 e.secondVN = 0;
334 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000335 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000336 e.type = C->getType();
337 e.opcode = getOpcode(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000338
Owen Anderson85c40642007-07-24 17:55:58 +0000339 return e;
340}
341
342Expression ValueTable::create_expression(ShuffleVectorInst* S) {
343 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000344
Owen Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000348 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000349 e.type = S->getType();
350 e.opcode = Expression::SHUFFLE;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000351
Owen Anderson85c40642007-07-24 17:55:58 +0000352 return e;
353}
354
355Expression ValueTable::create_expression(ExtractElementInst* E) {
356 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000357
Owen Anderson07f478f2008-04-11 05:11:49 +0000358 e.firstVN = lookup_or_add(E->getOperand(0));
359 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Anderson85c40642007-07-24 17:55:58 +0000360 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000361 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000362 e.type = E->getType();
363 e.opcode = Expression::EXTRACT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000364
Owen Anderson85c40642007-07-24 17:55:58 +0000365 return e;
366}
367
368Expression ValueTable::create_expression(InsertElementInst* I) {
369 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000370
Owen Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000374 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000375 e.type = I->getType();
376 e.opcode = Expression::INSERT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000377
Owen Anderson85c40642007-07-24 17:55:58 +0000378 return e;
379}
380
381Expression ValueTable::create_expression(SelectInst* I) {
382 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000383
Owen Anderson07f478f2008-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 Anderson5e9366f2007-10-18 19:39:33 +0000387 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000388 e.type = I->getType();
389 e.opcode = Expression::SELECT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000390
Owen Anderson85c40642007-07-24 17:55:58 +0000391 return e;
392}
393
394Expression ValueTable::create_expression(GetElementPtrInst* G) {
395 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000396
Owen Anderson07f478f2008-04-11 05:11:49 +0000397 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Anderson85c40642007-07-24 17:55:58 +0000398 e.secondVN = 0;
399 e.thirdVN = 0;
Owen Anderson5e9366f2007-10-18 19:39:33 +0000400 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000401 e.type = G->getType();
402 e.opcode = Expression::GEP;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000403
Owen Anderson85c40642007-07-24 17:55:58 +0000404 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
405 I != E; ++I)
Owen Anderson07f478f2008-04-11 05:11:49 +0000406 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000407
Owen Anderson85c40642007-07-24 17:55:58 +0000408 return e;
409}
410
411//===----------------------------------------------------------------------===//
412// ValueTable External Functions
413//===----------------------------------------------------------------------===//
414
Owen Andersone6b4ff82008-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 Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000426
Owen Anderson5e9366f2007-10-18 19:39:33 +0000427 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson07f478f2008-04-11 05:11:49 +0000428 if (AA->doesNotAccessMemory(C)) {
Owen Anderson5e9366f2007-10-18 19:39:33 +0000429 Expression e = create_expression(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000430
Owen Anderson5e9366f2007-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 Dunbar3be44e62009-09-20 02:20:51 +0000438
Owen Anderson5e9366f2007-10-18 19:39:33 +0000439 return nextValueNumber++;
440 }
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000441 } else if (AA->onlyReadsMemory(C)) {
442 Expression e = create_expression(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000443
Owen Anderson771d1122008-05-13 08:17:22 +0000444 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000445 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
446 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson771d1122008-05-13 08:17:22 +0000447 return nextValueNumber++;
448 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000449
Chris Lattner12cafbf2008-11-29 02:29:27 +0000450 MemDepResult local_dep = MD->getDependency(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000451
Chris Lattner4531da82008-12-05 21:04:20 +0000452 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Anderson64fcc592008-05-13 23:18:30 +0000453 valueNumbering.insert(std::make_pair(V, nextValueNumber));
454 return nextValueNumber++;
Chris Lattnerd33b6662008-11-30 23:39:23 +0000455 }
Chris Lattner4531da82008-12-05 21:04:20 +0000456
457 if (local_dep.isDef()) {
458 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000459
Chris Lattner4531da82008-12-05 21:04:20 +0000460 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson64fcc592008-05-13 23:18:30 +0000461 valueNumbering.insert(std::make_pair(V, nextValueNumber));
462 return nextValueNumber++;
463 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000464
Chris Lattnerd33b6662008-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 Dunbar3be44e62009-09-20 02:20:51 +0000473
Chris Lattnerd33b6662008-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 Anderson64fcc592008-05-13 23:18:30 +0000477 }
Chris Lattner46876282008-12-01 01:15:42 +0000478
Chris Lattner4531da82008-12-05 21:04:20 +0000479 // Non-local case.
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000480 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner35d5cf52008-12-09 19:38:05 +0000481 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattner4531da82008-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 Anderson3ebaca72008-05-13 13:41:23 +0000484 CallInst* cdep = 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000485
Chris Lattnerd33b6662008-11-30 23:39:23 +0000486 // Check to see if we have a single dominating call instruction that is
487 // identical to C.
Chris Lattner46876282008-12-01 01:15:42 +0000488 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
489 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattnerd33b6662008-11-30 23:39:23 +0000490 // Ignore non-local dependencies.
491 if (I->second.isNonLocal())
492 continue;
Owen Anderson771d1122008-05-13 08:17:22 +0000493
Chris Lattnerd33b6662008-11-30 23:39:23 +0000494 // We don't handle non-depedencies. If we already have a call, reject
495 // instruction dependencies.
Chris Lattner4531da82008-12-05 21:04:20 +0000496 if (I->second.isClobber() || cdep != 0) {
Chris Lattnerd33b6662008-11-30 23:39:23 +0000497 cdep = 0;
498 break;
Owen Anderson771d1122008-05-13 08:17:22 +0000499 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000500
Chris Lattnerd33b6662008-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 Dunbar3be44e62009-09-20 02:20:51 +0000507
Chris Lattnerd33b6662008-11-30 23:39:23 +0000508 cdep = 0;
509 break;
Owen Anderson771d1122008-05-13 08:17:22 +0000510 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000511
Owen Anderson3ebaca72008-05-13 13:41:23 +0000512 if (!cdep) {
Owen Anderson771d1122008-05-13 08:17:22 +0000513 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000514 return nextValueNumber++;
515 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000516
Chris Lattner4531da82008-12-05 21:04:20 +0000517 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson771d1122008-05-13 08:17:22 +0000518 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000519 return nextValueNumber++;
Owen Andersona0b2b8e2008-04-17 05:36:50 +0000520 }
Chris Lattnerd33b6662008-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 Dunbar3be44e62009-09-20 02:20:51 +0000529
Chris Lattnerd33b6662008-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 Dunbar3be44e62009-09-20 02:20:51 +0000533
Owen Anderson5e9366f2007-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 Anderson85c40642007-07-24 17:55:58 +0000539 Expression e = create_expression(BO);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000540
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000548
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000553
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000561
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000566
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000574
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000579
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000587
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000592
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000600
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000605
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000613
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000618
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000626
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000631
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000639
Owen Anderson85c40642007-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 Lattner3d7103e2008-03-21 21:14:38 +0000652 assert(VI != valueNumbering.end() && "Value not numbered?");
653 return VI->second;
Owen Anderson85c40642007-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 Anderson5aff8002007-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 Wendling2a023742008-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 Anderson85c40642007-07-24 17:55:58 +0000677//===----------------------------------------------------------------------===//
Bill Wendling42f17f62008-12-22 22:32:22 +0000678// GVN Pass
Owen Anderson85c40642007-07-24 17:55:58 +0000679//===----------------------------------------------------------------------===//
680
681namespace {
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000682 struct ValueNumberScope {
Owen Anderson2a412722008-06-20 01:15:47 +0000683 ValueNumberScope* parent;
684 DenseMap<uint32_t, Value*> table;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000685
Owen Anderson2a412722008-06-20 01:15:47 +0000686 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
687 };
688}
689
690namespace {
Owen Anderson85c40642007-07-24 17:55:58 +0000691
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000692 class GVN : public FunctionPass {
Owen Anderson85c40642007-07-24 17:55:58 +0000693 bool runOnFunction(Function &F);
694 public:
695 static char ID; // Pass identification, replacement for typeid
Dan Gohman26f8c272008-09-04 17:05:41 +0000696 GVN() : FunctionPass(&ID) { }
Owen Anderson85c40642007-07-24 17:55:58 +0000697
698 private:
Chris Lattner02ca4422008-12-01 00:40:32 +0000699 MemoryDependenceAnalysis *MD;
700 DominatorTree *DT;
701
Owen Anderson85c40642007-07-24 17:55:58 +0000702 ValueTable VN;
Owen Anderson2a412722008-06-20 01:15:47 +0000703 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000704
Owen Anderson5b299672007-08-07 23:12:31 +0000705 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
706 PhiMapType phiMap;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000707
708
Owen Anderson85c40642007-07-24 17:55:58 +0000709 // This transformation requires dominator postdominator info
710 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson85c40642007-07-24 17:55:58 +0000711 AU.addRequired<DominatorTree>();
712 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000713 AU.addRequired<AliasAnalysis>();
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000714
Owen Andersonaef6a922008-06-23 17:49:45 +0000715 AU.addPreserved<DominatorTree>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000716 AU.addPreserved<AliasAnalysis>();
Owen Anderson85c40642007-07-24 17:55:58 +0000717 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000718
Owen Anderson85c40642007-07-24 17:55:58 +0000719 // Helper fuctions
720 // FIXME: eliminate or document these better
Owen Anderson85c40642007-07-24 17:55:58 +0000721 bool processLoad(LoadInst* L,
Chris Lattner7de20452008-03-21 22:01:16 +0000722 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson85c40642007-07-24 17:55:58 +0000723 bool processInstruction(Instruction* I,
Chris Lattner7de20452008-03-21 22:01:16 +0000724 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000725 bool processNonLocalLoad(LoadInst* L,
Chris Lattner7de20452008-03-21 22:01:16 +0000726 SmallVectorImpl<Instruction*> &toErase);
Owen Andersona03e7862008-12-15 02:03:00 +0000727 bool processBlock(BasicBlock* BB);
Owen Anderson5e5e5612008-12-14 19:10:35 +0000728 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Andersonc6a31b92007-08-02 17:56:05 +0000729 DenseMap<BasicBlock*, Value*> &Phis,
730 bool top_level = false);
Owen Andersone6b4ff82008-06-18 21:41:49 +0000731 void dump(DenseMap<uint32_t, Value*>& d);
Owen Andersonbe168b32007-08-14 18:04:11 +0000732 bool iterateOnFunction(Function &F);
Owen Andersone02ad522007-08-16 22:51:56 +0000733 Value* CollapsePhi(PHINode* p);
Owen Andersone6b4ff82008-06-18 21:41:49 +0000734 bool performPRE(Function& F);
Owen Anderson2a412722008-06-20 01:15:47 +0000735 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Andersona03e7862008-12-15 02:03:00 +0000736 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopes274474b2008-10-10 16:25:50 +0000737 void cleanupGlobalSets();
Bill Wendling2a023742008-12-22 21:36:08 +0000738 void verifyRemoved(const Instruction *I) const;
Owen Anderson85c40642007-07-24 17:55:58 +0000739 };
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000740
Owen Anderson85c40642007-07-24 17:55:58 +0000741 char GVN::ID = 0;
Owen Anderson85c40642007-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 Andersone6b4ff82008-06-18 21:41:49 +0000750void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5d72a422007-07-25 19:57:03 +0000751 printf("{\n");
Owen Andersone6b4ff82008-06-18 21:41:49 +0000752 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5d72a422007-07-25 19:57:03 +0000753 E = d.end(); I != E; ++I) {
Owen Andersone6b4ff82008-06-18 21:41:49 +0000754 printf("%d\n", I->first);
Owen Anderson5d72a422007-07-25 19:57:03 +0000755 I->second->dump();
756 }
757 printf("}\n");
758}
759
Owen Andersond68b1af2009-08-26 22:55:11 +0000760static bool isSafeReplacement(PHINode* p, Instruction* inst) {
761 if (!isa<PHINode>(inst))
762 return true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000763
Owen Andersond68b1af2009-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 Dunbar3be44e62009-09-20 02:20:51 +0000769
Owen Andersond68b1af2009-08-26 22:55:11 +0000770 return true;
771}
772
Owen Andersone02ad522007-08-16 22:51:56 +0000773Value* GVN::CollapsePhi(PHINode* p) {
Dan Gohman798e5412009-09-03 15:34:35 +0000774 Value* constVal = p->hasConstantValue(DT);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000775 if (!constVal) return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000776
Chris Lattner3d7103e2008-03-21 21:14:38 +0000777 Instruction* inst = dyn_cast<Instruction>(constVal);
778 if (!inst)
779 return constVal;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000780
Chris Lattner02ca4422008-12-01 00:40:32 +0000781 if (DT->dominates(inst, p))
Chris Lattner3d7103e2008-03-21 21:14:38 +0000782 if (isSafeReplacement(p, inst))
783 return inst;
Owen Andersone02ad522007-08-16 22:51:56 +0000784 return 0;
785}
Owen Anderson5d72a422007-07-25 19:57:03 +0000786
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000787/// GetValueForBlock - Get the value to use within the specified basic block.
788/// available values are in Phis.
Owen Anderson5e5e5612008-12-14 19:10:35 +0000789Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner3d7103e2008-03-21 21:14:38 +0000790 DenseMap<BasicBlock*, Value*> &Phis,
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000791 bool top_level) {
792
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000793 // If we have already computed this value, return the previously computed val.
Owen Andersoned7f9932007-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 Dunbar3be44e62009-09-20 02:20:51 +0000796
Owen Andersonc3714b22008-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 Lattner02ca4422008-12-01 00:40:32 +0000799 if (!DT->isReachableFromEntry(BB))
Owen Andersonb99ecca2009-07-30 23:03:37 +0000800 return Phis[BB] = UndefValue::get(orig->getType());
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000801
Chris Lattner4bab29b2008-12-09 19:21:47 +0000802 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
803 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Andersoned7f9932007-08-03 19:59:35 +0000804 Phis[BB] = ret;
805 return ret;
Owen Anderson30463f12007-08-03 11:03:26 +0000806 }
Chris Lattner4bab29b2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000816
Owen Andersonacfa3ad2007-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 Greifd6da1d02008-04-06 20:25:17 +0000819 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
820 BB->begin());
Chris Lattner4bab29b2008-12-09 19:21:47 +0000821 PN->reserveOperandSpace(NumPreds);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000822
Chris Lattner4bab29b2008-12-09 19:21:47 +0000823 Phis.insert(std::make_pair(BB, PN));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000824
Owen Andersonacfa3ad2007-07-26 18:26:51 +0000825 // Fill in the incoming values for the block.
Owen Anderson9f577412007-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 Anderson9f577412007-07-31 17:43:14 +0000828 PN->addIncoming(val, *PI);
829 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000830
Chris Lattner02ca4422008-12-01 00:40:32 +0000831 VN.getAliasAnalysis()->copyValue(orig, PN);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000832
Owen Andersone0143452007-08-16 22:02:55 +0000833 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersone02ad522007-08-16 22:51:56 +0000834 Value* v = CollapsePhi(PN);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000835 if (!v) {
836 // Cache our phi construction results
Owen Anderson5e5e5612008-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 Dunbar3be44e62009-09-20 02:20:51 +0000841
Chris Lattner3d7103e2008-03-21 21:14:38 +0000842 return PN;
Owen Anderson9f577412007-07-31 17:43:14 +0000843 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000844
Chris Lattner3d7103e2008-03-21 21:14:38 +0000845 PN->replaceAllUsesWith(v);
Chris Lattnerf81b0142008-12-09 22:06:23 +0000846 if (isa<PointerType>(v->getType()))
847 MD->invalidateCachedPointerInfo(v);
Chris Lattner3d7103e2008-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 Gohman7e124382009-07-31 20:24:18 +0000854 DEBUG(errs() << "GVN removed: " << *PN << '\n');
Chris Lattner02ca4422008-12-01 00:40:32 +0000855 MD->removeInstruction(PN);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000856 PN->eraseFromParent();
Bill Wendling2a023742008-12-22 21:36:08 +0000857 DEBUG(verifyRemoved(PN));
Chris Lattner3d7103e2008-03-21 21:14:38 +0000858
859 Phis[BB] = v;
860 return v;
Owen Anderson5d72a422007-07-25 19:57:03 +0000861}
862
Chris Lattnerdcded152008-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 Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000873static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner159b98f2008-12-05 07:49:08 +0000874 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +0000877 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
Chris Lattner159b98f2008-12-05 07:49:08 +0000878 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerdcded152008-12-02 08:16:11 +0000879
880 // If the entry already existed for this block, return the precomputed value.
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000888
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +0000891
Chris Lattnerdcded152008-12-02 08:16:11 +0000892 // If this block has no predecessors, it isn't live-in here.
893 if (PI == PE)
Chris Lattner159b98f2008-12-05 07:49:08 +0000894 goto SpeculationFailure;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000895
Chris Lattnerdcded152008-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 Lattner159b98f2008-12-05 07:49:08 +0000901 goto SpeculationFailure;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000902
Chris Lattnerdcded152008-12-02 08:16:11 +0000903 return true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000904
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000910
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000922
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000932
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000936
Chris Lattner159b98f2008-12-05 07:49:08 +0000937 return false;
Chris Lattnerdcded152008-12-02 08:16:11 +0000938}
939
Owen Andersone0143452007-08-16 22:02:55 +0000940/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
941/// non-local by performing PHI construction.
Chris Lattnerdcded152008-12-02 08:16:11 +0000942bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner7de20452008-03-21 22:01:16 +0000943 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerdcded152008-12-02 08:16:11 +0000944 // Find the non-local dependencies of the load.
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000945 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
Chris Lattneraf713862008-12-09 19:25:07 +0000946 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
947 Deps);
Dan Gohman7e124382009-07-31 20:24:18 +0000948 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: "
949 // << Deps.size() << *LI << '\n');
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000950
Owen Anderson90e717d2008-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 Lattneraf713862008-12-09 19:25:07 +0000954 if (Deps.size() > 100)
Owen Anderson90e717d2008-08-26 22:07:42 +0000955 return false;
Chris Lattner8d1686f2008-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.
Edwin Török3ffffac2009-06-17 18:48:18 +0000959 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
960 DEBUG(
Dan Gohman0be10b02009-07-25 01:43:01 +0000961 errs() << "GVN: non-local load ";
962 WriteAsOperand(errs(), LI);
Dan Gohman7e124382009-07-31 20:24:18 +0000963 errs() << " is clobbered by " << *Deps[0].second.getInst() << '\n';
Edwin Török3ffffac2009-06-17 18:48:18 +0000964 );
Chris Lattner8d1686f2008-12-18 00:51:32 +0000965 return false;
Edwin Török3ffffac2009-06-17 18:48:18 +0000966 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000967
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +0000974
Chris Lattneraf713862008-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 Dunbar3be44e62009-09-20 02:20:51 +0000978
Chris Lattner4531da82008-12-05 21:04:20 +0000979 if (DepInfo.isClobber()) {
980 UnavailableBlocks.push_back(DepBB);
981 continue;
982 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000983
Chris Lattner4531da82008-12-05 21:04:20 +0000984 Instruction *DepInst = DepInfo.getInst();
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000985
Chris Lattner4531da82008-12-05 21:04:20 +0000986 // Loading the allocation -> undef.
Victor Hernandez48c3c542009-09-18 22:35:49 +0000987 if (isa<AllocationInst>(DepInst) || isMalloc(DepInst)) {
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000988 ValuesPerBlock.push_back(std::make_pair(DepBB,
Owen Andersonb99ecca2009-07-30 23:03:37 +0000989 UndefValue::get(LI->getType())));
Chris Lattner46876282008-12-01 01:15:42 +0000990 continue;
991 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000992
Chris Lattneraf713862008-12-09 19:25:07 +0000993 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000994 // Reject loads and stores that are to the same address but are of
Chris Lattnera207fe52008-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 Lattnerdcded152008-12-02 08:16:11 +0000999 if (S->getOperand(0)->getType() != LI->getType()) {
1000 UnavailableBlocks.push_back(DepBB);
1001 continue;
1002 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001003
Chris Lattnerdcded152008-12-02 08:16:11 +00001004 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001005
Chris Lattneraf713862008-12-09 19:25:07 +00001006 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerdcded152008-12-02 08:16:11 +00001007 if (LD->getType() != LI->getType()) {
1008 UnavailableBlocks.push_back(DepBB);
1009 continue;
1010 }
Chris Lattnerdcded152008-12-02 08:16:11 +00001011 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5d72a422007-07-25 19:57:03 +00001012 } else {
Chris Lattnerdcded152008-12-02 08:16:11 +00001013 UnavailableBlocks.push_back(DepBB);
1014 continue;
Owen Anderson5d72a422007-07-25 19:57:03 +00001015 }
Chris Lattner3d7103e2008-03-21 21:14:38 +00001016 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001017
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001021
Chris Lattnerdcded152008-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 Lattneraf713862008-12-09 19:25:07 +00001028 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattnerdcded152008-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 Gohman7e124382009-07-31 20:24:18 +00001032 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD #1: " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001033 LI->replaceAllUsesWith(*I);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001034 if (isa<PointerType>((*I)->getType()))
1035 MD->invalidateCachedPointerInfo(*I);
Chris Lattnerdcded152008-12-02 08:16:11 +00001036 toErase.push_back(LI);
1037 NumGVNLoad++;
1038 return true;
1039 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001040
Chris Lattnerdcded152008-12-02 08:16:11 +00001041 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Anderson5b299672007-08-07 23:12:31 +00001042 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001043
Dan Gohman7e124382009-07-31 20:24:18 +00001044 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001045
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001051
Chris Lattner0cb92f82009-02-12 07:00:35 +00001052 if (isa<PHINode>(v))
Chris Lattnerfcbc3032008-12-15 03:46:38 +00001053 v->takeName(LI);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001054 if (isa<PointerType>(v->getType()))
1055 MD->invalidateCachedPointerInfo(v);
Chris Lattnerdcded152008-12-02 08:16:11 +00001056 toErase.push_back(LI);
1057 NumGVNLoad++;
1058 return true;
1059 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001060
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001071
Owen Andersondd37b182009-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 Lattnerdcded152008-12-02 08:16:11 +00001078 BasicBlock *LoadBB = LI->getParent();
Owen Andersondd37b182009-05-31 09:03:40 +00001079 BasicBlock *TmpBB = LoadBB;
1080
1081 bool isSinglePred = false;
Dale Johannesena19b67f2009-06-17 20:48:23 +00001082 bool allSingleSucc = true;
Owen Andersondd37b182009-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 Johannesena19b67f2009-06-17 20:48:23 +00001092 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1093 allSingleSucc = false;
Owen Andersondd37b182009-05-31 09:03:40 +00001094 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001095
Owen Andersondd37b182009-05-31 09:03:40 +00001096 assert(TmpBB);
1097 LoadBB = TmpBB;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001098
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001106
Owen Andersondd37b182009-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 Dunbar3be44e62009-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 Andersondd37b182009-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 Lattnerdcded152008-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 Lattner159b98f2008-12-05 07:49:08 +00001131 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001141
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001147
Chris Lattnerdcded152008-12-02 08:16:11 +00001148 assert(UnavailablePred != 0 &&
1149 "Fully available value should be eliminated above!");
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001150
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001154
Chris Lattnerdcded152008-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 Dunbar005975c2009-07-25 00:23:56 +00001159 DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
Dan Gohman7e124382009-07-31 20:24:18 +00001160 << *LPInst << '\n' << *LI << "\n");
Chris Lattnerdcded152008-12-02 08:16:11 +00001161 return false;
1162 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001163
Chris Lattnerdcded152008-12-02 08:16:11 +00001164 // We don't currently handle critical edges :(
1165 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbar005975c2009-07-25 00:23:56 +00001166 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
Dan Gohman7e124382009-07-31 20:24:18 +00001167 << UnavailablePred->getName() << "': " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001168 return false;
Owen Anderson5b299672007-08-07 23:12:31 +00001169 }
Dale Johannesena19b67f2009-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 Lattnerdcded152008-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 Gohman7e124382009-07-31 20:24:18 +00001187 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001188
Chris Lattnerdcded152008-12-02 08:16:11 +00001189 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1190 LI->getAlignment(),
1191 UnavailablePred->getTerminator());
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001192
Owen Anderson1c057ee2009-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 Dunbar3be44e62009-09-20 02:20:51 +00001197
Chris Lattnerdcded152008-12-02 08:16:11 +00001198 DenseMap<BasicBlock*, Value*> BlockReplValues;
1199 BlockReplValues.insert(ValuesPerBlock.begin(), ValuesPerBlock.end());
1200 BlockReplValues[UnavailablePred] = NewLoad;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001201
Chris Lattnerdcded152008-12-02 08:16:11 +00001202 // Perform PHI construction.
1203 Value* v = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1204 LI->replaceAllUsesWith(v);
Chris Lattner0cb92f82009-02-12 07:00:35 +00001205 if (isa<PHINode>(v))
Chris Lattnerfcbc3032008-12-15 03:46:38 +00001206 v->takeName(LI);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001207 if (isa<PointerType>(v->getType()))
1208 MD->invalidateCachedPointerInfo(v);
Chris Lattnerdcded152008-12-02 08:16:11 +00001209 toErase.push_back(LI);
1210 NumPRELoad++;
Owen Anderson5d72a422007-07-25 19:57:03 +00001211 return true;
1212}
1213
Chris Lattner7741aa52009-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
1216/// the stored value. If we can't do it, return null.
1217static Value *CoerceAvailableValueToLoadType(Value *StoredVal, LoadInst *L,
1218 const TargetData &TD) {
1219 const Type *StoredValTy = StoredVal->getType();
1220 const Type *LoadedTy = L->getType();
1221
1222 uint64_t StoreSize = TD.getTypeSizeInBits(StoredValTy);
1223 uint64_t LoadSize = TD.getTypeSizeInBits(LoadedTy);
1224
1225 // If the store and reload are the same size, we can always reuse it.
1226 if (StoreSize == LoadSize) {
1227 if (isa<PointerType>(StoredValTy) && isa<PointerType>(LoadedTy)) {
1228 // Pointer to Pointer -> use bitcast.
1229 return new BitCastInst(StoredVal, LoadedTy, "", L);
1230 }
1231
1232 // Convert source pointers to integers, which can be bitcast.
1233 if (isa<PointerType>(StoredValTy)) {
1234 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
1235 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", L);
1236 }
1237
1238 const Type *TypeToCastTo = LoadedTy;
1239 if (isa<PointerType>(TypeToCastTo))
1240 TypeToCastTo = TD.getIntPtrType(StoredValTy->getContext());
1241
1242 if (StoredValTy != TypeToCastTo)
1243 StoredVal = new BitCastInst(StoredVal, TypeToCastTo, "", L);
1244
1245 // Cast to pointer if the load needs a pointer type.
1246 if (isa<PointerType>(LoadedTy))
1247 StoredVal = new IntToPtrInst(StoredVal, LoadedTy, "", L);
1248
1249 return StoredVal;
1250 }
1251
1252 // If the loaded value is smaller than the available value, then we can
1253 // extract out a piece from it. If the available value is too small, then we
1254 // can't do anything.
1255 if (StoreSize < LoadSize)
1256 return 0;
1257
1258 // Convert source pointers to integers, which can be manipulated.
1259 if (isa<PointerType>(StoredValTy)) {
1260 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
1261 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", L);
1262 }
1263
1264 // Convert vectors and fp to integer, which can be manipulated.
1265 if (!isa<IntegerType>(StoredValTy)) {
1266 StoredValTy = IntegerType::get(StoredValTy->getContext(), StoreSize);
1267 StoredVal = new BitCastInst(StoredVal, StoredValTy, "", L);
1268 }
1269
1270 // If this is a big-endian system, we need to shift the value down to the low
1271 // bits so that a truncate will work.
1272 if (TD.isBigEndian()) {
1273 Constant *Val = ConstantInt::get(StoredVal->getType(), StoreSize-LoadSize);
1274 StoredVal = BinaryOperator::CreateLShr(StoredVal, Val, "tmp", L);
1275 }
1276
1277 // Truncate the integer to the right size now.
1278 const Type *NewIntTy = IntegerType::get(StoredValTy->getContext(), LoadSize);
1279 StoredVal = new TruncInst(StoredVal, NewIntTy, "trunc", L);
1280
1281 if (LoadedTy == NewIntTy)
1282 return StoredVal;
1283
1284 // If the result is a pointer, inttoptr.
1285 if (isa<PointerType>(LoadedTy))
1286 return new IntToPtrInst(StoredVal, LoadedTy, "inttoptr", L);
1287
1288 // Otherwise, bitcast.
1289 return new BitCastInst(StoredVal, LoadedTy, "bitcast", L);
1290}
1291
1292
Owen Andersone0143452007-08-16 22:02:55 +00001293/// processLoad - Attempt to eliminate a load, first by eliminating it
1294/// locally, and then attempting non-local elimination if that fails.
Chris Lattner4531da82008-12-05 21:04:20 +00001295bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1296 if (L->isVolatile())
Owen Anderson85c40642007-07-24 17:55:58 +00001297 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001298
Owen Anderson85c40642007-07-24 17:55:58 +00001299 // ... to a pointer that has been loaded from before...
Chris Lattner02ca4422008-12-01 00:40:32 +00001300 MemDepResult dep = MD->getDependency(L);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001301
Chris Lattner4531da82008-12-05 21:04:20 +00001302 // If the value isn't available, don't do anything!
Edwin Török47cf8842009-05-29 09:46:03 +00001303 if (dep.isClobber()) {
Chris Lattner7741aa52009-09-20 19:03:47 +00001304 // FIXME: In the future, we should handle things like:
1305 // store i32 123, i32* %P
1306 // %A = bitcast i32* %P to i8*
1307 // %B = gep i8* %A, i32 1
1308 // %C = load i8* %B
1309 //
1310 // We could do that by recognizing if the clobber instructions are obviously
1311 // a common base + constant offset, and if the previous store (or memset)
1312 // completely covers this load. This sort of thing can happen in bitfield
1313 // access code.
Edwin Török47cf8842009-05-29 09:46:03 +00001314 DEBUG(
1315 // fast print dep, using operator<< on instruction would be too slow
Dan Gohman0be10b02009-07-25 01:43:01 +00001316 errs() << "GVN: load ";
1317 WriteAsOperand(errs(), L);
Edwin Török47cf8842009-05-29 09:46:03 +00001318 Instruction *I = dep.getInst();
Dan Gohman7e124382009-07-31 20:24:18 +00001319 errs() << " is clobbered by " << *I << '\n';
Edwin Török47cf8842009-05-29 09:46:03 +00001320 );
Chris Lattner4531da82008-12-05 21:04:20 +00001321 return false;
Edwin Török47cf8842009-05-29 09:46:03 +00001322 }
Chris Lattner4531da82008-12-05 21:04:20 +00001323
1324 // If it is defined in another block, try harder.
Chris Lattner4bab29b2008-12-09 19:21:47 +00001325 if (dep.isNonLocal())
Chris Lattner4531da82008-12-05 21:04:20 +00001326 return processNonLocalLoad(L, toErase);
Eli Friedman350307f2008-02-12 12:08:14 +00001327
Chris Lattner4531da82008-12-05 21:04:20 +00001328 Instruction *DepInst = dep.getInst();
1329 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner7741aa52009-09-20 19:03:47 +00001330 Value *StoredVal = DepSI->getOperand(0);
1331
1332 // The store and load are to a must-aliased pointer, but they may not
1333 // actually have the same type. See if we know how to reuse the stored
1334 // value (depending on its type).
1335 const TargetData *TD = 0;
1336 if (StoredVal->getType() != L->getType() &&
1337 (TD = getAnalysisIfAvailable<TargetData>())) {
1338 StoredVal = CoerceAvailableValueToLoadType(StoredVal, L, *TD);
1339 if (StoredVal == 0)
1340 return false;
1341
1342 DEBUG(errs() << "GVN COERCED STORE:\n" << *DepSI << '\n' << *StoredVal
1343 << '\n' << *L << "\n\n\n");
1344 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001345
Chris Lattner4531da82008-12-05 21:04:20 +00001346 // Remove it!
Chris Lattner7741aa52009-09-20 19:03:47 +00001347 L->replaceAllUsesWith(StoredVal);
1348 if (isa<PointerType>(StoredVal->getType()))
1349 MD->invalidateCachedPointerInfo(StoredVal);
Chris Lattner4531da82008-12-05 21:04:20 +00001350 toErase.push_back(L);
1351 NumGVNLoad++;
1352 return true;
1353 }
1354
1355 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner7741aa52009-09-20 19:03:47 +00001356 Value *AvailableVal = DepLI;
1357
1358 // The loads are of a must-aliased pointer, but they may not actually have
1359 // the same type. See if we know how to reuse the previously loaded value
1360 // (depending on its type).
1361 const TargetData *TD = 0;
1362 if (DepLI->getType() != L->getType() &&
1363 (TD = getAnalysisIfAvailable<TargetData>())) {
1364 AvailableVal = CoerceAvailableValueToLoadType(DepLI, L, *TD);
1365 if (AvailableVal == 0)
1366 return false;
1367
1368 DEBUG(errs() << "GVN COERCED LOAD:\n" << *DepLI << "\n" << *AvailableVal
1369 << "\n" << *L << "\n\n\n");
1370 }
1371
Chris Lattner4531da82008-12-05 21:04:20 +00001372 // Remove it!
Chris Lattner7741aa52009-09-20 19:03:47 +00001373 L->replaceAllUsesWith(AvailableVal);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001374 if (isa<PointerType>(DepLI->getType()))
1375 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner4531da82008-12-05 21:04:20 +00001376 toErase.push_back(L);
1377 NumGVNLoad++;
1378 return true;
1379 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001380
Chris Lattner7741aa52009-09-20 19:03:47 +00001381 // FIXME: We should handle memset/memcpy/memmove as dependent instructions to
1382 // forward the value if available.
1383
1384
Chris Lattner8ea60462008-11-30 01:39:32 +00001385 // If this load really doesn't depend on anything, then we must be loading an
1386 // undef value. This can happen when loading for a fresh allocation with no
1387 // intervening stores, for example.
Victor Hernandez48c3c542009-09-18 22:35:49 +00001388 if (isa<AllocationInst>(DepInst) || isMalloc(DepInst)) {
Owen Andersonb99ecca2009-07-30 23:03:37 +00001389 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Chris Lattner8ea60462008-11-30 01:39:32 +00001390 toErase.push_back(L);
Chris Lattner8ea60462008-11-30 01:39:32 +00001391 NumGVNLoad++;
Chris Lattner4531da82008-12-05 21:04:20 +00001392 return true;
Eli Friedman350307f2008-02-12 12:08:14 +00001393 }
1394
Chris Lattner4531da82008-12-05 21:04:20 +00001395 return false;
Owen Anderson85c40642007-07-24 17:55:58 +00001396}
1397
Owen Anderson2a412722008-06-20 01:15:47 +00001398Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Andersonaef6a922008-06-23 17:49:45 +00001399 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1400 if (I == localAvail.end())
1401 return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001402
Owen Andersonaef6a922008-06-23 17:49:45 +00001403 ValueNumberScope* locals = I->second;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001404
Owen Anderson2a412722008-06-20 01:15:47 +00001405 while (locals) {
1406 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1407 if (I != locals->table.end())
1408 return I->second;
1409 else
1410 locals = locals->parent;
1411 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001412
Owen Anderson2a412722008-06-20 01:15:47 +00001413 return 0;
1414}
1415
Owen Andersona03e7862008-12-15 02:03:00 +00001416/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001417/// by inheritance from the dominator fails, see if we can perform phi
Owen Andersona03e7862008-12-15 02:03:00 +00001418/// construction to eliminate the redundancy.
1419Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1420 BasicBlock* BaseBlock = orig->getParent();
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001421
Owen Andersona03e7862008-12-15 02:03:00 +00001422 SmallPtrSet<BasicBlock*, 4> Visited;
1423 SmallVector<BasicBlock*, 8> Stack;
1424 Stack.push_back(BaseBlock);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001425
Owen Andersona03e7862008-12-15 02:03:00 +00001426 DenseMap<BasicBlock*, Value*> Results;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001427
Owen Andersona03e7862008-12-15 02:03:00 +00001428 // Walk backwards through our predecessors, looking for instances of the
1429 // value number we're looking for. Instances are recorded in the Results
1430 // map, which is then used to perform phi construction.
1431 while (!Stack.empty()) {
1432 BasicBlock* Current = Stack.back();
1433 Stack.pop_back();
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001434
Owen Andersona03e7862008-12-15 02:03:00 +00001435 // If we've walked all the way to a proper dominator, then give up. Cases
1436 // where the instance is in the dominator will have been caught by the fast
1437 // path, and any cases that require phi construction further than this are
1438 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1439 // time improvement.
1440 if (DT->properlyDominates(Current, orig->getParent())) return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001441
Owen Andersona03e7862008-12-15 02:03:00 +00001442 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1443 localAvail.find(Current);
1444 if (LA == localAvail.end()) return 0;
Chris Lattner6f33e552009-01-19 22:00:18 +00001445 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001446
Owen Andersona03e7862008-12-15 02:03:00 +00001447 if (V != LA->second->table.end()) {
1448 // Found an instance, record it.
1449 Results.insert(std::make_pair(Current, V->second));
1450 continue;
1451 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001452
Owen Andersona03e7862008-12-15 02:03:00 +00001453 // If we reach the beginning of the function, then give up.
1454 if (pred_begin(Current) == pred_end(Current))
1455 return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001456
Owen Andersona03e7862008-12-15 02:03:00 +00001457 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1458 PI != PE; ++PI)
1459 if (Visited.insert(*PI))
1460 Stack.push_back(*PI);
1461 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001462
Owen Andersona03e7862008-12-15 02:03:00 +00001463 // If we didn't find instances, give up. Otherwise, perform phi construction.
1464 if (Results.size() == 0)
1465 return 0;
1466 else
1467 return GetValueForBlock(BaseBlock, orig, Results, true);
1468}
1469
Owen Andersonf631bb62007-08-14 18:16:29 +00001470/// processInstruction - When calculating availability, handle an instruction
Owen Anderson85c40642007-07-24 17:55:58 +00001471/// by inserting it into the appropriate sets
Owen Anderson9334fc62008-06-12 19:25:32 +00001472bool GVN::processInstruction(Instruction *I,
Chris Lattner7de20452008-03-21 22:01:16 +00001473 SmallVectorImpl<Instruction*> &toErase) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001474 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner4531da82008-12-05 21:04:20 +00001475 bool changed = processLoad(L, toErase);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001476
Owen Andersone6b4ff82008-06-18 21:41:49 +00001477 if (!changed) {
1478 unsigned num = VN.lookup_or_add(L);
Owen Anderson2a412722008-06-20 01:15:47 +00001479 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Andersone6b4ff82008-06-18 21:41:49 +00001480 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001481
Owen Andersone6b4ff82008-06-18 21:41:49 +00001482 return changed;
1483 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001484
Owen Anderson8a8d13c2008-07-03 17:44:33 +00001485 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Andersone6b4ff82008-06-18 21:41:49 +00001486 unsigned num = VN.lookup_or_add(I);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001487
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001488 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1489 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001490
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001491 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1492 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001493
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001494 Value* branchCond = BI->getCondition();
1495 uint32_t condVN = VN.lookup_or_add(branchCond);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001496
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001497 BasicBlock* trueSucc = BI->getSuccessor(0);
1498 BasicBlock* falseSucc = BI->getSuccessor(1);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001499
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001500 if (trueSucc->getSinglePredecessor())
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001501 localAvail[trueSucc]->table[condVN] =
Owen Anderson4f720fa2009-07-31 17:39:07 +00001502 ConstantInt::getTrue(trueSucc->getContext());
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001503 if (falseSucc->getSinglePredecessor())
Owen Anderson4f720fa2009-07-31 17:39:07 +00001504 localAvail[falseSucc]->table[condVN] =
1505 ConstantInt::getFalse(trueSucc->getContext());
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001506
1507 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001508
Owen Andersonced50f82008-04-07 09:59:07 +00001509 // Allocations are always uniquely numbered, so we can save time and memory
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001510 // by fast failing them.
Victor Hernandez48c3c542009-09-18 22:35:49 +00001511 } else if (isa<AllocationInst>(I) || isMalloc(I) || isa<TerminatorInst>(I)) {
Owen Anderson2a412722008-06-20 01:15:47 +00001512 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonced50f82008-04-07 09:59:07 +00001513 return false;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001514 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001515
Owen Andersone0143452007-08-16 22:02:55 +00001516 // Collapse PHI nodes
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001517 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersone02ad522007-08-16 22:51:56 +00001518 Value* constVal = CollapsePhi(p);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001519
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001520 if (constVal) {
Owen Andersone02ad522007-08-16 22:51:56 +00001521 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1522 PI != PE; ++PI)
Chris Lattner4bab29b2008-12-09 19:21:47 +00001523 PI->second.erase(p);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001524
Owen Andersone02ad522007-08-16 22:51:56 +00001525 p->replaceAllUsesWith(constVal);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001526 if (isa<PointerType>(constVal->getType()))
1527 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson575f2812008-12-23 00:49:51 +00001528 VN.erase(p);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001529
Owen Andersone02ad522007-08-16 22:51:56 +00001530 toErase.push_back(p);
Owen Andersone6b4ff82008-06-18 21:41:49 +00001531 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001532 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001533 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001534
Owen Anderson8a8d13c2008-07-03 17:44:33 +00001535 // If the number we were assigned was a brand new VN, then we don't
1536 // need to do a lookup to see if the number already exists
1537 // somewhere in the domtree: it can't!
1538 } else if (num == nextNum) {
1539 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001540
Owen Andersona03e7862008-12-15 02:03:00 +00001541 // Perform fast-path value-number based elimination of values inherited from
1542 // dominators.
Owen Anderson2a412722008-06-20 01:15:47 +00001543 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Andersonc772be72007-12-08 01:37:09 +00001544 // Remove it!
Owen Anderson5aff8002007-07-31 23:27:13 +00001545 VN.erase(I);
Owen Anderson85c40642007-07-24 17:55:58 +00001546 I->replaceAllUsesWith(repl);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001547 if (isa<PointerType>(repl->getType()))
1548 MD->invalidateCachedPointerInfo(repl);
Owen Anderson85c40642007-07-24 17:55:58 +00001549 toErase.push_back(I);
1550 return true;
Owen Andersona03e7862008-12-15 02:03:00 +00001551
1552#if 0
1553 // Perform slow-pathvalue-number based elimination with phi construction.
1554 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1555 // Remove it!
1556 VN.erase(I);
1557 I->replaceAllUsesWith(repl);
1558 if (isa<PointerType>(repl->getType()))
1559 MD->invalidateCachedPointerInfo(repl);
1560 toErase.push_back(I);
1561 return true;
1562#endif
Owen Anderson8a8d13c2008-07-03 17:44:33 +00001563 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001564 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson85c40642007-07-24 17:55:58 +00001565 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001566
Owen Anderson85c40642007-07-24 17:55:58 +00001567 return false;
1568}
1569
Bill Wendling42f17f62008-12-22 22:32:22 +00001570/// runOnFunction - This is the main transformation entry point for a function.
Owen Andersonbe168b32007-08-14 18:04:11 +00001571bool GVN::runOnFunction(Function& F) {
Chris Lattner02ca4422008-12-01 00:40:32 +00001572 MD = &getAnalysis<MemoryDependenceAnalysis>();
1573 DT = &getAnalysis<DominatorTree>();
Owen Andersonbcf2bd52008-05-12 20:15:55 +00001574 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner02ca4422008-12-01 00:40:32 +00001575 VN.setMemDep(MD);
1576 VN.setDomTree(DT);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001577
Owen Andersonbe168b32007-08-14 18:04:11 +00001578 bool changed = false;
1579 bool shouldContinue = true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001580
Owen Anderson26ed2572008-07-16 17:52:31 +00001581 // Merge unconditional branches, allowing PRE to catch more
1582 // optimization opportunities.
1583 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1584 BasicBlock* BB = FI;
1585 ++FI;
Owen Andersonf59eef82008-07-17 00:01:40 +00001586 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1587 if (removedBlock) NumGVNBlocks++;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001588
Owen Andersonf59eef82008-07-17 00:01:40 +00001589 changed |= removedBlock;
Owen Anderson26ed2572008-07-16 17:52:31 +00001590 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001591
Chris Lattner4bab29b2008-12-09 19:21:47 +00001592 unsigned Iteration = 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001593
Owen Andersonbe168b32007-08-14 18:04:11 +00001594 while (shouldContinue) {
Dan Gohman0be10b02009-07-25 01:43:01 +00001595 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Owen Andersonbe168b32007-08-14 18:04:11 +00001596 shouldContinue = iterateOnFunction(F);
1597 changed |= shouldContinue;
Chris Lattner4bab29b2008-12-09 19:21:47 +00001598 ++Iteration;
Owen Andersonbe168b32007-08-14 18:04:11 +00001599 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001600
Owen Anderson916f4732008-07-18 18:03:38 +00001601 if (EnablePRE) {
Owen Anderson9c935902008-09-03 23:06:07 +00001602 bool PREChanged = true;
1603 while (PREChanged) {
1604 PREChanged = performPRE(F);
Owen Anderson916f4732008-07-18 18:03:38 +00001605 changed |= PREChanged;
Owen Anderson9c935902008-09-03 23:06:07 +00001606 }
Owen Anderson916f4732008-07-18 18:03:38 +00001607 }
Chris Lattner4bab29b2008-12-09 19:21:47 +00001608 // FIXME: Should perform GVN again after PRE does something. PRE can move
1609 // computations into blocks where they become fully redundant. Note that
1610 // we can't do this until PRE's critical edge splitting updates memdep.
1611 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopes274474b2008-10-10 16:25:50 +00001612
1613 cleanupGlobalSets();
1614
Owen Andersonbe168b32007-08-14 18:04:11 +00001615 return changed;
1616}
1617
1618
Owen Andersona03e7862008-12-15 02:03:00 +00001619bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner4bab29b2008-12-09 19:21:47 +00001620 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1621 // incrementing BI before processing an instruction).
Owen Anderson9334fc62008-06-12 19:25:32 +00001622 SmallVector<Instruction*, 8> toErase;
Owen Anderson9334fc62008-06-12 19:25:32 +00001623 bool changed_function = false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001624
Owen Anderson9334fc62008-06-12 19:25:32 +00001625 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1626 BI != BE;) {
Chris Lattner4531da82008-12-05 21:04:20 +00001627 changed_function |= processInstruction(BI, toErase);
Owen Anderson9334fc62008-06-12 19:25:32 +00001628 if (toErase.empty()) {
1629 ++BI;
1630 continue;
1631 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001632
Owen Anderson9334fc62008-06-12 19:25:32 +00001633 // If we need some instructions deleted, do it now.
1634 NumGVNInstr += toErase.size();
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001635
Owen Anderson9334fc62008-06-12 19:25:32 +00001636 // Avoid iterator invalidation.
1637 bool AtStart = BI == BB->begin();
1638 if (!AtStart)
1639 --BI;
1640
1641 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner02ca4422008-12-01 00:40:32 +00001642 E = toErase.end(); I != E; ++I) {
Dan Gohman7e124382009-07-31 20:24:18 +00001643 DEBUG(errs() << "GVN removed: " << **I << '\n');
Chris Lattner02ca4422008-12-01 00:40:32 +00001644 MD->removeInstruction(*I);
Owen Anderson9334fc62008-06-12 19:25:32 +00001645 (*I)->eraseFromParent();
Bill Wendling84049422008-12-22 21:57:30 +00001646 DEBUG(verifyRemoved(*I));
Chris Lattner02ca4422008-12-01 00:40:32 +00001647 }
Chris Lattner4bab29b2008-12-09 19:21:47 +00001648 toErase.clear();
Owen Anderson9334fc62008-06-12 19:25:32 +00001649
1650 if (AtStart)
1651 BI = BB->begin();
1652 else
1653 ++BI;
Owen Anderson9334fc62008-06-12 19:25:32 +00001654 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001655
Owen Anderson9334fc62008-06-12 19:25:32 +00001656 return changed_function;
1657}
1658
Owen Andersone6b4ff82008-06-18 21:41:49 +00001659/// performPRE - Perform a purely local form of PRE that looks for diamond
1660/// control flow patterns and attempts to perform simple PRE at the join point.
1661bool GVN::performPRE(Function& F) {
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001662 bool Changed = false;
Owen Andersonec747c42008-06-19 19:54:19 +00001663 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner3304b562008-12-01 07:29:03 +00001664 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001665 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1666 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1667 BasicBlock* CurrentBlock = *DI;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001668
Owen Andersone6b4ff82008-06-18 21:41:49 +00001669 // Nothing to PRE in the entry block.
1670 if (CurrentBlock == &F.getEntryBlock()) continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001671
Owen Andersone6b4ff82008-06-18 21:41:49 +00001672 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1673 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001674 Instruction *CurInst = BI++;
Duncan Sands2f500832009-05-06 06:49:50 +00001675
Victor Hernandez48c3c542009-09-18 22:35:49 +00001676 if (isa<AllocationInst>(CurInst) || isMalloc(CurInst) ||
1677 isa<TerminatorInst>(CurInst) || isa<PHINode>(CurInst) ||
Owen Anderson35b47072009-08-13 21:58:54 +00001678 (CurInst->getType() == Type::getVoidTy(F.getContext())) ||
Duncan Sands2f500832009-05-06 06:49:50 +00001679 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell6e0aa282009-03-10 15:04:53 +00001680 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001681 continue;
Duncan Sands2f500832009-05-06 06:49:50 +00001682
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001683 uint32_t valno = VN.lookup(CurInst);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001684
Owen Andersone6b4ff82008-06-18 21:41:49 +00001685 // Look for the predecessors for PRE opportunities. We're
1686 // only trying to solve the basic diamond case, where
1687 // a value is computed in the successor and one predecessor,
1688 // but not the other. We also explicitly disallow cases
1689 // where the successor is its own predecessor, because they're
1690 // more complicated to get right.
1691 unsigned numWith = 0;
1692 unsigned numWithout = 0;
1693 BasicBlock* PREPred = 0;
Chris Lattner3304b562008-12-01 07:29:03 +00001694 predMap.clear();
1695
Owen Andersone6b4ff82008-06-18 21:41:49 +00001696 for (pred_iterator PI = pred_begin(CurrentBlock),
1697 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1698 // We're not interested in PRE where the block is its
Owen Anderson2a412722008-06-20 01:15:47 +00001699 // own predecessor, on in blocks with predecessors
1700 // that are not reachable.
1701 if (*PI == CurrentBlock) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001702 numWithout = 2;
Owen Anderson2a412722008-06-20 01:15:47 +00001703 break;
1704 } else if (!localAvail.count(*PI)) {
1705 numWithout = 2;
1706 break;
1707 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001708
1709 DenseMap<uint32_t, Value*>::iterator predV =
Owen Anderson2a412722008-06-20 01:15:47 +00001710 localAvail[*PI]->table.find(valno);
1711 if (predV == localAvail[*PI]->table.end()) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001712 PREPred = *PI;
1713 numWithout++;
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001714 } else if (predV->second == CurInst) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00001715 numWithout = 2;
1716 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00001717 predMap[*PI] = predV->second;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001718 numWith++;
1719 }
1720 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001721
Owen Andersone6b4ff82008-06-18 21:41:49 +00001722 // Don't do PRE when it might increase code size, i.e. when
1723 // we would need to insert instructions in more than one pred.
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001724 if (numWithout != 1 || numWith == 0)
Owen Andersone6b4ff82008-06-18 21:41:49 +00001725 continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001726
Owen Andersonec747c42008-06-19 19:54:19 +00001727 // We can't do PRE safely on a critical edge, so instead we schedule
1728 // the edge to be split and perform the PRE the next time we iterate
1729 // on the function.
1730 unsigned succNum = 0;
1731 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1732 i != e; ++i)
Owen Anderson9c935902008-09-03 23:06:07 +00001733 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonec747c42008-06-19 19:54:19 +00001734 succNum = i;
1735 break;
1736 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001737
Owen Andersonec747c42008-06-19 19:54:19 +00001738 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1739 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Andersonec747c42008-06-19 19:54:19 +00001740 continue;
1741 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001742
Owen Andersone6b4ff82008-06-18 21:41:49 +00001743 // Instantiate the expression the in predecessor that lacked it.
1744 // Because we are going top-down through the block, all value numbers
1745 // will be available in the predecessor by the time we need them. Any
1746 // that weren't original present will have been instantiated earlier
1747 // in this loop.
Owen Anderson175b6542009-07-22 00:24:57 +00001748 Instruction* PREInstr = CurInst->clone(CurInst->getContext());
Owen Andersone6b4ff82008-06-18 21:41:49 +00001749 bool success = true;
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001750 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1751 Value *Op = PREInstr->getOperand(i);
1752 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1753 continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001754
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001755 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1756 PREInstr->setOperand(i, V);
1757 } else {
1758 success = false;
1759 break;
Owen Anderson14c612f2008-07-11 20:05:13 +00001760 }
Owen Andersone6b4ff82008-06-18 21:41:49 +00001761 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001762
Owen Andersone6b4ff82008-06-18 21:41:49 +00001763 // Fail out if we encounter an operand that is not available in
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001764 // the PRE predecessor. This is typically because of loads which
Owen Andersone6b4ff82008-06-18 21:41:49 +00001765 // are not value numbered precisely.
1766 if (!success) {
1767 delete PREInstr;
Bill Wendling3858cae2008-12-22 22:14:07 +00001768 DEBUG(verifyRemoved(PREInstr));
Owen Andersone6b4ff82008-06-18 21:41:49 +00001769 continue;
1770 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001771
Owen Andersone6b4ff82008-06-18 21:41:49 +00001772 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001773 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson2a412722008-06-20 01:15:47 +00001774 predMap[PREPred] = PREInstr;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001775 VN.add(PREInstr, valno);
1776 NumGVNPRE++;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001777
Owen Andersone6b4ff82008-06-18 21:41:49 +00001778 // Update the availability map to include the new instruction.
Owen Anderson2a412722008-06-20 01:15:47 +00001779 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001780
Owen Andersone6b4ff82008-06-18 21:41:49 +00001781 // Create a PHI to make the value available in this block.
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001782 PHINode* Phi = PHINode::Create(CurInst->getType(),
1783 CurInst->getName() + ".pre-phi",
Owen Andersone6b4ff82008-06-18 21:41:49 +00001784 CurrentBlock->begin());
1785 for (pred_iterator PI = pred_begin(CurrentBlock),
1786 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson2a412722008-06-20 01:15:47 +00001787 Phi->addIncoming(predMap[*PI], *PI);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001788
Owen Andersone6b4ff82008-06-18 21:41:49 +00001789 VN.add(Phi, valno);
Owen Anderson2a412722008-06-20 01:15:47 +00001790 localAvail[CurrentBlock]->table[valno] = Phi;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001791
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001792 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001793 if (isa<PointerType>(Phi->getType()))
1794 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001795 VN.erase(CurInst);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001796
Dan Gohman7e124382009-07-31 20:24:18 +00001797 DEBUG(errs() << "GVN PRE removed: " << *CurInst << '\n');
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001798 MD->removeInstruction(CurInst);
1799 CurInst->eraseFromParent();
Bill Wendling84049422008-12-22 21:57:30 +00001800 DEBUG(verifyRemoved(CurInst));
Chris Lattner66a3a3e2008-12-01 07:35:54 +00001801 Changed = true;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001802 }
1803 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001804
Owen Andersonec747c42008-06-19 19:54:19 +00001805 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov2e8710c2008-12-05 19:38:49 +00001806 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonec747c42008-06-19 19:54:19 +00001807 SplitCriticalEdge(I->first, I->second, this);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001808
Anton Korobeynikov2e8710c2008-12-05 19:38:49 +00001809 return Changed || toSplit.size();
Owen Andersone6b4ff82008-06-18 21:41:49 +00001810}
1811
Bill Wendling42f17f62008-12-22 22:32:22 +00001812/// iterateOnFunction - Executes one iteration of GVN
Owen Andersonbe168b32007-08-14 18:04:11 +00001813bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes274474b2008-10-10 16:25:50 +00001814 cleanupGlobalSets();
Chris Lattner98054902008-03-21 21:33:23 +00001815
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001816 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1817 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1818 if (DI->getIDom())
1819 localAvail[DI->getBlock()] =
1820 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1821 else
1822 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1823 }
1824
Owen Anderson85c40642007-07-24 17:55:58 +00001825 // Top-down walk of the dominator tree
Owen Andersone6b4ff82008-06-18 21:41:49 +00001826 bool changed = false;
Owen Andersonef136f52008-12-15 03:52:17 +00001827#if 0
1828 // Needed for value numbering with phi construction to work.
Owen Andersona03e7862008-12-15 02:03:00 +00001829 ReversePostOrderTraversal<Function*> RPOT(&F);
1830 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1831 RE = RPOT.end(); RI != RE; ++RI)
1832 changed |= processBlock(*RI);
Owen Andersonef136f52008-12-15 03:52:17 +00001833#else
1834 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1835 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1836 changed |= processBlock(DI->getBlock());
1837#endif
1838
Owen Anderson26ed2572008-07-16 17:52:31 +00001839 return changed;
Owen Anderson85c40642007-07-24 17:55:58 +00001840}
Nuno Lopes274474b2008-10-10 16:25:50 +00001841
1842void GVN::cleanupGlobalSets() {
1843 VN.clear();
1844 phiMap.clear();
1845
1846 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1847 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1848 delete I->second;
1849 localAvail.clear();
1850}
Bill Wendling2a023742008-12-22 21:36:08 +00001851
1852/// verifyRemoved - Verify that the specified instruction does not occur in our
1853/// internal data structures.
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001854void GVN::verifyRemoved(const Instruction *Inst) const {
1855 VN.verifyRemoved(Inst);
Bill Wendling3858cae2008-12-22 22:14:07 +00001856
1857 // Walk through the PHI map to make sure the instruction isn't hiding in there
1858 // somewhere.
1859 for (PhiMapType::iterator
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001860 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1861 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling3858cae2008-12-22 22:14:07 +00001862
1863 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00001864 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1865 assert(*II != Inst && "Inst is still a value in PHI map!");
1866 }
1867 }
1868
1869 // Walk through the value number scope to make sure the instruction isn't
1870 // ferreted away in it.
1871 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1872 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1873 const ValueNumberScope *VNS = I->second;
1874
1875 while (VNS) {
1876 for (DenseMap<uint32_t, Value*>::iterator
1877 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1878 assert(II->second != Inst && "Inst still in value numbering scope!");
1879 }
1880
1881 VNS = VNS->parent;
Bill Wendling3858cae2008-12-22 22:14:07 +00001882 }
1883 }
Bill Wendling2a023742008-12-22 21:36:08 +00001884}