@@ -318,7 +318,7 @@ define i16 @extract_last_i16_scalable(<vscale x 8 x i16> %data, <vscale x 8 x i1
318318; CHECK-NEXT: sel z1.h, p0, z1.h, z2.h
319319; CHECK-NEXT: umaxv h1, p1, z1.h
320320; CHECK-NEXT: fmov w8, s1
321- ; CHECK-NEXT: and x8, x8, #0xff
321+ ; CHECK-NEXT: and x8, x8, #0xffff
322322; CHECK-NEXT: whilels p2.h, xzr, x8
323323; CHECK-NEXT: ptest p1, p0.b
324324; CHECK-NEXT: lastb w8, p2, z0.h
@@ -337,7 +337,7 @@ define i32 @extract_last_i32_scalable(<vscale x 4 x i32> %data, <vscale x 4 x i1
337337; CHECK-NEXT: sel z1.s, p0, z1.s, z2.s
338338; CHECK-NEXT: umaxv s1, p1, z1.s
339339; CHECK-NEXT: fmov w8, s1
340- ; CHECK-NEXT: and x8, x8, #0xff
340+ ; CHECK-NEXT: mov w8, w8
341341; CHECK-NEXT: whilels p2.s, xzr, x8
342342; CHECK-NEXT: ptest p1, p0.b
343343; CHECK-NEXT: lastb w8, p2, z0.s
@@ -356,7 +356,6 @@ define i64 @extract_last_i64_scalable(<vscale x 2 x i64> %data, <vscale x 2 x i1
356356; CHECK-NEXT: sel z1.d, p0, z1.d, z2.d
357357; CHECK-NEXT: umaxv d1, p1, z1.d
358358; CHECK-NEXT: fmov x8, d1
359- ; CHECK-NEXT: and x8, x8, #0xff
360359; CHECK-NEXT: whilels p2.d, xzr, x8
361360; CHECK-NEXT: ptest p1, p0.b
362361; CHECK-NEXT: lastb x8, p2, z0.d
@@ -375,7 +374,7 @@ define float @extract_last_float_scalable(<vscale x 4 x float> %data, <vscale x
375374; CHECK-NEXT: sel z2.s, p0, z2.s, z3.s
376375; CHECK-NEXT: umaxv s2, p1, z2.s
377376; CHECK-NEXT: fmov w8, s2
378- ; CHECK-NEXT: and x8, x8, #0xff
377+ ; CHECK-NEXT: mov w8, w8
379378; CHECK-NEXT: whilels p2.s, xzr, x8
380379; CHECK-NEXT: ptest p1, p0.b
381380; CHECK-NEXT: lastb s0, p2, z0.s
@@ -394,7 +393,6 @@ define double @extract_last_double_scalable(<vscale x 2 x double> %data, <vscale
394393; CHECK-NEXT: sel z2.d, p0, z2.d, z3.d
395394; CHECK-NEXT: umaxv d2, p1, z2.d
396395; CHECK-NEXT: fmov x8, d2
397- ; CHECK-NEXT: and x8, x8, #0xff
398396; CHECK-NEXT: whilels p2.d, xzr, x8
399397; CHECK-NEXT: ptest p1, p0.b
400398; CHECK-NEXT: lastb d0, p2, z0.d
@@ -404,6 +402,24 @@ define double @extract_last_double_scalable(<vscale x 2 x double> %data, <vscale
404402 ret double %res
405403}
406404
405+ ;; If the passthru parameter is poison, we shouldn't see a select at the end.
406+ define i8 @extract_last_i8_scalable_poison_passthru (<vscale x 16 x i8 > %data , <vscale x 16 x i1 > %mask ) #0 {
407+ ; CHECK-LABEL: extract_last_i8_scalable_poison_passthru:
408+ ; CHECK: // %bb.0:
409+ ; CHECK-NEXT: index z1.b, #0, #1
410+ ; CHECK-NEXT: mov z2.b, #0 // =0x0
411+ ; CHECK-NEXT: sel z1.b, p0, z1.b, z2.b
412+ ; CHECK-NEXT: ptrue p0.b
413+ ; CHECK-NEXT: umaxv b1, p0, z1.b
414+ ; CHECK-NEXT: fmov w8, s1
415+ ; CHECK-NEXT: and x8, x8, #0xff
416+ ; CHECK-NEXT: whilels p0.b, xzr, x8
417+ ; CHECK-NEXT: lastb w0, p0, z0.b
418+ ; CHECK-NEXT: ret
419+ %res = call i8 @llvm.experimental.vector.extract.last.active.nxv16i8 (<vscale x 16 x i8 > %data , <vscale x 16 x i1 > %mask , i8 poison)
420+ ret i8 %res
421+ }
422+
407423declare i8 @llvm.experimental.vector.extract.last.active.v16i8 (<16 x i8 >, <16 x i1 >, i8 )
408424declare i16 @llvm.experimental.vector.extract.last.active.v8i16 (<8 x i16 >, <8 x i1 >, i16 )
409425declare i32 @llvm.experimental.vector.extract.last.active.v4i32 (<4 x i32 >, <4 x i1 >, i32 )
0 commit comments