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