Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- FixVectorLoadStoreAlignment.cpp - Vector load/store alignment ------===// | 1 //===- FixVectorLoadStoreAlignment.cpp - Vector load/store alignment ------===// |
| 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 // Fix vector load/store alignment by: | 10 // Fix vector load/store alignment by: |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 //===----------------------------------------------------------------------===// | 23 //===----------------------------------------------------------------------===// |
| 24 | 24 |
| 25 #include "llvm/IR/DataLayout.h" | 25 #include "llvm/IR/DataLayout.h" |
| 26 #include "llvm/IR/IRBuilder.h" | 26 #include "llvm/IR/IRBuilder.h" |
| 27 #include "llvm/IR/Instruction.h" | 27 #include "llvm/IR/Instruction.h" |
| 28 #include "llvm/IR/Instructions.h" | 28 #include "llvm/IR/Instructions.h" |
| 29 #include "llvm/IR/Module.h" | 29 #include "llvm/IR/Module.h" |
| 30 #include "llvm/Pass.h" | 30 #include "llvm/Pass.h" |
| 31 #include "llvm/Support/Debug.h" | 31 #include "llvm/Support/Debug.h" |
| 32 #include "llvm/Support/MathExtras.h" | 32 #include "llvm/Support/MathExtras.h" |
| 33 #include "llvm/Support/raw_ostream.h" | |
| 33 #include "llvm/Transforms/NaCl.h" | 34 #include "llvm/Transforms/NaCl.h" |
| 34 | 35 |
| 35 using namespace llvm; | 36 using namespace llvm; |
| 36 | 37 |
| 37 namespace { | 38 namespace { |
| 38 class FixVectorLoadStoreAlignment : public BasicBlockPass { | 39 class FixVectorLoadStoreAlignment : public BasicBlockPass { |
| 39 public: | 40 public: |
| 40 static char ID; // Pass identification, replacement for typeid | 41 static char ID; // Pass identification, replacement for typeid |
| 41 FixVectorLoadStoreAlignment() : BasicBlockPass(ID), M(0), DL(0) { | 42 FixVectorLoadStoreAlignment() : BasicBlockPass(ID), M(0), DL(0) { |
| 42 initializeFixVectorLoadStoreAlignmentPass(*PassRegistry::getPassRegistry()); | 43 initializeFixVectorLoadStoreAlignmentPass(*PassRegistry::getPassRegistry()); |
| 43 } | 44 } |
| 44 void getAnalysisUsage(AnalysisUsage &AU) const override { | |
| 45 AU.addRequired<DataLayoutPass>(); | |
| 46 BasicBlockPass::getAnalysisUsage(AU); | |
| 47 } | |
| 48 using BasicBlockPass::doInitialization; | 45 using BasicBlockPass::doInitialization; |
| 49 bool doInitialization(Module &Mod) override { | 46 bool doInitialization(Module &Mod) override { |
| 50 M = &Mod; | 47 M = &Mod; |
| 51 return false; // Unchanged. | 48 return false; // Unchanged. |
| 52 } | 49 } |
| 53 bool runOnBasicBlock(BasicBlock &BB) override; | 50 bool runOnBasicBlock(BasicBlock &BB) override; |
| 54 | 51 |
| 55 private: | 52 private: |
| 56 typedef SmallVector<Instruction *, 8> Instructions; | 53 typedef SmallVector<Instruction *, 8> Instructions; |
| 57 const Module *M; | 54 const Module *M; |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 196 | 193 |
| 197 // Fill in the vector element by element. | 194 // Fill in the vector element by element. |
| 198 IRBuilder<> IRB(VecLoad); | 195 IRBuilder<> IRB(VecLoad); |
| 199 Value *Loaded = UndefValue::get(LoadedVecTy); | 196 Value *Loaded = UndefValue::get(LoadedVecTy); |
| 200 Value *Base = | 197 Value *Base = |
| 201 IRB.CreateBitCast(VecLoad->getPointerOperand(), ElemTy->getPointerTo()); | 198 IRB.CreateBitCast(VecLoad->getPointerOperand(), ElemTy->getPointerTo()); |
| 202 | 199 |
| 203 for (unsigned Elem = 0, NumElems = LoadedVecTy->getNumElements(); | 200 for (unsigned Elem = 0, NumElems = LoadedVecTy->getNumElements(); |
| 204 Elem != NumElems; ++Elem) { | 201 Elem != NumElems; ++Elem) { |
| 205 unsigned Align = MinAlign(BaseAlign, ElemAllocSize * Elem); | 202 unsigned Align = MinAlign(BaseAlign, ElemAllocSize * Elem); |
| 206 Value *GEP = IRB.CreateConstInBoundsGEP1_32(Base, Elem); | 203 Value *GEP = IRB.CreateConstInBoundsGEP1_32(ElemTy, Base, Elem); |
| 207 LoadInst *LoadedElem = | 204 LoadInst *LoadedElem = |
| 208 IRB.CreateAlignedLoad(GEP, Align, VecLoad->isVolatile()); | 205 IRB.CreateAlignedLoad(GEP, Align, VecLoad->isVolatile()); |
| 209 LoadedElem->setSynchScope(VecLoad->getSynchScope()); | 206 LoadedElem->setSynchScope(VecLoad->getSynchScope()); |
| 210 Loaded = IRB.CreateInsertElement( | 207 Loaded = IRB.CreateInsertElement( |
| 211 Loaded, LoadedElem, | 208 Loaded, LoadedElem, |
| 212 ConstantInt::get(Type::getInt32Ty(M->getContext()), Elem)); | 209 ConstantInt::get(Type::getInt32Ty(M->getContext()), Elem)); |
| 213 } | 210 } |
| 214 | 211 |
| 215 VecLoad->replaceAllUsesWith(Loaded); | 212 VecLoad->replaceAllUsesWith(Loaded); |
| 216 VecLoad->eraseFromParent(); | 213 VecLoad->eraseFromParent(); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 229 unsigned ElemAllocSize = DL->getTypeAllocSize(ElemTy); | 226 unsigned ElemAllocSize = DL->getTypeAllocSize(ElemTy); |
| 230 | 227 |
| 231 // Fill in the vector element by element. | 228 // Fill in the vector element by element. |
| 232 IRBuilder<> IRB(VecStore); | 229 IRBuilder<> IRB(VecStore); |
| 233 Value *Base = IRB.CreateBitCast(VecStore->getPointerOperand(), | 230 Value *Base = IRB.CreateBitCast(VecStore->getPointerOperand(), |
| 234 ElemTy->getPointerTo()); | 231 ElemTy->getPointerTo()); |
| 235 | 232 |
| 236 for (unsigned Elem = 0, NumElems = StoredVecTy->getNumElements(); | 233 for (unsigned Elem = 0, NumElems = StoredVecTy->getNumElements(); |
| 237 Elem != NumElems; ++Elem) { | 234 Elem != NumElems; ++Elem) { |
| 238 unsigned Align = MinAlign(BaseAlign, ElemAllocSize * Elem); | 235 unsigned Align = MinAlign(BaseAlign, ElemAllocSize * Elem); |
| 239 Value *GEP = IRB.CreateConstInBoundsGEP1_32(Base, Elem); | 236 Value *GEP = IRB.CreateConstInBoundsGEP1_32(ElemTy, Base, Elem); |
| 240 Value *ElemToStore = IRB.CreateExtractElement( | 237 Value *ElemToStore = IRB.CreateExtractElement( |
| 241 StoredVec, ConstantInt::get(Type::getInt32Ty(M->getContext()), Elem)); | 238 StoredVec, ConstantInt::get(Type::getInt32Ty(M->getContext()), Elem)); |
| 242 StoreInst *StoredElem = IRB.CreateAlignedStore(ElemToStore, GEP, Align, | 239 StoreInst *StoredElem = IRB.CreateAlignedStore(ElemToStore, GEP, Align, |
| 243 VecStore->isVolatile()); | 240 VecStore->isVolatile()); |
| 244 StoredElem->setSynchScope(VecStore->getSynchScope()); | 241 StoredElem->setSynchScope(VecStore->getSynchScope()); |
| 245 } | 242 } |
| 246 | 243 |
| 247 VecStore->eraseFromParent(); | 244 VecStore->eraseFromParent(); |
| 248 } | 245 } |
| 249 } | 246 } |
| 250 | 247 |
| 251 bool FixVectorLoadStoreAlignment::runOnBasicBlock(BasicBlock &BB) { | 248 bool FixVectorLoadStoreAlignment::runOnBasicBlock(BasicBlock &BB) { |
| 252 bool Changed = false; | 249 bool Changed = false; |
| 253 if (!DL) | 250 if (!DL) |
| 254 DL = &getAnalysis<DataLayoutPass>().getDataLayout(); | 251 DL = &BB.getParent()->getParent()->getDataLayout(); |
|
jvoung (off chromium)
2015/05/26 20:39:45
could be getModule()
Derek Schuff
2015/05/26 22:01:32
Done.
| |
| 255 Instructions Loads; | 252 Instructions Loads; |
| 256 Instructions Stores; | 253 Instructions Stores; |
| 257 visitVectorLoadStore(BB, Loads, Stores); | 254 visitVectorLoadStore(BB, Loads, Stores); |
| 258 if (!(Loads.empty() && Stores.empty())) { | 255 if (!(Loads.empty() && Stores.empty())) { |
| 259 Changed = true; | 256 Changed = true; |
| 260 scalarizeVectorLoadStore(BB, Loads, Stores); | 257 scalarizeVectorLoadStore(BB, Loads, Stores); |
| 261 } | 258 } |
| 262 return Changed; | 259 return Changed; |
| 263 } | 260 } |
| 264 | 261 |
| 265 BasicBlockPass *llvm::createFixVectorLoadStoreAlignmentPass() { | 262 BasicBlockPass *llvm::createFixVectorLoadStoreAlignmentPass() { |
| 266 return new FixVectorLoadStoreAlignment(); | 263 return new FixVectorLoadStoreAlignment(); |
| 267 } | 264 } |
| OLD | NEW |