IPConstantPropagation.cpp revision 18d73c206e8259de61abf54d8d0f47c0e54f42aa
1d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner//===-- IPConstantPropagation.cpp - Propagate constants through calls -----===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// The LLVM Compiler Infrastructure 4d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner//===----------------------------------------------------------------------===// 9d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// 10d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// This pass implements an _extremely_ simple interprocedural constant 11d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// propagation pass. It could certainly be improved in many different ways, 12d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// like using a worklist. This pass makes arguments dead, but does not remove 13d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// them. The existing dead argument elimination pass should be run after this 14d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// to clean up the mess. 15d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner// 16d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner//===----------------------------------------------------------------------===// 17d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner 1886453c52ba02e743d29c08456e51006500041456Chris Lattner#define DEBUG_TYPE "ipconstprop" 19d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner#include "llvm/Transforms/IPO.h" 20a990d94330141404158a2ae6ba25661be4468b25Chris Lattner#include "llvm/Constants.h" 21a990d94330141404158a2ae6ba25661be4468b25Chris Lattner#include "llvm/Instructions.h" 22d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner#include "llvm/Module.h" 23d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner#include "llvm/Pass.h" 24d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner#include "llvm/Support/CallSite.h" 259133fe28954d498fc4de13064c7d65bd811de02cReid Spencer#include "llvm/Support/Compiler.h" 26551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/Statistic.h" 277db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel#include "llvm/ADT/SmallVector.h" 281e2385b941242f2f96398dc62767420622856149Chris Lattnerusing namespace llvm; 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3086453c52ba02e743d29c08456e51006500041456Chris LattnerSTATISTIC(NumArgumentsProped, "Number of args turned into constants"); 3186453c52ba02e743d29c08456e51006500041456Chris LattnerSTATISTIC(NumReturnValProped, "Number of return values turned into constants"); 32d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner 3386453c52ba02e743d29c08456e51006500041456Chris Lattnernamespace { 34d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner /// IPCP - The interprocedural constant propagation pass 35d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner /// 369133fe28954d498fc4de13064c7d65bd811de02cReid Spencer struct VISIBILITY_HIDDEN IPCP : public ModulePass { 37ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky static char ID; // Pass identification, replacement for typeid 38794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel IPCP() : ModulePass((intptr_t)&ID) {} 39794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 40b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner bool runOnModule(Module &M); 41d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner private: 42a990d94330141404158a2ae6ba25661be4468b25Chris Lattner bool PropagateConstantsIntoArguments(Function &F); 43a990d94330141404158a2ae6ba25661be4468b25Chris Lattner bool PropagateConstantReturn(Function &F); 44d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner }; 45d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner} 46d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner 47844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar IPCP::ID = 0; 48844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic RegisterPass<IPCP> 49844731a7f1909f55935e3514c9e713a62d67662eDan GohmanX("ipconstprop", "Interprocedural constant propagation"); 50844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 51b12914bfc0f76a7a48357162d5f4c39a1343e69bChris LattnerModulePass *llvm::createIPConstantPropagationPass() { return new IPCP(); } 52d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner 53b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattnerbool IPCP::runOnModule(Module &M) { 54d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner bool Changed = false; 552e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner bool LocalChange = true; 562e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner 572e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner // FIXME: instead of using smart algorithms, we just iterate until we stop 582e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner // making changes. 592e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner while (LocalChange) { 602e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner LocalChange = false; 612e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) 625cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!I->isDeclaration()) { 63a990d94330141404158a2ae6ba25661be4468b25Chris Lattner // Delete any klingons. 64a990d94330141404158a2ae6ba25661be4468b25Chris Lattner I->removeDeadConstantUsers(); 65a990d94330141404158a2ae6ba25661be4468b25Chris Lattner if (I->hasInternalLinkage()) 66a990d94330141404158a2ae6ba25661be4468b25Chris Lattner LocalChange |= PropagateConstantsIntoArguments(*I); 67a990d94330141404158a2ae6ba25661be4468b25Chris Lattner Changed |= PropagateConstantReturn(*I); 68a990d94330141404158a2ae6ba25661be4468b25Chris Lattner } 692e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner Changed |= LocalChange; 702e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner } 71d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner return Changed; 72d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner} 73d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner 74a990d94330141404158a2ae6ba25661be4468b25Chris Lattner/// PropagateConstantsIntoArguments - Look at all uses of the specified 75a990d94330141404158a2ae6ba25661be4468b25Chris Lattner/// function. If all uses are direct call sites, and all pass a particular 76a990d94330141404158a2ae6ba25661be4468b25Chris Lattner/// constant in for an argument, propagate that constant in as the argument. 77d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner/// 78a990d94330141404158a2ae6ba25661be4468b25Chris Lattnerbool IPCP::PropagateConstantsIntoArguments(Function &F) { 797f8897f22e88271cfa114998a4d6088e7c8e8e11Chris Lattner if (F.arg_empty() || F.use_empty()) return false; // No arguments? Early exit. 80d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner 814af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // For each argument, keep track of its constant value and whether it is a 824af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // constant or not. The bool is driven to true when found to be non-constant. 834af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner SmallVector<std::pair<Constant*, bool>, 16> ArgumentConstants; 84e4d5c441e04bdc00ccf1804744af670655123b07Chris Lattner ArgumentConstants.resize(F.arg_size()); 85d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner 86d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner unsigned NumNonconstant = 0; 874af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner for (Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E; ++UI) { 884af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // Used by a non-instruction, or not the callee of a function, do not 894af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // transform. 904af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner if (UI.getOperandNo() != 0 || 914af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner (!isa<CallInst>(*UI) && !isa<InvokeInst>(*UI))) 924af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner return false; 934af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner 944af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner CallSite CS = CallSite::get(cast<Instruction>(*UI)); 954af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner 964af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // Check out all of the potentially constant arguments. Note that we don't 974af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // inspect varargs here. 984af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner CallSite::arg_iterator AI = CS.arg_begin(); 994af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner Function::arg_iterator Arg = F.arg_begin(); 1004af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner for (unsigned i = 0, e = ArgumentConstants.size(); i != e; 1014af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner ++i, ++AI, ++Arg) { 1024af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner 1034af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // If this argument is known non-constant, ignore it. 1044af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner if (ArgumentConstants[i].second) 1054af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner continue; 1064af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner 1074af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner Constant *C = dyn_cast<Constant>(*AI); 1084af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner if (C && ArgumentConstants[i].first == 0) { 1094af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner ArgumentConstants[i].first = C; // First constant seen. 1104af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner } else if (C && ArgumentConstants[i].first == C) { 1114af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // Still the constant value we think it is. 1124af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner } else if (*AI == &*Arg) { 1134af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // Ignore recursive calls passing argument down. 1144af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner } else { 1154af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // Argument became non-constant. If all arguments are non-constant now, 1164af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // give up on this function. 1174af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner if (++NumNonconstant == ArgumentConstants.size()) 1184af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner return false; 1194af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner ArgumentConstants[i].second = true; 120d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner } 121d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner } 1224af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner } 123d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner 124d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner // If we got to this point, there is a constant argument! 125d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner assert(NumNonconstant != ArgumentConstants.size()); 1262e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner bool MadeChange = false; 1274af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner Function::arg_iterator AI = F.arg_begin(); 1284af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner for (unsigned i = 0, e = ArgumentConstants.size(); i != e; ++i, ++AI) { 1294af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner // Do we have a constant argument? 1304af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner if (ArgumentConstants[i].second || AI->use_empty()) 1314af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner continue; 1324af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner 1334af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner Value *V = ArgumentConstants[i].first; 1344af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner if (V == 0) V = UndefValue::get(AI->getType()); 1354af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner AI->replaceAllUsesWith(V); 1364af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner ++NumArgumentsProped; 1374af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner MadeChange = true; 1384af6ad37898bcda9e29fe1c7abbb1b9899af3b5bChris Lattner } 1392e8dfb8221d8fbb4d007cd1ab5e63dac0accea4bChris Lattner return MadeChange; 140d358e6fed51113b216756ea08fa361bb82022df2Chris Lattner} 141d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 142a990d94330141404158a2ae6ba25661be4468b25Chris Lattner 143a990d94330141404158a2ae6ba25661be4468b25Chris Lattner// Check to see if this function returns a constant. If so, replace all callers 144a990d94330141404158a2ae6ba25661be4468b25Chris Lattner// that user the return value with the returned valued. If we can replace ALL 145a990d94330141404158a2ae6ba25661be4468b25Chris Lattner// callers, 146a990d94330141404158a2ae6ba25661be4468b25Chris Lattnerbool IPCP::PropagateConstantReturn(Function &F) { 147a990d94330141404158a2ae6ba25661be4468b25Chris Lattner if (F.getReturnType() == Type::VoidTy) 148a990d94330141404158a2ae6ba25661be4468b25Chris Lattner return false; // No return value. 149a990d94330141404158a2ae6ba25661be4468b25Chris Lattner 15018d73c206e8259de61abf54d8d0f47c0e54f42aaChris Lattner // If this function could be overridden later in the link stage, we can't 15118d73c206e8259de61abf54d8d0f47c0e54f42aaChris Lattner // propagate information about its results into callers. 15218d73c206e8259de61abf54d8d0f47c0e54f42aaChris Lattner if (F.hasLinkOnceLinkage() || F.hasWeakLinkage()) 15318d73c206e8259de61abf54d8d0f47c0e54f42aaChris Lattner return false; 15418d73c206e8259de61abf54d8d0f47c0e54f42aaChris Lattner 155a990d94330141404158a2ae6ba25661be4468b25Chris Lattner // Check to see if this function returns a constant. 1567db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel SmallVector<Value *,4> RetVals; 1577db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel const StructType *STy = dyn_cast<StructType>(F.getReturnType()); 1587db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel if (STy) 159488b678a4915eae8e878f5776549a19493edecf7Devang Patel RetVals.assign(STy->getNumElements(), 0); 1607db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel else 1617db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel RetVals.push_back(0); 1627db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel 163a990d94330141404158a2ae6ba25661be4468b25Chris Lattner for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) 16407e6e56f57e8781a8d7bc601cc9034a3741d84c2Anton Korobeynikov if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) { 165e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner assert(RetVals.size() == RI->getNumOperands() && 166e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner "Invalid ReturnInst operands!"); 167e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner for (unsigned i = 0, e = RetVals.size(); i != e; ++i) { 168e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner if (isa<UndefValue>(RI->getOperand(i))) 169e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner continue; // Ignore 170e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner Constant *C = dyn_cast<Constant>(RI->getOperand(i)); 171e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner if (C == 0) 1727db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel return false; // Does not return a constant. 173e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner 174e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner Value *RV = RetVals[i]; 175e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner if (RV == 0) 176e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner RetVals[i] = C; 177e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner else if (RV != C) 178e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner return false; // Does not return the same constant. 179a990d94330141404158a2ae6ba25661be4468b25Chris Lattner } 18007e6e56f57e8781a8d7bc601cc9034a3741d84c2Anton Korobeynikov } 181a990d94330141404158a2ae6ba25661be4468b25Chris Lattner 182488b678a4915eae8e878f5776549a19493edecf7Devang Patel if (STy) { 183488b678a4915eae8e878f5776549a19493edecf7Devang Patel for (unsigned i = 0, e = RetVals.size(); i < e; ++i) 184488b678a4915eae8e878f5776549a19493edecf7Devang Patel if (RetVals[i] == 0) 1857db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel RetVals[i] = UndefValue::get(STy->getElementType(i)); 186488b678a4915eae8e878f5776549a19493edecf7Devang Patel } else { 187e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner assert(RetVals.size() == 1); 188e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner if (RetVals[0] == 0) 189e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner RetVals[0] = UndefValue::get(F.getReturnType()); 1907db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel } 191a990d94330141404158a2ae6ba25661be4468b25Chris Lattner 192a990d94330141404158a2ae6ba25661be4468b25Chris Lattner // If we got here, the function returns a constant value. Loop over all 193a990d94330141404158a2ae6ba25661be4468b25Chris Lattner // users, replacing any uses of the return value with the returned constant. 194a990d94330141404158a2ae6ba25661be4468b25Chris Lattner bool ReplacedAllUsers = true; 195a990d94330141404158a2ae6ba25661be4468b25Chris Lattner bool MadeChange = false; 196e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner for (Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E; ++UI) { 197e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner // Make sure this is an invoke or call and that the use is for the callee. 198e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner if (!(isa<InvokeInst>(*UI) || isa<CallInst>(*UI)) || 199e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner UI.getOperandNo() != 0) { 200a990d94330141404158a2ae6ba25661be4468b25Chris Lattner ReplacedAllUsers = false; 201e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner continue; 202a990d94330141404158a2ae6ba25661be4468b25Chris Lattner } 203e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner 204e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner Instruction *Call = cast<Instruction>(*UI); 205e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner if (Call->use_empty()) 206e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner continue; 207e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner 208e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner MadeChange = true; 209a990d94330141404158a2ae6ba25661be4468b25Chris Lattner 210e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner if (STy == 0) { 211e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner Call->replaceAllUsesWith(RetVals[0]); 212e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner continue; 213e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner } 214e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner 215e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner while (!Call->use_empty()) { 216e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner GetResultInst *GR = cast<GetResultInst>(Call->use_back()); 217e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner GR->replaceAllUsesWith(RetVals[GR->getIndex()]); 218e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner GR->eraseFromParent(); 219e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner } 220e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner } 221e9625c6c88477382d7b4db6c16108ab2db2b1326Chris Lattner 222a990d94330141404158a2ae6ba25661be4468b25Chris Lattner // If we replace all users with the returned constant, and there can be no 223a990d94330141404158a2ae6ba25661be4468b25Chris Lattner // other callers of the function, replace the constant being returned in the 224a990d94330141404158a2ae6ba25661be4468b25Chris Lattner // function with an undef value. 2257db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel if (ReplacedAllUsers && F.hasInternalLinkage()) { 226488b678a4915eae8e878f5776549a19493edecf7Devang Patel for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { 227488b678a4915eae8e878f5776549a19493edecf7Devang Patel if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) { 228488b678a4915eae8e878f5776549a19493edecf7Devang Patel for (unsigned i = 0, e = RetVals.size(); i < e; ++i) { 229488b678a4915eae8e878f5776549a19493edecf7Devang Patel Value *RetVal = RetVals[i]; 230488b678a4915eae8e878f5776549a19493edecf7Devang Patel if (isa<UndefValue>(RetVal)) 231488b678a4915eae8e878f5776549a19493edecf7Devang Patel continue; 232488b678a4915eae8e878f5776549a19493edecf7Devang Patel Value *RV = UndefValue::get(RetVal->getType()); 2337db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel if (RI->getOperand(i) != RV) { 2347db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel RI->setOperand(i, RV); 2357db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel MadeChange = true; 2367db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel } 2372ffa47b6bf5e98f887a45fd3a51452d4f3b67c2dChris Lattner } 238488b678a4915eae8e878f5776549a19493edecf7Devang Patel } 2397db30ba70111bd082d854e00f0b854c8d91eed76Devang Patel } 240a990d94330141404158a2ae6ba25661be4468b25Chris Lattner } 241a990d94330141404158a2ae6ba25661be4468b25Chris Lattner 242a990d94330141404158a2ae6ba25661be4468b25Chris Lattner if (MadeChange) ++NumReturnValProped; 243a990d94330141404158a2ae6ba25661be4468b25Chris Lattner return MadeChange; 244a990d94330141404158a2ae6ba25661be4468b25Chris Lattner} 245