[llvm] Precommit test for combine ADC(ADD(X,Y),0,Carry) -> ADC(X,Y,Carry) (PR #177539)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 23 00:29:32 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
Author: None (JaydeepChauhan14)
<details>
<summary>Changes</summary>
**Reference PR-** https://github.com/llvm/llvm-project/pull/176713
---
Full diff: https://github.com/llvm/llvm-project/pull/177539.diff
1 Files Affected:
- (modified) llvm/test/CodeGen/X86/combine-adc.ll (+124)
``````````diff
diff --git a/llvm/test/CodeGen/X86/combine-adc.ll b/llvm/test/CodeGen/X86/combine-adc.ll
index a2aaea31aa6ff..f15f27ebaf57c 100644
--- a/llvm/test/CodeGen/X86/combine-adc.ll
+++ b/llvm/test/CodeGen/X86/combine-adc.ll
@@ -136,5 +136,129 @@ define i32 @adc_merge_sub(i32 %a0) nounwind {
ret i32 %result
}
+; Basic positive test
+define i32 @adc_add(i32 %0, i32 %1, i32 %2, i32 %3) {
+; X86-LABEL: adc_add:
+; X86: # %bb.0:
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: addl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: cmpl %ecx, %eax
+; X86-NEXT: adcl $0, %edx
+; X86-NEXT: js .LBB4_2
+; X86-NEXT: # %bb.1:
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: .LBB4_2:
+; X86-NEXT: retl
+;
+; X64-LABEL: adc_add:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %eax
+; X64-NEXT: addl %ecx, %edx
+; X64-NEXT: cmpl %esi, %edi
+; X64-NEXT: adcl $0, %edx
+; X64-NEXT: cmovsl %edi, %eax
+; X64-NEXT: retq
+ %5 = icmp ult i32 %0, %1
+ %6 = add i32 %3, %2
+ %7 = zext i1 %5 to i32
+ %8 = add i32 %6, %7
+ %9 = icmp slt i32 %8, 0
+ %10 = select i1 %9, i32 %0, i32 %1
+ ret i32 %10
+}
+
+; Negative test: Carry or overflow flag is used
+define i32 @adc_add_wrong_flags(i32 %0, i32 %1, i32 %2, i32 %3) {
+; X86-LABEL: adc_add_wrong_flags:
+; X86: # %bb.0:
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: addl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: cmpl %ecx, %eax
+; X86-NEXT: adcl $0, %edx
+; X86-NEXT: jb .LBB5_2
+; X86-NEXT: # %bb.1:
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: .LBB5_2:
+; X86-NEXT: retl
+;
+; X64-LABEL: adc_add_wrong_flags:
+; X64: # %bb.0:
+; X64-NEXT: movl %esi, %eax
+; X64-NEXT: addl %ecx, %edx
+; X64-NEXT: cmpl %esi, %edi
+; X64-NEXT: adcl $0, %edx
+; X64-NEXT: cmovbl %edi, %eax
+; X64-NEXT: retq
+ %5 = icmp ult i32 %0, %1
+ %6 = add i32 %3, %2
+ %7 = zext i1 %5 to i32
+ %8 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %6, i32 %7)
+ %9 = extractvalue { i32, i1 } %8, 1
+ %10 = select i1 %9, i32 %0, i32 %1
+ ret i32 %10
+}
+
+; Negative test: Multi-use
+define i32 @adc_add_multi_use(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, ptr %5) {
+; X86-LABEL: adc_add_multi_use:
+; X86: # %bb.0:
+; X86-NEXT: pushl %ebx
+; X86-NEXT: .cfi_def_cfa_offset 8
+; X86-NEXT: pushl %edi
+; X86-NEXT: .cfi_def_cfa_offset 12
+; X86-NEXT: pushl %esi
+; X86-NEXT: .cfi_def_cfa_offset 16
+; X86-NEXT: .cfi_offset %esi, -16
+; X86-NEXT: .cfi_offset %edi, -12
+; X86-NEXT: .cfi_offset %ebx, -8
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: leal (%edi,%esi), %ebx
+; X86-NEXT: cmpl %ecx, %eax
+; X86-NEXT: movl %ebx, (%edx)
+; X86-NEXT: adcl %esi, %edi
+; X86-NEXT: addl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: js .LBB6_2
+; X86-NEXT: # %bb.1:
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: .LBB6_2:
+; X86-NEXT: popl %esi
+; X86-NEXT: .cfi_def_cfa_offset 12
+; X86-NEXT: popl %edi
+; X86-NEXT: .cfi_def_cfa_offset 8
+; X86-NEXT: popl %ebx
+; X86-NEXT: .cfi_def_cfa_offset 4
+; X86-NEXT: retl
+;
+; X64-LABEL: adc_add_multi_use:
+; X64: # %bb.0:
+; X64-NEXT: # kill: def $ecx killed $ecx def $rcx
+; X64-NEXT: # kill: def $edx killed $edx def $rdx
+; X64-NEXT: movl %esi, %eax
+; X64-NEXT: leal (%rcx,%rdx), %esi
+; X64-NEXT: cmpl %eax, %edi
+; X64-NEXT: movl %esi, (%r9)
+; X64-NEXT: adcl %edx, %ecx
+; X64-NEXT: addl %r8d, %ecx
+; X64-NEXT: cmovsl %edi, %eax
+; X64-NEXT: retq
+ %7 = icmp ult i32 %0, %1
+ %8 = add i32 %3, %2
+ store i32 %8, ptr %5, align 4
+ %9 = zext i1 %7 to i32
+ %10 = add i32 %8, %9
+ %11 = add i32 %10, %4
+ %12 = icmp slt i32 %11, 0
+ %13 = select i1 %12, i32 %0, i32 %1
+ ret i32 %13
+}
+
declare { i8, i32 } @llvm.x86.addcarry.32(i8, i32, i32)
declare void @use(i8)
``````````
</details>
https://github.com/llvm/llvm-project/pull/177539
More information about the llvm-commits
mailing list