@@ -977,6 +977,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
977
977
setTargetDAGCombine(ISD::VECTOR_SHUFFLE);
978
978
setTargetDAGCombine(ISD::INSERT_VECTOR_ELT);
979
979
setTargetDAGCombine(ISD::EXTRACT_VECTOR_ELT);
980
+ setTargetDAGCombine(ISD::SIGN_EXTEND_INREG);
980
981
setTargetDAGCombine(ISD::STORE);
981
982
setTargetDAGCombine(ISD::SIGN_EXTEND);
982
983
setTargetDAGCombine(ISD::ZERO_EXTEND);
@@ -13985,6 +13986,20 @@ static SDValue PerformExtractEltCombine(SDNode *N,
13985
13986
return SDValue();
13986
13987
}
13987
13988
13989
+ static SDValue PerformSignExtendInregCombine(SDNode *N, SelectionDAG &DAG) {
13990
+ SDValue Op = N->getOperand(0);
13991
+ EVT VT = N->getValueType(0);
13992
+
13993
+ // sext_inreg(VGETLANEu) -> VGETLANEs
13994
+ if (Op.getOpcode() == ARMISD::VGETLANEu &&
13995
+ cast<VTSDNode>(N->getOperand(1))->getVT() ==
13996
+ Op.getOperand(0).getValueType().getScalarType())
13997
+ return DAG.getNode(ARMISD::VGETLANEs, SDLoc(N), VT, Op.getOperand(0),
13998
+ Op.getOperand(1));
13999
+
14000
+ return SDValue();
14001
+ }
14002
+
13988
14003
/// PerformVECTOR_SHUFFLECombine - Target-specific dag combine xforms for
13989
14004
/// ISD::VECTOR_SHUFFLE.
13990
14005
static SDValue PerformVECTOR_SHUFFLECombine(SDNode *N, SelectionDAG &DAG) {
@@ -16356,6 +16371,7 @@ SDValue ARMTargetLowering::PerformDAGCombine(SDNode *N,
16356
16371
case ISD::INSERT_VECTOR_ELT: return PerformInsertEltCombine(N, DCI);
16357
16372
case ISD::EXTRACT_VECTOR_ELT:
16358
16373
return PerformExtractEltCombine(N, DCI, Subtarget);
16374
+ case ISD::SIGN_EXTEND_INREG: return PerformSignExtendInregCombine(N, DCI.DAG);
16359
16375
case ISD::VECTOR_SHUFFLE: return PerformVECTOR_SHUFFLECombine(N, DCI.DAG);
16360
16376
case ARMISD::VDUPLANE: return PerformVDUPLANECombine(N, DCI, Subtarget);
16361
16377
case ARMISD::VDUP: return PerformVDUPCombine(N, DCI, Subtarget);
0 commit comments