diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-07-01 01:55:52 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-07-01 01:55:52 +0000 |
| commit | 42ad17059acc677b5d759cb02bd008e73ffacd4b (patch) | |
| tree | 1f713eebd851bd518504e10281b67aee959a41d5 /llvm/lib | |
| parent | 9d1f156418f0629115596c4a461a38b4d2cfa5d3 (diff) | |
| download | bcm5719-llvm-42ad17059acc677b5d759cb02bd008e73ffacd4b.tar.gz bcm5719-llvm-42ad17059acc677b5d759cb02bd008e73ffacd4b.zip | |
LoadStoreVectorizer: Fix assert when merging pointer ops
This needs to use inttoptr/ptrtoint if combining an int and pointer
load. If a pointer is used always do an integer load.
llvm-svn: 274321
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp index 3631c104983..37679fdf62d 100644 --- a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp @@ -583,6 +583,12 @@ bool Vectorizer::vectorizeStoreChain(ArrayRef<Value *> Chain) { StoreTy = cast<StoreInst>(V)->getValueOperand()->getType(); if (StoreTy->isIntOrIntVectorTy()) break; + + if (StoreTy->isPtrOrPtrVectorTy()) { + StoreTy = Type::getIntNTy(F.getParent()->getContext(), + DL.getTypeSizeInBits(StoreTy)); + break; + } } unsigned Sz = DL.getTypeSizeInBits(StoreTy); @@ -683,7 +689,7 @@ bool Vectorizer::vectorizeStoreChain(ArrayRef<Value *> Chain) { StoreInst *Store = cast<StoreInst>(Chain[I]); Value *Extract = Store->getValueOperand(); if (Extract->getType() != StoreTy->getScalarType()) - Extract = Builder.CreateBitCast(Extract, StoreTy->getScalarType()); + Extract = Builder.CreateBitOrPointerCast(Extract, StoreTy->getScalarType()); Value *Insert = Builder.CreateInsertElement(Vec, Extract, Builder.getInt32(I)); @@ -712,6 +718,13 @@ bool Vectorizer::vectorizeLoadChain(ArrayRef<Value *> Chain) { LoadTy = cast<LoadInst>(V)->getType(); if (LoadTy->isIntOrIntVectorTy()) break; + + if (LoadTy->isPtrOrPtrVectorTy()) { + LoadTy = Type::getIntNTy(F.getParent()->getContext(), + DL.getTypeSizeInBits(LoadTy)); + break; + } + } unsigned Sz = DL.getTypeSizeInBits(LoadTy); @@ -828,9 +841,10 @@ bool Vectorizer::vectorizeLoadChain(ArrayRef<Value *> Chain) { Value *V = Builder.CreateExtractElement(LI, Builder.getInt32(I)); Instruction *Extracted = cast<Instruction>(V); Instruction *UI = cast<Instruction>(Chain[I]); - if (Extracted->getType() != UI->getType()) + if (Extracted->getType() != UI->getType()) { Extracted = - cast<Instruction>(Builder.CreateBitCast(Extracted, UI->getType())); + cast<Instruction>(Builder.CreateBitOrPointerCast(Extracted, UI->getType())); + } // Replace the old instruction. UI->replaceAllUsesWith(Extracted); |

