@@ -325,3 +325,53 @@ cleanup:
325
325
%retval.0 = phi i1 [ false , %if.then ], [ true , %if.end ]
326
326
ret i1 %retval.0
327
327
}
328
+
329
+ ; From https://github.com/llvm/llvm-project/issues/139050.
330
+ ; FIXME: This should be vectorized.
331
+ define i8 @masked_min_reduction (ptr %data , ptr %mask ) {
332
+ ; CHECK-LABEL: @masked_min_reduction(
333
+ ; CHECK-NEXT: entry:
334
+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
335
+ ; CHECK: loop:
336
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
337
+ ; CHECK-NEXT: [[ACC:%.*]] = phi i8 [ -1, [[ENTRY]] ], [ [[TMP21:%.*]], [[VECTOR_BODY]] ]
338
+ ; CHECK-NEXT: [[DATA:%.*]] = getelementptr i8, ptr [[DATA1:%.*]], i64 [[INDEX]]
339
+ ; CHECK-NEXT: [[VAL:%.*]] = load i8, ptr [[DATA]], align 1
340
+ ; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[MASK:%.*]], i64 [[INDEX]]
341
+ ; CHECK-NEXT: [[M:%.*]] = load i8, ptr [[TMP7]], align 1
342
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i8 [[M]], 0
343
+ ; CHECK-NEXT: [[TMP0:%.*]] = tail call i8 @llvm.umin.i8(i8 [[ACC]], i8 [[VAL]])
344
+ ; CHECK-NEXT: [[TMP21]] = select i1 [[COND]], i8 [[TMP0]], i8 [[ACC]]
345
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw nsw i64 [[INDEX]], 1
346
+ ; CHECK-NEXT: [[TMP20:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
347
+ ; CHECK-NEXT: br i1 [[TMP20]], label [[EXIT:%.*]], label [[VECTOR_BODY]]
348
+ ; CHECK: exit:
349
+ ; CHECK-NEXT: ret i8 [[TMP21]]
350
+ ;
351
+ entry:
352
+ br label %loop
353
+
354
+ loop:
355
+ %i = phi i64 [ 0 , %entry ], [ %next , %loop ]
356
+ %acc = phi i8 [ 255 , %entry ], [ %acc_next , %loop ]
357
+
358
+ %ptr_i = getelementptr i8 , ptr %data , i64 %i
359
+ %val = load i8 , ptr %ptr_i , align 1
360
+
361
+ %mask_ptr = getelementptr i8 , ptr %mask , i64 %i
362
+ %m = load i8 , ptr %mask_ptr , align 1
363
+ %cond = icmp eq i8 %m , 0
364
+
365
+ ; Use select to implement masking
366
+ %masked_val = select i1 %cond , i8 %val , i8 255
367
+
368
+ ; min reduction
369
+ %acc_next = call i8 @llvm.umin.i8 (i8 %acc , i8 %masked_val )
370
+
371
+ %next = add i64 %i , 1
372
+ %cmp = icmp ult i64 %next , 1024
373
+ br i1 %cmp , label %loop , label %exit
374
+
375
+ exit:
376
+ ret i8 %acc_next
377
+ }
0 commit comments