diff --git a/llvm/test/CodeGen/X86/addcarry.ll b/llvm/test/CodeGen/X86/addcarry.ll index 97894db1188e2..f8a04f8514988 100644 --- a/llvm/test/CodeGen/X86/addcarry.ll +++ b/llvm/test/CodeGen/X86/addcarry.ll @@ -1513,3 +1513,41 @@ define i1 @pr84831(i64 %arg) { %trunc = trunc i63 %or to i1 ret i1 %trunc } + +define void @pr169691(ptr %p0, i64 %implicit, i1 zeroext %carry) { +; CHECK-LABEL: pr169691: +; CHECK: # %bb.0: +; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: addq %rsi, %rax +; CHECK-NEXT: setb %cl +; CHECK-NEXT: movl %edx, %edx +; CHECK-NEXT: addq %rax, %rdx +; CHECK-NEXT: setb %al +; CHECK-NEXT: orb %cl, %al +; CHECK-NEXT: movq %rdx, (%rdi) +; CHECK-NEXT: addq 8(%rdi), %rsi +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: addq %rsi, %rax +; CHECK-NEXT: movq %rax, 8(%rdi) +; CHECK-NEXT: retq + %a0 = load i64, ptr %p0, align 8 + %uaddo0 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %a0, i64 %implicit) + %uaddo0.1 = extractvalue { i64, i1 } %uaddo0, 1 + %uaddo0.0 = extractvalue { i64, i1 } %uaddo0, 0 + %zextc = zext i1 %carry to i64 + %uaddo0b = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %uaddo0.0, i64 %zextc) + %uaddo0b.1 = extractvalue { i64, i1 } %uaddo0b, 1 + %uaddo0b.0 = extractvalue { i64, i1 } %uaddo0b, 0 + %carry0 = or i1 %uaddo0.1, %uaddo0b.1 + store i64 %uaddo0b.0, ptr %p0, align 8 + + %p1 = getelementptr inbounds nuw i8, ptr %p0, i64 8 + %a1 = load i64, ptr %p1, align 8 + %uaddo1 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %a1, i64 %implicit) + %uaddo1.0 = extractvalue { i64, i1 } %uaddo1, 0 + %zext0 = zext i1 %carry0 to i64 + %uaddo1b = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %uaddo1.0, i64 %zext0) + %uaddo1b.0 = extractvalue { i64, i1 } %uaddo1b, 0 + store i64 %uaddo1b.0, ptr %p1, align 8 + ret void +}