[llvm] b622cc6 - [X86] LowerCTPOP - check if the operand is a constant when collecting KnownBits
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 11 06:05:10 PST 2025
Author: Simon Pilgrim
Date: 2025-01-11T13:41:50Z
New Revision: b622cc67d0af9326b9e4f1f91d8be790c57dd86c
URL: https://github.com/llvm/llvm-project/commit/b622cc67d0af9326b9e4f1f91d8be790c57dd86c
DIFF: https://github.com/llvm/llvm-project/commit/b622cc67d0af9326b9e4f1f91d8be790c57dd86c.diff
LOG: [X86] LowerCTPOP - check if the operand is a constant when collecting KnownBits
Under certain circumstances, lowering of other instructions can result in computeKnownBits being able to detect a constant that it couldn't previously.
Fixes #122580
Added:
llvm/test/CodeGen/X86/pr122580.ll
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index fbfcfc700ed62d..596139d0845701 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -32172,6 +32172,8 @@ static SDValue LowerCTPOP(SDValue N, const X86Subtarget &Subtarget,
// allowing us to shift the active bits down if necessary to fit into the
// special cases below.
KnownBits Known = DAG.computeKnownBits(Op);
+ if (Known.isConstant())
+ return DAG.getConstant(Known.getConstant().popcount(), DL, VT);
unsigned LZ = Known.countMinLeadingZeros();
unsigned TZ = Known.countMinTrailingZeros();
assert((LZ + TZ) < Known.getBitWidth() && "Illegal shifted mask");
diff --git a/llvm/test/CodeGen/X86/pr122580.ll b/llvm/test/CodeGen/X86/pr122580.ll
new file mode 100644
index 00000000000000..509729416cf573
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr122580.ll
@@ -0,0 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s
+
+ at g_180 = external global i8
+ at g_1032 = external global [2 x i32]
+
+define i32 @PR122580(ptr %0) {
+; CHECK-LABEL: PR122580:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movq g_180 at GOTPCREL(%rip), %rax
+; CHECK-NEXT: cmpb $0, (%rax)
+; CHECK-NEXT: movl $1, %eax
+; CHECK-NEXT: movl $878456583, %ecx # imm = 0x345C2F07
+; CHECK-NEXT: cmovnel %eax, %ecx
+; CHECK-NEXT: movq g_1032 at GOTPCREL(%rip), %rax
+; CHECK-NEXT: movl $0, (%rax)
+; CHECK-NEXT: movl %ecx, (%rdi)
+; CHECK-NEXT: xorl %eax, %eax
+; CHECK-NEXT: retq
+entry:
+ %.b577 = load i1, ptr @g_180, align 4
+ %1 = select i1 %.b577, i32 1, i32 878456582
+ store i32 0, ptr @g_1032, align 4
+ %.b576 = load i1, ptr @g_180, align 4
+ %2 = select i1 %.b576, i32 1, i32 878456582
+ %or542.1.i = or i32 %2, %1
+ store i32 0, ptr @g_1032, align 4
+ %.b575 = load i1, ptr @g_180, align 4
+ %3 = select i1 %.b575, i32 1, i32 878456582
+ %or542.2.i = or i32 %3, %or542.1.i
+ %or542.3.i = or i32 %or542.2.i, 1
+ store i32 %or542.3.i, ptr %0, align 4
+ %4 = load i32, ptr %0, align 4
+ %div.i1796.i = sdiv i32 %4, 1096912269
+ %5 = tail call i32 @llvm.ctpop.i32(i32 %div.i1796.i)
+ ret i32 %5
+}
More information about the llvm-commits
mailing list