blob: b703a76ba9006d2cee142f418030855d1c2bd967 [file] [log] [blame]
Chris Lattner72bc70d2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Anderson1ad2cb72007-07-24 17:55:58 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Owen Anderson1ad2cb72007-07-24 17:55:58 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This pass performs global value numbering to eliminate fully redundant
11// instructions. It also performs simple dead load elimination.
12//
John Criswell090c0a22009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman845f5242008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Anderson1ad2cb72007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson0cd32032007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Anderson45537912007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Anderson45537912007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patelc64bc162009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Andersond672ecb2009-07-03 00:17:18 +000025#include "llvm/LLVMContext.h"
Chris Lattnereed919b2009-09-21 05:57:11 +000026#include "llvm/Operator.h"
Owen Anderson45537912007-07-26 18:26:51 +000027#include "llvm/Value.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000028#include "llvm/ADT/DenseMap.h"
29#include "llvm/ADT/DepthFirstIterator.h"
Owen Anderson255dafc2008-12-15 02:03:00 +000030#include "llvm/ADT/PostOrderIterator.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000031#include "llvm/ADT/SmallPtrSet.h"
32#include "llvm/ADT/SmallVector.h"
33#include "llvm/ADT/Statistic.h"
Owen Andersonb388ca92007-10-18 19:39:33 +000034#include "llvm/Analysis/AliasAnalysis.h"
Chris Lattnerbc9a28d2009-12-06 05:29:56 +000035#include "llvm/Analysis/ConstantFolding.h"
36#include "llvm/Analysis/Dominators.h"
Victor Hernandezf006b182009-10-27 20:05:49 +000037#include "llvm/Analysis/MemoryBuiltins.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000038#include "llvm/Analysis/MemoryDependenceAnalysis.h"
39#include "llvm/Support/CFG.h"
Owen Andersonaa0b6342008-06-19 19:57:25 +000040#include "llvm/Support/CommandLine.h"
Chris Lattner9f8a6a72008-03-29 04:36:18 +000041#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000042#include "llvm/Support/ErrorHandling.h"
Chris Lattnereed919b2009-09-21 05:57:11 +000043#include "llvm/Support/GetElementPtrTypeIterator.h"
Chris Lattnerfaf815b2009-12-06 01:57:02 +000044#include "llvm/Support/IRBuilder.h"
Daniel Dunbarce63ffb2009-07-25 00:23:56 +000045#include "llvm/Support/raw_ostream.h"
Chris Lattnerbb6495c2009-09-20 19:03:47 +000046#include "llvm/Target/TargetData.h"
Owen Anderson5c274ee2008-06-19 19:54:19 +000047#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesen42c3f552009-06-17 20:48:23 +000048#include "llvm/Transforms/Utils/Local.h"
Chris Lattnera09fbf02009-10-10 23:50:30 +000049#include "llvm/Transforms/Utils/SSAUpdater.h"
Duncan Sands4520dd22008-10-08 07:23:46 +000050#include <cstdio>
Owen Anderson1ad2cb72007-07-24 17:55:58 +000051using namespace llvm;
52
Bill Wendling70ded192008-12-22 22:14:07 +000053STATISTIC(NumGVNInstr, "Number of instructions deleted");
54STATISTIC(NumGVNLoad, "Number of loads deleted");
55STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
Owen Anderson961edc82008-07-15 16:28:06 +000056STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling70ded192008-12-22 22:14:07 +000057STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattnerd27290d2008-03-22 04:13:49 +000058
Evan Cheng88d11c02008-06-20 01:01:07 +000059static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonc2b856e2008-07-17 19:41:00 +000060 cl::init(true), cl::Hidden);
Dan Gohmanc915c952009-06-15 18:30:15 +000061static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersonaa0b6342008-06-19 19:57:25 +000062
Owen Anderson1ad2cb72007-07-24 17:55:58 +000063//===----------------------------------------------------------------------===//
64// ValueTable Class
65//===----------------------------------------------------------------------===//
66
67/// This class holds the mapping between values and value numbers. It is used
68/// as an efficient mechanism to determine the expression-wise equivalence of
69/// two values.
70namespace {
Chris Lattner3e8b6632009-09-02 06:11:42 +000071 struct Expression {
Dan Gohmanae3a0be2009-06-04 22:49:04 +000072 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
73 UDIV, SDIV, FDIV, UREM, SREM,
Daniel Dunbara279bc32009-09-20 02:20:51 +000074 FREM, SHL, LSHR, ASHR, AND, OR, XOR, ICMPEQ,
75 ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
76 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
77 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
78 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
Owen Anderson1ad2cb72007-07-24 17:55:58 +000079 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
80 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
Daniel Dunbara279bc32009-09-20 02:20:51 +000081 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson3b3f58c2008-05-13 08:17:22 +000082 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Andersond41ed4e2009-10-19 22:14:22 +000083 INSERTVALUE, EXTRACTVALUE, EMPTY, TOMBSTONE };
Owen Anderson1ad2cb72007-07-24 17:55:58 +000084
85 ExpressionOpcode opcode;
86 const Type* type;
Owen Anderson1ad2cb72007-07-24 17:55:58 +000087 SmallVector<uint32_t, 4> varargs;
Chris Lattnerb2412a82009-09-21 02:42:51 +000088 Value *function;
Daniel Dunbara279bc32009-09-20 02:20:51 +000089
Owen Anderson1ad2cb72007-07-24 17:55:58 +000090 Expression() { }
91 Expression(ExpressionOpcode o) : opcode(o) { }
Daniel Dunbara279bc32009-09-20 02:20:51 +000092
Owen Anderson1ad2cb72007-07-24 17:55:58 +000093 bool operator==(const Expression &other) const {
94 if (opcode != other.opcode)
95 return false;
96 else if (opcode == EMPTY || opcode == TOMBSTONE)
97 return true;
98 else if (type != other.type)
99 return false;
Owen Andersonb388ca92007-10-18 19:39:33 +0000100 else if (function != other.function)
101 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000102 else {
103 if (varargs.size() != other.varargs.size())
104 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000105
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000106 for (size_t i = 0; i < varargs.size(); ++i)
107 if (varargs[i] != other.varargs[i])
108 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000109
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000110 return true;
111 }
112 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000113
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000114 bool operator!=(const Expression &other) const {
Bill Wendling75f02ee2008-12-22 22:16:31 +0000115 return !(*this == other);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000116 }
117 };
Daniel Dunbara279bc32009-09-20 02:20:51 +0000118
Chris Lattner3e8b6632009-09-02 06:11:42 +0000119 class ValueTable {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000120 private:
121 DenseMap<Value*, uint32_t> valueNumbering;
122 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersona472c4a2008-05-12 20:15:55 +0000123 AliasAnalysis* AA;
124 MemoryDependenceAnalysis* MD;
125 DominatorTree* DT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000126
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000127 uint32_t nextValueNumber;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000128
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000129 Expression::ExpressionOpcode getOpcode(BinaryOperator* BO);
130 Expression::ExpressionOpcode getOpcode(CmpInst* C);
131 Expression::ExpressionOpcode getOpcode(CastInst* C);
132 Expression create_expression(BinaryOperator* BO);
133 Expression create_expression(CmpInst* C);
134 Expression create_expression(ShuffleVectorInst* V);
135 Expression create_expression(ExtractElementInst* C);
136 Expression create_expression(InsertElementInst* V);
137 Expression create_expression(SelectInst* V);
138 Expression create_expression(CastInst* C);
139 Expression create_expression(GetElementPtrInst* G);
Owen Andersonb388ca92007-10-18 19:39:33 +0000140 Expression create_expression(CallInst* C);
Owen Anderson3b3f58c2008-05-13 08:17:22 +0000141 Expression create_expression(Constant* C);
Owen Andersond41ed4e2009-10-19 22:14:22 +0000142 Expression create_expression(ExtractValueInst* C);
143 Expression create_expression(InsertValueInst* C);
144
145 uint32_t lookup_or_add_call(CallInst* C);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000146 public:
Dan Gohmane63c4a22009-04-01 16:37:47 +0000147 ValueTable() : nextValueNumber(1) { }
Chris Lattnerb2412a82009-09-21 02:42:51 +0000148 uint32_t lookup_or_add(Value *V);
149 uint32_t lookup(Value *V) const;
150 void add(Value *V, uint32_t num);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000151 void clear();
Chris Lattnerb2412a82009-09-21 02:42:51 +0000152 void erase(Value *v);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000153 unsigned size();
Owen Andersona472c4a2008-05-12 20:15:55 +0000154 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner663e4412008-12-01 00:40:32 +0000155 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersona472c4a2008-05-12 20:15:55 +0000156 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
157 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson0ae33ef2008-07-03 17:44:33 +0000158 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling246dbbb2008-12-22 21:36:08 +0000159 void verifyRemoved(const Value *) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000160 };
161}
162
163namespace llvm {
Chris Lattner76c1b972007-09-17 18:34:04 +0000164template <> struct DenseMapInfo<Expression> {
Owen Anderson830db6a2007-08-02 18:16:06 +0000165 static inline Expression getEmptyKey() {
166 return Expression(Expression::EMPTY);
167 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000168
Owen Anderson830db6a2007-08-02 18:16:06 +0000169 static inline Expression getTombstoneKey() {
170 return Expression(Expression::TOMBSTONE);
171 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000172
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000173 static unsigned getHashValue(const Expression e) {
174 unsigned hash = e.opcode;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000175
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000176 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
Owen Andersond41ed4e2009-10-19 22:14:22 +0000177 (unsigned)((uintptr_t)e.type >> 9));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000178
Owen Anderson830db6a2007-08-02 18:16:06 +0000179 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
180 E = e.varargs.end(); I != E; ++I)
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000181 hash = *I + hash * 37;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000182
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000183 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
184 (unsigned)((uintptr_t)e.function >> 9)) +
185 hash * 37;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000186
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000187 return hash;
188 }
Chris Lattner76c1b972007-09-17 18:34:04 +0000189 static bool isEqual(const Expression &LHS, const Expression &RHS) {
190 return LHS == RHS;
191 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000192 static bool isPod() { return true; }
193};
194}
195
196//===----------------------------------------------------------------------===//
197// ValueTable Internal Functions
198//===----------------------------------------------------------------------===//
Chris Lattner88365bb2008-03-21 21:14:38 +0000199Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000200 switch(BO->getOpcode()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000201 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000202 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000203 case Instruction::Add: return Expression::ADD;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000204 case Instruction::FAdd: return Expression::FADD;
Chris Lattner88365bb2008-03-21 21:14:38 +0000205 case Instruction::Sub: return Expression::SUB;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000206 case Instruction::FSub: return Expression::FSUB;
Chris Lattner88365bb2008-03-21 21:14:38 +0000207 case Instruction::Mul: return Expression::MUL;
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000208 case Instruction::FMul: return Expression::FMUL;
Chris Lattner88365bb2008-03-21 21:14:38 +0000209 case Instruction::UDiv: return Expression::UDIV;
210 case Instruction::SDiv: return Expression::SDIV;
211 case Instruction::FDiv: return Expression::FDIV;
212 case Instruction::URem: return Expression::UREM;
213 case Instruction::SRem: return Expression::SREM;
214 case Instruction::FRem: return Expression::FREM;
215 case Instruction::Shl: return Expression::SHL;
216 case Instruction::LShr: return Expression::LSHR;
217 case Instruction::AShr: return Expression::ASHR;
218 case Instruction::And: return Expression::AND;
219 case Instruction::Or: return Expression::OR;
220 case Instruction::Xor: return Expression::XOR;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000221 }
222}
223
224Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000225 if (isa<ICmpInst>(C)) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000226 switch (C->getPredicate()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000227 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000228 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000229 case ICmpInst::ICMP_EQ: return Expression::ICMPEQ;
230 case ICmpInst::ICMP_NE: return Expression::ICMPNE;
231 case ICmpInst::ICMP_UGT: return Expression::ICMPUGT;
232 case ICmpInst::ICMP_UGE: return Expression::ICMPUGE;
233 case ICmpInst::ICMP_ULT: return Expression::ICMPULT;
234 case ICmpInst::ICMP_ULE: return Expression::ICMPULE;
235 case ICmpInst::ICMP_SGT: return Expression::ICMPSGT;
236 case ICmpInst::ICMP_SGE: return Expression::ICMPSGE;
237 case ICmpInst::ICMP_SLT: return Expression::ICMPSLT;
238 case ICmpInst::ICMP_SLE: return Expression::ICMPSLE;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000239 }
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000240 } else {
241 switch (C->getPredicate()) {
242 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000243 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000244 case FCmpInst::FCMP_OEQ: return Expression::FCMPOEQ;
245 case FCmpInst::FCMP_OGT: return Expression::FCMPOGT;
246 case FCmpInst::FCMP_OGE: return Expression::FCMPOGE;
247 case FCmpInst::FCMP_OLT: return Expression::FCMPOLT;
248 case FCmpInst::FCMP_OLE: return Expression::FCMPOLE;
249 case FCmpInst::FCMP_ONE: return Expression::FCMPONE;
250 case FCmpInst::FCMP_ORD: return Expression::FCMPORD;
251 case FCmpInst::FCMP_UNO: return Expression::FCMPUNO;
252 case FCmpInst::FCMP_UEQ: return Expression::FCMPUEQ;
253 case FCmpInst::FCMP_UGT: return Expression::FCMPUGT;
254 case FCmpInst::FCMP_UGE: return Expression::FCMPUGE;
255 case FCmpInst::FCMP_ULT: return Expression::FCMPULT;
256 case FCmpInst::FCMP_ULE: return Expression::FCMPULE;
257 case FCmpInst::FCMP_UNE: return Expression::FCMPUNE;
258 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000259 }
260}
261
Chris Lattner88365bb2008-03-21 21:14:38 +0000262Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000263 switch(C->getOpcode()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000264 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000265 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000266 case Instruction::Trunc: return Expression::TRUNC;
267 case Instruction::ZExt: return Expression::ZEXT;
268 case Instruction::SExt: return Expression::SEXT;
269 case Instruction::FPToUI: return Expression::FPTOUI;
270 case Instruction::FPToSI: return Expression::FPTOSI;
271 case Instruction::UIToFP: return Expression::UITOFP;
272 case Instruction::SIToFP: return Expression::SITOFP;
273 case Instruction::FPTrunc: return Expression::FPTRUNC;
274 case Instruction::FPExt: return Expression::FPEXT;
275 case Instruction::PtrToInt: return Expression::PTRTOINT;
276 case Instruction::IntToPtr: return Expression::INTTOPTR;
277 case Instruction::BitCast: return Expression::BITCAST;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000278 }
279}
280
Owen Andersonb388ca92007-10-18 19:39:33 +0000281Expression ValueTable::create_expression(CallInst* C) {
282 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000283
Owen Andersonb388ca92007-10-18 19:39:33 +0000284 e.type = C->getType();
Owen Andersonb388ca92007-10-18 19:39:33 +0000285 e.function = C->getCalledFunction();
286 e.opcode = Expression::CALL;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000287
Owen Andersonb388ca92007-10-18 19:39:33 +0000288 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
289 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000290 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000291
Owen Andersonb388ca92007-10-18 19:39:33 +0000292 return e;
293}
294
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000295Expression ValueTable::create_expression(BinaryOperator* BO) {
296 Expression e;
Owen Andersond41ed4e2009-10-19 22:14:22 +0000297 e.varargs.push_back(lookup_or_add(BO->getOperand(0)));
298 e.varargs.push_back(lookup_or_add(BO->getOperand(1)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000299 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000300 e.type = BO->getType();
301 e.opcode = getOpcode(BO);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000302
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000303 return e;
304}
305
306Expression ValueTable::create_expression(CmpInst* C) {
307 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000308
Owen Andersond41ed4e2009-10-19 22:14:22 +0000309 e.varargs.push_back(lookup_or_add(C->getOperand(0)));
310 e.varargs.push_back(lookup_or_add(C->getOperand(1)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000311 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000312 e.type = C->getType();
313 e.opcode = getOpcode(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000314
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000315 return e;
316}
317
318Expression ValueTable::create_expression(CastInst* C) {
319 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000320
Owen Andersond41ed4e2009-10-19 22:14:22 +0000321 e.varargs.push_back(lookup_or_add(C->getOperand(0)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000322 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000323 e.type = C->getType();
324 e.opcode = getOpcode(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000325
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000326 return e;
327}
328
329Expression ValueTable::create_expression(ShuffleVectorInst* S) {
330 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000331
Owen Andersond41ed4e2009-10-19 22:14:22 +0000332 e.varargs.push_back(lookup_or_add(S->getOperand(0)));
333 e.varargs.push_back(lookup_or_add(S->getOperand(1)));
334 e.varargs.push_back(lookup_or_add(S->getOperand(2)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000335 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000336 e.type = S->getType();
337 e.opcode = Expression::SHUFFLE;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000338
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000339 return e;
340}
341
342Expression ValueTable::create_expression(ExtractElementInst* E) {
343 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000344
Owen Andersond41ed4e2009-10-19 22:14:22 +0000345 e.varargs.push_back(lookup_or_add(E->getOperand(0)));
346 e.varargs.push_back(lookup_or_add(E->getOperand(1)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000347 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000348 e.type = E->getType();
349 e.opcode = Expression::EXTRACT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000350
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000351 return e;
352}
353
354Expression ValueTable::create_expression(InsertElementInst* I) {
355 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000356
Owen Andersond41ed4e2009-10-19 22:14:22 +0000357 e.varargs.push_back(lookup_or_add(I->getOperand(0)));
358 e.varargs.push_back(lookup_or_add(I->getOperand(1)));
359 e.varargs.push_back(lookup_or_add(I->getOperand(2)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000360 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000361 e.type = I->getType();
362 e.opcode = Expression::INSERT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000363
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000364 return e;
365}
366
367Expression ValueTable::create_expression(SelectInst* I) {
368 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000369
Owen Andersond41ed4e2009-10-19 22:14:22 +0000370 e.varargs.push_back(lookup_or_add(I->getCondition()));
371 e.varargs.push_back(lookup_or_add(I->getTrueValue()));
372 e.varargs.push_back(lookup_or_add(I->getFalseValue()));
Owen Andersonb388ca92007-10-18 19:39:33 +0000373 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000374 e.type = I->getType();
375 e.opcode = Expression::SELECT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000376
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000377 return e;
378}
379
380Expression ValueTable::create_expression(GetElementPtrInst* G) {
381 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000382
Owen Andersond41ed4e2009-10-19 22:14:22 +0000383 e.varargs.push_back(lookup_or_add(G->getPointerOperand()));
Owen Andersonb388ca92007-10-18 19:39:33 +0000384 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000385 e.type = G->getType();
386 e.opcode = Expression::GEP;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000387
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000388 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
389 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000390 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000391
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000392 return e;
393}
394
Owen Andersond41ed4e2009-10-19 22:14:22 +0000395Expression ValueTable::create_expression(ExtractValueInst* E) {
396 Expression e;
397
398 e.varargs.push_back(lookup_or_add(E->getAggregateOperand()));
399 for (ExtractValueInst::idx_iterator II = E->idx_begin(), IE = E->idx_end();
400 II != IE; ++II)
401 e.varargs.push_back(*II);
402 e.function = 0;
403 e.type = E->getType();
404 e.opcode = Expression::EXTRACTVALUE;
405
406 return e;
407}
408
409Expression ValueTable::create_expression(InsertValueInst* E) {
410 Expression e;
411
412 e.varargs.push_back(lookup_or_add(E->getAggregateOperand()));
413 e.varargs.push_back(lookup_or_add(E->getInsertedValueOperand()));
414 for (InsertValueInst::idx_iterator II = E->idx_begin(), IE = E->idx_end();
415 II != IE; ++II)
416 e.varargs.push_back(*II);
417 e.function = 0;
418 e.type = E->getType();
419 e.opcode = Expression::INSERTVALUE;
420
421 return e;
422}
423
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000424//===----------------------------------------------------------------------===//
425// ValueTable External Functions
426//===----------------------------------------------------------------------===//
427
Owen Andersonb2303722008-06-18 21:41:49 +0000428/// add - Insert a value into the table with a specified value number.
Chris Lattnerb2412a82009-09-21 02:42:51 +0000429void ValueTable::add(Value *V, uint32_t num) {
Owen Andersonb2303722008-06-18 21:41:49 +0000430 valueNumbering.insert(std::make_pair(V, num));
431}
432
Owen Andersond41ed4e2009-10-19 22:14:22 +0000433uint32_t ValueTable::lookup_or_add_call(CallInst* C) {
434 if (AA->doesNotAccessMemory(C)) {
435 Expression exp = create_expression(C);
436 uint32_t& e = expressionNumbering[exp];
437 if (!e) e = nextValueNumber++;
438 valueNumbering[C] = e;
439 return e;
440 } else if (AA->onlyReadsMemory(C)) {
441 Expression exp = create_expression(C);
442 uint32_t& e = expressionNumbering[exp];
443 if (!e) {
444 e = nextValueNumber++;
445 valueNumbering[C] = e;
446 return e;
447 }
Dan Gohman4ec01b22009-11-14 02:27:51 +0000448 if (!MD) {
449 e = nextValueNumber++;
450 valueNumbering[C] = e;
451 return e;
452 }
Owen Andersond41ed4e2009-10-19 22:14:22 +0000453
454 MemDepResult local_dep = MD->getDependency(C);
455
456 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
457 valueNumbering[C] = nextValueNumber;
458 return nextValueNumber++;
459 }
460
461 if (local_dep.isDef()) {
462 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
463
464 if (local_cdep->getNumOperands() != C->getNumOperands()) {
465 valueNumbering[C] = nextValueNumber;
466 return nextValueNumber++;
467 }
468
469 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
470 uint32_t c_vn = lookup_or_add(C->getOperand(i));
471 uint32_t cd_vn = lookup_or_add(local_cdep->getOperand(i));
472 if (c_vn != cd_vn) {
473 valueNumbering[C] = nextValueNumber;
474 return nextValueNumber++;
475 }
476 }
477
478 uint32_t v = lookup_or_add(local_cdep);
479 valueNumbering[C] = v;
480 return v;
481 }
482
483 // Non-local case.
484 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
485 MD->getNonLocalCallDependency(CallSite(C));
486 // FIXME: call/call dependencies for readonly calls should return def, not
487 // clobber! Move the checking logic to MemDep!
488 CallInst* cdep = 0;
489
490 // Check to see if we have a single dominating call instruction that is
491 // identical to C.
492 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
493 const MemoryDependenceAnalysis::NonLocalDepEntry *I = &deps[i];
494 // Ignore non-local dependencies.
495 if (I->second.isNonLocal())
496 continue;
497
498 // We don't handle non-depedencies. If we already have a call, reject
499 // instruction dependencies.
500 if (I->second.isClobber() || cdep != 0) {
501 cdep = 0;
502 break;
503 }
504
505 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I->second.getInst());
506 // FIXME: All duplicated with non-local case.
507 if (NonLocalDepCall && DT->properlyDominates(I->first, C->getParent())){
508 cdep = NonLocalDepCall;
509 continue;
510 }
511
512 cdep = 0;
513 break;
514 }
515
516 if (!cdep) {
517 valueNumbering[C] = nextValueNumber;
518 return nextValueNumber++;
519 }
520
521 if (cdep->getNumOperands() != C->getNumOperands()) {
522 valueNumbering[C] = nextValueNumber;
523 return nextValueNumber++;
524 }
525 for (unsigned i = 1; i < C->getNumOperands(); ++i) {
526 uint32_t c_vn = lookup_or_add(C->getOperand(i));
527 uint32_t cd_vn = lookup_or_add(cdep->getOperand(i));
528 if (c_vn != cd_vn) {
529 valueNumbering[C] = nextValueNumber;
530 return nextValueNumber++;
531 }
532 }
533
534 uint32_t v = lookup_or_add(cdep);
535 valueNumbering[C] = v;
536 return v;
537
538 } else {
539 valueNumbering[C] = nextValueNumber;
540 return nextValueNumber++;
541 }
542}
543
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000544/// lookup_or_add - Returns the value number for the specified value, assigning
545/// it a new number if it did not have one before.
Chris Lattnerb2412a82009-09-21 02:42:51 +0000546uint32_t ValueTable::lookup_or_add(Value *V) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000547 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
548 if (VI != valueNumbering.end())
549 return VI->second;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000550
Owen Andersond41ed4e2009-10-19 22:14:22 +0000551 if (!isa<Instruction>(V)) {
Owen Anderson158d86e2009-10-19 21:14:57 +0000552 valueNumbering[V] = nextValueNumber;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000553 return nextValueNumber++;
554 }
Owen Andersond41ed4e2009-10-19 22:14:22 +0000555
556 Instruction* I = cast<Instruction>(V);
557 Expression exp;
558 switch (I->getOpcode()) {
559 case Instruction::Call:
560 return lookup_or_add_call(cast<CallInst>(I));
561 case Instruction::Add:
562 case Instruction::FAdd:
563 case Instruction::Sub:
564 case Instruction::FSub:
565 case Instruction::Mul:
566 case Instruction::FMul:
567 case Instruction::UDiv:
568 case Instruction::SDiv:
569 case Instruction::FDiv:
570 case Instruction::URem:
571 case Instruction::SRem:
572 case Instruction::FRem:
573 case Instruction::Shl:
574 case Instruction::LShr:
575 case Instruction::AShr:
576 case Instruction::And:
577 case Instruction::Or :
578 case Instruction::Xor:
579 exp = create_expression(cast<BinaryOperator>(I));
580 break;
581 case Instruction::ICmp:
582 case Instruction::FCmp:
583 exp = create_expression(cast<CmpInst>(I));
584 break;
585 case Instruction::Trunc:
586 case Instruction::ZExt:
587 case Instruction::SExt:
588 case Instruction::FPToUI:
589 case Instruction::FPToSI:
590 case Instruction::UIToFP:
591 case Instruction::SIToFP:
592 case Instruction::FPTrunc:
593 case Instruction::FPExt:
594 case Instruction::PtrToInt:
595 case Instruction::IntToPtr:
596 case Instruction::BitCast:
597 exp = create_expression(cast<CastInst>(I));
598 break;
599 case Instruction::Select:
600 exp = create_expression(cast<SelectInst>(I));
601 break;
602 case Instruction::ExtractElement:
603 exp = create_expression(cast<ExtractElementInst>(I));
604 break;
605 case Instruction::InsertElement:
606 exp = create_expression(cast<InsertElementInst>(I));
607 break;
608 case Instruction::ShuffleVector:
609 exp = create_expression(cast<ShuffleVectorInst>(I));
610 break;
611 case Instruction::ExtractValue:
612 exp = create_expression(cast<ExtractValueInst>(I));
613 break;
614 case Instruction::InsertValue:
615 exp = create_expression(cast<InsertValueInst>(I));
616 break;
617 case Instruction::GetElementPtr:
618 exp = create_expression(cast<GetElementPtrInst>(I));
619 break;
620 default:
621 valueNumbering[V] = nextValueNumber;
622 return nextValueNumber++;
623 }
624
625 uint32_t& e = expressionNumbering[exp];
626 if (!e) e = nextValueNumber++;
627 valueNumbering[V] = e;
628 return e;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000629}
630
631/// lookup - Returns the value number of the specified value. Fails if
632/// the value has not yet been numbered.
Chris Lattnerb2412a82009-09-21 02:42:51 +0000633uint32_t ValueTable::lookup(Value *V) const {
Jeffrey Yasskin81cf4322009-11-10 01:02:17 +0000634 DenseMap<Value*, uint32_t>::const_iterator VI = valueNumbering.find(V);
Chris Lattner88365bb2008-03-21 21:14:38 +0000635 assert(VI != valueNumbering.end() && "Value not numbered?");
636 return VI->second;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000637}
638
639/// clear - Remove all entries from the ValueTable
640void ValueTable::clear() {
641 valueNumbering.clear();
642 expressionNumbering.clear();
643 nextValueNumber = 1;
644}
645
Owen Andersonbf7d0bc2007-07-31 23:27:13 +0000646/// erase - Remove a value from the value numbering
Chris Lattnerb2412a82009-09-21 02:42:51 +0000647void ValueTable::erase(Value *V) {
Owen Andersonbf7d0bc2007-07-31 23:27:13 +0000648 valueNumbering.erase(V);
649}
650
Bill Wendling246dbbb2008-12-22 21:36:08 +0000651/// verifyRemoved - Verify that the value is removed from all internal data
652/// structures.
653void ValueTable::verifyRemoved(const Value *V) const {
Jeffrey Yasskin81cf4322009-11-10 01:02:17 +0000654 for (DenseMap<Value*, uint32_t>::const_iterator
Bill Wendling246dbbb2008-12-22 21:36:08 +0000655 I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
656 assert(I->first != V && "Inst still occurs in value numbering map!");
657 }
658}
659
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000660//===----------------------------------------------------------------------===//
Bill Wendling30788b82008-12-22 22:32:22 +0000661// GVN Pass
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000662//===----------------------------------------------------------------------===//
663
664namespace {
Chris Lattner3e8b6632009-09-02 06:11:42 +0000665 struct ValueNumberScope {
Owen Anderson6fafe842008-06-20 01:15:47 +0000666 ValueNumberScope* parent;
667 DenseMap<uint32_t, Value*> table;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000668
Owen Anderson6fafe842008-06-20 01:15:47 +0000669 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
670 };
671}
672
673namespace {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000674
Chris Lattner3e8b6632009-09-02 06:11:42 +0000675 class GVN : public FunctionPass {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000676 bool runOnFunction(Function &F);
677 public:
678 static char ID; // Pass identification, replacement for typeid
Dan Gohman4ec01b22009-11-14 02:27:51 +0000679 explicit GVN(bool nopre = false, bool noloads = false)
680 : FunctionPass(&ID), NoPRE(nopre), NoLoads(noloads), MD(0) { }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000681
682 private:
Evan Cheng2f192c22009-10-30 20:12:24 +0000683 bool NoPRE;
Dan Gohman4ec01b22009-11-14 02:27:51 +0000684 bool NoLoads;
Chris Lattner663e4412008-12-01 00:40:32 +0000685 MemoryDependenceAnalysis *MD;
686 DominatorTree *DT;
687
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000688 ValueTable VN;
Owen Anderson6fafe842008-06-20 01:15:47 +0000689 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000690
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000691 // This transformation requires dominator postdominator info
692 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000693 AU.addRequired<DominatorTree>();
Dan Gohman4ec01b22009-11-14 02:27:51 +0000694 if (!NoLoads)
695 AU.addRequired<MemoryDependenceAnalysis>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000696 AU.addRequired<AliasAnalysis>();
Daniel Dunbara279bc32009-09-20 02:20:51 +0000697
Owen Andersonb70a5712008-06-23 17:49:45 +0000698 AU.addPreserved<DominatorTree>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000699 AU.addPreserved<AliasAnalysis>();
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000700 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000701
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000702 // Helper fuctions
703 // FIXME: eliminate or document these better
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000704 bool processLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000705 SmallVectorImpl<Instruction*> &toErase);
Chris Lattnerb2412a82009-09-21 02:42:51 +0000706 bool processInstruction(Instruction *I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000707 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson830db6a2007-08-02 18:16:06 +0000708 bool processNonLocalLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000709 SmallVectorImpl<Instruction*> &toErase);
Chris Lattnerb2412a82009-09-21 02:42:51 +0000710 bool processBlock(BasicBlock *BB);
Owen Andersonb2303722008-06-18 21:41:49 +0000711 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson3e75a422007-08-14 18:04:11 +0000712 bool iterateOnFunction(Function &F);
Chris Lattnerb2412a82009-09-21 02:42:51 +0000713 Value *CollapsePhi(PHINode* p);
Owen Andersonb2303722008-06-18 21:41:49 +0000714 bool performPRE(Function& F);
Chris Lattnerb2412a82009-09-21 02:42:51 +0000715 Value *lookupNumber(BasicBlock *BB, uint32_t num);
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +0000716 void cleanupGlobalSets();
Bill Wendling246dbbb2008-12-22 21:36:08 +0000717 void verifyRemoved(const Instruction *I) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000718 };
Daniel Dunbara279bc32009-09-20 02:20:51 +0000719
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000720 char GVN::ID = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000721}
722
723// createGVNPass - The public interface to this file...
Dan Gohman4ec01b22009-11-14 02:27:51 +0000724FunctionPass *llvm::createGVNPass(bool NoPRE, bool NoLoads) {
725 return new GVN(NoPRE, NoLoads);
726}
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000727
728static RegisterPass<GVN> X("gvn",
729 "Global Value Numbering");
730
Owen Andersonb2303722008-06-18 21:41:49 +0000731void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson0cd32032007-07-25 19:57:03 +0000732 printf("{\n");
Owen Andersonb2303722008-06-18 21:41:49 +0000733 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson0cd32032007-07-25 19:57:03 +0000734 E = d.end(); I != E; ++I) {
Owen Andersonb2303722008-06-18 21:41:49 +0000735 printf("%d\n", I->first);
Owen Anderson0cd32032007-07-25 19:57:03 +0000736 I->second->dump();
737 }
738 printf("}\n");
739}
740
Chris Lattnerb2412a82009-09-21 02:42:51 +0000741static bool isSafeReplacement(PHINode* p, Instruction *inst) {
Owen Anderson4eebf0b2009-08-26 22:55:11 +0000742 if (!isa<PHINode>(inst))
743 return true;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000744
Owen Anderson4eebf0b2009-08-26 22:55:11 +0000745 for (Instruction::use_iterator UI = p->use_begin(), E = p->use_end();
746 UI != E; ++UI)
747 if (PHINode* use_phi = dyn_cast<PHINode>(UI))
748 if (use_phi->getParent() == inst->getParent())
749 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000750
Owen Anderson4eebf0b2009-08-26 22:55:11 +0000751 return true;
752}
753
Chris Lattnerb2412a82009-09-21 02:42:51 +0000754Value *GVN::CollapsePhi(PHINode *PN) {
755 Value *ConstVal = PN->hasConstantValue(DT);
756 if (!ConstVal) return 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000757
Chris Lattnerb2412a82009-09-21 02:42:51 +0000758 Instruction *Inst = dyn_cast<Instruction>(ConstVal);
759 if (!Inst)
760 return ConstVal;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000761
Chris Lattnerb2412a82009-09-21 02:42:51 +0000762 if (DT->dominates(Inst, PN))
763 if (isSafeReplacement(PN, Inst))
764 return Inst;
Owen Anderson1defe2d2007-08-16 22:51:56 +0000765 return 0;
766}
Owen Anderson0cd32032007-07-25 19:57:03 +0000767
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000768/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
769/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattner72bc70d2008-12-05 07:49:08 +0000770/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
771/// map is actually a tri-state map with the following values:
772/// 0) we know the block *is not* fully available.
773/// 1) we know the block *is* fully available.
774/// 2) we do not know whether the block is fully available or not, but we are
775/// currently speculating that it will be.
776/// 3) we are speculating for this block and have used that to speculate for
777/// other blocks.
Daniel Dunbara279bc32009-09-20 02:20:51 +0000778static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner72bc70d2008-12-05 07:49:08 +0000779 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000780 // Optimistically assume that the block is fully available and check to see
781 // if we already know about this block in one lookup.
Daniel Dunbara279bc32009-09-20 02:20:51 +0000782 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
Chris Lattner72bc70d2008-12-05 07:49:08 +0000783 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000784
785 // If the entry already existed for this block, return the precomputed value.
Chris Lattner72bc70d2008-12-05 07:49:08 +0000786 if (!IV.second) {
787 // If this is a speculative "available" value, mark it as being used for
788 // speculation of other blocks.
789 if (IV.first->second == 2)
790 IV.first->second = 3;
791 return IV.first->second != 0;
792 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000793
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000794 // Otherwise, see if it is fully available in all predecessors.
795 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000796
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000797 // If this block has no predecessors, it isn't live-in here.
798 if (PI == PE)
Chris Lattner72bc70d2008-12-05 07:49:08 +0000799 goto SpeculationFailure;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000800
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000801 for (; PI != PE; ++PI)
802 // If the value isn't fully available in one of our predecessors, then it
803 // isn't fully available in this block either. Undo our previous
804 // optimistic assumption and bail out.
805 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattner72bc70d2008-12-05 07:49:08 +0000806 goto SpeculationFailure;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000807
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000808 return true;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000809
Chris Lattner72bc70d2008-12-05 07:49:08 +0000810// SpeculationFailure - If we get here, we found out that this is not, after
811// all, a fully-available block. We have a problem if we speculated on this and
812// used the speculation to mark other blocks as available.
813SpeculationFailure:
814 char &BBVal = FullyAvailableBlocks[BB];
Daniel Dunbara279bc32009-09-20 02:20:51 +0000815
Chris Lattner72bc70d2008-12-05 07:49:08 +0000816 // If we didn't speculate on this, just return with it set to false.
817 if (BBVal == 2) {
818 BBVal = 0;
819 return false;
820 }
821
822 // If we did speculate on this value, we could have blocks set to 1 that are
823 // incorrect. Walk the (transitive) successors of this block and mark them as
824 // 0 if set to one.
825 SmallVector<BasicBlock*, 32> BBWorklist;
826 BBWorklist.push_back(BB);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000827
Chris Lattner72bc70d2008-12-05 07:49:08 +0000828 while (!BBWorklist.empty()) {
829 BasicBlock *Entry = BBWorklist.pop_back_val();
830 // Note that this sets blocks to 0 (unavailable) if they happen to not
831 // already be in FullyAvailableBlocks. This is safe.
832 char &EntryVal = FullyAvailableBlocks[Entry];
833 if (EntryVal == 0) continue; // Already unavailable.
834
835 // Mark as unavailable.
836 EntryVal = 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000837
Chris Lattner72bc70d2008-12-05 07:49:08 +0000838 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
839 BBWorklist.push_back(*I);
840 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000841
Chris Lattner72bc70d2008-12-05 07:49:08 +0000842 return false;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000843}
844
Chris Lattner771a5422009-09-20 20:09:34 +0000845
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000846/// CanCoerceMustAliasedValueToLoad - Return true if
847/// CoerceAvailableValueToLoadType will succeed.
848static bool CanCoerceMustAliasedValueToLoad(Value *StoredVal,
849 const Type *LoadTy,
850 const TargetData &TD) {
851 // If the loaded or stored value is an first class array or struct, don't try
852 // to transform them. We need to be able to bitcast to integer.
853 if (isa<StructType>(LoadTy) || isa<ArrayType>(LoadTy) ||
854 isa<StructType>(StoredVal->getType()) ||
855 isa<ArrayType>(StoredVal->getType()))
856 return false;
857
858 // The store has to be at least as big as the load.
859 if (TD.getTypeSizeInBits(StoredVal->getType()) <
860 TD.getTypeSizeInBits(LoadTy))
861 return false;
862
863 return true;
864}
865
866
Chris Lattner771a5422009-09-20 20:09:34 +0000867/// CoerceAvailableValueToLoadType - If we saw a store of a value to memory, and
868/// then a load from a must-aliased pointer of a different type, try to coerce
869/// the stored value. LoadedTy is the type of the load we want to replace and
870/// InsertPt is the place to insert new instructions.
871///
872/// If we can't do it, return null.
873static Value *CoerceAvailableValueToLoadType(Value *StoredVal,
874 const Type *LoadedTy,
875 Instruction *InsertPt,
876 const TargetData &TD) {
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000877 if (!CanCoerceMustAliasedValueToLoad(StoredVal, LoadedTy, TD))
878 return 0;
879
Chris Lattner771a5422009-09-20 20:09:34 +0000880 const Type *StoredValTy = StoredVal->getType();
881
882 uint64_t StoreSize = TD.getTypeSizeInBits(StoredValTy);
883 uint64_t LoadSize = TD.getTypeSizeInBits(LoadedTy);
884
885 // If the store and reload are the same size, we can always reuse it.
886 if (StoreSize == LoadSize) {
887 if (isa<PointerType>(StoredValTy) && isa<PointerType>(LoadedTy)) {
888 // Pointer to Pointer -> use bitcast.
889 return new BitCastInst(StoredVal, LoadedTy, "", InsertPt);
890 }
891
892 // Convert source pointers to integers, which can be bitcast.
893 if (isa<PointerType>(StoredValTy)) {
894 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
895 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
896 }
897
898 const Type *TypeToCastTo = LoadedTy;
899 if (isa<PointerType>(TypeToCastTo))
900 TypeToCastTo = TD.getIntPtrType(StoredValTy->getContext());
901
902 if (StoredValTy != TypeToCastTo)
903 StoredVal = new BitCastInst(StoredVal, TypeToCastTo, "", InsertPt);
904
905 // Cast to pointer if the load needs a pointer type.
906 if (isa<PointerType>(LoadedTy))
907 StoredVal = new IntToPtrInst(StoredVal, LoadedTy, "", InsertPt);
908
909 return StoredVal;
910 }
911
912 // If the loaded value is smaller than the available value, then we can
913 // extract out a piece from it. If the available value is too small, then we
914 // can't do anything.
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000915 assert(StoreSize >= LoadSize && "CanCoerceMustAliasedValueToLoad fail");
Chris Lattner771a5422009-09-20 20:09:34 +0000916
917 // Convert source pointers to integers, which can be manipulated.
918 if (isa<PointerType>(StoredValTy)) {
919 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
920 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
921 }
922
923 // Convert vectors and fp to integer, which can be manipulated.
924 if (!isa<IntegerType>(StoredValTy)) {
925 StoredValTy = IntegerType::get(StoredValTy->getContext(), StoreSize);
926 StoredVal = new BitCastInst(StoredVal, StoredValTy, "", InsertPt);
927 }
928
929 // If this is a big-endian system, we need to shift the value down to the low
930 // bits so that a truncate will work.
931 if (TD.isBigEndian()) {
932 Constant *Val = ConstantInt::get(StoredVal->getType(), StoreSize-LoadSize);
933 StoredVal = BinaryOperator::CreateLShr(StoredVal, Val, "tmp", InsertPt);
934 }
935
936 // Truncate the integer to the right size now.
937 const Type *NewIntTy = IntegerType::get(StoredValTy->getContext(), LoadSize);
938 StoredVal = new TruncInst(StoredVal, NewIntTy, "trunc", InsertPt);
939
940 if (LoadedTy == NewIntTy)
941 return StoredVal;
942
943 // If the result is a pointer, inttoptr.
944 if (isa<PointerType>(LoadedTy))
945 return new IntToPtrInst(StoredVal, LoadedTy, "inttoptr", InsertPt);
946
947 // Otherwise, bitcast.
948 return new BitCastInst(StoredVal, LoadedTy, "bitcast", InsertPt);
949}
950
Chris Lattnerca749402009-09-21 06:24:16 +0000951/// GetBaseWithConstantOffset - Analyze the specified pointer to see if it can
952/// be expressed as a base pointer plus a constant offset. Return the base and
953/// offset to the caller.
954static Value *GetBaseWithConstantOffset(Value *Ptr, int64_t &Offset,
Chris Lattner4fbd14e2009-09-21 06:48:08 +0000955 const TargetData &TD) {
Chris Lattnerca749402009-09-21 06:24:16 +0000956 Operator *PtrOp = dyn_cast<Operator>(Ptr);
957 if (PtrOp == 0) return Ptr;
958
959 // Just look through bitcasts.
960 if (PtrOp->getOpcode() == Instruction::BitCast)
961 return GetBaseWithConstantOffset(PtrOp->getOperand(0), Offset, TD);
962
963 // If this is a GEP with constant indices, we can look through it.
964 GEPOperator *GEP = dyn_cast<GEPOperator>(PtrOp);
965 if (GEP == 0 || !GEP->hasAllConstantIndices()) return Ptr;
966
967 gep_type_iterator GTI = gep_type_begin(GEP);
968 for (User::op_iterator I = GEP->idx_begin(), E = GEP->idx_end(); I != E;
969 ++I, ++GTI) {
970 ConstantInt *OpC = cast<ConstantInt>(*I);
971 if (OpC->isZero()) continue;
972
973 // Handle a struct and array indices which add their offset to the pointer.
974 if (const StructType *STy = dyn_cast<StructType>(*GTI)) {
Chris Lattner4fbd14e2009-09-21 06:48:08 +0000975 Offset += TD.getStructLayout(STy)->getElementOffset(OpC->getZExtValue());
Chris Lattnerca749402009-09-21 06:24:16 +0000976 } else {
Chris Lattner4fbd14e2009-09-21 06:48:08 +0000977 uint64_t Size = TD.getTypeAllocSize(GTI.getIndexedType());
Chris Lattnerca749402009-09-21 06:24:16 +0000978 Offset += OpC->getSExtValue()*Size;
979 }
980 }
981
982 // Re-sign extend from the pointer size if needed to get overflow edge cases
983 // right.
Chris Lattner4fbd14e2009-09-21 06:48:08 +0000984 unsigned PtrSize = TD.getPointerSizeInBits();
Chris Lattnerca749402009-09-21 06:24:16 +0000985 if (PtrSize < 64)
986 Offset = (Offset << (64-PtrSize)) >> (64-PtrSize);
987
988 return GetBaseWithConstantOffset(GEP->getPointerOperand(), Offset, TD);
989}
990
991
Chris Lattnerfaf815b2009-12-06 01:57:02 +0000992/// AnalyzeLoadFromClobberingWrite - This function is called when we have a
993/// memdep query of a load that ends up being a clobbering memory write (store,
994/// memset, memcpy, memmove). This means that the write *may* provide bits used
995/// by the load but we can't be sure because the pointers don't mustalias.
996///
997/// Check this case to see if there is anything more we can do before we give
998/// up. This returns -1 if we have to give up, or a byte number in the stored
999/// value of the piece that feeds the load.
1000static int AnalyzeLoadFromClobberingWrite(LoadInst *L, Value *WritePtr,
1001 uint64_t WriteSizeInBits,
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001002 const TargetData &TD) {
Chris Lattner8b2bc3d2009-09-21 17:24:04 +00001003 // If the loaded or stored value is an first class array or struct, don't try
1004 // to transform them. We need to be able to bitcast to integer.
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001005 if (isa<StructType>(L->getType()) || isa<ArrayType>(L->getType()))
Chris Lattner8b2bc3d2009-09-21 17:24:04 +00001006 return -1;
1007
Chris Lattnerca749402009-09-21 06:24:16 +00001008 int64_t StoreOffset = 0, LoadOffset = 0;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001009 Value *StoreBase = GetBaseWithConstantOffset(WritePtr, StoreOffset, TD);
Chris Lattnerca749402009-09-21 06:24:16 +00001010 Value *LoadBase =
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001011 GetBaseWithConstantOffset(L->getPointerOperand(), LoadOffset, TD);
Chris Lattnerca749402009-09-21 06:24:16 +00001012 if (StoreBase != LoadBase)
1013 return -1;
1014
1015 // If the load and store are to the exact same address, they should have been
1016 // a must alias. AA must have gotten confused.
1017 // FIXME: Study to see if/when this happens.
1018 if (LoadOffset == StoreOffset) {
1019#if 0
1020 errs() << "STORE/LOAD DEP WITH COMMON POINTER MISSED:\n"
1021 << "Base = " << *StoreBase << "\n"
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001022 << "Store Ptr = " << *WritePtr << "\n"
1023 << "Store Offs = " << StoreOffset << "\n"
Chris Lattnerca749402009-09-21 06:24:16 +00001024 << "Load Ptr = " << *L->getPointerOperand() << "\n"
1025 << "Load Offs = " << LoadOffset << " - " << *L << "\n\n";
1026 errs() << "'" << L->getParent()->getParent()->getName() << "'"
1027 << *L->getParent();
1028#endif
1029 return -1;
1030 }
1031
1032 // If the load and store don't overlap at all, the store doesn't provide
1033 // anything to the load. In this case, they really don't alias at all, AA
1034 // must have gotten confused.
1035 // FIXME: Investigate cases where this bails out, e.g. rdar://7238614. Then
1036 // remove this check, as it is duplicated with what we have below.
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001037 uint64_t LoadSize = TD.getTypeSizeInBits(L->getType());
Chris Lattnerca749402009-09-21 06:24:16 +00001038
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001039 if ((WriteSizeInBits & 7) | (LoadSize & 7))
Chris Lattnerca749402009-09-21 06:24:16 +00001040 return -1;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001041 uint64_t StoreSize = WriteSizeInBits >> 3; // Convert to bytes.
Chris Lattnerca749402009-09-21 06:24:16 +00001042 LoadSize >>= 3;
1043
1044
1045 bool isAAFailure = false;
1046 if (StoreOffset < LoadOffset) {
1047 isAAFailure = StoreOffset+int64_t(StoreSize) <= LoadOffset;
1048 } else {
1049 isAAFailure = LoadOffset+int64_t(LoadSize) <= StoreOffset;
1050 }
1051 if (isAAFailure) {
1052#if 0
1053 errs() << "STORE LOAD DEP WITH COMMON BASE:\n"
1054 << "Base = " << *StoreBase << "\n"
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001055 << "Store Ptr = " << *WritePtr << "\n"
1056 << "Store Offs = " << StoreOffset << "\n"
Chris Lattnerca749402009-09-21 06:24:16 +00001057 << "Load Ptr = " << *L->getPointerOperand() << "\n"
1058 << "Load Offs = " << LoadOffset << " - " << *L << "\n\n";
1059 errs() << "'" << L->getParent()->getParent()->getName() << "'"
1060 << *L->getParent();
1061#endif
1062 return -1;
1063 }
1064
1065 // If the Load isn't completely contained within the stored bits, we don't
1066 // have all the bits to feed it. We could do something crazy in the future
1067 // (issue a smaller load then merge the bits in) but this seems unlikely to be
1068 // valuable.
1069 if (StoreOffset > LoadOffset ||
1070 StoreOffset+StoreSize < LoadOffset+LoadSize)
1071 return -1;
1072
1073 // Okay, we can do this transformation. Return the number of bytes into the
1074 // store that the load is.
1075 return LoadOffset-StoreOffset;
1076}
1077
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001078/// AnalyzeLoadFromClobberingStore - This function is called when we have a
1079/// memdep query of a load that ends up being a clobbering store.
1080static int AnalyzeLoadFromClobberingStore(LoadInst *L, StoreInst *DepSI,
1081 const TargetData &TD) {
1082 // Cannot handle reading from store of first-class aggregate yet.
1083 if (isa<StructType>(DepSI->getOperand(0)->getType()) ||
1084 isa<ArrayType>(DepSI->getOperand(0)->getType()))
1085 return -1;
1086
1087 Value *StorePtr = DepSI->getPointerOperand();
1088 uint64_t StoreSize = TD.getTypeSizeInBits(StorePtr->getType());
1089 return AnalyzeLoadFromClobberingWrite(L, StorePtr, StoreSize, TD);
1090}
1091
1092static int AnalyzeLoadFromClobberingMemInst(LoadInst *L, MemIntrinsic *MI,
1093 const TargetData &TD) {
1094 // If the mem operation is a non-constant size, we can't handle it.
1095 ConstantInt *SizeCst = dyn_cast<ConstantInt>(MI->getLength());
1096 if (SizeCst == 0) return -1;
1097 uint64_t MemSizeInBits = SizeCst->getZExtValue()*8;
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001098
1099 // If this is memset, we just need to see if the offset is valid in the size
1100 // of the memset..
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001101 if (MI->getIntrinsicID() == Intrinsic::memset)
1102 return AnalyzeLoadFromClobberingWrite(L, MI->getDest(), MemSizeInBits, TD);
1103
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001104 // If we have a memcpy/memmove, the only case we can handle is if this is a
1105 // copy from constant memory. In that case, we can read directly from the
1106 // constant memory.
1107 MemTransferInst *MTI = cast<MemTransferInst>(MI);
1108
1109 Constant *Src = dyn_cast<Constant>(MTI->getSource());
1110 if (Src == 0) return -1;
1111
1112 GlobalVariable *GV = dyn_cast<GlobalVariable>(Src->getUnderlyingObject());
1113 if (GV == 0 || !GV->isConstant()) return -1;
1114
1115 // See if the access is within the bounds of the transfer.
1116 int Offset =
1117 AnalyzeLoadFromClobberingWrite(L, MI->getDest(), MemSizeInBits, TD);
1118 if (Offset == -1)
1119 return Offset;
1120
1121 // Otherwise, see if we can constant fold a load from the constant with the
1122 // offset applied as appropriate.
1123 Src = ConstantExpr::getBitCast(Src,
1124 llvm::Type::getInt8PtrTy(Src->getContext()));
1125 Constant *OffsetCst =
1126 ConstantInt::get(Type::getInt64Ty(Src->getContext()), (unsigned)Offset);
1127 Src = ConstantExpr::getGetElementPtr(Src, &OffsetCst, 1);
1128 Src = ConstantExpr::getBitCast(Src, PointerType::getUnqual(L->getType()));
1129 if (ConstantFoldLoadFromConstPtr(Src, &TD))
1130 return Offset;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001131 return -1;
1132}
1133
Chris Lattnerca749402009-09-21 06:24:16 +00001134
1135/// GetStoreValueForLoad - This function is called when we have a
1136/// memdep query of a load that ends up being a clobbering store. This means
1137/// that the store *may* provide bits used by the load but we can't be sure
1138/// because the pointers don't mustalias. Check this case to see if there is
1139/// anything more we can do before we give up.
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001140static Value *GetStoreValueForLoad(Value *SrcVal, unsigned Offset,
1141 const Type *LoadTy,
1142 Instruction *InsertPt, const TargetData &TD){
Chris Lattnerca749402009-09-21 06:24:16 +00001143 LLVMContext &Ctx = SrcVal->getType()->getContext();
1144
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001145 uint64_t StoreSize = TD.getTypeSizeInBits(SrcVal->getType())/8;
1146 uint64_t LoadSize = TD.getTypeSizeInBits(LoadTy)/8;
Chris Lattnerca749402009-09-21 06:24:16 +00001147
1148
1149 // Compute which bits of the stored value are being used by the load. Convert
1150 // to an integer type to start with.
1151 if (isa<PointerType>(SrcVal->getType()))
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001152 SrcVal = new PtrToIntInst(SrcVal, TD.getIntPtrType(Ctx), "tmp", InsertPt);
Chris Lattnerca749402009-09-21 06:24:16 +00001153 if (!isa<IntegerType>(SrcVal->getType()))
1154 SrcVal = new BitCastInst(SrcVal, IntegerType::get(Ctx, StoreSize*8),
1155 "tmp", InsertPt);
1156
1157 // Shift the bits to the least significant depending on endianness.
1158 unsigned ShiftAmt;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001159 if (TD.isLittleEndian())
Chris Lattnerca749402009-09-21 06:24:16 +00001160 ShiftAmt = Offset*8;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001161 else
Chris Lattner19ad7842009-09-21 17:55:47 +00001162 ShiftAmt = (StoreSize-LoadSize-Offset)*8;
Chris Lattnerca749402009-09-21 06:24:16 +00001163
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001164 if (ShiftAmt)
1165 SrcVal = BinaryOperator::CreateLShr(SrcVal,
1166 ConstantInt::get(SrcVal->getType(), ShiftAmt), "tmp", InsertPt);
Chris Lattnerca749402009-09-21 06:24:16 +00001167
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001168 if (LoadSize != StoreSize)
1169 SrcVal = new TruncInst(SrcVal, IntegerType::get(Ctx, LoadSize*8),
1170 "tmp", InsertPt);
Chris Lattnerca749402009-09-21 06:24:16 +00001171
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001172 return CoerceAvailableValueToLoadType(SrcVal, LoadTy, InsertPt, TD);
Chris Lattnerca749402009-09-21 06:24:16 +00001173}
1174
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001175/// GetMemInstValueForLoad - This function is called when we have a
1176/// memdep query of a load that ends up being a clobbering mem intrinsic.
1177static Value *GetMemInstValueForLoad(MemIntrinsic *SrcInst, unsigned Offset,
1178 const Type *LoadTy, Instruction *InsertPt,
1179 const TargetData &TD){
1180 LLVMContext &Ctx = LoadTy->getContext();
1181 uint64_t LoadSize = TD.getTypeSizeInBits(LoadTy)/8;
1182
1183 IRBuilder<> Builder(InsertPt->getParent(), InsertPt);
1184
1185 // We know that this method is only called when the mem transfer fully
1186 // provides the bits for the load.
1187 if (MemSetInst *MSI = dyn_cast<MemSetInst>(SrcInst)) {
1188 // memset(P, 'x', 1234) -> splat('x'), even if x is a variable, and
1189 // independently of what the offset is.
1190 Value *Val = MSI->getValue();
1191 if (LoadSize != 1)
1192 Val = Builder.CreateZExt(Val, IntegerType::get(Ctx, LoadSize*8));
1193
1194 Value *OneElt = Val;
1195
1196 // Splat the value out to the right number of bits.
1197 for (unsigned NumBytesSet = 1; NumBytesSet != LoadSize; ) {
1198 // If we can double the number of bytes set, do it.
1199 if (NumBytesSet*2 <= LoadSize) {
1200 Value *ShVal = Builder.CreateShl(Val, NumBytesSet*8);
1201 Val = Builder.CreateOr(Val, ShVal);
1202 NumBytesSet <<= 1;
1203 continue;
1204 }
1205
1206 // Otherwise insert one byte at a time.
1207 Value *ShVal = Builder.CreateShl(Val, 1*8);
1208 Val = Builder.CreateOr(OneElt, ShVal);
1209 ++NumBytesSet;
1210 }
1211
1212 return CoerceAvailableValueToLoadType(Val, LoadTy, InsertPt, TD);
1213 }
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001214
1215 // Otherwise, this is a memcpy/memmove from a constant global.
1216 MemTransferInst *MTI = cast<MemTransferInst>(SrcInst);
1217 Constant *Src = cast<Constant>(MTI->getSource());
1218
1219 // Otherwise, see if we can constant fold a load from the constant with the
1220 // offset applied as appropriate.
1221 Src = ConstantExpr::getBitCast(Src,
1222 llvm::Type::getInt8PtrTy(Src->getContext()));
1223 Constant *OffsetCst =
1224 ConstantInt::get(Type::getInt64Ty(Src->getContext()), (unsigned)Offset);
1225 Src = ConstantExpr::getGetElementPtr(Src, &OffsetCst, 1);
1226 Src = ConstantExpr::getBitCast(Src, PointerType::getUnqual(LoadTy));
1227 return ConstantFoldLoadFromConstPtr(Src, &TD);
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001228}
1229
1230
1231
Chris Lattner87913512009-09-21 06:30:24 +00001232struct AvailableValueInBlock {
1233 /// BB - The basic block in question.
1234 BasicBlock *BB;
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001235 enum ValType {
1236 SimpleVal, // A simple offsetted value that is accessed.
1237 MemIntrin // A memory intrinsic which is loaded from.
1238 };
1239
Chris Lattner87913512009-09-21 06:30:24 +00001240 /// V - The value that is live out of the block.
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001241 PointerIntPair<Value *, 1, ValType> Val;
1242
1243 /// Offset - The byte offset in Val that is interesting for the load query.
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001244 unsigned Offset;
Chris Lattner87913512009-09-21 06:30:24 +00001245
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001246 static AvailableValueInBlock get(BasicBlock *BB, Value *V,
1247 unsigned Offset = 0) {
Chris Lattner87913512009-09-21 06:30:24 +00001248 AvailableValueInBlock Res;
1249 Res.BB = BB;
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001250 Res.Val.setPointer(V);
1251 Res.Val.setInt(SimpleVal);
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001252 Res.Offset = Offset;
Chris Lattner87913512009-09-21 06:30:24 +00001253 return Res;
1254 }
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001255
1256 static AvailableValueInBlock getMI(BasicBlock *BB, MemIntrinsic *MI,
1257 unsigned Offset = 0) {
1258 AvailableValueInBlock Res;
1259 Res.BB = BB;
1260 Res.Val.setPointer(MI);
1261 Res.Val.setInt(MemIntrin);
1262 Res.Offset = Offset;
1263 return Res;
1264 }
1265
1266 bool isSimpleValue() const { return Val.getInt() == SimpleVal; }
1267 Value *getSimpleValue() const {
1268 assert(isSimpleValue() && "Wrong accessor");
1269 return Val.getPointer();
1270 }
1271
1272 MemIntrinsic *getMemIntrinValue() const {
1273 assert(!isSimpleValue() && "Wrong accessor");
1274 return cast<MemIntrinsic>(Val.getPointer());
1275 }
Chris Lattner87913512009-09-21 06:30:24 +00001276};
1277
Chris Lattnera09fbf02009-10-10 23:50:30 +00001278/// ConstructSSAForLoadSet - Given a set of loads specified by ValuesPerBlock,
1279/// construct SSA form, allowing us to eliminate LI. This returns the value
1280/// that should be used at LI's definition site.
1281static Value *ConstructSSAForLoadSet(LoadInst *LI,
1282 SmallVectorImpl<AvailableValueInBlock> &ValuesPerBlock,
1283 const TargetData *TD,
1284 AliasAnalysis *AA) {
1285 SmallVector<PHINode*, 8> NewPHIs;
1286 SSAUpdater SSAUpdate(&NewPHIs);
1287 SSAUpdate.Initialize(LI);
1288
1289 const Type *LoadTy = LI->getType();
1290
Chris Lattner771a5422009-09-20 20:09:34 +00001291 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i) {
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001292 const AvailableValueInBlock &AV = ValuesPerBlock[i];
1293 BasicBlock *BB = AV.BB;
Chris Lattner771a5422009-09-20 20:09:34 +00001294
Chris Lattnera09fbf02009-10-10 23:50:30 +00001295 if (SSAUpdate.HasValueForBlock(BB))
1296 continue;
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001297
1298 unsigned Offset = AV.Offset;
1299
1300 Value *AvailableVal;
1301 if (AV.isSimpleValue()) {
1302 AvailableVal = AV.getSimpleValue();
1303 if (AvailableVal->getType() != LoadTy) {
1304 assert(TD && "Need target data to handle type mismatch case");
1305 AvailableVal = GetStoreValueForLoad(AvailableVal, Offset, LoadTy,
1306 BB->getTerminator(), *TD);
1307
1308 DEBUG(errs() << "GVN COERCED NONLOCAL VAL:\nOffset: " << Offset << " "
1309 << *AV.getSimpleValue() << '\n'
Chris Lattnera09fbf02009-10-10 23:50:30 +00001310 << *AvailableVal << '\n' << "\n\n\n");
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001311 }
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001312 } else {
1313 AvailableVal = GetMemInstValueForLoad(AV.getMemIntrinValue(), Offset,
1314 LoadTy, BB->getTerminator(), *TD);
1315 DEBUG(errs() << "GVN COERCED NONLOCAL MEM INTRIN:\nOffset: " << Offset
1316 << " " << *AV.getMemIntrinValue() << '\n'
Chris Lattnera09fbf02009-10-10 23:50:30 +00001317 << *AvailableVal << '\n' << "\n\n\n");
Chris Lattner771a5422009-09-20 20:09:34 +00001318 }
Chris Lattnera09fbf02009-10-10 23:50:30 +00001319 SSAUpdate.AddAvailableValue(BB, AvailableVal);
Chris Lattner771a5422009-09-20 20:09:34 +00001320 }
Chris Lattnera09fbf02009-10-10 23:50:30 +00001321
1322 // Perform PHI construction.
1323 Value *V = SSAUpdate.GetValueInMiddleOfBlock(LI->getParent());
1324
1325 // If new PHI nodes were created, notify alias analysis.
1326 if (isa<PointerType>(V->getType()))
1327 for (unsigned i = 0, e = NewPHIs.size(); i != e; ++i)
1328 AA->copyValue(LI, NewPHIs[i]);
1329
1330 return V;
Chris Lattner771a5422009-09-20 20:09:34 +00001331}
1332
Owen Anderson9ff5a232009-12-02 07:35:19 +00001333static bool isLifetimeStart(Instruction *Inst) {
Chris Lattner720e7902009-12-02 06:44:58 +00001334 if (IntrinsicInst* II = dyn_cast<IntrinsicInst>(Inst))
Owen Anderson9ff5a232009-12-02 07:35:19 +00001335 return II->getIntrinsicID() == Intrinsic::lifetime_start;
Chris Lattner720e7902009-12-02 06:44:58 +00001336 return false;
1337}
1338
Owen Anderson62bc33c2007-08-16 22:02:55 +00001339/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
1340/// non-local by performing PHI construction.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001341bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001342 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001343 // Find the non-local dependencies of the load.
Daniel Dunbara279bc32009-09-20 02:20:51 +00001344 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
Chris Lattner91bcf642008-12-09 19:25:07 +00001345 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
1346 Deps);
Dan Gohman2a298992009-07-31 20:24:18 +00001347 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: "
1348 // << Deps.size() << *LI << '\n');
Daniel Dunbara279bc32009-09-20 02:20:51 +00001349
Owen Anderson516eb1c2008-08-26 22:07:42 +00001350 // If we had to process more than one hundred blocks to find the
1351 // dependencies, this load isn't worth worrying about. Optimizing
1352 // it will be too expensive.
Chris Lattner91bcf642008-12-09 19:25:07 +00001353 if (Deps.size() > 100)
Owen Anderson516eb1c2008-08-26 22:07:42 +00001354 return false;
Chris Lattner5f4f84b2008-12-18 00:51:32 +00001355
1356 // If we had a phi translation failure, we'll have a single entry which is a
1357 // clobber in the current block. Reject this early.
Torok Edwin4306b1a2009-06-17 18:48:18 +00001358 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
1359 DEBUG(
Dan Gohmanfd87a542009-07-25 01:43:01 +00001360 errs() << "GVN: non-local load ";
1361 WriteAsOperand(errs(), LI);
Dan Gohman2a298992009-07-31 20:24:18 +00001362 errs() << " is clobbered by " << *Deps[0].second.getInst() << '\n';
Torok Edwin4306b1a2009-06-17 18:48:18 +00001363 );
Chris Lattner5f4f84b2008-12-18 00:51:32 +00001364 return false;
Torok Edwin4306b1a2009-06-17 18:48:18 +00001365 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001366
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001367 // Filter out useless results (non-locals, etc). Keep track of the blocks
1368 // where we have a value available in repl, also keep track of whether we see
1369 // dependencies that produce an unknown value for the load (such as a call
1370 // that could potentially clobber the load).
Chris Lattner87913512009-09-21 06:30:24 +00001371 SmallVector<AvailableValueInBlock, 16> ValuesPerBlock;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001372 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001373
Chris Lattner771a5422009-09-20 20:09:34 +00001374 const TargetData *TD = 0;
1375
Chris Lattner91bcf642008-12-09 19:25:07 +00001376 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
1377 BasicBlock *DepBB = Deps[i].first;
1378 MemDepResult DepInfo = Deps[i].second;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001379
Chris Lattnerb51deb92008-12-05 21:04:20 +00001380 if (DepInfo.isClobber()) {
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001381 // If the dependence is to a store that writes to a superset of the bits
1382 // read by the load, we can extract the bits we need for the load from the
1383 // stored value.
1384 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInfo.getInst())) {
1385 if (TD == 0)
1386 TD = getAnalysisIfAvailable<TargetData>();
1387 if (TD) {
1388 int Offset = AnalyzeLoadFromClobberingStore(LI, DepSI, *TD);
1389 if (Offset != -1) {
1390 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
1391 DepSI->getOperand(0),
1392 Offset));
1393 continue;
1394 }
1395 }
1396 }
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001397
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001398 // If the clobbering value is a memset/memcpy/memmove, see if we can
1399 // forward a value on from it.
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001400 if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(DepInfo.getInst())) {
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001401 if (TD == 0)
1402 TD = getAnalysisIfAvailable<TargetData>();
1403 if (TD) {
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001404 int Offset = AnalyzeLoadFromClobberingMemInst(LI, DepMI, *TD);
1405 if (Offset != -1) {
1406 ValuesPerBlock.push_back(AvailableValueInBlock::getMI(DepBB, DepMI,
1407 Offset));
1408 continue;
1409 }
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001410 }
1411 }
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001412
Chris Lattnerb51deb92008-12-05 21:04:20 +00001413 UnavailableBlocks.push_back(DepBB);
1414 continue;
1415 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001416
Chris Lattnerb51deb92008-12-05 21:04:20 +00001417 Instruction *DepInst = DepInfo.getInst();
Daniel Dunbara279bc32009-09-20 02:20:51 +00001418
Chris Lattnerb51deb92008-12-05 21:04:20 +00001419 // Loading the allocation -> undef.
Chris Lattner720e7902009-12-02 06:44:58 +00001420 if (isa<AllocaInst>(DepInst) || isMalloc(DepInst) ||
Owen Anderson9ff5a232009-12-02 07:35:19 +00001421 // Loading immediately after lifetime begin -> undef.
1422 isLifetimeStart(DepInst)) {
Chris Lattner87913512009-09-21 06:30:24 +00001423 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
1424 UndefValue::get(LI->getType())));
Chris Lattnerbf145d62008-12-01 01:15:42 +00001425 continue;
1426 }
Owen Andersonb62f7922009-10-28 07:05:35 +00001427
Chris Lattner87913512009-09-21 06:30:24 +00001428 if (StoreInst *S = dyn_cast<StoreInst>(DepInst)) {
Daniel Dunbara279bc32009-09-20 02:20:51 +00001429 // Reject loads and stores that are to the same address but are of
Chris Lattner771a5422009-09-20 20:09:34 +00001430 // different types if we have to.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001431 if (S->getOperand(0)->getType() != LI->getType()) {
Chris Lattner771a5422009-09-20 20:09:34 +00001432 if (TD == 0)
1433 TD = getAnalysisIfAvailable<TargetData>();
1434
1435 // If the stored value is larger or equal to the loaded value, we can
1436 // reuse it.
Chris Lattner8b2bc3d2009-09-21 17:24:04 +00001437 if (TD == 0 || !CanCoerceMustAliasedValueToLoad(S->getOperand(0),
1438 LI->getType(), *TD)) {
Chris Lattner771a5422009-09-20 20:09:34 +00001439 UnavailableBlocks.push_back(DepBB);
1440 continue;
1441 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001442 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001443
Chris Lattner87913512009-09-21 06:30:24 +00001444 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
1445 S->getOperand(0)));
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001446 continue;
1447 }
1448
1449 if (LoadInst *LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner771a5422009-09-20 20:09:34 +00001450 // If the types mismatch and we can't handle it, reject reuse of the load.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001451 if (LD->getType() != LI->getType()) {
Chris Lattner771a5422009-09-20 20:09:34 +00001452 if (TD == 0)
1453 TD = getAnalysisIfAvailable<TargetData>();
1454
1455 // If the stored value is larger or equal to the loaded value, we can
1456 // reuse it.
Chris Lattner8b2bc3d2009-09-21 17:24:04 +00001457 if (TD == 0 || !CanCoerceMustAliasedValueToLoad(LD, LI->getType(),*TD)){
Chris Lattner771a5422009-09-20 20:09:34 +00001458 UnavailableBlocks.push_back(DepBB);
1459 continue;
1460 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001461 }
Chris Lattner87913512009-09-21 06:30:24 +00001462 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB, LD));
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001463 continue;
Owen Anderson0cd32032007-07-25 19:57:03 +00001464 }
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001465
1466 UnavailableBlocks.push_back(DepBB);
1467 continue;
Chris Lattner88365bb2008-03-21 21:14:38 +00001468 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001469
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001470 // If we have no predecessors that produce a known value for this load, exit
1471 // early.
1472 if (ValuesPerBlock.empty()) return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001473
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001474 // If all of the instructions we depend on produce a known value for this
1475 // load, then it is fully redundant and we can use PHI insertion to compute
1476 // its value. Insert PHIs and remove the fully redundant value now.
1477 if (UnavailableBlocks.empty()) {
Dan Gohman2a298992009-07-31 20:24:18 +00001478 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Chris Lattner771a5422009-09-20 20:09:34 +00001479
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001480 // Perform PHI construction.
Chris Lattnera09fbf02009-10-10 23:50:30 +00001481 Value *V = ConstructSSAForLoadSet(LI, ValuesPerBlock, TD,
1482 VN.getAliasAnalysis());
Chris Lattner771a5422009-09-20 20:09:34 +00001483 LI->replaceAllUsesWith(V);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001484
Chris Lattner771a5422009-09-20 20:09:34 +00001485 if (isa<PHINode>(V))
1486 V->takeName(LI);
1487 if (isa<PointerType>(V->getType()))
1488 MD->invalidateCachedPointerInfo(V);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001489 toErase.push_back(LI);
1490 NumGVNLoad++;
1491 return true;
1492 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001493
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001494 if (!EnablePRE || !EnableLoadPRE)
1495 return false;
1496
1497 // Okay, we have *some* definitions of the value. This means that the value
1498 // is available in some of our (transitive) predecessors. Lets think about
1499 // doing PRE of this load. This will involve inserting a new load into the
1500 // predecessor when it's not available. We could do this in general, but
1501 // prefer to not increase code size. As such, we only do this when we know
1502 // that we only have to insert *one* load (which means we're basically moving
1503 // the load, not inserting a new one).
Daniel Dunbara279bc32009-09-20 02:20:51 +00001504
Owen Anderson88554df2009-05-31 09:03:40 +00001505 SmallPtrSet<BasicBlock *, 4> Blockers;
1506 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1507 Blockers.insert(UnavailableBlocks[i]);
1508
1509 // Lets find first basic block with more than one predecessor. Walk backwards
1510 // through predecessors if needed.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001511 BasicBlock *LoadBB = LI->getParent();
Owen Anderson88554df2009-05-31 09:03:40 +00001512 BasicBlock *TmpBB = LoadBB;
1513
1514 bool isSinglePred = false;
Dale Johannesen42c3f552009-06-17 20:48:23 +00001515 bool allSingleSucc = true;
Owen Anderson88554df2009-05-31 09:03:40 +00001516 while (TmpBB->getSinglePredecessor()) {
1517 isSinglePred = true;
1518 TmpBB = TmpBB->getSinglePredecessor();
1519 if (!TmpBB) // If haven't found any, bail now.
1520 return false;
1521 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1522 return false;
1523 if (Blockers.count(TmpBB))
1524 return false;
Dale Johannesen42c3f552009-06-17 20:48:23 +00001525 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1526 allSingleSucc = false;
Owen Anderson88554df2009-05-31 09:03:40 +00001527 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001528
Owen Anderson88554df2009-05-31 09:03:40 +00001529 assert(TmpBB);
1530 LoadBB = TmpBB;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001531
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001532 // If we have a repl set with LI itself in it, this means we have a loop where
1533 // at least one of the values is LI. Since this means that we won't be able
1534 // to eliminate LI even if we insert uses in the other predecessors, we will
1535 // end up increasing code size. Reject this by scanning for LI.
1536 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001537 if (ValuesPerBlock[i].isSimpleValue() &&
1538 ValuesPerBlock[i].getSimpleValue() == LI)
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001539 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001540
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001541 // FIXME: It is extremely unclear what this loop is doing, other than
1542 // artificially restricting loadpre.
Owen Anderson88554df2009-05-31 09:03:40 +00001543 if (isSinglePred) {
1544 bool isHot = false;
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001545 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i) {
1546 const AvailableValueInBlock &AV = ValuesPerBlock[i];
1547 if (AV.isSimpleValue())
Daniel Dunbara279bc32009-09-20 02:20:51 +00001548 // "Hot" Instruction is in some loop (because it dominates its dep.
1549 // instruction).
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001550 if (Instruction *I = dyn_cast<Instruction>(AV.getSimpleValue()))
1551 if (DT->dominates(LI, I)) {
1552 isHot = true;
1553 break;
1554 }
1555 }
Owen Anderson88554df2009-05-31 09:03:40 +00001556
1557 // We are interested only in "hot" instructions. We don't want to do any
1558 // mis-optimizations here.
1559 if (!isHot)
1560 return false;
1561 }
1562
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001563 // Okay, we have some hope :). Check to see if the loaded value is fully
1564 // available in all but one predecessor.
1565 // FIXME: If we could restructure the CFG, we could make a common pred with
1566 // all the preds that don't have an available LI and insert a new load into
1567 // that one block.
1568 BasicBlock *UnavailablePred = 0;
1569
Chris Lattner72bc70d2008-12-05 07:49:08 +00001570 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001571 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
Chris Lattner87913512009-09-21 06:30:24 +00001572 FullyAvailableBlocks[ValuesPerBlock[i].BB] = true;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001573 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1574 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1575
1576 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1577 PI != E; ++PI) {
1578 if (IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
1579 continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001580
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001581 // If this load is not available in multiple predecessors, reject it.
1582 if (UnavailablePred && UnavailablePred != *PI)
1583 return false;
1584 UnavailablePred = *PI;
1585 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001586
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001587 assert(UnavailablePred != 0 &&
1588 "Fully available value should be eliminated above!");
Daniel Dunbara279bc32009-09-20 02:20:51 +00001589
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001590 // We don't currently handle critical edges :(
1591 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbarce63ffb2009-07-25 00:23:56 +00001592 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
Dan Gohman2a298992009-07-31 20:24:18 +00001593 << UnavailablePred->getName() << "': " << *LI << '\n');
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001594 return false;
Owen Andersona37226a2007-08-07 23:12:31 +00001595 }
Chris Lattner616613d2009-11-27 08:25:10 +00001596
Chris Lattner6f7b2102009-11-27 22:05:15 +00001597 // Do PHI translation to get its value in the predecessor if necessary. The
1598 // returned pointer (if non-null) is guaranteed to dominate UnavailablePred.
1599 //
1600 // FIXME: This may insert a computation, but we don't tell scalar GVN
1601 // optimization stuff about it. How do we do this?
Chris Lattnerdd696052009-11-28 15:39:14 +00001602 SmallVector<Instruction*, 8> NewInsts;
Chris Lattner0c264b12009-11-28 16:08:18 +00001603 Value *LoadPtr = 0;
Chris Lattner971fd572009-11-27 22:50:07 +00001604
Chris Lattner0c264b12009-11-28 16:08:18 +00001605 // If all preds have a single successor, then we know it is safe to insert the
1606 // load on the pred (?!?), so we can insert code to materialize the pointer if
1607 // it is not available.
1608 if (allSingleSucc) {
1609 LoadPtr = MD->InsertPHITranslatedPointer(LI->getOperand(0), LoadBB,
1610 UnavailablePred, TD, *DT,NewInsts);
1611 } else {
1612 LoadPtr = MD->GetAvailablePHITranslatedValue(LI->getOperand(0), LoadBB,
1613 UnavailablePred, TD, *DT);
1614 }
Owen Andersonc9f20272009-12-03 03:43:29 +00001615
1616 // Assign value numbers to these new instructions.
1617 for (SmallVector<Instruction*, 8>::iterator NI = NewInsts.begin(),
1618 NE = NewInsts.end(); NI != NE; ++NI) {
1619 // FIXME: We really _ought_ to insert these value numbers into their
1620 // parent's availability map. However, in doing so, we risk getting into
1621 // ordering issues. If a block hasn't been processed yet, we would be
1622 // marking a value as AVAIL-IN, which isn't what we intend.
1623 VN.lookup_or_add(*NI);
1624 }
Chris Lattner0c264b12009-11-28 16:08:18 +00001625
Chris Lattner6f7b2102009-11-27 22:05:15 +00001626 // If we couldn't find or insert a computation of this phi translated value,
1627 // we fail PRE.
Chris Lattner616613d2009-11-27 08:25:10 +00001628 if (LoadPtr == 0) {
Chris Lattner6f7b2102009-11-27 22:05:15 +00001629 DEBUG(errs() << "COULDN'T INSERT PHI TRANSLATED VALUE OF: "
1630 << *LI->getOperand(0) << "\n");
1631 return false;
Chris Lattner616613d2009-11-27 08:25:10 +00001632 }
1633
Dale Johannesen42c3f552009-06-17 20:48:23 +00001634 // Make sure it is valid to move this load here. We have to watch out for:
1635 // @1 = getelementptr (i8* p, ...
1636 // test p and branch if == 0
1637 // load @1
1638 // It is valid to have the getelementptr before the test, even if p can be 0,
1639 // as getelementptr only does address arithmetic.
1640 // If we are not pushing the value through any multiple-successor blocks
1641 // we do not have this case. Otherwise, check that the load is safe to
1642 // put anywhere; this can be improved, but should be conservatively safe.
1643 if (!allSingleSucc &&
Chris Lattnerdd696052009-11-28 15:39:14 +00001644 // FIXME: REEVALUTE THIS.
Chris Lattner0c264b12009-11-28 16:08:18 +00001645 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator())) {
1646 assert(NewInsts.empty() && "Should not have inserted instructions");
Dale Johannesen42c3f552009-06-17 20:48:23 +00001647 return false;
Chris Lattner0c264b12009-11-28 16:08:18 +00001648 }
Dale Johannesen42c3f552009-06-17 20:48:23 +00001649
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001650 // Okay, we can eliminate this load by inserting a reload in the predecessor
1651 // and using PHI construction to get the value in the other predecessors, do
1652 // it.
Dan Gohman2a298992009-07-31 20:24:18 +00001653 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Chris Lattner0c264b12009-11-28 16:08:18 +00001654 DEBUG(if (!NewInsts.empty())
1655 errs() << "INSERTED " << NewInsts.size() << " INSTS: "
1656 << *NewInsts.back() << '\n');
1657
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001658 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1659 LI->getAlignment(),
1660 UnavailablePred->getTerminator());
Daniel Dunbara279bc32009-09-20 02:20:51 +00001661
Chris Lattnera09fbf02009-10-10 23:50:30 +00001662 // Add the newly created load.
1663 ValuesPerBlock.push_back(AvailableValueInBlock::get(UnavailablePred,NewLoad));
Daniel Dunbara279bc32009-09-20 02:20:51 +00001664
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001665 // Perform PHI construction.
Chris Lattnera09fbf02009-10-10 23:50:30 +00001666 Value *V = ConstructSSAForLoadSet(LI, ValuesPerBlock, TD,
1667 VN.getAliasAnalysis());
Chris Lattner771a5422009-09-20 20:09:34 +00001668 LI->replaceAllUsesWith(V);
1669 if (isa<PHINode>(V))
1670 V->takeName(LI);
1671 if (isa<PointerType>(V->getType()))
1672 MD->invalidateCachedPointerInfo(V);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001673 toErase.push_back(LI);
1674 NumPRELoad++;
Owen Anderson0cd32032007-07-25 19:57:03 +00001675 return true;
1676}
1677
Owen Anderson62bc33c2007-08-16 22:02:55 +00001678/// processLoad - Attempt to eliminate a load, first by eliminating it
1679/// locally, and then attempting non-local elimination if that fails.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001680bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
Dan Gohman4ec01b22009-11-14 02:27:51 +00001681 if (!MD)
1682 return false;
1683
Chris Lattnerb51deb92008-12-05 21:04:20 +00001684 if (L->isVolatile())
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001685 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001686
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001687 // ... to a pointer that has been loaded from before...
Chris Lattnerb2412a82009-09-21 02:42:51 +00001688 MemDepResult Dep = MD->getDependency(L);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001689
Chris Lattnerb51deb92008-12-05 21:04:20 +00001690 // If the value isn't available, don't do anything!
Chris Lattnerb2412a82009-09-21 02:42:51 +00001691 if (Dep.isClobber()) {
Chris Lattnereed919b2009-09-21 05:57:11 +00001692 // Check to see if we have something like this:
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001693 // store i32 123, i32* %P
1694 // %A = bitcast i32* %P to i8*
1695 // %B = gep i8* %A, i32 1
1696 // %C = load i8* %B
1697 //
1698 // We could do that by recognizing if the clobber instructions are obviously
1699 // a common base + constant offset, and if the previous store (or memset)
1700 // completely covers this load. This sort of thing can happen in bitfield
1701 // access code.
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001702 Value *AvailVal = 0;
Chris Lattnereed919b2009-09-21 05:57:11 +00001703 if (StoreInst *DepSI = dyn_cast<StoreInst>(Dep.getInst()))
Chris Lattner1ce08292009-09-21 06:22:46 +00001704 if (const TargetData *TD = getAnalysisIfAvailable<TargetData>()) {
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001705 int Offset = AnalyzeLoadFromClobberingStore(L, DepSI, *TD);
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001706 if (Offset != -1)
1707 AvailVal = GetStoreValueForLoad(DepSI->getOperand(0), Offset,
1708 L->getType(), L, *TD);
Chris Lattner1ce08292009-09-21 06:22:46 +00001709 }
Chris Lattnereed919b2009-09-21 05:57:11 +00001710
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001711 // If the clobbering value is a memset/memcpy/memmove, see if we can forward
1712 // a value on from it.
1713 if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(Dep.getInst())) {
1714 if (const TargetData *TD = getAnalysisIfAvailable<TargetData>()) {
1715 int Offset = AnalyzeLoadFromClobberingMemInst(L, DepMI, *TD);
1716 if (Offset != -1)
1717 AvailVal = GetMemInstValueForLoad(DepMI, Offset, L->getType(), L,*TD);
1718 }
1719 }
1720
1721 if (AvailVal) {
1722 DEBUG(errs() << "GVN COERCED INST:\n" << *Dep.getInst() << '\n'
1723 << *AvailVal << '\n' << *L << "\n\n\n");
1724
1725 // Replace the load!
1726 L->replaceAllUsesWith(AvailVal);
1727 if (isa<PointerType>(AvailVal->getType()))
1728 MD->invalidateCachedPointerInfo(AvailVal);
1729 toErase.push_back(L);
1730 NumGVNLoad++;
1731 return true;
1732 }
1733
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001734 DEBUG(
1735 // fast print dep, using operator<< on instruction would be too slow
Dan Gohmanfd87a542009-07-25 01:43:01 +00001736 errs() << "GVN: load ";
1737 WriteAsOperand(errs(), L);
Chris Lattnerb2412a82009-09-21 02:42:51 +00001738 Instruction *I = Dep.getInst();
Dan Gohman2a298992009-07-31 20:24:18 +00001739 errs() << " is clobbered by " << *I << '\n';
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001740 );
Chris Lattnerb51deb92008-12-05 21:04:20 +00001741 return false;
Torok Edwin3f3c6d42009-05-29 09:46:03 +00001742 }
Chris Lattnerb51deb92008-12-05 21:04:20 +00001743
1744 // If it is defined in another block, try harder.
Chris Lattnerb2412a82009-09-21 02:42:51 +00001745 if (Dep.isNonLocal())
Chris Lattnerb51deb92008-12-05 21:04:20 +00001746 return processNonLocalLoad(L, toErase);
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001747
Chris Lattnerb2412a82009-09-21 02:42:51 +00001748 Instruction *DepInst = Dep.getInst();
Chris Lattnerb51deb92008-12-05 21:04:20 +00001749 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001750 Value *StoredVal = DepSI->getOperand(0);
1751
1752 // The store and load are to a must-aliased pointer, but they may not
1753 // actually have the same type. See if we know how to reuse the stored
1754 // value (depending on its type).
1755 const TargetData *TD = 0;
Chris Lattnera52fce42009-10-21 04:11:19 +00001756 if (StoredVal->getType() != L->getType()) {
1757 if ((TD = getAnalysisIfAvailable<TargetData>())) {
1758 StoredVal = CoerceAvailableValueToLoadType(StoredVal, L->getType(),
1759 L, *TD);
1760 if (StoredVal == 0)
1761 return false;
1762
1763 DEBUG(errs() << "GVN COERCED STORE:\n" << *DepSI << '\n' << *StoredVal
1764 << '\n' << *L << "\n\n\n");
1765 }
1766 else
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001767 return false;
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001768 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001769
Chris Lattnerb51deb92008-12-05 21:04:20 +00001770 // Remove it!
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001771 L->replaceAllUsesWith(StoredVal);
1772 if (isa<PointerType>(StoredVal->getType()))
1773 MD->invalidateCachedPointerInfo(StoredVal);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001774 toErase.push_back(L);
1775 NumGVNLoad++;
1776 return true;
1777 }
1778
1779 if (LoadInst *DepLI = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001780 Value *AvailableVal = DepLI;
1781
1782 // The loads are of a must-aliased pointer, but they may not actually have
1783 // the same type. See if we know how to reuse the previously loaded value
1784 // (depending on its type).
1785 const TargetData *TD = 0;
Chris Lattnera52fce42009-10-21 04:11:19 +00001786 if (DepLI->getType() != L->getType()) {
1787 if ((TD = getAnalysisIfAvailable<TargetData>())) {
1788 AvailableVal = CoerceAvailableValueToLoadType(DepLI, L->getType(), L,*TD);
1789 if (AvailableVal == 0)
1790 return false;
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001791
Chris Lattnera52fce42009-10-21 04:11:19 +00001792 DEBUG(errs() << "GVN COERCED LOAD:\n" << *DepLI << "\n" << *AvailableVal
1793 << "\n" << *L << "\n\n\n");
1794 }
1795 else
1796 return false;
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001797 }
1798
Chris Lattnerb51deb92008-12-05 21:04:20 +00001799 // Remove it!
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001800 L->replaceAllUsesWith(AvailableVal);
Chris Lattnerbc99be12008-12-09 22:06:23 +00001801 if (isa<PointerType>(DepLI->getType()))
1802 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001803 toErase.push_back(L);
1804 NumGVNLoad++;
1805 return true;
1806 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001807
Chris Lattner237a8282008-11-30 01:39:32 +00001808 // If this load really doesn't depend on anything, then we must be loading an
1809 // undef value. This can happen when loading for a fresh allocation with no
1810 // intervening stores, for example.
Victor Hernandez7b929da2009-10-23 21:09:37 +00001811 if (isa<AllocaInst>(DepInst) || isMalloc(DepInst)) {
Owen Anderson9e9a0d52009-07-30 23:03:37 +00001812 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Chris Lattner237a8282008-11-30 01:39:32 +00001813 toErase.push_back(L);
Chris Lattner237a8282008-11-30 01:39:32 +00001814 NumGVNLoad++;
Chris Lattnerb51deb92008-12-05 21:04:20 +00001815 return true;
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001816 }
Owen Andersonb62f7922009-10-28 07:05:35 +00001817
Owen Anderson9ff5a232009-12-02 07:35:19 +00001818 // If this load occurs either right after a lifetime begin,
Owen Andersonb62f7922009-10-28 07:05:35 +00001819 // then the loaded value is undefined.
1820 if (IntrinsicInst* II = dyn_cast<IntrinsicInst>(DepInst)) {
Owen Anderson9ff5a232009-12-02 07:35:19 +00001821 if (II->getIntrinsicID() == Intrinsic::lifetime_start) {
Owen Andersonb62f7922009-10-28 07:05:35 +00001822 L->replaceAllUsesWith(UndefValue::get(L->getType()));
1823 toErase.push_back(L);
1824 NumGVNLoad++;
1825 return true;
1826 }
1827 }
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001828
Chris Lattnerb51deb92008-12-05 21:04:20 +00001829 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001830}
1831
Chris Lattnerb2412a82009-09-21 02:42:51 +00001832Value *GVN::lookupNumber(BasicBlock *BB, uint32_t num) {
Owen Andersonb70a5712008-06-23 17:49:45 +00001833 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1834 if (I == localAvail.end())
1835 return 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001836
Chris Lattnerb2412a82009-09-21 02:42:51 +00001837 ValueNumberScope *Locals = I->second;
1838 while (Locals) {
1839 DenseMap<uint32_t, Value*>::iterator I = Locals->table.find(num);
1840 if (I != Locals->table.end())
Owen Anderson6fafe842008-06-20 01:15:47 +00001841 return I->second;
Chris Lattnerb2412a82009-09-21 02:42:51 +00001842 Locals = Locals->parent;
Owen Anderson6fafe842008-06-20 01:15:47 +00001843 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001844
Owen Anderson6fafe842008-06-20 01:15:47 +00001845 return 0;
1846}
1847
Owen Anderson255dafc2008-12-15 02:03:00 +00001848
Owen Anderson36057c72007-08-14 18:16:29 +00001849/// processInstruction - When calculating availability, handle an instruction
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001850/// by inserting it into the appropriate sets
Owen Andersonaf4240a2008-06-12 19:25:32 +00001851bool GVN::processInstruction(Instruction *I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001852 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00001853 if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
1854 bool Changed = processLoad(LI, toErase);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001855
Chris Lattnerb2412a82009-09-21 02:42:51 +00001856 if (!Changed) {
1857 unsigned Num = VN.lookup_or_add(LI);
1858 localAvail[I->getParent()]->table.insert(std::make_pair(Num, LI));
Owen Andersonb2303722008-06-18 21:41:49 +00001859 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001860
Chris Lattnerb2412a82009-09-21 02:42:51 +00001861 return Changed;
Owen Andersonb2303722008-06-18 21:41:49 +00001862 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001863
Chris Lattnerb2412a82009-09-21 02:42:51 +00001864 uint32_t NextNum = VN.getNextUnusedValueNumber();
1865 unsigned Num = VN.lookup_or_add(I);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001866
Chris Lattnerb2412a82009-09-21 02:42:51 +00001867 if (BranchInst *BI = dyn_cast<BranchInst>(I)) {
1868 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Daniel Dunbara279bc32009-09-20 02:20:51 +00001869
Owen Andersone8a290f2009-04-01 23:53:49 +00001870 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1871 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001872
Chris Lattnerb2412a82009-09-21 02:42:51 +00001873 Value *BranchCond = BI->getCondition();
1874 uint32_t CondVN = VN.lookup_or_add(BranchCond);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001875
Chris Lattnerb2412a82009-09-21 02:42:51 +00001876 BasicBlock *TrueSucc = BI->getSuccessor(0);
1877 BasicBlock *FalseSucc = BI->getSuccessor(1);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001878
Chris Lattnerb2412a82009-09-21 02:42:51 +00001879 if (TrueSucc->getSinglePredecessor())
1880 localAvail[TrueSucc]->table[CondVN] =
1881 ConstantInt::getTrue(TrueSucc->getContext());
1882 if (FalseSucc->getSinglePredecessor())
1883 localAvail[FalseSucc]->table[CondVN] =
1884 ConstantInt::getFalse(TrueSucc->getContext());
Owen Andersone8a290f2009-04-01 23:53:49 +00001885
1886 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001887
Owen Andersone5ffa902008-04-07 09:59:07 +00001888 // Allocations are always uniquely numbered, so we can save time and memory
Daniel Dunbara279bc32009-09-20 02:20:51 +00001889 // by fast failing them.
Victor Hernandez7b929da2009-10-23 21:09:37 +00001890 } else if (isa<AllocaInst>(I) || isa<TerminatorInst>(I)) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00001891 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Owen Andersone5ffa902008-04-07 09:59:07 +00001892 return false;
Owen Andersonb2303722008-06-18 21:41:49 +00001893 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001894
Owen Anderson62bc33c2007-08-16 22:02:55 +00001895 // Collapse PHI nodes
Owen Anderson31f49672007-08-14 18:33:27 +00001896 if (PHINode* p = dyn_cast<PHINode>(I)) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00001897 Value *constVal = CollapsePhi(p);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001898
Owen Anderson31f49672007-08-14 18:33:27 +00001899 if (constVal) {
Owen Anderson1defe2d2007-08-16 22:51:56 +00001900 p->replaceAllUsesWith(constVal);
Dan Gohman4ec01b22009-11-14 02:27:51 +00001901 if (MD && isa<PointerType>(constVal->getType()))
Chris Lattnerbc99be12008-12-09 22:06:23 +00001902 MD->invalidateCachedPointerInfo(constVal);
Owen Andersonae53c932008-12-23 00:49:51 +00001903 VN.erase(p);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001904
Owen Anderson1defe2d2007-08-16 22:51:56 +00001905 toErase.push_back(p);
Owen Andersonb2303722008-06-18 21:41:49 +00001906 } else {
Chris Lattnerb2412a82009-09-21 02:42:51 +00001907 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Owen Anderson31f49672007-08-14 18:33:27 +00001908 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001909
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001910 // If the number we were assigned was a brand new VN, then we don't
1911 // need to do a lookup to see if the number already exists
1912 // somewhere in the domtree: it can't!
Chris Lattnerb2412a82009-09-21 02:42:51 +00001913 } else if (Num == NextNum) {
1914 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Daniel Dunbara279bc32009-09-20 02:20:51 +00001915
Owen Anderson255dafc2008-12-15 02:03:00 +00001916 // Perform fast-path value-number based elimination of values inherited from
1917 // dominators.
Chris Lattnerb2412a82009-09-21 02:42:51 +00001918 } else if (Value *repl = lookupNumber(I->getParent(), Num)) {
Owen Anderson5fc4aba2007-12-08 01:37:09 +00001919 // Remove it!
Owen Andersonbf7d0bc2007-07-31 23:27:13 +00001920 VN.erase(I);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001921 I->replaceAllUsesWith(repl);
Dan Gohman4ec01b22009-11-14 02:27:51 +00001922 if (MD && isa<PointerType>(repl->getType()))
Chris Lattnerbc99be12008-12-09 22:06:23 +00001923 MD->invalidateCachedPointerInfo(repl);
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001924 toErase.push_back(I);
1925 return true;
Owen Anderson255dafc2008-12-15 02:03:00 +00001926
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001927 } else {
Chris Lattnerb2412a82009-09-21 02:42:51 +00001928 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001929 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001930
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001931 return false;
1932}
1933
Bill Wendling30788b82008-12-22 22:32:22 +00001934/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson3e75a422007-08-14 18:04:11 +00001935bool GVN::runOnFunction(Function& F) {
Dan Gohman4ec01b22009-11-14 02:27:51 +00001936 if (!NoLoads)
1937 MD = &getAnalysis<MemoryDependenceAnalysis>();
Chris Lattner663e4412008-12-01 00:40:32 +00001938 DT = &getAnalysis<DominatorTree>();
Owen Andersona472c4a2008-05-12 20:15:55 +00001939 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner663e4412008-12-01 00:40:32 +00001940 VN.setMemDep(MD);
1941 VN.setDomTree(DT);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001942
Chris Lattnerb2412a82009-09-21 02:42:51 +00001943 bool Changed = false;
1944 bool ShouldContinue = true;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001945
Owen Anderson5d0af032008-07-16 17:52:31 +00001946 // Merge unconditional branches, allowing PRE to catch more
1947 // optimization opportunities.
1948 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00001949 BasicBlock *BB = FI;
Owen Anderson5d0af032008-07-16 17:52:31 +00001950 ++FI;
Owen Andersonb31b06d2008-07-17 00:01:40 +00001951 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1952 if (removedBlock) NumGVNBlocks++;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001953
Chris Lattnerb2412a82009-09-21 02:42:51 +00001954 Changed |= removedBlock;
Owen Anderson5d0af032008-07-16 17:52:31 +00001955 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001956
Chris Lattnerae199312008-12-09 19:21:47 +00001957 unsigned Iteration = 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001958
Chris Lattnerb2412a82009-09-21 02:42:51 +00001959 while (ShouldContinue) {
Dan Gohmanfd87a542009-07-25 01:43:01 +00001960 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Chris Lattnerb2412a82009-09-21 02:42:51 +00001961 ShouldContinue = iterateOnFunction(F);
1962 Changed |= ShouldContinue;
Chris Lattnerae199312008-12-09 19:21:47 +00001963 ++Iteration;
Owen Anderson3e75a422007-08-14 18:04:11 +00001964 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001965
Owen Andersone98c54c2008-07-18 18:03:38 +00001966 if (EnablePRE) {
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001967 bool PREChanged = true;
1968 while (PREChanged) {
1969 PREChanged = performPRE(F);
Chris Lattnerb2412a82009-09-21 02:42:51 +00001970 Changed |= PREChanged;
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001971 }
Owen Andersone98c54c2008-07-18 18:03:38 +00001972 }
Chris Lattnerae199312008-12-09 19:21:47 +00001973 // FIXME: Should perform GVN again after PRE does something. PRE can move
1974 // computations into blocks where they become fully redundant. Note that
1975 // we can't do this until PRE's critical edge splitting updates memdep.
1976 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001977
1978 cleanupGlobalSets();
1979
Chris Lattnerb2412a82009-09-21 02:42:51 +00001980 return Changed;
Owen Anderson3e75a422007-08-14 18:04:11 +00001981}
1982
1983
Chris Lattnerb2412a82009-09-21 02:42:51 +00001984bool GVN::processBlock(BasicBlock *BB) {
Chris Lattnerae199312008-12-09 19:21:47 +00001985 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1986 // incrementing BI before processing an instruction).
Owen Andersonaf4240a2008-06-12 19:25:32 +00001987 SmallVector<Instruction*, 8> toErase;
Chris Lattnerb2412a82009-09-21 02:42:51 +00001988 bool ChangedFunction = false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001989
Owen Andersonaf4240a2008-06-12 19:25:32 +00001990 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1991 BI != BE;) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00001992 ChangedFunction |= processInstruction(BI, toErase);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001993 if (toErase.empty()) {
1994 ++BI;
1995 continue;
1996 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001997
Owen Andersonaf4240a2008-06-12 19:25:32 +00001998 // If we need some instructions deleted, do it now.
1999 NumGVNInstr += toErase.size();
Daniel Dunbara279bc32009-09-20 02:20:51 +00002000
Owen Andersonaf4240a2008-06-12 19:25:32 +00002001 // Avoid iterator invalidation.
2002 bool AtStart = BI == BB->begin();
2003 if (!AtStart)
2004 --BI;
2005
2006 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner663e4412008-12-01 00:40:32 +00002007 E = toErase.end(); I != E; ++I) {
Dan Gohman2a298992009-07-31 20:24:18 +00002008 DEBUG(errs() << "GVN removed: " << **I << '\n');
Dan Gohman4ec01b22009-11-14 02:27:51 +00002009 if (MD) MD->removeInstruction(*I);
Owen Andersonaf4240a2008-06-12 19:25:32 +00002010 (*I)->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00002011 DEBUG(verifyRemoved(*I));
Chris Lattner663e4412008-12-01 00:40:32 +00002012 }
Chris Lattnerae199312008-12-09 19:21:47 +00002013 toErase.clear();
Owen Andersonaf4240a2008-06-12 19:25:32 +00002014
2015 if (AtStart)
2016 BI = BB->begin();
2017 else
2018 ++BI;
Owen Andersonaf4240a2008-06-12 19:25:32 +00002019 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002020
Chris Lattnerb2412a82009-09-21 02:42:51 +00002021 return ChangedFunction;
Owen Andersonaf4240a2008-06-12 19:25:32 +00002022}
2023
Owen Andersonb2303722008-06-18 21:41:49 +00002024/// performPRE - Perform a purely local form of PRE that looks for diamond
2025/// control flow patterns and attempts to perform simple PRE at the join point.
Chris Lattnerfb6e7012009-10-31 22:11:15 +00002026bool GVN::performPRE(Function &F) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002027 bool Changed = false;
Owen Anderson5c274ee2008-06-19 19:54:19 +00002028 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner09713792008-12-01 07:29:03 +00002029 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersonb2303722008-06-18 21:41:49 +00002030 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
2031 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002032 BasicBlock *CurrentBlock = *DI;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002033
Owen Andersonb2303722008-06-18 21:41:49 +00002034 // Nothing to PRE in the entry block.
2035 if (CurrentBlock == &F.getEntryBlock()) continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002036
Owen Andersonb2303722008-06-18 21:41:49 +00002037 for (BasicBlock::iterator BI = CurrentBlock->begin(),
2038 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002039 Instruction *CurInst = BI++;
Duncan Sands7af1c782009-05-06 06:49:50 +00002040
Victor Hernandez7b929da2009-10-23 21:09:37 +00002041 if (isa<AllocaInst>(CurInst) ||
Victor Hernandez83d63912009-09-18 22:35:49 +00002042 isa<TerminatorInst>(CurInst) || isa<PHINode>(CurInst) ||
Devang Patel9674d152009-10-14 17:29:00 +00002043 CurInst->getType()->isVoidTy() ||
Duncan Sands7af1c782009-05-06 06:49:50 +00002044 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell090c0a22009-03-10 15:04:53 +00002045 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002046 continue;
Duncan Sands7af1c782009-05-06 06:49:50 +00002047
Chris Lattnerb2412a82009-09-21 02:42:51 +00002048 uint32_t ValNo = VN.lookup(CurInst);
Daniel Dunbara279bc32009-09-20 02:20:51 +00002049
Owen Andersonb2303722008-06-18 21:41:49 +00002050 // Look for the predecessors for PRE opportunities. We're
2051 // only trying to solve the basic diamond case, where
2052 // a value is computed in the successor and one predecessor,
2053 // but not the other. We also explicitly disallow cases
2054 // where the successor is its own predecessor, because they're
2055 // more complicated to get right.
Chris Lattnerb2412a82009-09-21 02:42:51 +00002056 unsigned NumWith = 0;
2057 unsigned NumWithout = 0;
2058 BasicBlock *PREPred = 0;
Chris Lattner09713792008-12-01 07:29:03 +00002059 predMap.clear();
2060
Owen Andersonb2303722008-06-18 21:41:49 +00002061 for (pred_iterator PI = pred_begin(CurrentBlock),
2062 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
2063 // We're not interested in PRE where the block is its
Owen Anderson6fafe842008-06-20 01:15:47 +00002064 // own predecessor, on in blocks with predecessors
2065 // that are not reachable.
2066 if (*PI == CurrentBlock) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002067 NumWithout = 2;
Owen Anderson6fafe842008-06-20 01:15:47 +00002068 break;
2069 } else if (!localAvail.count(*PI)) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002070 NumWithout = 2;
Owen Anderson6fafe842008-06-20 01:15:47 +00002071 break;
2072 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002073
2074 DenseMap<uint32_t, Value*>::iterator predV =
Chris Lattnerb2412a82009-09-21 02:42:51 +00002075 localAvail[*PI]->table.find(ValNo);
Owen Anderson6fafe842008-06-20 01:15:47 +00002076 if (predV == localAvail[*PI]->table.end()) {
Owen Andersonb2303722008-06-18 21:41:49 +00002077 PREPred = *PI;
Chris Lattnerb2412a82009-09-21 02:42:51 +00002078 NumWithout++;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002079 } else if (predV->second == CurInst) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002080 NumWithout = 2;
Owen Andersonb2303722008-06-18 21:41:49 +00002081 } else {
Owen Anderson6fafe842008-06-20 01:15:47 +00002082 predMap[*PI] = predV->second;
Chris Lattnerb2412a82009-09-21 02:42:51 +00002083 NumWith++;
Owen Andersonb2303722008-06-18 21:41:49 +00002084 }
2085 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002086
Owen Andersonb2303722008-06-18 21:41:49 +00002087 // Don't do PRE when it might increase code size, i.e. when
2088 // we would need to insert instructions in more than one pred.
Chris Lattnerb2412a82009-09-21 02:42:51 +00002089 if (NumWithout != 1 || NumWith == 0)
Owen Andersonb2303722008-06-18 21:41:49 +00002090 continue;
Chris Lattnerfb6e7012009-10-31 22:11:15 +00002091
2092 // Don't do PRE across indirect branch.
2093 if (isa<IndirectBrInst>(PREPred->getTerminator()))
2094 continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002095
Owen Anderson5c274ee2008-06-19 19:54:19 +00002096 // We can't do PRE safely on a critical edge, so instead we schedule
2097 // the edge to be split and perform the PRE the next time we iterate
2098 // on the function.
Chris Lattnerb2412a82009-09-21 02:42:51 +00002099 unsigned SuccNum = 0;
Owen Anderson5c274ee2008-06-19 19:54:19 +00002100 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
2101 i != e; ++i)
Owen Anderson0c7f91c2008-09-03 23:06:07 +00002102 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002103 SuccNum = i;
Owen Anderson5c274ee2008-06-19 19:54:19 +00002104 break;
2105 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002106
Chris Lattnerb2412a82009-09-21 02:42:51 +00002107 if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
2108 toSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
Owen Anderson5c274ee2008-06-19 19:54:19 +00002109 continue;
2110 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002111
Owen Andersonb2303722008-06-18 21:41:49 +00002112 // Instantiate the expression the in predecessor that lacked it.
2113 // Because we are going top-down through the block, all value numbers
2114 // will be available in the predecessor by the time we need them. Any
2115 // that weren't original present will have been instantiated earlier
2116 // in this loop.
Nick Lewycky67760642009-09-27 07:38:41 +00002117 Instruction *PREInstr = CurInst->clone();
Owen Andersonb2303722008-06-18 21:41:49 +00002118 bool success = true;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002119 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
2120 Value *Op = PREInstr->getOperand(i);
2121 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
2122 continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002123
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002124 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
2125 PREInstr->setOperand(i, V);
2126 } else {
2127 success = false;
2128 break;
Owen Andersonc45996b2008-07-11 20:05:13 +00002129 }
Owen Andersonb2303722008-06-18 21:41:49 +00002130 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002131
Owen Andersonb2303722008-06-18 21:41:49 +00002132 // Fail out if we encounter an operand that is not available in
Daniel Dunbara279bc32009-09-20 02:20:51 +00002133 // the PRE predecessor. This is typically because of loads which
Owen Andersonb2303722008-06-18 21:41:49 +00002134 // are not value numbered precisely.
2135 if (!success) {
2136 delete PREInstr;
Bill Wendling70ded192008-12-22 22:14:07 +00002137 DEBUG(verifyRemoved(PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00002138 continue;
2139 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002140
Owen Andersonb2303722008-06-18 21:41:49 +00002141 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002142 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson6fafe842008-06-20 01:15:47 +00002143 predMap[PREPred] = PREInstr;
Chris Lattnerb2412a82009-09-21 02:42:51 +00002144 VN.add(PREInstr, ValNo);
Owen Andersonb2303722008-06-18 21:41:49 +00002145 NumGVNPRE++;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002146
Owen Andersonb2303722008-06-18 21:41:49 +00002147 // Update the availability map to include the new instruction.
Chris Lattnerb2412a82009-09-21 02:42:51 +00002148 localAvail[PREPred]->table.insert(std::make_pair(ValNo, PREInstr));
Daniel Dunbara279bc32009-09-20 02:20:51 +00002149
Owen Andersonb2303722008-06-18 21:41:49 +00002150 // Create a PHI to make the value available in this block.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002151 PHINode* Phi = PHINode::Create(CurInst->getType(),
2152 CurInst->getName() + ".pre-phi",
Owen Andersonb2303722008-06-18 21:41:49 +00002153 CurrentBlock->begin());
2154 for (pred_iterator PI = pred_begin(CurrentBlock),
2155 PE = pred_end(CurrentBlock); PI != PE; ++PI)
Owen Anderson6fafe842008-06-20 01:15:47 +00002156 Phi->addIncoming(predMap[*PI], *PI);
Daniel Dunbara279bc32009-09-20 02:20:51 +00002157
Chris Lattnerb2412a82009-09-21 02:42:51 +00002158 VN.add(Phi, ValNo);
2159 localAvail[CurrentBlock]->table[ValNo] = Phi;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002160
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002161 CurInst->replaceAllUsesWith(Phi);
Dan Gohman4ec01b22009-11-14 02:27:51 +00002162 if (MD && isa<PointerType>(Phi->getType()))
Chris Lattnerbc99be12008-12-09 22:06:23 +00002163 MD->invalidateCachedPointerInfo(Phi);
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002164 VN.erase(CurInst);
Daniel Dunbara279bc32009-09-20 02:20:51 +00002165
Dan Gohman2a298992009-07-31 20:24:18 +00002166 DEBUG(errs() << "GVN PRE removed: " << *CurInst << '\n');
Dan Gohman4ec01b22009-11-14 02:27:51 +00002167 if (MD) MD->removeInstruction(CurInst);
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002168 CurInst->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00002169 DEBUG(verifyRemoved(CurInst));
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002170 Changed = true;
Owen Andersonb2303722008-06-18 21:41:49 +00002171 }
2172 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002173
Owen Anderson5c274ee2008-06-19 19:54:19 +00002174 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov64b53562008-12-05 19:38:49 +00002175 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Anderson5c274ee2008-06-19 19:54:19 +00002176 SplitCriticalEdge(I->first, I->second, this);
Daniel Dunbara279bc32009-09-20 02:20:51 +00002177
Anton Korobeynikov64b53562008-12-05 19:38:49 +00002178 return Changed || toSplit.size();
Owen Andersonb2303722008-06-18 21:41:49 +00002179}
2180
Bill Wendling30788b82008-12-22 22:32:22 +00002181/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson3e75a422007-08-14 18:04:11 +00002182bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00002183 cleanupGlobalSets();
Chris Lattner2e607012008-03-21 21:33:23 +00002184
Owen Andersone8a290f2009-04-01 23:53:49 +00002185 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
2186 DE = df_end(DT->getRootNode()); DI != DE; ++DI) {
2187 if (DI->getIDom())
2188 localAvail[DI->getBlock()] =
2189 new ValueNumberScope(localAvail[DI->getIDom()->getBlock()]);
2190 else
2191 localAvail[DI->getBlock()] = new ValueNumberScope(0);
2192 }
2193
Owen Anderson1ad2cb72007-07-24 17:55:58 +00002194 // Top-down walk of the dominator tree
Chris Lattnerb2412a82009-09-21 02:42:51 +00002195 bool Changed = false;
Owen Andersonc34d1122008-12-15 03:52:17 +00002196#if 0
2197 // Needed for value numbering with phi construction to work.
Owen Anderson255dafc2008-12-15 02:03:00 +00002198 ReversePostOrderTraversal<Function*> RPOT(&F);
2199 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
2200 RE = RPOT.end(); RI != RE; ++RI)
Chris Lattnerb2412a82009-09-21 02:42:51 +00002201 Changed |= processBlock(*RI);
Owen Andersonc34d1122008-12-15 03:52:17 +00002202#else
2203 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
2204 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
Chris Lattnerb2412a82009-09-21 02:42:51 +00002205 Changed |= processBlock(DI->getBlock());
Owen Andersonc34d1122008-12-15 03:52:17 +00002206#endif
2207
Chris Lattnerb2412a82009-09-21 02:42:51 +00002208 return Changed;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00002209}
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00002210
2211void GVN::cleanupGlobalSets() {
2212 VN.clear();
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00002213
2214 for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
2215 I = localAvail.begin(), E = localAvail.end(); I != E; ++I)
2216 delete I->second;
2217 localAvail.clear();
2218}
Bill Wendling246dbbb2008-12-22 21:36:08 +00002219
2220/// verifyRemoved - Verify that the specified instruction does not occur in our
2221/// internal data structures.
Bill Wendling6d463f22008-12-22 22:28:56 +00002222void GVN::verifyRemoved(const Instruction *Inst) const {
2223 VN.verifyRemoved(Inst);
Bill Wendling70ded192008-12-22 22:14:07 +00002224
Bill Wendling6d463f22008-12-22 22:28:56 +00002225 // Walk through the value number scope to make sure the instruction isn't
2226 // ferreted away in it.
Jeffrey Yasskin81cf4322009-11-10 01:02:17 +00002227 for (DenseMap<BasicBlock*, ValueNumberScope*>::const_iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00002228 I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
2229 const ValueNumberScope *VNS = I->second;
2230
2231 while (VNS) {
Jeffrey Yasskin81cf4322009-11-10 01:02:17 +00002232 for (DenseMap<uint32_t, Value*>::const_iterator
Bill Wendling6d463f22008-12-22 22:28:56 +00002233 II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
2234 assert(II->second != Inst && "Inst still in value numbering scope!");
2235 }
2236
2237 VNS = VNS->parent;
Bill Wendling70ded192008-12-22 22:14:07 +00002238 }
2239 }
Bill Wendling246dbbb2008-12-22 21:36:08 +00002240}