Skip to content

Commit 86ced14

Browse files
committed
perform combine for extract_vector_elt
1 parent 7d46a1a commit 86ced14

File tree

2 files changed

+49
-12
lines changed

2 files changed

+49
-12
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,11 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
423423
setTargetDAGCombine(ISD::BITCAST);
424424
}
425425

426+
// Set DAG combine for 'LASX' feature.
427+
428+
if (Subtarget.hasExtLASX())
429+
setTargetDAGCombine(ISD::EXTRACT_VECTOR_ELT);
430+
426431
// Compute derived properties from the register classes.
427432
computeRegisterProperties(Subtarget.getRegisterInfo());
428433

@@ -6229,6 +6234,42 @@ performSPLIT_PAIR_F64Combine(SDNode *N, SelectionDAG &DAG,
62296234
return SDValue();
62306235
}
62316236

6237+
static SDValue
6238+
performEXTRACT_VECTOR_ELTCombine(SDNode *N, SelectionDAG &DAG,
6239+
TargetLowering::DAGCombinerInfo &DCI,
6240+
const LoongArchSubtarget &Subtarget) {
6241+
if (!DCI.isBeforeLegalize())
6242+
return SDValue();
6243+
6244+
MVT EltVT = N->getSimpleValueType(0);
6245+
SDValue Vec = N->getOperand(0);
6246+
EVT VecTy = Vec->getValueType(0);
6247+
SDValue Idx = N->getOperand(1);
6248+
unsigned IdxOp = Idx.getOpcode();
6249+
SDLoc DL(N);
6250+
6251+
if (!VecTy.is256BitVector() || isa<ConstantSDNode>(Idx))
6252+
return SDValue();
6253+
6254+
// Combine:
6255+
// t2 = truncate t1
6256+
// t3 = {zero/sign/any}_extend t2
6257+
// t4 = extract_vector_elt t0, t3
6258+
// to:
6259+
// t4 = extract_vector_elt t0, t1
6260+
if (IdxOp == ISD::ZERO_EXTEND || IdxOp == ISD::SIGN_EXTEND ||
6261+
IdxOp == ISD::ANY_EXTEND) {
6262+
SDValue IdxOrig = Idx.getOperand(0);
6263+
if (!(IdxOrig.getOpcode() == ISD::TRUNCATE))
6264+
return SDValue();
6265+
6266+
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Vec,
6267+
IdxOrig.getOperand(0));
6268+
}
6269+
6270+
return SDValue();
6271+
}
6272+
62326273
SDValue LoongArchTargetLowering::PerformDAGCombine(SDNode *N,
62336274
DAGCombinerInfo &DCI) const {
62346275
SelectionDAG &DAG = DCI.DAG;
@@ -6262,6 +6303,8 @@ SDValue LoongArchTargetLowering::PerformDAGCombine(SDNode *N,
62626303
return performVMSKLTZCombine(N, DAG, DCI, Subtarget);
62636304
case LoongArchISD::SPLIT_PAIR_F64:
62646305
return performSPLIT_PAIR_F64Combine(N, DAG, DCI, Subtarget);
6306+
case ISD::EXTRACT_VECTOR_ELT:
6307+
return performEXTRACT_VECTOR_ELTCombine(N, DAG, DCI, Subtarget);
62656308
}
62666309
return SDValue();
62676310
}

llvm/test/CodeGen/LoongArch/lasx/ir-instruction/extractelement.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ define void @extract_32xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
7777
; CHECK-LABEL: extract_32xi8_idx:
7878
; CHECK: # %bb.0:
7979
; CHECK-NEXT: xvld $xr0, $a0, 0
80-
; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
81-
; CHECK-NEXT: bstrpick.d $a0, $a0, 31, 2
80+
; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 2
8281
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
8382
; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1
8483
; CHECK-NEXT: andi $a0, $a2, 3
@@ -95,8 +94,7 @@ define void @extract_16xi16_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
9594
; CHECK-LABEL: extract_16xi16_idx:
9695
; CHECK: # %bb.0:
9796
; CHECK-NEXT: xvld $xr0, $a0, 0
98-
; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
99-
; CHECK-NEXT: bstrpick.d $a0, $a0, 31, 1
97+
; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 1
10098
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
10199
; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1
102100
; CHECK-NEXT: andi $a0, $a2, 1
@@ -113,8 +111,7 @@ define void @extract_8xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
113111
; CHECK-LABEL: extract_8xi32_idx:
114112
; CHECK: # %bb.0:
115113
; CHECK-NEXT: xvld $xr0, $a0, 0
116-
; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
117-
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
114+
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a2
118115
; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1
119116
; CHECK-NEXT: xvstelm.w $xr0, $a1, 0, 0
120117
; CHECK-NEXT: ret
@@ -128,8 +125,7 @@ define void @extract_4xi64_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
128125
; CHECK-LABEL: extract_4xi64_idx:
129126
; CHECK: # %bb.0:
130127
; CHECK-NEXT: xvld $xr0, $a0, 0
131-
; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
132-
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
128+
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a2
133129
; CHECK-NEXT: xvslli.w $xr1, $xr1, 1
134130
; CHECK-NEXT: xvperm.w $xr2, $xr0, $xr1
135131
; CHECK-NEXT: xvaddi.wu $xr1, $xr1, 1
@@ -147,8 +143,7 @@ define void @extract_8xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
147143
; CHECK-LABEL: extract_8xfloat_idx:
148144
; CHECK: # %bb.0:
149145
; CHECK-NEXT: xvld $xr0, $a0, 0
150-
; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
151-
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
146+
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a2
152147
; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1
153148
; CHECK-NEXT: xvstelm.w $xr0, $a1, 0, 0
154149
; CHECK-NEXT: ret
@@ -162,8 +157,7 @@ define void @extract_4xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
162157
; CHECK-LABEL: extract_4xdouble_idx:
163158
; CHECK: # %bb.0:
164159
; CHECK-NEXT: xvld $xr0, $a0, 0
165-
; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
166-
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
160+
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a2
167161
; CHECK-NEXT: xvslli.w $xr1, $xr1, 1
168162
; CHECK-NEXT: xvperm.w $xr2, $xr0, $xr1
169163
; CHECK-NEXT: xvaddi.wu $xr1, $xr1, 1

0 commit comments

Comments
 (0)