summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorPhilip Reames <listmail@philipreames.com>2019-01-24 16:34:00 +0000
committerPhilip Reames <listmail@philipreames.com>2019-01-24 16:34:00 +0000
commit4d683ee7e39ea9489408fc662ef81d464384208c (patch)
treea534425517619ec4793bcec41aed98afc6120e86 /llvm/lib/Transforms
parent68686a9f7a1b89a9a71ac889b533895327eb89ee (diff)
downloadbcm5719-llvm-4d683ee7e39ea9489408fc662ef81d464384208c.tar.gz
bcm5719-llvm-4d683ee7e39ea9489408fc662ef81d464384208c.zip
[RS4GC] Be slightly less conservative for gep vector_base, scalar_idx
After submitting https://reviews.llvm.org/D57138, I realized it was slightly more conservative than needed. The scalar indices don't appear to be a problem on a vector gep, we even had a test for that. Differential Revision: https://reviews.llvm.org/D57161 llvm-svn: 352061
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp21
1 files changed, 10 insertions, 11 deletions
diff --git a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
index e722456b1e6..b1e76ea62f8 100644
--- a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
+++ b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp
@@ -2611,21 +2611,20 @@ bool RewriteStatepointsForGC::runOnFunction(Function &F, DominatorTree &DT,
continue;
unsigned VF = 0;
- bool HasScalarOperand = false;
for (unsigned i = 0; i < I.getNumOperands(); i++)
- if (I.getOperand(i)->getType()->isVectorTy())
+ if (I.getOperand(i)->getType()->isVectorTy()) {
+ assert(VF == 0 ||
+ VF == I.getOperand(i)->getType()->getVectorNumElements());
VF = I.getOperand(i)->getType()->getVectorNumElements();
- else
- HasScalarOperand = true;
+ }
- if (HasScalarOperand && VF != 0) {
+ // It's the vector to scalar traversal through the pointer operand which
+ // confuses base pointer rewriting, so limit ourselves to that case.
+ if (!I.getOperand(0)->getType()->isVectorTy() && VF != 0) {
IRBuilder<> B(&I);
- for (unsigned i = 0; i < I.getNumOperands(); i++)
- if (!I.getOperand(i)->getType()->isVectorTy()) {
- auto *Splat = B.CreateVectorSplat(VF, I.getOperand(i));
- I.setOperand(i, Splat);
- MadeChange = true;
- }
+ auto *Splat = B.CreateVectorSplat(VF, I.getOperand(0));
+ I.setOperand(0, Splat);
+ MadeChange = true;
}
}
OpenPOWER on IntegriCloud