[llvm] 5684156 - [DAG] canCreateUndefOrPoison - add handling for CTTZ/CTLZ_ZERO_UNDEF nodes (#146501)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 1 04:44:48 PDT 2025
Author: Simon Pilgrim
Date: 2025-07-01T12:44:45+01:00
New Revision: 56841565db77af6eb668b59add3cb1d0f38875e8
URL: https://github.com/llvm/llvm-project/commit/56841565db77af6eb668b59add3cb1d0f38875e8
DIFF: https://github.com/llvm/llvm-project/commit/56841565db77af6eb668b59add3cb1d0f38875e8.diff
LOG: [DAG] canCreateUndefOrPoison - add handling for CTTZ/CTLZ_ZERO_UNDEF nodes (#146501)
CTTZ/CTLZ_ZERO_UNDEF nodes can only create poison if the source value is zero - so check with isKnownNeverZero
Pulled out of #146361 and reapplied now that #146490 has landed.
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/test/CodeGen/X86/freeze-unary.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index a1e4d706ef6b2..8e70ae6a02130 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5627,6 +5627,12 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts,
PoisonOnly, Depth + 1) ||
!getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
+ case ISD::CTTZ_ZERO_UNDEF:
+ case ISD::CTLZ_ZERO_UNDEF:
+ // If the amount is zero then the result will be poison.
+ // TODO: Add isKnownNeverZero DemandedElts handling.
+ return !isKnownNeverZero(Op.getOperand(0), Depth + 1);
+
case ISD::SCALAR_TO_VECTOR:
// Check if we demand any upper (undef) elements.
return !PoisonOnly && DemandedElts.ugt(1);
diff --git a/llvm/test/CodeGen/X86/freeze-unary.ll b/llvm/test/CodeGen/X86/freeze-unary.ll
index c85c831a25342..8602c385af834 100644
--- a/llvm/test/CodeGen/X86/freeze-unary.ll
+++ b/llvm/test/CodeGen/X86/freeze-unary.ll
@@ -179,21 +179,15 @@ define i32 @freeze_ctlz_undef_nonzero(i32 %a0) nounwind {
; X86: # %bb.0:
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: orl $1, %eax
-; X86-NEXT: bsrl %eax, %ecx
-; X86-NEXT: xorl $31, %ecx
-; X86-NEXT: testl %eax, %eax
-; X86-NEXT: movl $32, %eax
-; X86-NEXT: cmovnel %ecx, %eax
+; X86-NEXT: bsrl %eax, %eax
+; X86-NEXT: xorl $31, %eax
; X86-NEXT: retl
;
; X64-LABEL: freeze_ctlz_undef_nonzero:
; X64: # %bb.0:
; X64-NEXT: orl $1, %edi
-; X64-NEXT: bsrl %edi, %ecx
-; X64-NEXT: xorl $31, %ecx
-; X64-NEXT: testl %edi, %edi
-; X64-NEXT: movl $32, %eax
-; X64-NEXT: cmovnel %ecx, %eax
+; X64-NEXT: bsrl %edi, %eax
+; X64-NEXT: xorl $31, %eax
; X64-NEXT: retq
%y = or i32 %a0, 1
%x = call i32 @llvm.ctlz.i32(i32 %y, i1 -1)
@@ -250,17 +244,13 @@ define i32 @freeze_cttz_undef_nonzero(i32 %a0) nounwind {
; X86: # %bb.0:
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: orl $1, %eax
-; X86-NEXT: bsfl %eax, %ecx
-; X86-NEXT: movl $32, %eax
-; X86-NEXT: cmovnel %ecx, %eax
+; X86-NEXT: rep bsfl %eax, %eax
; X86-NEXT: retl
;
; X64-LABEL: freeze_cttz_undef_nonzero:
; X64: # %bb.0:
; X64-NEXT: orl $1, %edi
-; X64-NEXT: bsfl %edi, %ecx
-; X64-NEXT: movl $32, %eax
-; X64-NEXT: cmovnel %ecx, %eax
+; X64-NEXT: rep bsfl %edi, %eax
; X64-NEXT: retq
%y = or i32 %a0, 1
%x = call i32 @llvm.cttz.i32(i32 %y, i1 -1)
More information about the llvm-commits
mailing list