@@ -1513,3 +1513,41 @@ define i1 @pr84831(i64 %arg) {
15131513 %trunc = trunc i63 %or to i1
15141514 ret i1 %trunc
15151515}
1516+
1517+ define void @pr169691 (ptr %p0 , i64 %implicit , i1 zeroext %carry ) {
1518+ ; CHECK-LABEL: pr169691:
1519+ ; CHECK: # %bb.0:
1520+ ; CHECK-NEXT: movq (%rdi), %rax
1521+ ; CHECK-NEXT: addq %rsi, %rax
1522+ ; CHECK-NEXT: setb %cl
1523+ ; CHECK-NEXT: movl %edx, %edx
1524+ ; CHECK-NEXT: addq %rax, %rdx
1525+ ; CHECK-NEXT: setb %al
1526+ ; CHECK-NEXT: orb %cl, %al
1527+ ; CHECK-NEXT: movq %rdx, (%rdi)
1528+ ; CHECK-NEXT: addq 8(%rdi), %rsi
1529+ ; CHECK-NEXT: movzbl %al, %eax
1530+ ; CHECK-NEXT: addq %rsi, %rax
1531+ ; CHECK-NEXT: movq %rax, 8(%rdi)
1532+ ; CHECK-NEXT: retq
1533+ %a0 = load i64 , ptr %p0 , align 8
1534+ %uaddo0 = call { i64 , i1 } @llvm.uadd.with.overflow.i64 (i64 %a0 , i64 %implicit )
1535+ %uaddo0.1 = extractvalue { i64 , i1 } %uaddo0 , 1
1536+ %uaddo0.0 = extractvalue { i64 , i1 } %uaddo0 , 0
1537+ %zextc = zext i1 %carry to i64
1538+ %uaddo0b = call { i64 , i1 } @llvm.uadd.with.overflow.i64 (i64 %uaddo0.0 , i64 %zextc )
1539+ %uaddo0b.1 = extractvalue { i64 , i1 } %uaddo0b , 1
1540+ %uaddo0b.0 = extractvalue { i64 , i1 } %uaddo0b , 0
1541+ %carry0 = or i1 %uaddo0.1 , %uaddo0b.1
1542+ store i64 %uaddo0b.0 , ptr %p0 , align 8
1543+
1544+ %p1 = getelementptr inbounds nuw i8 , ptr %p0 , i64 8
1545+ %a1 = load i64 , ptr %p1 , align 8
1546+ %uaddo1 = call { i64 , i1 } @llvm.uadd.with.overflow.i64 (i64 %a1 , i64 %implicit )
1547+ %uaddo1.0 = extractvalue { i64 , i1 } %uaddo1 , 0
1548+ %zext0 = zext i1 %carry0 to i64
1549+ %uaddo1b = call { i64 , i1 } @llvm.uadd.with.overflow.i64 (i64 %uaddo1.0 , i64 %zext0 )
1550+ %uaddo1b.0 = extractvalue { i64 , i1 } %uaddo1b , 0
1551+ store i64 %uaddo1b.0 , ptr %p1 , align 8
1552+ ret void
1553+ }
0 commit comments