blob: 094c50f981c83417fa6b08d7e7558dde38efe50d [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 Anderson45537912007-07-26 18:26:51 +000020#include "llvm/Constants.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000021#include "llvm/DerivedTypes.h"
Chris Lattnera53cfd12009-12-28 21:28:46 +000022#include "llvm/GlobalVariable.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"
Dan Gohmanf4177aa2010-12-15 23:53:55 +000025#include "llvm/LLVMContext.h"
Chris Lattnereed919b2009-09-21 05:57:11 +000026#include "llvm/Operator.h"
Owen Andersonb388ca92007-10-18 19:39:33 +000027#include "llvm/Analysis/AliasAnalysis.h"
Chris Lattnerbc9a28d2009-12-06 05:29:56 +000028#include "llvm/Analysis/ConstantFolding.h"
29#include "llvm/Analysis/Dominators.h"
Duncan Sands88c3df72010-11-12 21:10:24 +000030#include "llvm/Analysis/InstructionSimplify.h"
Dan Gohmandd9344f2010-05-28 16:19:17 +000031#include "llvm/Analysis/Loads.h"
Victor Hernandezf006b182009-10-27 20:05:49 +000032#include "llvm/Analysis/MemoryBuiltins.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000033#include "llvm/Analysis/MemoryDependenceAnalysis.h"
Chris Lattner05e15f82009-12-09 01:59:31 +000034#include "llvm/Analysis/PHITransAddr.h"
Chris Lattnered58a6f2010-11-30 22:25:26 +000035#include "llvm/Analysis/ValueTracking.h"
36#include "llvm/Target/TargetData.h"
37#include "llvm/Transforms/Utils/BasicBlockUtils.h"
38#include "llvm/Transforms/Utils/Local.h"
39#include "llvm/Transforms/Utils/SSAUpdater.h"
40#include "llvm/ADT/DenseMap.h"
41#include "llvm/ADT/DepthFirstIterator.h"
42#include "llvm/ADT/PostOrderIterator.h"
43#include "llvm/ADT/SmallPtrSet.h"
44#include "llvm/ADT/Statistic.h"
Owen Andersona04a0642010-11-18 18:32:40 +000045#include "llvm/Support/Allocator.h"
Owen Anderson1ad2cb72007-07-24 17:55:58 +000046#include "llvm/Support/CFG.h"
Owen Andersonaa0b6342008-06-19 19:57:25 +000047#include "llvm/Support/CommandLine.h"
Chris Lattner9f8a6a72008-03-29 04:36:18 +000048#include "llvm/Support/Debug.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000049#include "llvm/Support/ErrorHandling.h"
Chris Lattnereed919b2009-09-21 05:57:11 +000050#include "llvm/Support/GetElementPtrTypeIterator.h"
Chris Lattnerfaf815b2009-12-06 01:57:02 +000051#include "llvm/Support/IRBuilder.h"
Owen Andersona04a0642010-11-18 18:32:40 +000052#include <list>
Owen Anderson1ad2cb72007-07-24 17:55:58 +000053using namespace llvm;
54
Bill Wendling70ded192008-12-22 22:14:07 +000055STATISTIC(NumGVNInstr, "Number of instructions deleted");
56STATISTIC(NumGVNLoad, "Number of loads deleted");
57STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
Owen Anderson961edc82008-07-15 16:28:06 +000058STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling70ded192008-12-22 22:14:07 +000059STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattnerd27290d2008-03-22 04:13:49 +000060
Evan Cheng88d11c02008-06-20 01:01:07 +000061static cl::opt<bool> EnablePRE("enable-pre",
Owen Andersonc2b856e2008-07-17 19:41:00 +000062 cl::init(true), cl::Hidden);
Dan Gohmanc915c952009-06-15 18:30:15 +000063static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersonaa0b6342008-06-19 19:57:25 +000064
Owen Anderson1ad2cb72007-07-24 17:55:58 +000065//===----------------------------------------------------------------------===//
66// ValueTable Class
67//===----------------------------------------------------------------------===//
68
69/// This class holds the mapping between values and value numbers. It is used
70/// as an efficient mechanism to determine the expression-wise equivalence of
71/// two values.
72namespace {
Chris Lattner3e8b6632009-09-02 06:11:42 +000073 struct Expression {
Owen Andersona81e2412010-01-17 19:33:27 +000074 enum ExpressionOpcode {
75 ADD = Instruction::Add,
76 FADD = Instruction::FAdd,
77 SUB = Instruction::Sub,
78 FSUB = Instruction::FSub,
79 MUL = Instruction::Mul,
80 FMUL = Instruction::FMul,
81 UDIV = Instruction::UDiv,
82 SDIV = Instruction::SDiv,
83 FDIV = Instruction::FDiv,
84 UREM = Instruction::URem,
85 SREM = Instruction::SRem,
86 FREM = Instruction::FRem,
87 SHL = Instruction::Shl,
88 LSHR = Instruction::LShr,
89 ASHR = Instruction::AShr,
90 AND = Instruction::And,
91 OR = Instruction::Or,
92 XOR = Instruction::Xor,
93 TRUNC = Instruction::Trunc,
94 ZEXT = Instruction::ZExt,
95 SEXT = Instruction::SExt,
96 FPTOUI = Instruction::FPToUI,
97 FPTOSI = Instruction::FPToSI,
98 UITOFP = Instruction::UIToFP,
99 SITOFP = Instruction::SIToFP,
100 FPTRUNC = Instruction::FPTrunc,
101 FPEXT = Instruction::FPExt,
102 PTRTOINT = Instruction::PtrToInt,
103 INTTOPTR = Instruction::IntToPtr,
104 BITCAST = Instruction::BitCast,
105 ICMPEQ, ICMPNE, ICMPUGT, ICMPUGE, ICMPULT, ICMPULE,
106 ICMPSGT, ICMPSGE, ICMPSLT, ICMPSLE, FCMPOEQ,
107 FCMPOGT, FCMPOGE, FCMPOLT, FCMPOLE, FCMPONE,
108 FCMPORD, FCMPUNO, FCMPUEQ, FCMPUGT, FCMPUGE,
109 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
110 SHUFFLE, SELECT, GEP, CALL, CONSTANT,
111 INSERTVALUE, EXTRACTVALUE, EMPTY, TOMBSTONE };
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000112
113 ExpressionOpcode opcode;
114 const Type* type;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000115 SmallVector<uint32_t, 4> varargs;
Chris Lattnerb2412a82009-09-21 02:42:51 +0000116 Value *function;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000117
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000118 Expression() { }
119 Expression(ExpressionOpcode o) : opcode(o) { }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000120
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000121 bool operator==(const Expression &other) const {
122 if (opcode != other.opcode)
123 return false;
124 else if (opcode == EMPTY || opcode == TOMBSTONE)
125 return true;
126 else if (type != other.type)
127 return false;
Owen Andersonb388ca92007-10-18 19:39:33 +0000128 else if (function != other.function)
129 return false;
Benjamin Krameraad94aa2010-12-21 21:30:19 +0000130 else if (varargs != other.varargs)
131 return false;
132 return true;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000133 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000134
Chris Lattner17aa6802010-09-04 18:12:00 +0000135 /*bool operator!=(const Expression &other) const {
Bill Wendling75f02ee2008-12-22 22:16:31 +0000136 return !(*this == other);
Chris Lattner17aa6802010-09-04 18:12:00 +0000137 }*/
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000138 };
Daniel Dunbara279bc32009-09-20 02:20:51 +0000139
Chris Lattner3e8b6632009-09-02 06:11:42 +0000140 class ValueTable {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000141 private:
142 DenseMap<Value*, uint32_t> valueNumbering;
143 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersona472c4a2008-05-12 20:15:55 +0000144 AliasAnalysis* AA;
145 MemoryDependenceAnalysis* MD;
146 DominatorTree* DT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000147
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000148 uint32_t nextValueNumber;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000149
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000150 Expression::ExpressionOpcode getOpcode(CmpInst* C);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000151 Expression create_expression(BinaryOperator* BO);
152 Expression create_expression(CmpInst* C);
153 Expression create_expression(ShuffleVectorInst* V);
154 Expression create_expression(ExtractElementInst* C);
155 Expression create_expression(InsertElementInst* V);
156 Expression create_expression(SelectInst* V);
157 Expression create_expression(CastInst* C);
158 Expression create_expression(GetElementPtrInst* G);
Owen Andersonb388ca92007-10-18 19:39:33 +0000159 Expression create_expression(CallInst* C);
Owen Andersond41ed4e2009-10-19 22:14:22 +0000160 Expression create_expression(ExtractValueInst* C);
161 Expression create_expression(InsertValueInst* C);
162
163 uint32_t lookup_or_add_call(CallInst* C);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000164 public:
Dan Gohmane63c4a22009-04-01 16:37:47 +0000165 ValueTable() : nextValueNumber(1) { }
Chris Lattnerb2412a82009-09-21 02:42:51 +0000166 uint32_t lookup_or_add(Value *V);
167 uint32_t lookup(Value *V) const;
168 void add(Value *V, uint32_t num);
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000169 void clear();
Chris Lattnerb2412a82009-09-21 02:42:51 +0000170 void erase(Value *v);
Owen Andersona472c4a2008-05-12 20:15:55 +0000171 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner663e4412008-12-01 00:40:32 +0000172 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersona472c4a2008-05-12 20:15:55 +0000173 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
174 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson0ae33ef2008-07-03 17:44:33 +0000175 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling246dbbb2008-12-22 21:36:08 +0000176 void verifyRemoved(const Value *) const;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000177 };
178}
179
180namespace llvm {
Chris Lattner76c1b972007-09-17 18:34:04 +0000181template <> struct DenseMapInfo<Expression> {
Owen Anderson830db6a2007-08-02 18:16:06 +0000182 static inline Expression getEmptyKey() {
183 return Expression(Expression::EMPTY);
184 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000185
Owen Anderson830db6a2007-08-02 18:16:06 +0000186 static inline Expression getTombstoneKey() {
187 return Expression(Expression::TOMBSTONE);
188 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000189
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000190 static unsigned getHashValue(const Expression e) {
191 unsigned hash = e.opcode;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000192
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000193 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
Owen Andersond41ed4e2009-10-19 22:14:22 +0000194 (unsigned)((uintptr_t)e.type >> 9));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000195
Owen Anderson830db6a2007-08-02 18:16:06 +0000196 for (SmallVector<uint32_t, 4>::const_iterator I = e.varargs.begin(),
197 E = e.varargs.end(); I != E; ++I)
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000198 hash = *I + hash * 37;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000199
Anton Korobeynikov07e6e562008-02-20 11:26:25 +0000200 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
201 (unsigned)((uintptr_t)e.function >> 9)) +
202 hash * 37;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000203
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000204 return hash;
205 }
Chris Lattner76c1b972007-09-17 18:34:04 +0000206 static bool isEqual(const Expression &LHS, const Expression &RHS) {
207 return LHS == RHS;
208 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000209};
Chris Lattner4bbf4ee2009-12-15 07:26:43 +0000210
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000211}
212
213//===----------------------------------------------------------------------===//
214// ValueTable Internal Functions
215//===----------------------------------------------------------------------===//
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000216
217Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000218 if (isa<ICmpInst>(C)) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000219 switch (C->getPredicate()) {
Chris Lattner88365bb2008-03-21 21:14:38 +0000220 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000221 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner88365bb2008-03-21 21:14:38 +0000222 case ICmpInst::ICMP_EQ: return Expression::ICMPEQ;
223 case ICmpInst::ICMP_NE: return Expression::ICMPNE;
224 case ICmpInst::ICMP_UGT: return Expression::ICMPUGT;
225 case ICmpInst::ICMP_UGE: return Expression::ICMPUGE;
226 case ICmpInst::ICMP_ULT: return Expression::ICMPULT;
227 case ICmpInst::ICMP_ULE: return Expression::ICMPULE;
228 case ICmpInst::ICMP_SGT: return Expression::ICMPSGT;
229 case ICmpInst::ICMP_SGE: return Expression::ICMPSGE;
230 case ICmpInst::ICMP_SLT: return Expression::ICMPSLT;
231 case ICmpInst::ICMP_SLE: return Expression::ICMPSLE;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000232 }
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000233 } else {
234 switch (C->getPredicate()) {
235 default: // THIS SHOULD NEVER HAPPEN
Torok Edwinc23197a2009-07-14 16:55:14 +0000236 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +0000237 case FCmpInst::FCMP_OEQ: return Expression::FCMPOEQ;
238 case FCmpInst::FCMP_OGT: return Expression::FCMPOGT;
239 case FCmpInst::FCMP_OGE: return Expression::FCMPOGE;
240 case FCmpInst::FCMP_OLT: return Expression::FCMPOLT;
241 case FCmpInst::FCMP_OLE: return Expression::FCMPOLE;
242 case FCmpInst::FCMP_ONE: return Expression::FCMPONE;
243 case FCmpInst::FCMP_ORD: return Expression::FCMPORD;
244 case FCmpInst::FCMP_UNO: return Expression::FCMPUNO;
245 case FCmpInst::FCMP_UEQ: return Expression::FCMPUEQ;
246 case FCmpInst::FCMP_UGT: return Expression::FCMPUGT;
247 case FCmpInst::FCMP_UGE: return Expression::FCMPUGE;
248 case FCmpInst::FCMP_ULT: return Expression::FCMPULT;
249 case FCmpInst::FCMP_ULE: return Expression::FCMPULE;
250 case FCmpInst::FCMP_UNE: return Expression::FCMPUNE;
251 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000252 }
253}
254
Owen Andersonb388ca92007-10-18 19:39:33 +0000255Expression ValueTable::create_expression(CallInst* C) {
256 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000257
Owen Andersonb388ca92007-10-18 19:39:33 +0000258 e.type = C->getType();
Owen Andersonb388ca92007-10-18 19:39:33 +0000259 e.function = C->getCalledFunction();
260 e.opcode = Expression::CALL;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000261
Gabor Greif0a14be02010-06-24 10:04:07 +0000262 CallSite CS(C);
263 for (CallInst::op_iterator I = CS.arg_begin(), E = CS.arg_end();
Owen Andersonb388ca92007-10-18 19:39:33 +0000264 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000265 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000266
Owen Andersonb388ca92007-10-18 19:39:33 +0000267 return e;
268}
269
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000270Expression ValueTable::create_expression(BinaryOperator* BO) {
271 Expression e;
Owen Andersond41ed4e2009-10-19 22:14:22 +0000272 e.varargs.push_back(lookup_or_add(BO->getOperand(0)));
273 e.varargs.push_back(lookup_or_add(BO->getOperand(1)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000274 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000275 e.type = BO->getType();
Owen Andersona81e2412010-01-17 19:33:27 +0000276 e.opcode = static_cast<Expression::ExpressionOpcode>(BO->getOpcode());
Daniel Dunbara279bc32009-09-20 02:20:51 +0000277
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000278 return e;
279}
280
281Expression ValueTable::create_expression(CmpInst* C) {
282 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000283
Owen Andersond41ed4e2009-10-19 22:14:22 +0000284 e.varargs.push_back(lookup_or_add(C->getOperand(0)));
285 e.varargs.push_back(lookup_or_add(C->getOperand(1)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000286 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000287 e.type = C->getType();
288 e.opcode = getOpcode(C);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000289
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000290 return e;
291}
292
293Expression ValueTable::create_expression(CastInst* C) {
294 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000295
Owen Andersond41ed4e2009-10-19 22:14:22 +0000296 e.varargs.push_back(lookup_or_add(C->getOperand(0)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000297 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000298 e.type = C->getType();
Owen Andersona81e2412010-01-17 19:33:27 +0000299 e.opcode = static_cast<Expression::ExpressionOpcode>(C->getOpcode());
Daniel Dunbara279bc32009-09-20 02:20:51 +0000300
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000301 return e;
302}
303
304Expression ValueTable::create_expression(ShuffleVectorInst* S) {
305 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000306
Owen Andersond41ed4e2009-10-19 22:14:22 +0000307 e.varargs.push_back(lookup_or_add(S->getOperand(0)));
308 e.varargs.push_back(lookup_or_add(S->getOperand(1)));
309 e.varargs.push_back(lookup_or_add(S->getOperand(2)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000310 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000311 e.type = S->getType();
312 e.opcode = Expression::SHUFFLE;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000313
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000314 return e;
315}
316
317Expression ValueTable::create_expression(ExtractElementInst* E) {
318 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000319
Owen Andersond41ed4e2009-10-19 22:14:22 +0000320 e.varargs.push_back(lookup_or_add(E->getOperand(0)));
321 e.varargs.push_back(lookup_or_add(E->getOperand(1)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000322 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000323 e.type = E->getType();
324 e.opcode = Expression::EXTRACT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000325
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000326 return e;
327}
328
329Expression ValueTable::create_expression(InsertElementInst* I) {
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(I->getOperand(0)));
333 e.varargs.push_back(lookup_or_add(I->getOperand(1)));
334 e.varargs.push_back(lookup_or_add(I->getOperand(2)));
Owen Andersonb388ca92007-10-18 19:39:33 +0000335 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000336 e.type = I->getType();
337 e.opcode = Expression::INSERT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000338
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000339 return e;
340}
341
342Expression ValueTable::create_expression(SelectInst* I) {
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(I->getCondition()));
346 e.varargs.push_back(lookup_or_add(I->getTrueValue()));
347 e.varargs.push_back(lookup_or_add(I->getFalseValue()));
Owen Andersonb388ca92007-10-18 19:39:33 +0000348 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000349 e.type = I->getType();
350 e.opcode = Expression::SELECT;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000351
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000352 return e;
353}
354
355Expression ValueTable::create_expression(GetElementPtrInst* G) {
356 Expression e;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000357
Owen Andersond41ed4e2009-10-19 22:14:22 +0000358 e.varargs.push_back(lookup_or_add(G->getPointerOperand()));
Owen Andersonb388ca92007-10-18 19:39:33 +0000359 e.function = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000360 e.type = G->getType();
361 e.opcode = Expression::GEP;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000362
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000363 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
364 I != E; ++I)
Owen Anderson8f46c782008-04-11 05:11:49 +0000365 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbara279bc32009-09-20 02:20:51 +0000366
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000367 return e;
368}
369
Owen Andersond41ed4e2009-10-19 22:14:22 +0000370Expression ValueTable::create_expression(ExtractValueInst* E) {
371 Expression e;
372
373 e.varargs.push_back(lookup_or_add(E->getAggregateOperand()));
374 for (ExtractValueInst::idx_iterator II = E->idx_begin(), IE = E->idx_end();
375 II != IE; ++II)
376 e.varargs.push_back(*II);
377 e.function = 0;
378 e.type = E->getType();
379 e.opcode = Expression::EXTRACTVALUE;
380
381 return e;
382}
383
384Expression ValueTable::create_expression(InsertValueInst* E) {
385 Expression e;
386
387 e.varargs.push_back(lookup_or_add(E->getAggregateOperand()));
388 e.varargs.push_back(lookup_or_add(E->getInsertedValueOperand()));
389 for (InsertValueInst::idx_iterator II = E->idx_begin(), IE = E->idx_end();
390 II != IE; ++II)
391 e.varargs.push_back(*II);
392 e.function = 0;
393 e.type = E->getType();
394 e.opcode = Expression::INSERTVALUE;
395
396 return e;
397}
398
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000399//===----------------------------------------------------------------------===//
400// ValueTable External Functions
401//===----------------------------------------------------------------------===//
402
Owen Andersonb2303722008-06-18 21:41:49 +0000403/// add - Insert a value into the table with a specified value number.
Chris Lattnerb2412a82009-09-21 02:42:51 +0000404void ValueTable::add(Value *V, uint32_t num) {
Owen Andersonb2303722008-06-18 21:41:49 +0000405 valueNumbering.insert(std::make_pair(V, num));
406}
407
Owen Andersond41ed4e2009-10-19 22:14:22 +0000408uint32_t ValueTable::lookup_or_add_call(CallInst* C) {
409 if (AA->doesNotAccessMemory(C)) {
410 Expression exp = create_expression(C);
411 uint32_t& e = expressionNumbering[exp];
412 if (!e) e = nextValueNumber++;
413 valueNumbering[C] = e;
414 return e;
415 } else if (AA->onlyReadsMemory(C)) {
416 Expression exp = create_expression(C);
417 uint32_t& e = expressionNumbering[exp];
418 if (!e) {
419 e = nextValueNumber++;
420 valueNumbering[C] = e;
421 return e;
422 }
Dan Gohman4ec01b22009-11-14 02:27:51 +0000423 if (!MD) {
424 e = nextValueNumber++;
425 valueNumbering[C] = e;
426 return e;
427 }
Owen Andersond41ed4e2009-10-19 22:14:22 +0000428
429 MemDepResult local_dep = MD->getDependency(C);
430
431 if (!local_dep.isDef() && !local_dep.isNonLocal()) {
432 valueNumbering[C] = nextValueNumber;
433 return nextValueNumber++;
434 }
435
436 if (local_dep.isDef()) {
437 CallInst* local_cdep = cast<CallInst>(local_dep.getInst());
438
Gabor Greif237e1da2010-06-30 09:17:53 +0000439 if (local_cdep->getNumArgOperands() != C->getNumArgOperands()) {
Owen Andersond41ed4e2009-10-19 22:14:22 +0000440 valueNumbering[C] = nextValueNumber;
441 return nextValueNumber++;
442 }
443
Gabor Greifd883a9d2010-06-24 10:17:17 +0000444 for (unsigned i = 0, e = C->getNumArgOperands(); i < e; ++i) {
445 uint32_t c_vn = lookup_or_add(C->getArgOperand(i));
446 uint32_t cd_vn = lookup_or_add(local_cdep->getArgOperand(i));
Owen Andersond41ed4e2009-10-19 22:14:22 +0000447 if (c_vn != cd_vn) {
448 valueNumbering[C] = nextValueNumber;
449 return nextValueNumber++;
450 }
451 }
452
453 uint32_t v = lookup_or_add(local_cdep);
454 valueNumbering[C] = v;
455 return v;
456 }
457
458 // Non-local case.
459 const MemoryDependenceAnalysis::NonLocalDepInfo &deps =
460 MD->getNonLocalCallDependency(CallSite(C));
461 // FIXME: call/call dependencies for readonly calls should return def, not
462 // clobber! Move the checking logic to MemDep!
463 CallInst* cdep = 0;
464
465 // Check to see if we have a single dominating call instruction that is
466 // identical to C.
467 for (unsigned i = 0, e = deps.size(); i != e; ++i) {
Chris Lattnere18b9712009-12-09 07:08:01 +0000468 const NonLocalDepEntry *I = &deps[i];
Owen Andersond41ed4e2009-10-19 22:14:22 +0000469 // Ignore non-local dependencies.
Chris Lattnere18b9712009-12-09 07:08:01 +0000470 if (I->getResult().isNonLocal())
Owen Andersond41ed4e2009-10-19 22:14:22 +0000471 continue;
472
473 // We don't handle non-depedencies. If we already have a call, reject
474 // instruction dependencies.
Chris Lattnere18b9712009-12-09 07:08:01 +0000475 if (I->getResult().isClobber() || cdep != 0) {
Owen Andersond41ed4e2009-10-19 22:14:22 +0000476 cdep = 0;
477 break;
478 }
479
Chris Lattnere18b9712009-12-09 07:08:01 +0000480 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I->getResult().getInst());
Owen Andersond41ed4e2009-10-19 22:14:22 +0000481 // FIXME: All duplicated with non-local case.
Chris Lattnere18b9712009-12-09 07:08:01 +0000482 if (NonLocalDepCall && DT->properlyDominates(I->getBB(), C->getParent())){
Owen Andersond41ed4e2009-10-19 22:14:22 +0000483 cdep = NonLocalDepCall;
484 continue;
485 }
486
487 cdep = 0;
488 break;
489 }
490
491 if (!cdep) {
492 valueNumbering[C] = nextValueNumber;
493 return nextValueNumber++;
494 }
495
Gabor Greif237e1da2010-06-30 09:17:53 +0000496 if (cdep->getNumArgOperands() != C->getNumArgOperands()) {
Owen Andersond41ed4e2009-10-19 22:14:22 +0000497 valueNumbering[C] = nextValueNumber;
498 return nextValueNumber++;
499 }
Gabor Greifd883a9d2010-06-24 10:17:17 +0000500 for (unsigned i = 0, e = C->getNumArgOperands(); i < e; ++i) {
501 uint32_t c_vn = lookup_or_add(C->getArgOperand(i));
502 uint32_t cd_vn = lookup_or_add(cdep->getArgOperand(i));
Owen Andersond41ed4e2009-10-19 22:14:22 +0000503 if (c_vn != cd_vn) {
504 valueNumbering[C] = nextValueNumber;
505 return nextValueNumber++;
506 }
507 }
508
509 uint32_t v = lookup_or_add(cdep);
510 valueNumbering[C] = v;
511 return v;
512
513 } else {
514 valueNumbering[C] = nextValueNumber;
515 return nextValueNumber++;
516 }
517}
518
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000519/// lookup_or_add - Returns the value number for the specified value, assigning
520/// it a new number if it did not have one before.
Chris Lattnerb2412a82009-09-21 02:42:51 +0000521uint32_t ValueTable::lookup_or_add(Value *V) {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000522 DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
523 if (VI != valueNumbering.end())
524 return VI->second;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000525
Owen Andersond41ed4e2009-10-19 22:14:22 +0000526 if (!isa<Instruction>(V)) {
Owen Anderson158d86e2009-10-19 21:14:57 +0000527 valueNumbering[V] = nextValueNumber;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000528 return nextValueNumber++;
529 }
Owen Andersond41ed4e2009-10-19 22:14:22 +0000530
531 Instruction* I = cast<Instruction>(V);
532 Expression exp;
533 switch (I->getOpcode()) {
534 case Instruction::Call:
535 return lookup_or_add_call(cast<CallInst>(I));
536 case Instruction::Add:
537 case Instruction::FAdd:
538 case Instruction::Sub:
539 case Instruction::FSub:
540 case Instruction::Mul:
541 case Instruction::FMul:
542 case Instruction::UDiv:
543 case Instruction::SDiv:
544 case Instruction::FDiv:
545 case Instruction::URem:
546 case Instruction::SRem:
547 case Instruction::FRem:
548 case Instruction::Shl:
549 case Instruction::LShr:
550 case Instruction::AShr:
551 case Instruction::And:
552 case Instruction::Or :
553 case Instruction::Xor:
554 exp = create_expression(cast<BinaryOperator>(I));
555 break;
556 case Instruction::ICmp:
557 case Instruction::FCmp:
558 exp = create_expression(cast<CmpInst>(I));
559 break;
560 case Instruction::Trunc:
561 case Instruction::ZExt:
562 case Instruction::SExt:
563 case Instruction::FPToUI:
564 case Instruction::FPToSI:
565 case Instruction::UIToFP:
566 case Instruction::SIToFP:
567 case Instruction::FPTrunc:
568 case Instruction::FPExt:
569 case Instruction::PtrToInt:
570 case Instruction::IntToPtr:
571 case Instruction::BitCast:
572 exp = create_expression(cast<CastInst>(I));
573 break;
574 case Instruction::Select:
575 exp = create_expression(cast<SelectInst>(I));
576 break;
577 case Instruction::ExtractElement:
578 exp = create_expression(cast<ExtractElementInst>(I));
579 break;
580 case Instruction::InsertElement:
581 exp = create_expression(cast<InsertElementInst>(I));
582 break;
583 case Instruction::ShuffleVector:
584 exp = create_expression(cast<ShuffleVectorInst>(I));
585 break;
586 case Instruction::ExtractValue:
587 exp = create_expression(cast<ExtractValueInst>(I));
588 break;
589 case Instruction::InsertValue:
590 exp = create_expression(cast<InsertValueInst>(I));
591 break;
592 case Instruction::GetElementPtr:
593 exp = create_expression(cast<GetElementPtrInst>(I));
594 break;
595 default:
596 valueNumbering[V] = nextValueNumber;
597 return nextValueNumber++;
598 }
599
600 uint32_t& e = expressionNumbering[exp];
601 if (!e) e = nextValueNumber++;
602 valueNumbering[V] = e;
603 return e;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000604}
605
606/// lookup - Returns the value number of the specified value. Fails if
607/// the value has not yet been numbered.
Chris Lattnerb2412a82009-09-21 02:42:51 +0000608uint32_t ValueTable::lookup(Value *V) const {
Jeffrey Yasskin81cf4322009-11-10 01:02:17 +0000609 DenseMap<Value*, uint32_t>::const_iterator VI = valueNumbering.find(V);
Chris Lattner88365bb2008-03-21 21:14:38 +0000610 assert(VI != valueNumbering.end() && "Value not numbered?");
611 return VI->second;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000612}
613
614/// clear - Remove all entries from the ValueTable
615void ValueTable::clear() {
616 valueNumbering.clear();
617 expressionNumbering.clear();
618 nextValueNumber = 1;
619}
620
Owen Andersonbf7d0bc2007-07-31 23:27:13 +0000621/// erase - Remove a value from the value numbering
Chris Lattnerb2412a82009-09-21 02:42:51 +0000622void ValueTable::erase(Value *V) {
Owen Andersonbf7d0bc2007-07-31 23:27:13 +0000623 valueNumbering.erase(V);
624}
625
Bill Wendling246dbbb2008-12-22 21:36:08 +0000626/// verifyRemoved - Verify that the value is removed from all internal data
627/// structures.
628void ValueTable::verifyRemoved(const Value *V) const {
Jeffrey Yasskin81cf4322009-11-10 01:02:17 +0000629 for (DenseMap<Value*, uint32_t>::const_iterator
Bill Wendling246dbbb2008-12-22 21:36:08 +0000630 I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
631 assert(I->first != V && "Inst still occurs in value numbering map!");
632 }
633}
634
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000635//===----------------------------------------------------------------------===//
Bill Wendling30788b82008-12-22 22:32:22 +0000636// GVN Pass
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000637//===----------------------------------------------------------------------===//
638
639namespace {
640
Chris Lattner3e8b6632009-09-02 06:11:42 +0000641 class GVN : public FunctionPass {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000642 bool runOnFunction(Function &F);
643 public:
644 static char ID; // Pass identification, replacement for typeid
Bob Wilsonb29d7d22010-02-28 05:34:05 +0000645 explicit GVN(bool noloads = false)
Owen Anderson081c34b2010-10-19 17:21:58 +0000646 : FunctionPass(ID), NoLoads(noloads), MD(0) {
647 initializeGVNPass(*PassRegistry::getPassRegistry());
648 }
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000649
650 private:
Dan Gohman4ec01b22009-11-14 02:27:51 +0000651 bool NoLoads;
Chris Lattner663e4412008-12-01 00:40:32 +0000652 MemoryDependenceAnalysis *MD;
653 DominatorTree *DT;
Duncan Sands88c3df72010-11-12 21:10:24 +0000654 const TargetData* TD;
Chris Lattner663e4412008-12-01 00:40:32 +0000655
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000656 ValueTable VN;
Owen Andersona04a0642010-11-18 18:32:40 +0000657
Owen Anderson68c26392010-11-19 22:48:40 +0000658 /// NumberTable - A mapping from value numers to lists of Value*'s that
659 /// have that value number. Use lookupNumber to query it.
Owen Andersona04a0642010-11-18 18:32:40 +0000660 DenseMap<uint32_t, std::pair<Value*, void*> > NumberTable;
661 BumpPtrAllocator TableAllocator;
Owen Anderson68c26392010-11-19 22:48:40 +0000662
663 /// insert_table - Push a new Value to the NumberTable onto the list for
664 /// its value number.
Owen Andersona04a0642010-11-18 18:32:40 +0000665 void insert_table(uint32_t N, Value *V) {
666 std::pair<Value*, void*>& Curr = NumberTable[N];
667 if (!Curr.first) {
668 Curr.first = V;
669 return;
670 }
671
672 std::pair<Value*, void*>* Node =
673 TableAllocator.Allocate<std::pair<Value*, void*> >();
674 Node->first = V;
675 Node->second = Curr.second;
676 Curr.second = Node;
677 }
678
Owen Anderson68c26392010-11-19 22:48:40 +0000679 /// erase_table - Scan the list of values corresponding to a given value
680 /// number, and remove the given value if encountered.
Owen Andersona04a0642010-11-18 18:32:40 +0000681 void erase_table(uint32_t N, Value *V) {
682 std::pair<Value*, void*>* Prev = 0;
683 std::pair<Value*, void*>* Curr = &NumberTable[N];
684
685 while (Curr->first != V) {
686 Prev = Curr;
687 Curr = static_cast<std::pair<Value*, void*>*>(Curr->second);
688 }
689
690 if (Prev) {
691 Prev->second = Curr->second;
692 } else {
693 if (!Curr->second) {
694 Curr->first = 0;
695 } else {
696 std::pair<Value*, void*>* Next =
697 static_cast<std::pair<Value*, void*>*>(Curr->second);
698 Curr->first = Next->first;
699 Curr->second = Next->second;
700 }
701 }
702 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000703
Bob Wilson484d4a32010-02-16 19:51:59 +0000704 // List of critical edges to be split between iterations.
705 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
706
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000707 // This transformation requires dominator postdominator info
708 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000709 AU.addRequired<DominatorTree>();
Dan Gohman4ec01b22009-11-14 02:27:51 +0000710 if (!NoLoads)
711 AU.addRequired<MemoryDependenceAnalysis>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000712 AU.addRequired<AliasAnalysis>();
Daniel Dunbara279bc32009-09-20 02:20:51 +0000713
Owen Andersonb70a5712008-06-23 17:49:45 +0000714 AU.addPreserved<DominatorTree>();
Owen Andersonb388ca92007-10-18 19:39:33 +0000715 AU.addPreserved<AliasAnalysis>();
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000716 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000717
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000718 // Helper fuctions
719 // FIXME: eliminate or document these better
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000720 bool processLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000721 SmallVectorImpl<Instruction*> &toErase);
Chris Lattnerb2412a82009-09-21 02:42:51 +0000722 bool processInstruction(Instruction *I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000723 SmallVectorImpl<Instruction*> &toErase);
Owen Anderson830db6a2007-08-02 18:16:06 +0000724 bool processNonLocalLoad(LoadInst* L,
Chris Lattner8e1e95c2008-03-21 22:01:16 +0000725 SmallVectorImpl<Instruction*> &toErase);
Chris Lattnerb2412a82009-09-21 02:42:51 +0000726 bool processBlock(BasicBlock *BB);
Owen Andersonb2303722008-06-18 21:41:49 +0000727 void dump(DenseMap<uint32_t, Value*>& d);
Owen Anderson3e75a422007-08-14 18:04:11 +0000728 bool iterateOnFunction(Function &F);
Owen Andersonb2303722008-06-18 21:41:49 +0000729 bool performPRE(Function& F);
Chris Lattnerb2412a82009-09-21 02:42:51 +0000730 Value *lookupNumber(BasicBlock *BB, uint32_t num);
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +0000731 void cleanupGlobalSets();
Bill Wendling246dbbb2008-12-22 21:36:08 +0000732 void verifyRemoved(const Instruction *I) const;
Bob Wilson484d4a32010-02-16 19:51:59 +0000733 bool splitCriticalEdges();
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000734 };
Daniel Dunbara279bc32009-09-20 02:20:51 +0000735
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000736 char GVN::ID = 0;
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000737}
738
739// createGVNPass - The public interface to this file...
Bob Wilsonb29d7d22010-02-28 05:34:05 +0000740FunctionPass *llvm::createGVNPass(bool NoLoads) {
741 return new GVN(NoLoads);
Dan Gohman4ec01b22009-11-14 02:27:51 +0000742}
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000743
Owen Anderson2ab36d32010-10-12 19:48:12 +0000744INITIALIZE_PASS_BEGIN(GVN, "gvn", "Global Value Numbering", false, false)
745INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
746INITIALIZE_PASS_DEPENDENCY(DominatorTree)
747INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
748INITIALIZE_PASS_END(GVN, "gvn", "Global Value Numbering", false, false)
Owen Anderson1ad2cb72007-07-24 17:55:58 +0000749
Owen Andersonb2303722008-06-18 21:41:49 +0000750void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Dan Gohmanad12b262009-12-18 03:25:51 +0000751 errs() << "{\n";
Owen Andersonb2303722008-06-18 21:41:49 +0000752 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson0cd32032007-07-25 19:57:03 +0000753 E = d.end(); I != E; ++I) {
Dan Gohmanad12b262009-12-18 03:25:51 +0000754 errs() << I->first << "\n";
Owen Anderson0cd32032007-07-25 19:57:03 +0000755 I->second->dump();
756 }
Dan Gohmanad12b262009-12-18 03:25:51 +0000757 errs() << "}\n";
Owen Anderson0cd32032007-07-25 19:57:03 +0000758}
759
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000760/// IsValueFullyAvailableInBlock - Return true if we can prove that the value
761/// we're analyzing is fully available in the specified block. As we go, keep
Chris Lattner72bc70d2008-12-05 07:49:08 +0000762/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
763/// map is actually a tri-state map with the following values:
764/// 0) we know the block *is not* fully available.
765/// 1) we know the block *is* fully available.
766/// 2) we do not know whether the block is fully available or not, but we are
767/// currently speculating that it will be.
768/// 3) we are speculating for this block and have used that to speculate for
769/// other blocks.
Daniel Dunbara279bc32009-09-20 02:20:51 +0000770static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner72bc70d2008-12-05 07:49:08 +0000771 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000772 // Optimistically assume that the block is fully available and check to see
773 // if we already know about this block in one lookup.
Daniel Dunbara279bc32009-09-20 02:20:51 +0000774 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
Chris Lattner72bc70d2008-12-05 07:49:08 +0000775 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000776
777 // If the entry already existed for this block, return the precomputed value.
Chris Lattner72bc70d2008-12-05 07:49:08 +0000778 if (!IV.second) {
779 // If this is a speculative "available" value, mark it as being used for
780 // speculation of other blocks.
781 if (IV.first->second == 2)
782 IV.first->second = 3;
783 return IV.first->second != 0;
784 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000785
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000786 // Otherwise, see if it is fully available in all predecessors.
787 pred_iterator PI = pred_begin(BB), PE = pred_end(BB);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000788
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000789 // If this block has no predecessors, it isn't live-in here.
790 if (PI == PE)
Chris Lattner72bc70d2008-12-05 07:49:08 +0000791 goto SpeculationFailure;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000792
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000793 for (; PI != PE; ++PI)
794 // If the value isn't fully available in one of our predecessors, then it
795 // isn't fully available in this block either. Undo our previous
796 // optimistic assumption and bail out.
797 if (!IsValueFullyAvailableInBlock(*PI, FullyAvailableBlocks))
Chris Lattner72bc70d2008-12-05 07:49:08 +0000798 goto SpeculationFailure;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000799
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000800 return true;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000801
Chris Lattner72bc70d2008-12-05 07:49:08 +0000802// SpeculationFailure - If we get here, we found out that this is not, after
803// all, a fully-available block. We have a problem if we speculated on this and
804// used the speculation to mark other blocks as available.
805SpeculationFailure:
806 char &BBVal = FullyAvailableBlocks[BB];
Daniel Dunbara279bc32009-09-20 02:20:51 +0000807
Chris Lattner72bc70d2008-12-05 07:49:08 +0000808 // If we didn't speculate on this, just return with it set to false.
809 if (BBVal == 2) {
810 BBVal = 0;
811 return false;
812 }
813
814 // If we did speculate on this value, we could have blocks set to 1 that are
815 // incorrect. Walk the (transitive) successors of this block and mark them as
816 // 0 if set to one.
817 SmallVector<BasicBlock*, 32> BBWorklist;
818 BBWorklist.push_back(BB);
Daniel Dunbara279bc32009-09-20 02:20:51 +0000819
Dan Gohman321a8132010-01-05 16:27:25 +0000820 do {
Chris Lattner72bc70d2008-12-05 07:49:08 +0000821 BasicBlock *Entry = BBWorklist.pop_back_val();
822 // Note that this sets blocks to 0 (unavailable) if they happen to not
823 // already be in FullyAvailableBlocks. This is safe.
824 char &EntryVal = FullyAvailableBlocks[Entry];
825 if (EntryVal == 0) continue; // Already unavailable.
826
827 // Mark as unavailable.
828 EntryVal = 0;
Daniel Dunbara279bc32009-09-20 02:20:51 +0000829
Chris Lattner72bc70d2008-12-05 07:49:08 +0000830 for (succ_iterator I = succ_begin(Entry), E = succ_end(Entry); I != E; ++I)
831 BBWorklist.push_back(*I);
Dan Gohman321a8132010-01-05 16:27:25 +0000832 } while (!BBWorklist.empty());
Daniel Dunbara279bc32009-09-20 02:20:51 +0000833
Chris Lattner72bc70d2008-12-05 07:49:08 +0000834 return false;
Chris Lattnerc89c6a92008-12-02 08:16:11 +0000835}
836
Chris Lattner771a5422009-09-20 20:09:34 +0000837
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000838/// CanCoerceMustAliasedValueToLoad - Return true if
839/// CoerceAvailableValueToLoadType will succeed.
840static bool CanCoerceMustAliasedValueToLoad(Value *StoredVal,
841 const Type *LoadTy,
842 const TargetData &TD) {
843 // If the loaded or stored value is an first class array or struct, don't try
844 // to transform them. We need to be able to bitcast to integer.
Duncan Sands1df98592010-02-16 11:11:14 +0000845 if (LoadTy->isStructTy() || LoadTy->isArrayTy() ||
846 StoredVal->getType()->isStructTy() ||
847 StoredVal->getType()->isArrayTy())
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000848 return false;
849
850 // The store has to be at least as big as the load.
851 if (TD.getTypeSizeInBits(StoredVal->getType()) <
852 TD.getTypeSizeInBits(LoadTy))
853 return false;
854
855 return true;
856}
857
858
Chris Lattner771a5422009-09-20 20:09:34 +0000859/// CoerceAvailableValueToLoadType - If we saw a store of a value to memory, and
860/// then a load from a must-aliased pointer of a different type, try to coerce
861/// the stored value. LoadedTy is the type of the load we want to replace and
862/// InsertPt is the place to insert new instructions.
863///
864/// If we can't do it, return null.
865static Value *CoerceAvailableValueToLoadType(Value *StoredVal,
866 const Type *LoadedTy,
867 Instruction *InsertPt,
868 const TargetData &TD) {
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000869 if (!CanCoerceMustAliasedValueToLoad(StoredVal, LoadedTy, TD))
870 return 0;
871
Chris Lattner771a5422009-09-20 20:09:34 +0000872 const Type *StoredValTy = StoredVal->getType();
873
Chris Lattner7944c212010-05-08 20:01:44 +0000874 uint64_t StoreSize = TD.getTypeStoreSizeInBits(StoredValTy);
Chris Lattner771a5422009-09-20 20:09:34 +0000875 uint64_t LoadSize = TD.getTypeSizeInBits(LoadedTy);
876
877 // If the store and reload are the same size, we can always reuse it.
878 if (StoreSize == LoadSize) {
Duncan Sands1df98592010-02-16 11:11:14 +0000879 if (StoredValTy->isPointerTy() && LoadedTy->isPointerTy()) {
Chris Lattner771a5422009-09-20 20:09:34 +0000880 // Pointer to Pointer -> use bitcast.
881 return new BitCastInst(StoredVal, LoadedTy, "", InsertPt);
882 }
883
884 // Convert source pointers to integers, which can be bitcast.
Duncan Sands1df98592010-02-16 11:11:14 +0000885 if (StoredValTy->isPointerTy()) {
Chris Lattner771a5422009-09-20 20:09:34 +0000886 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
887 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
888 }
889
890 const Type *TypeToCastTo = LoadedTy;
Duncan Sands1df98592010-02-16 11:11:14 +0000891 if (TypeToCastTo->isPointerTy())
Chris Lattner771a5422009-09-20 20:09:34 +0000892 TypeToCastTo = TD.getIntPtrType(StoredValTy->getContext());
893
894 if (StoredValTy != TypeToCastTo)
895 StoredVal = new BitCastInst(StoredVal, TypeToCastTo, "", InsertPt);
896
897 // Cast to pointer if the load needs a pointer type.
Duncan Sands1df98592010-02-16 11:11:14 +0000898 if (LoadedTy->isPointerTy())
Chris Lattner771a5422009-09-20 20:09:34 +0000899 StoredVal = new IntToPtrInst(StoredVal, LoadedTy, "", InsertPt);
900
901 return StoredVal;
902 }
903
904 // If the loaded value is smaller than the available value, then we can
905 // extract out a piece from it. If the available value is too small, then we
906 // can't do anything.
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000907 assert(StoreSize >= LoadSize && "CanCoerceMustAliasedValueToLoad fail");
Chris Lattner771a5422009-09-20 20:09:34 +0000908
909 // Convert source pointers to integers, which can be manipulated.
Duncan Sands1df98592010-02-16 11:11:14 +0000910 if (StoredValTy->isPointerTy()) {
Chris Lattner771a5422009-09-20 20:09:34 +0000911 StoredValTy = TD.getIntPtrType(StoredValTy->getContext());
912 StoredVal = new PtrToIntInst(StoredVal, StoredValTy, "", InsertPt);
913 }
914
915 // Convert vectors and fp to integer, which can be manipulated.
Duncan Sands1df98592010-02-16 11:11:14 +0000916 if (!StoredValTy->isIntegerTy()) {
Chris Lattner771a5422009-09-20 20:09:34 +0000917 StoredValTy = IntegerType::get(StoredValTy->getContext(), StoreSize);
918 StoredVal = new BitCastInst(StoredVal, StoredValTy, "", InsertPt);
919 }
920
921 // If this is a big-endian system, we need to shift the value down to the low
922 // bits so that a truncate will work.
923 if (TD.isBigEndian()) {
924 Constant *Val = ConstantInt::get(StoredVal->getType(), StoreSize-LoadSize);
925 StoredVal = BinaryOperator::CreateLShr(StoredVal, Val, "tmp", InsertPt);
926 }
927
928 // Truncate the integer to the right size now.
929 const Type *NewIntTy = IntegerType::get(StoredValTy->getContext(), LoadSize);
930 StoredVal = new TruncInst(StoredVal, NewIntTy, "trunc", InsertPt);
931
932 if (LoadedTy == NewIntTy)
933 return StoredVal;
934
935 // If the result is a pointer, inttoptr.
Duncan Sands1df98592010-02-16 11:11:14 +0000936 if (LoadedTy->isPointerTy())
Chris Lattner771a5422009-09-20 20:09:34 +0000937 return new IntToPtrInst(StoredVal, LoadedTy, "inttoptr", InsertPt);
938
939 // Otherwise, bitcast.
940 return new BitCastInst(StoredVal, LoadedTy, "bitcast", InsertPt);
941}
942
Chris Lattnerfaf815b2009-12-06 01:57:02 +0000943/// AnalyzeLoadFromClobberingWrite - This function is called when we have a
944/// memdep query of a load that ends up being a clobbering memory write (store,
945/// memset, memcpy, memmove). This means that the write *may* provide bits used
946/// by the load but we can't be sure because the pointers don't mustalias.
947///
948/// Check this case to see if there is anything more we can do before we give
949/// up. This returns -1 if we have to give up, or a byte number in the stored
950/// value of the piece that feeds the load.
Chris Lattner03f17da2009-12-09 07:34:10 +0000951static int AnalyzeLoadFromClobberingWrite(const Type *LoadTy, Value *LoadPtr,
952 Value *WritePtr,
Chris Lattnerfaf815b2009-12-06 01:57:02 +0000953 uint64_t WriteSizeInBits,
Chris Lattner4fbd14e2009-09-21 06:48:08 +0000954 const TargetData &TD) {
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000955 // If the loaded or stored value is an first class array or struct, don't try
956 // to transform them. We need to be able to bitcast to integer.
Duncan Sands1df98592010-02-16 11:11:14 +0000957 if (LoadTy->isStructTy() || LoadTy->isArrayTy())
Chris Lattner8b2bc3d2009-09-21 17:24:04 +0000958 return -1;
959
Chris Lattnerca749402009-09-21 06:24:16 +0000960 int64_t StoreOffset = 0, LoadOffset = 0;
Chris Lattnered58a6f2010-11-30 22:25:26 +0000961 Value *StoreBase = GetPointerBaseWithConstantOffset(WritePtr, StoreOffset,TD);
962 Value *LoadBase = GetPointerBaseWithConstantOffset(LoadPtr, LoadOffset, TD);
Chris Lattnerca749402009-09-21 06:24:16 +0000963 if (StoreBase != LoadBase)
964 return -1;
965
966 // If the load and store are to the exact same address, they should have been
967 // a must alias. AA must have gotten confused.
Chris Lattner219d7742010-03-25 05:58:19 +0000968 // FIXME: Study to see if/when this happens. One case is forwarding a memset
969 // to a load from the base of the memset.
Chris Lattnerca749402009-09-21 06:24:16 +0000970#if 0
Chris Lattner219d7742010-03-25 05:58:19 +0000971 if (LoadOffset == StoreOffset) {
David Greenebf7f78e2010-01-05 01:27:17 +0000972 dbgs() << "STORE/LOAD DEP WITH COMMON POINTER MISSED:\n"
Chris Lattnerca749402009-09-21 06:24:16 +0000973 << "Base = " << *StoreBase << "\n"
Chris Lattnerfaf815b2009-12-06 01:57:02 +0000974 << "Store Ptr = " << *WritePtr << "\n"
975 << "Store Offs = " << StoreOffset << "\n"
Chris Lattnerb6760b42009-12-10 00:04:46 +0000976 << "Load Ptr = " << *LoadPtr << "\n";
Chris Lattnerb3f927f2009-12-09 02:41:54 +0000977 abort();
Chris Lattnerca749402009-09-21 06:24:16 +0000978 }
Chris Lattner219d7742010-03-25 05:58:19 +0000979#endif
Chris Lattnerca749402009-09-21 06:24:16 +0000980
981 // If the load and store don't overlap at all, the store doesn't provide
982 // anything to the load. In this case, they really don't alias at all, AA
983 // must have gotten confused.
Chris Lattner03f17da2009-12-09 07:34:10 +0000984 uint64_t LoadSize = TD.getTypeSizeInBits(LoadTy);
Chris Lattnerca749402009-09-21 06:24:16 +0000985
Chris Lattnerfaf815b2009-12-06 01:57:02 +0000986 if ((WriteSizeInBits & 7) | (LoadSize & 7))
Chris Lattnerca749402009-09-21 06:24:16 +0000987 return -1;
Chris Lattnerfaf815b2009-12-06 01:57:02 +0000988 uint64_t StoreSize = WriteSizeInBits >> 3; // Convert to bytes.
Chris Lattnerca749402009-09-21 06:24:16 +0000989 LoadSize >>= 3;
990
991
992 bool isAAFailure = false;
Chris Lattner219d7742010-03-25 05:58:19 +0000993 if (StoreOffset < LoadOffset)
Chris Lattnerca749402009-09-21 06:24:16 +0000994 isAAFailure = StoreOffset+int64_t(StoreSize) <= LoadOffset;
Chris Lattner219d7742010-03-25 05:58:19 +0000995 else
Chris Lattnerca749402009-09-21 06:24:16 +0000996 isAAFailure = LoadOffset+int64_t(LoadSize) <= StoreOffset;
Chris Lattner219d7742010-03-25 05:58:19 +0000997
Chris Lattnerca749402009-09-21 06:24:16 +0000998 if (isAAFailure) {
999#if 0
David Greenebf7f78e2010-01-05 01:27:17 +00001000 dbgs() << "STORE LOAD DEP WITH COMMON BASE:\n"
Chris Lattnerca749402009-09-21 06:24:16 +00001001 << "Base = " << *StoreBase << "\n"
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001002 << "Store Ptr = " << *WritePtr << "\n"
1003 << "Store Offs = " << StoreOffset << "\n"
Chris Lattnerb6760b42009-12-10 00:04:46 +00001004 << "Load Ptr = " << *LoadPtr << "\n";
Chris Lattnerb3f927f2009-12-09 02:41:54 +00001005 abort();
Chris Lattnerca749402009-09-21 06:24:16 +00001006#endif
1007 return -1;
1008 }
1009
1010 // If the Load isn't completely contained within the stored bits, we don't
1011 // have all the bits to feed it. We could do something crazy in the future
1012 // (issue a smaller load then merge the bits in) but this seems unlikely to be
1013 // valuable.
1014 if (StoreOffset > LoadOffset ||
1015 StoreOffset+StoreSize < LoadOffset+LoadSize)
1016 return -1;
1017
1018 // Okay, we can do this transformation. Return the number of bytes into the
1019 // store that the load is.
1020 return LoadOffset-StoreOffset;
1021}
1022
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001023/// AnalyzeLoadFromClobberingStore - This function is called when we have a
1024/// memdep query of a load that ends up being a clobbering store.
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001025static int AnalyzeLoadFromClobberingStore(const Type *LoadTy, Value *LoadPtr,
1026 StoreInst *DepSI,
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001027 const TargetData &TD) {
1028 // Cannot handle reading from store of first-class aggregate yet.
Dan Gohman3355c4e2010-11-10 19:03:33 +00001029 if (DepSI->getValueOperand()->getType()->isStructTy() ||
1030 DepSI->getValueOperand()->getType()->isArrayTy())
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001031 return -1;
1032
1033 Value *StorePtr = DepSI->getPointerOperand();
Dan Gohman3355c4e2010-11-10 19:03:33 +00001034 uint64_t StoreSize =TD.getTypeSizeInBits(DepSI->getValueOperand()->getType());
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001035 return AnalyzeLoadFromClobberingWrite(LoadTy, LoadPtr,
Chris Lattner03f17da2009-12-09 07:34:10 +00001036 StorePtr, StoreSize, TD);
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001037}
1038
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001039static int AnalyzeLoadFromClobberingMemInst(const Type *LoadTy, Value *LoadPtr,
1040 MemIntrinsic *MI,
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001041 const TargetData &TD) {
1042 // If the mem operation is a non-constant size, we can't handle it.
1043 ConstantInt *SizeCst = dyn_cast<ConstantInt>(MI->getLength());
1044 if (SizeCst == 0) return -1;
1045 uint64_t MemSizeInBits = SizeCst->getZExtValue()*8;
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001046
1047 // If this is memset, we just need to see if the offset is valid in the size
1048 // of the memset..
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001049 if (MI->getIntrinsicID() == Intrinsic::memset)
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001050 return AnalyzeLoadFromClobberingWrite(LoadTy, LoadPtr, MI->getDest(),
1051 MemSizeInBits, TD);
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001052
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001053 // If we have a memcpy/memmove, the only case we can handle is if this is a
1054 // copy from constant memory. In that case, we can read directly from the
1055 // constant memory.
1056 MemTransferInst *MTI = cast<MemTransferInst>(MI);
1057
1058 Constant *Src = dyn_cast<Constant>(MTI->getSource());
1059 if (Src == 0) return -1;
1060
Dan Gohman5034dd32010-12-15 20:02:24 +00001061 GlobalVariable *GV = dyn_cast<GlobalVariable>(GetUnderlyingObject(Src));
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001062 if (GV == 0 || !GV->isConstant()) return -1;
1063
1064 // See if the access is within the bounds of the transfer.
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001065 int Offset = AnalyzeLoadFromClobberingWrite(LoadTy, LoadPtr,
1066 MI->getDest(), MemSizeInBits, TD);
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001067 if (Offset == -1)
1068 return Offset;
1069
1070 // Otherwise, see if we can constant fold a load from the constant with the
1071 // offset applied as appropriate.
1072 Src = ConstantExpr::getBitCast(Src,
1073 llvm::Type::getInt8PtrTy(Src->getContext()));
1074 Constant *OffsetCst =
1075 ConstantInt::get(Type::getInt64Ty(Src->getContext()), (unsigned)Offset);
1076 Src = ConstantExpr::getGetElementPtr(Src, &OffsetCst, 1);
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001077 Src = ConstantExpr::getBitCast(Src, PointerType::getUnqual(LoadTy));
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001078 if (ConstantFoldLoadFromConstPtr(Src, &TD))
1079 return Offset;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001080 return -1;
1081}
1082
Chris Lattnerca749402009-09-21 06:24:16 +00001083
1084/// GetStoreValueForLoad - This function is called when we have a
1085/// memdep query of a load that ends up being a clobbering store. This means
1086/// that the store *may* provide bits used by the load but we can't be sure
1087/// because the pointers don't mustalias. Check this case to see if there is
1088/// anything more we can do before we give up.
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001089static Value *GetStoreValueForLoad(Value *SrcVal, unsigned Offset,
1090 const Type *LoadTy,
1091 Instruction *InsertPt, const TargetData &TD){
Chris Lattnerca749402009-09-21 06:24:16 +00001092 LLVMContext &Ctx = SrcVal->getType()->getContext();
1093
Chris Lattner7944c212010-05-08 20:01:44 +00001094 uint64_t StoreSize = (TD.getTypeSizeInBits(SrcVal->getType()) + 7) / 8;
1095 uint64_t LoadSize = (TD.getTypeSizeInBits(LoadTy) + 7) / 8;
Chris Lattnerca749402009-09-21 06:24:16 +00001096
Chris Lattnerb2c6ae82009-12-09 18:13:28 +00001097 IRBuilder<> Builder(InsertPt->getParent(), InsertPt);
Chris Lattnerca749402009-09-21 06:24:16 +00001098
1099 // Compute which bits of the stored value are being used by the load. Convert
1100 // to an integer type to start with.
Duncan Sands1df98592010-02-16 11:11:14 +00001101 if (SrcVal->getType()->isPointerTy())
Chris Lattnerb2c6ae82009-12-09 18:13:28 +00001102 SrcVal = Builder.CreatePtrToInt(SrcVal, TD.getIntPtrType(Ctx), "tmp");
Duncan Sands1df98592010-02-16 11:11:14 +00001103 if (!SrcVal->getType()->isIntegerTy())
Chris Lattnerb2c6ae82009-12-09 18:13:28 +00001104 SrcVal = Builder.CreateBitCast(SrcVal, IntegerType::get(Ctx, StoreSize*8),
1105 "tmp");
Chris Lattnerca749402009-09-21 06:24:16 +00001106
1107 // Shift the bits to the least significant depending on endianness.
1108 unsigned ShiftAmt;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001109 if (TD.isLittleEndian())
Chris Lattnerca749402009-09-21 06:24:16 +00001110 ShiftAmt = Offset*8;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001111 else
Chris Lattner19ad7842009-09-21 17:55:47 +00001112 ShiftAmt = (StoreSize-LoadSize-Offset)*8;
Chris Lattnerca749402009-09-21 06:24:16 +00001113
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001114 if (ShiftAmt)
Chris Lattnerb2c6ae82009-12-09 18:13:28 +00001115 SrcVal = Builder.CreateLShr(SrcVal, ShiftAmt, "tmp");
Chris Lattnerca749402009-09-21 06:24:16 +00001116
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001117 if (LoadSize != StoreSize)
Chris Lattnerb2c6ae82009-12-09 18:13:28 +00001118 SrcVal = Builder.CreateTrunc(SrcVal, IntegerType::get(Ctx, LoadSize*8),
1119 "tmp");
Chris Lattnerca749402009-09-21 06:24:16 +00001120
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001121 return CoerceAvailableValueToLoadType(SrcVal, LoadTy, InsertPt, TD);
Chris Lattnerca749402009-09-21 06:24:16 +00001122}
1123
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001124/// GetMemInstValueForLoad - This function is called when we have a
1125/// memdep query of a load that ends up being a clobbering mem intrinsic.
1126static Value *GetMemInstValueForLoad(MemIntrinsic *SrcInst, unsigned Offset,
1127 const Type *LoadTy, Instruction *InsertPt,
1128 const TargetData &TD){
1129 LLVMContext &Ctx = LoadTy->getContext();
1130 uint64_t LoadSize = TD.getTypeSizeInBits(LoadTy)/8;
1131
1132 IRBuilder<> Builder(InsertPt->getParent(), InsertPt);
1133
1134 // We know that this method is only called when the mem transfer fully
1135 // provides the bits for the load.
1136 if (MemSetInst *MSI = dyn_cast<MemSetInst>(SrcInst)) {
1137 // memset(P, 'x', 1234) -> splat('x'), even if x is a variable, and
1138 // independently of what the offset is.
1139 Value *Val = MSI->getValue();
1140 if (LoadSize != 1)
1141 Val = Builder.CreateZExt(Val, IntegerType::get(Ctx, LoadSize*8));
1142
1143 Value *OneElt = Val;
1144
1145 // Splat the value out to the right number of bits.
1146 for (unsigned NumBytesSet = 1; NumBytesSet != LoadSize; ) {
1147 // If we can double the number of bytes set, do it.
1148 if (NumBytesSet*2 <= LoadSize) {
1149 Value *ShVal = Builder.CreateShl(Val, NumBytesSet*8);
1150 Val = Builder.CreateOr(Val, ShVal);
1151 NumBytesSet <<= 1;
1152 continue;
1153 }
1154
1155 // Otherwise insert one byte at a time.
1156 Value *ShVal = Builder.CreateShl(Val, 1*8);
1157 Val = Builder.CreateOr(OneElt, ShVal);
1158 ++NumBytesSet;
1159 }
1160
1161 return CoerceAvailableValueToLoadType(Val, LoadTy, InsertPt, TD);
1162 }
Chris Lattnerbc9a28d2009-12-06 05:29:56 +00001163
1164 // Otherwise, this is a memcpy/memmove from a constant global.
1165 MemTransferInst *MTI = cast<MemTransferInst>(SrcInst);
1166 Constant *Src = cast<Constant>(MTI->getSource());
1167
1168 // Otherwise, see if we can constant fold a load from the constant with the
1169 // offset applied as appropriate.
1170 Src = ConstantExpr::getBitCast(Src,
1171 llvm::Type::getInt8PtrTy(Src->getContext()));
1172 Constant *OffsetCst =
1173 ConstantInt::get(Type::getInt64Ty(Src->getContext()), (unsigned)Offset);
1174 Src = ConstantExpr::getGetElementPtr(Src, &OffsetCst, 1);
1175 Src = ConstantExpr::getBitCast(Src, PointerType::getUnqual(LoadTy));
1176 return ConstantFoldLoadFromConstPtr(Src, &TD);
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001177}
1178
Dan Gohmanb3579832010-04-15 17:08:50 +00001179namespace {
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001180
Chris Lattner87913512009-09-21 06:30:24 +00001181struct AvailableValueInBlock {
1182 /// BB - The basic block in question.
1183 BasicBlock *BB;
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001184 enum ValType {
1185 SimpleVal, // A simple offsetted value that is accessed.
1186 MemIntrin // A memory intrinsic which is loaded from.
1187 };
1188
Chris Lattner87913512009-09-21 06:30:24 +00001189 /// V - The value that is live out of the block.
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001190 PointerIntPair<Value *, 1, ValType> Val;
1191
1192 /// Offset - The byte offset in Val that is interesting for the load query.
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001193 unsigned Offset;
Chris Lattner87913512009-09-21 06:30:24 +00001194
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001195 static AvailableValueInBlock get(BasicBlock *BB, Value *V,
1196 unsigned Offset = 0) {
Chris Lattner87913512009-09-21 06:30:24 +00001197 AvailableValueInBlock Res;
1198 Res.BB = BB;
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001199 Res.Val.setPointer(V);
1200 Res.Val.setInt(SimpleVal);
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001201 Res.Offset = Offset;
Chris Lattner87913512009-09-21 06:30:24 +00001202 return Res;
1203 }
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001204
1205 static AvailableValueInBlock getMI(BasicBlock *BB, MemIntrinsic *MI,
1206 unsigned Offset = 0) {
1207 AvailableValueInBlock Res;
1208 Res.BB = BB;
1209 Res.Val.setPointer(MI);
1210 Res.Val.setInt(MemIntrin);
1211 Res.Offset = Offset;
1212 return Res;
1213 }
1214
1215 bool isSimpleValue() const { return Val.getInt() == SimpleVal; }
1216 Value *getSimpleValue() const {
1217 assert(isSimpleValue() && "Wrong accessor");
1218 return Val.getPointer();
1219 }
1220
1221 MemIntrinsic *getMemIntrinValue() const {
1222 assert(!isSimpleValue() && "Wrong accessor");
1223 return cast<MemIntrinsic>(Val.getPointer());
1224 }
Chris Lattner5362c542009-12-21 23:04:33 +00001225
1226 /// MaterializeAdjustedValue - Emit code into this block to adjust the value
1227 /// defined here to the specified type. This handles various coercion cases.
1228 Value *MaterializeAdjustedValue(const Type *LoadTy,
1229 const TargetData *TD) const {
1230 Value *Res;
1231 if (isSimpleValue()) {
1232 Res = getSimpleValue();
1233 if (Res->getType() != LoadTy) {
1234 assert(TD && "Need target data to handle type mismatch case");
1235 Res = GetStoreValueForLoad(Res, Offset, LoadTy, BB->getTerminator(),
1236 *TD);
1237
1238 DEBUG(errs() << "GVN COERCED NONLOCAL VAL:\nOffset: " << Offset << " "
1239 << *getSimpleValue() << '\n'
1240 << *Res << '\n' << "\n\n\n");
1241 }
1242 } else {
1243 Res = GetMemInstValueForLoad(getMemIntrinValue(), Offset,
1244 LoadTy, BB->getTerminator(), *TD);
1245 DEBUG(errs() << "GVN COERCED NONLOCAL MEM INTRIN:\nOffset: " << Offset
1246 << " " << *getMemIntrinValue() << '\n'
1247 << *Res << '\n' << "\n\n\n");
1248 }
1249 return Res;
1250 }
Chris Lattner87913512009-09-21 06:30:24 +00001251};
1252
Dan Gohmanb3579832010-04-15 17:08:50 +00001253}
1254
Chris Lattnera09fbf02009-10-10 23:50:30 +00001255/// ConstructSSAForLoadSet - Given a set of loads specified by ValuesPerBlock,
1256/// construct SSA form, allowing us to eliminate LI. This returns the value
1257/// that should be used at LI's definition site.
1258static Value *ConstructSSAForLoadSet(LoadInst *LI,
1259 SmallVectorImpl<AvailableValueInBlock> &ValuesPerBlock,
1260 const TargetData *TD,
Chris Lattnerd2191e52009-12-21 23:15:48 +00001261 const DominatorTree &DT,
Chris Lattnera09fbf02009-10-10 23:50:30 +00001262 AliasAnalysis *AA) {
Chris Lattnerd2191e52009-12-21 23:15:48 +00001263 // Check for the fully redundant, dominating load case. In this case, we can
1264 // just use the dominating value directly.
1265 if (ValuesPerBlock.size() == 1 &&
1266 DT.properlyDominates(ValuesPerBlock[0].BB, LI->getParent()))
1267 return ValuesPerBlock[0].MaterializeAdjustedValue(LI->getType(), TD);
1268
1269 // Otherwise, we have to construct SSA form.
Chris Lattnera09fbf02009-10-10 23:50:30 +00001270 SmallVector<PHINode*, 8> NewPHIs;
1271 SSAUpdater SSAUpdate(&NewPHIs);
Duncan Sandsfc6e29d2010-09-02 08:14:03 +00001272 SSAUpdate.Initialize(LI->getType(), LI->getName());
Chris Lattnera09fbf02009-10-10 23:50:30 +00001273
1274 const Type *LoadTy = LI->getType();
1275
Chris Lattner771a5422009-09-20 20:09:34 +00001276 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i) {
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001277 const AvailableValueInBlock &AV = ValuesPerBlock[i];
1278 BasicBlock *BB = AV.BB;
Chris Lattner771a5422009-09-20 20:09:34 +00001279
Chris Lattnera09fbf02009-10-10 23:50:30 +00001280 if (SSAUpdate.HasValueForBlock(BB))
1281 continue;
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001282
Chris Lattner5362c542009-12-21 23:04:33 +00001283 SSAUpdate.AddAvailableValue(BB, AV.MaterializeAdjustedValue(LoadTy, TD));
Chris Lattner771a5422009-09-20 20:09:34 +00001284 }
Chris Lattnera09fbf02009-10-10 23:50:30 +00001285
1286 // Perform PHI construction.
1287 Value *V = SSAUpdate.GetValueInMiddleOfBlock(LI->getParent());
1288
1289 // If new PHI nodes were created, notify alias analysis.
Duncan Sands1df98592010-02-16 11:11:14 +00001290 if (V->getType()->isPointerTy())
Chris Lattnera09fbf02009-10-10 23:50:30 +00001291 for (unsigned i = 0, e = NewPHIs.size(); i != e; ++i)
1292 AA->copyValue(LI, NewPHIs[i]);
1293
1294 return V;
Chris Lattner771a5422009-09-20 20:09:34 +00001295}
1296
Gabor Greifea3eec92010-04-09 10:57:00 +00001297static bool isLifetimeStart(const Instruction *Inst) {
1298 if (const IntrinsicInst* II = dyn_cast<IntrinsicInst>(Inst))
Owen Anderson9ff5a232009-12-02 07:35:19 +00001299 return II->getIntrinsicID() == Intrinsic::lifetime_start;
Chris Lattner720e7902009-12-02 06:44:58 +00001300 return false;
1301}
1302
Owen Anderson62bc33c2007-08-16 22:02:55 +00001303/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
1304/// non-local by performing PHI construction.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001305bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001306 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001307 // Find the non-local dependencies of the load.
Chris Lattner0ee443d2009-12-22 04:25:02 +00001308 SmallVector<NonLocalDepResult, 64> Deps;
Dan Gohman6d8eb152010-11-11 21:50:19 +00001309 AliasAnalysis::Location Loc = VN.getAliasAnalysis()->getLocation(LI);
1310 MD->getNonLocalPointerDependency(Loc, true, LI->getParent(), Deps);
David Greenebf7f78e2010-01-05 01:27:17 +00001311 //DEBUG(dbgs() << "INVESTIGATING NONLOCAL LOAD: "
Dan Gohman2a298992009-07-31 20:24:18 +00001312 // << Deps.size() << *LI << '\n');
Daniel Dunbara279bc32009-09-20 02:20:51 +00001313
Owen Anderson516eb1c2008-08-26 22:07:42 +00001314 // If we had to process more than one hundred blocks to find the
1315 // dependencies, this load isn't worth worrying about. Optimizing
1316 // it will be too expensive.
Chris Lattner91bcf642008-12-09 19:25:07 +00001317 if (Deps.size() > 100)
Owen Anderson516eb1c2008-08-26 22:07:42 +00001318 return false;
Chris Lattner5f4f84b2008-12-18 00:51:32 +00001319
1320 // If we had a phi translation failure, we'll have a single entry which is a
1321 // clobber in the current block. Reject this early.
Chris Lattnere18b9712009-12-09 07:08:01 +00001322 if (Deps.size() == 1 && Deps[0].getResult().isClobber()) {
Torok Edwin4306b1a2009-06-17 18:48:18 +00001323 DEBUG(
David Greenebf7f78e2010-01-05 01:27:17 +00001324 dbgs() << "GVN: non-local load ";
1325 WriteAsOperand(dbgs(), LI);
1326 dbgs() << " is clobbered by " << *Deps[0].getResult().getInst() << '\n';
Torok Edwin4306b1a2009-06-17 18:48:18 +00001327 );
Chris Lattner5f4f84b2008-12-18 00:51:32 +00001328 return false;
Torok Edwin4306b1a2009-06-17 18:48:18 +00001329 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001330
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001331 // Filter out useless results (non-locals, etc). Keep track of the blocks
1332 // where we have a value available in repl, also keep track of whether we see
1333 // dependencies that produce an unknown value for the load (such as a call
1334 // that could potentially clobber the load).
Chris Lattner87913512009-09-21 06:30:24 +00001335 SmallVector<AvailableValueInBlock, 16> ValuesPerBlock;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001336 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001337
Chris Lattner91bcf642008-12-09 19:25:07 +00001338 for (unsigned i = 0, e = Deps.size(); i != e; ++i) {
Chris Lattnere18b9712009-12-09 07:08:01 +00001339 BasicBlock *DepBB = Deps[i].getBB();
1340 MemDepResult DepInfo = Deps[i].getResult();
Daniel Dunbara279bc32009-09-20 02:20:51 +00001341
Chris Lattnerb51deb92008-12-05 21:04:20 +00001342 if (DepInfo.isClobber()) {
Chris Lattneraf064ae2009-12-09 18:21:46 +00001343 // The address being loaded in this non-local block may not be the same as
1344 // the pointer operand of the load if PHI translation occurs. Make sure
1345 // to consider the right address.
1346 Value *Address = Deps[i].getAddress();
1347
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001348 // If the dependence is to a store that writes to a superset of the bits
1349 // read by the load, we can extract the bits we need for the load from the
1350 // stored value.
1351 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInfo.getInst())) {
Chris Lattneraf064ae2009-12-09 18:21:46 +00001352 if (TD && Address) {
1353 int Offset = AnalyzeLoadFromClobberingStore(LI->getType(), Address,
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001354 DepSI, *TD);
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001355 if (Offset != -1) {
1356 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
Dan Gohman3355c4e2010-11-10 19:03:33 +00001357 DepSI->getValueOperand(),
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001358 Offset));
1359 continue;
1360 }
1361 }
1362 }
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001363
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001364 // If the clobbering value is a memset/memcpy/memmove, see if we can
1365 // forward a value on from it.
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001366 if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(DepInfo.getInst())) {
Chris Lattneraf064ae2009-12-09 18:21:46 +00001367 if (TD && Address) {
1368 int Offset = AnalyzeLoadFromClobberingMemInst(LI->getType(), Address,
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001369 DepMI, *TD);
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001370 if (Offset != -1) {
1371 ValuesPerBlock.push_back(AvailableValueInBlock::getMI(DepBB, DepMI,
1372 Offset));
1373 continue;
1374 }
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001375 }
1376 }
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001377
Chris Lattnerb51deb92008-12-05 21:04:20 +00001378 UnavailableBlocks.push_back(DepBB);
1379 continue;
1380 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001381
Chris Lattnerb51deb92008-12-05 21:04:20 +00001382 Instruction *DepInst = DepInfo.getInst();
Daniel Dunbara279bc32009-09-20 02:20:51 +00001383
Chris Lattnerb51deb92008-12-05 21:04:20 +00001384 // Loading the allocation -> undef.
Chris Lattner720e7902009-12-02 06:44:58 +00001385 if (isa<AllocaInst>(DepInst) || isMalloc(DepInst) ||
Owen Anderson9ff5a232009-12-02 07:35:19 +00001386 // Loading immediately after lifetime begin -> undef.
1387 isLifetimeStart(DepInst)) {
Chris Lattner87913512009-09-21 06:30:24 +00001388 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
1389 UndefValue::get(LI->getType())));
Chris Lattnerbf145d62008-12-01 01:15:42 +00001390 continue;
1391 }
Owen Andersonb62f7922009-10-28 07:05:35 +00001392
Chris Lattner87913512009-09-21 06:30:24 +00001393 if (StoreInst *S = dyn_cast<StoreInst>(DepInst)) {
Daniel Dunbara279bc32009-09-20 02:20:51 +00001394 // Reject loads and stores that are to the same address but are of
Chris Lattner771a5422009-09-20 20:09:34 +00001395 // different types if we have to.
Dan Gohman3355c4e2010-11-10 19:03:33 +00001396 if (S->getValueOperand()->getType() != LI->getType()) {
Chris Lattner771a5422009-09-20 20:09:34 +00001397 // If the stored value is larger or equal to the loaded value, we can
1398 // reuse it.
Dan Gohman3355c4e2010-11-10 19:03:33 +00001399 if (TD == 0 || !CanCoerceMustAliasedValueToLoad(S->getValueOperand(),
Chris Lattner8b2bc3d2009-09-21 17:24:04 +00001400 LI->getType(), *TD)) {
Chris Lattner771a5422009-09-20 20:09:34 +00001401 UnavailableBlocks.push_back(DepBB);
1402 continue;
1403 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001404 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001405
Chris Lattner87913512009-09-21 06:30:24 +00001406 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
Dan Gohman3355c4e2010-11-10 19:03:33 +00001407 S->getValueOperand()));
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001408 continue;
1409 }
1410
1411 if (LoadInst *LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattner771a5422009-09-20 20:09:34 +00001412 // If the types mismatch and we can't handle it, reject reuse of the load.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001413 if (LD->getType() != LI->getType()) {
Chris Lattner771a5422009-09-20 20:09:34 +00001414 // If the stored value is larger or equal to the loaded value, we can
1415 // reuse it.
Chris Lattner8b2bc3d2009-09-21 17:24:04 +00001416 if (TD == 0 || !CanCoerceMustAliasedValueToLoad(LD, LI->getType(),*TD)){
Chris Lattner771a5422009-09-20 20:09:34 +00001417 UnavailableBlocks.push_back(DepBB);
1418 continue;
1419 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001420 }
Chris Lattner87913512009-09-21 06:30:24 +00001421 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB, LD));
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001422 continue;
Owen Anderson0cd32032007-07-25 19:57:03 +00001423 }
Chris Lattner4fbd14e2009-09-21 06:48:08 +00001424
1425 UnavailableBlocks.push_back(DepBB);
1426 continue;
Chris Lattner88365bb2008-03-21 21:14:38 +00001427 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001428
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001429 // If we have no predecessors that produce a known value for this load, exit
1430 // early.
1431 if (ValuesPerBlock.empty()) return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001432
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001433 // If all of the instructions we depend on produce a known value for this
1434 // load, then it is fully redundant and we can use PHI insertion to compute
1435 // its value. Insert PHIs and remove the fully redundant value now.
1436 if (UnavailableBlocks.empty()) {
David Greenebf7f78e2010-01-05 01:27:17 +00001437 DEBUG(dbgs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Chris Lattner771a5422009-09-20 20:09:34 +00001438
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001439 // Perform PHI construction.
Chris Lattnerd2191e52009-12-21 23:15:48 +00001440 Value *V = ConstructSSAForLoadSet(LI, ValuesPerBlock, TD, *DT,
Chris Lattnera09fbf02009-10-10 23:50:30 +00001441 VN.getAliasAnalysis());
Chris Lattner771a5422009-09-20 20:09:34 +00001442 LI->replaceAllUsesWith(V);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001443
Chris Lattner771a5422009-09-20 20:09:34 +00001444 if (isa<PHINode>(V))
1445 V->takeName(LI);
Duncan Sands1df98592010-02-16 11:11:14 +00001446 if (V->getType()->isPointerTy())
Chris Lattner771a5422009-09-20 20:09:34 +00001447 MD->invalidateCachedPointerInfo(V);
Bob Wilson74175c22010-02-22 21:39:41 +00001448 VN.erase(LI);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001449 toErase.push_back(LI);
Dan Gohmanfe601042010-06-22 15:08:57 +00001450 ++NumGVNLoad;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001451 return true;
1452 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001453
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001454 if (!EnablePRE || !EnableLoadPRE)
1455 return false;
1456
1457 // Okay, we have *some* definitions of the value. This means that the value
1458 // is available in some of our (transitive) predecessors. Lets think about
1459 // doing PRE of this load. This will involve inserting a new load into the
1460 // predecessor when it's not available. We could do this in general, but
1461 // prefer to not increase code size. As such, we only do this when we know
1462 // that we only have to insert *one* load (which means we're basically moving
1463 // the load, not inserting a new one).
Daniel Dunbara279bc32009-09-20 02:20:51 +00001464
Owen Anderson88554df2009-05-31 09:03:40 +00001465 SmallPtrSet<BasicBlock *, 4> Blockers;
1466 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1467 Blockers.insert(UnavailableBlocks[i]);
1468
1469 // Lets find first basic block with more than one predecessor. Walk backwards
1470 // through predecessors if needed.
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001471 BasicBlock *LoadBB = LI->getParent();
Owen Anderson88554df2009-05-31 09:03:40 +00001472 BasicBlock *TmpBB = LoadBB;
1473
1474 bool isSinglePred = false;
Dale Johannesen42c3f552009-06-17 20:48:23 +00001475 bool allSingleSucc = true;
Owen Anderson88554df2009-05-31 09:03:40 +00001476 while (TmpBB->getSinglePredecessor()) {
1477 isSinglePred = true;
1478 TmpBB = TmpBB->getSinglePredecessor();
Owen Anderson88554df2009-05-31 09:03:40 +00001479 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1480 return false;
1481 if (Blockers.count(TmpBB))
1482 return false;
Owen Andersonb0ba0f42010-09-25 05:26:18 +00001483
1484 // If any of these blocks has more than one successor (i.e. if the edge we
1485 // just traversed was critical), then there are other paths through this
1486 // block along which the load may not be anticipated. Hoisting the load
1487 // above this block would be adding the load to execution paths along
1488 // which it was not previously executed.
Dale Johannesen42c3f552009-06-17 20:48:23 +00001489 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
Owen Andersonb0ba0f42010-09-25 05:26:18 +00001490 return false;
Owen Anderson88554df2009-05-31 09:03:40 +00001491 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001492
Owen Anderson88554df2009-05-31 09:03:40 +00001493 assert(TmpBB);
1494 LoadBB = TmpBB;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001495
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001496 // FIXME: It is extremely unclear what this loop is doing, other than
1497 // artificially restricting loadpre.
Owen Anderson88554df2009-05-31 09:03:40 +00001498 if (isSinglePred) {
1499 bool isHot = false;
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001500 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i) {
1501 const AvailableValueInBlock &AV = ValuesPerBlock[i];
1502 if (AV.isSimpleValue())
Daniel Dunbara279bc32009-09-20 02:20:51 +00001503 // "Hot" Instruction is in some loop (because it dominates its dep.
1504 // instruction).
Chris Lattnercb9cbc42009-12-06 04:54:31 +00001505 if (Instruction *I = dyn_cast<Instruction>(AV.getSimpleValue()))
1506 if (DT->dominates(LI, I)) {
1507 isHot = true;
1508 break;
1509 }
1510 }
Owen Anderson88554df2009-05-31 09:03:40 +00001511
1512 // We are interested only in "hot" instructions. We don't want to do any
1513 // mis-optimizations here.
1514 if (!isHot)
1515 return false;
1516 }
1517
Bob Wilson6cad4172010-02-01 21:17:14 +00001518 // Check to see how many predecessors have the loaded value fully
1519 // available.
1520 DenseMap<BasicBlock*, Value*> PredLoads;
Chris Lattner72bc70d2008-12-05 07:49:08 +00001521 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001522 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
Chris Lattner87913512009-09-21 06:30:24 +00001523 FullyAvailableBlocks[ValuesPerBlock[i].BB] = true;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001524 for (unsigned i = 0, e = UnavailableBlocks.size(); i != e; ++i)
1525 FullyAvailableBlocks[UnavailableBlocks[i]] = false;
1526
Bob Wilson34414a62010-05-04 20:03:21 +00001527 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> NeedToSplit;
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001528 for (pred_iterator PI = pred_begin(LoadBB), E = pred_end(LoadBB);
1529 PI != E; ++PI) {
Bob Wilson6cad4172010-02-01 21:17:14 +00001530 BasicBlock *Pred = *PI;
1531 if (IsValueFullyAvailableInBlock(Pred, FullyAvailableBlocks)) {
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001532 continue;
Bob Wilson6cad4172010-02-01 21:17:14 +00001533 }
1534 PredLoads[Pred] = 0;
Bob Wilson484d4a32010-02-16 19:51:59 +00001535
Bob Wilson6cad4172010-02-01 21:17:14 +00001536 if (Pred->getTerminator()->getNumSuccessors() != 1) {
Bob Wilson484d4a32010-02-16 19:51:59 +00001537 if (isa<IndirectBrInst>(Pred->getTerminator())) {
1538 DEBUG(dbgs() << "COULD NOT PRE LOAD BECAUSE OF INDBR CRITICAL EDGE '"
1539 << Pred->getName() << "': " << *LI << '\n');
1540 return false;
1541 }
Bob Wilsonae23daf2010-02-16 21:06:42 +00001542 unsigned SuccNum = GetSuccessorNumber(Pred, LoadBB);
Bob Wilson34414a62010-05-04 20:03:21 +00001543 NeedToSplit.push_back(std::make_pair(Pred->getTerminator(), SuccNum));
Bob Wilson6cad4172010-02-01 21:17:14 +00001544 }
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001545 }
Bob Wilson34414a62010-05-04 20:03:21 +00001546 if (!NeedToSplit.empty()) {
Bob Wilsonbc786532010-05-05 20:44:15 +00001547 toSplit.append(NeedToSplit.begin(), NeedToSplit.end());
Bob Wilson70704972010-03-01 23:37:32 +00001548 return false;
Bob Wilson34414a62010-05-04 20:03:21 +00001549 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001550
Bob Wilson6cad4172010-02-01 21:17:14 +00001551 // Decide whether PRE is profitable for this load.
1552 unsigned NumUnavailablePreds = PredLoads.size();
1553 assert(NumUnavailablePreds != 0 &&
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001554 "Fully available value should be eliminated above!");
Owen Anderson7267e142010-10-01 20:02:55 +00001555
1556 // If this load is unavailable in multiple predecessors, reject it.
1557 // FIXME: If we could restructure the CFG, we could make a common pred with
1558 // all the preds that don't have an available LI and insert a new load into
1559 // that one block.
1560 if (NumUnavailablePreds != 1)
Bob Wilson6cad4172010-02-01 21:17:14 +00001561 return false;
Bob Wilson6cad4172010-02-01 21:17:14 +00001562
1563 // Check if the load can safely be moved to all the unavailable predecessors.
1564 bool CanDoPRE = true;
Chris Lattnerdd696052009-11-28 15:39:14 +00001565 SmallVector<Instruction*, 8> NewInsts;
Bob Wilson6cad4172010-02-01 21:17:14 +00001566 for (DenseMap<BasicBlock*, Value*>::iterator I = PredLoads.begin(),
1567 E = PredLoads.end(); I != E; ++I) {
1568 BasicBlock *UnavailablePred = I->first;
1569
1570 // Do PHI translation to get its value in the predecessor if necessary. The
1571 // returned pointer (if non-null) is guaranteed to dominate UnavailablePred.
1572
1573 // If all preds have a single successor, then we know it is safe to insert
1574 // the load on the pred (?!?), so we can insert code to materialize the
1575 // pointer if it is not available.
Dan Gohman3355c4e2010-11-10 19:03:33 +00001576 PHITransAddr Address(LI->getPointerOperand(), TD);
Bob Wilson6cad4172010-02-01 21:17:14 +00001577 Value *LoadPtr = 0;
1578 if (allSingleSucc) {
1579 LoadPtr = Address.PHITranslateWithInsertion(LoadBB, UnavailablePred,
1580 *DT, NewInsts);
1581 } else {
Daniel Dunbar6d8f2ca2010-02-24 08:48:04 +00001582 Address.PHITranslateValue(LoadBB, UnavailablePred, DT);
Bob Wilson6cad4172010-02-01 21:17:14 +00001583 LoadPtr = Address.getAddr();
Bob Wilson6cad4172010-02-01 21:17:14 +00001584 }
1585
1586 // If we couldn't find or insert a computation of this phi translated value,
1587 // we fail PRE.
1588 if (LoadPtr == 0) {
1589 DEBUG(dbgs() << "COULDN'T INSERT PHI TRANSLATED VALUE OF: "
Dan Gohman3355c4e2010-11-10 19:03:33 +00001590 << *LI->getPointerOperand() << "\n");
Bob Wilson6cad4172010-02-01 21:17:14 +00001591 CanDoPRE = false;
1592 break;
1593 }
1594
1595 // Make sure it is valid to move this load here. We have to watch out for:
1596 // @1 = getelementptr (i8* p, ...
1597 // test p and branch if == 0
1598 // load @1
1599 // It is valid to have the getelementptr before the test, even if p can be 0,
1600 // as getelementptr only does address arithmetic.
1601 // If we are not pushing the value through any multiple-successor blocks
1602 // we do not have this case. Otherwise, check that the load is safe to
1603 // put anywhere; this can be improved, but should be conservatively safe.
1604 if (!allSingleSucc &&
1605 // FIXME: REEVALUTE THIS.
1606 !isSafeToLoadUnconditionally(LoadPtr,
1607 UnavailablePred->getTerminator(),
1608 LI->getAlignment(), TD)) {
1609 CanDoPRE = false;
1610 break;
1611 }
1612
1613 I->second = LoadPtr;
Chris Lattner05e15f82009-12-09 01:59:31 +00001614 }
1615
Bob Wilson6cad4172010-02-01 21:17:14 +00001616 if (!CanDoPRE) {
1617 while (!NewInsts.empty())
1618 NewInsts.pop_back_val()->eraseFromParent();
Dale Johannesen42c3f552009-06-17 20:48:23 +00001619 return false;
Chris Lattner0c264b12009-11-28 16:08:18 +00001620 }
Dale Johannesen42c3f552009-06-17 20:48:23 +00001621
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001622 // Okay, we can eliminate this load by inserting a reload in the predecessor
1623 // and using PHI construction to get the value in the other predecessors, do
1624 // it.
David Greenebf7f78e2010-01-05 01:27:17 +00001625 DEBUG(dbgs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Chris Lattner0c264b12009-11-28 16:08:18 +00001626 DEBUG(if (!NewInsts.empty())
David Greenebf7f78e2010-01-05 01:27:17 +00001627 dbgs() << "INSERTED " << NewInsts.size() << " INSTS: "
Chris Lattner0c264b12009-11-28 16:08:18 +00001628 << *NewInsts.back() << '\n');
1629
Bob Wilson6cad4172010-02-01 21:17:14 +00001630 // Assign value numbers to the new instructions.
1631 for (unsigned i = 0, e = NewInsts.size(); i != e; ++i) {
1632 // FIXME: We really _ought_ to insert these value numbers into their
1633 // parent's availability map. However, in doing so, we risk getting into
1634 // ordering issues. If a block hasn't been processed yet, we would be
1635 // marking a value as AVAIL-IN, which isn't what we intend.
1636 VN.lookup_or_add(NewInsts[i]);
1637 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001638
Bob Wilson6cad4172010-02-01 21:17:14 +00001639 for (DenseMap<BasicBlock*, Value*>::iterator I = PredLoads.begin(),
1640 E = PredLoads.end(); I != E; ++I) {
1641 BasicBlock *UnavailablePred = I->first;
1642 Value *LoadPtr = I->second;
1643
Dan Gohmanf4177aa2010-12-15 23:53:55 +00001644 Instruction *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1645 LI->getAlignment(),
1646 UnavailablePred->getTerminator());
1647
1648 // Transfer the old load's TBAA tag to the new load.
1649 if (MDNode *Tag = LI->getMetadata(LLVMContext::MD_tbaa))
1650 NewLoad->setMetadata(LLVMContext::MD_tbaa, Tag);
Bob Wilson6cad4172010-02-01 21:17:14 +00001651
1652 // Add the newly created load.
1653 ValuesPerBlock.push_back(AvailableValueInBlock::get(UnavailablePred,
1654 NewLoad));
Bob Wilson188f4282010-02-23 05:55:00 +00001655 MD->invalidateCachedPointerInfo(LoadPtr);
1656 DEBUG(dbgs() << "GVN INSERTED " << *NewLoad << '\n');
Bob Wilson6cad4172010-02-01 21:17:14 +00001657 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001658
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001659 // Perform PHI construction.
Chris Lattnerd2191e52009-12-21 23:15:48 +00001660 Value *V = ConstructSSAForLoadSet(LI, ValuesPerBlock, TD, *DT,
Chris Lattnera09fbf02009-10-10 23:50:30 +00001661 VN.getAliasAnalysis());
Chris Lattner771a5422009-09-20 20:09:34 +00001662 LI->replaceAllUsesWith(V);
1663 if (isa<PHINode>(V))
1664 V->takeName(LI);
Duncan Sands1df98592010-02-16 11:11:14 +00001665 if (V->getType()->isPointerTy())
Chris Lattner771a5422009-09-20 20:09:34 +00001666 MD->invalidateCachedPointerInfo(V);
Bob Wilson74175c22010-02-22 21:39:41 +00001667 VN.erase(LI);
Chris Lattnerc89c6a92008-12-02 08:16:11 +00001668 toErase.push_back(LI);
Dan Gohmanfe601042010-06-22 15:08:57 +00001669 ++NumPRELoad;
Owen Anderson0cd32032007-07-25 19:57:03 +00001670 return true;
1671}
1672
Owen Anderson62bc33c2007-08-16 22:02:55 +00001673/// processLoad - Attempt to eliminate a load, first by eliminating it
1674/// locally, and then attempting non-local elimination if that fails.
Chris Lattnerb51deb92008-12-05 21:04:20 +00001675bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
Dan Gohman4ec01b22009-11-14 02:27:51 +00001676 if (!MD)
1677 return false;
1678
Chris Lattnerb51deb92008-12-05 21:04:20 +00001679 if (L->isVolatile())
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001680 return false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001681
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001682 // ... to a pointer that has been loaded from before...
Chris Lattnerb2412a82009-09-21 02:42:51 +00001683 MemDepResult Dep = MD->getDependency(L);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001684
Chris Lattnerb51deb92008-12-05 21:04:20 +00001685 // If the value isn't available, don't do anything!
Chris Lattnerb2412a82009-09-21 02:42:51 +00001686 if (Dep.isClobber()) {
Chris Lattnereed919b2009-09-21 05:57:11 +00001687 // Check to see if we have something like this:
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001688 // store i32 123, i32* %P
1689 // %A = bitcast i32* %P to i8*
1690 // %B = gep i8* %A, i32 1
1691 // %C = load i8* %B
1692 //
1693 // We could do that by recognizing if the clobber instructions are obviously
1694 // a common base + constant offset, and if the previous store (or memset)
1695 // completely covers this load. This sort of thing can happen in bitfield
1696 // access code.
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001697 Value *AvailVal = 0;
Chris Lattnereed919b2009-09-21 05:57:11 +00001698 if (StoreInst *DepSI = dyn_cast<StoreInst>(Dep.getInst()))
Duncan Sands88c3df72010-11-12 21:10:24 +00001699 if (TD) {
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001700 int Offset = AnalyzeLoadFromClobberingStore(L->getType(),
1701 L->getPointerOperand(),
1702 DepSI, *TD);
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001703 if (Offset != -1)
Dan Gohman3355c4e2010-11-10 19:03:33 +00001704 AvailVal = GetStoreValueForLoad(DepSI->getValueOperand(), Offset,
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001705 L->getType(), L, *TD);
Chris Lattner1ce08292009-09-21 06:22:46 +00001706 }
Chris Lattnereed919b2009-09-21 05:57:11 +00001707
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001708 // If the clobbering value is a memset/memcpy/memmove, see if we can forward
1709 // a value on from it.
1710 if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(Dep.getInst())) {
Duncan Sands88c3df72010-11-12 21:10:24 +00001711 if (TD) {
Chris Lattner4ca70fe2009-12-09 07:37:07 +00001712 int Offset = AnalyzeLoadFromClobberingMemInst(L->getType(),
1713 L->getPointerOperand(),
1714 DepMI, *TD);
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001715 if (Offset != -1)
1716 AvailVal = GetMemInstValueForLoad(DepMI, Offset, L->getType(), L,*TD);
1717 }
1718 }
1719
1720 if (AvailVal) {
David Greenebf7f78e2010-01-05 01:27:17 +00001721 DEBUG(dbgs() << "GVN COERCED INST:\n" << *Dep.getInst() << '\n'
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001722 << *AvailVal << '\n' << *L << "\n\n\n");
1723
1724 // Replace the load!
1725 L->replaceAllUsesWith(AvailVal);
Duncan Sands1df98592010-02-16 11:11:14 +00001726 if (AvailVal->getType()->isPointerTy())
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001727 MD->invalidateCachedPointerInfo(AvailVal);
Bob Wilson74175c22010-02-22 21:39:41 +00001728 VN.erase(L);
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001729 toErase.push_back(L);
Dan Gohmanfe601042010-06-22 15:08:57 +00001730 ++NumGVNLoad;
Chris Lattnerfaf815b2009-12-06 01:57:02 +00001731 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
David Greenebf7f78e2010-01-05 01:27:17 +00001736 dbgs() << "GVN: load ";
1737 WriteAsOperand(dbgs(), L);
Chris Lattnerb2412a82009-09-21 02:42:51 +00001738 Instruction *I = Dep.getInst();
David Greenebf7f78e2010-01-05 01:27:17 +00001739 dbgs() << " 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)) {
Dan Gohman3355c4e2010-11-10 19:03:33 +00001750 Value *StoredVal = DepSI->getValueOperand();
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001751
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).
Chris Lattnera52fce42009-10-21 04:11:19 +00001755 if (StoredVal->getType() != L->getType()) {
Duncan Sands88c3df72010-11-12 21:10:24 +00001756 if (TD) {
Chris Lattnera52fce42009-10-21 04:11:19 +00001757 StoredVal = CoerceAvailableValueToLoadType(StoredVal, L->getType(),
1758 L, *TD);
1759 if (StoredVal == 0)
1760 return false;
1761
David Greenebf7f78e2010-01-05 01:27:17 +00001762 DEBUG(dbgs() << "GVN COERCED STORE:\n" << *DepSI << '\n' << *StoredVal
Chris Lattnera52fce42009-10-21 04:11:19 +00001763 << '\n' << *L << "\n\n\n");
1764 }
1765 else
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001766 return false;
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001767 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001768
Chris Lattnerb51deb92008-12-05 21:04:20 +00001769 // Remove it!
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001770 L->replaceAllUsesWith(StoredVal);
Duncan Sands1df98592010-02-16 11:11:14 +00001771 if (StoredVal->getType()->isPointerTy())
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001772 MD->invalidateCachedPointerInfo(StoredVal);
Bob Wilson74175c22010-02-22 21:39:41 +00001773 VN.erase(L);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001774 toErase.push_back(L);
Dan Gohmanfe601042010-06-22 15:08:57 +00001775 ++NumGVNLoad;
Chris Lattnerb51deb92008-12-05 21:04:20 +00001776 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).
Chris Lattnera52fce42009-10-21 04:11:19 +00001785 if (DepLI->getType() != L->getType()) {
Duncan Sands88c3df72010-11-12 21:10:24 +00001786 if (TD) {
Chris Lattnera52fce42009-10-21 04:11:19 +00001787 AvailableVal = CoerceAvailableValueToLoadType(DepLI, L->getType(), L,*TD);
1788 if (AvailableVal == 0)
1789 return false;
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001790
David Greenebf7f78e2010-01-05 01:27:17 +00001791 DEBUG(dbgs() << "GVN COERCED LOAD:\n" << *DepLI << "\n" << *AvailableVal
Chris Lattnera52fce42009-10-21 04:11:19 +00001792 << "\n" << *L << "\n\n\n");
1793 }
1794 else
1795 return false;
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001796 }
1797
Chris Lattnerb51deb92008-12-05 21:04:20 +00001798 // Remove it!
Chris Lattnerbb6495c2009-09-20 19:03:47 +00001799 L->replaceAllUsesWith(AvailableVal);
Duncan Sands1df98592010-02-16 11:11:14 +00001800 if (DepLI->getType()->isPointerTy())
Chris Lattnerbc99be12008-12-09 22:06:23 +00001801 MD->invalidateCachedPointerInfo(DepLI);
Bob Wilson74175c22010-02-22 21:39:41 +00001802 VN.erase(L);
Chris Lattnerb51deb92008-12-05 21:04:20 +00001803 toErase.push_back(L);
Dan Gohmanfe601042010-06-22 15:08:57 +00001804 ++NumGVNLoad;
Chris Lattnerb51deb92008-12-05 21:04:20 +00001805 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()));
Bob Wilson74175c22010-02-22 21:39:41 +00001813 VN.erase(L);
Chris Lattner237a8282008-11-30 01:39:32 +00001814 toErase.push_back(L);
Dan Gohmanfe601042010-06-22 15:08:57 +00001815 ++NumGVNLoad;
Chris Lattnerb51deb92008-12-05 21:04:20 +00001816 return true;
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001817 }
Owen Andersonb62f7922009-10-28 07:05:35 +00001818
Owen Anderson9ff5a232009-12-02 07:35:19 +00001819 // If this load occurs either right after a lifetime begin,
Owen Andersonb62f7922009-10-28 07:05:35 +00001820 // then the loaded value is undefined.
1821 if (IntrinsicInst* II = dyn_cast<IntrinsicInst>(DepInst)) {
Owen Anderson9ff5a232009-12-02 07:35:19 +00001822 if (II->getIntrinsicID() == Intrinsic::lifetime_start) {
Owen Andersonb62f7922009-10-28 07:05:35 +00001823 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Bob Wilson74175c22010-02-22 21:39:41 +00001824 VN.erase(L);
Owen Andersonb62f7922009-10-28 07:05:35 +00001825 toErase.push_back(L);
Dan Gohmanfe601042010-06-22 15:08:57 +00001826 ++NumGVNLoad;
Owen Andersonb62f7922009-10-28 07:05:35 +00001827 return true;
1828 }
1829 }
Eli Friedmanb6c36e42008-02-12 12:08:14 +00001830
Chris Lattnerb51deb92008-12-05 21:04:20 +00001831 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001832}
1833
Owen Anderson68c26392010-11-19 22:48:40 +00001834// lookupNumber - In order to find a leader for a given value number at a
1835// specific basic block, we first obtain the list of all Values for that number,
1836// and then scan the list to find one whose block dominates the block in
1837// question. This is fast because dominator tree queries consist of only
1838// a few comparisons of DFS numbers.
Chris Lattnerb2412a82009-09-21 02:42:51 +00001839Value *GVN::lookupNumber(BasicBlock *BB, uint32_t num) {
Owen Andersona04a0642010-11-18 18:32:40 +00001840 std::pair<Value*, void*> Vals = NumberTable[num];
1841 if (!Vals.first) return 0;
1842 Instruction *Inst = dyn_cast<Instruction>(Vals.first);
1843 if (!Inst) return Vals.first;
1844 BasicBlock *Parent = Inst->getParent();
1845 if (DT->dominates(Parent, BB))
1846 return Inst;
1847
1848 std::pair<Value*, void*>* Next =
1849 static_cast<std::pair<Value*, void*>*>(Vals.second);
1850 while (Next) {
1851 Instruction *CurrInst = dyn_cast<Instruction>(Next->first);
1852 if (!CurrInst) return Next->first;
1853
1854 BasicBlock *Parent = CurrInst->getParent();
1855 if (DT->dominates(Parent, BB))
1856 return CurrInst;
1857
1858 Next = static_cast<std::pair<Value*, void*>*>(Next->second);
Owen Anderson6fafe842008-06-20 01:15:47 +00001859 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001860
Owen Anderson6fafe842008-06-20 01:15:47 +00001861 return 0;
1862}
1863
Owen Anderson255dafc2008-12-15 02:03:00 +00001864
Owen Anderson36057c72007-08-14 18:16:29 +00001865/// processInstruction - When calculating availability, handle an instruction
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001866/// by inserting it into the appropriate sets
Owen Andersonaf4240a2008-06-12 19:25:32 +00001867bool GVN::processInstruction(Instruction *I,
Chris Lattner8e1e95c2008-03-21 22:01:16 +00001868 SmallVectorImpl<Instruction*> &toErase) {
Devang Patelbe905e22010-02-11 00:20:49 +00001869 // Ignore dbg info intrinsics.
1870 if (isa<DbgInfoIntrinsic>(I))
1871 return false;
1872
Duncan Sands88c3df72010-11-12 21:10:24 +00001873 // If the instruction can be easily simplified then do so now in preference
1874 // to value numbering it. Value numbering often exposes redundancies, for
1875 // example if it determines that %y is equal to %x then the instruction
1876 // "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we now simplify.
Duncan Sandseff05812010-11-14 18:36:10 +00001877 if (Value *V = SimplifyInstruction(I, TD, DT)) {
Duncan Sands88c3df72010-11-12 21:10:24 +00001878 I->replaceAllUsesWith(V);
1879 if (MD && V->getType()->isPointerTy())
1880 MD->invalidateCachedPointerInfo(V);
1881 VN.erase(I);
1882 toErase.push_back(I);
1883 return true;
1884 }
1885
Chris Lattnerb2412a82009-09-21 02:42:51 +00001886 if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
1887 bool Changed = processLoad(LI, toErase);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001888
Chris Lattnerb2412a82009-09-21 02:42:51 +00001889 if (!Changed) {
1890 unsigned Num = VN.lookup_or_add(LI);
Owen Andersona04a0642010-11-18 18:32:40 +00001891 insert_table(Num, LI);
Owen Andersonb2303722008-06-18 21:41:49 +00001892 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001893
Chris Lattnerb2412a82009-09-21 02:42:51 +00001894 return Changed;
Owen Andersonb2303722008-06-18 21:41:49 +00001895 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001896
Chris Lattnerb2412a82009-09-21 02:42:51 +00001897 uint32_t NextNum = VN.getNextUnusedValueNumber();
1898 unsigned Num = VN.lookup_or_add(I);
Daniel Dunbara279bc32009-09-20 02:20:51 +00001899
Owen Andersone5ffa902008-04-07 09:59:07 +00001900 // Allocations are always uniquely numbered, so we can save time and memory
Daniel Dunbara279bc32009-09-20 02:20:51 +00001901 // by fast failing them.
Chris Lattner459f4f82010-12-19 20:24:28 +00001902 if (isa<AllocaInst>(I) || isa<TerminatorInst>(I) || isa<PHINode>(I)) {
Owen Andersona04a0642010-11-18 18:32:40 +00001903 insert_table(Num, I);
Owen Andersone5ffa902008-04-07 09:59:07 +00001904 return false;
Owen Andersonb2303722008-06-18 21:41:49 +00001905 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001906
Owen Anderson0ae33ef2008-07-03 17:44:33 +00001907 // If the number we were assigned was a brand new VN, then we don't
1908 // need to do a lookup to see if the number already exists
1909 // somewhere in the domtree: it can't!
Chris Lattner459f4f82010-12-19 20:24:28 +00001910 if (Num == NextNum) {
Owen Andersona04a0642010-11-18 18:32:40 +00001911 insert_table(Num, I);
Chris Lattner459f4f82010-12-19 20:24:28 +00001912 return false;
1913 }
1914
Owen Anderson255dafc2008-12-15 02:03:00 +00001915 // Perform fast-path value-number based elimination of values inherited from
1916 // dominators.
Chris Lattner459f4f82010-12-19 20:24:28 +00001917 Value *repl = lookupNumber(I->getParent(), Num);
1918 if (repl == 0) {
1919 // Failure, just remember this instance for future use.
Owen Andersona04a0642010-11-18 18:32:40 +00001920 insert_table(Num, I);
Chris Lattner459f4f82010-12-19 20:24:28 +00001921 return false;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001922 }
Chris Lattner459f4f82010-12-19 20:24:28 +00001923
1924 // Remove it!
1925 VN.erase(I);
1926 I->replaceAllUsesWith(repl);
1927 if (MD && repl->getType()->isPointerTy())
1928 MD->invalidateCachedPointerInfo(repl);
1929 toErase.push_back(I);
1930 return true;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00001931}
1932
Bill Wendling30788b82008-12-22 22:32:22 +00001933/// runOnFunction - This is the main transformation entry point for a function.
Owen Anderson3e75a422007-08-14 18:04:11 +00001934bool GVN::runOnFunction(Function& F) {
Dan Gohman4ec01b22009-11-14 02:27:51 +00001935 if (!NoLoads)
1936 MD = &getAnalysis<MemoryDependenceAnalysis>();
Chris Lattner663e4412008-12-01 00:40:32 +00001937 DT = &getAnalysis<DominatorTree>();
Duncan Sands88c3df72010-11-12 21:10:24 +00001938 TD = getAnalysisIfAvailable<TargetData>();
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);
Dan Gohmanfe601042010-06-22 15:08:57 +00001952 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) {
David Greenebf7f78e2010-01-05 01:27:17 +00001960 DEBUG(dbgs() << "GVN iteration: " << Iteration << "\n");
Chris Lattnerb2412a82009-09-21 02:42:51 +00001961 ShouldContinue = iterateOnFunction(F);
Bob Wilson484d4a32010-02-16 19:51:59 +00001962 if (splitCriticalEdges())
1963 ShouldContinue = true;
Chris Lattnerb2412a82009-09-21 02:42:51 +00001964 Changed |= ShouldContinue;
Chris Lattnerae199312008-12-09 19:21:47 +00001965 ++Iteration;
Owen Anderson3e75a422007-08-14 18:04:11 +00001966 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001967
Owen Andersone98c54c2008-07-18 18:03:38 +00001968 if (EnablePRE) {
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001969 bool PREChanged = true;
1970 while (PREChanged) {
1971 PREChanged = performPRE(F);
Chris Lattnerb2412a82009-09-21 02:42:51 +00001972 Changed |= PREChanged;
Owen Anderson0c7f91c2008-09-03 23:06:07 +00001973 }
Owen Andersone98c54c2008-07-18 18:03:38 +00001974 }
Chris Lattnerae199312008-12-09 19:21:47 +00001975 // FIXME: Should perform GVN again after PRE does something. PRE can move
1976 // computations into blocks where they become fully redundant. Note that
1977 // we can't do this until PRE's critical edge splitting updates memdep.
1978 // Actually, when this happens, we should just fully integrate PRE into GVN.
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00001979
1980 cleanupGlobalSets();
1981
Chris Lattnerb2412a82009-09-21 02:42:51 +00001982 return Changed;
Owen Anderson3e75a422007-08-14 18:04:11 +00001983}
1984
1985
Chris Lattnerb2412a82009-09-21 02:42:51 +00001986bool GVN::processBlock(BasicBlock *BB) {
Chris Lattnerae199312008-12-09 19:21:47 +00001987 // FIXME: Kill off toErase by doing erasing eagerly in a helper function (and
1988 // incrementing BI before processing an instruction).
Owen Andersonaf4240a2008-06-12 19:25:32 +00001989 SmallVector<Instruction*, 8> toErase;
Chris Lattnerb2412a82009-09-21 02:42:51 +00001990 bool ChangedFunction = false;
Daniel Dunbara279bc32009-09-20 02:20:51 +00001991
Owen Andersonaf4240a2008-06-12 19:25:32 +00001992 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1993 BI != BE;) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00001994 ChangedFunction |= processInstruction(BI, toErase);
Owen Andersonaf4240a2008-06-12 19:25:32 +00001995 if (toErase.empty()) {
1996 ++BI;
1997 continue;
1998 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00001999
Owen Andersonaf4240a2008-06-12 19:25:32 +00002000 // If we need some instructions deleted, do it now.
2001 NumGVNInstr += toErase.size();
Daniel Dunbara279bc32009-09-20 02:20:51 +00002002
Owen Andersonaf4240a2008-06-12 19:25:32 +00002003 // Avoid iterator invalidation.
2004 bool AtStart = BI == BB->begin();
2005 if (!AtStart)
2006 --BI;
2007
2008 for (SmallVector<Instruction*, 4>::iterator I = toErase.begin(),
Chris Lattner663e4412008-12-01 00:40:32 +00002009 E = toErase.end(); I != E; ++I) {
David Greenebf7f78e2010-01-05 01:27:17 +00002010 DEBUG(dbgs() << "GVN removed: " << **I << '\n');
Dan Gohman4ec01b22009-11-14 02:27:51 +00002011 if (MD) MD->removeInstruction(*I);
Owen Andersonaf4240a2008-06-12 19:25:32 +00002012 (*I)->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00002013 DEBUG(verifyRemoved(*I));
Chris Lattner663e4412008-12-01 00:40:32 +00002014 }
Chris Lattnerae199312008-12-09 19:21:47 +00002015 toErase.clear();
Owen Andersonaf4240a2008-06-12 19:25:32 +00002016
2017 if (AtStart)
2018 BI = BB->begin();
2019 else
2020 ++BI;
Owen Andersonaf4240a2008-06-12 19:25:32 +00002021 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002022
Chris Lattnerb2412a82009-09-21 02:42:51 +00002023 return ChangedFunction;
Owen Andersonaf4240a2008-06-12 19:25:32 +00002024}
2025
Owen Andersonb2303722008-06-18 21:41:49 +00002026/// performPRE - Perform a purely local form of PRE that looks for diamond
2027/// control flow patterns and attempts to perform simple PRE at the join point.
Chris Lattnerfb6e7012009-10-31 22:11:15 +00002028bool GVN::performPRE(Function &F) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002029 bool Changed = false;
Chris Lattner09713792008-12-01 07:29:03 +00002030 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersonb2303722008-06-18 21:41:49 +00002031 for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
2032 DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002033 BasicBlock *CurrentBlock = *DI;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002034
Owen Andersonb2303722008-06-18 21:41:49 +00002035 // Nothing to PRE in the entry block.
2036 if (CurrentBlock == &F.getEntryBlock()) continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002037
Owen Andersonb2303722008-06-18 21:41:49 +00002038 for (BasicBlock::iterator BI = CurrentBlock->begin(),
2039 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002040 Instruction *CurInst = BI++;
Duncan Sands7af1c782009-05-06 06:49:50 +00002041
Victor Hernandez7b929da2009-10-23 21:09:37 +00002042 if (isa<AllocaInst>(CurInst) ||
Victor Hernandez83d63912009-09-18 22:35:49 +00002043 isa<TerminatorInst>(CurInst) || isa<PHINode>(CurInst) ||
Devang Patel9674d152009-10-14 17:29:00 +00002044 CurInst->getType()->isVoidTy() ||
Duncan Sands7af1c782009-05-06 06:49:50 +00002045 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell090c0a22009-03-10 15:04:53 +00002046 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002047 continue;
Owen Anderson5015b342010-08-07 00:20:35 +00002048
2049 // We don't currently value number ANY inline asm calls.
2050 if (CallInst *CallI = dyn_cast<CallInst>(CurInst))
2051 if (CallI->isInlineAsm())
2052 continue;
Duncan Sands7af1c782009-05-06 06:49:50 +00002053
Chris Lattnerb2412a82009-09-21 02:42:51 +00002054 uint32_t ValNo = VN.lookup(CurInst);
Daniel Dunbara279bc32009-09-20 02:20:51 +00002055
Owen Andersonb2303722008-06-18 21:41:49 +00002056 // Look for the predecessors for PRE opportunities. We're
2057 // only trying to solve the basic diamond case, where
2058 // a value is computed in the successor and one predecessor,
2059 // but not the other. We also explicitly disallow cases
2060 // where the successor is its own predecessor, because they're
2061 // more complicated to get right.
Chris Lattnerb2412a82009-09-21 02:42:51 +00002062 unsigned NumWith = 0;
2063 unsigned NumWithout = 0;
2064 BasicBlock *PREPred = 0;
Chris Lattner09713792008-12-01 07:29:03 +00002065 predMap.clear();
2066
Owen Andersonb2303722008-06-18 21:41:49 +00002067 for (pred_iterator PI = pred_begin(CurrentBlock),
2068 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
Gabor Greif08149852010-07-09 14:36:49 +00002069 BasicBlock *P = *PI;
Owen Andersonb2303722008-06-18 21:41:49 +00002070 // We're not interested in PRE where the block is its
Bob Wilsone7b635f2010-02-03 00:33:21 +00002071 // own predecessor, or in blocks with predecessors
Owen Anderson6fafe842008-06-20 01:15:47 +00002072 // that are not reachable.
Gabor Greif08149852010-07-09 14:36:49 +00002073 if (P == CurrentBlock) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002074 NumWithout = 2;
Owen Anderson6fafe842008-06-20 01:15:47 +00002075 break;
Owen Andersona04a0642010-11-18 18:32:40 +00002076 } else if (!DT->dominates(&F.getEntryBlock(), P)) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002077 NumWithout = 2;
Owen Anderson6fafe842008-06-20 01:15:47 +00002078 break;
2079 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002080
Owen Andersona04a0642010-11-18 18:32:40 +00002081 Value* predV = lookupNumber(P, ValNo);
2082 if (predV == 0) {
Gabor Greif08149852010-07-09 14:36:49 +00002083 PREPred = P;
Dan Gohmanfe601042010-06-22 15:08:57 +00002084 ++NumWithout;
Owen Andersona04a0642010-11-18 18:32:40 +00002085 } else if (predV == CurInst) {
Chris Lattnerb2412a82009-09-21 02:42:51 +00002086 NumWithout = 2;
Owen Andersonb2303722008-06-18 21:41:49 +00002087 } else {
Owen Andersona04a0642010-11-18 18:32:40 +00002088 predMap[P] = predV;
Dan Gohmanfe601042010-06-22 15:08:57 +00002089 ++NumWith;
Owen Andersonb2303722008-06-18 21:41:49 +00002090 }
2091 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002092
Owen Andersonb2303722008-06-18 21:41:49 +00002093 // Don't do PRE when it might increase code size, i.e. when
2094 // we would need to insert instructions in more than one pred.
Chris Lattnerb2412a82009-09-21 02:42:51 +00002095 if (NumWithout != 1 || NumWith == 0)
Owen Andersonb2303722008-06-18 21:41:49 +00002096 continue;
Chris Lattnerfb6e7012009-10-31 22:11:15 +00002097
2098 // Don't do PRE across indirect branch.
2099 if (isa<IndirectBrInst>(PREPred->getTerminator()))
2100 continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002101
Owen Anderson5c274ee2008-06-19 19:54:19 +00002102 // We can't do PRE safely on a critical edge, so instead we schedule
2103 // the edge to be split and perform the PRE the next time we iterate
2104 // on the function.
Bob Wilsonae23daf2010-02-16 21:06:42 +00002105 unsigned SuccNum = GetSuccessorNumber(PREPred, CurrentBlock);
Chris Lattnerb2412a82009-09-21 02:42:51 +00002106 if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
2107 toSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
Owen Anderson5c274ee2008-06-19 19:54:19 +00002108 continue;
2109 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002110
Bob Wilsone7b635f2010-02-03 00:33:21 +00002111 // Instantiate the expression in the predecessor that lacked it.
Owen Andersonb2303722008-06-18 21:41:49 +00002112 // Because we are going top-down through the block, all value numbers
2113 // will be available in the predecessor by the time we need them. Any
Bob Wilsone7b635f2010-02-03 00:33:21 +00002114 // that weren't originally present will have been instantiated earlier
Owen Andersonb2303722008-06-18 21:41:49 +00002115 // in this loop.
Nick Lewycky67760642009-09-27 07:38:41 +00002116 Instruction *PREInstr = CurInst->clone();
Owen Andersonb2303722008-06-18 21:41:49 +00002117 bool success = true;
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002118 for (unsigned i = 0, e = CurInst->getNumOperands(); i != e; ++i) {
2119 Value *Op = PREInstr->getOperand(i);
2120 if (isa<Argument>(Op) || isa<Constant>(Op) || isa<GlobalValue>(Op))
2121 continue;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002122
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002123 if (Value *V = lookupNumber(PREPred, VN.lookup(Op))) {
2124 PREInstr->setOperand(i, V);
2125 } else {
2126 success = false;
2127 break;
Owen Andersonc45996b2008-07-11 20:05:13 +00002128 }
Owen Andersonb2303722008-06-18 21:41:49 +00002129 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002130
Owen Andersonb2303722008-06-18 21:41:49 +00002131 // Fail out if we encounter an operand that is not available in
Daniel Dunbara279bc32009-09-20 02:20:51 +00002132 // the PRE predecessor. This is typically because of loads which
Owen Andersonb2303722008-06-18 21:41:49 +00002133 // are not value numbered precisely.
2134 if (!success) {
2135 delete PREInstr;
Bill Wendling70ded192008-12-22 22:14:07 +00002136 DEBUG(verifyRemoved(PREInstr));
Owen Andersonb2303722008-06-18 21:41:49 +00002137 continue;
2138 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002139
Owen Andersonb2303722008-06-18 21:41:49 +00002140 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002141 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson6fafe842008-06-20 01:15:47 +00002142 predMap[PREPred] = PREInstr;
Chris Lattnerb2412a82009-09-21 02:42:51 +00002143 VN.add(PREInstr, ValNo);
Dan Gohmanfe601042010-06-22 15:08:57 +00002144 ++NumGVNPRE;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002145
Owen Andersonb2303722008-06-18 21:41:49 +00002146 // Update the availability map to include the new instruction.
Owen Andersona04a0642010-11-18 18:32:40 +00002147 insert_table(ValNo, PREInstr);
Daniel Dunbara279bc32009-09-20 02:20:51 +00002148
Owen Andersonb2303722008-06-18 21:41:49 +00002149 // Create a PHI to make the value available in this block.
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002150 PHINode* Phi = PHINode::Create(CurInst->getType(),
2151 CurInst->getName() + ".pre-phi",
Owen Andersonb2303722008-06-18 21:41:49 +00002152 CurrentBlock->begin());
2153 for (pred_iterator PI = pred_begin(CurrentBlock),
Gabor Greif1d3ae022010-07-09 14:48:08 +00002154 PE = pred_end(CurrentBlock); PI != PE; ++PI) {
2155 BasicBlock *P = *PI;
2156 Phi->addIncoming(predMap[P], P);
2157 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002158
Chris Lattnerb2412a82009-09-21 02:42:51 +00002159 VN.add(Phi, ValNo);
Owen Andersona04a0642010-11-18 18:32:40 +00002160 insert_table(ValNo, Phi);
Daniel Dunbara279bc32009-09-20 02:20:51 +00002161
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002162 CurInst->replaceAllUsesWith(Phi);
Duncan Sands1df98592010-02-16 11:11:14 +00002163 if (MD && Phi->getType()->isPointerTy())
Chris Lattnerbc99be12008-12-09 22:06:23 +00002164 MD->invalidateCachedPointerInfo(Phi);
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002165 VN.erase(CurInst);
Owen Andersona04a0642010-11-18 18:32:40 +00002166 erase_table(ValNo, CurInst);
Daniel Dunbara279bc32009-09-20 02:20:51 +00002167
David Greenebf7f78e2010-01-05 01:27:17 +00002168 DEBUG(dbgs() << "GVN PRE removed: " << *CurInst << '\n');
Dan Gohman4ec01b22009-11-14 02:27:51 +00002169 if (MD) MD->removeInstruction(CurInst);
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002170 CurInst->eraseFromParent();
Bill Wendlingec40d502008-12-22 21:57:30 +00002171 DEBUG(verifyRemoved(CurInst));
Chris Lattnerd0f5bfc2008-12-01 07:35:54 +00002172 Changed = true;
Owen Andersonb2303722008-06-18 21:41:49 +00002173 }
2174 }
Daniel Dunbara279bc32009-09-20 02:20:51 +00002175
Bob Wilson484d4a32010-02-16 19:51:59 +00002176 if (splitCriticalEdges())
2177 Changed = true;
Daniel Dunbara279bc32009-09-20 02:20:51 +00002178
Bob Wilson484d4a32010-02-16 19:51:59 +00002179 return Changed;
2180}
2181
2182/// splitCriticalEdges - Split critical edges found during the previous
2183/// iteration that may enable further optimization.
2184bool GVN::splitCriticalEdges() {
2185 if (toSplit.empty())
2186 return false;
2187 do {
2188 std::pair<TerminatorInst*, unsigned> Edge = toSplit.pop_back_val();
2189 SplitCriticalEdge(Edge.first, Edge.second, this);
2190 } while (!toSplit.empty());
Evan Cheng19d417c2010-03-01 22:23:12 +00002191 if (MD) MD->invalidateCachedPredecessors();
Bob Wilson484d4a32010-02-16 19:51:59 +00002192 return true;
Owen Andersonb2303722008-06-18 21:41:49 +00002193}
2194
Bill Wendling30788b82008-12-22 22:32:22 +00002195/// iterateOnFunction - Executes one iteration of GVN
Owen Anderson3e75a422007-08-14 18:04:11 +00002196bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00002197 cleanupGlobalSets();
Owen Andersona04a0642010-11-18 18:32:40 +00002198
Owen Anderson1ad2cb72007-07-24 17:55:58 +00002199 // Top-down walk of the dominator tree
Chris Lattnerb2412a82009-09-21 02:42:51 +00002200 bool Changed = false;
Owen Andersonc34d1122008-12-15 03:52:17 +00002201#if 0
2202 // Needed for value numbering with phi construction to work.
Owen Anderson255dafc2008-12-15 02:03:00 +00002203 ReversePostOrderTraversal<Function*> RPOT(&F);
2204 for (ReversePostOrderTraversal<Function*>::rpo_iterator RI = RPOT.begin(),
2205 RE = RPOT.end(); RI != RE; ++RI)
Chris Lattnerb2412a82009-09-21 02:42:51 +00002206 Changed |= processBlock(*RI);
Owen Andersonc34d1122008-12-15 03:52:17 +00002207#else
2208 for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
2209 DE = df_end(DT->getRootNode()); DI != DE; ++DI)
Chris Lattnerb2412a82009-09-21 02:42:51 +00002210 Changed |= processBlock(DI->getBlock());
Owen Andersonc34d1122008-12-15 03:52:17 +00002211#endif
2212
Chris Lattnerb2412a82009-09-21 02:42:51 +00002213 return Changed;
Owen Anderson1ad2cb72007-07-24 17:55:58 +00002214}
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00002215
2216void GVN::cleanupGlobalSets() {
2217 VN.clear();
Owen Andersona04a0642010-11-18 18:32:40 +00002218 NumberTable.clear();
2219 TableAllocator.Reset();
Nuno Lopes7cdd9ee2008-10-10 16:25:50 +00002220}
Bill Wendling246dbbb2008-12-22 21:36:08 +00002221
2222/// verifyRemoved - Verify that the specified instruction does not occur in our
2223/// internal data structures.
Bill Wendling6d463f22008-12-22 22:28:56 +00002224void GVN::verifyRemoved(const Instruction *Inst) const {
2225 VN.verifyRemoved(Inst);
Bill Wendling70ded192008-12-22 22:14:07 +00002226
Bill Wendling6d463f22008-12-22 22:28:56 +00002227 // Walk through the value number scope to make sure the instruction isn't
2228 // ferreted away in it.
Owen Andersona04a0642010-11-18 18:32:40 +00002229 for (DenseMap<uint32_t, std::pair<Value*, void*> >::const_iterator
2230 I = NumberTable.begin(), E = NumberTable.end(); I != E; ++I) {
2231 std::pair<Value*, void*> const * Node = &I->second;
2232 assert(Node->first != Inst && "Inst still in value numbering scope!");
2233
2234 while (Node->second) {
2235 Node = static_cast<std::pair<Value*, void*>*>(Node->second);
2236 assert(Node->first != Inst && "Inst still in value numbering scope!");
Bill Wendling70ded192008-12-22 22:14:07 +00002237 }
2238 }
Bill Wendling246dbbb2008-12-22 21:36:08 +00002239}