blob: afa152db49b7ced56f8aed53ff86bed5141ebb8e [file] [log] [blame]
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Andersonab6ec2e2007-07-24 17:55:58 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Owen Andersonab6ec2e2007-07-24 17:55:58 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This pass performs global value numbering to eliminate fully redundant
11// instructions. It also performs simple dead load elimination.
12//
John Criswell073e4d12009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman5afc2742008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Andersonab6ec2e2007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson5e5599b2007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patele8c6d312009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Andersonb5618da2009-07-03 00:17:18 +000025#include "llvm/LLVMContext.h"
Owen Andersondbf23cc2007-07-26 18:26:51 +000026#include "llvm/Value.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000027#include "llvm/ADT/DenseMap.h"
28#include "llvm/ADT/DepthFirstIterator.h"
Owen Andersonbfe133e2008-12-15 02:03:00 +000029#include "llvm/ADT/PostOrderIterator.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000030#include "llvm/ADT/SmallPtrSet.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/ADT/Statistic.h"
Owen Anderson09b83ba2007-10-18 19:39:33 +000033#include "llvm/Analysis/Dominators.h"
34#include "llvm/Analysis/AliasAnalysis.h"
Victor Hernandez5d034492009-09-18 22:35:49 +000035#include "llvm/Analysis/MallocHelper.h"
Owen Andersonab6ec2e2007-07-24 17:55:58 +000036#include "llvm/Analysis/MemoryDependenceAnalysis.h"
37#include "llvm/Support/CFG.h"
Owen Andersone780d662008-06-19 19:57:25 +000038#include "llvm/Support/CommandLine.h"
Chris Lattnerd528b212008-03-29 04:36:18 +000039#include "llvm/Support/Debug.h"
Torok Edwin56d06592009-07-11 20:10:48 +000040#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar0dd5e1e2009-07-25 00:23:56 +000041#include "llvm/Support/raw_ostream.h"
Chris Lattner1dd48c32009-09-20 19:03:47 +000042#include "llvm/Target/TargetData.h"
Owen Andersonfdf9f162008-06-19 19:54:19 +000043#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesen81b64632009-06-17 20:48:23 +000044#include "llvm/Transforms/Utils/Local.h"
Duncan Sands26ff6f92008-10-08 07:23:46 +000045#include <cstdio>
Owen Andersonab6ec2e2007-07-24 17:55:58 +000046using namespace llvm;
47
Bill Wendling3c793442008-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 Anderson53d546e2008-07-15 16:28:06 +000051STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3c793442008-12-22 22:14:07 +000052STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner168be762008-03-22 04:13:49 +000053
Evan Cheng9598f932008-06-20 01:01:07 +000054static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonaddbe3e2008-07-17 19:41:00 +000055 cl::init(true), cl::Hidden);
Dan Gohmana8f8a852009-06-15 18:30:15 +000056static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersone780d662008-06-19 19:57:25 +000057
Owen Andersonab6ec2e2007-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 Lattner2dd09db2009-09-02 06:11:42 +000066 struct Expression {
Dan Gohmana5b96452009-06-04 22:49:04 +000067 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
68 UDIV, SDIV, FDIV, UREM, SREM,
Daniel Dunbar7d6781b2009-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 Andersonab6ec2e2007-07-24 17:55:58 +000074 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
75 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
Daniel Dunbar7d6781b2009-09-20 02:20:51 +000076 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson69057b82008-05-13 08:17:22 +000077 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Anderson45d37012008-06-19 17:25:39 +000078 EMPTY, TOMBSTONE };
Owen Andersonab6ec2e2007-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 Anderson09b83ba2007-10-18 19:39:33 +000086 Value* function;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +000087
Owen Andersonab6ec2e2007-07-24 17:55:58 +000088 Expression() { }
89 Expression(ExpressionOpcode o) : opcode(o) { }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +000090
Owen Andersonab6ec2e2007-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 Anderson09b83ba2007-10-18 19:39:33 +000098 else if (function != other.function)
99 return false;
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000109
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000113
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000114 return true;
115 }
116 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000117
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000118 bool operator!=(const Expression &other) const {
Bill Wendling86f01cb2008-12-22 22:16:31 +0000119 return !(*this == other);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000120 }
121 };
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000122
Chris Lattner2dd09db2009-09-02 06:11:42 +0000123 class ValueTable {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000124 private:
125 DenseMap<Value*, uint32_t> valueNumbering;
126 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersonf7928602008-05-12 20:15:55 +0000127 AliasAnalysis* AA;
128 MemoryDependenceAnalysis* MD;
129 DominatorTree* DT;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000130
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000131 uint32_t nextValueNumber;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000132
Owen Andersonab6ec2e2007-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 Anderson09b83ba2007-10-18 19:39:33 +0000144 Expression create_expression(CallInst* C);
Owen Anderson69057b82008-05-13 08:17:22 +0000145 Expression create_expression(Constant* C);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000146 public:
Dan Gohmanc4971722009-04-01 16:37:47 +0000147 ValueTable() : nextValueNumber(1) { }
Owen Andersonab6ec2e2007-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 Andersonf7928602008-05-12 20:15:55 +0000154 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner8541ede2008-12-01 00:40:32 +0000155 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonf7928602008-05-12 20:15:55 +0000156 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
157 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson3ea90a72008-07-03 17:44:33 +0000158 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling6b18a392008-12-22 21:36:08 +0000159 void verifyRemoved(const Value *) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000160 };
161}
162
163namespace llvm {
Chris Lattner0625bd62007-09-17 18:34:04 +0000164template <> struct DenseMapInfo<Expression> {
Owen Anderson9699a6e2007-08-02 18:16:06 +0000165 static inline Expression getEmptyKey() {
166 return Expression(Expression::EMPTY);
167 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000168
Owen Anderson9699a6e2007-08-02 18:16:06 +0000169 static inline Expression getTombstoneKey() {
170 return Expression(Expression::TOMBSTONE);
171 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000172
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000173 static unsigned getHashValue(const Expression e) {
174 unsigned hash = e.opcode;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000175
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000176 hash = e.firstVN + hash * 37;
177 hash = e.secondVN + hash * 37;
178 hash = e.thirdVN + hash * 37;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000179
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000180 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
181 (unsigned)((uintptr_t)e.type >> 9)) +
182 hash * 37;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000183
Owen Anderson9699a6e2007-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 Andersonab6ec2e2007-07-24 17:55:58 +0000186 hash = *I + hash * 37;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000187
Anton Korobeynikov1bfd1212008-02-20 11:26:25 +0000188 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
189 (unsigned)((uintptr_t)e.function >> 9)) +
190 hash * 37;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000191
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000192 return hash;
193 }
Chris Lattner0625bd62007-09-17 18:34:04 +0000194 static bool isEqual(const Expression &LHS, const Expression &RHS) {
195 return LHS == RHS;
196 }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000197 static bool isPod() { return true; }
198};
199}
200
201//===----------------------------------------------------------------------===//
202// ValueTable Internal Functions
203//===----------------------------------------------------------------------===//
Chris Lattner2876a642008-03-21 21:14:38 +0000204Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000205 switch(BO->getOpcode()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000206 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000207 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner2876a642008-03-21 21:14:38 +0000208 case Instruction::Add: return Expression::ADD;
Dan Gohmana5b96452009-06-04 22:49:04 +0000209 case Instruction::FAdd: return Expression::FADD;
Chris Lattner2876a642008-03-21 21:14:38 +0000210 case Instruction::Sub: return Expression::SUB;
Dan Gohmana5b96452009-06-04 22:49:04 +0000211 case Instruction::FSub: return Expression::FSUB;
Chris Lattner2876a642008-03-21 21:14:38 +0000212 case Instruction::Mul: return Expression::MUL;
Dan Gohmana5b96452009-06-04 22:49:04 +0000213 case Instruction::FMul: return Expression::FMUL;
Chris Lattner2876a642008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000226 }
227}
228
229Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000230 if (isa<ICmpInst>(C)) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000231 switch (C->getPredicate()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000232 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000233 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner2876a642008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000244 }
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000245 } else {
246 switch (C->getPredicate()) {
247 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000248 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewyckya21d3da2009-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 Andersonab6ec2e2007-07-24 17:55:58 +0000264 }
265}
266
Chris Lattner2876a642008-03-21 21:14:38 +0000267Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000268 switch(C->getOpcode()) {
Chris Lattner2876a642008-03-21 21:14:38 +0000269 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinfbcc6632009-07-14 16:55:14 +0000270 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner2876a642008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000283 }
284}
285
Owen Anderson09b83ba2007-10-18 19:39:33 +0000286Expression ValueTable::create_expression(CallInst* C) {
287 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000288
Owen Anderson09b83ba2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000295
Owen Anderson09b83ba2007-10-18 19:39:33 +0000296 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
297 I != E; ++I)
Owen Anderson1e73f292008-04-11 05:11:49 +0000298 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000299
Owen Anderson09b83ba2007-10-18 19:39:33 +0000300 return e;
301}
302
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000303Expression ValueTable::create_expression(BinaryOperator* BO) {
304 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000305
Owen Anderson1e73f292008-04-11 05:11:49 +0000306 e.firstVN = lookup_or_add(BO->getOperand(0));
307 e.secondVN = lookup_or_add(BO->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000308 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000309 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000310 e.type = BO->getType();
311 e.opcode = getOpcode(BO);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000312
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000313 return e;
314}
315
316Expression ValueTable::create_expression(CmpInst* C) {
317 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000318
Owen Anderson1e73f292008-04-11 05:11:49 +0000319 e.firstVN = lookup_or_add(C->getOperand(0));
320 e.secondVN = lookup_or_add(C->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000321 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000322 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000323 e.type = C->getType();
324 e.opcode = getOpcode(C);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000325
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000326 return e;
327}
328
329Expression ValueTable::create_expression(CastInst* C) {
330 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000331
Owen Anderson1e73f292008-04-11 05:11:49 +0000332 e.firstVN = lookup_or_add(C->getOperand(0));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000333 e.secondVN = 0;
334 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000335 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000336 e.type = C->getType();
337 e.opcode = getOpcode(C);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000338
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000339 return e;
340}
341
342Expression ValueTable::create_expression(ShuffleVectorInst* S) {
343 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000344
Owen Anderson1e73f292008-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 Anderson09b83ba2007-10-18 19:39:33 +0000348 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000349 e.type = S->getType();
350 e.opcode = Expression::SHUFFLE;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000351
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000352 return e;
353}
354
355Expression ValueTable::create_expression(ExtractElementInst* E) {
356 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000357
Owen Anderson1e73f292008-04-11 05:11:49 +0000358 e.firstVN = lookup_or_add(E->getOperand(0));
359 e.secondVN = lookup_or_add(E->getOperand(1));
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000360 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000361 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000362 e.type = E->getType();
363 e.opcode = Expression::EXTRACT;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000364
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000365 return e;
366}
367
368Expression ValueTable::create_expression(InsertElementInst* I) {
369 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000370
Owen Anderson1e73f292008-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 Anderson09b83ba2007-10-18 19:39:33 +0000374 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000375 e.type = I->getType();
376 e.opcode = Expression::INSERT;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000377
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000378 return e;
379}
380
381Expression ValueTable::create_expression(SelectInst* I) {
382 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000383
Owen Anderson1e73f292008-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 Anderson09b83ba2007-10-18 19:39:33 +0000387 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000388 e.type = I->getType();
389 e.opcode = Expression::SELECT;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000390
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000391 return e;
392}
393
394Expression ValueTable::create_expression(GetElementPtrInst* G) {
395 Expression e;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000396
Owen Anderson1e73f292008-04-11 05:11:49 +0000397 e.firstVN = lookup_or_add(G->getPointerOperand());
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000398 e.secondVN = 0;
399 e.thirdVN = 0;
Owen Anderson09b83ba2007-10-18 19:39:33 +0000400 e.function = 0;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000401 e.type = G->getType();
402 e.opcode = Expression::GEP;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000403
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000404 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
405 I != E; ++I)
Owen Anderson1e73f292008-04-11 05:11:49 +0000406 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000407
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000408 return e;
409}
410
411//===----------------------------------------------------------------------===//
412// ValueTable External Functions
413//===----------------------------------------------------------------------===//
414
Owen Anderson6a903bc2008-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 Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000426
Owen Anderson09b83ba2007-10-18 19:39:33 +0000427 if (CallInst* C = dyn_cast<CallInst>(V)) {
Owen Anderson1e73f292008-04-11 05:11:49 +0000428 if (AA->doesNotAccessMemory(C)) {
Owen Anderson09b83ba2007-10-18 19:39:33 +0000429 Expression e = create_expression(C);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000430
Owen Anderson09b83ba2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000438
Owen Anderson09b83ba2007-10-18 19:39:33 +0000439 return nextValueNumber++;
440 }
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000441 } else if (AA->onlyReadsMemory(C)) {
442 Expression e = create_expression(C);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000443
Owen Anderson69057b82008-05-13 08:17:22 +0000444 if (expressionNumbering.find(e) == expressionNumbering.end()) {
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000445 expressionNumbering.insert(std::make_pair(e, nextValueNumber));
446 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Anderson69057b82008-05-13 08:17:22 +0000447 return nextValueNumber++;
448 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000449
Chris Lattner7f9c8a02008-11-29 02:29:27 +0000450 MemDepResult local_dep = MD->getDependency(C);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000451
Chris Lattner0e3d6332008-12-05 21:04:20 +0000452 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000453 valueNumbering.insert(std::make_pair(V, nextValueNumber));
454 return nextValueNumber++;
Chris Lattner80c7d812008-11-30 23:39:23 +0000455 }
Chris Lattner0e3d6332008-12-05 21:04:20 +0000456
457 if (local_dep.isDef()) {
458 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000459
Chris Lattner0e3d6332008-12-05 21:04:20 +0000460 if (local_cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson17816b32008-05-13 23:18:30 +0000461 valueNumbering.insert(std::make_pair(V, nextValueNumber));
462 return nextValueNumber++;
463 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000464
Chris Lattner80c7d812008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000473
Chris Lattner80c7d812008-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 Anderson17816b32008-05-13 23:18:30 +0000477 }
Chris Lattner7e61daf2008-12-01 01:15:42 +0000478
Chris Lattner0e3d6332008-12-05 21:04:20 +0000479 // Non-local case.
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000480 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
Chris Lattner254314e2008-12-09 19:38:05 +0000481 MD->getNonLocalCallDependency(CallSite(C));
Chris Lattner0e3d6332008-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 Anderson8c2391d2008-05-13 13:41:23 +0000484 CallInst* cdep = 0;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000485
Chris Lattner80c7d812008-11-30 23:39:23 +0000486 // Check to see if we have a single dominating call instruction that is
487 // identical to C.
Chris Lattner7e61daf2008-12-01 01:15:42 +0000488 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
489 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
Chris Lattner80c7d812008-11-30 23:39:23 +0000490 // Ignore non-local dependencies.
491 if (I->second.isNonLocal())
492 continue;
Owen Anderson69057b82008-05-13 08:17:22 +0000493
Chris Lattner80c7d812008-11-30 23:39:23 +0000494 // We don't handle non-depedencies. If we already have a call, reject
495 // instruction dependencies.
Chris Lattner0e3d6332008-12-05 21:04:20 +0000496 if (I->second.isClobber() || cdep != 0) {
Chris Lattner80c7d812008-11-30 23:39:23 +0000497 cdep = 0;
498 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000499 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000500
Chris Lattner80c7d812008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000507
Chris Lattner80c7d812008-11-30 23:39:23 +0000508 cdep = 0;
509 break;
Owen Anderson69057b82008-05-13 08:17:22 +0000510 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000511
Owen Anderson8c2391d2008-05-13 13:41:23 +0000512 if (!cdep) {
Owen Anderson69057b82008-05-13 08:17:22 +0000513 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000514 return nextValueNumber++;
515 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000516
Chris Lattner0e3d6332008-12-05 21:04:20 +0000517 if (cdep->getNumOperands() != C->getNumOperands()) {
Owen Anderson69057b82008-05-13 08:17:22 +0000518 valueNumbering.insert(std::make_pair(V, nextValueNumber));
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000519 return nextValueNumber++;
Owen Andersonf9ae76d2008-04-17 05:36:50 +0000520 }
Chris Lattner80c7d812008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000529
Chris Lattner80c7d812008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000533
Owen Anderson09b83ba2007-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 Andersonab6ec2e2007-07-24 17:55:58 +0000539 Expression e = create_expression(BO);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000540
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000548
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000553
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000561
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000566
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000574
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000579
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000587
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000592
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000600
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000605
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000613
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000618
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000626
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000631
Owen Andersonab6ec2e2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000639
Owen Andersonab6ec2e2007-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 Lattner2876a642008-03-21 21:14:38 +0000652 assert(VI != valueNumbering.end() && "Value not numbered?");
653 return VI->second;
Owen Andersonab6ec2e2007-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 Anderson10ffa862007-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 Wendling6b18a392008-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 Andersonab6ec2e2007-07-24 17:55:58 +0000677//===----------------------------------------------------------------------===//
Bill Wendling456e8852008-12-22 22:32:22 +0000678// GVN Pass
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000679//===----------------------------------------------------------------------===//
680
681namespace {
Chris Lattner2dd09db2009-09-02 06:11:42 +0000682 struct ValueNumberScope {
Owen Anderson1b3ea962008-06-20 01:15:47 +0000683 ValueNumberScope* parent;
684 DenseMap<uint32_t, Value*> table;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000685
Owen Anderson1b3ea962008-06-20 01:15:47 +0000686 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
687 };
688}
689
690namespace {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000691
Chris Lattner2dd09db2009-09-02 06:11:42 +0000692 class GVN : public FunctionPass {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000693 bool runOnFunction(Function &F);
694 public:
695 static char ID; // Pass identification, replacement for typeid
Dan Gohmana79db302008-09-04 17:05:41 +0000696 GVN() : FunctionPass(&ID) { }
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000697
698 private:
Chris Lattner8541ede2008-12-01 00:40:32 +0000699 MemoryDependenceAnalysis *MD;
700 DominatorTree *DT;
701
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000702 ValueTable VN;
Owen Anderson1b3ea962008-06-20 01:15:47 +0000703 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000704
Owen Anderson0cc1a762007-08-07 23:12:31 +0000705 typedef DenseMap<Value*, SmallPtrSet<Instruction*, 4> > PhiMapType;
706 PhiMapType phiMap;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000707
708
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000709 // This transformation requires dominator postdominator info
710 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000711 AU.addRequired<DominatorTree>();
712 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000713 AU.addRequired<AliasAnalysis>();
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000714
Owen Anderson54e02192008-06-23 17:49:45 +0000715 AU.addPreserved<DominatorTree>();
Owen Anderson09b83ba2007-10-18 19:39:33 +0000716 AU.addPreserved<AliasAnalysis>();
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000717 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000718
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000719 // Helper fuctions
720 // FIXME: eliminate or document these better
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000721 bool processLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000722 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000723 bool processInstruction(Instruction* I,
Chris Lattner804209d2008-03-21 22:01:16 +0000724 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson9699a6e2007-08-02 18:16:06 +0000725 bool processNonLocalLoad(LoadInst* L,
Chris Lattner804209d2008-03-21 22:01:16 +0000726 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000727 bool processBlock(BasicBlock* BB);
Owen Andersone34c2392008-12-14 19:10:35 +0000728 Value *GetValueForBlock(BasicBlock *BB, Instruction* orig,
Owen Anderson0ac1fc82007-08-02 17:56:05 +0000729 DenseMap<BasicBlock*, Value*> &Phis,
730 bool top_level = false);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000731 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson676070d2007-08-14 18:04:11 +0000732 bool iterateOnFunction(Function &F);
Owen Andersonf5023a72007-08-16 22:51:56 +0000733 Value* CollapsePhi(PHINode* p);
Owen Anderson6a903bc2008-06-18 21:41:49 +0000734 bool performPRE(Function& F);
Owen Anderson1b3ea962008-06-20 01:15:47 +0000735 Value* lookupNumber(BasicBlock* BB, uint32_t num);
Owen Andersonbfe133e2008-12-15 02:03:00 +0000736 Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno);
Nuno Lopese3127f32008-10-10 16:25:50 +0000737 void cleanupGlobalSets();
Bill Wendling6b18a392008-12-22 21:36:08 +0000738 void verifyRemoved(const Instruction *I) const;
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000739 };
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000740
Owen Andersonab6ec2e2007-07-24 17:55:58 +0000741 char GVN::ID = 0;
Owen Andersonab6ec2e2007-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 Anderson6a903bc2008-06-18 21:41:49 +0000750void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5e5599b2007-07-25 19:57:03 +0000751 printf("{\n");
Owen Anderson6a903bc2008-06-18 21:41:49 +0000752 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5e5599b2007-07-25 19:57:03 +0000753 E = d.end(); I != E; ++I) {
Owen Anderson6a903bc2008-06-18 21:41:49 +0000754 printf("%d\n", I->first);
Owen Anderson5e5599b2007-07-25 19:57:03 +0000755 I->second->dump();
756 }
757 printf("}\n");
758}
759
Owen Anderson109ca5a2009-08-26 22:55:11 +0000760static bool isSafeReplacement(PHINode* p, Instruction* inst) {
761 if (!isa<PHINode>(inst))
762 return true;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000763
Owen Anderson109ca5a2009-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 Dunbar7d6781b2009-09-20 02:20:51 +0000769
Owen Anderson109ca5a2009-08-26 22:55:11 +0000770 return true;
771}
772
Owen Andersonf5023a72007-08-16 22:51:56 +0000773Value* GVN::CollapsePhi(PHINode* p) {
Dan Gohman22571482009-09-03 15:34:35 +0000774 Value* constVal = p->hasConstantValue(DT);
Chris Lattner2876a642008-03-21 21:14:38 +0000775 if (!constVal) return 0;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000776
Chris Lattner2876a642008-03-21 21:14:38 +0000777 Instruction* inst = dyn_cast<Instruction>(constVal);
778 if (!inst)
779 return constVal;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000780
Chris Lattner8541ede2008-12-01 00:40:32 +0000781 if (DT->dominates(inst, p))
Chris Lattner2876a642008-03-21 21:14:38 +0000782 if (isSafeReplacement(p, inst))
783 return inst;
Owen Andersonf5023a72007-08-16 22:51:56 +0000784 return 0;
785}
Owen Anderson5e5599b2007-07-25 19:57:03 +0000786
Owen Andersondbf23cc2007-07-26 18:26:51 +0000787/// GetValueForBlock - Get the value to use within the specified basic block.
788/// available values are in Phis.
Owen Andersone34c2392008-12-14 19:10:35 +0000789Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig,
Chris Lattner2876a642008-03-21 21:14:38 +0000790 DenseMap<BasicBlock*, Value*> &Phis,
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000791 bool top_level) {
792
Owen Andersondbf23cc2007-07-26 18:26:51 +0000793 // If we have already computed this value, return the previously computed val.
Owen Anderson2d19aae2007-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 Dunbar7d6781b2009-09-20 02:20:51 +0000796
Owen Anderson6acc7822008-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 Lattner8541ede2008-12-01 00:40:32 +0000799 if (!DT->isReachableFromEntry(BB))
Owen Andersonb292b8c2009-07-30 23:03:37 +0000800 return Phis[BB] = UndefValue::get(orig->getType());
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000801
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000802 if (BasicBlock *Pred = BB->getSinglePredecessor()) {
803 Value *ret = GetValueForBlock(Pred, orig, Phis);
Owen Anderson2d19aae2007-08-03 19:59:35 +0000804 Phis[BB] = ret;
805 return ret;
Owen Anderson774761c2007-08-03 11:03:26 +0000806 }
Chris Lattner0a5a8d52008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000816
Owen Andersondbf23cc2007-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 Greife9ecc682008-04-06 20:25:17 +0000819 PHINode *PN = PHINode::Create(orig->getType(), orig->getName()+".rle",
820 BB->begin());
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000821 PN->reserveOperandSpace(NumPreds);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000822
Chris Lattner0a5a8d52008-12-09 19:21:47 +0000823 Phis.insert(std::make_pair(BB, PN));
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000824
Owen Andersondbf23cc2007-07-26 18:26:51 +0000825 // Fill in the incoming values for the block.
Owen Andersond58fa6b02007-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 Andersond58fa6b02007-07-31 17:43:14 +0000828 PN->addIncoming(val, *PI);
829 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000830
Chris Lattner8541ede2008-12-01 00:40:32 +0000831 VN.getAliasAnalysis()->copyValue(orig, PN);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000832
Owen Anderson221a4362007-08-16 22:02:55 +0000833 // Attempt to collapse PHI nodes that are trivially redundant
Owen Andersonf5023a72007-08-16 22:51:56 +0000834 Value* v = CollapsePhi(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000835 if (!v) {
836 // Cache our phi construction results
Owen Andersone34c2392008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000841
Chris Lattner2876a642008-03-21 21:14:38 +0000842 return PN;
Owen Andersond58fa6b02007-07-31 17:43:14 +0000843 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000844
Chris Lattner2876a642008-03-21 21:14:38 +0000845 PN->replaceAllUsesWith(v);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +0000846 if (isa<PointerType>(v->getType()))
847 MD->invalidateCachedPointerInfo(v);
Chris Lattner2876a642008-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 Gohmanef3ef7f2009-07-31 20:24:18 +0000854 DEBUG(errs() << "GVN removed: " << *PN << '\n');
Chris Lattner8541ede2008-12-01 00:40:32 +0000855 MD->removeInstruction(PN);
Chris Lattner2876a642008-03-21 21:14:38 +0000856 PN->eraseFromParent();
Bill Wendling6b18a392008-12-22 21:36:08 +0000857 DEBUG(verifyRemoved(PN));
Chris Lattner2876a642008-03-21 21:14:38 +0000858
859 Phis[BB] = v;
860 return v;
Owen Anderson5e5599b2007-07-25 19:57:03 +0000861}
862
Chris Lattner1db9bbe2008-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 Lattnerd2a653a2008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000873static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000874 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattner1db9bbe2008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000877 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000878 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000879
880 // If the entry already existed for this block, return the precomputed value.
Chris Lattnerd2a653a2008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000888
Chris Lattner1db9bbe2008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000891
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000892 // If this block has no predecessors, it isn't live-in here.
893 if (PI == PE)
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000894 goto SpeculationFailure;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000895
Chris Lattner1db9bbe2008-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 Lattnerd2a653a2008-12-05 07:49:08 +0000901 goto SpeculationFailure;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000902
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000903 return true;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +0000904
Chris Lattnerd2a653a2008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000910
Chris Lattnerd2a653a2008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000922
Chris Lattnerd2a653a2008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000932
Chris Lattnerd2a653a2008-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 Dunbar7d6781b2009-09-20 02:20:51 +0000936
Chris Lattnerd2a653a2008-12-05 07:49:08 +0000937 return false;
Chris Lattner1db9bbe2008-12-02 08:16:11 +0000938}
939
Chris Lattnera0aa8fb2009-09-20 20:09:34 +0000940
941/// CoerceAvailableValueToLoadType - If we saw a store of a value to memory, and
942/// then a load from a must-aliased pointer of a different type, try to coerce
943/// the stored value. LoadedTy is the type of the load we want to replace and
944/// InsertPt is the place to insert new instructions.
945///
946/// If we can't do it, return null.
947static Value *CoerceAvailableValueToLoadType(Value *StoredVal,
948 const Type *LoadedTy,
949 Instruction *InsertPt,
950 const TargetData &TD) {
951 const Type *StoredValTy = StoredVal->getType();
952
953 uint64_t StoreSize = TD.getTypeSizeInBits(StoredValTy);
954 uint64_t LoadSize = TD.getTypeSizeInBits(LoadedTy);
955
956 // If the store and reload are the same size, we can always reuse it.
957 if (StoreSize == LoadSize) {
958 if (isa<PointerType>(StoredValTy) && isa<PointerType>(LoadedTy)) {
959 // Pointer to Pointer -> use bitcast.
960 return new BitCastInst(StoredVal, LoadedTy, "", InsertPt);
961 }
962
963 // Convert source pointers to integers, which can be bitcast.
964 if (isa<PointerType>(StoredValTy)) {
965 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
966 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
967 }
968
969 const Type *TypeToCastTo = LoadedTy;
970 if (isa<PointerType>(TypeToCastTo))
971 TypeToCastTo = TD.getIntPtrType(StoredValTy->getContext());
972
973 if (StoredValTy != TypeToCastTo)
974 StoredVal = new BitCastInst(StoredVal, TypeToCastTo, "", InsertPt);
975
976 // Cast to pointer if the load needs a pointer type.
977 if (isa<PointerType>(LoadedTy))
978 StoredVal = new IntToPtrInst(StoredVal, LoadedTy, "", InsertPt);
979
980 return StoredVal;
981 }
982
983 // If the loaded value is smaller than the available value, then we can
984 // extract out a piece from it. If the available value is too small, then we
985 // can't do anything.
986 if (StoreSize < LoadSize)
987 return 0;
988
989 // Convert source pointers to integers, which can be manipulated.
990 if (isa<PointerType>(StoredValTy)) {
991 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
992 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
993 }
994
995 // Convert vectors and fp to integer, which can be manipulated.
996 if (!isa<IntegerType>(StoredValTy)) {
997 StoredValTy = IntegerType::get(StoredValTy->getContext(), StoreSize);
998 StoredVal = new BitCastInst(StoredVal, StoredValTy, "", InsertPt);
999 }
1000
1001 // If this is a big-endian system, we need to shift the value down to the low
1002 // bits so that a truncate will work.
1003 if (TD.isBigEndian()) {
1004 Constant *Val = ConstantInt::get(StoredVal->getType(), StoreSize-LoadSize);
1005 StoredVal = BinaryOperator::CreateLShr(StoredVal, Val, "tmp", InsertPt);
1006 }
1007
1008 // Truncate the integer to the right size now.
1009 const Type *NewIntTy = IntegerType::get(StoredValTy->getContext(), LoadSize);
1010 StoredVal = new TruncInst(StoredVal, NewIntTy, "trunc", InsertPt);
1011
1012 if (LoadedTy == NewIntTy)
1013 return StoredVal;
1014
1015 // If the result is a pointer, inttoptr.
1016 if (isa<PointerType>(LoadedTy))
1017 return new IntToPtrInst(StoredVal, LoadedTy, "inttoptr", InsertPt);
1018
1019 // Otherwise, bitcast.
1020 return new BitCastInst(StoredVal, LoadedTy, "bitcast", InsertPt);
1021}
1022
1023static void
1024GetAvailableBlockValues(DenseMap<BasicBlock*, Value*> &BlockReplValues,
1025 SmallVector<std::pair<BasicBlock*,
1026 Value*>, 16> &ValuesPerBlock,
1027 const Type *LoadTy,
1028 const TargetData *TD) {
1029
1030 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i) {
1031 BasicBlock *BB = ValuesPerBlock[i].first;
1032 Value *AvailableVal = ValuesPerBlock[i].second;
1033
1034 Value *&BlockEntry = BlockReplValues[BB];
1035 if (BlockEntry) continue;
1036
1037 if (AvailableVal->getType() != LoadTy) {
1038 assert(TD && "Need target data to handle type mismatch case");
1039 AvailableVal = CoerceAvailableValueToLoadType(AvailableVal, LoadTy,
1040 BB->getTerminator(), *TD);
1041 DEBUG(errs() << "GVN COERCED NONLOCAL VAL:\n"
1042 << *ValuesPerBlock[i].second << '\n'
1043 << *AvailableVal << '\n' << "\n\n\n");
1044 }
1045 BlockEntry = AvailableVal;
1046 }
1047}
1048
Owen Anderson221a4362007-08-16 22:02:55 +00001049/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
1050/// non-local by performing PHI construction.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001051bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner804209d2008-03-21 22:01:16 +00001052 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001053 // Find the non-local dependencies of the load.
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001054 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001055 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
1056 Deps);
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001057 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: "
1058 // << Deps.size() << *LI << '\n');
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001059
Owen Andersonb39e0de2008-08-26 22:07:42 +00001060 // If we had to process more than one hundred blocks to find the
1061 // dependencies, this load isn't worth worrying about. Optimizing
1062 // it will be too expensive.
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001063 if (Deps.size() > 100)
Owen Andersonb39e0de2008-08-26 22:07:42 +00001064 return false;
Chris Lattnerb6372932008-12-18 00:51:32 +00001065
1066 // If we had a phi translation failure, we'll have a single entry which is a
1067 // clobber in the current block. Reject this early.
Torok Edwinba93ea72009-06-17 18:48:18 +00001068 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
1069 DEBUG(
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001070 errs() << "GVN: non-local load ";
1071 WriteAsOperand(errs(), LI);
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001072 errs() << " is clobbered by " << *Deps[0].second.getInst() << '\n';
Torok Edwinba93ea72009-06-17 18:48:18 +00001073 );
Chris Lattnerb6372932008-12-18 00:51:32 +00001074 return false;
Torok Edwinba93ea72009-06-17 18:48:18 +00001075 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001076
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001077 // Filter out useless results (non-locals, etc). Keep track of the blocks
1078 // where we have a value available in repl, also keep track of whether we see
1079 // dependencies that produce an unknown value for the load (such as a call
1080 // that could potentially clobber the load).
1081 SmallVector<std::pair<BasicBlock*, Value*>, 16> ValuesPerBlock;
1082 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001083
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001084 const TargetData *TD = 0;
1085
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001086 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
1087 BasicBlock *DepBB = Deps[i].first;
1088 MemDepResult DepInfo = Deps[i].second;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001089
Chris Lattner0e3d6332008-12-05 21:04:20 +00001090 if (DepInfo.isClobber()) {
1091 UnavailableBlocks.push_back(DepBB);
1092 continue;
1093 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001094
Chris Lattner0e3d6332008-12-05 21:04:20 +00001095 Instruction *DepInst = DepInfo.getInst();
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001096
Chris Lattner0e3d6332008-12-05 21:04:20 +00001097 // Loading the allocation -> undef.
Victor Hernandez5d034492009-09-18 22:35:49 +00001098 if (isa<AllocationInst>(DepInst) || isMalloc(DepInst)) {
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001099 ValuesPerBlock.push_back(std::make_pair(DepBB,
Owen Andersonb292b8c2009-07-30 23:03:37 +00001100 UndefValue::get(LI->getType())));
Chris Lattner7e61daf2008-12-01 01:15:42 +00001101 continue;
1102 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001103
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001104 if (StoreInst* S = dyn_cast<StoreInst>(DepInst)) {
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001105 // Reject loads and stores that are to the same address but are of
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001106 // different types if we have to.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001107 if (S->getOperand(0)->getType() != LI->getType()) {
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001108 if (TD == 0)
1109 TD = getAnalysisIfAvailable<TargetData>();
1110
1111 // If the stored value is larger or equal to the loaded value, we can
1112 // reuse it.
1113 if (TD == 0 ||
1114 TD->getTypeSizeInBits(S->getOperand(0)->getType()) <
1115 TD->getTypeSizeInBits(LI->getType())) {
1116 UnavailableBlocks.push_back(DepBB);
1117 continue;
1118 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001119 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001120
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001121 ValuesPerBlock.push_back(std::make_pair(DepBB, S->getOperand(0)));
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001122
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001123 } else if (LoadInst* LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001124 // If the types mismatch and we can't handle it, reject reuse of the load.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001125 if (LD->getType() != LI->getType()) {
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001126 if (TD == 0)
1127 TD = getAnalysisIfAvailable<TargetData>();
1128
1129 // If the stored value is larger or equal to the loaded value, we can
1130 // reuse it.
1131 if (TD == 0 ||
1132 TD->getTypeSizeInBits(LD->getType()) <
1133 TD->getTypeSizeInBits(LI->getType())) {
1134 UnavailableBlocks.push_back(DepBB);
1135 continue;
1136 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001137 }
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001138 ValuesPerBlock.push_back(std::make_pair(DepBB, LD));
Owen Anderson5e5599b2007-07-25 19:57:03 +00001139 } else {
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001140 // FIXME: Handle memset/memcpy.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001141 UnavailableBlocks.push_back(DepBB);
1142 continue;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001143 }
Chris Lattner2876a642008-03-21 21:14:38 +00001144 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001145
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001146 // If we have no predecessors that produce a known value for this load, exit
1147 // early.
1148 if (ValuesPerBlock.empty()) return false;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001149
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001150 // If all of the instructions we depend on produce a known value for this
1151 // load, then it is fully redundant and we can use PHI insertion to compute
1152 // its value. Insert PHIs and remove the fully redundant value now.
1153 if (UnavailableBlocks.empty()) {
1154 // Use cached PHI construction information from previous runs
1155 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
Chris Lattnerb6fc4b82008-12-09 19:25:07 +00001156 // FIXME: What does phiMap do? Are we positive it isn't getting invalidated?
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001157 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1158 I != E; ++I) {
1159 if ((*I)->getParent() == LI->getParent()) {
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001160 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD #1: " << *LI << '\n');
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001161 LI->replaceAllUsesWith(*I);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001162 if (isa<PointerType>((*I)->getType()))
1163 MD->invalidateCachedPointerInfo(*I);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001164 toErase.push_back(LI);
1165 NumGVNLoad++;
1166 return true;
1167 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001168
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001169 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Owen Anderson0cc1a762007-08-07 23:12:31 +00001170 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001171
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001172 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001173
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001174 // Convert the block information to a map, and insert coersions as needed.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001175 DenseMap<BasicBlock*, Value*> BlockReplValues;
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001176 GetAvailableBlockValues(BlockReplValues, ValuesPerBlock, LI->getType(), TD);
1177
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001178 // Perform PHI construction.
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001179 Value *V = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1180 LI->replaceAllUsesWith(V);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001181
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001182 if (isa<PHINode>(V))
1183 V->takeName(LI);
1184 if (isa<PointerType>(V->getType()))
1185 MD->invalidateCachedPointerInfo(V);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001186 toErase.push_back(LI);
1187 NumGVNLoad++;
1188 return true;
1189 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001190
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001191 if (!EnablePRE || !EnableLoadPRE)
1192 return false;
1193
1194 // Okay, we have *some* definitions of the value. This means that the value
1195 // is available in some of our (transitive) predecessors. Lets think about
1196 // doing PRE of this load. This will involve inserting a new load into the
1197 // predecessor when it's not available. We could do this in general, but
1198 // prefer to not increase code size. As such, we only do this when we know
1199 // that we only have to insert *one* load (which means we're basically moving
1200 // the load, not inserting a new one).
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001201
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001202 SmallPtrSet<BasicBlock *, 4> Blockers;
1203 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1204 Blockers.insert(UnavailableBlocks[i]);
1205
1206 // Lets find first basic block with more than one predecessor. Walk backwards
1207 // through predecessors if needed.
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001208 BasicBlock *LoadBB = LI->getParent();
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001209 BasicBlock *TmpBB = LoadBB;
1210
1211 bool isSinglePred = false;
Dale Johannesen81b64632009-06-17 20:48:23 +00001212 bool allSingleSucc = true;
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001213 while (TmpBB->getSinglePredecessor()) {
1214 isSinglePred = true;
1215 TmpBB = TmpBB->getSinglePredecessor();
1216 if (!TmpBB) // If haven't found any, bail now.
1217 return false;
1218 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1219 return false;
1220 if (Blockers.count(TmpBB))
1221 return false;
Dale Johannesen81b64632009-06-17 20:48:23 +00001222 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1223 allSingleSucc = false;
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001224 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001225
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001226 assert(TmpBB);
1227 LoadBB = TmpBB;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001228
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001229 // If we have a repl set with LI itself in it, this means we have a loop where
1230 // at least one of the values is LI. Since this means that we won't be able
1231 // to eliminate LI even if we insert uses in the other predecessors, we will
1232 // end up increasing code size. Reject this by scanning for LI.
1233 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1234 if (ValuesPerBlock[i].second == LI)
1235 return false;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001236
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001237 if (isSinglePred) {
1238 bool isHot = false;
1239 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1240 if (Instruction *I = dyn_cast<Instruction>(ValuesPerBlock[i].second))
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001241 // "Hot" Instruction is in some loop (because it dominates its dep.
1242 // instruction).
1243 if (DT->dominates(LI, I)) {
1244 isHot = true;
1245 break;
1246 }
Owen Andersoncc0c75c2009-05-31 09:03:40 +00001247
1248 // We are interested only in "hot" instructions. We don't want to do any
1249 // mis-optimizations here.
1250 if (!isHot)
1251 return false;
1252 }
1253
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001254 // Okay, we have some hope :). Check to see if the loaded value is fully
1255 // available in all but one predecessor.
1256 // FIXME: If we could restructure the CFG, we could make a common pred with
1257 // all the preds that don't have an available LI and insert a new load into
1258 // that one block.
1259 BasicBlock *UnavailablePred = 0;
1260
Chris Lattnerd2a653a2008-12-05 07:49:08 +00001261 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001262 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
1263 FullyAvailableBlocks[ValuesPerBlock[i].first] = true;
1264 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1265 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1266
1267 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1268 PI != E; ++PI) {
1269 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1270 continue;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001271
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001272 // If this load is not available in multiple predecessors, reject it.
1273 if (UnavailablePred && UnavailablePred != *PI)
1274 return false;
1275 UnavailablePred = *PI;
1276 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001277
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001278 assert(UnavailablePred != 0 &&
1279 "Fully available value should be eliminated above!");
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001280
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001281 // If the loaded pointer is PHI node defined in this block, do PHI translation
1282 // to get its value in the predecessor.
1283 Value *LoadPtr = LI->getOperand(0)->DoPHITranslation(LoadBB, UnavailablePred);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001284
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001285 // Make sure the value is live in the predecessor. If it was defined by a
1286 // non-PHI instruction in this block, we don't know how to recompute it above.
1287 if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
1288 if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
Daniel Dunbar0dd5e1e2009-07-25 00:23:56 +00001289 DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR IS UNAVAILABLE IN PRED: "
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001290 << *LPInst << '\n' << *LI << "\n");
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001291 return false;
1292 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001293
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001294 // We don't currently handle critical edges :(
1295 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbar0dd5e1e2009-07-25 00:23:56 +00001296 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001297 << UnavailablePred->getName() << "': " << *LI << '\n');
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001298 return false;
Owen Anderson0cc1a762007-08-07 23:12:31 +00001299 }
Dale Johannesen81b64632009-06-17 20:48:23 +00001300
1301 // Make sure it is valid to move this load here. We have to watch out for:
1302 // @1 = getelementptr (i8* p, ...
1303 // test p and branch if == 0
1304 // load @1
1305 // It is valid to have the getelementptr before the test, even if p can be 0,
1306 // as getelementptr only does address arithmetic.
1307 // If we are not pushing the value through any multiple-successor blocks
1308 // we do not have this case. Otherwise, check that the load is safe to
1309 // put anywhere; this can be improved, but should be conservatively safe.
1310 if (!allSingleSucc &&
1311 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator()))
1312 return false;
1313
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001314 // Okay, we can eliminate this load by inserting a reload in the predecessor
1315 // and using PHI construction to get the value in the other predecessors, do
1316 // it.
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001317 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001318
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001319 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1320 LI->getAlignment(),
1321 UnavailablePred->getTerminator());
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001322
Owen Anderson04cfdd32009-05-29 05:37:54 +00001323 SmallPtrSet<Instruction*, 4> &p = phiMap[LI->getPointerOperand()];
1324 for (SmallPtrSet<Instruction*, 4>::iterator I = p.begin(), E = p.end();
1325 I != E; ++I)
1326 ValuesPerBlock.push_back(std::make_pair((*I)->getParent(), *I));
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001327
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001328 DenseMap<BasicBlock*, Value*> BlockReplValues;
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001329 GetAvailableBlockValues(BlockReplValues, ValuesPerBlock, LI->getType(), TD);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001330 BlockReplValues[UnavailablePred] = NewLoad;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001331
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001332 // Perform PHI construction.
Chris Lattnera0aa8fb2009-09-20 20:09:34 +00001333 Value *V = GetValueForBlock(LI->getParent(), LI, BlockReplValues, true);
1334 LI->replaceAllUsesWith(V);
1335 if (isa<PHINode>(V))
1336 V->takeName(LI);
1337 if (isa<PointerType>(V->getType()))
1338 MD->invalidateCachedPointerInfo(V);
Chris Lattner1db9bbe2008-12-02 08:16:11 +00001339 toErase.push_back(LI);
1340 NumPRELoad++;
Owen Anderson5e5599b2007-07-25 19:57:03 +00001341 return true;
1342}
1343
Owen Anderson221a4362007-08-16 22:02:55 +00001344/// processLoad - Attempt to eliminate a load, first by eliminating it
1345/// locally, and then attempting non-local elimination if that fails.
Chris Lattner0e3d6332008-12-05 21:04:20 +00001346bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
1347 if (L->isVolatile())
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001348 return false;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001349
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001350 // ... to a pointer that has been loaded from before...
Chris Lattner8541ede2008-12-01 00:40:32 +00001351 MemDepResult dep = MD->getDependency(L);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001352
Chris Lattner0e3d6332008-12-05 21:04:20 +00001353 // If the value isn't available, don't do anything!
Torok Edwin72070282009-05-29 09:46:03 +00001354 if (dep.isClobber()) {
Chris Lattner1dd48c32009-09-20 19:03:47 +00001355 // FIXME: In the future, we should handle things like:
1356 // store i32 123, i32* %P
1357 // %A = bitcast i32* %P to i8*
1358 // %B = gep i8* %A, i32 1
1359 // %C = load i8* %B
1360 //
1361 // We could do that by recognizing if the clobber instructions are obviously
1362 // a common base + constant offset, and if the previous store (or memset)
1363 // completely covers this load. This sort of thing can happen in bitfield
1364 // access code.
Torok Edwin72070282009-05-29 09:46:03 +00001365 DEBUG(
1366 // fast print dep, using operator<< on instruction would be too slow
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001367 errs() << "GVN: load ";
1368 WriteAsOperand(errs(), L);
Torok Edwin72070282009-05-29 09:46:03 +00001369 Instruction *I = dep.getInst();
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001370 errs() << " is clobbered by " << *I << '\n';
Torok Edwin72070282009-05-29 09:46:03 +00001371 );
Chris Lattner0e3d6332008-12-05 21:04:20 +00001372 return false;
Torok Edwin72070282009-05-29 09:46:03 +00001373 }
Chris Lattner0e3d6332008-12-05 21:04:20 +00001374
1375 // If it is defined in another block, try harder.
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001376 if (dep.isNonLocal())
Chris Lattner0e3d6332008-12-05 21:04:20 +00001377 return processNonLocalLoad(L, toErase);
Eli Friedman716c10c2008-02-12 12:08:14 +00001378
Chris Lattner0e3d6332008-12-05 21:04:20 +00001379 Instruction *DepInst = dep.getInst();
1380 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner1dd48c32009-09-20 19:03:47 +00001381 Value *StoredVal = DepSI->getOperand(0);
1382
1383 // The store and load are to a must-aliased pointer, but they may not
1384 // actually have the same type. See if we know how to reuse the stored
1385 // value (depending on its type).
1386 const TargetData *TD = 0;
1387 if (StoredVal->getType() != L->getType() &&
1388 (TD = getAnalysisIfAvailable<TargetData>())) {
Chris Lattner7c62d8a2009-09-20 19:31:14 +00001389 StoredVal = CoerceAvailableValueToLoadType(StoredVal, L->getType(), L, *TD);
Chris Lattner1dd48c32009-09-20 19:03:47 +00001390 if (StoredVal == 0)
1391 return false;
1392
1393 DEBUG(errs() << "GVN COERCED STORE:\n" << *DepSI << '\n' << *StoredVal
1394 << '\n' << *L << "\n\n\n");
1395 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001396
Chris Lattner0e3d6332008-12-05 21:04:20 +00001397 // Remove it!
Chris Lattner1dd48c32009-09-20 19:03:47 +00001398 L->replaceAllUsesWith(StoredVal);
1399 if (isa<PointerType>(StoredVal->getType()))
1400 MD->invalidateCachedPointerInfo(StoredVal);
Chris Lattner0e3d6332008-12-05 21:04:20 +00001401 toErase.push_back(L);
1402 NumGVNLoad++;
1403 return true;
1404 }
1405
1406 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner1dd48c32009-09-20 19:03:47 +00001407 Value *AvailableVal = DepLI;
1408
1409 // The loads are of a must-aliased pointer, but they may not actually have
1410 // the same type. See if we know how to reuse the previously loaded value
1411 // (depending on its type).
1412 const TargetData *TD = 0;
1413 if (DepLI->getType() != L->getType() &&
1414 (TD = getAnalysisIfAvailable<TargetData>())) {
Chris Lattner7c62d8a2009-09-20 19:31:14 +00001415 AvailableVal = CoerceAvailableValueToLoadType(DepLI, L->getType(), L, *TD);
Chris Lattner1dd48c32009-09-20 19:03:47 +00001416 if (AvailableVal == 0)
1417 return false;
1418
1419 DEBUG(errs() << "GVN COERCED LOAD:\n" << *DepLI << "\n" << *AvailableVal
1420 << "\n" << *L << "\n\n\n");
1421 }
1422
Chris Lattner0e3d6332008-12-05 21:04:20 +00001423 // Remove it!
Chris Lattner1dd48c32009-09-20 19:03:47 +00001424 L->replaceAllUsesWith(AvailableVal);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001425 if (isa<PointerType>(DepLI->getType()))
1426 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner0e3d6332008-12-05 21:04:20 +00001427 toErase.push_back(L);
1428 NumGVNLoad++;
1429 return true;
1430 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001431
Chris Lattner1dd48c32009-09-20 19:03:47 +00001432 // FIXME: We should handle memset/memcpy/memmove as dependent instructions to
1433 // forward the value if available.
Chris Lattner7c62d8a2009-09-20 19:31:14 +00001434 //if (isa<MemIntrinsic>(DepInst))
1435 // errs() << "LOAD DEPENDS ON MEM: " << *L << "\n" << *DepInst << "\n\n";
Chris Lattner1dd48c32009-09-20 19:03:47 +00001436
1437
Chris Lattner3ff6d012008-11-30 01:39:32 +00001438 // If this load really doesn't depend on anything, then we must be loading an
1439 // undef value. This can happen when loading for a fresh allocation with no
1440 // intervening stores, for example.
Victor Hernandez5d034492009-09-18 22:35:49 +00001441 if (isa<AllocationInst>(DepInst) || isMalloc(DepInst)) {
Owen Andersonb292b8c2009-07-30 23:03:37 +00001442 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Chris Lattner3ff6d012008-11-30 01:39:32 +00001443 toErase.push_back(L);
Chris Lattner3ff6d012008-11-30 01:39:32 +00001444 NumGVNLoad++;
Chris Lattner0e3d6332008-12-05 21:04:20 +00001445 return true;
Eli Friedman716c10c2008-02-12 12:08:14 +00001446 }
1447
Chris Lattner0e3d6332008-12-05 21:04:20 +00001448 return false;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001449}
1450
Owen Anderson1b3ea962008-06-20 01:15:47 +00001451Value* GVN::lookupNumber(BasicBlock* BB, uint32_t num) {
Owen Anderson54e02192008-06-23 17:49:45 +00001452 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1453 if (I == localAvail.end())
1454 return 0;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001455
Owen Anderson54e02192008-06-23 17:49:45 +00001456 ValueNumberScope* locals = I->second;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001457
Owen Anderson1b3ea962008-06-20 01:15:47 +00001458 while (locals) {
1459 DenseMap<uint32_t, Value*>::iterator I = locals->table.find(num);
1460 if (I != locals->table.end())
1461 return I->second;
1462 else
1463 locals = locals->parent;
1464 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001465
Owen Anderson1b3ea962008-06-20 01:15:47 +00001466 return 0;
1467}
1468
Owen Andersonbfe133e2008-12-15 02:03:00 +00001469/// AttemptRedundancyElimination - If the "fast path" of redundancy elimination
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001470/// by inheritance from the dominator fails, see if we can perform phi
Owen Andersonbfe133e2008-12-15 02:03:00 +00001471/// construction to eliminate the redundancy.
1472Value* GVN::AttemptRedundancyElimination(Instruction* orig, unsigned valno) {
1473 BasicBlock* BaseBlock = orig->getParent();
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001474
Owen Andersonbfe133e2008-12-15 02:03:00 +00001475 SmallPtrSet<BasicBlock*, 4> Visited;
1476 SmallVector<BasicBlock*, 8> Stack;
1477 Stack.push_back(BaseBlock);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001478
Owen Andersonbfe133e2008-12-15 02:03:00 +00001479 DenseMap<BasicBlock*, Value*> Results;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001480
Owen Andersonbfe133e2008-12-15 02:03:00 +00001481 // Walk backwards through our predecessors, looking for instances of the
1482 // value number we're looking for. Instances are recorded in the Results
1483 // map, which is then used to perform phi construction.
1484 while (!Stack.empty()) {
1485 BasicBlock* Current = Stack.back();
1486 Stack.pop_back();
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001487
Owen Andersonbfe133e2008-12-15 02:03:00 +00001488 // If we've walked all the way to a proper dominator, then give up. Cases
1489 // where the instance is in the dominator will have been caught by the fast
1490 // path, and any cases that require phi construction further than this are
1491 // probably not worth it anyways. Note that this is a SIGNIFICANT compile
1492 // time improvement.
1493 if (DT->properlyDominates(Current, orig->getParent())) return 0;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001494
Owen Andersonbfe133e2008-12-15 02:03:00 +00001495 DenseMap<BasicBlock*, ValueNumberScope*>::iterator LA =
1496 localAvail.find(Current);
1497 if (LA == localAvail.end()) return 0;
Chris Lattner73d7fe52009-01-19 22:00:18 +00001498 DenseMap<uint32_t, Value*>::iterator V = LA->second->table.find(valno);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001499
Owen Andersonbfe133e2008-12-15 02:03:00 +00001500 if (V != LA->second->table.end()) {
1501 // Found an instance, record it.
1502 Results.insert(std::make_pair(Current, V->second));
1503 continue;
1504 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001505
Owen Andersonbfe133e2008-12-15 02:03:00 +00001506 // If we reach the beginning of the function, then give up.
1507 if (pred_begin(Current) == pred_end(Current))
1508 return 0;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001509
Owen Andersonbfe133e2008-12-15 02:03:00 +00001510 for (pred_iterator PI = pred_begin(Current), PE = pred_end(Current);
1511 PI != PE; ++PI)
1512 if (Visited.insert(*PI))
1513 Stack.push_back(*PI);
1514 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001515
Owen Andersonbfe133e2008-12-15 02:03:00 +00001516 // If we didn't find instances, give up. Otherwise, perform phi construction.
1517 if (Results.size() == 0)
1518 return 0;
1519 else
1520 return GetValueForBlock(BaseBlock, orig, Results, true);
1521}
1522
Owen Anderson398602a2007-08-14 18:16:29 +00001523/// processInstruction - When calculating availability, handle an instruction
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001524/// by inserting it into the appropriate sets
Owen Andersonaccdca12008-06-12 19:25:32 +00001525bool GVN::processInstruction(Instruction *I,
Chris Lattner804209d2008-03-21 22:01:16 +00001526 SmallVectorImpl<Instruction*> &toErase) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001527 if (LoadInst* L = dyn_cast<LoadInst>(I)) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001528 bool changed = processLoad(L, toErase);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001529
Owen Anderson6a903bc2008-06-18 21:41:49 +00001530 if (!changed) {
1531 unsigned num = VN.lookup_or_add(L);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001532 localAvail[I->getParent()]->table.insert(std::make_pair(num, L));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001533 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001534
Owen Anderson6a903bc2008-06-18 21:41:49 +00001535 return changed;
1536 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001537
Owen Anderson3ea90a72008-07-03 17:44:33 +00001538 uint32_t nextNum = VN.getNextUnusedValueNumber();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001539 unsigned num = VN.lookup_or_add(I);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001540
Owen Anderson98f912b2009-04-01 23:53:49 +00001541 if (BranchInst* BI = dyn_cast<BranchInst>(I)) {
1542 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001543
Owen Anderson98f912b2009-04-01 23:53:49 +00001544 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1545 return false;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001546
Owen Anderson98f912b2009-04-01 23:53:49 +00001547 Value* branchCond = BI->getCondition();
1548 uint32_t condVN = VN.lookup_or_add(branchCond);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001549
Owen Anderson98f912b2009-04-01 23:53:49 +00001550 BasicBlock* trueSucc = BI->getSuccessor(0);
1551 BasicBlock* falseSucc = BI->getSuccessor(1);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001552
Owen Anderson98f912b2009-04-01 23:53:49 +00001553 if (trueSucc->getSinglePredecessor())
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001554 localAvail[trueSucc]->table[condVN] =
Owen Anderson23a204d2009-07-31 17:39:07 +00001555 ConstantInt::getTrue(trueSucc->getContext());
Owen Anderson98f912b2009-04-01 23:53:49 +00001556 if (falseSucc->getSinglePredecessor())
Owen Anderson23a204d2009-07-31 17:39:07 +00001557 localAvail[falseSucc]->table[condVN] =
1558 ConstantInt::getFalse(trueSucc->getContext());
Owen Anderson98f912b2009-04-01 23:53:49 +00001559
1560 return false;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001561
Owen Anderson0c1e6342008-04-07 09:59:07 +00001562 // Allocations are always uniquely numbered, so we can save time and memory
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001563 // by fast failing them.
Victor Hernandez5d034492009-09-18 22:35:49 +00001564 } else if (isa<AllocationInst>(I) || isMalloc(I) || isa<TerminatorInst>(I)) {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001565 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Anderson0c1e6342008-04-07 09:59:07 +00001566 return false;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001567 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001568
Owen Anderson221a4362007-08-16 22:02:55 +00001569 // Collapse PHI nodes
Owen Andersonbc271a02007-08-14 18:33:27 +00001570 if (PHINode* p = dyn_cast<PHINode>(I)) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001571 Value* constVal = CollapsePhi(p);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001572
Owen Andersonbc271a02007-08-14 18:33:27 +00001573 if (constVal) {
Owen Andersonf5023a72007-08-16 22:51:56 +00001574 for (PhiMapType::iterator PI = phiMap.begin(), PE = phiMap.end();
1575 PI != PE; ++PI)
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001576 PI->second.erase(p);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001577
Owen Andersonf5023a72007-08-16 22:51:56 +00001578 p->replaceAllUsesWith(constVal);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001579 if (isa<PointerType>(constVal->getType()))
1580 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson164274e2008-12-23 00:49:51 +00001581 VN.erase(p);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001582
Owen Andersonf5023a72007-08-16 22:51:56 +00001583 toErase.push_back(p);
Owen Anderson6a903bc2008-06-18 21:41:49 +00001584 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001585 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonbc271a02007-08-14 18:33:27 +00001586 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001587
Owen Anderson3ea90a72008-07-03 17:44:33 +00001588 // If the number we were assigned was a brand new VN, then we don't
1589 // need to do a lookup to see if the number already exists
1590 // somewhere in the domtree: it can't!
1591 } else if (num == nextNum) {
1592 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001593
Owen Andersonbfe133e2008-12-15 02:03:00 +00001594 // Perform fast-path value-number based elimination of values inherited from
1595 // dominators.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001596 } else if (Value* repl = lookupNumber(I->getParent(), num)) {
Owen Anderson086b2c42007-12-08 01:37:09 +00001597 // Remove it!
Owen Anderson10ffa862007-07-31 23:27:13 +00001598 VN.erase(I);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001599 I->replaceAllUsesWith(repl);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001600 if (isa<PointerType>(repl->getType()))
1601 MD->invalidateCachedPointerInfo(repl);
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001602 toErase.push_back(I);
1603 return true;
Owen Andersonbfe133e2008-12-15 02:03:00 +00001604
1605#if 0
1606 // Perform slow-pathvalue-number based elimination with phi construction.
1607 } else if (Value* repl = AttemptRedundancyElimination(I, num)) {
1608 // Remove it!
1609 VN.erase(I);
1610 I->replaceAllUsesWith(repl);
1611 if (isa<PointerType>(repl->getType()))
1612 MD->invalidateCachedPointerInfo(repl);
1613 toErase.push_back(I);
1614 return true;
1615#endif
Owen Anderson3ea90a72008-07-03 17:44:33 +00001616 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001617 localAvail[I->getParent()]->table.insert(std::make_pair(num, I));
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001618 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001619
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001620 return false;
1621}
1622
Bill Wendling456e8852008-12-22 22:32:22 +00001623/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson676070d2007-08-14 18:04:11 +00001624bool GVN::runOnFunction(Function& F) {
Chris Lattner8541ede2008-12-01 00:40:32 +00001625 MD = &getAnalysis<MemoryDependenceAnalysis>();
1626 DT = &getAnalysis<DominatorTree>();
Owen Andersonf7928602008-05-12 20:15:55 +00001627 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner8541ede2008-12-01 00:40:32 +00001628 VN.setMemDep(MD);
1629 VN.setDomTree(DT);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001630
Owen Anderson676070d2007-08-14 18:04:11 +00001631 bool changed = false;
1632 bool shouldContinue = true;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001633
Owen Andersonac310962008-07-16 17:52:31 +00001634 // Merge unconditional branches, allowing PRE to catch more
1635 // optimization opportunities.
1636 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
1637 BasicBlock* BB = FI;
1638 ++FI;
Owen Andersonc0623812008-07-17 00:01:40 +00001639 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1640 if (removedBlock) NumGVNBlocks++;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001641
Owen Andersonc0623812008-07-17 00:01:40 +00001642 changed |= removedBlock;
Owen Andersonac310962008-07-16 17:52:31 +00001643 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001644
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001645 unsigned Iteration = 0;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001646
Owen Anderson676070d2007-08-14 18:04:11 +00001647 while (shouldContinue) {
Dan Gohman1ddf98a2009-07-25 01:43:01 +00001648 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Owen Anderson676070d2007-08-14 18:04:11 +00001649 shouldContinue = iterateOnFunction(F);
1650 changed |= shouldContinue;
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001651 ++Iteration;
Owen Anderson676070d2007-08-14 18:04:11 +00001652 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001653
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001654 if (EnablePRE) {
Owen Anderson2fbfb702008-09-03 23:06:07 +00001655 bool PREChanged = true;
1656 while (PREChanged) {
1657 PREChanged = performPRE(F);
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001658 changed |= PREChanged;
Owen Anderson2fbfb702008-09-03 23:06:07 +00001659 }
Owen Anderson04a6e0b2008-07-18 18:03:38 +00001660 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001661 // FIXME: Should perform GVN again after PRE does something. PRE can move
1662 // computations into blocks where they become fully redundant. Note that
1663 // we can't do this until PRE's critical edge splitting updates memdep.
1664 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopese3127f32008-10-10 16:25:50 +00001665
1666 cleanupGlobalSets();
1667
Owen Anderson676070d2007-08-14 18:04:11 +00001668 return changed;
1669}
1670
1671
Owen Andersonbfe133e2008-12-15 02:03:00 +00001672bool GVN::processBlock(BasicBlock* BB) {
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001673 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1674 // incrementing BI before processing an instruction).
Owen Andersonaccdca12008-06-12 19:25:32 +00001675 SmallVector<Instruction*, 8> toErase;
Owen Andersonaccdca12008-06-12 19:25:32 +00001676 bool changed_function = false;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001677
Owen Andersonaccdca12008-06-12 19:25:32 +00001678 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1679 BI != BE;) {
Chris Lattner0e3d6332008-12-05 21:04:20 +00001680 changed_function |= processInstruction(BI, toErase);
Owen Andersonaccdca12008-06-12 19:25:32 +00001681 if (toErase.empty()) {
1682 ++BI;
1683 continue;
1684 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001685
Owen Andersonaccdca12008-06-12 19:25:32 +00001686 // If we need some instructions deleted, do it now.
1687 NumGVNInstr += toErase.size();
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001688
Owen Andersonaccdca12008-06-12 19:25:32 +00001689 // Avoid iterator invalidation.
1690 bool AtStart = BI == BB->begin();
1691 if (!AtStart)
1692 --BI;
1693
1694 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner8541ede2008-12-01 00:40:32 +00001695 E = toErase.end(); I != E; ++I) {
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001696 DEBUG(errs() << "GVN removed: " << **I << '\n');
Chris Lattner8541ede2008-12-01 00:40:32 +00001697 MD->removeInstruction(*I);
Owen Andersonaccdca12008-06-12 19:25:32 +00001698 (*I)->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001699 DEBUG(verifyRemoved(*I));
Chris Lattner8541ede2008-12-01 00:40:32 +00001700 }
Chris Lattner0a5a8d52008-12-09 19:21:47 +00001701 toErase.clear();
Owen Andersonaccdca12008-06-12 19:25:32 +00001702
1703 if (AtStart)
1704 BI = BB->begin();
1705 else
1706 ++BI;
Owen Andersonaccdca12008-06-12 19:25:32 +00001707 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001708
Owen Andersonaccdca12008-06-12 19:25:32 +00001709 return changed_function;
1710}
1711
Owen Anderson6a903bc2008-06-18 21:41:49 +00001712/// performPRE - Perform a purely local form of PRE that looks for diamond
1713/// control flow patterns and attempts to perform simple PRE at the join point.
1714bool GVN::performPRE(Function& F) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001715 bool Changed = false;
Owen Andersonfdf9f162008-06-19 19:54:19 +00001716 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001717 DenseMap<BasicBlock*, Value*> predMap;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001718 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
1719 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
1720 BasicBlock* CurrentBlock = *DI;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001721
Owen Anderson6a903bc2008-06-18 21:41:49 +00001722 // Nothing to PRE in the entry block.
1723 if (CurrentBlock == &F.getEntryBlock()) continue;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001724
Owen Anderson6a903bc2008-06-18 21:41:49 +00001725 for (BasicBlock::iterator BI = CurrentBlock->begin(),
1726 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001727 Instruction *CurInst = BI++;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001728
Victor Hernandez5d034492009-09-18 22:35:49 +00001729 if (isa<AllocationInst>(CurInst) || isMalloc(CurInst) ||
1730 isa<TerminatorInst>(CurInst) || isa<PHINode>(CurInst) ||
Owen Anderson55f1c092009-08-13 21:58:54 +00001731 (CurInst->getType() == Type::getVoidTy(F.getContext())) ||
Duncan Sands1efabaa2009-05-06 06:49:50 +00001732 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell073e4d12009-03-10 15:04:53 +00001733 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001734 continue;
Duncan Sands1efabaa2009-05-06 06:49:50 +00001735
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001736 uint32_t valno = VN.lookup(CurInst);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001737
Owen Anderson6a903bc2008-06-18 21:41:49 +00001738 // Look for the predecessors for PRE opportunities. We're
1739 // only trying to solve the basic diamond case, where
1740 // a value is computed in the successor and one predecessor,
1741 // but not the other. We also explicitly disallow cases
1742 // where the successor is its own predecessor, because they're
1743 // more complicated to get right.
1744 unsigned numWith = 0;
1745 unsigned numWithout = 0;
1746 BasicBlock* PREPred = 0;
Chris Lattnerf00aae42008-12-01 07:29:03 +00001747 predMap.clear();
1748
Owen Anderson6a903bc2008-06-18 21:41:49 +00001749 for (pred_iterator PI = pred_begin(CurrentBlock),
1750 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
1751 // We're not interested in PRE where the block is its
Owen Anderson1b3ea962008-06-20 01:15:47 +00001752 // own predecessor, on in blocks with predecessors
1753 // that are not reachable.
1754 if (*PI == CurrentBlock) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001755 numWithout = 2;
Owen Anderson1b3ea962008-06-20 01:15:47 +00001756 break;
1757 } else if (!localAvail.count(*PI)) {
1758 numWithout = 2;
1759 break;
1760 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001761
1762 DenseMap<uint32_t, Value*>::iterator predV =
Owen Anderson1b3ea962008-06-20 01:15:47 +00001763 localAvail[*PI]->table.find(valno);
1764 if (predV == localAvail[*PI]->table.end()) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001765 PREPred = *PI;
1766 numWithout++;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001767 } else if (predV->second == CurInst) {
Owen Anderson6a903bc2008-06-18 21:41:49 +00001768 numWithout = 2;
1769 } else {
Owen Anderson1b3ea962008-06-20 01:15:47 +00001770 predMap[*PI] = predV->second;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001771 numWith++;
1772 }
1773 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001774
Owen Anderson6a903bc2008-06-18 21:41:49 +00001775 // Don't do PRE when it might increase code size, i.e. when
1776 // we would need to insert instructions in more than one pred.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001777 if (numWithout != 1 || numWith == 0)
Owen Anderson6a903bc2008-06-18 21:41:49 +00001778 continue;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001779
Owen Andersonfdf9f162008-06-19 19:54:19 +00001780 // We can't do PRE safely on a critical edge, so instead we schedule
1781 // the edge to be split and perform the PRE the next time we iterate
1782 // on the function.
1783 unsigned succNum = 0;
1784 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
1785 i != e; ++i)
Owen Anderson2fbfb702008-09-03 23:06:07 +00001786 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Owen Andersonfdf9f162008-06-19 19:54:19 +00001787 succNum = i;
1788 break;
1789 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001790
Owen Andersonfdf9f162008-06-19 19:54:19 +00001791 if (isCriticalEdge(PREPred->getTerminator(), succNum)) {
1792 toSplit.push_back(std::make_pair(PREPred->getTerminator(), succNum));
Owen Andersonfdf9f162008-06-19 19:54:19 +00001793 continue;
1794 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001795
Owen Anderson6a903bc2008-06-18 21:41:49 +00001796 // Instantiate the expression the in predecessor that lacked it.
1797 // Because we are going top-down through the block, all value numbers
1798 // will be available in the predecessor by the time we need them. Any
1799 // that weren't original present will have been instantiated earlier
1800 // in this loop.
Owen Anderson47db9412009-07-22 00:24:57 +00001801 Instruction* PREInstr = CurInst->clone(CurInst->getContext());
Owen Anderson6a903bc2008-06-18 21:41:49 +00001802 bool success = true;
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001803 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
1804 Value *Op = PREInstr->getOperand(i);
1805 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
1806 continue;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001807
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001808 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
1809 PREInstr->setOperand(i, V);
1810 } else {
1811 success = false;
1812 break;
Owen Anderson8e462e92008-07-11 20:05:13 +00001813 }
Owen Anderson6a903bc2008-06-18 21:41:49 +00001814 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001815
Owen Anderson6a903bc2008-06-18 21:41:49 +00001816 // Fail out if we encounter an operand that is not available in
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001817 // the PRE predecessor. This is typically because of loads which
Owen Anderson6a903bc2008-06-18 21:41:49 +00001818 // are not value numbered precisely.
1819 if (!success) {
1820 delete PREInstr;
Bill Wendling3c793442008-12-22 22:14:07 +00001821 DEBUG(verifyRemoved(PREInstr));
Owen Anderson6a903bc2008-06-18 21:41:49 +00001822 continue;
1823 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001824
Owen Anderson6a903bc2008-06-18 21:41:49 +00001825 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001826 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson1b3ea962008-06-20 01:15:47 +00001827 predMap[PREPred] = PREInstr;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001828 VN.add(PREInstr, valno);
1829 NumGVNPRE++;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001830
Owen Anderson6a903bc2008-06-18 21:41:49 +00001831 // Update the availability map to include the new instruction.
Owen Anderson1b3ea962008-06-20 01:15:47 +00001832 localAvail[PREPred]->table.insert(std::make_pair(valno, PREInstr));
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001833
Owen Anderson6a903bc2008-06-18 21:41:49 +00001834 // Create a PHI to make the value available in this block.
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001835 PHINode* Phi = PHINode::Create(CurInst->getType(),
1836 CurInst->getName() + ".pre-phi",
Owen Anderson6a903bc2008-06-18 21:41:49 +00001837 CurrentBlock->begin());
1838 for (pred_iterator PI = pred_begin(CurrentBlock),
1839 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson1b3ea962008-06-20 01:15:47 +00001840 Phi->addIncoming(predMap[*PI], *PI);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001841
Owen Anderson6a903bc2008-06-18 21:41:49 +00001842 VN.add(Phi, valno);
Owen Anderson1b3ea962008-06-20 01:15:47 +00001843 localAvail[CurrentBlock]->table[valno] = Phi;
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001844
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001845 CurInst->replaceAllUsesWith(Phi);
Chris Lattnerfa9f99a2008-12-09 22:06:23 +00001846 if (isa<PointerType>(Phi->getType()))
1847 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001848 VN.erase(CurInst);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001849
Dan Gohmanef3ef7f2009-07-31 20:24:18 +00001850 DEBUG(errs() << "GVN PRE removed: " << *CurInst << '\n');
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001851 MD->removeInstruction(CurInst);
1852 CurInst->eraseFromParent();
Bill Wendlingebb6a542008-12-22 21:57:30 +00001853 DEBUG(verifyRemoved(CurInst));
Chris Lattner6f5bf6a2008-12-01 07:35:54 +00001854 Changed = true;
Owen Anderson6a903bc2008-06-18 21:41:49 +00001855 }
1856 }
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001857
Owen Andersonfdf9f162008-06-19 19:54:19 +00001858 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001859 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonfdf9f162008-06-19 19:54:19 +00001860 SplitCriticalEdge(I->first, I->second, this);
Daniel Dunbar7d6781b2009-09-20 02:20:51 +00001861
Anton Korobeynikov24600bf2008-12-05 19:38:49 +00001862 return Changed || toSplit.size();
Owen Anderson6a903bc2008-06-18 21:41:49 +00001863}
1864
Bill Wendling456e8852008-12-22 22:32:22 +00001865/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson676070d2007-08-14 18:04:11 +00001866bool GVN::iterateOnFunction(Function &F) {
Nuno Lopese3127f32008-10-10 16:25:50 +00001867 cleanupGlobalSets();
Chris Lattnerbeb216d2008-03-21 21:33:23 +00001868
Owen Anderson98f912b2009-04-01 23:53:49 +00001869 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1870 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
1871 if (DI->getIDom())
1872 localAvail[DI->getBlock()] =
1873 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
1874 else
1875 localAvail[DI->getBlock()] = new ValueNumberScope(0);
1876 }
1877
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001878 // Top-down walk of the dominator tree
Owen Anderson6a903bc2008-06-18 21:41:49 +00001879 bool changed = false;
Owen Anderson03aacba2008-12-15 03:52:17 +00001880#if 0
1881 // Needed for value numbering with phi construction to work.
Owen Andersonbfe133e2008-12-15 02:03:00 +00001882 ReversePostOrderTraversal<Function*> RPOT(&F);
1883 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
1884 RE = RPOT.end(); RI != RE; ++RI)
1885 changed |= processBlock(*RI);
Owen Anderson03aacba2008-12-15 03:52:17 +00001886#else
1887 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
1888 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
1889 changed |= processBlock(DI->getBlock());
1890#endif
1891
Owen Andersonac310962008-07-16 17:52:31 +00001892 return changed;
Owen Andersonab6ec2e2007-07-24 17:55:58 +00001893}
Nuno Lopese3127f32008-10-10 16:25:50 +00001894
1895void GVN::cleanupGlobalSets() {
1896 VN.clear();
1897 phiMap.clear();
1898
1899 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1900 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
1901 delete I->second;
1902 localAvail.clear();
1903}
Bill Wendling6b18a392008-12-22 21:36:08 +00001904
1905/// verifyRemoved - Verify that the specified instruction does not occur in our
1906/// internal data structures.
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001907void GVN::verifyRemoved(const Instruction *Inst) const {
1908 VN.verifyRemoved(Inst);
Bill Wendling3c793442008-12-22 22:14:07 +00001909
1910 // Walk through the PHI map to make sure the instruction isn't hiding in there
1911 // somewhere.
1912 for (PhiMapType::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001913 I = phiMap.begin(), E = phiMap.end(); I != E; ++I) {
1914 assert(I->first != Inst && "Inst is still a key in PHI map!");
Bill Wendling3c793442008-12-22 22:14:07 +00001915
1916 for (SmallPtrSet<Instruction*, 4>::iterator
Bill Wendlinge7f08e72008-12-22 22:28:56 +00001917 II = I->second.begin(), IE = I->second.end(); II != IE; ++II) {
1918 assert(*II != Inst && "Inst is still a value in PHI map!");
1919 }
1920 }
1921
1922 // Walk through the value number scope to make sure the instruction isn't
1923 // ferreted away in it.
1924 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
1925 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
1926 const ValueNumberScope *VNS = I->second;
1927
1928 while (VNS) {
1929 for (DenseMap<uint32_t, Value*>::iterator
1930 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
1931 assert(II->second != Inst && "Inst still in value numbering scope!");
1932 }
1933
1934 VNS = VNS->parent;
Bill Wendling3c793442008-12-22 22:14:07 +00001935 }
1936 }
Bill Wendling6b18a392008-12-22 21:36:08 +00001937}