blob: 366a95c49cd40ab33274ad5407112ce7e5acd170 [file] [log] [blame]
Chris Lattner4d1e46e2002-05-07 18:07:59 +00001//===-- Local.cpp - Functions to perform local transformations ------------===//
Misha Brukmanfd939082005-04-21 23:48:37 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
Misha Brukmanfd939082005-04-21 23:48:37 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattner4d1e46e2002-05-07 18:07:59 +00009//
10// This family of functions perform various local transformations to the
11// program.
12//
13//===----------------------------------------------------------------------===//
14
15#include "llvm/Transforms/Utils/Local.h"
Chris Lattner81ebc302004-01-12 18:35:03 +000016#include "llvm/Constants.h"
Chris Lattnerc5f52e62005-09-26 05:27:10 +000017#include "llvm/DerivedTypes.h"
Chris Lattner7822c2a2004-01-12 19:56:36 +000018#include "llvm/Instructions.h"
Chris Lattnercf110352004-06-11 06:16:23 +000019#include "llvm/Intrinsics.h"
Chris Lattnercbbc6b72005-10-27 16:34:00 +000020#include "llvm/Analysis/ConstantFolding.h"
Chris Lattnerc5f52e62005-09-26 05:27:10 +000021#include "llvm/Support/GetElementPtrTypeIterator.h"
22#include "llvm/Support/MathExtras.h"
Alkis Evlogimenos09233fb2004-04-21 16:11:40 +000023#include <cerrno>
Chris Lattnerabbc2dd2003-12-19 05:56:28 +000024using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000025
Chris Lattner4d1e46e2002-05-07 18:07:59 +000026//===----------------------------------------------------------------------===//
Misha Brukman82c89b92003-05-20 21:01:22 +000027// Local constant propagation...
Chris Lattner4d1e46e2002-05-07 18:07:59 +000028//
29
Chris Lattnerabbc2dd2003-12-19 05:56:28 +000030/// doConstantPropagation - If an instruction references constants, try to fold
31/// them together...
32///
33bool llvm::doConstantPropagation(BasicBlock::iterator &II) {
Chris Lattner18961502002-06-25 16:12:52 +000034 if (Constant *C = ConstantFoldInstruction(II)) {
Chris Lattner4d1e46e2002-05-07 18:07:59 +000035 // Replaces all of the uses of a variable with uses of the constant.
Chris Lattner18961502002-06-25 16:12:52 +000036 II->replaceAllUsesWith(C);
Misha Brukmanfd939082005-04-21 23:48:37 +000037
Chris Lattner4d1e46e2002-05-07 18:07:59 +000038 // Remove the instruction from the basic block...
Chris Lattner18961502002-06-25 16:12:52 +000039 II = II->getParent()->getInstList().erase(II);
Chris Lattner4d1e46e2002-05-07 18:07:59 +000040 return true;
41 }
42
43 return false;
44}
45
Chris Lattner8f90b002004-01-12 18:25:22 +000046/// ConstantFoldInstruction - Attempt to constant fold the specified
47/// instruction. If successful, the constant result is returned, if not, null
48/// is returned. Note that this function can only fail when attempting to fold
49/// instructions like loads and stores, which have no constant expression form.
50///
51Constant *llvm::ConstantFoldInstruction(Instruction *I) {
52 if (PHINode *PN = dyn_cast<PHINode>(I)) {
53 if (PN->getNumIncomingValues() == 0)
54 return Constant::getNullValue(PN->getType());
Misha Brukmanfd939082005-04-21 23:48:37 +000055
Chris Lattner8f90b002004-01-12 18:25:22 +000056 Constant *Result = dyn_cast<Constant>(PN->getIncomingValue(0));
57 if (Result == 0) return 0;
58
59 // Handle PHI nodes specially here...
60 for (unsigned i = 1, e = PN->getNumIncomingValues(); i != e; ++i)
61 if (PN->getIncomingValue(i) != Result && PN->getIncomingValue(i) != PN)
62 return 0; // Not all the same incoming constants...
Misha Brukmanfd939082005-04-21 23:48:37 +000063
Chris Lattner8f90b002004-01-12 18:25:22 +000064 // If we reach here, all incoming values are the same constant.
65 return Result;
66 }
67
68 Constant *Op0 = 0, *Op1 = 0;
69 switch (I->getNumOperands()) {
70 default:
71 case 2:
72 Op1 = dyn_cast<Constant>(I->getOperand(1));
73 if (Op1 == 0) return 0; // Not a constant?, can't fold
74 case 1:
75 Op0 = dyn_cast<Constant>(I->getOperand(0));
76 if (Op0 == 0) return 0; // Not a constant?, can't fold
77 break;
78 case 0: return 0;
79 }
80
Chris Lattner4b30fcb2006-05-27 01:18:04 +000081 if (isa<BinaryOperator>(I) || isa<ShiftInst>(I)) {
82 if (Constant *Op0 = dyn_cast<Constant>(I->getOperand(0)))
83 if (Constant *Op1 = dyn_cast<Constant>(I->getOperand(1)))
84 return ConstantExpr::get(I->getOpcode(), Op0, Op1);
85 return 0; // Operands not constants.
86 }
Chris Lattner8f90b002004-01-12 18:25:22 +000087
Chris Lattner4b30fcb2006-05-27 01:18:04 +000088 // Scan the operand list, checking to see if the are all constants, if so,
89 // hand off to ConstantFoldInstOperands.
90 std::vector<Constant*> Ops;
91 for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
92 if (Constant *Op = dyn_cast<Constant>(I->getOperand(i)))
93 Ops.push_back(Op);
94 else
95 return 0; // All operands not constant!
96
97 return ConstantFoldInstOperands(I->getOpcode(), I->getType(), Ops);
98}
99
100/// ConstantFoldInstOperands - Attempt to constant fold an instruction with the
101/// specified opcode and operands. If successful, the constant result is
102/// returned, if not, null is returned. Note that this function can fail when
103/// attempting to fold instructions like loads and stores, which have no
104/// constant expression form.
105///
106Constant *llvm::ConstantFoldInstOperands(unsigned Opc, const Type *DestTy,
107 const std::vector<Constant*> &Ops) {
108 if (Opc >= Instruction::BinaryOpsBegin && Opc < Instruction::BinaryOpsEnd)
109 return ConstantExpr::get(Opc, Ops[0], Ops[1]);
110
111 switch (Opc) {
Chris Lattner8f90b002004-01-12 18:25:22 +0000112 default: return 0;
Chris Lattner4b30fcb2006-05-27 01:18:04 +0000113 case Instruction::Call:
114 if (Function *F = dyn_cast<Function>(Ops[0])) {
115 if (canConstantFoldCallTo(F)) {
116 std::vector<Constant*> Args(Ops.begin()+1, Ops.end());
117 return ConstantFoldCall(F, Args);
118 }
119 }
120 return 0;
121 case Instruction::Shl:
Reid Spencer3822ff52006-11-08 06:47:33 +0000122 case Instruction::LShr:
123 case Instruction::AShr:
Chris Lattner4b30fcb2006-05-27 01:18:04 +0000124 return ConstantExpr::get(Opc, Ops[0], Ops[1]);
Reid Spencer3da59db2006-11-27 01:05:10 +0000125 case Instruction::Trunc:
126 case Instruction::ZExt:
127 case Instruction::SExt:
128 case Instruction::FPTrunc:
129 case Instruction::FPExt:
130 case Instruction::UIToFP:
131 case Instruction::SIToFP:
132 case Instruction::FPToUI:
133 case Instruction::FPToSI:
134 case Instruction::PtrToInt:
135 case Instruction::IntToPtr:
136 case Instruction::BitCast:
137 return ConstantExpr::getCast(Opc, Ops[0], DestTy);
Chris Lattner17fd2732004-03-12 05:53:03 +0000138 case Instruction::Select:
Chris Lattner4b30fcb2006-05-27 01:18:04 +0000139 return ConstantExpr::getSelect(Ops[0], Ops[1], Ops[2]);
Robert Bocchinob52ee7f2006-01-10 19:05:34 +0000140 case Instruction::ExtractElement:
Chris Lattner4b30fcb2006-05-27 01:18:04 +0000141 return ConstantExpr::getExtractElement(Ops[0], Ops[1]);
Robert Bocchino956fd722006-01-17 20:07:07 +0000142 case Instruction::InsertElement:
Chris Lattner4b30fcb2006-05-27 01:18:04 +0000143 return ConstantExpr::getInsertElement(Ops[0], Ops[1], Ops[2]);
Chris Lattner543abdf2006-04-08 01:19:12 +0000144 case Instruction::ShuffleVector:
Chris Lattner4b30fcb2006-05-27 01:18:04 +0000145 return ConstantExpr::getShuffleVector(Ops[0], Ops[1], Ops[2]);
Chris Lattner8f90b002004-01-12 18:25:22 +0000146 case Instruction::GetElementPtr:
Chris Lattner4b30fcb2006-05-27 01:18:04 +0000147 return ConstantExpr::getGetElementPtr(Ops[0],
148 std::vector<Constant*>(Ops.begin()+1,
149 Ops.end()));
Chris Lattner8f90b002004-01-12 18:25:22 +0000150 }
151}
152
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000153// ConstantFoldTerminator - If a terminator instruction is predicated on a
154// constant value, convert it into an unconditional branch to the constant
155// destination.
156//
Chris Lattnerabbc2dd2003-12-19 05:56:28 +0000157bool llvm::ConstantFoldTerminator(BasicBlock *BB) {
Chris Lattner76ae3442002-05-21 20:04:50 +0000158 TerminatorInst *T = BB->getTerminator();
Misha Brukmanfd939082005-04-21 23:48:37 +0000159
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000160 // Branch - See if we are conditional jumping on constant
161 if (BranchInst *BI = dyn_cast<BranchInst>(T)) {
162 if (BI->isUnconditional()) return false; // Can't optimize uncond branch
163 BasicBlock *Dest1 = cast<BasicBlock>(BI->getOperand(0));
164 BasicBlock *Dest2 = cast<BasicBlock>(BI->getOperand(1));
165
166 if (ConstantBool *Cond = dyn_cast<ConstantBool>(BI->getCondition())) {
167 // Are we branching on constant?
168 // YES. Change to unconditional branch...
169 BasicBlock *Destination = Cond->getValue() ? Dest1 : Dest2;
170 BasicBlock *OldDest = Cond->getValue() ? Dest2 : Dest1;
171
Misha Brukmanfd939082005-04-21 23:48:37 +0000172 //cerr << "Function: " << T->getParent()->getParent()
173 // << "\nRemoving branch from " << T->getParent()
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000174 // << "\n\nTo: " << OldDest << endl;
175
176 // Let the basic block know that we are letting go of it. Based on this,
177 // it will adjust it's PHI nodes.
178 assert(BI->getParent() && "Terminator not inserted in block!");
179 OldDest->removePredecessor(BI->getParent());
180
181 // Set the unconditional destination, and change the insn to be an
182 // unconditional branch.
183 BI->setUnconditionalDest(Destination);
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000184 return true;
Chris Lattner342a9d12003-08-17 19:34:55 +0000185 } else if (Dest2 == Dest1) { // Conditional branch to same location?
Misha Brukmanfd939082005-04-21 23:48:37 +0000186 // This branch matches something like this:
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000187 // br bool %cond, label %Dest, label %Dest
188 // and changes it into: br label %Dest
189
190 // Let the basic block know that we are letting go of one copy of it.
191 assert(BI->getParent() && "Terminator not inserted in block!");
192 Dest1->removePredecessor(BI->getParent());
193
194 // Change a conditional branch to unconditional.
195 BI->setUnconditionalDest(Dest1);
196 return true;
197 }
Chris Lattner10b1f5a2003-08-17 20:21:14 +0000198 } else if (SwitchInst *SI = dyn_cast<SwitchInst>(T)) {
199 // If we are switching on a constant, we can convert the switch into a
200 // single branch instruction!
201 ConstantInt *CI = dyn_cast<ConstantInt>(SI->getCondition());
202 BasicBlock *TheOnlyDest = SI->getSuccessor(0); // The default dest
Chris Lattner7d6c24c2003-08-23 23:18:19 +0000203 BasicBlock *DefaultDest = TheOnlyDest;
204 assert(TheOnlyDest == SI->getDefaultDest() &&
205 "Default destination is not successor #0?");
Chris Lattner694e37f2003-08-17 19:41:53 +0000206
Chris Lattner10b1f5a2003-08-17 20:21:14 +0000207 // Figure out which case it goes to...
208 for (unsigned i = 1, e = SI->getNumSuccessors(); i != e; ++i) {
209 // Found case matching a constant operand?
210 if (SI->getSuccessorValue(i) == CI) {
211 TheOnlyDest = SI->getSuccessor(i);
212 break;
213 }
Chris Lattner694e37f2003-08-17 19:41:53 +0000214
Chris Lattner7d6c24c2003-08-23 23:18:19 +0000215 // Check to see if this branch is going to the same place as the default
216 // dest. If so, eliminate it as an explicit compare.
217 if (SI->getSuccessor(i) == DefaultDest) {
218 // Remove this entry...
219 DefaultDest->removePredecessor(SI->getParent());
220 SI->removeCase(i);
221 --i; --e; // Don't skip an entry...
222 continue;
223 }
224
Chris Lattner10b1f5a2003-08-17 20:21:14 +0000225 // Otherwise, check to see if the switch only branches to one destination.
226 // We do this by reseting "TheOnlyDest" to null when we find two non-equal
227 // destinations.
228 if (SI->getSuccessor(i) != TheOnlyDest) TheOnlyDest = 0;
Chris Lattner694e37f2003-08-17 19:41:53 +0000229 }
230
Chris Lattner10b1f5a2003-08-17 20:21:14 +0000231 if (CI && !TheOnlyDest) {
232 // Branching on a constant, but not any of the cases, go to the default
233 // successor.
234 TheOnlyDest = SI->getDefaultDest();
235 }
236
237 // If we found a single destination that we can fold the switch into, do so
238 // now.
239 if (TheOnlyDest) {
240 // Insert the new branch..
241 new BranchInst(TheOnlyDest, SI);
242 BasicBlock *BB = SI->getParent();
243
244 // Remove entries from PHI nodes which we no longer branch to...
245 for (unsigned i = 0, e = SI->getNumSuccessors(); i != e; ++i) {
246 // Found case matching a constant operand?
247 BasicBlock *Succ = SI->getSuccessor(i);
248 if (Succ == TheOnlyDest)
249 TheOnlyDest = 0; // Don't modify the first branch to TheOnlyDest
250 else
251 Succ->removePredecessor(BB);
252 }
253
254 // Delete the old switch...
255 BB->getInstList().erase(SI);
256 return true;
257 } else if (SI->getNumSuccessors() == 2) {
258 // Otherwise, we can fold this switch into a conditional branch
259 // instruction if it has only one non-default destination.
260 Value *Cond = new SetCondInst(Instruction::SetEQ, SI->getCondition(),
261 SI->getSuccessorValue(1), "cond", SI);
262 // Insert the new branch...
263 new BranchInst(SI->getSuccessor(1), SI->getSuccessor(0), Cond, SI);
264
265 // Delete the old switch...
266 SI->getParent()->getInstList().erase(SI);
267 return true;
268 }
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000269 }
270 return false;
271}
272
Chris Lattnerc5f52e62005-09-26 05:27:10 +0000273/// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a
274/// getelementptr constantexpr, return the constant value being addressed by the
275/// constant expression, or null if something is funny and we can't decide.
276Constant *llvm::ConstantFoldLoadThroughGEPConstantExpr(Constant *C,
277 ConstantExpr *CE) {
278 if (CE->getOperand(1) != Constant::getNullValue(CE->getOperand(1)->getType()))
279 return 0; // Do not allow stepping over the value!
280
281 // Loop over all of the operands, tracking down which value we are
282 // addressing...
283 gep_type_iterator I = gep_type_begin(CE), E = gep_type_end(CE);
284 for (++I; I != E; ++I)
285 if (const StructType *STy = dyn_cast<StructType>(*I)) {
Reid Spencerb83eb642006-10-20 07:07:24 +0000286 ConstantInt *CU = cast<ConstantInt>(I.getOperand());
287 assert(CU->getZExtValue() < STy->getNumElements() &&
Chris Lattnerc5f52e62005-09-26 05:27:10 +0000288 "Struct index out of range!");
Reid Spencerb83eb642006-10-20 07:07:24 +0000289 unsigned El = (unsigned)CU->getZExtValue();
Chris Lattnerc5f52e62005-09-26 05:27:10 +0000290 if (ConstantStruct *CS = dyn_cast<ConstantStruct>(C)) {
291 C = CS->getOperand(El);
292 } else if (isa<ConstantAggregateZero>(C)) {
293 C = Constant::getNullValue(STy->getElementType(El));
294 } else if (isa<UndefValue>(C)) {
295 C = UndefValue::get(STy->getElementType(El));
296 } else {
297 return 0;
298 }
299 } else if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand())) {
Robert Bocchinod900c6a2006-01-19 23:53:23 +0000300 if (const ArrayType *ATy = dyn_cast<ArrayType>(*I)) {
Reid Spencerb83eb642006-10-20 07:07:24 +0000301 if (CI->getZExtValue() >= ATy->getNumElements())
Chris Lattner99f2af22006-05-25 21:25:12 +0000302 return 0;
Robert Bocchinod900c6a2006-01-19 23:53:23 +0000303 if (ConstantArray *CA = dyn_cast<ConstantArray>(C))
Reid Spencerb83eb642006-10-20 07:07:24 +0000304 C = CA->getOperand(CI->getZExtValue());
Robert Bocchinod900c6a2006-01-19 23:53:23 +0000305 else if (isa<ConstantAggregateZero>(C))
306 C = Constant::getNullValue(ATy->getElementType());
307 else if (isa<UndefValue>(C))
308 C = UndefValue::get(ATy->getElementType());
309 else
310 return 0;
311 } else if (const PackedType *PTy = dyn_cast<PackedType>(*I)) {
Reid Spencerb83eb642006-10-20 07:07:24 +0000312 if (CI->getZExtValue() >= PTy->getNumElements())
Chris Lattner99f2af22006-05-25 21:25:12 +0000313 return 0;
Robert Bocchinod900c6a2006-01-19 23:53:23 +0000314 if (ConstantPacked *CP = dyn_cast<ConstantPacked>(C))
Reid Spencerb83eb642006-10-20 07:07:24 +0000315 C = CP->getOperand(CI->getZExtValue());
Robert Bocchinod900c6a2006-01-19 23:53:23 +0000316 else if (isa<ConstantAggregateZero>(C))
317 C = Constant::getNullValue(PTy->getElementType());
318 else if (isa<UndefValue>(C))
319 C = UndefValue::get(PTy->getElementType());
320 else
321 return 0;
322 } else {
Chris Lattnerc5f52e62005-09-26 05:27:10 +0000323 return 0;
Robert Bocchinod900c6a2006-01-19 23:53:23 +0000324 }
Chris Lattnerc5f52e62005-09-26 05:27:10 +0000325 } else {
326 return 0;
327 }
328 return C;
329}
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000330
331
332//===----------------------------------------------------------------------===//
333// Local dead code elimination...
334//
335
Chris Lattnerabbc2dd2003-12-19 05:56:28 +0000336bool llvm::isInstructionTriviallyDead(Instruction *I) {
Chris Lattnerec710c52005-05-06 05:27:34 +0000337 if (!I->use_empty() || isa<TerminatorInst>(I)) return false;
Jeff Cohen00b168892005-07-27 06:12:32 +0000338
Chris Lattnerec710c52005-05-06 05:27:34 +0000339 if (!I->mayWriteToMemory()) return true;
340
341 if (CallInst *CI = dyn_cast<CallInst>(I))
Chris Lattneraeebe7f2006-03-09 22:38:10 +0000342 if (Function *F = CI->getCalledFunction()) {
Chris Lattner7224f842006-04-02 03:35:01 +0000343 unsigned IntrinsicID = F->getIntrinsicID();
Chris Lattneraeebe7f2006-03-09 22:38:10 +0000344#define GET_SIDE_EFFECT_INFO
345#include "llvm/Intrinsics.gen"
346#undef GET_SIDE_EFFECT_INFO
347 }
Chris Lattnerec710c52005-05-06 05:27:34 +0000348 return false;
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000349}
350
351// dceInstruction - Inspect the instruction at *BBI and figure out if it's
352// [trivially] dead. If so, remove the instruction and update the iterator
353// to point to the instruction that immediately succeeded the original
354// instruction.
355//
Chris Lattnerabbc2dd2003-12-19 05:56:28 +0000356bool llvm::dceInstruction(BasicBlock::iterator &BBI) {
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000357 // Look for un"used" definitions...
Chris Lattner18961502002-06-25 16:12:52 +0000358 if (isInstructionTriviallyDead(BBI)) {
359 BBI = BBI->getParent()->getInstList().erase(BBI); // Bye bye
Chris Lattner4d1e46e2002-05-07 18:07:59 +0000360 return true;
361 }
362 return false;
363}