Skip to content

Commit 6bdb01a

Browse files
committed
perform combine for extract_vector_elt
1 parent 60c4561 commit 6bdb01a

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
@@ -412,6 +412,11 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
412412
setTargetDAGCombine(ISD::BITCAST);
413413
}
414414

415+
// Set DAG combine for 'LASX' feature.
416+
417+
if (Subtarget.hasExtLASX())
418+
setTargetDAGCombine(ISD::EXTRACT_VECTOR_ELT);
419+
415420
// Compute derived properties from the register classes.
416421
computeRegisterProperties(Subtarget.getRegisterInfo());
417422

@@ -5907,6 +5912,42 @@ performSPLIT_PAIR_F64Combine(SDNode *N, SelectionDAG &DAG,
59075912
return SDValue();
59085913
}
59095914

5915+
static SDValue
5916+
performEXTRACT_VECTOR_ELTCombine(SDNode *N, SelectionDAG &DAG,
5917+
TargetLowering::DAGCombinerInfo &DCI,
5918+
const LoongArchSubtarget &Subtarget) {
5919+
if (!DCI.isBeforeLegalize())
5920+
return SDValue();
5921+
5922+
MVT EltVT = N->getSimpleValueType(0);
5923+
SDValue Vec = N->getOperand(0);
5924+
EVT VecTy = Vec->getValueType(0);
5925+
SDValue Idx = N->getOperand(1);
5926+
unsigned IdxOp = Idx.getOpcode();
5927+
SDLoc DL(N);
5928+
5929+
if (!VecTy.is256BitVector() || isa<ConstantSDNode>(Idx))
5930+
return SDValue();
5931+
5932+
// Combine:
5933+
// t2 = truncate t1
5934+
// t3 = {zero/sign/any}_extend t2
5935+
// t4 = extract_vector_elt t0, t3
5936+
// to:
5937+
// t4 = extract_vector_elt t0, t1
5938+
if (IdxOp == ISD::ZERO_EXTEND || IdxOp == ISD::SIGN_EXTEND ||
5939+
IdxOp == ISD::ANY_EXTEND) {
5940+
SDValue IdxOrig = Idx.getOperand(0);
5941+
if (!(IdxOrig.getOpcode() == ISD::TRUNCATE))
5942+
return SDValue();
5943+
5944+
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Vec,
5945+
IdxOrig.getOperand(0));
5946+
}
5947+
5948+
return SDValue();
5949+
}
5950+
59105951
SDValue LoongArchTargetLowering::PerformDAGCombine(SDNode *N,
59115952
DAGCombinerInfo &DCI) const {
59125953
SelectionDAG &DAG = DCI.DAG;
@@ -5936,6 +5977,8 @@ SDValue LoongArchTargetLowering::PerformDAGCombine(SDNode *N,
59365977
return performVMSKLTZCombine(N, DAG, DCI, Subtarget);
59375978
case LoongArchISD::SPLIT_PAIR_F64:
59385979
return performSPLIT_PAIR_F64Combine(N, DAG, DCI, Subtarget);
5980+
case ISD::EXTRACT_VECTOR_ELT:
5981+
return performEXTRACT_VECTOR_ELTCombine(N, DAG, DCI, Subtarget);
59395982
}
59405983
return SDValue();
59415984
}

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)