Skip to content

Commit 553b2a9

Browse files
committed
[RISCV] Add additional fence for amocas when required by recent ABI change
A recent atomics ABI change / fix requiresthat for the "A6C" and A6S" atomics ABIs (i.e. both of those supported by LLVM currently), an additional fence is inserted for an atomic_compare_exchange with seq_cst failure ordering. <riscv-non-isa/riscv-elf-psabi-doc#445> This isn't trivial to support through the hooks used by AtomicExpandPass because that pass assumes that when fences are inserted, the original atomics ordering information can be removed from the instruction. Rather than try to change and complicate that API, this patch implements the needed fence insertion in RISCVCodeGenPrepare.
1 parent d72c8b0 commit 553b2a9

File tree

6 files changed

+55
-0
lines changed

6 files changed

+55
-0
lines changed

llvm/lib/Target/RISCV/RISCVCodeGenPrepare.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
// It munges the code in the input function to better prepare it for
1111
// SelectionDAG-based code generation. This works around limitations in it's
1212
// basic-block-at-a-time approach.
13+
// It additionally implements a fence insertion for an atomic cmpxchg in a
14+
// case that isn't easy to do with the current AtomicExpandPass hooks API.
1315
//
1416
//===----------------------------------------------------------------------===//
1517

@@ -59,6 +61,7 @@ class RISCVCodeGenPrepare : public FunctionPass,
5961
bool visitAnd(BinaryOperator &BO);
6062
bool visitIntrinsicInst(IntrinsicInst &I);
6163
bool expandVPStrideLoad(IntrinsicInst &I);
64+
bool visitAtomicCmpXchgInst(AtomicCmpXchgInst &I);
6265
};
6366

6467
} // end anonymous namespace
@@ -212,6 +215,19 @@ bool RISCVCodeGenPrepare::expandVPStrideLoad(IntrinsicInst &II) {
212215
return true;
213216
}
214217

218+
// Insert a leading fence (needed for broadest atomics ABI compatibility)
219+
// only if the Zacas extension is enabled and the AtomicCmpXchgInst has a
220+
// SequentiallyConsistent failure ordering.
221+
bool RISCVCodeGenPrepare::visitAtomicCmpXchgInst(AtomicCmpXchgInst &I) {
222+
IRBuilder<> Builder(&I);
223+
if (!ST->hasStdExtZacas() ||
224+
I.getFailureOrdering() != AtomicOrdering::SequentiallyConsistent)
225+
return false;
226+
227+
Builder.CreateFence(AtomicOrdering::SequentiallyConsistent);
228+
return true;
229+
}
230+
215231
bool RISCVCodeGenPrepare::runOnFunction(Function &F) {
216232
if (skipFunction(F))
217233
return false;

llvm/lib/Target/RISCV/RISCVISelLowering.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,10 @@ class RISCVTargetLowering : public TargetLowering {
680680

681681
bool preferZeroCompareBranch() const override { return true; }
682682

683+
// Note that one specific case requires fence insertion for an
684+
// AtomicCmpXchgInst but is handled via RISCVCodeGenPrepare rather than this
685+
// hook due to limitations in the interface here (see RISCVCodeGenPrepare
686+
// for more information).
683687
bool shouldInsertFencesForAtomic(const Instruction *I) const override {
684688
return isa<LoadInst>(I) || isa<StoreInst>(I);
685689
}

llvm/test/CodeGen/RISCV/atomic-cmpxchg-branch-on-result.ll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ define void @cmpxchg_and_branch1(ptr %ptr, i32 signext %cmp, i32 signext %val) n
3636
; ZACAS: # %bb.0: # %entry
3737
; ZACAS-NEXT: .LBB0_1: # %do_cmpxchg
3838
; ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
39+
; ZACAS-NEXT: fence rw, rw
3940
; ZACAS-NEXT: mv a3, a1
4041
; ZACAS-NEXT: amocas.w.aqrl a3, a2, (a0)
4142
; ZACAS-NEXT: bne a3, a1, .LBB0_1
@@ -76,6 +77,7 @@ define void @cmpxchg_and_branch2(ptr %ptr, i32 signext %cmp, i32 signext %val) n
7677
; ZACAS: # %bb.0: # %entry
7778
; ZACAS-NEXT: .LBB1_1: # %do_cmpxchg
7879
; ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
80+
; ZACAS-NEXT: fence rw, rw
7981
; ZACAS-NEXT: mv a3, a1
8082
; ZACAS-NEXT: amocas.w.aqrl a3, a2, (a0)
8183
; ZACAS-NEXT: beq a3, a1, .LBB1_1
@@ -216,6 +218,7 @@ define void @cmpxchg_masked_and_branch1(ptr %ptr, i8 signext %cmp, i8 signext %v
216218
; RV64IA-ZABHA: # %bb.0: # %entry
217219
; RV64IA-ZABHA-NEXT: .LBB2_1: # %do_cmpxchg
218220
; RV64IA-ZABHA-NEXT: # =>This Inner Loop Header: Depth=1
221+
; RV64IA-ZABHA-NEXT: fence rw, rw
219222
; RV64IA-ZABHA-NEXT: mv a3, a1
220223
; RV64IA-ZABHA-NEXT: amocas.b.aqrl a3, a2, (a0)
221224
; RV64IA-ZABHA-NEXT: bne a3, a1, .LBB2_1
@@ -368,6 +371,7 @@ define void @cmpxchg_masked_and_branch2(ptr %ptr, i8 signext %cmp, i8 signext %v
368371
; RV64IA-ZABHA: # %bb.0: # %entry
369372
; RV64IA-ZABHA-NEXT: .LBB3_1: # %do_cmpxchg
370373
; RV64IA-ZABHA-NEXT: # =>This Inner Loop Header: Depth=1
374+
; RV64IA-ZABHA-NEXT: fence rw, rw
371375
; RV64IA-ZABHA-NEXT: mv a3, a1
372376
; RV64IA-ZABHA-NEXT: amocas.b.aqrl a3, a2, (a0)
373377
; RV64IA-ZABHA-NEXT: beq a3, a1, .LBB3_1
@@ -408,6 +412,7 @@ define void @cmpxchg_and_irrelevant_branch(ptr %ptr, i32 signext %cmp, i32 signe
408412
; ZACAS: # %bb.0: # %entry
409413
; ZACAS-NEXT: .LBB4_1: # %do_cmpxchg
410414
; ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
415+
; ZACAS-NEXT: fence rw, rw
411416
; ZACAS-NEXT: mv a4, a1
412417
; ZACAS-NEXT: amocas.w.aqrl a4, a2, (a0)
413418
; ZACAS-NEXT: beqz a3, .LBB4_1

llvm/test/CodeGen/RISCV/atomic-cmpxchg.ll

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,6 +1857,7 @@ define void @cmpxchg_i8_seq_cst_seq_cst(ptr %ptr, i8 %cmp, i8 %val) nounwind {
18571857
;
18581858
; RV64IA-WMO-ZABHA-LABEL: cmpxchg_i8_seq_cst_seq_cst:
18591859
; RV64IA-WMO-ZABHA: # %bb.0:
1860+
; RV64IA-WMO-ZABHA-NEXT: fence rw, rw
18601861
; RV64IA-WMO-ZABHA-NEXT: amocas.b.aqrl a1, a2, (a0)
18611862
; RV64IA-WMO-ZABHA-NEXT: ret
18621863
;
@@ -1885,6 +1886,7 @@ define void @cmpxchg_i8_seq_cst_seq_cst(ptr %ptr, i8 %cmp, i8 %val) nounwind {
18851886
;
18861887
; RV64IA-TSO-ZABHA-LABEL: cmpxchg_i8_seq_cst_seq_cst:
18871888
; RV64IA-TSO-ZABHA: # %bb.0:
1889+
; RV64IA-TSO-ZABHA-NEXT: fence rw, rw
18881890
; RV64IA-TSO-ZABHA-NEXT: amocas.b a1, a2, (a0)
18891891
; RV64IA-TSO-ZABHA-NEXT: ret
18901892
%res = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst seq_cst
@@ -3787,6 +3789,7 @@ define void @cmpxchg_i16_seq_cst_seq_cst(ptr %ptr, i16 %cmp, i16 %val) nounwind
37873789
;
37883790
; RV64IA-WMO-ZABHA-LABEL: cmpxchg_i16_seq_cst_seq_cst:
37893791
; RV64IA-WMO-ZABHA: # %bb.0:
3792+
; RV64IA-WMO-ZABHA-NEXT: fence rw, rw
37903793
; RV64IA-WMO-ZABHA-NEXT: amocas.h.aqrl a1, a2, (a0)
37913794
; RV64IA-WMO-ZABHA-NEXT: ret
37923795
;
@@ -3816,6 +3819,7 @@ define void @cmpxchg_i16_seq_cst_seq_cst(ptr %ptr, i16 %cmp, i16 %val) nounwind
38163819
;
38173820
; RV64IA-TSO-ZABHA-LABEL: cmpxchg_i16_seq_cst_seq_cst:
38183821
; RV64IA-TSO-ZABHA: # %bb.0:
3822+
; RV64IA-TSO-ZABHA-NEXT: fence rw, rw
38193823
; RV64IA-TSO-ZABHA-NEXT: amocas.h a1, a2, (a0)
38203824
; RV64IA-TSO-ZABHA-NEXT: ret
38213825
%res = cmpxchg ptr %ptr, i16 %cmp, i16 %val seq_cst seq_cst
@@ -4788,6 +4792,7 @@ define void @cmpxchg_i32_seq_cst_seq_cst(ptr %ptr, i32 %cmp, i32 %val) nounwind
47884792
;
47894793
; RV32IA-WMO-ZACAS-LABEL: cmpxchg_i32_seq_cst_seq_cst:
47904794
; RV32IA-WMO-ZACAS: # %bb.0:
4795+
; RV32IA-WMO-ZACAS-NEXT: fence rw, rw
47914796
; RV32IA-WMO-ZACAS-NEXT: amocas.w.aqrl a1, a2, (a0)
47924797
; RV32IA-WMO-ZACAS-NEXT: ret
47934798
;
@@ -4804,6 +4809,7 @@ define void @cmpxchg_i32_seq_cst_seq_cst(ptr %ptr, i32 %cmp, i32 %val) nounwind
48044809
;
48054810
; RV32IA-TSO-ZACAS-LABEL: cmpxchg_i32_seq_cst_seq_cst:
48064811
; RV32IA-TSO-ZACAS: # %bb.0:
4812+
; RV32IA-TSO-ZACAS-NEXT: fence rw, rw
48074813
; RV32IA-TSO-ZACAS-NEXT: amocas.w a1, a2, (a0)
48084814
; RV32IA-TSO-ZACAS-NEXT: ret
48094815
;
@@ -4834,11 +4840,13 @@ define void @cmpxchg_i32_seq_cst_seq_cst(ptr %ptr, i32 %cmp, i32 %val) nounwind
48344840
;
48354841
; RV64IA-WMO-ZACAS-LABEL: cmpxchg_i32_seq_cst_seq_cst:
48364842
; RV64IA-WMO-ZACAS: # %bb.0:
4843+
; RV64IA-WMO-ZACAS-NEXT: fence rw, rw
48374844
; RV64IA-WMO-ZACAS-NEXT: amocas.w.aqrl a1, a2, (a0)
48384845
; RV64IA-WMO-ZACAS-NEXT: ret
48394846
;
48404847
; RV64IA-WMO-ZABHA-LABEL: cmpxchg_i32_seq_cst_seq_cst:
48414848
; RV64IA-WMO-ZABHA: # %bb.0:
4849+
; RV64IA-WMO-ZABHA-NEXT: fence rw, rw
48424850
; RV64IA-WMO-ZABHA-NEXT: amocas.w.aqrl a1, a2, (a0)
48434851
; RV64IA-WMO-ZABHA-NEXT: ret
48444852
;
@@ -4856,11 +4864,13 @@ define void @cmpxchg_i32_seq_cst_seq_cst(ptr %ptr, i32 %cmp, i32 %val) nounwind
48564864
;
48574865
; RV64IA-TSO-ZACAS-LABEL: cmpxchg_i32_seq_cst_seq_cst:
48584866
; RV64IA-TSO-ZACAS: # %bb.0:
4867+
; RV64IA-TSO-ZACAS-NEXT: fence rw, rw
48594868
; RV64IA-TSO-ZACAS-NEXT: amocas.w a1, a2, (a0)
48604869
; RV64IA-TSO-ZACAS-NEXT: ret
48614870
;
48624871
; RV64IA-TSO-ZABHA-LABEL: cmpxchg_i32_seq_cst_seq_cst:
48634872
; RV64IA-TSO-ZABHA: # %bb.0:
4873+
; RV64IA-TSO-ZABHA-NEXT: fence rw, rw
48644874
; RV64IA-TSO-ZABHA-NEXT: amocas.w a1, a2, (a0)
48654875
; RV64IA-TSO-ZABHA-NEXT: ret
48664876
%res = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst seq_cst
@@ -5753,11 +5763,13 @@ define void @cmpxchg_i64_seq_cst_seq_cst(ptr %ptr, i64 %cmp, i64 %val) nounwind
57535763
;
57545764
; RV64IA-WMO-ZACAS-LABEL: cmpxchg_i64_seq_cst_seq_cst:
57555765
; RV64IA-WMO-ZACAS: # %bb.0:
5766+
; RV64IA-WMO-ZACAS-NEXT: fence rw, rw
57565767
; RV64IA-WMO-ZACAS-NEXT: amocas.d.aqrl a1, a2, (a0)
57575768
; RV64IA-WMO-ZACAS-NEXT: ret
57585769
;
57595770
; RV64IA-WMO-ZABHA-LABEL: cmpxchg_i64_seq_cst_seq_cst:
57605771
; RV64IA-WMO-ZABHA: # %bb.0:
5772+
; RV64IA-WMO-ZABHA-NEXT: fence rw, rw
57615773
; RV64IA-WMO-ZABHA-NEXT: amocas.d.aqrl a1, a2, (a0)
57625774
; RV64IA-WMO-ZABHA-NEXT: ret
57635775
;
@@ -5774,11 +5786,13 @@ define void @cmpxchg_i64_seq_cst_seq_cst(ptr %ptr, i64 %cmp, i64 %val) nounwind
57745786
;
57755787
; RV64IA-TSO-ZACAS-LABEL: cmpxchg_i64_seq_cst_seq_cst:
57765788
; RV64IA-TSO-ZACAS: # %bb.0:
5789+
; RV64IA-TSO-ZACAS-NEXT: fence rw, rw
57775790
; RV64IA-TSO-ZACAS-NEXT: amocas.d a1, a2, (a0)
57785791
; RV64IA-TSO-ZACAS-NEXT: ret
57795792
;
57805793
; RV64IA-TSO-ZABHA-LABEL: cmpxchg_i64_seq_cst_seq_cst:
57815794
; RV64IA-TSO-ZABHA: # %bb.0:
5795+
; RV64IA-TSO-ZABHA-NEXT: fence rw, rw
57825796
; RV64IA-TSO-ZABHA-NEXT: amocas.d a1, a2, (a0)
57835797
; RV64IA-TSO-ZABHA-NEXT: ret
57845798
%res = cmpxchg ptr %ptr, i64 %cmp, i64 %val seq_cst seq_cst

llvm/test/CodeGen/RISCV/atomic-rmw.ll

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4437,6 +4437,7 @@ define i8 @atomicrmw_nand_i8_seq_cst(ptr %a, i8 %b) nounwind {
44374437
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
44384438
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
44394439
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
4440+
; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw
44404441
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
44414442
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.aqrl a0, a3, (a2)
44424443
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
@@ -4452,6 +4453,7 @@ define i8 @atomicrmw_nand_i8_seq_cst(ptr %a, i8 %b) nounwind {
44524453
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
44534454
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
44544455
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
4456+
; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw
44554457
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
44564458
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2)
44574459
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
@@ -14410,6 +14412,7 @@ define i16 @atomicrmw_nand_i16_seq_cst(ptr %a, i16 %b) nounwind {
1441014412
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
1441114413
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
1441214414
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
14415+
; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw
1441314416
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
1441414417
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.aqrl a0, a3, (a2)
1441514418
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
@@ -14425,6 +14428,7 @@ define i16 @atomicrmw_nand_i16_seq_cst(ptr %a, i16 %b) nounwind {
1442514428
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
1442614429
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
1442714430
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
14431+
; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw
1442814432
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
1442914433
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2)
1443014434
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
@@ -21637,6 +21641,7 @@ define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
2163721641
; RV32IA-WMO-ZACAS-NEXT: mv a3, a0
2163821642
; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1
2163921643
; RV32IA-WMO-ZACAS-NEXT: not a4, a4
21644+
; RV32IA-WMO-ZACAS-NEXT: fence rw, rw
2164021645
; RV32IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
2164121646
; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB154_1
2164221647
; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -21651,6 +21656,7 @@ define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
2165121656
; RV32IA-TSO-ZACAS-NEXT: mv a3, a0
2165221657
; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1
2165321658
; RV32IA-TSO-ZACAS-NEXT: not a4, a4
21659+
; RV32IA-TSO-ZACAS-NEXT: fence rw, rw
2165421660
; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
2165521661
; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB154_1
2165621662
; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -21665,6 +21671,7 @@ define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
2166521671
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
2166621672
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
2166721673
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
21674+
; RV64IA-WMO-ZACAS-NEXT: fence rw, rw
2166821675
; RV64IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
2166921676
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB154_1
2167021677
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -21679,6 +21686,7 @@ define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
2167921686
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
2168021687
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
2168121688
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
21689+
; RV64IA-TSO-ZACAS-NEXT: fence rw, rw
2168221690
; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
2168321691
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB154_1
2168421692
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -21717,6 +21725,7 @@ define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
2171721725
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
2171821726
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
2171921727
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
21728+
; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw
2172021729
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
2172121730
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB154_1
2172221731
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -21731,6 +21740,7 @@ define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
2173121740
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
2173221741
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
2173321742
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
21743+
; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw
2173421744
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2)
2173521745
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB154_1
2173621746
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -25546,6 +25556,7 @@ define i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind {
2554625556
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
2554725557
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
2554825558
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
25559+
; RV64IA-WMO-ZACAS-NEXT: fence rw, rw
2554925560
; RV64IA-WMO-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2)
2555025561
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB209_1
2555125562
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -25560,6 +25571,7 @@ define i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind {
2556025571
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
2556125572
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
2556225573
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
25574+
; RV64IA-TSO-ZACAS-NEXT: fence rw, rw
2556325575
; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2)
2556425576
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB209_1
2556525577
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -25598,6 +25610,7 @@ define i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind {
2559825610
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
2559925611
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
2560025612
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
25613+
; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw
2560125614
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2)
2560225615
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB209_1
2560325616
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
@@ -25612,6 +25625,7 @@ define i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind {
2561225625
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
2561325626
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
2561425627
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
25628+
; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw
2561525629
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2)
2561625630
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB209_1
2561725631
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end

llvm/test/CodeGen/RISCV/atomic-signext.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5562,6 +5562,7 @@ define signext i32 @cmpxchg_i32_monotonic_crossbb(ptr %ptr, i32 signext %cmp, i3
55625562
; RV32IA-ZACAS: # %bb.0:
55635563
; RV32IA-ZACAS-NEXT: beqz a3, .LBB64_2
55645564
; RV32IA-ZACAS-NEXT: # %bb.1: # %then
5565+
; RV32IA-ZACAS-NEXT: fence rw, rw
55655566
; RV32IA-ZACAS-NEXT: amocas.w.aqrl a1, a2, (a0)
55665567
; RV32IA-ZACAS-NEXT: mv a0, a1
55675568
; RV32IA-ZACAS-NEXT: ret
@@ -5612,6 +5613,7 @@ define signext i32 @cmpxchg_i32_monotonic_crossbb(ptr %ptr, i32 signext %cmp, i3
56125613
; RV64IA-ZACAS: # %bb.0:
56135614
; RV64IA-ZACAS-NEXT: beqz a3, .LBB64_2
56145615
; RV64IA-ZACAS-NEXT: # %bb.1: # %then
5616+
; RV64IA-ZACAS-NEXT: fence rw, rw
56155617
; RV64IA-ZACAS-NEXT: amocas.w.aqrl a1, a2, (a0)
56165618
; RV64IA-ZACAS-NEXT: mv a0, a1
56175619
; RV64IA-ZACAS-NEXT: ret

0 commit comments

Comments
 (0)