diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3386,7 +3386,7 @@ case Intrinsic::uadd_sat: { // uadd.sat(a, b) == 0 -> (a | b) == 0 - if (C.isZero()) { + if (C.isZero() && II->hasOneUse()) { Value *Or = Builder.CreateOr(II->getArgOperand(0), II->getArgOperand(1)); return new ICmpInst(Pred, Or, Constant::getNullValue(Ty)); } diff --git a/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll b/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll --- a/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll +++ b/llvm/test/Transforms/InstCombine/cmp-intrinsic.ll @@ -872,8 +872,7 @@ ; CHECK-LABEL: @uadd_sat_ne_zero_fail_multiuse( ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) ; CHECK-NEXT: call void @use8(i8 [[M]]) -; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], [[Y]] -; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[TMP1]], 0 +; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[M]], 0 ; CHECK-NEXT: ret i1 [[R]] ; %m = call i8 @llvm.uadd.sat.i8(i8 %x, i8 %y)