Skip to content

Commit 529508c

Browse files
authored
[DAG] canCreateUndefOrPoison - add handling for CTTZ/CTLZ nodes (#146361)
ISD::CTTZ/CTLZ nodes handle all input values and do not create undef/poison. The *_ZERO_UNDEF variants will be handled in a future patch.
1 parent 04395be commit 529508c

File tree

2 files changed

+13
-22
lines changed

2 files changed

+13
-22
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5543,6 +5543,8 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts,
55435543
case ISD::FSHL:
55445544
case ISD::FSHR:
55455545
case ISD::BSWAP:
5546+
case ISD::CTTZ:
5547+
case ISD::CTLZ:
55465548
case ISD::CTPOP:
55475549
case ISD::BITREVERSE:
55485550
case ISD::PARITY:

llvm/test/CodeGen/X86/freeze-unary.ll

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -129,24 +129,17 @@ declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)
129129
define i32 @freeze_ctlz(i32 %a0) nounwind {
130130
; X86-LABEL: freeze_ctlz:
131131
; X86: # %bb.0:
132-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
133-
; X86-NEXT: bsrl %eax, %ecx
134-
; X86-NEXT: movl $63, %edx
135-
; X86-NEXT: cmovnel %ecx, %edx
136-
; X86-NEXT: xorl $31, %edx
137-
; X86-NEXT: testl %eax, %eax
138-
; X86-NEXT: movl $32, %eax
139-
; X86-NEXT: cmovnel %edx, %eax
132+
; X86-NEXT: bsrl {{[0-9]+}}(%esp), %ecx
133+
; X86-NEXT: movl $63, %eax
134+
; X86-NEXT: cmovnel %ecx, %eax
135+
; X86-NEXT: xorl $31, %eax
140136
; X86-NEXT: retl
141137
;
142138
; X64-LABEL: freeze_ctlz:
143139
; X64: # %bb.0:
144-
; X64-NEXT: movl $63, %ecx
145-
; X64-NEXT: bsrl %edi, %ecx
146-
; X64-NEXT: xorl $31, %ecx
147-
; X64-NEXT: testl %edi, %edi
148-
; X64-NEXT: movl $32, %eax
149-
; X64-NEXT: cmovnel %ecx, %eax
140+
; X64-NEXT: movl $63, %eax
141+
; X64-NEXT: bsrl %edi, %eax
142+
; X64-NEXT: xorl $31, %eax
150143
; X64-NEXT: retq
151144
%x = call i32 @llvm.ctlz.i32(i32 %a0, i1 0)
152145
%f = freeze i32 %x
@@ -215,19 +208,15 @@ define i32 @freeze_ctlz_undef_nonzero(i32 %a0) nounwind {
215208
define i32 @freeze_cttz(i32 %a0) nounwind {
216209
; X86-LABEL: freeze_cttz:
217210
; X86: # %bb.0:
218-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
219-
; X86-NEXT: bsfl %eax, %eax
220-
; X86-NEXT: movl $32, %ecx
221-
; X86-NEXT: cmovel %ecx, %eax
222-
; X86-NEXT: cmovel %ecx, %eax
211+
; X86-NEXT: bsfl {{[0-9]+}}(%esp), %ecx
212+
; X86-NEXT: movl $32, %eax
213+
; X86-NEXT: cmovnel %ecx, %eax
223214
; X86-NEXT: retl
224215
;
225216
; X64-LABEL: freeze_cttz:
226217
; X64: # %bb.0:
227-
; X64-NEXT: movl $32, %ecx
228218
; X64-NEXT: movl $32, %eax
229-
; X64-NEXT: bsfl %edi, %eax
230-
; X64-NEXT: cmovel %ecx, %eax
219+
; X64-NEXT: rep bsfl %edi, %eax
231220
; X64-NEXT: retq
232221
%x = call i32 @llvm.cttz.i32(i32 %a0, i1 0)
233222
%f = freeze i32 %x

0 commit comments

Comments
 (0)