return foldICmpWithZextOrSext(ICmp);
}
-static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS) {
+static bool isNeutralValue(Instruction::BinaryOps BinaryOp, Value *RHS, bool IsSigned) {
switch (BinaryOp) {
default:
llvm_unreachable("Unsupported binary op");
case Instruction::Sub:
return match(RHS, m_Zero());
case Instruction::Mul:
- return match(RHS, m_One());
+ return !(RHS->getType()->isIntOrIntVectorTy(1) && IsSigned) &&
+ match(RHS, m_One());
}
}
if (auto *LHSTy = dyn_cast<VectorType>(LHS->getType()))
OverflowTy = VectorType::get(OverflowTy, LHSTy->getElementCount());
- if (isNeutralValue(BinaryOp, RHS)) {
+ if (isNeutralValue(BinaryOp, RHS, IsSigned)) {
Result = LHS;
Overflow = ConstantInt::getFalse(OverflowTy);
return true;
define i1 @i1_ov_by_one(i1 %x) {
; CHECK-LABEL: @i1_ov_by_one(
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: ret i1 [[X:%.*]]
;
%m = call {i1, i1} @llvm.smul.with.overflow.i1(i1 %x, i1 1)
%ov = extractvalue {i1, i1} %m, 1
define <2 x i1> @v2i1_ov_by_one(<2 x i1> %x) {
; CHECK-LABEL: @v2i1_ov_by_one(
-; CHECK-NEXT: ret <2 x i1> zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[X:%.*]]
;
%m = call {<2 x i1>, <2 x i1>} @llvm.smul.with.overflow.v2i1(<2 x i1> %x, <2 x i1> <i1 1, i1 1>)
%ov = extractvalue {<2 x i1>, <2 x i1>} %m, 1