diff options
author | Sanjay Patel <spatel@rotateright.com> | 2019-05-17 18:06:12 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2019-05-17 18:06:12 +0000 |
commit | 926e47751b1abb60b275bf8f7b3dde3d0b3b8e77 (patch) | |
tree | 99acf51cfaf836e59a05a2b8ef26cb428a341301 /llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp | |
parent | 19dc8c728046d023ccdcff3c0e8e79eab6fbfd79 (diff) | |
download | bcm5719-llvm-926e47751b1abb60b275bf8f7b3dde3d0b3b8e77.tar.gz bcm5719-llvm-926e47751b1abb60b275bf8f7b3dde3d0b3b8e77.zip |
[InstCombine] move bitcast after insertelement-with-bitcasted-operands
llvm-svn: 361058
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index 28d5f187c3d..e76f41b4794 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -867,6 +867,20 @@ Instruction *InstCombiner::visitInsertElementInst(InsertElementInst &IE) { if (isa<UndefValue>(ScalarOp) || isa<UndefValue>(IdxOp)) replaceInstUsesWith(IE, VecOp); + // If the vector and scalar are both bitcast from the same element type, do + // the insert in that source type followed by bitcast. + Value *VecSrc, *ScalarSrc; + if (match(VecOp, m_BitCast(m_Value(VecSrc))) && + match(ScalarOp, m_BitCast(m_Value(ScalarSrc))) && + (VecOp->hasOneUse() || ScalarOp->hasOneUse()) && + VecSrc->getType()->isVectorTy() && !ScalarSrc->getType()->isVectorTy() && + VecSrc->getType()->getVectorElementType() == ScalarSrc->getType()) { + // inselt (bitcast VecSrc), (bitcast ScalarSrc), IdxOp --> + // bitcast (inselt VecSrc, ScalarSrc, IdxOp) + Value *NewInsElt = Builder.CreateInsertElement(VecSrc, ScalarSrc, IdxOp); + return new BitCastInst(NewInsElt, IE.getType()); + } + // If the inserted element was extracted from some other vector and both // indexes are constant, try to turn this into a shuffle. uint64_t InsertedIdx, ExtractedIdx; |