Index: llvm/test/Transforms/InstCombine/with_overflow.ll =================================================================== --- llvm/test/Transforms/InstCombine/with_overflow.ll +++ llvm/test/Transforms/InstCombine/with_overflow.ll @@ -478,6 +478,40 @@ ret i1 %d } +define i1 @uadd_res_ult_const_five_and_ov(i32 %x) nounwind { +; CHECK-LABEL: @uadd_res_ult_const_five_and_ov( +; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 5) +; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0 +; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1 +; CHECK-NEXT: [[D:%.*]] = icmp ult i32 [[C]], 4 +; CHECK-NEXT: [[R:%.*]] = and i1 [[D]], [[B]] +; CHECK-NEXT: ret i1 [[R]] +; + %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 5) + %c = extractvalue { i32, i1 } %a, 0 + %b = extractvalue { i32, i1 } %a, 1 + %d = icmp ult i32 %c, 4 + %r = and i1 %d, %b + ret i1 %r +} + +define i1 @uadd_res_ugt_smaller_const_or_ov(i32 %x) nounwind { +; CHECK-LABEL: @uadd_res_ugt_smaller_const_or_ov( +; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 5) +; CHECK-NEXT: [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0 +; CHECK-NEXT: [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1 +; CHECK-NEXT: [[D:%.*]] = icmp ugt i32 [[C]], 4 +; CHECK-NEXT: [[R:%.*]] = or i1 [[D]], [[B]] +; CHECK-NEXT: ret i1 [[R]] +; + %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 5) + %c = extractvalue { i32, i1 } %a, 0 + %b = extractvalue { i32, i1 } %a, 1 + %d = icmp ugt i32 %c, 4 + %r = or i1 %d, %b + ret i1 %r +} + define { i32, i1 } @sadd_canonicalize_constant_arg0(i32 %x) nounwind { ; CHECK-LABEL: @sadd_canonicalize_constant_arg0( ; CHECK-NEXT: [[A:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X:%.*]], i32 42)