diff options
author | Philip Reames <listmail@philipreames.com> | 2019-01-24 16:34:00 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2019-01-24 16:34:00 +0000 |
commit | 4d683ee7e39ea9489408fc662ef81d464384208c (patch) | |
tree | a534425517619ec4793bcec41aed98afc6120e86 /llvm/lib/Transforms | |
parent | 68686a9f7a1b89a9a71ac889b533895327eb89ee (diff) | |
download | bcm5719-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.cpp | 21 |
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; } } |