| OLD | NEW |
| 1 //===- GlobalizeConstantVectors.cpp - Globalize constant vector -----------===// | 1 //===- GlobalizeConstantVectors.cpp - Globalize constant vector -----------===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This pass replaces all constant vector operands by loads of the same | 10 // This pass replaces all constant vector operands by loads of the same |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 namespace { | 33 namespace { |
| 34 // Must be a ModulePass since it adds globals. | 34 // Must be a ModulePass since it adds globals. |
| 35 class GlobalizeConstantVectors : public ModulePass { | 35 class GlobalizeConstantVectors : public ModulePass { |
| 36 public: | 36 public: |
| 37 static char ID; // Pass identification, replacement for typeid | 37 static char ID; // Pass identification, replacement for typeid |
| 38 GlobalizeConstantVectors() : ModulePass(ID), DL(0) { | 38 GlobalizeConstantVectors() : ModulePass(ID), DL(0) { |
| 39 initializeGlobalizeConstantVectorsPass(*PassRegistry::getPassRegistry()); | 39 initializeGlobalizeConstantVectorsPass(*PassRegistry::getPassRegistry()); |
| 40 } | 40 } |
| 41 virtual void getAnalysisUsage(AnalysisUsage &AU) const { | 41 virtual void getAnalysisUsage(AnalysisUsage &AU) const { |
| 42 AU.setPreservesCFG(); | 42 AU.setPreservesCFG(); |
| 43 AU.addRequired<DataLayoutPass>(); | |
| 44 } | 43 } |
| 45 virtual bool runOnModule(Module &M); | 44 virtual bool runOnModule(Module &M); |
| 46 | 45 |
| 47 private: | 46 private: |
| 48 typedef SmallPtrSet<Constant *, 64> Constants; | 47 typedef SmallPtrSet<Constant *, 64> Constants; |
| 49 typedef std::pair<Function *, Constants> FunctionConstants; | 48 typedef std::pair<Function *, Constants> FunctionConstants; |
| 50 typedef std::vector<FunctionConstants> FunctionConstantList; | 49 typedef std::vector<FunctionConstants> FunctionConstantList; |
| 51 typedef DenseMap<Constant *, GlobalVariable *> GlobalizedConstants; | 50 typedef DenseMap<Constant *, GlobalVariable *> GlobalizedConstants; |
| 52 const DataLayout *DL; | 51 const DataLayout *DL; |
| 53 | 52 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 ++OI) | 143 ++OI) |
| 145 if (dyn_cast<Constant>(*OI) == C) | 144 if (dyn_cast<Constant>(*OI) == C) |
| 146 // The current operand is a use of the constant vector, replace it | 145 // The current operand is a use of the constant vector, replace it |
| 147 // with the materialized one. | 146 // with the materialized one. |
| 148 *OI = MaterializedGV; | 147 *OI = MaterializedGV; |
| 149 } | 148 } |
| 150 } | 149 } |
| 151 } | 150 } |
| 152 | 151 |
| 153 bool GlobalizeConstantVectors::runOnModule(Module &M) { | 152 bool GlobalizeConstantVectors::runOnModule(Module &M) { |
| 154 DL = &getAnalysis<DataLayoutPass>().getDataLayout(); | 153 DL = &M.getDataLayout(); |
| 155 | 154 |
| 156 FunctionConstantList FCs; | 155 FunctionConstantList FCs; |
| 157 FCs.reserve(M.size()); | 156 FCs.reserve(M.size()); |
| 158 for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI) { | 157 for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI) { |
| 159 Constants Cs; | 158 Constants Cs; |
| 160 findConstantVectors(*FI, Cs); | 159 findConstantVectors(*FI, Cs); |
| 161 if (!Cs.empty()) | 160 if (!Cs.empty()) |
| 162 FCs.push_back(std::make_pair(&*FI, Cs)); | 161 FCs.push_back(std::make_pair(&*FI, Cs)); |
| 163 } | 162 } |
| 164 | 163 |
| 165 GlobalizedConstants GCs; | 164 GlobalizedConstants GCs; |
| 166 createGlobalConstantVectors(M, FCs, GCs); | 165 createGlobalConstantVectors(M, FCs, GCs); |
| 167 | 166 |
| 168 for (FunctionConstantList::const_iterator FCI = FCs.begin(), FCE = FCs.end(); | 167 for (FunctionConstantList::const_iterator FCI = FCs.begin(), FCE = FCs.end(); |
| 169 FCI != FCE; ++FCI) | 168 FCI != FCE; ++FCI) |
| 170 materializeConstantVectors(*FCI->first, FCI->second, GCs); | 169 materializeConstantVectors(*FCI->first, FCI->second, GCs); |
| 171 | 170 |
| 172 return FCs.empty(); | 171 return FCs.empty(); |
| 173 } | 172 } |
| 174 | 173 |
| 175 ModulePass *llvm::createGlobalizeConstantVectorsPass() { | 174 ModulePass *llvm::createGlobalizeConstantVectorsPass() { |
| 176 return new GlobalizeConstantVectors(); | 175 return new GlobalizeConstantVectors(); |
| 177 } | 176 } |
| OLD | NEW |