Skip to content

Commit 87c60bf

Browse files
committed
[X86] Add test case for situation where constant folding PMADDWD was causing an infinite loop in PCMPGT commuting between 2 constant values.
Reported by @alexfh
1 parent a139f84 commit 87c60bf

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

llvm/test/CodeGen/X86/combine-pmadd.ll

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,46 @@ define i32 @combine_pmaddubsw_constant_sat() {
226226
%3 = sext i16 %2 to i32
227227
ret i32 %3
228228
}
229+
230+
; Constant folding PMADDWD was causing an infinite loop in the PCMPGT commuting between 2 constant values.
231+
define i1 @pmaddwd_pcmpgt_infinite_loop() {
232+
; SSE-LABEL: pmaddwd_pcmpgt_infinite_loop:
233+
; SSE: # %bb.0:
234+
; SSE-NEXT: movdqa {{.*#+}} xmm0 = [2147483647,2147483647,2147483647,2147483647]
235+
; SSE-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
236+
; SSE-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
237+
; SSE-NEXT: movmskps %xmm0, %eax
238+
; SSE-NEXT: testl %eax, %eax
239+
; SSE-NEXT: sete %al
240+
; SSE-NEXT: retq
241+
;
242+
; AVX1-LABEL: pmaddwd_pcmpgt_infinite_loop:
243+
; AVX1: # %bb.0:
244+
; AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
245+
; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [2147483647,2147483647,2147483647,2147483647]
246+
; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
247+
; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
248+
; AVX1-NEXT: vtestps %xmm1, %xmm0
249+
; AVX1-NEXT: sete %al
250+
; AVX1-NEXT: retq
251+
;
252+
; AVX2-LABEL: pmaddwd_pcmpgt_infinite_loop:
253+
; AVX2: # %bb.0:
254+
; AVX2-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
255+
; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2147483647,2147483647,2147483647,2147483647]
256+
; AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
257+
; AVX2-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
258+
; AVX2-NEXT: vtestps %xmm1, %xmm0
259+
; AVX2-NEXT: sete %al
260+
; AVX2-NEXT: retq
261+
%1 = tail call <4 x i32> @llvm.x86.sse2.pmadd.wd(<8 x i16> <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>, <8 x i16> <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>)
262+
%2 = icmp eq <4 x i32> %1, <i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 -2147483648>
263+
%3 = select <4 x i1> %2, <4 x i32> <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647>, <4 x i32> zeroinitializer
264+
%4 = add <4 x i32> %3, <i32 -8, i32 -9, i32 -10, i32 -11>
265+
%.not = trunc <4 x i32> %3 to <4 x i1>
266+
%5 = icmp sgt <4 x i32> %4, <i32 2147483640, i32 2147483639, i32 2147483638, i32 2147483637>
267+
%6 = select <4 x i1> %.not, <4 x i1> %5, <4 x i1> zeroinitializer
268+
%7 = bitcast <4 x i1> %6 to i4
269+
%8 = icmp eq i4 %7, 0
270+
ret i1 %8
271+
}

0 commit comments

Comments
 (0)