[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