Skip to content

Commit e0dfa15

Browse files
committed
Perform last active DAG combine on half/bfloat scalable vectors
1 parent 63fae17 commit e0dfa15

File tree

2 files changed

+7
-17
lines changed

2 files changed

+7
-17
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19745,9 +19745,9 @@ performExtractLastActiveCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
1974519745

1974619746
// Only legal for 8, 16, 32, and 64 bit element types.
1974719747
EVT EltVT = Vec.getValueType().getVectorElementType();
19748-
if (!is_contained(
19749-
ArrayRef({MVT::i8, MVT::i16, MVT::i32, MVT::i64, MVT::f32, MVT::f64}),
19750-
EltVT.getSimpleVT().SimpleTy))
19748+
if (!is_contained(ArrayRef({MVT::i8, MVT::i16, MVT::i32, MVT::i64, MVT::f16,
19749+
MVT::bf16, MVT::f32, MVT::f64}),
19750+
EltVT.getSimpleVT().SimpleTy))
1975119751
return SDValue();
1975219752

1975319753
SDValue Mask = Idx.getOperand(0);

llvm/test/CodeGen/AArch64/vector-extract-last-active.ll

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -429,13 +429,8 @@ define i64 @extract_last_i64_scalable(<vscale x 2 x i64> %data, <vscale x 2 x i1
429429
define half @extract_last_half_scalable(<vscale x 8 x half> %data, <vscale x 8 x i1> %mask, half %passthru) #0 {
430430
; CHECK-LABEL: extract_last_half_scalable:
431431
; CHECK: // %bb.0:
432-
; CHECK-NEXT: index z2.h, #0, #1
433-
; CHECK-NEXT: lastb w8, p0, z2.h
434-
; CHECK-NEXT: whilels p1.h, xzr, x8
435-
; CHECK-NEXT: lastb h0, p1, z0.h
436-
; CHECK-NEXT: ptrue p1.h
437-
; CHECK-NEXT: ptest p1, p0.b
438-
; CHECK-NEXT: fcsel h0, h0, h1, ne
432+
; CHECK-NEXT: clastb h1, p0, h1, z0.h
433+
; CHECK-NEXT: fmov s0, s1
439434
; CHECK-NEXT: ret
440435
%res = call half @llvm.experimental.vector.extract.last.active.nxv8f16(<vscale x 8 x half> %data, <vscale x 8 x i1> %mask, half %passthru)
441436
ret half %res
@@ -444,13 +439,8 @@ define half @extract_last_half_scalable(<vscale x 8 x half> %data, <vscale x 8 x
444439
define bfloat @extract_last_bfloat_scalable(<vscale x 8 x bfloat> %data, <vscale x 8 x i1> %mask, bfloat %passthru) #0 {
445440
; CHECK-LABEL: extract_last_bfloat_scalable:
446441
; CHECK: // %bb.0:
447-
; CHECK-NEXT: index z2.h, #0, #1
448-
; CHECK-NEXT: lastb w8, p0, z2.h
449-
; CHECK-NEXT: whilels p1.h, xzr, x8
450-
; CHECK-NEXT: lastb h0, p1, z0.h
451-
; CHECK-NEXT: ptrue p1.h
452-
; CHECK-NEXT: ptest p1, p0.b
453-
; CHECK-NEXT: fcsel h0, h0, h1, ne
442+
; CHECK-NEXT: clastb h1, p0, h1, z0.h
443+
; CHECK-NEXT: fmov s0, s1
454444
; CHECK-NEXT: ret
455445
%res = call bfloat @llvm.experimental.vector.extract.last.active.nxv8bf16(<vscale x 8 x bfloat> %data, <vscale x 8 x i1> %mask, bfloat %passthru)
456446
ret bfloat %res

0 commit comments

Comments
 (0)