Skip to content

Commit ad12e6e

Browse files
committed
[ARM] Turn sext_inreg(VGetLaneu) into VGetLaneu
This adds a DAG combine for converting sext_inreg of VGetLaneu into VGetLanes, providing the types match correctly. Differential Revision: https://reviews.llvm.org/D95073
1 parent b43c395 commit ad12e6e

File tree

8 files changed

+583
-902
lines changed

8 files changed

+583
-902
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,6 +977,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
977977
setTargetDAGCombine(ISD::VECTOR_SHUFFLE);
978978
setTargetDAGCombine(ISD::INSERT_VECTOR_ELT);
979979
setTargetDAGCombine(ISD::EXTRACT_VECTOR_ELT);
980+
setTargetDAGCombine(ISD::SIGN_EXTEND_INREG);
980981
setTargetDAGCombine(ISD::STORE);
981982
setTargetDAGCombine(ISD::SIGN_EXTEND);
982983
setTargetDAGCombine(ISD::ZERO_EXTEND);
@@ -13985,6 +13986,20 @@ static SDValue PerformExtractEltCombine(SDNode *N,
1398513986
return SDValue();
1398613987
}
1398713988

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+
1398814003
/// PerformVECTOR_SHUFFLECombine - Target-specific dag combine xforms for
1398914004
/// ISD::VECTOR_SHUFFLE.
1399014005
static SDValue PerformVECTOR_SHUFFLECombine(SDNode *N, SelectionDAG &DAG) {
@@ -16356,6 +16371,7 @@ SDValue ARMTargetLowering::PerformDAGCombine(SDNode *N,
1635616371
case ISD::INSERT_VECTOR_ELT: return PerformInsertEltCombine(N, DCI);
1635716372
case ISD::EXTRACT_VECTOR_ELT:
1635816373
return PerformExtractEltCombine(N, DCI, Subtarget);
16374+
case ISD::SIGN_EXTEND_INREG: return PerformSignExtendInregCombine(N, DCI.DAG);
1635916375
case ISD::VECTOR_SHUFFLE: return PerformVECTOR_SHUFFLECombine(N, DCI.DAG);
1636016376
case ARMISD::VDUPLANE: return PerformVDUPLANECombine(N, DCI, Subtarget);
1636116377
case ARMISD::VDUP: return PerformVDUPCombine(N, DCI, Subtarget);

llvm/test/CodeGen/ARM/dagcombine-anyexttozeroext.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
12
; RUN: llc -mtriple armv7 %s -o - | FileCheck %s
23

34
define float @f(<4 x i16>* nocapture %in) {
@@ -64,12 +65,10 @@ define <4 x i32> @h(<4 x i8> *%in) {
6465
}
6566

6667
define float @i(<4 x i16>* nocapture %in) {
67-
; FIXME: The vmov.u + sxt can convert to a vmov.s
6868
; CHECK-LABEL: i:
6969
; CHECK: @ %bb.0:
7070
; CHECK-NEXT: vldr d16, [r0]
71-
; CHECK-NEXT: vmov.u16 r0, d16[0]
72-
; CHECK-NEXT: sxth r0, r0
71+
; CHECK-NEXT: vmov.s16 r0, d16[0]
7372
; CHECK-NEXT: vmov s0, r0
7473
; CHECK-NEXT: vcvt.f32.s32 s0, s0
7574
; CHECK-NEXT: vmov r0, s0
@@ -96,12 +95,10 @@ define float @j(<8 x i8>* nocapture %in) {
9695
}
9796

9897
define float @k(<8 x i8>* nocapture %in) {
99-
; FIXME: The vmov.u + sxt can convert to a vmov.s
10098
; CHECK-LABEL: k:
10199
; CHECK: @ %bb.0:
102100
; CHECK-NEXT: vldr d16, [r0]
103-
; CHECK-NEXT: vmov.u8 r0, d16[7]
104-
; CHECK-NEXT: sxtb r0, r0
101+
; CHECK-NEXT: vmov.s8 r0, d16[7]
105102
; CHECK-NEXT: vmov s0, r0
106103
; CHECK-NEXT: vcvt.f32.s32 s0, s0
107104
; CHECK-NEXT: vmov r0, s0

0 commit comments

Comments
 (0)