[PATCH] D76983: [InstCombine] Transform extractelement-trunc -> bitcast-extractelement
Daan Sprenkels via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 29 13:23:49 PDT 2020
dsprenkels updated this revision to Diff 253452.
dsprenkels added a comment.
The new preliminary tests have been submitted in https://reviews.llvm.org/D77024. I removed the test for now and will submit another update when the other diff has been committed.
I also updated the diff in line with the inline comments.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D76983/new/
https://reviews.llvm.org/D76983
Files:
llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
Index: llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -690,6 +690,7 @@
Value *Src = CI.getOperand(0);
Type *DestTy = CI.getType(), *SrcTy = Src->getType();
+ ConstantInt *Cst;
// Attempt to truncate the entire input expression tree to the destination
// type. Only do this if the dest type is a simple type, don't convert the
@@ -758,7 +759,7 @@
// more efficiently. Support vector types. Cleanup code by using m_OneUse.
// Transform trunc(lshr (zext A), Cst) to eliminate one type conversion.
- Value *A = nullptr; ConstantInt *Cst = nullptr;
+ Value *A = nullptr;
if (Src->hasOneUse() &&
match(Src, m_LShr(m_ZExt(m_Value(A)), m_ConstantInt(Cst)))) {
// We have three types to worry about here, the type of A, the source of
@@ -843,6 +844,38 @@
if (Instruction *I = foldVecTruncToExtElt(CI, *this))
return I;
+ // Whenever an element is extracted from a vector, and then truncated,
+ // canonicalize by converting it to a bitcast followed by an
+ // extractelement.
+ //
+ // Example (little endian):
+ // trunc (extractelement <4 x i64> %X, 0) to i32
+ // --->
+ // extractelement <8 x i32> (bitcast <4 x i64> %X to <8 x i32>), i32 0
+ Value *VecOp;
+ if (match(Src,
+ m_OneUse(m_ExtractElement(m_Value(VecOp), m_ConstantInt(Cst))))) {
+ Type *VecOpTy = VecOp->getType();
+ unsigned DestScalarSize = DestTy->getScalarSizeInBits();
+ unsigned VecOpScalarSize = VecOpTy->getScalarSizeInBits();
+ unsigned VecNumElts = VecOpTy->getVectorNumElements();
+
+ // A badly fit destination size would result in an invalid cast.
+ if (VecOpScalarSize % DestScalarSize == 0) {
+ unsigned TruncRatio = VecOpScalarSize / DestScalarSize;
+ unsigned BitCastNumElts = VecNumElts * TruncRatio;
+ unsigned VecOpIdx = Cst->getZExtValue();
+ unsigned NewIdx =
+ DL.isBigEndian()
+ ? (VecOpIdx + 1) * TruncRatio - 1
+ : VecOpIdx * TruncRatio;
+
+ Type *BitCastTo = VectorType::get(DestTy, BitCastNumElts);
+ Value *BitCast = Builder.CreateBitCast(VecOp, BitCastTo);
+ return ExtractElementInst::Create(BitCast, Builder.getInt32(NewIdx));
+ }
+ }
+
return nullptr;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76983.253452.patch
Type: text/x-patch
Size: 2416 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200329/150d6369/attachment-0001.bin>
More information about the llvm-commits
mailing list