1156bcf3f65c9d36dabc1b86e341d5ee08c24a33eChris Lattner//===- ConstantMerge.cpp - Merge duplicate global constants ---------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner// 10475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner// This file defines the interface to a pass that merges duplicate global 11475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner// constants together into a single constant that is shared. This is useful 12475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner// because some passes (ie TraceValues) insert a lot of string constants into 13e4314ed3154f168cc9324e2e213c2733c2b71761Chris Lattner// the program, regardless of whether or not an existing string is available. 14475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner// 15475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner// Algorithm: ConstantMerge is designed to build up a map of available constants 16e4314ed3154f168cc9324e2e213c2733c2b71761Chris Lattner// and eliminate duplicates when it is initialized. 17475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner// 18475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner//===----------------------------------------------------------------------===// 19475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner 2086453c52ba02e743d29c08456e51006500041456Chris Lattner#define DEBUG_TYPE "constmerge" 219cfea85b8b41458c8d0e84c52fad6f2244d3ae33Chris Lattner#include "llvm/Transforms/IPO.h" 22c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner#include "llvm/ADT/DenseMap.h" 23e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky#include "llvm/ADT/PointerIntPair.h" 2449ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner#include "llvm/ADT/SmallPtrSet.h" 25551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/Statistic.h" 260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 30eaf14786ca3975266ed7041ac242122c02baf1cfRafael Espindola#include "llvm/IR/Operator.h" 31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Pass.h" 321e2385b941242f2f96398dc62767420622856149Chris Lattnerusing namespace llvm; 33d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3486453c52ba02e743d29c08456e51006500041456Chris LattnerSTATISTIC(NumMerged, "Number of global constants merged"); 35c67ebfa78810f518c54381ed38c09d3a0afd77e4Chris Lattner 3686453c52ba02e743d29c08456e51006500041456Chris Lattnernamespace { 376726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky struct ConstantMerge : public ModulePass { 38ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky static char ID; // Pass identification, replacement for typeid 39081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson ConstantMerge() : ModulePass(ID) { 40081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeConstantMergePass(*PassRegistry::getPassRegistry()); 41081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson } 42794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 43e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky // For this pass, process all of the globals in the module, eliminating 44e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky // duplicate constants. 45b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner bool runOnModule(Module &M); 46e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky 4794c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru // Return true iff we can determine the alignment of this global variable. 48e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky bool hasKnownAlignment(GlobalVariable *GV) const; 49e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky 50e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky // Return the alignment of the global, including converting the default 51e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky // alignment to a concrete value. 52e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky unsigned getAlignment(GlobalVariable *GV) const; 53e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky 543574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow const DataLayout *TD; 559234d03373b7e0e590836f8fe1a5cd560d2620eaChris Lattner }; 569234d03373b7e0e590836f8fe1a5cd560d2620eaChris Lattner} 579234d03373b7e0e590836f8fe1a5cd560d2620eaChris Lattner 58844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar ConstantMerge::ID = 0; 59d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(ConstantMerge, "constmerge", 60ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Merge Duplicate Global Constants", false, false) 61844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 62b12914bfc0f76a7a48357162d5f4c39a1343e69bChris LattnerModulePass *llvm::createConstantMergePass() { return new ConstantMerge(); } 639234d03373b7e0e590836f8fe1a5cd560d2620eaChris Lattner 6449ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner 6549ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner 6649ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner/// Find values that are marked as llvm.used. 6749ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattnerstatic void FindUsedValues(GlobalVariable *LLVMUsed, 6849ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner SmallPtrSet<const GlobalValue*, 8> &UsedValues) { 6949ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner if (LLVMUsed == 0) return; 70cde25b435a907e7741da0c0d18953850936277c4Rafael Espindola ConstantArray *Inits = cast<ConstantArray>(LLVMUsed->getInitializer()); 71cde25b435a907e7741da0c0d18953850936277c4Rafael Espindola 72eaf14786ca3975266ed7041ac242122c02baf1cfRafael Espindola for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i) { 73eaf14786ca3975266ed7041ac242122c02baf1cfRafael Espindola Value *Operand = Inits->getOperand(i)->stripPointerCastsNoFollowAliases(); 74eaf14786ca3975266ed7041ac242122c02baf1cfRafael Espindola GlobalValue *GV = cast<GlobalValue>(Operand); 75eaf14786ca3975266ed7041ac242122c02baf1cfRafael Espindola UsedValues.insert(GV); 76eaf14786ca3975266ed7041ac242122c02baf1cfRafael Espindola } 7749ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner} 7849ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner 79d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola// True if A is better than B. 80d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindolastatic bool IsBetterCannonical(const GlobalVariable &A, 81d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola const GlobalVariable &B) { 82d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola if (!A.hasLocalLinkage() && B.hasLocalLinkage()) 83d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola return true; 84d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 85d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola if (A.hasLocalLinkage() && !B.hasLocalLinkage()) 86d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola return false; 87d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 88d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola return A.hasUnnamedAddr(); 89d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola} 90d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 91e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewyckybool ConstantMerge::hasKnownAlignment(GlobalVariable *GV) const { 92e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky return TD || GV->getAlignment() != 0; 93e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky} 94e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky 95e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewyckyunsigned ConstantMerge::getAlignment(GlobalVariable *GV) const { 96e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky if (TD) 97e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky return TD->getPreferredAlignment(GV); 98e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky return GV->getAlignment(); 99e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky} 100e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky 101b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattnerbool ConstantMerge::runOnModule(Module &M) { 1023574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow TD = getAnalysisIfAvailable<DataLayout>(); 103e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky 10449ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner // Find all the globals that are marked "used". These cannot be merged. 10549ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner SmallPtrSet<const GlobalValue*, 8> UsedGlobals; 10649ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner FindUsedValues(M.getGlobalVariable("llvm.used"), UsedGlobals); 10749ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner FindUsedValues(M.getGlobalVariable("llvm.compiler.used"), UsedGlobals); 10849ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner 109e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky // Map unique <constants, has-unknown-alignment> pairs to globals. We don't 110e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky // want to merge globals of unknown alignment with those of explicit 1113574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow // alignment. If we have DataLayout, we always know the alignment. 112e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky DenseMap<PointerIntPair<Constant*, 1, bool>, GlobalVariable*> CMap; 113b97238079d871c13e0690336329ae01cdd7c54efChris Lattner 114b97238079d871c13e0690336329ae01cdd7c54efChris Lattner // Replacements - This vector contains a list of replacements to perform. 115c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner SmallVector<std::pair<GlobalVariable*, GlobalVariable*>, 32> Replacements; 116b97238079d871c13e0690336329ae01cdd7c54efChris Lattner 1170898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner bool MadeChange = false; 118475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner 1190898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner // Iterate constant merging while we are still making progress. Merging two 1200898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner // constants together may allow us to merge other constants together if the 1210898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner // second level constants have initializers which point to the globals that 1220898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner // were just merged. 1230898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner while (1) { 124d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 125d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola // First: Find the canonical constants others will be merged with. 126ae143ceb83e4247a59315304163d886faf7331b0Chris Lattner for (Module::global_iterator GVI = M.global_begin(), E = M.global_end(); 127ae143ceb83e4247a59315304163d886faf7331b0Chris Lattner GVI != E; ) { 128ae143ceb83e4247a59315304163d886faf7331b0Chris Lattner GlobalVariable *GV = GVI++; 129d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 1308264a9fccae4d0b8942360f57d9167519d09f220Chris Lattner // If this GV is dead, remove it. 1318264a9fccae4d0b8942360f57d9167519d09f220Chris Lattner GV->removeDeadConstantUsers(); 132bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola if (GV->use_empty() && GV->hasLocalLinkage()) { 13398a72203d75c7f2c94169155626f51f10eaca530Jeff Cohen GV->eraseFromParent(); 13498a72203d75c7f2c94169155626f51f10eaca530Jeff Cohen continue; 1358264a9fccae4d0b8942360f57d9167519d09f220Chris Lattner } 136d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 1372820c25e847c76f241388446f6f3dd86e067403bNick Lewycky // Only process constants with initializers in the default address space. 138cd7f0a1a7f216418856812f6417faf4fe5e72046Nick Lewycky if (!GV->isConstant() || !GV->hasDefinitiveInitializer() || 1392820c25e847c76f241388446f6f3dd86e067403bNick Lewycky GV->getType()->getAddressSpace() != 0 || GV->hasSection() || 14049ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner // Don't touch values marked with attribute(used). 14149ddd3a1a4b75f1181e0bd3faae4b50950e6ff53Chris Lattner UsedGlobals.count(GV)) 142c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner continue; 143d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 144e15f421a9acd18ca71fed382ac09f7367b6a72f6Eli Friedman // This transformation is legal for weak ODR globals in the sense it 145e15f421a9acd18ca71fed382ac09f7367b6a72f6Eli Friedman // doesn't change semantics, but we really don't want to perform it 146e15f421a9acd18ca71fed382ac09f7367b6a72f6Eli Friedman // anyway; it's likely to pessimize code generation, and some tools 147e15f421a9acd18ca71fed382ac09f7367b6a72f6Eli Friedman // (like the Darwin linker in cases involving CFString) don't expect it. 148e15f421a9acd18ca71fed382ac09f7367b6a72f6Eli Friedman if (GV->isWeakForLinker()) 14937b94c6b4e605c522164bcafc58ea1e1afb50cc0Bill Wendling continue; 15037b94c6b4e605c522164bcafc58ea1e1afb50cc0Bill Wendling 151c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner Constant *Init = GV->getInitializer(); 152c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner 153c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner // Check to see if the initializer is already known. 154e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky PointerIntPair<Constant*, 1, bool> Pair(Init, hasKnownAlignment(GV)); 155e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky GlobalVariable *&Slot = CMap[Pair]; 156c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner 15737b94c6b4e605c522164bcafc58ea1e1afb50cc0Bill Wendling // If this is the first constant we find or if the old one is local, 15837b94c6b4e605c522164bcafc58ea1e1afb50cc0Bill Wendling // replace with the current one. If the current is externally visible 159d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola // it cannot be replace, but can be the canonical constant we merge with. 16037b94c6b4e605c522164bcafc58ea1e1afb50cc0Bill Wendling if (Slot == 0 || IsBetterCannonical(*GV, *Slot)) 161c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner Slot = GV; 1622820c25e847c76f241388446f6f3dd86e067403bNick Lewycky } 1632820c25e847c76f241388446f6f3dd86e067403bNick Lewycky 164d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola // Second: identify all globals that can be merged together, filling in 165d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola // the Replacements vector. We cannot do the replacement in this pass 166d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola // because doing so may cause initializers of other globals to be rewritten, 167d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola // invalidating the Constant* pointers in CMap. 1682820c25e847c76f241388446f6f3dd86e067403bNick Lewycky for (Module::global_iterator GVI = M.global_begin(), E = M.global_end(); 1692820c25e847c76f241388446f6f3dd86e067403bNick Lewycky GVI != E; ) { 1702820c25e847c76f241388446f6f3dd86e067403bNick Lewycky GlobalVariable *GV = GVI++; 1712820c25e847c76f241388446f6f3dd86e067403bNick Lewycky 1722820c25e847c76f241388446f6f3dd86e067403bNick Lewycky // Only process constants with initializers in the default address space. 173cd7f0a1a7f216418856812f6417faf4fe5e72046Nick Lewycky if (!GV->isConstant() || !GV->hasDefinitiveInitializer() || 1742820c25e847c76f241388446f6f3dd86e067403bNick Lewycky GV->getType()->getAddressSpace() != 0 || GV->hasSection() || 1752820c25e847c76f241388446f6f3dd86e067403bNick Lewycky // Don't touch values marked with attribute(used). 1762820c25e847c76f241388446f6f3dd86e067403bNick Lewycky UsedGlobals.count(GV)) 1772820c25e847c76f241388446f6f3dd86e067403bNick Lewycky continue; 1782820c25e847c76f241388446f6f3dd86e067403bNick Lewycky 179e15f421a9acd18ca71fed382ac09f7367b6a72f6Eli Friedman // We can only replace constant with local linkage. 180e15f421a9acd18ca71fed382ac09f7367b6a72f6Eli Friedman if (!GV->hasLocalLinkage()) 1812820c25e847c76f241388446f6f3dd86e067403bNick Lewycky continue; 1822820c25e847c76f241388446f6f3dd86e067403bNick Lewycky 1832820c25e847c76f241388446f6f3dd86e067403bNick Lewycky Constant *Init = GV->getInitializer(); 1842820c25e847c76f241388446f6f3dd86e067403bNick Lewycky 1852820c25e847c76f241388446f6f3dd86e067403bNick Lewycky // Check to see if the initializer is already known. 186e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky PointerIntPair<Constant*, 1, bool> Pair(Init, hasKnownAlignment(GV)); 187e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky GlobalVariable *Slot = CMap[Pair]; 1882820c25e847c76f241388446f6f3dd86e067403bNick Lewycky 189d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola if (!Slot || Slot == GV) 190d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola continue; 191d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 192d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola if (!Slot->hasUnnamedAddr() && !GV->hasUnnamedAddr()) 193d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola continue; 194d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 195d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola if (!GV->hasUnnamedAddr()) 196d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola Slot->setUnnamedAddr(false); 197d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola 198d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola // Make all uses of the duplicate constant use the canonical version. 199d6e5cbc84226ad4a62e8847f1babecf86089d415Rafael Espindola Replacements.push_back(std::make_pair(GV, Slot)); 2008264a9fccae4d0b8942360f57d9167519d09f220Chris Lattner } 201fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 2020898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner if (Replacements.empty()) 2030898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner return MadeChange; 2040898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner CMap.clear(); 205fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 2060898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner // Now that we have figured out which replacements must be made, do them all 2070898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner // now. This avoid invalidating the pointers in CMap, which are unneeded 2080898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner // now. 2090898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner for (unsigned i = 0, e = Replacements.size(); i != e; ++i) { 210e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky // Bump the alignment if necessary. 211e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky if (Replacements[i].first->getAlignment() || 212e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky Replacements[i].second->getAlignment()) { 213e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky Replacements[i].second->setAlignment(std::max( 214e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky Replacements[i].first->getAlignment(), 215e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky Replacements[i].second->getAlignment())); 216e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky } 217e511186183d49fb9c4ebefe746ca65e5d9275ff4Nick Lewycky 218c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner // Eliminate any uses of the dead global. 2190898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner Replacements[i].first->replaceAllUsesWith(Replacements[i].second); 220fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 221c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner // Delete the global value from the module. 2222820c25e847c76f241388446f6f3dd86e067403bNick Lewycky assert(Replacements[i].first->hasLocalLinkage() && 2232820c25e847c76f241388446f6f3dd86e067403bNick Lewycky "Refusing to delete an externally visible global variable."); 224c3b6ffc431bbf01f615c6695a0dc1b9368102cadChris Lattner Replacements[i].first->eraseFromParent(); 225475becb7bc835680c0b6973e8b7be0918f55cffdChris Lattner } 226fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 2270898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner NumMerged += Replacements.size(); 2280898c78a52e04f94de5576d380d73517a9ea1b05Chris Lattner Replacements.clear(); 229b97238079d871c13e0690336329ae01cdd7c54efChris Lattner } 230b97238079d871c13e0690336329ae01cdd7c54efChris Lattner} 231