diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index a1a28076881cb..0cd7bd7772226 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -15072,11 +15072,16 @@ void BoUpSLP::computeMinimumValueSizes() { IsSignedCmp = NodeIdx < VectorizableTree.size() && any_of(VectorizableTree[NodeIdx]->UserTreeIndices, - [](const EdgeInfo &EI) { + [&](const EdgeInfo &EI) { return EI.UserTE->getOpcode() == Instruction::ICmp && - any_of(EI.UserTE->Scalars, [](Value *V) { + any_of(EI.UserTE->Scalars, [&](Value *V) { auto *IC = dyn_cast(V); - return IC && IC->isSigned(); + return IC && + (IC->isSigned() || + !isKnownNonNegative(IC->getOperand(0), + SimplifyQuery(*DL)) || + !isKnownNonNegative(IC->getOperand(1), + SimplifyQuery(*DL))); }); }); } diff --git a/llvm/test/Transforms/SLPVectorizer/RISCV/unsigned-icmp-signed-op.ll b/llvm/test/Transforms/SLPVectorizer/RISCV/unsigned-icmp-signed-op.ll index bfeb7805ae9f5..5ec6b4f1040d8 100644 --- a/llvm/test/Transforms/SLPVectorizer/RISCV/unsigned-icmp-signed-op.ll +++ b/llvm/test/Transforms/SLPVectorizer/RISCV/unsigned-icmp-signed-op.ll @@ -8,7 +8,9 @@ define i32 @test(ptr %f, i16 %0) { ; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[F]], align 2 ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i16> , i16 [[TMP0]], i32 1 ; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x i16> , i16 [[TMP1]], i32 1 -; CHECK-NEXT: [[TMP4:%.*]] = icmp ule <4 x i16> [[TMP3]], [[TMP2]] +; CHECK-NEXT: [[TMP6:%.*]] = zext <4 x i16> [[TMP3]] to <4 x i32> +; CHECK-NEXT: [[TMP7:%.*]] = sext <4 x i16> [[TMP2]] to <4 x i32> +; CHECK-NEXT: [[TMP4:%.*]] = icmp ule <4 x i32> [[TMP6]], [[TMP7]] ; CHECK-NEXT: [[TMP5:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP4]]) ; CHECK-NEXT: [[ZEXT_4:%.*]] = zext i1 [[TMP5]] to i32 ; CHECK-NEXT: ret i32 [[ZEXT_4]]