Skip to content

Commit c00c5a3

Browse files
committed
[X86] Add test coverage to show failure to push freeze through CTLZ/CTTZ nodes (+ZERO_UNDEF variants)
Helps with nvtpx regression #145939
1 parent 44ec3e8 commit c00c5a3

File tree

1 file changed

+159
-0
lines changed

1 file changed

+159
-0
lines changed

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

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,165 @@ define <4 x i32> @freeze_bitreverse_vec(<4 x i32> %a0) nounwind {
126126
}
127127
declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)
128128

129+
define i32 @freeze_ctlz(i32 %a0) nounwind {
130+
; X86-LABEL: freeze_ctlz:
131+
; 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
140+
; X86-NEXT: retl
141+
;
142+
; X64-LABEL: freeze_ctlz:
143+
; 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
150+
; X64-NEXT: retq
151+
%x = call i32 @llvm.ctlz.i32(i32 %a0, i1 0)
152+
%f = freeze i32 %x
153+
%c = icmp eq i32 %a0, 0
154+
%r = select i1 %c, i32 32, i32 %f
155+
ret i32 %r
156+
}
157+
158+
define i32 @freeze_ctlz_undef(i32 %a0) nounwind {
159+
; X86-LABEL: freeze_ctlz_undef:
160+
; X86: # %bb.0:
161+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
162+
; X86-NEXT: bsrl %eax, %ecx
163+
; X86-NEXT: xorl $31, %ecx
164+
; X86-NEXT: testl %eax, %eax
165+
; X86-NEXT: movl $32, %eax
166+
; X86-NEXT: cmovnel %ecx, %eax
167+
; X86-NEXT: retl
168+
;
169+
; X64-LABEL: freeze_ctlz_undef:
170+
; X64: # %bb.0:
171+
; X64-NEXT: bsrl %edi, %ecx
172+
; X64-NEXT: xorl $31, %ecx
173+
; X64-NEXT: testl %edi, %edi
174+
; X64-NEXT: movl $32, %eax
175+
; X64-NEXT: cmovnel %ecx, %eax
176+
; X64-NEXT: retq
177+
%f0 = freeze i32 %a0
178+
%x = call i32 @llvm.ctlz.i32(i32 %f0, i1 -1)
179+
%f = freeze i32 %x
180+
%c = icmp eq i32 %a0, 0
181+
%r = select i1 %c, i32 32, i32 %f
182+
ret i32 %r
183+
}
184+
185+
define i32 @freeze_ctlz_undef_nonzero(i32 %a0) nounwind {
186+
; X86-LABEL: freeze_ctlz_undef_nonzero:
187+
; X86: # %bb.0:
188+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
189+
; X86-NEXT: orl $1, %eax
190+
; X86-NEXT: bsrl %eax, %ecx
191+
; X86-NEXT: xorl $31, %ecx
192+
; X86-NEXT: testl %eax, %eax
193+
; X86-NEXT: movl $32, %eax
194+
; X86-NEXT: cmovnel %ecx, %eax
195+
; X86-NEXT: retl
196+
;
197+
; X64-LABEL: freeze_ctlz_undef_nonzero:
198+
; X64: # %bb.0:
199+
; X64-NEXT: orl $1, %edi
200+
; X64-NEXT: bsrl %edi, %ecx
201+
; X64-NEXT: xorl $31, %ecx
202+
; X64-NEXT: testl %edi, %edi
203+
; X64-NEXT: movl $32, %eax
204+
; X64-NEXT: cmovnel %ecx, %eax
205+
; X64-NEXT: retq
206+
%f0 = freeze i32 %a0
207+
%y = or i32 %f0, 1
208+
%x = call i32 @llvm.ctlz.i32(i32 %y, i1 -1)
209+
%f = freeze i32 %x
210+
%c = icmp eq i32 %y, 0
211+
%r = select i1 %c, i32 32, i32 %f
212+
ret i32 %r
213+
}
214+
215+
define i32 @freeze_cttz(i32 %a0) nounwind {
216+
; X86-LABEL: freeze_cttz:
217+
; 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
223+
; X86-NEXT: retl
224+
;
225+
; X64-LABEL: freeze_cttz:
226+
; X64: # %bb.0:
227+
; X64-NEXT: movl $32, %ecx
228+
; X64-NEXT: movl $32, %eax
229+
; X64-NEXT: bsfl %edi, %eax
230+
; X64-NEXT: cmovel %ecx, %eax
231+
; X64-NEXT: retq
232+
%x = call i32 @llvm.cttz.i32(i32 %a0, i1 0)
233+
%f = freeze i32 %x
234+
%c = icmp eq i32 %a0, 0
235+
%r = select i1 %c, i32 32, i32 %f
236+
ret i32 %r
237+
}
238+
239+
define i32 @freeze_cttz_undef(i32 %a0) nounwind {
240+
; X86-LABEL: freeze_cttz_undef:
241+
; X86: # %bb.0:
242+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
243+
; X86-NEXT: bsfl %eax, %ecx
244+
; X86-NEXT: movl $32, %eax
245+
; X86-NEXT: cmovnel %ecx, %eax
246+
; X86-NEXT: retl
247+
;
248+
; X64-LABEL: freeze_cttz_undef:
249+
; X64: # %bb.0:
250+
; X64-NEXT: bsfl %edi, %ecx
251+
; X64-NEXT: movl $32, %eax
252+
; X64-NEXT: cmovnel %ecx, %eax
253+
; X64-NEXT: retq
254+
%f0 = freeze i32 %a0
255+
%x = call i32 @llvm.cttz.i32(i32 %f0, i1 -1)
256+
%f = freeze i32 %x
257+
%c = icmp eq i32 %a0, 0
258+
%r = select i1 %c, i32 32, i32 %f
259+
ret i32 %r
260+
}
261+
262+
define i32 @freeze_cttz_undef_nonzero(i32 %a0) nounwind {
263+
; X86-LABEL: freeze_cttz_undef_nonzero:
264+
; X86: # %bb.0:
265+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
266+
; X86-NEXT: orl $1, %eax
267+
; X86-NEXT: bsfl %eax, %ecx
268+
; X86-NEXT: movl $32, %eax
269+
; X86-NEXT: cmovnel %ecx, %eax
270+
; X86-NEXT: retl
271+
;
272+
; X64-LABEL: freeze_cttz_undef_nonzero:
273+
; X64: # %bb.0:
274+
; X64-NEXT: orl $1, %edi
275+
; X64-NEXT: bsfl %edi, %ecx
276+
; X64-NEXT: movl $32, %eax
277+
; X64-NEXT: cmovnel %ecx, %eax
278+
; X64-NEXT: retq
279+
%f0 = freeze i32 %a0
280+
%y = or i32 %f0, 1
281+
%x = call i32 @llvm.cttz.i32(i32 %y, i1 -1)
282+
%f = freeze i32 %x
283+
%c = icmp eq i32 %y, 0
284+
%r = select i1 %c, i32 32, i32 %f
285+
ret i32 %r
286+
}
287+
129288
; split parity pattern
130289
define i8 @freeze_ctpop(i8 %a0) nounwind {
131290
; X86-LABEL: freeze_ctpop:

0 commit comments

Comments
 (0)