Skip to content

Commit ec2de74

Browse files
committed
[CSKY] Add atomic expand pass to support atomic operation with libcall
For now, just support atomic operations by libcall. Further, should investigate atomic implementation in CSKY target and codegen with atomic and fence related instructions.
1 parent 586182a commit ec2de74

File tree

7 files changed

+8878
-3
lines changed

7 files changed

+8878
-3
lines changed

llvm/lib/Target/CSKY/CSKYISelLowering.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,7 @@ CSKYTargetLowering::CSKYTargetLowering(const TargetMachine &TM,
104104
setOperationAction(ISD::UDIV, MVT::i32, Expand);
105105
}
106106

107-
if (!Subtarget.has3r2E3r3()) {
108-
setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Expand);
109-
}
107+
setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Expand);
110108

111109
// Float
112110

llvm/lib/Target/CSKY/CSKYTargetMachine.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class CSKYPassConfig : public TargetPassConfig {
9696
return getTM<CSKYTargetMachine>();
9797
}
9898

99+
void addIRPasses() override;
99100
bool addInstSelector() override;
100101
void addPreEmitPass() override;
101102
};
@@ -106,6 +107,11 @@ TargetPassConfig *CSKYTargetMachine::createPassConfig(PassManagerBase &PM) {
106107
return new CSKYPassConfig(*this, PM);
107108
}
108109

110+
void CSKYPassConfig::addIRPasses() {
111+
addPass(createAtomicExpandPass());
112+
TargetPassConfig::addIRPasses();
113+
}
114+
109115
bool CSKYPassConfig::addInstSelector() {
110116
addPass(createCSKYISelDag(getCSKYTargetMachine()));
111117

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=csky -verify-machineinstrs -csky-no-aliases -mattr=+2e3 < %s \
3+
; RUN: | FileCheck -check-prefix=CSKY %s
4+
5+
define i1 @cmpxchg_i32_seq_cst_seq_cst(i32* %ptr, i32 signext %cmp,
6+
i32 signext %val) nounwind {
7+
; CSKY-LABEL: cmpxchg_i32_seq_cst_seq_cst:
8+
; CSKY: # %bb.0: # %entry
9+
; CSKY-NEXT: subi16 sp, sp, 4
10+
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
11+
; CSKY-NEXT: subi16 sp, sp, 8
12+
; CSKY-NEXT: st16.w a1, (sp, 4)
13+
; CSKY-NEXT: movi16 a1, 5
14+
; CSKY-NEXT: st16.w a1, (sp, 0)
15+
; CSKY-NEXT: addi16 a1, sp, 4
16+
; CSKY-NEXT: movi16 a3, 5
17+
; CSKY-NEXT: jsri32 [.LCPI0_0]
18+
; CSKY-NEXT: addi16 sp, sp, 8
19+
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
20+
; CSKY-NEXT: addi16 sp, sp, 4
21+
; CSKY-NEXT: rts16
22+
; CSKY-NEXT: .p2align 1
23+
; CSKY-NEXT: # %bb.1:
24+
; CSKY-NEXT: .p2align 2
25+
; CSKY-NEXT: .LCPI0_0:
26+
; CSKY-NEXT: .long __atomic_compare_exchange_4
27+
;
28+
entry:
29+
%0 = cmpxchg i32* %ptr, i32 %cmp, i32 %val seq_cst seq_cst
30+
%1 = extractvalue { i32, i1 } %0, 1
31+
ret i1 %1
32+
}

0 commit comments

Comments
 (0)