diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2020-09-29 16:54:13 +0100 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2020-09-29 17:15:16 +0100 |
commit | b610d73b3fe67fe6b693740dfac5fd21a60b1e44 (patch) | |
tree | 23fa0b90bd8b947baeb9465e009b9134f6ab7fed | |
parent | ccbb9827db4c30c93b92a204aeb2b98f9f3a723a (diff) | |
download | llvm-b610d73b3fe67fe6b693740dfac5fd21a60b1e44.zip llvm-b610d73b3fe67fe6b693740dfac5fd21a60b1e44.tar.gz llvm-b610d73b3fe67fe6b693740dfac5fd21a60b1e44.tar.bz2 |
[InstCombine] visitTrunc - remove dead trunc(lshr (zext A), C) combine. NFCI.
I added additional test coverage at rG7a55989dc4305 - but all are handled independently of this combine and http://lab.llvm.org:8080/coverage/coverage-reports/ indicates the code is never used.
Differential revision: https://reviews.llvm.org/D88492
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 27 |
1 files changed, 1 insertions, 26 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index fb88579..1da6d0c 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -801,32 +801,7 @@ Instruction *InstCombinerImpl::visitTrunc(TruncInst &Trunc) { } } - // FIXME: Maybe combine the next two transforms to handle the no cast case - // 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; - 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 - // the truncate (MidSize), and the destination of the truncate. We know that - // ASize < MidSize and MidSize > ResultSize, but don't know the relation - // between ASize and ResultSize. - unsigned ASize = A->getType()->getPrimitiveSizeInBits(); - - // If the shift amount is larger than the size of A, then the result is - // known to be zero because all the input bits got shifted out. - if (Cst->getZExtValue() >= ASize) - return replaceInstUsesWith(Trunc, Constant::getNullValue(DestTy)); - - // Since we're doing an lshr and a zero extend, and know that the shift - // amount is smaller than ASize, it is always safe to do the shift in A's - // type, then zero extend or truncate to the result. - Value *Shift = Builder.CreateLShr(A, Cst->getZExtValue()); - Shift->takeName(Src); - return CastInst::CreateIntegerCast(Shift, DestTy, false); - } - + Value *A; Constant *C; if (match(Src, m_LShr(m_SExt(m_Value(A)), m_Constant(C)))) { unsigned AWidth = A->getType()->getScalarSizeInBits(); |