Skip to content

Commit 56f7d95

Browse files
andreisfrantmak
authored andcommitted
[Xtensa] Lower ATOMIC_FENCE. Add Atomic Expand pass.
1 parent 5308d4b commit 56f7d95

File tree

5 files changed

+43
-1
lines changed

5 files changed

+43
-1
lines changed

llvm/lib/Target/Xtensa/XtensaISelLowering.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,10 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &tm,
304304

305305
setOperationAction(ISD::TRAP, MVT::Other, Legal);
306306

307+
// to have the best chance and doing something good with fences custom lower
308+
// them
309+
setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Custom);
310+
307311
// Compute derived properties from the register classes
308312
computeRegisterProperties(STI.getRegisterInfo());
309313

@@ -1649,6 +1653,13 @@ SDValue XtensaTargetLowering::LowerShiftRightParts(SDValue Op,
16491653
return DAG.getMergeValues(Ops, DL);
16501654
}
16511655

1656+
SDValue XtensaTargetLowering::LowerATOMIC_FENCE(SDValue Op,
1657+
SelectionDAG &DAG) const {
1658+
SDLoc DL(Op);
1659+
SDValue Chain = Op.getOperand(0);
1660+
return DAG.getNode(XtensaISD::MEMW, DL, MVT::Other, Chain);
1661+
}
1662+
16521663
SDValue XtensaTargetLowering::LowerOperation(SDValue Op,
16531664
SelectionDAG &DAG) const {
16541665
switch (Op.getOpcode()) {
@@ -1688,6 +1699,8 @@ SDValue XtensaTargetLowering::LowerOperation(SDValue Op,
16881699
return LowerVASTART(Op, DAG);
16891700
case ISD::VACOPY:
16901701
return LowerVACOPY(Op, DAG);
1702+
case ISD::ATOMIC_FENCE:
1703+
return LowerATOMIC_FENCE(Op, DAG);
16911704
case ISD::SHL_PARTS:
16921705
return LowerShiftLeftParts(Op, DAG);
16931706
case ISD::SRA_PARTS:
@@ -1725,6 +1738,7 @@ const char *XtensaTargetLowering::getTargetNodeName(unsigned Opcode) const {
17251738
OPCODE(MADD);
17261739
OPCODE(MSUB);
17271740
OPCODE(MOVS);
1741+
OPCODE(MEMW);
17281742
OPCODE(MOVSP);
17291743
OPCODE(RUR);
17301744
OPCODE(SHL);

llvm/lib/Target/Xtensa/XtensaISelLowering.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ enum {
5252
// FP move
5353
MOVS,
5454

55+
MEMW,
56+
5557
MOVSP,
5658

5759
// Wraps a TargetGlobalAddress that should be loaded using PC-relative
@@ -157,6 +159,10 @@ class XtensaTargetLowering : public TargetLowering {
157159
const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
158160
SelectionDAG &DAG) const override;
159161

162+
bool shouldInsertFencesForAtomic(const Instruction *I) const override {
163+
return true;
164+
}
165+
160166
MachineBasicBlock *
161167
EmitInstrWithCustomInserter(MachineInstr &MI,
162168
MachineBasicBlock *BB) const override;
@@ -190,6 +196,8 @@ class XtensaTargetLowering : public TargetLowering {
190196
SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
191197
SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG, bool IsSRA) const;
192198

199+
SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
200+
193201
SDValue getAddrPCRel(SDValue Op, SelectionDAG &DAG) const;
194202

195203
CCAssignFn *CCAssignFnForCall(CallingConv::ID CC, bool IsVarArg) const;

llvm/lib/Target/Xtensa/XtensaInstrInfo.td

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,8 @@ def EXTW : RRR_Inst<0x00, 0x00, 0x00, (outs), (ins),
613613
let t = 0xd;
614614
}
615615

616+
def : Pat<(Xtensa_mem_barrier), (MEMW)>;
617+
616618
//===----------------------------------------------------------------------===//
617619
// Processor control instructions
618620
//===----------------------------------------------------------------------===//
@@ -1484,6 +1486,18 @@ def WITLB: RRR_Inst<0x00, 0x00, 0x05, (outs AR:$t), (ins AR:$s),
14841486
let r = 0x6;
14851487
}
14861488

1489+
//===----------------------------------------------------------------------===//
1490+
// Atomic patterns
1491+
//===----------------------------------------------------------------------===//
1492+
1493+
def : Pat<(i32 (atomic_load_8 addr_ish1:$addr)), (L8UI addr_ish1:$addr)>;
1494+
def : Pat<(i32 (atomic_load_16 addr_ish2:$addr)), (L16UI addr_ish2:$addr)>;
1495+
def : Pat<(i32 (atomic_load_32 addr_ish4:$addr)), (L32I addr_ish4:$addr)>;
1496+
1497+
def : Pat<(atomic_store_8 addr_ish1:$addr, AR:$t), (S8I AR:$t, addr_ish1:$addr)>;
1498+
def : Pat<(atomic_store_16 addr_ish2:$addr, AR:$t), (S16I AR:$t, addr_ish2:$addr)>;
1499+
def : Pat<(atomic_store_32 addr_ish4:$addr, AR:$t), (S32I AR:$t, addr_ish4:$addr)>;
1500+
14871501
//===----------------------------------------------------------------------===//
14881502
// DSP Instructions
14891503
//===----------------------------------------------------------------------===//

llvm/lib/Target/Xtensa/XtensaOperators.td

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def SDT_XtensaSRC : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCi
4040
SDTCisVT<2, i32>]>;
4141
def SDT_XtensaSSL : SDTypeProfile<0, 1, [SDTCisVT<0, i32>]>;
4242
def SDT_XtensaSSR : SDTypeProfile<0, 1, [SDTCisVT<0, i32>]>;
43+
def SDT_XtensaMEMBARRIER : SDTypeProfile<0, 0, []>;
4344
def SDT_XtensaRUR : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVT<1, i32>]>;
4445

4546
//===----------------------------------------------------------------------===//
@@ -98,6 +99,8 @@ def Xtensa_ssr: SDNode<"XtensaISD::SSR", SDT_XtensaSSR, [SDNPOutGlue]>;
9899
def Xtensa_brjt: SDNode<"XtensaISD::BR_JT", SDT_XtensaBrJT, [SDNPHasChain]>;
99100
def Xtensa_callw: SDNode<"XtensaISD::CALLW", SDT_XtensaCall,
100101
[SDNPHasChain, SDNPOutGlue, SDNPOptInGlue, SDNPVariadic]>;
102+
def Xtensa_mem_barrier: SDNode<"XtensaISD::MEMW", SDT_XtensaMEMBARRIER,
103+
[SDNPHasChain, SDNPSideEffect]>;
101104

102105
def Xtensa_rur: SDNode<"XtensaISD::RUR", SDT_XtensaRUR,
103-
[SDNPInGlue]>;
106+
[SDNPInGlue]>;

llvm/lib/Target/Xtensa/XtensaTargetMachine.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class XtensaPassConfig : public TargetPassConfig {
8282
return getTM<XtensaTargetMachine>();
8383
}
8484

85+
void addIRPasses() override;
8586
bool addInstSelector() override;
8687
void addPreEmitPass() override;
8788
};
@@ -92,6 +93,8 @@ bool XtensaPassConfig::addInstSelector() {
9293
return false;
9394
}
9495

96+
void XtensaPassConfig::addIRPasses() { addPass(createAtomicExpandPass()); }
97+
9598
void XtensaPassConfig::addPreEmitPass() {
9699
addPass(createXtensaSizeReductionPass());
97100
addPass(&BranchRelaxationPassID);

0 commit comments

Comments
 (0)