Skip to content

Commit 7996b49

Browse files
committed
Revert "[ARM] Improve codegen of volatile load/store of i64"
This reverts commit 60e0120.
1 parent ed368ba commit 7996b49

File tree

7 files changed

+6
-342
lines changed

7 files changed

+6
-342
lines changed

llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1952,24 +1952,6 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
19521952
MI.eraseFromParent();
19531953
return true;
19541954
}
1955-
case ARM::LOADDUAL:
1956-
case ARM::STOREDUAL: {
1957-
Register PairReg = MI.getOperand(0).getReg();
1958-
1959-
MachineInstrBuilder MIB =
1960-
BuildMI(MBB, MBBI, MI.getDebugLoc(),
1961-
TII->get(Opcode == ARM::LOADDUAL ? ARM::LDRD : ARM::STRD))
1962-
.addReg(TRI->getSubReg(PairReg, ARM::gsub_0),
1963-
Opcode == ARM::LOADDUAL ? RegState::Define : 0)
1964-
.addReg(TRI->getSubReg(PairReg, ARM::gsub_1),
1965-
Opcode == ARM::LOADDUAL ? RegState::Define : 0);
1966-
for (unsigned i = 1; i < MI.getNumOperands(); i++)
1967-
MIB.add(MI.getOperand(i));
1968-
MIB.add(predOps(ARMCC::AL));
1969-
MIB.cloneMemRefs(MI);
1970-
MI.eraseFromParent();
1971-
return true;
1972-
}
19731955
}
19741956
}
19751957

llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,6 @@ class ARMDAGToDAGISel : public SelectionDAGISel {
145145

146146
// Thumb 2 Addressing Modes:
147147
bool SelectT2AddrModeImm12(SDValue N, SDValue &Base, SDValue &OffImm);
148-
template <unsigned Shift>
149-
bool SelectT2AddrModeImm8(SDValue N, SDValue &Base, SDValue &OffImm);
150148
bool SelectT2AddrModeImm8(SDValue N, SDValue &Base,
151149
SDValue &OffImm);
152150
bool SelectT2AddrModeImm8Offset(SDNode *Op, SDValue N,
@@ -1296,33 +1294,6 @@ bool ARMDAGToDAGISel::SelectT2AddrModeImm12(SDValue N,
12961294
return true;
12971295
}
12981296

1299-
template <unsigned Shift>
1300-
bool ARMDAGToDAGISel::SelectT2AddrModeImm8(SDValue N, SDValue &Base,
1301-
SDValue &OffImm) {
1302-
if (N.getOpcode() == ISD::SUB || CurDAG->isBaseWithConstantOffset(N)) {
1303-
int RHSC;
1304-
if (isScaledConstantInRange(N.getOperand(1), 1 << Shift, -255, 256, RHSC)) {
1305-
Base = N.getOperand(0);
1306-
if (Base.getOpcode() == ISD::FrameIndex) {
1307-
int FI = cast<FrameIndexSDNode>(Base)->getIndex();
1308-
Base = CurDAG->getTargetFrameIndex(
1309-
FI, TLI->getPointerTy(CurDAG->getDataLayout()));
1310-
}
1311-
1312-
if (N.getOpcode() == ISD::SUB)
1313-
RHSC = -RHSC;
1314-
OffImm =
1315-
CurDAG->getTargetConstant(RHSC * (1 << Shift), SDLoc(N), MVT::i32);
1316-
return true;
1317-
}
1318-
}
1319-
1320-
// Base only.
1321-
Base = N;
1322-
OffImm = CurDAG->getTargetConstant(0, SDLoc(N), MVT::i32);
1323-
return true;
1324-
}
1325-
13261297
bool ARMDAGToDAGISel::SelectT2AddrModeImm8(SDValue N,
13271298
SDValue &Base, SDValue &OffImm) {
13281299
// Match simple R - imm8 operands.
@@ -3515,26 +3486,6 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
35153486
CurDAG->RemoveDeadNode(N);
35163487
return;
35173488
}
3518-
case ARMISD::LDRD: {
3519-
if (Subtarget->isThumb2())
3520-
break; // TableGen handles isel in this case.
3521-
SDValue Base, RegOffset, ImmOffset;
3522-
const SDValue &Chain = N->getOperand(0);
3523-
const SDValue &Addr = N->getOperand(1);
3524-
SelectAddrMode3(Addr, Base, RegOffset, ImmOffset);
3525-
SDValue Ops[] = {Base, RegOffset, ImmOffset, Chain};
3526-
SDNode *New = CurDAG->getMachineNode(ARM::LOADDUAL, dl,
3527-
{MVT::Untyped, MVT::Other}, Ops);
3528-
SDValue Lo = CurDAG->getTargetExtractSubreg(ARM::gsub_0, dl, MVT::i32,
3529-
SDValue(New, 0));
3530-
SDValue Hi = CurDAG->getTargetExtractSubreg(ARM::gsub_1, dl, MVT::i32,
3531-
SDValue(New, 0));
3532-
ReplaceUses(SDValue(N, 0), Lo);
3533-
ReplaceUses(SDValue(N, 1), Hi);
3534-
ReplaceUses(SDValue(N, 2), SDValue(New, 1));
3535-
CurDAG->RemoveDeadNode(N);
3536-
return;
3537-
}
35383489
case ARMISD::LOOP_DEC: {
35393490
SDValue Ops[] = { N->getOperand(1),
35403491
N->getOperand(2),

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,8 +1073,6 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
10731073
setOperationAction(ISD::SRA, MVT::i64, Custom);
10741074
setOperationAction(ISD::INTRINSIC_VOID, MVT::Other, Custom);
10751075
setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::i64, Custom);
1076-
setOperationAction(ISD::LOAD, MVT::i64, Custom);
1077-
setOperationAction(ISD::STORE, MVT::i64, Custom);
10781076

10791077
// MVE lowers 64 bit shifts to lsll and lsrl
10801078
// assuming that ISD::SRL and SRA of i64 are already marked custom
@@ -1598,9 +1596,6 @@ const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
15981596

15991597
case ARMISD::PRELOAD: return "ARMISD::PRELOAD";
16001598

1601-
case ARMISD::LDRD: return "ARMISD::LDRD";
1602-
case ARMISD::STRD: return "ARMISD::STRD";
1603-
16041599
case ARMISD::WIN__CHKSTK: return "ARMISD::WIN__CHKSTK";
16051600
case ARMISD::WIN__DBZCHK: return "ARMISD::WIN__DBZCHK";
16061601

@@ -9088,24 +9083,6 @@ static SDValue LowerPredicateLoad(SDValue Op, SelectionDAG &DAG) {
90889083
return DAG.getMergeValues({Pred, Load.getValue(1)}, dl);
90899084
}
90909085

9091-
void ARMTargetLowering::LowerLOAD(SDNode *N, SmallVectorImpl<SDValue> &Results,
9092-
SelectionDAG &DAG) const {
9093-
LoadSDNode *LD = cast<LoadSDNode>(N);
9094-
EVT MemVT = LD->getMemoryVT();
9095-
assert(LD->isUnindexed() && "Loads should be unindexed at this point.");
9096-
9097-
if (MemVT == MVT::i64 && Subtarget->hasV5TEOps() &&
9098-
!Subtarget->isThumb1Only() && LD->isVolatile()) {
9099-
SDLoc dl(N);
9100-
SDValue Result = DAG.getMemIntrinsicNode(
9101-
ARMISD::LDRD, dl, DAG.getVTList({MVT::i32, MVT::i32, MVT::Other}),
9102-
{LD->getChain(), LD->getBasePtr()}, MemVT, LD->getMemOperand());
9103-
SDValue Pair = DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64,
9104-
Result.getValue(0), Result.getValue(1));
9105-
Results.append({Pair, Result.getValue(2)});
9106-
}
9107-
}
9108-
91099086
static SDValue LowerPredicateStore(SDValue Op, SelectionDAG &DAG) {
91109087
StoreSDNode *ST = cast<StoreSDNode>(Op.getNode());
91119088
EVT MemVT = ST->getMemoryVT();
@@ -9135,34 +9112,6 @@ static SDValue LowerPredicateStore(SDValue Op, SelectionDAG &DAG) {
91359112
ST->getMemOperand());
91369113
}
91379114

9138-
static SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG,
9139-
const ARMSubtarget *Subtarget) {
9140-
StoreSDNode *ST = cast<StoreSDNode>(Op.getNode());
9141-
EVT MemVT = ST->getMemoryVT();
9142-
assert(ST->isUnindexed() && "Stores should be unindexed at this point.");
9143-
9144-
if (MemVT == MVT::i64 && Subtarget->hasV5TEOps() &&
9145-
!Subtarget->isThumb1Only() && ST->isVolatile()) {
9146-
SDNode *N = Op.getNode();
9147-
SDLoc dl(N);
9148-
9149-
SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, ST->getValue(),
9150-
DAG.getTargetConstant(0, dl, MVT::i32));
9151-
SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, ST->getValue(),
9152-
DAG.getTargetConstant(1, dl, MVT::i32));
9153-
9154-
return DAG.getMemIntrinsicNode(ARMISD::STRD, dl, DAG.getVTList(MVT::Other),
9155-
{ST->getChain(), Lo, Hi, ST->getBasePtr()},
9156-
MemVT, ST->getMemOperand());
9157-
} else if (Subtarget->hasMVEIntegerOps() &&
9158-
((MemVT == MVT::v4i1 || MemVT == MVT::v8i1 ||
9159-
MemVT == MVT::v16i1))) {
9160-
return LowerPredicateStore(Op, DAG);
9161-
}
9162-
9163-
return SDValue();
9164-
}
9165-
91669115
static bool isZeroVector(SDValue N) {
91679116
return (ISD::isBuildVectorAllZeros(N.getNode()) ||
91689117
(N->getOpcode() == ARMISD::VMOVIMM &&
@@ -9350,7 +9299,7 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
93509299
case ISD::LOAD:
93519300
return LowerPredicateLoad(Op, DAG);
93529301
case ISD::STORE:
9353-
return LowerSTORE(Op, DAG, Subtarget);
9302+
return LowerPredicateStore(Op, DAG);
93549303
case ISD::MLOAD:
93559304
return LowerMLOAD(Op, DAG);
93569305
case ISD::ATOMIC_LOAD:
@@ -9452,9 +9401,7 @@ void ARMTargetLowering::ReplaceNodeResults(SDNode *N,
94529401
case ISD::ABS:
94539402
lowerABS(N, Results, DAG);
94549403
return ;
9455-
case ISD::LOAD:
9456-
LowerLOAD(N, Results, DAG);
9457-
break;
9404+
94589405
}
94599406
if (Res.getNode())
94609407
Results.push_back(Res);

llvm/lib/Target/ARM/ARMISelLowering.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -278,11 +278,7 @@ class VectorType;
278278
VST4_UPD,
279279
VST2LN_UPD,
280280
VST3LN_UPD,
281-
VST4LN_UPD,
282-
283-
// Load/Store of dual registers
284-
LDRD,
285-
STRD
281+
VST4LN_UPD
286282
};
287283

288284
} // end namespace ARMISD
@@ -735,8 +731,6 @@ class VectorType;
735731
SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
736732
void lowerABS(SDNode *N, SmallVectorImpl<SDValue> &Results,
737733
SelectionDAG &DAG) const;
738-
void LowerLOAD(SDNode *N, SmallVectorImpl<SDValue> &Results,
739-
SelectionDAG &DAG) const;
740734

741735
Register getRegisterByName(const char* RegName, LLT VT,
742736
const MachineFunction &MF) const override;

llvm/lib/Target/ARM/ARMInstrInfo.td

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -243,12 +243,6 @@ def ARMqsub8b : SDNode<"ARMISD::QSUB8b", SDT_ARMAnd, []>;
243243
def ARMqadd16b : SDNode<"ARMISD::QADD16b", SDT_ARMAnd, []>;
244244
def ARMqsub16b : SDNode<"ARMISD::QSUB16b", SDT_ARMAnd, []>;
245245

246-
def SDT_ARMldrd : SDTypeProfile<2, 1, [SDTCisVT<0, i32>, SDTCisSameAs<0, 1>, SDTCisPtrTy<2>]>;
247-
def ARMldrd : SDNode<"ARMISD::LDRD", SDT_ARMldrd, [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
248-
249-
def SDT_ARMstrd : SDTypeProfile<0, 3, [SDTCisVT<0, i32>, SDTCisSameAs<0, 1>, SDTCisPtrTy<2>]>;
250-
def ARMstrd : SDNode<"ARMISD::STRD", SDT_ARMstrd, [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
251-
252246
// Vector operations shared between NEON and MVE
253247

254248
def ARMvdup : SDNode<"ARMISD::VDUP", SDTypeProfile<1, 1, [SDTCisVec<0>]>>;
@@ -2701,14 +2695,6 @@ let mayLoad = 1, hasSideEffects = 0, hasExtraDefRegAllocReq = 1 in {
27012695
Requires<[IsARM, HasV5TE]>;
27022696
}
27032697

2704-
let mayLoad = 1, hasSideEffects = 0, hasNoSchedulingInfo = 1 in {
2705-
def LOADDUAL : ARMPseudoInst<(outs GPRPairOp:$Rt), (ins addrmode3:$addr),
2706-
64, IIC_iLoad_d_r, []>,
2707-
Requires<[IsARM, HasV5TE]> {
2708-
let AM = AddrMode3;
2709-
}
2710-
}
2711-
27122698
def LDA : AIldracq<0b00, (outs GPR:$Rt), (ins addr_offset_none:$addr),
27132699
NoItinerary, "lda", "\t$Rt, $addr", []>;
27142700
def LDAB : AIldracq<0b10, (outs GPR:$Rt), (ins addr_offset_none:$addr),
@@ -2984,19 +2970,6 @@ let mayStore = 1, hasSideEffects = 0, hasExtraSrcRegAllocReq = 1 in {
29842970
}
29852971
}
29862972

2987-
let mayStore = 1, hasSideEffects = 0, hasNoSchedulingInfo = 1 in {
2988-
def STOREDUAL : ARMPseudoInst<(outs), (ins GPRPairOp:$Rt, addrmode3:$addr),
2989-
64, IIC_iStore_d_r, []>,
2990-
Requires<[IsARM, HasV5TE]> {
2991-
let AM = AddrMode3;
2992-
}
2993-
}
2994-
2995-
let Predicates = [IsARM, HasV5TE] in {
2996-
def : Pat<(ARMstrd GPR:$Rt, GPR:$Rt2, addrmode3:$addr),
2997-
(STOREDUAL (REG_SEQUENCE GPRPair, GPR:$Rt, gsub_0, GPR:$Rt2, gsub_1), addrmode3:$addr)>;
2998-
}
2999-
30002973
// Indexed stores
30012974
multiclass AI2_stridx<bit isByte, string opc,
30022975
InstrItinClass iii, InstrItinClass iir> {

llvm/lib/Target/ARM/ARMInstrThumb2.td

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,7 @@ def t2am_imm8_offset : MemOperand,
270270

271271
// t2addrmode_imm8s4 := reg +/- (imm8 << 2)
272272
def MemImm8s4OffsetAsmOperand : AsmOperandClass {let Name = "MemImm8s4Offset";}
273-
class T2AddrMode_Imm8s4 : MemOperand,
274-
ComplexPattern<i32, 2, "SelectT2AddrModeImm8<2>", []> {
273+
class T2AddrMode_Imm8s4 : MemOperand {
275274
let EncoderMethod = "getT2AddrModeImm8s4OpValue";
276275
let DecoderMethod = "DecodeT2AddrModeImm8s4";
277276
let ParserMatchClass = MemImm8s4OffsetAsmOperand;
@@ -1449,8 +1448,7 @@ let mayLoad = 1, hasSideEffects = 0, hasExtraDefRegAllocReq = 1 in {
14491448
// Load doubleword
14501449
def t2LDRDi8 : T2Ii8s4<1, 0, 1, (outs rGPR:$Rt, rGPR:$Rt2),
14511450
(ins t2addrmode_imm8s4:$addr),
1452-
IIC_iLoad_d_i, "ldrd", "\t$Rt, $Rt2, $addr", "",
1453-
[(set rGPR:$Rt, rGPR:$Rt2, (ARMldrd t2addrmode_imm8s4:$addr))]>,
1451+
IIC_iLoad_d_i, "ldrd", "\t$Rt, $Rt2, $addr", "", []>,
14541452
Sched<[WriteLd]>;
14551453
} // mayLoad = 1, hasSideEffects = 0, hasExtraDefRegAllocReq = 1
14561454

@@ -1631,8 +1629,7 @@ defm t2STRH:T2I_st<0b01,"strh", IIC_iStore_bh_i, IIC_iStore_bh_si,
16311629
let mayStore = 1, hasSideEffects = 0, hasExtraSrcRegAllocReq = 1 in
16321630
def t2STRDi8 : T2Ii8s4<1, 0, 0, (outs),
16331631
(ins rGPR:$Rt, rGPR:$Rt2, t2addrmode_imm8s4:$addr),
1634-
IIC_iStore_d_r, "strd", "\t$Rt, $Rt2, $addr", "",
1635-
[(ARMstrd rGPR:$Rt, rGPR:$Rt2, t2addrmode_imm8s4:$addr)]>,
1632+
IIC_iStore_d_r, "strd", "\t$Rt, $Rt2, $addr", "", []>,
16361633
Sched<[WriteST]>;
16371634

16381635
// Indexed stores

0 commit comments

Comments
 (0)