diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -130,9 +130,6 @@ if (Depth == MaxAnalysisRecursionDepth) return nullptr; - if (isa(VTy)) - return nullptr; - Instruction *I = dyn_cast(V); if (!I) { computeKnownBits(V, Known, Depth, CxtI); @@ -424,7 +421,9 @@ if (auto *DstVTy = dyn_cast(VTy)) { if (auto *SrcVTy = dyn_cast(I->getOperand(0)->getType())) { - if (cast(DstVTy)->getNumElements() != + if (isa(DstVTy) || + isa(SrcVTy) || + cast(DstVTy)->getNumElements() != cast(SrcVTy)->getNumElements()) // Don't touch a bitcast between vectors of different element counts. return nullptr; diff --git a/llvm/test/Transforms/InstCombine/mul-masked-bits.ll b/llvm/test/Transforms/InstCombine/mul-masked-bits.ll --- a/llvm/test/Transforms/InstCombine/mul-masked-bits.ll +++ b/llvm/test/Transforms/InstCombine/mul-masked-bits.ll @@ -82,8 +82,7 @@ ; CHECK-LABEL: @combine_mul_self_demandedbits_vector2( ; CHECK-NEXT: [[TMP1:%.*]] = freeze [[X:%.*]] ; CHECK-NEXT: [[TMP2:%.*]] = mul [[TMP1]], [[TMP1]] -; CHECK-NEXT: [[TMP3:%.*]] = and [[TMP2]], shufflevector ( insertelement ( poison, i32 -3, i32 0), poison, zeroinitializer) -; CHECK-NEXT: ret [[TMP3]] +; CHECK-NEXT: ret [[TMP2]] ; %1 = freeze %x %2 = mul %1, %1 diff --git a/llvm/test/Transforms/InstCombine/udiv-simplify.ll b/llvm/test/Transforms/InstCombine/udiv-simplify.ll --- a/llvm/test/Transforms/InstCombine/udiv-simplify.ll +++ b/llvm/test/Transforms/InstCombine/udiv-simplify.ll @@ -106,8 +106,7 @@ define @udiv_demanded3( %a) { ; CHECK-LABEL: @udiv_demanded3( -; CHECK-NEXT: [[O:%.*]] = or [[A:%.*]], shufflevector ( insertelement ( poison, i32 3, i32 0), poison, zeroinitializer) -; CHECK-NEXT: [[U:%.*]] = udiv [[O]], shufflevector ( insertelement ( poison, i32 12, i32 0), poison, zeroinitializer) +; CHECK-NEXT: [[U:%.*]] = udiv [[A:%.*]], shufflevector ( insertelement ( poison, i32 12, i32 0), poison, zeroinitializer) ; CHECK-NEXT: ret [[U]] ; %o = or %a, shufflevector ( insertelement ( poison, i32 3, i32 0), poison, zeroinitializer)