blob: b703a76ba9006d2cee142f418030855d1c2bd967 [file] [log] [blame]
Chris Lattner159b98f2008-12-05 07:49:08 +00001//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
Owen Anderson85c40642007-07-24 17:55:58 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Owen Anderson85c40642007-07-24 17:55:58 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This pass performs global value numbering to eliminate fully redundant
11// instructions. It also performs simple dead load elimination.
12//
John Criswell6e0aa282009-03-10 15:04:53 +000013// Note that this pass does the value numbering itself; it does not use the
Matthijs Kooijman9aac1db2008-06-05 07:55:49 +000014// ValueNumbering analysis passes.
15//
Owen Anderson85c40642007-07-24 17:55:58 +000016//===----------------------------------------------------------------------===//
17
18#define DEBUG_TYPE "gvn"
Owen Anderson85c40642007-07-24 17:55:58 +000019#include "llvm/Transforms/Scalar.h"
Owen Anderson5d72a422007-07-25 19:57:03 +000020#include "llvm/BasicBlock.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000021#include "llvm/Constants.h"
Owen Anderson85c40642007-07-24 17:55:58 +000022#include "llvm/DerivedTypes.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000023#include "llvm/Function.h"
Devang Patela7379552009-03-06 02:59:27 +000024#include "llvm/IntrinsicInst.h"
Owen Anderson24be4c12009-07-03 00:17:18 +000025#include "llvm/LLVMContext.h"
Chris Lattner0907b522009-09-21 05:57:11 +000026#include "llvm/Operator.h"
Owen Andersonacfa3ad2007-07-26 18:26:51 +000027#include "llvm/Value.h"
Owen Anderson85c40642007-07-24 17:55:58 +000028#include "llvm/ADT/DenseMap.h"
29#include "llvm/ADT/DepthFirstIterator.h"
Owen Andersona03e7862008-12-15 02:03:00 +000030#include "llvm/ADT/PostOrderIterator.h"
Owen Anderson85c40642007-07-24 17:55:58 +000031#include "llvm/ADT/SmallPtrSet.h"
32#include "llvm/ADT/SmallVector.h"
33#include "llvm/ADT/Statistic.h"
Owen Anderson5e9366f2007-10-18 19:39:33 +000034#include "llvm/Analysis/AliasAnalysis.h"
Chris Lattner4bb632f2009-12-06 05:29:56 +000035#include "llvm/Analysis/ConstantFolding.h"
36#include "llvm/Analysis/Dominators.h"
Victor Hernandez28f4d2f2009-10-27 20:05:49 +000037#include "llvm/Analysis/MemoryBuiltins.h"
Owen Anderson85c40642007-07-24 17:55:58 +000038#include "llvm/Analysis/MemoryDependenceAnalysis.h"
39#include "llvm/Support/CFG.h"
Owen Andersona2bf7662008-06-19 19:57:25 +000040#include "llvm/Support/CommandLine.h"
Chris Lattner9c5be3c2008-03-29 04:36:18 +000041#include "llvm/Support/Debug.h"
Edwin Török675d5622009-07-11 20:10:48 +000042#include "llvm/Support/ErrorHandling.h"
Chris Lattner0907b522009-09-21 05:57:11 +000043#include "llvm/Support/GetElementPtrTypeIterator.h"
Chris Lattnercb00f732009-12-06 01:57:02 +000044#include "llvm/Support/IRBuilder.h"
Daniel Dunbar005975c2009-07-25 00:23:56 +000045#include "llvm/Support/raw_ostream.h"
Chris Lattner7741aa52009-09-20 19:03:47 +000046#include "llvm/Target/TargetData.h"
Owen Andersonec747c42008-06-19 19:54:19 +000047#include "llvm/Transforms/Utils/BasicBlockUtils.h"
Dale Johannesena19b67f2009-06-17 20:48:23 +000048#include "llvm/Transforms/Utils/Local.h"
Chris Lattner6e5ea272009-10-10 23:50:30 +000049#include "llvm/Transforms/Utils/SSAUpdater.h"
Duncan Sands05f68372008-10-08 07:23:46 +000050#include <cstdio>
Owen Anderson85c40642007-07-24 17:55:58 +000051using namespace llvm;
52
Bill Wendling3858cae2008-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 Anderson7558f202008-07-15 16:28:06 +000056STATISTIC(NumGVNBlocks, "Number of blocks merged");
Bill Wendling3858cae2008-12-22 22:14:07 +000057STATISTIC(NumPRELoad, "Number of loads PRE'd");
Chris Lattner1be83222008-03-22 04:13:49 +000058
Evan Cheng019a2e12008-06-20 01:01:07 +000059static cl::opt<bool> EnablePRE("enable-pre",
Owen Anderson3a053612008-07-17 19:41:00 +000060 cl::init(true), cl::Hidden);
Dan Gohman828f89f2009-06-15 18:30:15 +000061static cl::opt<bool> EnableLoadPRE("enable-load-pre", cl::init(true));
Owen Andersona2bf7662008-06-19 19:57:25 +000062
Owen Anderson85c40642007-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 Lattnerfa2d1ba2009-09-02 06:11:42 +000071 struct Expression {
Dan Gohman7ce405e2009-06-04 22:49:04 +000072 enum ExpressionOpcode { ADD, FADD, SUB, FSUB, MUL, FMUL,
73 UDIV, SDIV, FDIV, UREM, SREM,
Daniel Dunbar3be44e62009-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 Anderson85c40642007-07-24 17:55:58 +000079 FCMPULT, FCMPULE, FCMPUNE, EXTRACT, INSERT,
80 SHUFFLE, SELECT, TRUNC, ZEXT, SEXT, FPTOUI,
Daniel Dunbar3be44e62009-09-20 02:20:51 +000081 FPTOSI, UITOFP, SITOFP, FPTRUNC, FPEXT,
Owen Anderson771d1122008-05-13 08:17:22 +000082 PTRTOINT, INTTOPTR, BITCAST, GEP, CALL, CONSTANT,
Owen Andersona7d4c7c2009-10-19 22:14:22 +000083 INSERTVALUE, EXTRACTVALUE, EMPTY, TOMBSTONE };
Owen Anderson85c40642007-07-24 17:55:58 +000084
85 ExpressionOpcode opcode;
86 const Type* type;
Owen Anderson85c40642007-07-24 17:55:58 +000087 SmallVector<uint32_t, 4> varargs;
Chris Lattnerff36c952009-09-21 02:42:51 +000088 Value *function;
Daniel Dunbar3be44e62009-09-20 02:20:51 +000089
Owen Anderson85c40642007-07-24 17:55:58 +000090 Expression() { }
91 Expression(ExpressionOpcode o) : opcode(o) { }
Daniel Dunbar3be44e62009-09-20 02:20:51 +000092
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +0000100 else if (function != other.function)
101 return false;
Owen Anderson85c40642007-07-24 17:55:58 +0000102 else {
103 if (varargs.size() != other.varargs.size())
104 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000105
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000109
Owen Anderson85c40642007-07-24 17:55:58 +0000110 return true;
111 }
112 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000113
Owen Anderson85c40642007-07-24 17:55:58 +0000114 bool operator!=(const Expression &other) const {
Bill Wendling9b5d4b72008-12-22 22:16:31 +0000115 return !(*this == other);
Owen Anderson85c40642007-07-24 17:55:58 +0000116 }
117 };
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000118
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000119 class ValueTable {
Owen Anderson85c40642007-07-24 17:55:58 +0000120 private:
121 DenseMap<Value*, uint32_t> valueNumbering;
122 DenseMap<Expression, uint32_t> expressionNumbering;
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000123 AliasAnalysis* AA;
124 MemoryDependenceAnalysis* MD;
125 DominatorTree* DT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000126
Owen Anderson85c40642007-07-24 17:55:58 +0000127 uint32_t nextValueNumber;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000128
Owen Anderson85c40642007-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 Anderson5e9366f2007-10-18 19:39:33 +0000140 Expression create_expression(CallInst* C);
Owen Anderson771d1122008-05-13 08:17:22 +0000141 Expression create_expression(Constant* C);
Owen Andersona7d4c7c2009-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 Anderson85c40642007-07-24 17:55:58 +0000146 public:
Dan Gohman936a6522009-04-01 16:37:47 +0000147 ValueTable() : nextValueNumber(1) { }
Chris Lattnerff36c952009-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 Anderson85c40642007-07-24 17:55:58 +0000151 void clear();
Chris Lattnerff36c952009-09-21 02:42:51 +0000152 void erase(Value *v);
Owen Anderson85c40642007-07-24 17:55:58 +0000153 unsigned size();
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000154 void setAliasAnalysis(AliasAnalysis* A) { AA = A; }
Chris Lattner02ca4422008-12-01 00:40:32 +0000155 AliasAnalysis *getAliasAnalysis() const { return AA; }
Owen Andersonbcf2bd52008-05-12 20:15:55 +0000156 void setMemDep(MemoryDependenceAnalysis* M) { MD = M; }
157 void setDomTree(DominatorTree* D) { DT = D; }
Owen Anderson8a8d13c2008-07-03 17:44:33 +0000158 uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
Bill Wendling2a023742008-12-22 21:36:08 +0000159 void verifyRemoved(const Value *) const;
Owen Anderson85c40642007-07-24 17:55:58 +0000160 };
161}
162
163namespace llvm {
Chris Lattner92eea072007-09-17 18:34:04 +0000164template <> struct DenseMapInfo<Expression> {
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000165 static inline Expression getEmptyKey() {
166 return Expression(Expression::EMPTY);
167 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000168
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000169 static inline Expression getTombstoneKey() {
170 return Expression(Expression::TOMBSTONE);
171 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000172
Owen Anderson85c40642007-07-24 17:55:58 +0000173 static unsigned getHashValue(const Expression e) {
174 unsigned hash = e.opcode;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000175
Anton Korobeynikov8522e1c2008-02-20 11:26:25 +0000176 hash = ((unsigned)((uintptr_t)e.type >> 4) ^
Owen Andersona7d4c7c2009-10-19 22:14:22 +0000177 (unsigned)((uintptr_t)e.type >> 9));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000178
Owen Andersonbf8a3eb2007-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 Anderson85c40642007-07-24 17:55:58 +0000181 hash = *I + hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000182
Anton Korobeynikov8522e1c2008-02-20 11:26:25 +0000183 hash = ((unsigned)((uintptr_t)e.function >> 4) ^
184 (unsigned)((uintptr_t)e.function >> 9)) +
185 hash * 37;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000186
Owen Anderson85c40642007-07-24 17:55:58 +0000187 return hash;
188 }
Chris Lattner92eea072007-09-17 18:34:04 +0000189 static bool isEqual(const Expression &LHS, const Expression &RHS) {
190 return LHS == RHS;
191 }
Owen Anderson85c40642007-07-24 17:55:58 +0000192 static bool isPod() { return true; }
193};
194}
195
196//===----------------------------------------------------------------------===//
197// ValueTable Internal Functions
198//===----------------------------------------------------------------------===//
Chris Lattner3d7103e2008-03-21 21:14:38 +0000199Expression::ExpressionOpcode ValueTable::getOpcode(BinaryOperator* BO) {
Owen Anderson85c40642007-07-24 17:55:58 +0000200 switch(BO->getOpcode()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000201 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000202 llvm_unreachable("Binary operator with unknown opcode?");
Chris Lattner3d7103e2008-03-21 21:14:38 +0000203 case Instruction::Add: return Expression::ADD;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000204 case Instruction::FAdd: return Expression::FADD;
Chris Lattner3d7103e2008-03-21 21:14:38 +0000205 case Instruction::Sub: return Expression::SUB;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000206 case Instruction::FSub: return Expression::FSUB;
Chris Lattner3d7103e2008-03-21 21:14:38 +0000207 case Instruction::Mul: return Expression::MUL;
Dan Gohman7ce405e2009-06-04 22:49:04 +0000208 case Instruction::FMul: return Expression::FMUL;
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000221 }
222}
223
224Expression::ExpressionOpcode ValueTable::getOpcode(CmpInst* C) {
Nick Lewycky8f5253b2009-07-08 03:04:38 +0000225 if (isa<ICmpInst>(C)) {
Owen Anderson85c40642007-07-24 17:55:58 +0000226 switch (C->getPredicate()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000227 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000228 llvm_unreachable("Comparison with unknown predicate?");
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000239 }
Nick Lewycky8f5253b2009-07-08 03:04:38 +0000240 } else {
241 switch (C->getPredicate()) {
242 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000243 llvm_unreachable("Comparison with unknown predicate?");
Nick Lewycky8f5253b2009-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 Anderson85c40642007-07-24 17:55:58 +0000259 }
260}
261
Chris Lattner3d7103e2008-03-21 21:14:38 +0000262Expression::ExpressionOpcode ValueTable::getOpcode(CastInst* C) {
Owen Anderson85c40642007-07-24 17:55:58 +0000263 switch(C->getOpcode()) {
Chris Lattner3d7103e2008-03-21 21:14:38 +0000264 default: // THIS SHOULD NEVER HAPPEN
Edwin Törökbd448e32009-07-14 16:55:14 +0000265 llvm_unreachable("Cast operator with unknown opcode?");
Chris Lattner3d7103e2008-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 Anderson85c40642007-07-24 17:55:58 +0000278 }
279}
280
Owen Anderson5e9366f2007-10-18 19:39:33 +0000281Expression ValueTable::create_expression(CallInst* C) {
282 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000283
Owen Anderson5e9366f2007-10-18 19:39:33 +0000284 e.type = C->getType();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000285 e.function = C->getCalledFunction();
286 e.opcode = Expression::CALL;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000287
Owen Anderson5e9366f2007-10-18 19:39:33 +0000288 for (CallInst::op_iterator I = C->op_begin()+1, E = C->op_end();
289 I != E; ++I)
Owen Anderson07f478f2008-04-11 05:11:49 +0000290 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000291
Owen Anderson5e9366f2007-10-18 19:39:33 +0000292 return e;
293}
294
Owen Anderson85c40642007-07-24 17:55:58 +0000295Expression ValueTable::create_expression(BinaryOperator* BO) {
296 Expression e;
Owen Andersona7d4c7c2009-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 Anderson5e9366f2007-10-18 19:39:33 +0000299 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000300 e.type = BO->getType();
301 e.opcode = getOpcode(BO);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000302
Owen Anderson85c40642007-07-24 17:55:58 +0000303 return e;
304}
305
306Expression ValueTable::create_expression(CmpInst* C) {
307 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000308
Owen Andersona7d4c7c2009-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 Anderson5e9366f2007-10-18 19:39:33 +0000311 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000312 e.type = C->getType();
313 e.opcode = getOpcode(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000314
Owen Anderson85c40642007-07-24 17:55:58 +0000315 return e;
316}
317
318Expression ValueTable::create_expression(CastInst* C) {
319 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000320
Owen Andersona7d4c7c2009-10-19 22:14:22 +0000321 e.varargs.push_back(lookup_or_add(C->getOperand(0)));
Owen Anderson5e9366f2007-10-18 19:39:33 +0000322 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000323 e.type = C->getType();
324 e.opcode = getOpcode(C);
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000325
Owen Anderson85c40642007-07-24 17:55:58 +0000326 return e;
327}
328
329Expression ValueTable::create_expression(ShuffleVectorInst* S) {
330 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000331
Owen Andersona7d4c7c2009-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 Anderson5e9366f2007-10-18 19:39:33 +0000335 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000336 e.type = S->getType();
337 e.opcode = Expression::SHUFFLE;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000338
Owen Anderson85c40642007-07-24 17:55:58 +0000339 return e;
340}
341
342Expression ValueTable::create_expression(ExtractElementInst* E) {
343 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000344
Owen Andersona7d4c7c2009-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 Anderson5e9366f2007-10-18 19:39:33 +0000347 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000348 e.type = E->getType();
349 e.opcode = Expression::EXTRACT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000350
Owen Anderson85c40642007-07-24 17:55:58 +0000351 return e;
352}
353
354Expression ValueTable::create_expression(InsertElementInst* I) {
355 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000356
Owen Andersona7d4c7c2009-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 Anderson5e9366f2007-10-18 19:39:33 +0000360 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000361 e.type = I->getType();
362 e.opcode = Expression::INSERT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000363
Owen Anderson85c40642007-07-24 17:55:58 +0000364 return e;
365}
366
367Expression ValueTable::create_expression(SelectInst* I) {
368 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000369
Owen Andersona7d4c7c2009-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 Anderson5e9366f2007-10-18 19:39:33 +0000373 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000374 e.type = I->getType();
375 e.opcode = Expression::SELECT;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000376
Owen Anderson85c40642007-07-24 17:55:58 +0000377 return e;
378}
379
380Expression ValueTable::create_expression(GetElementPtrInst* G) {
381 Expression e;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000382
Owen Andersona7d4c7c2009-10-19 22:14:22 +0000383 e.varargs.push_back(lookup_or_add(G->getPointerOperand()));
Owen Anderson5e9366f2007-10-18 19:39:33 +0000384 e.function = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000385 e.type = G->getType();
386 e.opcode = Expression::GEP;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000387
Owen Anderson85c40642007-07-24 17:55:58 +0000388 for (GetElementPtrInst::op_iterator I = G->idx_begin(), E = G->idx_end();
389 I != E; ++I)
Owen Anderson07f478f2008-04-11 05:11:49 +0000390 e.varargs.push_back(lookup_or_add(*I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000391
Owen Anderson85c40642007-07-24 17:55:58 +0000392 return e;
393}
394
Owen Andersona7d4c7c2009-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 Anderson85c40642007-07-24 17:55:58 +0000424//===----------------------------------------------------------------------===//
425// ValueTable External Functions
426//===----------------------------------------------------------------------===//
427
Owen Andersone6b4ff82008-06-18 21:41:49 +0000428/// add - Insert a value into the table with a specified value number.
Chris Lattnerff36c952009-09-21 02:42:51 +0000429void ValueTable::add(Value *V, uint32_t num) {
Owen Andersone6b4ff82008-06-18 21:41:49 +0000430 valueNumbering.insert(std::make_pair(V, num));
431}
432
Owen Andersona7d4c7c2009-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 Gohmanc8d26652009-11-14 02:27:51 +0000448 if (!MD) {
449 e = nextValueNumber++;
450 valueNumbering[C] = e;
451 return e;
452 }
Owen Andersona7d4c7c2009-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 Anderson85c40642007-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 Lattnerff36c952009-09-21 02:42:51 +0000546uint32_t ValueTable::lookup_or_add(Value *V) {
Owen Anderson85c40642007-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 Dunbar3be44e62009-09-20 02:20:51 +0000550
Owen Andersona7d4c7c2009-10-19 22:14:22 +0000551 if (!isa<Instruction>(V)) {
Owen Andersonb472cd82009-10-19 21:14:57 +0000552 valueNumbering[V] = nextValueNumber;
Owen Anderson85c40642007-07-24 17:55:58 +0000553 return nextValueNumber++;
554 }
Owen Andersona7d4c7c2009-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 Anderson85c40642007-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 Lattnerff36c952009-09-21 02:42:51 +0000633uint32_t ValueTable::lookup(Value *V) const {
Jeffrey Yasskin8154d2e2009-11-10 01:02:17 +0000634 DenseMap<Value*, uint32_t>::const_iterator VI = valueNumbering.find(V);
Chris Lattner3d7103e2008-03-21 21:14:38 +0000635 assert(VI != valueNumbering.end() && "Value not numbered?");
636 return VI->second;
Owen Anderson85c40642007-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 Anderson5aff8002007-07-31 23:27:13 +0000646/// erase - Remove a value from the value numbering
Chris Lattnerff36c952009-09-21 02:42:51 +0000647void ValueTable::erase(Value *V) {
Owen Anderson5aff8002007-07-31 23:27:13 +0000648 valueNumbering.erase(V);
649}
650
Bill Wendling2a023742008-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 Yasskin8154d2e2009-11-10 01:02:17 +0000654 for (DenseMap<Value*, uint32_t>::const_iterator
Bill Wendling2a023742008-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 Anderson85c40642007-07-24 17:55:58 +0000660//===----------------------------------------------------------------------===//
Bill Wendling42f17f62008-12-22 22:32:22 +0000661// GVN Pass
Owen Anderson85c40642007-07-24 17:55:58 +0000662//===----------------------------------------------------------------------===//
663
664namespace {
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000665 struct ValueNumberScope {
Owen Anderson2a412722008-06-20 01:15:47 +0000666 ValueNumberScope* parent;
667 DenseMap<uint32_t, Value*> table;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000668
Owen Anderson2a412722008-06-20 01:15:47 +0000669 ValueNumberScope(ValueNumberScope* p) : parent(p) { }
670 };
671}
672
673namespace {
Owen Anderson85c40642007-07-24 17:55:58 +0000674
Chris Lattnerfa2d1ba2009-09-02 06:11:42 +0000675 class GVN : public FunctionPass {
Owen Anderson85c40642007-07-24 17:55:58 +0000676 bool runOnFunction(Function &F);
677 public:
678 static char ID; // Pass identification, replacement for typeid
Dan Gohmanc8d26652009-11-14 02:27:51 +0000679 explicit GVN(bool nopre = false, bool noloads = false)
680 : FunctionPass(&ID), NoPRE(nopre), NoLoads(noloads), MD(0) { }
Owen Anderson85c40642007-07-24 17:55:58 +0000681
682 private:
Evan Chengf036e552009-10-30 20:12:24 +0000683 bool NoPRE;
Dan Gohmanc8d26652009-11-14 02:27:51 +0000684 bool NoLoads;
Chris Lattner02ca4422008-12-01 00:40:32 +0000685 MemoryDependenceAnalysis *MD;
686 DominatorTree *DT;
687
Owen Anderson85c40642007-07-24 17:55:58 +0000688 ValueTable VN;
Owen Anderson2a412722008-06-20 01:15:47 +0000689 DenseMap<BasicBlock*, ValueNumberScope*> localAvail;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000690
Owen Anderson85c40642007-07-24 17:55:58 +0000691 // This transformation requires dominator postdominator info
692 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Owen Anderson85c40642007-07-24 17:55:58 +0000693 AU.addRequired<DominatorTree>();
Dan Gohmanc8d26652009-11-14 02:27:51 +0000694 if (!NoLoads)
695 AU.addRequired<MemoryDependenceAnalysis>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000696 AU.addRequired<AliasAnalysis>();
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000697
Owen Andersonaef6a922008-06-23 17:49:45 +0000698 AU.addPreserved<DominatorTree>();
Owen Anderson5e9366f2007-10-18 19:39:33 +0000699 AU.addPreserved<AliasAnalysis>();
Owen Anderson85c40642007-07-24 17:55:58 +0000700 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000701
Owen Anderson85c40642007-07-24 17:55:58 +0000702 // Helper fuctions
703 // FIXME: eliminate or document these better
Owen Anderson85c40642007-07-24 17:55:58 +0000704 bool processLoad(LoadInst* L,
Chris Lattner7de20452008-03-21 22:01:16 +0000705 SmallVectorImpl<Instruction*> &toErase);
Chris Lattnerff36c952009-09-21 02:42:51 +0000706 bool processInstruction(Instruction *I,
Chris Lattner7de20452008-03-21 22:01:16 +0000707 SmallVectorImpl<Instruction*> &toErase);
Owen Andersonbf8a3eb2007-08-02 18:16:06 +0000708 bool processNonLocalLoad(LoadInst* L,
Chris Lattner7de20452008-03-21 22:01:16 +0000709 SmallVectorImpl<Instruction*> &toErase);
Chris Lattnerff36c952009-09-21 02:42:51 +0000710 bool processBlock(BasicBlock *BB);
Owen Andersone6b4ff82008-06-18 21:41:49 +0000711 void dump(DenseMap<uint32_t, Value*>& d);
Owen Andersonbe168b32007-08-14 18:04:11 +0000712 bool iterateOnFunction(Function &F);
Chris Lattnerff36c952009-09-21 02:42:51 +0000713 Value *CollapsePhi(PHINode* p);
Owen Andersone6b4ff82008-06-18 21:41:49 +0000714 bool performPRE(Function& F);
Chris Lattnerff36c952009-09-21 02:42:51 +0000715 Value *lookupNumber(BasicBlock *BB, uint32_t num);
Nuno Lopes274474b2008-10-10 16:25:50 +0000716 void cleanupGlobalSets();
Bill Wendling2a023742008-12-22 21:36:08 +0000717 void verifyRemoved(const Instruction *I) const;
Owen Anderson85c40642007-07-24 17:55:58 +0000718 };
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000719
Owen Anderson85c40642007-07-24 17:55:58 +0000720 char GVN::ID = 0;
Owen Anderson85c40642007-07-24 17:55:58 +0000721}
722
723// createGVNPass - The public interface to this file...
Dan Gohmanc8d26652009-11-14 02:27:51 +0000724FunctionPass *llvm::createGVNPass(bool NoPRE, bool NoLoads) {
725 return new GVN(NoPRE, NoLoads);
726}
Owen Anderson85c40642007-07-24 17:55:58 +0000727
728static RegisterPass<GVN> X("gvn",
729 "Global Value Numbering");
730
Owen Andersone6b4ff82008-06-18 21:41:49 +0000731void GVN::dump(DenseMap<uint32_t, Value*>& d) {
Owen Anderson5d72a422007-07-25 19:57:03 +0000732 printf("{\n");
Owen Andersone6b4ff82008-06-18 21:41:49 +0000733 for (DenseMap<uint32_t, Value*>::iterator I = d.begin(),
Owen Anderson5d72a422007-07-25 19:57:03 +0000734 E = d.end(); I != E; ++I) {
Owen Andersone6b4ff82008-06-18 21:41:49 +0000735 printf("%d\n", I->first);
Owen Anderson5d72a422007-07-25 19:57:03 +0000736 I->second->dump();
737 }
738 printf("}\n");
739}
740
Chris Lattnerff36c952009-09-21 02:42:51 +0000741static bool isSafeReplacement(PHINode* p, Instruction *inst) {
Owen Andersond68b1af2009-08-26 22:55:11 +0000742 if (!isa<PHINode>(inst))
743 return true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000744
Owen Andersond68b1af2009-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 Dunbar3be44e62009-09-20 02:20:51 +0000750
Owen Andersond68b1af2009-08-26 22:55:11 +0000751 return true;
752}
753
Chris Lattnerff36c952009-09-21 02:42:51 +0000754Value *GVN::CollapsePhi(PHINode *PN) {
755 Value *ConstVal = PN->hasConstantValue(DT);
756 if (!ConstVal) return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000757
Chris Lattnerff36c952009-09-21 02:42:51 +0000758 Instruction *Inst = dyn_cast<Instruction>(ConstVal);
759 if (!Inst)
760 return ConstVal;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000761
Chris Lattnerff36c952009-09-21 02:42:51 +0000762 if (DT->dominates(Inst, PN))
763 if (isSafeReplacement(PN, Inst))
764 return Inst;
Owen Andersone02ad522007-08-16 22:51:56 +0000765 return 0;
766}
Owen Anderson5d72a422007-07-25 19:57:03 +0000767
Chris Lattnerdcded152008-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 Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000778static bool IsValueFullyAvailableInBlock(BasicBlock *BB,
Chris Lattner159b98f2008-12-05 07:49:08 +0000779 DenseMap<BasicBlock*, char> &FullyAvailableBlocks) {
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +0000782 std::pair<DenseMap<BasicBlock*, char>::iterator, char> IV =
Chris Lattner159b98f2008-12-05 07:49:08 +0000783 FullyAvailableBlocks.insert(std::make_pair(BB, 2));
Chris Lattnerdcded152008-12-02 08:16:11 +0000784
785 // If the entry already existed for this block, return the precomputed value.
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000793
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +0000796
Chris Lattnerdcded152008-12-02 08:16:11 +0000797 // If this block has no predecessors, it isn't live-in here.
798 if (PI == PE)
Chris Lattner159b98f2008-12-05 07:49:08 +0000799 goto SpeculationFailure;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000800
Chris Lattnerdcded152008-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 Lattner159b98f2008-12-05 07:49:08 +0000806 goto SpeculationFailure;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000807
Chris Lattnerdcded152008-12-02 08:16:11 +0000808 return true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +0000809
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000815
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000827
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000837
Chris Lattner159b98f2008-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 Dunbar3be44e62009-09-20 02:20:51 +0000841
Chris Lattner159b98f2008-12-05 07:49:08 +0000842 return false;
Chris Lattnerdcded152008-12-02 08:16:11 +0000843}
844
Chris Lattnerd6b1d052009-09-20 20:09:34 +0000845
Chris Lattner012b3602009-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 Lattnerd6b1d052009-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 Lattner012b3602009-09-21 17:24:04 +0000877 if (!CanCoerceMustAliasedValueToLoad(StoredVal, LoadedTy, TD))
878 return 0;
879
Chris Lattnerd6b1d052009-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 Lattner012b3602009-09-21 17:24:04 +0000915 assert(StoreSize >= LoadSize && "CanCoerceMustAliasedValueToLoad fail");
Chris Lattnerd6b1d052009-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 Lattner8f912082009-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 Lattneraae7fcb2009-09-21 06:48:08 +0000955 const TargetData &TD) {
Chris Lattner8f912082009-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 Lattneraae7fcb2009-09-21 06:48:08 +0000975 Offset += TD.getStructLayout(STy)->getElementOffset(OpC->getZExtValue());
Chris Lattner8f912082009-09-21 06:24:16 +0000976 } else {
Chris Lattneraae7fcb2009-09-21 06:48:08 +0000977 uint64_t Size = TD.getTypeAllocSize(GTI.getIndexedType());
Chris Lattner8f912082009-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 Lattneraae7fcb2009-09-21 06:48:08 +0000984 unsigned PtrSize = TD.getPointerSizeInBits();
Chris Lattner8f912082009-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 Lattnercb00f732009-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 Lattneraae7fcb2009-09-21 06:48:08 +00001002 const TargetData &TD) {
Chris Lattner012b3602009-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 Lattnercb00f732009-12-06 01:57:02 +00001005 if (isa<StructType>(L->getType()) || isa<ArrayType>(L->getType()))
Chris Lattner012b3602009-09-21 17:24:04 +00001006 return -1;
1007
Chris Lattner8f912082009-09-21 06:24:16 +00001008 int64_t StoreOffset = 0, LoadOffset = 0;
Chris Lattnercb00f732009-12-06 01:57:02 +00001009 Value *StoreBase = GetBaseWithConstantOffset(WritePtr, StoreOffset, TD);
Chris Lattner8f912082009-09-21 06:24:16 +00001010 Value *LoadBase =
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001011 GetBaseWithConstantOffset(L->getPointerOperand(), LoadOffset, TD);
Chris Lattner8f912082009-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 Lattnercb00f732009-12-06 01:57:02 +00001022 << "Store Ptr = " << *WritePtr << "\n"
1023 << "Store Offs = " << StoreOffset << "\n"
Chris Lattner8f912082009-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 Lattneraae7fcb2009-09-21 06:48:08 +00001037 uint64_t LoadSize = TD.getTypeSizeInBits(L->getType());
Chris Lattner8f912082009-09-21 06:24:16 +00001038
Chris Lattnercb00f732009-12-06 01:57:02 +00001039 if ((WriteSizeInBits & 7) | (LoadSize & 7))
Chris Lattner8f912082009-09-21 06:24:16 +00001040 return -1;
Chris Lattnercb00f732009-12-06 01:57:02 +00001041 uint64_t StoreSize = WriteSizeInBits >> 3; // Convert to bytes.
Chris Lattner8f912082009-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 Lattnercb00f732009-12-06 01:57:02 +00001055 << "Store Ptr = " << *WritePtr << "\n"
1056 << "Store Offs = " << StoreOffset << "\n"
Chris Lattner8f912082009-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 Lattnercb00f732009-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 Lattner4bb632f2009-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 Lattnercb00f732009-12-06 01:57:02 +00001101 if (MI->getIntrinsicID() == Intrinsic::memset)
1102 return AnalyzeLoadFromClobberingWrite(L, MI->getDest(), MemSizeInBits, TD);
1103
Chris Lattner4bb632f2009-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 Lattnercb00f732009-12-06 01:57:02 +00001131 return -1;
1132}
1133
Chris Lattner8f912082009-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 Lattneraae7fcb2009-09-21 06:48:08 +00001140static Value *GetStoreValueForLoad(Value *SrcVal, unsigned Offset,
1141 const Type *LoadTy,
1142 Instruction *InsertPt, const TargetData &TD){
Chris Lattner8f912082009-09-21 06:24:16 +00001143 LLVMContext &Ctx = SrcVal->getType()->getContext();
1144
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001145 uint64_t StoreSize = TD.getTypeSizeInBits(SrcVal->getType())/8;
1146 uint64_t LoadSize = TD.getTypeSizeInBits(LoadTy)/8;
Chris Lattner8f912082009-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 Lattneraae7fcb2009-09-21 06:48:08 +00001152 SrcVal = new PtrToIntInst(SrcVal, TD.getIntPtrType(Ctx), "tmp", InsertPt);
Chris Lattner8f912082009-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 Lattnercb00f732009-12-06 01:57:02 +00001159 if (TD.isLittleEndian())
Chris Lattner8f912082009-09-21 06:24:16 +00001160 ShiftAmt = Offset*8;
Chris Lattnercb00f732009-12-06 01:57:02 +00001161 else
Chris Lattner1846fa02009-09-21 17:55:47 +00001162 ShiftAmt = (StoreSize-LoadSize-Offset)*8;
Chris Lattner8f912082009-09-21 06:24:16 +00001163
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001164 if (ShiftAmt)
1165 SrcVal = BinaryOperator::CreateLShr(SrcVal,
1166 ConstantInt::get(SrcVal->getType(), ShiftAmt), "tmp", InsertPt);
Chris Lattner8f912082009-09-21 06:24:16 +00001167
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001168 if (LoadSize != StoreSize)
1169 SrcVal = new TruncInst(SrcVal, IntegerType::get(Ctx, LoadSize*8),
1170 "tmp", InsertPt);
Chris Lattner8f912082009-09-21 06:24:16 +00001171
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001172 return CoerceAvailableValueToLoadType(SrcVal, LoadTy, InsertPt, TD);
Chris Lattner8f912082009-09-21 06:24:16 +00001173}
1174
Chris Lattnercb00f732009-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 Lattner4bb632f2009-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 Lattnercb00f732009-12-06 01:57:02 +00001228}
1229
1230
1231
Chris Lattner19b84b32009-09-21 06:30:24 +00001232struct AvailableValueInBlock {
1233 /// BB - The basic block in question.
1234 BasicBlock *BB;
Chris Lattnera96e53a2009-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 Lattner19b84b32009-09-21 06:30:24 +00001240 /// V - The value that is live out of the block.
Chris Lattnera96e53a2009-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 Lattneraae7fcb2009-09-21 06:48:08 +00001244 unsigned Offset;
Chris Lattner19b84b32009-09-21 06:30:24 +00001245
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001246 static AvailableValueInBlock get(BasicBlock *BB, Value *V,
1247 unsigned Offset = 0) {
Chris Lattner19b84b32009-09-21 06:30:24 +00001248 AvailableValueInBlock Res;
1249 Res.BB = BB;
Chris Lattnera96e53a2009-12-06 04:54:31 +00001250 Res.Val.setPointer(V);
1251 Res.Val.setInt(SimpleVal);
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001252 Res.Offset = Offset;
Chris Lattner19b84b32009-09-21 06:30:24 +00001253 return Res;
1254 }
Chris Lattnera96e53a2009-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 Lattner19b84b32009-09-21 06:30:24 +00001276};
1277
Chris Lattner6e5ea272009-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 Lattnerd6b1d052009-09-20 20:09:34 +00001291 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i) {
Chris Lattnera96e53a2009-12-06 04:54:31 +00001292 const AvailableValueInBlock &AV = ValuesPerBlock[i];
1293 BasicBlock *BB = AV.BB;
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001294
Chris Lattner6e5ea272009-10-10 23:50:30 +00001295 if (SSAUpdate.HasValueForBlock(BB))
1296 continue;
Chris Lattnera96e53a2009-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 Lattner6e5ea272009-10-10 23:50:30 +00001310 << *AvailableVal << '\n' << "\n\n\n");
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001311 }
Chris Lattnera96e53a2009-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 Lattner6e5ea272009-10-10 23:50:30 +00001317 << *AvailableVal << '\n' << "\n\n\n");
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001318 }
Chris Lattner6e5ea272009-10-10 23:50:30 +00001319 SSAUpdate.AddAvailableValue(BB, AvailableVal);
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001320 }
Chris Lattner6e5ea272009-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 Lattnerd6b1d052009-09-20 20:09:34 +00001331}
1332
Owen Andersonf187daf2009-12-02 07:35:19 +00001333static bool isLifetimeStart(Instruction *Inst) {
Chris Lattnerbc6fccc2009-12-02 06:44:58 +00001334 if (IntrinsicInst* II = dyn_cast<IntrinsicInst>(Inst))
Owen Andersonf187daf2009-12-02 07:35:19 +00001335 return II->getIntrinsicID() == Intrinsic::lifetime_start;
Chris Lattnerbc6fccc2009-12-02 06:44:58 +00001336 return false;
1337}
1338
Owen Andersone0143452007-08-16 22:02:55 +00001339/// processNonLocalLoad - Attempt to eliminate a load whose dependencies are
1340/// non-local by performing PHI construction.
Chris Lattnerdcded152008-12-02 08:16:11 +00001341bool GVN::processNonLocalLoad(LoadInst *LI,
Chris Lattner7de20452008-03-21 22:01:16 +00001342 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerdcded152008-12-02 08:16:11 +00001343 // Find the non-local dependencies of the load.
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001344 SmallVector<MemoryDependenceAnalysis::NonLocalDepEntry, 64> Deps;
Chris Lattneraf713862008-12-09 19:25:07 +00001345 MD->getNonLocalPointerDependency(LI->getOperand(0), true, LI->getParent(),
1346 Deps);
Dan Gohman7e124382009-07-31 20:24:18 +00001347 //DEBUG(errs() << "INVESTIGATING NONLOCAL LOAD: "
1348 // << Deps.size() << *LI << '\n');
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001349
Owen Anderson90e717d2008-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 Lattneraf713862008-12-09 19:25:07 +00001353 if (Deps.size() > 100)
Owen Anderson90e717d2008-08-26 22:07:42 +00001354 return false;
Chris Lattner8d1686f2008-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.
Edwin Török3ffffac2009-06-17 18:48:18 +00001358 if (Deps.size() == 1 && Deps[0].second.isClobber()) {
1359 DEBUG(
Dan Gohman0be10b02009-07-25 01:43:01 +00001360 errs() << "GVN: non-local load ";
1361 WriteAsOperand(errs(), LI);
Dan Gohman7e124382009-07-31 20:24:18 +00001362 errs() << " is clobbered by " << *Deps[0].second.getInst() << '\n';
Edwin Török3ffffac2009-06-17 18:48:18 +00001363 );
Chris Lattner8d1686f2008-12-18 00:51:32 +00001364 return false;
Edwin Török3ffffac2009-06-17 18:48:18 +00001365 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001366
Chris Lattnerdcded152008-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 Lattner19b84b32009-09-21 06:30:24 +00001371 SmallVector<AvailableValueInBlock, 16> ValuesPerBlock;
Chris Lattnerdcded152008-12-02 08:16:11 +00001372 SmallVector<BasicBlock*, 16> UnavailableBlocks;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001373
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001374 const TargetData *TD = 0;
1375
Chris Lattneraf713862008-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 Dunbar3be44e62009-09-20 02:20:51 +00001379
Chris Lattner4531da82008-12-05 21:04:20 +00001380 if (DepInfo.isClobber()) {
Chris Lattneraae7fcb2009-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 Lattnercb00f732009-12-06 01:57:02 +00001397
Chris Lattnercb00f732009-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 Lattnera96e53a2009-12-06 04:54:31 +00001400 if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(DepInfo.getInst())) {
Chris Lattnercb00f732009-12-06 01:57:02 +00001401 if (TD == 0)
1402 TD = getAnalysisIfAvailable<TargetData>();
1403 if (TD) {
Chris Lattnera96e53a2009-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 Lattnercb00f732009-12-06 01:57:02 +00001410 }
1411 }
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001412
Chris Lattner4531da82008-12-05 21:04:20 +00001413 UnavailableBlocks.push_back(DepBB);
1414 continue;
1415 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001416
Chris Lattner4531da82008-12-05 21:04:20 +00001417 Instruction *DepInst = DepInfo.getInst();
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001418
Chris Lattner4531da82008-12-05 21:04:20 +00001419 // Loading the allocation -> undef.
Chris Lattnerbc6fccc2009-12-02 06:44:58 +00001420 if (isa<AllocaInst>(DepInst) || isMalloc(DepInst) ||
Owen Andersonf187daf2009-12-02 07:35:19 +00001421 // Loading immediately after lifetime begin -> undef.
1422 isLifetimeStart(DepInst)) {
Chris Lattner19b84b32009-09-21 06:30:24 +00001423 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
1424 UndefValue::get(LI->getType())));
Chris Lattner46876282008-12-01 01:15:42 +00001425 continue;
1426 }
Owen Andersonc07861a2009-10-28 07:05:35 +00001427
Chris Lattner19b84b32009-09-21 06:30:24 +00001428 if (StoreInst *S = dyn_cast<StoreInst>(DepInst)) {
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001429 // Reject loads and stores that are to the same address but are of
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001430 // different types if we have to.
Chris Lattnerdcded152008-12-02 08:16:11 +00001431 if (S->getOperand(0)->getType() != LI->getType()) {
Chris Lattnerd6b1d052009-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 Lattner012b3602009-09-21 17:24:04 +00001437 if (TD == 0 || !CanCoerceMustAliasedValueToLoad(S->getOperand(0),
1438 LI->getType(), *TD)) {
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001439 UnavailableBlocks.push_back(DepBB);
1440 continue;
1441 }
Chris Lattnerdcded152008-12-02 08:16:11 +00001442 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001443
Chris Lattner19b84b32009-09-21 06:30:24 +00001444 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB,
1445 S->getOperand(0)));
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001446 continue;
1447 }
1448
1449 if (LoadInst *LD = dyn_cast<LoadInst>(DepInst)) {
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001450 // If the types mismatch and we can't handle it, reject reuse of the load.
Chris Lattnerdcded152008-12-02 08:16:11 +00001451 if (LD->getType() != LI->getType()) {
Chris Lattnerd6b1d052009-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 Lattner012b3602009-09-21 17:24:04 +00001457 if (TD == 0 || !CanCoerceMustAliasedValueToLoad(LD, LI->getType(),*TD)){
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001458 UnavailableBlocks.push_back(DepBB);
1459 continue;
1460 }
Chris Lattnerdcded152008-12-02 08:16:11 +00001461 }
Chris Lattner19b84b32009-09-21 06:30:24 +00001462 ValuesPerBlock.push_back(AvailableValueInBlock::get(DepBB, LD));
Chris Lattnerdcded152008-12-02 08:16:11 +00001463 continue;
Owen Anderson5d72a422007-07-25 19:57:03 +00001464 }
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001465
1466 UnavailableBlocks.push_back(DepBB);
1467 continue;
Chris Lattner3d7103e2008-03-21 21:14:38 +00001468 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001469
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001473
Chris Lattnerdcded152008-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 Gohman7e124382009-07-31 20:24:18 +00001478 DEBUG(errs() << "GVN REMOVING NONLOCAL LOAD: " << *LI << '\n');
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001479
Chris Lattnerdcded152008-12-02 08:16:11 +00001480 // Perform PHI construction.
Chris Lattner6e5ea272009-10-10 23:50:30 +00001481 Value *V = ConstructSSAForLoadSet(LI, ValuesPerBlock, TD,
1482 VN.getAliasAnalysis());
Chris Lattnerd6b1d052009-09-20 20:09:34 +00001483 LI->replaceAllUsesWith(V);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001484
Chris Lattnerd6b1d052009-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 Lattnerdcded152008-12-02 08:16:11 +00001489 toErase.push_back(LI);
1490 NumGVNLoad++;
1491 return true;
1492 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001493
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001504
Owen Andersondd37b182009-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 Lattnerdcded152008-12-02 08:16:11 +00001511 BasicBlock *LoadBB = LI->getParent();
Owen Andersondd37b182009-05-31 09:03:40 +00001512 BasicBlock *TmpBB = LoadBB;
1513
1514 bool isSinglePred = false;
Dale Johannesena19b67f2009-06-17 20:48:23 +00001515 bool allSingleSucc = true;
Owen Andersondd37b182009-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 Johannesena19b67f2009-06-17 20:48:23 +00001525 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1526 allSingleSucc = false;
Owen Andersondd37b182009-05-31 09:03:40 +00001527 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001528
Owen Andersondd37b182009-05-31 09:03:40 +00001529 assert(TmpBB);
1530 LoadBB = TmpBB;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001531
Chris Lattnerdcded152008-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 Lattnera96e53a2009-12-06 04:54:31 +00001537 if (ValuesPerBlock[i].isSimpleValue() &&
1538 ValuesPerBlock[i].getSimpleValue() == LI)
Chris Lattnerdcded152008-12-02 08:16:11 +00001539 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001540
Chris Lattnera96e53a2009-12-06 04:54:31 +00001541 // FIXME: It is extremely unclear what this loop is doing, other than
1542 // artificially restricting loadpre.
Owen Andersondd37b182009-05-31 09:03:40 +00001543 if (isSinglePred) {
1544 bool isHot = false;
Chris Lattnera96e53a2009-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 Dunbar3be44e62009-09-20 02:20:51 +00001548 // "Hot" Instruction is in some loop (because it dominates its dep.
1549 // instruction).
Chris Lattnera96e53a2009-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 Andersondd37b182009-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 Lattnerdcded152008-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 Lattner159b98f2008-12-05 07:49:08 +00001570 DenseMap<BasicBlock*, char> FullyAvailableBlocks;
Chris Lattnerdcded152008-12-02 08:16:11 +00001571 for (unsigned i = 0, e = ValuesPerBlock.size(); i != e; ++i)
Chris Lattner19b84b32009-09-21 06:30:24 +00001572 FullyAvailableBlocks[ValuesPerBlock[i].BB] = true;
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001580
Chris Lattnerdcded152008-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 Dunbar3be44e62009-09-20 02:20:51 +00001586
Chris Lattnerdcded152008-12-02 08:16:11 +00001587 assert(UnavailablePred != 0 &&
1588 "Fully available value should be eliminated above!");
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001589
Chris Lattnerdcded152008-12-02 08:16:11 +00001590 // We don't currently handle critical edges :(
1591 if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
Daniel Dunbar005975c2009-07-25 00:23:56 +00001592 DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
Dan Gohman7e124382009-07-31 20:24:18 +00001593 << UnavailablePred->getName() << "': " << *LI << '\n');
Chris Lattnerdcded152008-12-02 08:16:11 +00001594 return false;
Owen Anderson5b299672007-08-07 23:12:31 +00001595 }
Chris Lattner248818e2009-11-27 08:25:10 +00001596
Chris Lattnera5bef152009-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 Lattner1c2de2b2009-11-28 15:39:14 +00001602 SmallVector<Instruction*, 8> NewInsts;
Chris Lattner80c535b2009-11-28 16:08:18 +00001603 Value *LoadPtr = 0;
Chris Lattnerde0b0302009-11-27 22:50:07 +00001604
Chris Lattner80c535b2009-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 Anderson2c405b92009-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 Lattner80c535b2009-11-28 16:08:18 +00001625
Chris Lattnera5bef152009-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 Lattner248818e2009-11-27 08:25:10 +00001628 if (LoadPtr == 0) {
Chris Lattnera5bef152009-11-27 22:05:15 +00001629 DEBUG(errs() << "COULDN'T INSERT PHI TRANSLATED VALUE OF: "
1630 << *LI->getOperand(0) << "\n");
1631 return false;
Chris Lattner248818e2009-11-27 08:25:10 +00001632 }
1633
Dale Johannesena19b67f2009-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 Lattner1c2de2b2009-11-28 15:39:14 +00001644 // FIXME: REEVALUTE THIS.
Chris Lattner80c535b2009-11-28 16:08:18 +00001645 !isSafeToLoadUnconditionally(LoadPtr, UnavailablePred->getTerminator())) {
1646 assert(NewInsts.empty() && "Should not have inserted instructions");
Dale Johannesena19b67f2009-06-17 20:48:23 +00001647 return false;
Chris Lattner80c535b2009-11-28 16:08:18 +00001648 }
Dale Johannesena19b67f2009-06-17 20:48:23 +00001649
Chris Lattnerdcded152008-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 Gohman7e124382009-07-31 20:24:18 +00001653 DEBUG(errs() << "GVN REMOVING PRE LOAD: " << *LI << '\n');
Chris Lattner80c535b2009-11-28 16:08:18 +00001654 DEBUG(if (!NewInsts.empty())
1655 errs() << "INSERTED " << NewInsts.size() << " INSTS: "
1656 << *NewInsts.back() << '\n');
1657
Chris Lattnerdcded152008-12-02 08:16:11 +00001658 Value *NewLoad = new LoadInst(LoadPtr, LI->getName()+".pre", false,
1659 LI->getAlignment(),
1660 UnavailablePred->getTerminator());
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001661
Chris Lattner6e5ea272009-10-10 23:50:30 +00001662 // Add the newly created load.
1663 ValuesPerBlock.push_back(AvailableValueInBlock::get(UnavailablePred,NewLoad));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001664
Chris Lattnerdcded152008-12-02 08:16:11 +00001665 // Perform PHI construction.
Chris Lattner6e5ea272009-10-10 23:50:30 +00001666 Value *V = ConstructSSAForLoadSet(LI, ValuesPerBlock, TD,
1667 VN.getAliasAnalysis());
Chris Lattnerd6b1d052009-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 Lattnerdcded152008-12-02 08:16:11 +00001673 toErase.push_back(LI);
1674 NumPRELoad++;
Owen Anderson5d72a422007-07-25 19:57:03 +00001675 return true;
1676}
1677
Owen Andersone0143452007-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 Lattner4531da82008-12-05 21:04:20 +00001680bool GVN::processLoad(LoadInst *L, SmallVectorImpl<Instruction*> &toErase) {
Dan Gohmanc8d26652009-11-14 02:27:51 +00001681 if (!MD)
1682 return false;
1683
Chris Lattner4531da82008-12-05 21:04:20 +00001684 if (L->isVolatile())
Owen Anderson85c40642007-07-24 17:55:58 +00001685 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001686
Owen Anderson85c40642007-07-24 17:55:58 +00001687 // ... to a pointer that has been loaded from before...
Chris Lattnerff36c952009-09-21 02:42:51 +00001688 MemDepResult Dep = MD->getDependency(L);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001689
Chris Lattner4531da82008-12-05 21:04:20 +00001690 // If the value isn't available, don't do anything!
Chris Lattnerff36c952009-09-21 02:42:51 +00001691 if (Dep.isClobber()) {
Chris Lattner0907b522009-09-21 05:57:11 +00001692 // Check to see if we have something like this:
Chris Lattner7741aa52009-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 Lattnercb00f732009-12-06 01:57:02 +00001702 Value *AvailVal = 0;
Chris Lattner0907b522009-09-21 05:57:11 +00001703 if (StoreInst *DepSI = dyn_cast<StoreInst>(Dep.getInst()))
Chris Lattner41eb59c2009-09-21 06:22:46 +00001704 if (const TargetData *TD = getAnalysisIfAvailable<TargetData>()) {
Chris Lattneraae7fcb2009-09-21 06:48:08 +00001705 int Offset = AnalyzeLoadFromClobberingStore(L, DepSI, *TD);
Chris Lattnercb00f732009-12-06 01:57:02 +00001706 if (Offset != -1)
1707 AvailVal = GetStoreValueForLoad(DepSI->getOperand(0), Offset,
1708 L->getType(), L, *TD);
Chris Lattner41eb59c2009-09-21 06:22:46 +00001709 }
Chris Lattner0907b522009-09-21 05:57:11 +00001710
Chris Lattnercb00f732009-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
Edwin Török47cf8842009-05-29 09:46:03 +00001734 DEBUG(
1735 // fast print dep, using operator<< on instruction would be too slow
Dan Gohman0be10b02009-07-25 01:43:01 +00001736 errs() << "GVN: load ";
1737 WriteAsOperand(errs(), L);
Chris Lattnerff36c952009-09-21 02:42:51 +00001738 Instruction *I = Dep.getInst();
Dan Gohman7e124382009-07-31 20:24:18 +00001739 errs() << " is clobbered by " << *I << '\n';
Edwin Török47cf8842009-05-29 09:46:03 +00001740 );
Chris Lattner4531da82008-12-05 21:04:20 +00001741 return false;
Edwin Török47cf8842009-05-29 09:46:03 +00001742 }
Chris Lattner4531da82008-12-05 21:04:20 +00001743
1744 // If it is defined in another block, try harder.
Chris Lattnerff36c952009-09-21 02:42:51 +00001745 if (Dep.isNonLocal())
Chris Lattner4531da82008-12-05 21:04:20 +00001746 return processNonLocalLoad(L, toErase);
Eli Friedman350307f2008-02-12 12:08:14 +00001747
Chris Lattnerff36c952009-09-21 02:42:51 +00001748 Instruction *DepInst = Dep.getInst();
Chris Lattner4531da82008-12-05 21:04:20 +00001749 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
Chris Lattner7741aa52009-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 Lattner10460aa2009-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 Lattner7741aa52009-09-20 19:03:47 +00001767 return false;
Chris Lattner7741aa52009-09-20 19:03:47 +00001768 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001769
Chris Lattner4531da82008-12-05 21:04:20 +00001770 // Remove it!
Chris Lattner7741aa52009-09-20 19:03:47 +00001771 L->replaceAllUsesWith(StoredVal);
1772 if (isa<PointerType>(StoredVal->getType()))
1773 MD->invalidateCachedPointerInfo(StoredVal);
Chris Lattner4531da82008-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 Lattner7741aa52009-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 Lattner10460aa2009-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 Lattner7741aa52009-09-20 19:03:47 +00001791
Chris Lattner10460aa2009-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 Lattner7741aa52009-09-20 19:03:47 +00001797 }
1798
Chris Lattner4531da82008-12-05 21:04:20 +00001799 // Remove it!
Chris Lattner7741aa52009-09-20 19:03:47 +00001800 L->replaceAllUsesWith(AvailableVal);
Chris Lattnerf81b0142008-12-09 22:06:23 +00001801 if (isa<PointerType>(DepLI->getType()))
1802 MD->invalidateCachedPointerInfo(DepLI);
Chris Lattner4531da82008-12-05 21:04:20 +00001803 toErase.push_back(L);
1804 NumGVNLoad++;
1805 return true;
1806 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001807
Chris Lattner8ea60462008-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 Hernandezb1687302009-10-23 21:09:37 +00001811 if (isa<AllocaInst>(DepInst) || isMalloc(DepInst)) {
Owen Andersonb99ecca2009-07-30 23:03:37 +00001812 L->replaceAllUsesWith(UndefValue::get(L->getType()));
Chris Lattner8ea60462008-11-30 01:39:32 +00001813 toErase.push_back(L);
Chris Lattner8ea60462008-11-30 01:39:32 +00001814 NumGVNLoad++;
Chris Lattner4531da82008-12-05 21:04:20 +00001815 return true;
Eli Friedman350307f2008-02-12 12:08:14 +00001816 }
Owen Andersonc07861a2009-10-28 07:05:35 +00001817
Owen Andersonf187daf2009-12-02 07:35:19 +00001818 // If this load occurs either right after a lifetime begin,
Owen Andersonc07861a2009-10-28 07:05:35 +00001819 // then the loaded value is undefined.
1820 if (IntrinsicInst* II = dyn_cast<IntrinsicInst>(DepInst)) {
Owen Andersonf187daf2009-12-02 07:35:19 +00001821 if (II->getIntrinsicID() == Intrinsic::lifetime_start) {
Owen Andersonc07861a2009-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 Friedman350307f2008-02-12 12:08:14 +00001828
Chris Lattner4531da82008-12-05 21:04:20 +00001829 return false;
Owen Anderson85c40642007-07-24 17:55:58 +00001830}
1831
Chris Lattnerff36c952009-09-21 02:42:51 +00001832Value *GVN::lookupNumber(BasicBlock *BB, uint32_t num) {
Owen Andersonaef6a922008-06-23 17:49:45 +00001833 DenseMap<BasicBlock*, ValueNumberScope*>::iterator I = localAvail.find(BB);
1834 if (I == localAvail.end())
1835 return 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001836
Chris Lattnerff36c952009-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 Anderson2a412722008-06-20 01:15:47 +00001841 return I->second;
Chris Lattnerff36c952009-09-21 02:42:51 +00001842 Locals = Locals->parent;
Owen Anderson2a412722008-06-20 01:15:47 +00001843 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001844
Owen Anderson2a412722008-06-20 01:15:47 +00001845 return 0;
1846}
1847
Owen Andersona03e7862008-12-15 02:03:00 +00001848
Owen Andersonf631bb62007-08-14 18:16:29 +00001849/// processInstruction - When calculating availability, handle an instruction
Owen Anderson85c40642007-07-24 17:55:58 +00001850/// by inserting it into the appropriate sets
Owen Anderson9334fc62008-06-12 19:25:32 +00001851bool GVN::processInstruction(Instruction *I,
Chris Lattner7de20452008-03-21 22:01:16 +00001852 SmallVectorImpl<Instruction*> &toErase) {
Chris Lattnerff36c952009-09-21 02:42:51 +00001853 if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
1854 bool Changed = processLoad(LI, toErase);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001855
Chris Lattnerff36c952009-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 Andersone6b4ff82008-06-18 21:41:49 +00001859 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001860
Chris Lattnerff36c952009-09-21 02:42:51 +00001861 return Changed;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001862 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001863
Chris Lattnerff36c952009-09-21 02:42:51 +00001864 uint32_t NextNum = VN.getNextUnusedValueNumber();
1865 unsigned Num = VN.lookup_or_add(I);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001866
Chris Lattnerff36c952009-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 Dunbar3be44e62009-09-20 02:20:51 +00001869
Owen Andersonef8bf0f2009-04-01 23:53:49 +00001870 if (!BI->isConditional() || isa<Constant>(BI->getCondition()))
1871 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001872
Chris Lattnerff36c952009-09-21 02:42:51 +00001873 Value *BranchCond = BI->getCondition();
1874 uint32_t CondVN = VN.lookup_or_add(BranchCond);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001875
Chris Lattnerff36c952009-09-21 02:42:51 +00001876 BasicBlock *TrueSucc = BI->getSuccessor(0);
1877 BasicBlock *FalseSucc = BI->getSuccessor(1);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001878
Chris Lattnerff36c952009-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 Andersonef8bf0f2009-04-01 23:53:49 +00001885
1886 return false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001887
Owen Andersonced50f82008-04-07 09:59:07 +00001888 // Allocations are always uniquely numbered, so we can save time and memory
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001889 // by fast failing them.
Victor Hernandezb1687302009-10-23 21:09:37 +00001890 } else if (isa<AllocaInst>(I) || isa<TerminatorInst>(I)) {
Chris Lattnerff36c952009-09-21 02:42:51 +00001891 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Owen Andersonced50f82008-04-07 09:59:07 +00001892 return false;
Owen Andersone6b4ff82008-06-18 21:41:49 +00001893 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001894
Owen Andersone0143452007-08-16 22:02:55 +00001895 // Collapse PHI nodes
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001896 if (PHINode* p = dyn_cast<PHINode>(I)) {
Chris Lattnerff36c952009-09-21 02:42:51 +00001897 Value *constVal = CollapsePhi(p);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001898
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001899 if (constVal) {
Owen Andersone02ad522007-08-16 22:51:56 +00001900 p->replaceAllUsesWith(constVal);
Dan Gohmanc8d26652009-11-14 02:27:51 +00001901 if (MD && isa<PointerType>(constVal->getType()))
Chris Lattnerf81b0142008-12-09 22:06:23 +00001902 MD->invalidateCachedPointerInfo(constVal);
Owen Anderson575f2812008-12-23 00:49:51 +00001903 VN.erase(p);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001904
Owen Andersone02ad522007-08-16 22:51:56 +00001905 toErase.push_back(p);
Owen Andersone6b4ff82008-06-18 21:41:49 +00001906 } else {
Chris Lattnerff36c952009-09-21 02:42:51 +00001907 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Owen Anderson98f6a6b2007-08-14 18:33:27 +00001908 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001909
Owen Anderson8a8d13c2008-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 Lattnerff36c952009-09-21 02:42:51 +00001913 } else if (Num == NextNum) {
1914 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001915
Owen Andersona03e7862008-12-15 02:03:00 +00001916 // Perform fast-path value-number based elimination of values inherited from
1917 // dominators.
Chris Lattnerff36c952009-09-21 02:42:51 +00001918 } else if (Value *repl = lookupNumber(I->getParent(), Num)) {
Owen Andersonc772be72007-12-08 01:37:09 +00001919 // Remove it!
Owen Anderson5aff8002007-07-31 23:27:13 +00001920 VN.erase(I);
Owen Anderson85c40642007-07-24 17:55:58 +00001921 I->replaceAllUsesWith(repl);
Dan Gohmanc8d26652009-11-14 02:27:51 +00001922 if (MD && isa<PointerType>(repl->getType()))
Chris Lattnerf81b0142008-12-09 22:06:23 +00001923 MD->invalidateCachedPointerInfo(repl);
Owen Anderson85c40642007-07-24 17:55:58 +00001924 toErase.push_back(I);
1925 return true;
Owen Andersona03e7862008-12-15 02:03:00 +00001926
Owen Anderson8a8d13c2008-07-03 17:44:33 +00001927 } else {
Chris Lattnerff36c952009-09-21 02:42:51 +00001928 localAvail[I->getParent()]->table.insert(std::make_pair(Num, I));
Owen Anderson85c40642007-07-24 17:55:58 +00001929 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001930
Owen Anderson85c40642007-07-24 17:55:58 +00001931 return false;
1932}
1933
Bill Wendling42f17f62008-12-22 22:32:22 +00001934/// runOnFunction - This is the main transformation entry point for a function.
Owen Andersonbe168b32007-08-14 18:04:11 +00001935bool GVN::runOnFunction(Function& F) {
Dan Gohmanc8d26652009-11-14 02:27:51 +00001936 if (!NoLoads)
1937 MD = &getAnalysis<MemoryDependenceAnalysis>();
Chris Lattner02ca4422008-12-01 00:40:32 +00001938 DT = &getAnalysis<DominatorTree>();
Owen Andersonbcf2bd52008-05-12 20:15:55 +00001939 VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
Chris Lattner02ca4422008-12-01 00:40:32 +00001940 VN.setMemDep(MD);
1941 VN.setDomTree(DT);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001942
Chris Lattnerff36c952009-09-21 02:42:51 +00001943 bool Changed = false;
1944 bool ShouldContinue = true;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001945
Owen Anderson26ed2572008-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 Lattnerff36c952009-09-21 02:42:51 +00001949 BasicBlock *BB = FI;
Owen Anderson26ed2572008-07-16 17:52:31 +00001950 ++FI;
Owen Andersonf59eef82008-07-17 00:01:40 +00001951 bool removedBlock = MergeBlockIntoPredecessor(BB, this);
1952 if (removedBlock) NumGVNBlocks++;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001953
Chris Lattnerff36c952009-09-21 02:42:51 +00001954 Changed |= removedBlock;
Owen Anderson26ed2572008-07-16 17:52:31 +00001955 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001956
Chris Lattner4bab29b2008-12-09 19:21:47 +00001957 unsigned Iteration = 0;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001958
Chris Lattnerff36c952009-09-21 02:42:51 +00001959 while (ShouldContinue) {
Dan Gohman0be10b02009-07-25 01:43:01 +00001960 DEBUG(errs() << "GVN iteration: " << Iteration << "\n");
Chris Lattnerff36c952009-09-21 02:42:51 +00001961 ShouldContinue = iterateOnFunction(F);
1962 Changed |= ShouldContinue;
Chris Lattner4bab29b2008-12-09 19:21:47 +00001963 ++Iteration;
Owen Andersonbe168b32007-08-14 18:04:11 +00001964 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001965
Owen Anderson916f4732008-07-18 18:03:38 +00001966 if (EnablePRE) {
Owen Anderson9c935902008-09-03 23:06:07 +00001967 bool PREChanged = true;
1968 while (PREChanged) {
1969 PREChanged = performPRE(F);
Chris Lattnerff36c952009-09-21 02:42:51 +00001970 Changed |= PREChanged;
Owen Anderson9c935902008-09-03 23:06:07 +00001971 }
Owen Anderson916f4732008-07-18 18:03:38 +00001972 }
Chris Lattner4bab29b2008-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 Lopes274474b2008-10-10 16:25:50 +00001977
1978 cleanupGlobalSets();
1979
Chris Lattnerff36c952009-09-21 02:42:51 +00001980 return Changed;
Owen Andersonbe168b32007-08-14 18:04:11 +00001981}
1982
1983
Chris Lattnerff36c952009-09-21 02:42:51 +00001984bool GVN::processBlock(BasicBlock *BB) {
Chris Lattner4bab29b2008-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 Anderson9334fc62008-06-12 19:25:32 +00001987 SmallVector<Instruction*, 8> toErase;
Chris Lattnerff36c952009-09-21 02:42:51 +00001988 bool ChangedFunction = false;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001989
Owen Anderson9334fc62008-06-12 19:25:32 +00001990 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
1991 BI != BE;) {
Chris Lattnerff36c952009-09-21 02:42:51 +00001992 ChangedFunction |= processInstruction(BI, toErase);
Owen Anderson9334fc62008-06-12 19:25:32 +00001993 if (toErase.empty()) {
1994 ++BI;
1995 continue;
1996 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00001997
Owen Anderson9334fc62008-06-12 19:25:32 +00001998 // If we need some instructions deleted, do it now.
1999 NumGVNInstr += toErase.size();
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002000
Owen Anderson9334fc62008-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 Lattner02ca4422008-12-01 00:40:32 +00002007 E = toErase.end(); I != E; ++I) {
Dan Gohman7e124382009-07-31 20:24:18 +00002008 DEBUG(errs() << "GVN removed: " << **I << '\n');
Dan Gohmanc8d26652009-11-14 02:27:51 +00002009 if (MD) MD->removeInstruction(*I);
Owen Anderson9334fc62008-06-12 19:25:32 +00002010 (*I)->eraseFromParent();
Bill Wendling84049422008-12-22 21:57:30 +00002011 DEBUG(verifyRemoved(*I));
Chris Lattner02ca4422008-12-01 00:40:32 +00002012 }
Chris Lattner4bab29b2008-12-09 19:21:47 +00002013 toErase.clear();
Owen Anderson9334fc62008-06-12 19:25:32 +00002014
2015 if (AtStart)
2016 BI = BB->begin();
2017 else
2018 ++BI;
Owen Anderson9334fc62008-06-12 19:25:32 +00002019 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002020
Chris Lattnerff36c952009-09-21 02:42:51 +00002021 return ChangedFunction;
Owen Anderson9334fc62008-06-12 19:25:32 +00002022}
2023
Owen Andersone6b4ff82008-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 Lattner4790cb42009-10-31 22:11:15 +00002026bool GVN::performPRE(Function &F) {
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002027 bool Changed = false;
Owen Andersonec747c42008-06-19 19:54:19 +00002028 SmallVector<std::pair<TerminatorInst*, unsigned>, 4> toSplit;
Chris Lattner3304b562008-12-01 07:29:03 +00002029 DenseMap<BasicBlock*, Value*> predMap;
Owen Andersone6b4ff82008-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 Lattnerff36c952009-09-21 02:42:51 +00002032 BasicBlock *CurrentBlock = *DI;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002033
Owen Andersone6b4ff82008-06-18 21:41:49 +00002034 // Nothing to PRE in the entry block.
2035 if (CurrentBlock == &F.getEntryBlock()) continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002036
Owen Andersone6b4ff82008-06-18 21:41:49 +00002037 for (BasicBlock::iterator BI = CurrentBlock->begin(),
2038 BE = CurrentBlock->end(); BI != BE; ) {
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002039 Instruction *CurInst = BI++;
Duncan Sands2f500832009-05-06 06:49:50 +00002040
Victor Hernandezb1687302009-10-23 21:09:37 +00002041 if (isa<AllocaInst>(CurInst) ||
Victor Hernandez48c3c542009-09-18 22:35:49 +00002042 isa<TerminatorInst>(CurInst) || isa<PHINode>(CurInst) ||
Devang Patele9d08b82009-10-14 17:29:00 +00002043 CurInst->getType()->isVoidTy() ||
Duncan Sands2f500832009-05-06 06:49:50 +00002044 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
John Criswell6e0aa282009-03-10 15:04:53 +00002045 isa<DbgInfoIntrinsic>(CurInst))
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002046 continue;
Duncan Sands2f500832009-05-06 06:49:50 +00002047
Chris Lattnerff36c952009-09-21 02:42:51 +00002048 uint32_t ValNo = VN.lookup(CurInst);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002049
Owen Andersone6b4ff82008-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 Lattnerff36c952009-09-21 02:42:51 +00002056 unsigned NumWith = 0;
2057 unsigned NumWithout = 0;
2058 BasicBlock *PREPred = 0;
Chris Lattner3304b562008-12-01 07:29:03 +00002059 predMap.clear();
2060
Owen Andersone6b4ff82008-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 Anderson2a412722008-06-20 01:15:47 +00002064 // own predecessor, on in blocks with predecessors
2065 // that are not reachable.
2066 if (*PI == CurrentBlock) {
Chris Lattnerff36c952009-09-21 02:42:51 +00002067 NumWithout = 2;
Owen Anderson2a412722008-06-20 01:15:47 +00002068 break;
2069 } else if (!localAvail.count(*PI)) {
Chris Lattnerff36c952009-09-21 02:42:51 +00002070 NumWithout = 2;
Owen Anderson2a412722008-06-20 01:15:47 +00002071 break;
2072 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002073
2074 DenseMap<uint32_t, Value*>::iterator predV =
Chris Lattnerff36c952009-09-21 02:42:51 +00002075 localAvail[*PI]->table.find(ValNo);
Owen Anderson2a412722008-06-20 01:15:47 +00002076 if (predV == localAvail[*PI]->table.end()) {
Owen Andersone6b4ff82008-06-18 21:41:49 +00002077 PREPred = *PI;
Chris Lattnerff36c952009-09-21 02:42:51 +00002078 NumWithout++;
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002079 } else if (predV->second == CurInst) {
Chris Lattnerff36c952009-09-21 02:42:51 +00002080 NumWithout = 2;
Owen Andersone6b4ff82008-06-18 21:41:49 +00002081 } else {
Owen Anderson2a412722008-06-20 01:15:47 +00002082 predMap[*PI] = predV->second;
Chris Lattnerff36c952009-09-21 02:42:51 +00002083 NumWith++;
Owen Andersone6b4ff82008-06-18 21:41:49 +00002084 }
2085 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002086
Owen Andersone6b4ff82008-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 Lattnerff36c952009-09-21 02:42:51 +00002089 if (NumWithout != 1 || NumWith == 0)
Owen Andersone6b4ff82008-06-18 21:41:49 +00002090 continue;
Chris Lattner4790cb42009-10-31 22:11:15 +00002091
2092 // Don't do PRE across indirect branch.
2093 if (isa<IndirectBrInst>(PREPred->getTerminator()))
2094 continue;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002095
Owen Andersonec747c42008-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 Lattnerff36c952009-09-21 02:42:51 +00002099 unsigned SuccNum = 0;
Owen Andersonec747c42008-06-19 19:54:19 +00002100 for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
2101 i != e; ++i)
Owen Anderson9c935902008-09-03 23:06:07 +00002102 if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
Chris Lattnerff36c952009-09-21 02:42:51 +00002103 SuccNum = i;
Owen Andersonec747c42008-06-19 19:54:19 +00002104 break;
2105 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002106
Chris Lattnerff36c952009-09-21 02:42:51 +00002107 if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
2108 toSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
Owen Andersonec747c42008-06-19 19:54:19 +00002109 continue;
2110 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002111
Owen Andersone6b4ff82008-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 Lewyckyc94270c2009-09-27 07:38:41 +00002117 Instruction *PREInstr = CurInst->clone();
Owen Andersone6b4ff82008-06-18 21:41:49 +00002118 bool success = true;
Chris Lattner66a3a3e2008-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 Dunbar3be44e62009-09-20 02:20:51 +00002123
Chris Lattner66a3a3e2008-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 Anderson14c612f2008-07-11 20:05:13 +00002129 }
Owen Andersone6b4ff82008-06-18 21:41:49 +00002130 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002131
Owen Andersone6b4ff82008-06-18 21:41:49 +00002132 // Fail out if we encounter an operand that is not available in
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002133 // the PRE predecessor. This is typically because of loads which
Owen Andersone6b4ff82008-06-18 21:41:49 +00002134 // are not value numbered precisely.
2135 if (!success) {
2136 delete PREInstr;
Bill Wendling3858cae2008-12-22 22:14:07 +00002137 DEBUG(verifyRemoved(PREInstr));
Owen Andersone6b4ff82008-06-18 21:41:49 +00002138 continue;
2139 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002140
Owen Andersone6b4ff82008-06-18 21:41:49 +00002141 PREInstr->insertBefore(PREPred->getTerminator());
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002142 PREInstr->setName(CurInst->getName() + ".pre");
Owen Anderson2a412722008-06-20 01:15:47 +00002143 predMap[PREPred] = PREInstr;
Chris Lattnerff36c952009-09-21 02:42:51 +00002144 VN.add(PREInstr, ValNo);
Owen Andersone6b4ff82008-06-18 21:41:49 +00002145 NumGVNPRE++;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002146
Owen Andersone6b4ff82008-06-18 21:41:49 +00002147 // Update the availability map to include the new instruction.
Chris Lattnerff36c952009-09-21 02:42:51 +00002148 localAvail[PREPred]->table.insert(std::make_pair(ValNo, PREInstr));
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002149
Owen Andersone6b4ff82008-06-18 21:41:49 +00002150 // Create a PHI to make the value available in this block.
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002151 PHINode* Phi = PHINode::Create(CurInst->getType(),
2152 CurInst->getName() + ".pre-phi",
Owen Andersone6b4ff82008-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 Anderson2a412722008-06-20 01:15:47 +00002156 Phi->addIncoming(predMap[*PI], *PI);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002157
Chris Lattnerff36c952009-09-21 02:42:51 +00002158 VN.add(Phi, ValNo);
2159 localAvail[CurrentBlock]->table[ValNo] = Phi;
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002160
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002161 CurInst->replaceAllUsesWith(Phi);
Dan Gohmanc8d26652009-11-14 02:27:51 +00002162 if (MD && isa<PointerType>(Phi->getType()))
Chris Lattnerf81b0142008-12-09 22:06:23 +00002163 MD->invalidateCachedPointerInfo(Phi);
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002164 VN.erase(CurInst);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002165
Dan Gohman7e124382009-07-31 20:24:18 +00002166 DEBUG(errs() << "GVN PRE removed: " << *CurInst << '\n');
Dan Gohmanc8d26652009-11-14 02:27:51 +00002167 if (MD) MD->removeInstruction(CurInst);
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002168 CurInst->eraseFromParent();
Bill Wendling84049422008-12-22 21:57:30 +00002169 DEBUG(verifyRemoved(CurInst));
Chris Lattner66a3a3e2008-12-01 07:35:54 +00002170 Changed = true;
Owen Andersone6b4ff82008-06-18 21:41:49 +00002171 }
2172 }
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002173
Owen Andersonec747c42008-06-19 19:54:19 +00002174 for (SmallVector<std::pair<TerminatorInst*, unsigned>, 4>::iterator
Anton Korobeynikov2e8710c2008-12-05 19:38:49 +00002175 I = toSplit.begin(), E = toSplit.end(); I != E; ++I)
Owen Andersonec747c42008-06-19 19:54:19 +00002176 SplitCriticalEdge(I->first, I->second, this);
Daniel Dunbar3be44e62009-09-20 02:20:51 +00002177
Anton Korobeynikov2e8710c2008-12-05 19:38:49 +00002178 return Changed || toSplit.size();
Owen Andersone6b4ff82008-06-18 21:41:49 +00002179}
2180
Bill Wendling42f17f62008-12-22 22:32:22 +00002181/// iterateOnFunction - Executes one iteration of GVN
Owen Andersonbe168b32007-08-14 18:04:11 +00002182bool GVN::iterateOnFunction(Function &F) {
Nuno Lopes274474b2008-10-10 16:25:50 +00002183 cleanupGlobalSets();
Chris Lattner98054902008-03-21 21:33:23 +00002184
Owen Andersonef8bf0f2009-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 Anderson85c40642007-07-24 17:55:58 +00002194 // Top-down walk of the dominator tree
Chris Lattnerff36c952009-09-21 02:42:51 +00002195 bool Changed = false;
Owen Andersonef136f52008-12-15 03:52:17 +00002196#if 0
2197 // Needed for value numbering with phi construction to work.
Owen Andersona03e7862008-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 Lattnerff36c952009-09-21 02:42:51 +00002201 Changed |= processBlock(*RI);
Owen Andersonef136f52008-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 Lattnerff36c952009-09-21 02:42:51 +00002205 Changed |= processBlock(DI->getBlock());
Owen Andersonef136f52008-12-15 03:52:17 +00002206#endif
2207
Chris Lattnerff36c952009-09-21 02:42:51 +00002208 return Changed;
Owen Anderson85c40642007-07-24 17:55:58 +00002209}
Nuno Lopes274474b2008-10-10 16:25:50 +00002210
2211void GVN::cleanupGlobalSets() {
2212 VN.clear();
Nuno Lopes274474b2008-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 Wendling2a023742008-12-22 21:36:08 +00002219
2220/// verifyRemoved - Verify that the specified instruction does not occur in our
2221/// internal data structures.
Bill Wendlingf9c0e9e2008-12-22 22:28:56 +00002222void GVN::verifyRemoved(const Instruction *Inst) const {
2223 VN.verifyRemoved(Inst);
Bill Wendling3858cae2008-12-22 22:14:07 +00002224
Bill Wendlingf9c0e9e2008-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 Yasskin8154d2e2009-11-10 01:02:17 +00002227 for (DenseMap<BasicBlock*, ValueNumberScope*>::const_iterator
Bill Wendlingf9c0e9e2008-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 Yasskin8154d2e2009-11-10 01:02:17 +00002232 for (DenseMap<uint32_t, Value*>::const_iterator
Bill Wendlingf9c0e9e2008-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 Wendling3858cae2008-12-22 22:14:07 +00002238 }
2239 }
Bill Wendling2a023742008-12-22 21:36:08 +00002240}