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