[llvm] [Reland][X86] Remove redundant `cmp` before `adc` after `lzcnt` or `tzcnt` (PR #210069)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 16 09:24:24 PDT 2026
VachanVY wrote:
Before miscompilation:
```llvm
define i64 @remove_redundant_cmp_ne_lzcnt_i64(i64 %0) {
; CHECK-LABEL: remove_redundant_cmp_ne_lzcnt_i64:
; CHECK: # %bb.0:
; CHECK-NEXT: lzcntq %rdi, %rcx
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: cmpq $1, %rdi
; CHECK-NEXT: setne %al
; CHECK-NEXT: addq %rcx, %rax
; CHECK-NEXT: retq
%2 = tail call i64 @llvm.ctlz.i64(i64 %0, i1 false)
%3 = icmp ne i64 %0, 1
%4 = zext i1 %3 to i64
%5 = add nuw nsw i64 %2, %4
ret i64 %5
}
```
After optimization (miscompilation):
```llvm
define i64 @remove_redundant_cmp_ne_lzcnt_i64(i64 %0) {
; CHECK-LABEL: remove_redundant_cmp_ne_lzcnt_i64:
; CHECK: # %bb.0:
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: lzcntq %rdi, %rcx
; CHECK-NEXT: setne %al
; CHECK-NEXT: addq %rcx, %rax
; CHECK-NEXT: retq
%2 = tail call i64 @llvm.ctlz.i64(i64 %0, i1 false)
%3 = icmp ne i64 %0, 1
%4 = zext i1 %3 to i64
%5 = add nuw nsw i64 %2, %4
ret i64 %5
}
```
https://github.com/llvm/llvm-project/pull/210069
More information about the llvm-commits
mailing list