Skip to content

Commit 1759f0e

Browse files
committed
Combine extract_vector_elt(find_last_active) -> lastb
1 parent 1bdd4c1 commit 1759f0e

File tree

2 files changed

+31
-27
lines changed

2 files changed

+31
-27
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19945,6 +19945,29 @@ performLastTrueTestVectorCombine(SDNode *N,
1994519945
return getPTest(DAG, N->getValueType(0), Pg, N0, AArch64CC::LAST_ACTIVE);
1994619946
}
1994719947

19948+
static SDValue
19949+
performExtractLastActiveCombine(SDNode *N,
19950+
TargetLowering::DAGCombinerInfo &DCI,
19951+
const AArch64Subtarget *Subtarget) {
19952+
assert(N->getOpcode() == ISD::EXTRACT_VECTOR_ELT);
19953+
SelectionDAG &DAG = DCI.DAG;
19954+
SDValue Vec = N->getOperand(0);
19955+
SDValue Idx = N->getOperand(1);
19956+
19957+
if (!Subtarget->hasSVE() || DCI.isBeforeLegalize() ||
19958+
Idx.getOpcode() != ISD::VECTOR_FIND_LAST_ACTIVE)
19959+
return SDValue();
19960+
19961+
SDValue Mask = Idx.getOperand(0);
19962+
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
19963+
if (TLI.getOperationAction(ISD::VECTOR_FIND_LAST_ACTIVE, Mask.getValueType())
19964+
!= TargetLowering::Legal)
19965+
return SDValue();
19966+
19967+
return DAG.getNode(AArch64ISD::LASTB, SDLoc(N), N->getValueType(0),
19968+
Mask, Vec);
19969+
}
19970+
1994819971
static SDValue
1994919972
performExtractVectorEltCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
1995019973
const AArch64Subtarget *Subtarget) {
@@ -19953,6 +19976,8 @@ performExtractVectorEltCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
1995319976
return Res;
1995419977
if (SDValue Res = performLastTrueTestVectorCombine(N, DCI, Subtarget))
1995519978
return Res;
19979+
if (SDValue Res = performExtractLastActiveCombine(N, DCI, Subtarget))
19980+
return Res;
1995619981

1995719982
SelectionDAG &DAG = DCI.DAG;
1995819983
SDValue N0 = N->getOperand(0), N1 = N->getOperand(1);

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

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -293,11 +293,8 @@ define double @extract_last_double(<2 x double> %data, <2 x i64> %mask, double %
293293
define i8 @extract_last_i8_scalable(<vscale x 16 x i8> %data, <vscale x 16 x i1> %mask, i8 %passthru) #0 {
294294
; CHECK-LABEL: extract_last_i8_scalable:
295295
; CHECK: // %bb.0:
296-
; CHECK-NEXT: index z1.b, #0, #1
297-
; CHECK-NEXT: lastb w8, p0, z1.b
298-
; CHECK-NEXT: whilels p1.b, xzr, x8
296+
; CHECK-NEXT: lastb w8, p0, z0.b
299297
; CHECK-NEXT: ptest p0, p0.b
300-
; CHECK-NEXT: lastb w8, p1, z0.b
301298
; CHECK-NEXT: csel w0, w8, w0, ne
302299
; CHECK-NEXT: ret
303300
%res = call i8 @llvm.experimental.vector.extract.last.active.nxv16i8(<vscale x 16 x i8> %data, <vscale x 16 x i1> %mask, i8 %passthru)
@@ -307,10 +304,7 @@ define i8 @extract_last_i8_scalable(<vscale x 16 x i8> %data, <vscale x 16 x i1>
307304
define i16 @extract_last_i16_scalable(<vscale x 8 x i16> %data, <vscale x 8 x i1> %mask, i16 %passthru) #0 {
308305
; CHECK-LABEL: extract_last_i16_scalable:
309306
; CHECK: // %bb.0:
310-
; CHECK-NEXT: index z1.h, #0, #1
311-
; CHECK-NEXT: lastb w8, p0, z1.h
312-
; CHECK-NEXT: whilels p1.h, xzr, x8
313-
; CHECK-NEXT: lastb w8, p1, z0.h
307+
; CHECK-NEXT: lastb w8, p0, z0.h
314308
; CHECK-NEXT: ptrue p1.h
315309
; CHECK-NEXT: ptest p1, p0.b
316310
; CHECK-NEXT: csel w0, w8, w0, ne
@@ -322,10 +316,7 @@ define i16 @extract_last_i16_scalable(<vscale x 8 x i16> %data, <vscale x 8 x i1
322316
define i32 @extract_last_i32_scalable(<vscale x 4 x i32> %data, <vscale x 4 x i1> %mask, i32 %passthru) #0 {
323317
; CHECK-LABEL: extract_last_i32_scalable:
324318
; CHECK: // %bb.0:
325-
; CHECK-NEXT: index z1.s, #0, #1
326-
; CHECK-NEXT: lastb w8, p0, z1.s
327-
; CHECK-NEXT: whilels p1.s, xzr, x8
328-
; CHECK-NEXT: lastb w8, p1, z0.s
319+
; CHECK-NEXT: lastb w8, p0, z0.s
329320
; CHECK-NEXT: ptrue p1.s
330321
; CHECK-NEXT: ptest p1, p0.b
331322
; CHECK-NEXT: csel w0, w8, w0, ne
@@ -337,10 +328,7 @@ define i32 @extract_last_i32_scalable(<vscale x 4 x i32> %data, <vscale x 4 x i1
337328
define i64 @extract_last_i64_scalable(<vscale x 2 x i64> %data, <vscale x 2 x i1> %mask, i64 %passthru) #0 {
338329
; CHECK-LABEL: extract_last_i64_scalable:
339330
; CHECK: // %bb.0:
340-
; CHECK-NEXT: index z1.d, #0, #1
341-
; CHECK-NEXT: lastb x8, p0, z1.d
342-
; CHECK-NEXT: whilels p1.d, xzr, x8
343-
; CHECK-NEXT: lastb x8, p1, z0.d
331+
; CHECK-NEXT: lastb x8, p0, z0.d
344332
; CHECK-NEXT: ptrue p1.d
345333
; CHECK-NEXT: ptest p1, p0.b
346334
; CHECK-NEXT: csel x0, x8, x0, ne
@@ -352,10 +340,7 @@ define i64 @extract_last_i64_scalable(<vscale x 2 x i64> %data, <vscale x 2 x i1
352340
define float @extract_last_float_scalable(<vscale x 4 x float> %data, <vscale x 4 x i1> %mask, float %passthru) #0 {
353341
; CHECK-LABEL: extract_last_float_scalable:
354342
; CHECK: // %bb.0:
355-
; CHECK-NEXT: index z2.s, #0, #1
356-
; CHECK-NEXT: lastb w8, p0, z2.s
357-
; CHECK-NEXT: whilels p1.s, xzr, x8
358-
; CHECK-NEXT: lastb s0, p1, z0.s
343+
; CHECK-NEXT: lastb s0, p0, z0.s
359344
; CHECK-NEXT: ptrue p1.s
360345
; CHECK-NEXT: ptest p1, p0.b
361346
; CHECK-NEXT: fcsel s0, s0, s1, ne
@@ -367,10 +352,7 @@ define float @extract_last_float_scalable(<vscale x 4 x float> %data, <vscale x
367352
define double @extract_last_double_scalable(<vscale x 2 x double> %data, <vscale x 2 x i1> %mask, double %passthru) #0 {
368353
; CHECK-LABEL: extract_last_double_scalable:
369354
; CHECK: // %bb.0:
370-
; CHECK-NEXT: index z2.d, #0, #1
371-
; CHECK-NEXT: lastb x8, p0, z2.d
372-
; CHECK-NEXT: whilels p1.d, xzr, x8
373-
; CHECK-NEXT: lastb d0, p1, z0.d
355+
; CHECK-NEXT: lastb d0, p0, z0.d
374356
; CHECK-NEXT: ptrue p1.d
375357
; CHECK-NEXT: ptest p1, p0.b
376358
; CHECK-NEXT: fcsel d0, d0, d1, ne
@@ -383,9 +365,6 @@ define double @extract_last_double_scalable(<vscale x 2 x double> %data, <vscale
383365
define i8 @extract_last_i8_scalable_poison_passthru(<vscale x 16 x i8> %data, <vscale x 16 x i1> %mask) #0 {
384366
; CHECK-LABEL: extract_last_i8_scalable_poison_passthru:
385367
; CHECK: // %bb.0:
386-
; CHECK-NEXT: index z1.b, #0, #1
387-
; CHECK-NEXT: lastb w8, p0, z1.b
388-
; CHECK-NEXT: whilels p0.b, xzr, x8
389368
; CHECK-NEXT: lastb w0, p0, z0.b
390369
; CHECK-NEXT: ret
391370
%res = call i8 @llvm.experimental.vector.extract.last.active.nxv16i8(<vscale x 16 x i8> %data, <vscale x 16 x i1> %mask, i8 poison)

0 commit comments

Comments
 (0)