@@ -226,3 +226,46 @@ define i32 @combine_pmaddubsw_constant_sat() {
226
226
%3 = sext i16 %2 to i32
227
227
ret i32 %3
228
228
}
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