@@ -325,3 +325,53 @@ cleanup:
325325 %retval.0 = phi i1 [ false , %if.then ], [ true , %if.end ]
326326 ret i1 %retval.0
327327}
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