Clean up the use of static and anonymous namespaces. This turned up
[oota-llvm.git] / lib / Transforms / IPO / IPConstantPropagation.cpp
1 //===-- IPConstantPropagation.cpp - Propagate constants through calls -----===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This pass implements an _extremely_ simple interprocedural constant
11 // propagation pass.  It could certainly be improved in many different ways,
12 // like using a worklist.  This pass makes arguments dead, but does not remove
13 // them.  The existing dead argument elimination pass should be run after this
14 // to clean up the mess.
15 //
16 //===----------------------------------------------------------------------===//
17
18 #define DEBUG_TYPE "ipconstprop"
19 #include "llvm/Transforms/IPO.h"
20 #include "llvm/Constants.h"
21 #include "llvm/Instructions.h"
22 #include "llvm/Module.h"
23 #include "llvm/Pass.h"
24 #include "llvm/Support/CallSite.h"
25 #include "llvm/Support/Compiler.h"
26 #include "llvm/ADT/Statistic.h"
27 #include "llvm/ADT/SmallVector.h"
28 using namespace llvm;
29
30 STATISTIC(NumArgumentsProped, "Number of args turned into constants");
31 STATISTIC(NumReturnValProped, "Number of return values turned into constants");
32
33 namespace {
34   /// IPCP - The interprocedural constant propagation pass
35   ///
36   struct VISIBILITY_HIDDEN IPCP : public ModulePass {
37     static char ID; // Pass identification, replacement for typeid
38     IPCP() : ModulePass((intptr_t)&ID) {}
39
40     bool runOnModule(Module &M);
41   private:
42     bool PropagateConstantsIntoArguments(Function &F);
43     bool PropagateConstantReturn(Function &F);
44   };
45 }
46
47 char IPCP::ID = 0;
48 static RegisterPass<IPCP>
49 X("ipconstprop", "Interprocedural constant propagation");
50
51 ModulePass *llvm::createIPConstantPropagationPass() { return new IPCP(); }
52
53 bool IPCP::runOnModule(Module &M) {
54   bool Changed = false;
55   bool LocalChange = true;
56
57   // FIXME: instead of using smart algorithms, we just iterate until we stop
58   // making changes.
59   while (LocalChange) {
60     LocalChange = false;
61     for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
62       if (!I->isDeclaration()) {
63         // Delete any klingons.
64         I->removeDeadConstantUsers();
65         if (I->hasInternalLinkage())
66           LocalChange |= PropagateConstantsIntoArguments(*I);
67         Changed |= PropagateConstantReturn(*I);
68       }
69     Changed |= LocalChange;
70   }
71   return Changed;
72 }
73
74 /// PropagateConstantsIntoArguments - Look at all uses of the specified
75 /// function.  If all uses are direct call sites, and all pass a particular
76 /// constant in for an argument, propagate that constant in as the argument.
77 ///
78 bool IPCP::PropagateConstantsIntoArguments(Function &F) {
79   if (F.arg_empty() || F.use_empty()) return false; // No arguments? Early exit.
80
81   // For each argument, keep track of its constant value and whether it is a
82   // constant or not.  The bool is driven to true when found to be non-constant.
83   SmallVector<std::pair<Constant*, bool>, 16> ArgumentConstants;
84   ArgumentConstants.resize(F.arg_size());
85
86   unsigned NumNonconstant = 0;
87   for (Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E; ++UI) {
88     // Used by a non-instruction, or not the callee of a function, do not
89     // transform.
90     if (UI.getOperandNo() != 0 ||
91         (!isa<CallInst>(*UI) && !isa<InvokeInst>(*UI)))
92       return false;
93     
94     CallSite CS = CallSite::get(cast<Instruction>(*UI));
95
96     // Check out all of the potentially constant arguments.  Note that we don't
97     // inspect varargs here.
98     CallSite::arg_iterator AI = CS.arg_begin();
99     Function::arg_iterator Arg = F.arg_begin();
100     for (unsigned i = 0, e = ArgumentConstants.size(); i != e;
101          ++i, ++AI, ++Arg) {
102       
103       // If this argument is known non-constant, ignore it.
104       if (ArgumentConstants[i].second)
105         continue;
106       
107       Constant *C = dyn_cast<Constant>(*AI);
108       if (C && ArgumentConstants[i].first == 0) {
109         ArgumentConstants[i].first = C;   // First constant seen.
110       } else if (C && ArgumentConstants[i].first == C) {
111         // Still the constant value we think it is.
112       } else if (*AI == &*Arg) {
113         // Ignore recursive calls passing argument down.
114       } else {
115         // Argument became non-constant.  If all arguments are non-constant now,
116         // give up on this function.
117         if (++NumNonconstant == ArgumentConstants.size())
118           return false;
119         ArgumentConstants[i].second = true;
120       }
121     }
122   }
123
124   // If we got to this point, there is a constant argument!
125   assert(NumNonconstant != ArgumentConstants.size());
126   bool MadeChange = false;
127   Function::arg_iterator AI = F.arg_begin();
128   for (unsigned i = 0, e = ArgumentConstants.size(); i != e; ++i, ++AI) {
129     // Do we have a constant argument?
130     if (ArgumentConstants[i].second || AI->use_empty())
131       continue;
132   
133     Value *V = ArgumentConstants[i].first;
134     if (V == 0) V = UndefValue::get(AI->getType());
135     AI->replaceAllUsesWith(V);
136     ++NumArgumentsProped;
137     MadeChange = true;
138   }
139   return MadeChange;
140 }
141
142
143 // Check to see if this function returns a constant.  If so, replace all callers
144 // that user the return value with the returned valued.  If we can replace ALL
145 // callers,
146 bool IPCP::PropagateConstantReturn(Function &F) {
147   if (F.getReturnType() == Type::VoidTy)
148     return false; // No return value.
149
150   // Check to see if this function returns a constant.
151   SmallVector<Value *,4> RetVals;
152   const StructType *STy = dyn_cast<StructType>(F.getReturnType());
153   if (STy)
154     RetVals.assign(STy->getNumElements(), 0);
155   else
156     RetVals.push_back(0);
157
158   for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
159     if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) {
160       assert(RetVals.size() == RI->getNumOperands() &&
161              "Invalid ReturnInst operands!");
162       for (unsigned i = 0, e = RetVals.size(); i != e; ++i) {
163         if (isa<UndefValue>(RI->getOperand(i)))
164           continue; // Ignore
165         Constant *C = dyn_cast<Constant>(RI->getOperand(i));
166         if (C == 0)
167           return false; // Does not return a constant.
168         
169         Value *RV = RetVals[i];
170         if (RV == 0)
171           RetVals[i] = C;
172         else if (RV != C)
173           return false; // Does not return the same constant.
174       }
175     }
176
177   if (STy) {
178     for (unsigned i = 0, e = RetVals.size(); i < e; ++i) 
179       if (RetVals[i] == 0) 
180         RetVals[i] = UndefValue::get(STy->getElementType(i));
181   } else {
182     assert(RetVals.size() == 1);
183     if (RetVals[0] == 0)
184       RetVals[0] = UndefValue::get(F.getReturnType());
185   }
186
187   // If we got here, the function returns a constant value.  Loop over all
188   // users, replacing any uses of the return value with the returned constant.
189   bool ReplacedAllUsers = true;
190   bool MadeChange = false;
191   for (Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E; ++UI) {
192     // Make sure this is an invoke or call and that the use is for the callee.
193     if (!(isa<InvokeInst>(*UI) || isa<CallInst>(*UI)) ||
194         UI.getOperandNo() != 0) {
195       ReplacedAllUsers = false;
196       continue;
197     }
198     
199     Instruction *Call = cast<Instruction>(*UI);
200     if (Call->use_empty())
201       continue;
202
203     MadeChange = true;
204
205     if (STy == 0) {
206       Call->replaceAllUsesWith(RetVals[0]);
207       continue;
208     }
209    
210     while (!Call->use_empty()) {
211       GetResultInst *GR = cast<GetResultInst>(Call->use_back());
212       GR->replaceAllUsesWith(RetVals[GR->getIndex()]);
213       GR->eraseFromParent();
214     }
215   }
216   
217   // If we replace all users with the returned constant, and there can be no
218   // other callers of the function, replace the constant being returned in the
219   // function with an undef value.
220   if (ReplacedAllUsers && F.hasInternalLinkage()) {
221     for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
222       if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) {
223         for (unsigned i = 0, e = RetVals.size(); i < e; ++i) {
224           Value *RetVal = RetVals[i];
225           if (isa<UndefValue>(RetVal))
226             continue;
227           Value *RV = UndefValue::get(RetVal->getType());
228           if (RI->getOperand(i) != RV) {
229             RI->setOperand(i, RV);
230             MadeChange = true;
231           }
232         }
233       }
234     }
235   }
236
237   if (MadeChange) ++NumReturnValProped;
238   return MadeChange;
239 }