Skip to content

Commit 961c4b9

Browse files
committed
scq work with ld-seq-sa
1 parent 8abca09 commit 961c4b9

File tree

2 files changed

+113
-57
lines changed

2 files changed

+113
-57
lines changed

llvm/lib/Target/LoongArch/LoongArchExpandAtomicPseudoInsts.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,8 @@ bool LoongArchExpandAtomicPseudo::expandAtomicCmpXchg128(
697697

698698
// .tail:
699699
// dbar 0x700 | acquire
700-
BuildMI(TailMBB, DL, TII->get(LoongArch::DBAR)).addImm(hint);
700+
if (!(hint == 0x700 && MF->getSubtarget<LoongArchSubtarget>().hasLD_SEQ_SA()))
701+
BuildMI(TailMBB, DL, TII->get(LoongArch::DBAR)).addImm(hint);
701702

702703
NextMBBI = MBB.end();
703704
MI.eraseFromParent();

llvm/test/CodeGen/LoongArch/ir-instruction/atomic-cmpxchg-128.ll

Lines changed: 111 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc --mtriple=loongarch64 -mattr=+d,-scq < %s | FileCheck %s --check-prefix=LA64
3-
; RUN: llc --mtriple=loongarch64 -mattr=+d,+scq < %s | FileCheck %s --check-prefix=LA64-SCQ
2+
; RUN: llc --mtriple=loongarch64 -mattr=+d,-scq,-ld-seq-sa < %s | FileCheck %s --check-prefix=LA64
3+
; RUN: llc --mtriple=loongarch64 -mattr=+d,+scq,-ld-seq-sa < %s | FileCheck %s --check-prefixes=LA64-SCQ,NO-LD-SEQ-SA
4+
; RUN: llc --mtriple=loongarch64 -mattr=+d,+scq,+ld-seq-sa < %s | FileCheck %s --check-prefixes=LA64-SCQ,LD-SEQ-SA
45

56
define void @cmpxchg_i128_acquire_acquire(ptr %ptr, i128 %cmp, i128 %val) nounwind {
67
; LA64-LABEL: cmpxchg_i128_acquire_acquire:
@@ -182,22 +183,38 @@ define void @cmpxchg_i128_monotonic_monotonic(ptr %ptr, i128 %cmp, i128 %val) no
182183
; LA64-NEXT: addi.d $sp, $sp, 32
183184
; LA64-NEXT: ret
184185
;
185-
; LA64-SCQ-LABEL: cmpxchg_i128_monotonic_monotonic:
186-
; LA64-SCQ: # %bb.0:
187-
; LA64-SCQ-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1
188-
; LA64-SCQ-NEXT: ll.d $a5, $a0, 0
189-
; LA64-SCQ-NEXT: ld.d $a6, $a0, 8
190-
; LA64-SCQ-NEXT: bne $a5, $a1, .LBB4_3
191-
; LA64-SCQ-NEXT: bne $a6, $a2, .LBB4_3
192-
; LA64-SCQ-NEXT: # %bb.2: # in Loop: Header=BB4_1 Depth=1
193-
; LA64-SCQ-NEXT: move $a7, $a3
194-
; LA64-SCQ-NEXT: sc.q $a7, $a4, $a0
195-
; LA64-SCQ-NEXT: beqz $a7, .LBB4_1
196-
; LA64-SCQ-NEXT: b .LBB4_4
197-
; LA64-SCQ-NEXT: .LBB4_3:
198-
; LA64-SCQ-NEXT: dbar 1792
199-
; LA64-SCQ-NEXT: .LBB4_4:
200-
; LA64-SCQ-NEXT: ret
186+
; NO-LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic:
187+
; NO-LD-SEQ-SA: # %bb.0:
188+
; NO-LD-SEQ-SA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1
189+
; NO-LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0
190+
; NO-LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8
191+
; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB4_3
192+
; NO-LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB4_3
193+
; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB4_1 Depth=1
194+
; NO-LD-SEQ-SA-NEXT: move $a7, $a3
195+
; NO-LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0
196+
; NO-LD-SEQ-SA-NEXT: beqz $a7, .LBB4_1
197+
; NO-LD-SEQ-SA-NEXT: b .LBB4_4
198+
; NO-LD-SEQ-SA-NEXT: .LBB4_3:
199+
; NO-LD-SEQ-SA-NEXT: dbar 1792
200+
; NO-LD-SEQ-SA-NEXT: .LBB4_4:
201+
; NO-LD-SEQ-SA-NEXT: ret
202+
;
203+
; LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic:
204+
; LD-SEQ-SA: # %bb.0:
205+
; LD-SEQ-SA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1
206+
; LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0
207+
; LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8
208+
; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB4_3
209+
; LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB4_3
210+
; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB4_1 Depth=1
211+
; LD-SEQ-SA-NEXT: move $a7, $a3
212+
; LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0
213+
; LD-SEQ-SA-NEXT: beqz $a7, .LBB4_1
214+
; LD-SEQ-SA-NEXT: b .LBB4_4
215+
; LD-SEQ-SA-NEXT: .LBB4_3:
216+
; LD-SEQ-SA-NEXT: .LBB4_4:
217+
; LD-SEQ-SA-NEXT: ret
201218
%res = cmpxchg ptr %ptr, i128 %cmp, i128 %val monotonic monotonic
202219
ret void
203220
}
@@ -221,24 +238,42 @@ define i128 @cmpxchg_i128_monotonic_monotonic_reti128(ptr %ptr, i128 %cmp, i128
221238
; LA64-NEXT: addi.d $sp, $sp, 32
222239
; LA64-NEXT: ret
223240
;
224-
; LA64-SCQ-LABEL: cmpxchg_i128_monotonic_monotonic_reti128:
225-
; LA64-SCQ: # %bb.0:
226-
; LA64-SCQ-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1
227-
; LA64-SCQ-NEXT: ll.d $a5, $a0, 0
228-
; LA64-SCQ-NEXT: ld.d $a6, $a0, 8
229-
; LA64-SCQ-NEXT: bne $a5, $a1, .LBB5_3
230-
; LA64-SCQ-NEXT: bne $a6, $a2, .LBB5_3
231-
; LA64-SCQ-NEXT: # %bb.2: # in Loop: Header=BB5_1 Depth=1
232-
; LA64-SCQ-NEXT: move $a7, $a3
233-
; LA64-SCQ-NEXT: sc.q $a7, $a4, $a0
234-
; LA64-SCQ-NEXT: beqz $a7, .LBB5_1
235-
; LA64-SCQ-NEXT: b .LBB5_4
236-
; LA64-SCQ-NEXT: .LBB5_3:
237-
; LA64-SCQ-NEXT: dbar 1792
238-
; LA64-SCQ-NEXT: .LBB5_4:
239-
; LA64-SCQ-NEXT: move $a0, $a5
240-
; LA64-SCQ-NEXT: move $a1, $a6
241-
; LA64-SCQ-NEXT: ret
241+
; NO-LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic_reti128:
242+
; NO-LD-SEQ-SA: # %bb.0:
243+
; NO-LD-SEQ-SA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1
244+
; NO-LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0
245+
; NO-LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8
246+
; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB5_3
247+
; NO-LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB5_3
248+
; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB5_1 Depth=1
249+
; NO-LD-SEQ-SA-NEXT: move $a7, $a3
250+
; NO-LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0
251+
; NO-LD-SEQ-SA-NEXT: beqz $a7, .LBB5_1
252+
; NO-LD-SEQ-SA-NEXT: b .LBB5_4
253+
; NO-LD-SEQ-SA-NEXT: .LBB5_3:
254+
; NO-LD-SEQ-SA-NEXT: dbar 1792
255+
; NO-LD-SEQ-SA-NEXT: .LBB5_4:
256+
; NO-LD-SEQ-SA-NEXT: move $a0, $a5
257+
; NO-LD-SEQ-SA-NEXT: move $a1, $a6
258+
; NO-LD-SEQ-SA-NEXT: ret
259+
;
260+
; LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic_reti128:
261+
; LD-SEQ-SA: # %bb.0:
262+
; LD-SEQ-SA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1
263+
; LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0
264+
; LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8
265+
; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB5_3
266+
; LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB5_3
267+
; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB5_1 Depth=1
268+
; LD-SEQ-SA-NEXT: move $a7, $a3
269+
; LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0
270+
; LD-SEQ-SA-NEXT: beqz $a7, .LBB5_1
271+
; LD-SEQ-SA-NEXT: b .LBB5_4
272+
; LD-SEQ-SA-NEXT: .LBB5_3:
273+
; LD-SEQ-SA-NEXT: .LBB5_4:
274+
; LD-SEQ-SA-NEXT: move $a0, $a5
275+
; LD-SEQ-SA-NEXT: move $a1, $a6
276+
; LD-SEQ-SA-NEXT: ret
242277
%tmp = cmpxchg ptr %ptr, i128 %cmp, i128 %val monotonic monotonic
243278
%res = extractvalue { i128, i1 } %tmp, 0
244279
ret i128 %res
@@ -261,26 +296,46 @@ define i1 @cmpxchg_i128_monotonic_monotonic_reti1(ptr %ptr, i128 %cmp, i128 %val
261296
; LA64-NEXT: addi.d $sp, $sp, 32
262297
; LA64-NEXT: ret
263298
;
264-
; LA64-SCQ-LABEL: cmpxchg_i128_monotonic_monotonic_reti1:
265-
; LA64-SCQ: # %bb.0:
266-
; LA64-SCQ-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1
267-
; LA64-SCQ-NEXT: ll.d $a5, $a0, 0
268-
; LA64-SCQ-NEXT: ld.d $a6, $a0, 8
269-
; LA64-SCQ-NEXT: bne $a5, $a1, .LBB6_3
270-
; LA64-SCQ-NEXT: bne $a6, $a2, .LBB6_3
271-
; LA64-SCQ-NEXT: # %bb.2: # in Loop: Header=BB6_1 Depth=1
272-
; LA64-SCQ-NEXT: move $a7, $a3
273-
; LA64-SCQ-NEXT: sc.q $a7, $a4, $a0
274-
; LA64-SCQ-NEXT: beqz $a7, .LBB6_1
275-
; LA64-SCQ-NEXT: b .LBB6_4
276-
; LA64-SCQ-NEXT: .LBB6_3:
277-
; LA64-SCQ-NEXT: dbar 1792
278-
; LA64-SCQ-NEXT: .LBB6_4:
279-
; LA64-SCQ-NEXT: xor $a0, $a6, $a2
280-
; LA64-SCQ-NEXT: xor $a1, $a5, $a1
281-
; LA64-SCQ-NEXT: or $a0, $a1, $a0
282-
; LA64-SCQ-NEXT: sltui $a0, $a0, 1
283-
; LA64-SCQ-NEXT: ret
299+
; NO-LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic_reti1:
300+
; NO-LD-SEQ-SA: # %bb.0:
301+
; NO-LD-SEQ-SA-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1
302+
; NO-LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0
303+
; NO-LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8
304+
; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB6_3
305+
; NO-LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB6_3
306+
; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB6_1 Depth=1
307+
; NO-LD-SEQ-SA-NEXT: move $a7, $a3
308+
; NO-LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0
309+
; NO-LD-SEQ-SA-NEXT: beqz $a7, .LBB6_1
310+
; NO-LD-SEQ-SA-NEXT: b .LBB6_4
311+
; NO-LD-SEQ-SA-NEXT: .LBB6_3:
312+
; NO-LD-SEQ-SA-NEXT: dbar 1792
313+
; NO-LD-SEQ-SA-NEXT: .LBB6_4:
314+
; NO-LD-SEQ-SA-NEXT: xor $a0, $a6, $a2
315+
; NO-LD-SEQ-SA-NEXT: xor $a1, $a5, $a1
316+
; NO-LD-SEQ-SA-NEXT: or $a0, $a1, $a0
317+
; NO-LD-SEQ-SA-NEXT: sltui $a0, $a0, 1
318+
; NO-LD-SEQ-SA-NEXT: ret
319+
;
320+
; LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic_reti1:
321+
; LD-SEQ-SA: # %bb.0:
322+
; LD-SEQ-SA-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1
323+
; LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0
324+
; LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8
325+
; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB6_3
326+
; LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB6_3
327+
; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB6_1 Depth=1
328+
; LD-SEQ-SA-NEXT: move $a7, $a3
329+
; LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0
330+
; LD-SEQ-SA-NEXT: beqz $a7, .LBB6_1
331+
; LD-SEQ-SA-NEXT: b .LBB6_4
332+
; LD-SEQ-SA-NEXT: .LBB6_3:
333+
; LD-SEQ-SA-NEXT: .LBB6_4:
334+
; LD-SEQ-SA-NEXT: xor $a0, $a6, $a2
335+
; LD-SEQ-SA-NEXT: xor $a1, $a5, $a1
336+
; LD-SEQ-SA-NEXT: or $a0, $a1, $a0
337+
; LD-SEQ-SA-NEXT: sltui $a0, $a0, 1
338+
; LD-SEQ-SA-NEXT: ret
284339
%tmp = cmpxchg ptr %ptr, i128 %cmp, i128 %val monotonic monotonic
285340
%res = extractvalue { i128, i1 } %tmp, 1
286341
ret i1 %res

0 commit comments

Comments
 (0)