summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2016-07-01 01:55:52 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2016-07-01 01:55:52 +0000
commit42ad17059acc677b5d759cb02bd008e73ffacd4b (patch)
tree1f713eebd851bd518504e10281b67aee959a41d5 /llvm/lib
parent9d1f156418f0629115596c4a461a38b4d2cfa5d3 (diff)
downloadbcm5719-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.cpp20
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);
OpenPOWER on IntegriCloud