Index: InstCombineCasts.cpp =================================================================== --- InstCombineCasts.cpp +++ InstCombineCasts.cpp @@ -1254,6 +1254,20 @@ return BinaryOperator::CreateAShr(A, ShAmtV); } + // Transform: + // %shr26 = lshr i32 %0, 16 ; [#uses=1 type=i32] + // %conv4 = trunc i32 %shr26 to i16 ; [#uses=1 type=i16] + // %3 = sext i16 %conv4 to i32 ; [#uses=N type=i32] + // To: + // %3 = ashr i32 %0, 16 + if (match(Src, m_OneUse(m_Trunc( m_OneUse(m_LShr(m_Value(A), m_ConstantInt(BA)))))) && + A->getType() == CI.getType()) { + unsigned SextSize = CI.getType()->getScalarSizeInBits(); + unsigned TruncSize = Src->getType()->getScalarSizeInBits(); + if (BA->getZExtValue() == SextSize - TruncSize) + return BinaryOperator::CreateAShr(A, BA); + } + return nullptr; }