[llvm] ISD::XOR has the same non-zero detection as ISD::SUB (PR #146980)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 5 08:54:35 PDT 2025
https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/146980
>From 3906382328882fae53e45404cb7ddfd312d99bf6 Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Sat, 5 Jul 2025 11:14:40 -0400
Subject: [PATCH 1/2] Pre-commit tests (NFC)
---
llvm/test/CodeGen/X86/known-never-zero.ll | 64 +++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/llvm/test/CodeGen/X86/known-never-zero.ll b/llvm/test/CodeGen/X86/known-never-zero.ll
index 63336ffa7c6c8..2dbade2e1efd5 100644
--- a/llvm/test/CodeGen/X86/known-never-zero.ll
+++ b/llvm/test/CodeGen/X86/known-never-zero.ll
@@ -1401,3 +1401,67 @@ define i32 @sext_maybe_zero(i16 %x) {
%r = call i32 @llvm.cttz.i32(i32 %z, i1 false)
ret i32 %r
}
+
+define i32 @ctpop_xor_nonzero(i32 %x, i32 %y) {
+; X86-LABEL: ctpop_xor:
+; X86: # %bb.0:
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: cmpl %ecx, %eax
+; X86-NEXT: je .LBB56_2
+; X86-NEXT: # %bb.1: # %true
+; X86-NEXT: xorl %ecx, %eax
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: shrl %ecx
+; X86-NEXT: andl $1431655765, %ecx # imm = 0x55555555
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: andl $858993459, %ecx # imm = 0x33333333
+; X86-NEXT: shrl $2, %eax
+; X86-NEXT: andl $858993459, %eax # imm = 0x33333333
+; X86-NEXT: addl %ecx, %eax
+; X86-NEXT: movl %eax, %ecx
+; X86-NEXT: shrl $4, %ecx
+; X86-NEXT: addl %eax, %ecx
+; X86-NEXT: andl $252645135, %ecx # imm = 0xF0F0F0F
+; X86-NEXT: imull $16843009, %ecx, %eax # imm = 0x1010101
+; X86-NEXT: shrl $24, %eax
+; X86-NEXT: retl
+; X86-NEXT: .LBB56_2: # %false
+; X86-NEXT: xorl %eax, %eax
+; X86-NEXT: retl
+;
+; X64-LABEL: ctpop_xor:
+; X64: # %bb.0:
+; X64-NEXT: cmpl %esi, %edi
+; X64-NEXT: je .LBB56_2
+; X64-NEXT: # %bb.1: # %true
+; X64-NEXT: xorl %esi, %edi
+; X64-NEXT: movl %edi, %eax
+; X64-NEXT: shrl %eax
+; X64-NEXT: andl $1431655765, %eax # imm = 0x55555555
+; X64-NEXT: subl %eax, %edi
+; X64-NEXT: movl %edi, %eax
+; X64-NEXT: andl $858993459, %eax # imm = 0x33333333
+; X64-NEXT: shrl $2, %edi
+; X64-NEXT: andl $858993459, %edi # imm = 0x33333333
+; X64-NEXT: addl %eax, %edi
+; X64-NEXT: movl %edi, %eax
+; X64-NEXT: shrl $4, %eax
+; X64-NEXT: addl %edi, %eax
+; X64-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F
+; X64-NEXT: imull $16843009, %eax, %eax # imm = 0x1010101
+; X64-NEXT: shrl $24, %eax
+; X64-NEXT: retq
+; X64-NEXT: .LBB56_2: # %false
+; X64-NEXT: xorl %eax, %eax
+; X64-NEXT: retq
+ %cmp = icmp ne i32 %x, %y
+ br i1 %cmp, label %true, label %false
+true:
+ %xor = xor i32 %x, %y
+ %ret = call i32 @llvm.ctpop.i32(i32 %xor)
+ ret i32 %ret
+false:
+ ret i32 0
+}
>From bb1f92d573be71deb8b7956568a7d29cbe72a73a Mon Sep 17 00:00:00 2001
From: Rose <gfunni234 at gmail.com>
Date: Thu, 3 Jul 2025 21:04:49 -0400
Subject: [PATCH 2/2] ISD::XOR has the same non-zero detection as ISD::SUB
If X != Y, then X ^ Y != 0
---
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 2a3c8e2b011ad..b5e30225c630d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -6016,7 +6016,7 @@ bool SelectionDAG::isKnownNeverZero(SDValue Op, unsigned Depth) const {
return true;
// TODO: There are a lot more cases we can prove for add.
break;
-
+ case ISD::XOR:
case ISD::SUB: {
if (isNullConstant(Op.getOperand(0)))
return isKnownNeverZero(Op.getOperand(1), Depth + 1);
More information about the llvm-commits
mailing list