Skip to content

Commit 120922e

Browse files
SixWeiningleecheechen
authored andcommitted
[LoongArch] Override LoongArchTargetLowering::getExtendForAtomicCmpSwapArg (llvm#83656)
This patch aims to solve Firefox issue: https://bugzilla.mozilla.org/show_bug.cgi?id=1882301 Similar to 616289e. Currently LoongArch uses an ll.[wd]/sc.[wd] loop for ATOMIC_CMP_XCHG. Because the comparison in the loop is full-width (i.e. the `bne` instruction), we must sign extend the input comparsion argument. Note that LoongArch ISA manual V1.1 has introduced compare-and-swap instructions. We would change the implementation (return `ANY_EXTEND`) when we support them. (cherry picked from commit 5f058aa) (cherry picked from commit ea6c457) Change-Id: I463e8acf2eebf981bdb9d38da5040b7c2873249f
1 parent 0604fa0 commit 120922e

File tree

5 files changed

+159
-153
lines changed

5 files changed

+159
-153
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4893,3 +4893,8 @@ bool LoongArchTargetLowering::hasAndNotCompare(SDValue Y) const {
48934893

48944894
return !isa<ConstantSDNode>(Y);
48954895
}
4896+
4897+
ISD::NodeType LoongArchTargetLowering::getExtendForAtomicCmpSwapArg() const {
4898+
// TODO: LAMCAS will use amcas{_DB,}.[bhwd] which does not require extension.
4899+
return ISD::SIGN_EXTEND;
4900+
}

llvm/lib/Target/LoongArch/LoongArchISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ class LoongArchTargetLowering : public TargetLowering {
203203
return ISD::SIGN_EXTEND;
204204
}
205205

206+
ISD::NodeType getExtendForAtomicCmpSwapArg() const override;
207+
206208
Register getRegisterByName(const char *RegName, LLT VT,
207209
const MachineFunction &MF) const override;
208210
bool mayBeEmittedAsTailCall(const CallInst *CI) const override;

llvm/test/CodeGen/LoongArch/atomicrmw-uinc-udec-wrap.ll

Lines changed: 57 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,16 @@ define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {
2626
; LA64-NEXT: andi $a5, $a5, 255
2727
; LA64-NEXT: sll.w $a5, $a5, $a0
2828
; LA64-NEXT: and $a6, $a3, $a4
29-
; LA64-NEXT: or $a6, $a6, $a5
29+
; LA64-NEXT: or $a5, $a6, $a5
30+
; LA64-NEXT: addi.w $a6, $a3, 0
3031
; LA64-NEXT: .LBB0_3: # %atomicrmw.start
3132
; LA64-NEXT: # Parent Loop BB0_1 Depth=1
3233
; LA64-NEXT: # => This Inner Loop Header: Depth=2
33-
; LA64-NEXT: ll.w $a5, $a2, 0
34-
; LA64-NEXT: bne $a5, $a3, .LBB0_5
34+
; LA64-NEXT: ll.w $a3, $a2, 0
35+
; LA64-NEXT: bne $a3, $a6, .LBB0_5
3536
; LA64-NEXT: # %bb.4: # %atomicrmw.start
3637
; LA64-NEXT: # in Loop: Header=BB0_3 Depth=2
37-
; LA64-NEXT: move $a7, $a6
38+
; LA64-NEXT: move $a7, $a5
3839
; LA64-NEXT: sc.w $a7, $a2, 0
3940
; LA64-NEXT: beqz $a7, .LBB0_3
4041
; LA64-NEXT: b .LBB0_6
@@ -43,11 +44,9 @@ define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {
4344
; LA64-NEXT: dbar 20
4445
; LA64-NEXT: .LBB0_6: # %atomicrmw.start
4546
; LA64-NEXT: # in Loop: Header=BB0_1 Depth=1
46-
; LA64-NEXT: addi.w $a6, $a3, 0
47-
; LA64-NEXT: move $a3, $a5
48-
; LA64-NEXT: bne $a5, $a6, .LBB0_1
47+
; LA64-NEXT: bne $a3, $a6, .LBB0_1
4948
; LA64-NEXT: # %bb.2: # %atomicrmw.end
50-
; LA64-NEXT: srl.w $a0, $a5, $a0
49+
; LA64-NEXT: srl.w $a0, $a3, $a0
5150
; LA64-NEXT: ret
5251
%result = atomicrmw uinc_wrap ptr %ptr, i8 %val seq_cst
5352
ret i8 %result
@@ -79,15 +78,16 @@ define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {
7978
; LA64-NEXT: bstrpick.d $a5, $a5, 15, 0
8079
; LA64-NEXT: sll.w $a5, $a5, $a0
8180
; LA64-NEXT: and $a6, $a3, $a4
82-
; LA64-NEXT: or $a6, $a6, $a5
81+
; LA64-NEXT: or $a5, $a6, $a5
82+
; LA64-NEXT: addi.w $a6, $a3, 0
8383
; LA64-NEXT: .LBB1_3: # %atomicrmw.start
8484
; LA64-NEXT: # Parent Loop BB1_1 Depth=1
8585
; LA64-NEXT: # => This Inner Loop Header: Depth=2
86-
; LA64-NEXT: ll.w $a5, $a2, 0
87-
; LA64-NEXT: bne $a5, $a3, .LBB1_5
86+
; LA64-NEXT: ll.w $a3, $a2, 0
87+
; LA64-NEXT: bne $a3, $a6, .LBB1_5
8888
; LA64-NEXT: # %bb.4: # %atomicrmw.start
8989
; LA64-NEXT: # in Loop: Header=BB1_3 Depth=2
90-
; LA64-NEXT: move $a7, $a6
90+
; LA64-NEXT: move $a7, $a5
9191
; LA64-NEXT: sc.w $a7, $a2, 0
9292
; LA64-NEXT: beqz $a7, .LBB1_3
9393
; LA64-NEXT: b .LBB1_6
@@ -96,11 +96,9 @@ define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {
9696
; LA64-NEXT: dbar 20
9797
; LA64-NEXT: .LBB1_6: # %atomicrmw.start
9898
; LA64-NEXT: # in Loop: Header=BB1_1 Depth=1
99-
; LA64-NEXT: addi.w $a6, $a3, 0
100-
; LA64-NEXT: move $a3, $a5
101-
; LA64-NEXT: bne $a5, $a6, .LBB1_1
99+
; LA64-NEXT: bne $a3, $a6, .LBB1_1
102100
; LA64-NEXT: # %bb.2: # %atomicrmw.end
103-
; LA64-NEXT: srl.w $a0, $a5, $a0
101+
; LA64-NEXT: srl.w $a0, $a3, $a0
104102
; LA64-NEXT: ret
105103
%result = atomicrmw uinc_wrap ptr %ptr, i16 %val seq_cst
106104
ret i16 %result
@@ -109,37 +107,36 @@ define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {
109107
define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) {
110108
; LA64-LABEL: atomicrmw_uinc_wrap_i32:
111109
; LA64: # %bb.0:
112-
; LA64-NEXT: ld.w $a3, $a0, 0
113-
; LA64-NEXT: addi.w $a2, $a1, 0
110+
; LA64-NEXT: ld.w $a2, $a0, 0
111+
; LA64-NEXT: addi.w $a1, $a1, 0
114112
; LA64-NEXT: .p2align 4, , 16
115113
; LA64-NEXT: .LBB2_1: # %atomicrmw.start
116114
; LA64-NEXT: # =>This Loop Header: Depth=1
117115
; LA64-NEXT: # Child Loop BB2_3 Depth 2
118-
; LA64-NEXT: addi.w $a4, $a3, 0
119-
; LA64-NEXT: sltu $a1, $a4, $a2
120-
; LA64-NEXT: xori $a1, $a1, 1
121-
; LA64-NEXT: addi.d $a5, $a3, 1
122-
; LA64-NEXT: masknez $a5, $a5, $a1
116+
; LA64-NEXT: addi.w $a3, $a2, 0
117+
; LA64-NEXT: sltu $a4, $a3, $a1
118+
; LA64-NEXT: xori $a4, $a4, 1
119+
; LA64-NEXT: addi.d $a2, $a2, 1
120+
; LA64-NEXT: masknez $a4, $a2, $a4
123121
; LA64-NEXT: .LBB2_3: # %atomicrmw.start
124122
; LA64-NEXT: # Parent Loop BB2_1 Depth=1
125123
; LA64-NEXT: # => This Inner Loop Header: Depth=2
126-
; LA64-NEXT: ll.w $a1, $a0, 0
127-
; LA64-NEXT: bne $a1, $a3, .LBB2_5
124+
; LA64-NEXT: ll.w $a2, $a0, 0
125+
; LA64-NEXT: bne $a2, $a3, .LBB2_5
128126
; LA64-NEXT: # %bb.4: # %atomicrmw.start
129127
; LA64-NEXT: # in Loop: Header=BB2_3 Depth=2
130-
; LA64-NEXT: move $a6, $a5
131-
; LA64-NEXT: sc.w $a6, $a0, 0
132-
; LA64-NEXT: beqz $a6, .LBB2_3
128+
; LA64-NEXT: move $a5, $a4
129+
; LA64-NEXT: sc.w $a5, $a0, 0
130+
; LA64-NEXT: beqz $a5, .LBB2_3
133131
; LA64-NEXT: b .LBB2_6
134132
; LA64-NEXT: .LBB2_5: # %atomicrmw.start
135133
; LA64-NEXT: # in Loop: Header=BB2_1 Depth=1
136134
; LA64-NEXT: dbar 20
137135
; LA64-NEXT: .LBB2_6: # %atomicrmw.start
138136
; LA64-NEXT: # in Loop: Header=BB2_1 Depth=1
139-
; LA64-NEXT: move $a3, $a1
140-
; LA64-NEXT: bne $a1, $a4, .LBB2_1
137+
; LA64-NEXT: bne $a2, $a3, .LBB2_1
141138
; LA64-NEXT: # %bb.2: # %atomicrmw.end
142-
; LA64-NEXT: move $a0, $a1
139+
; LA64-NEXT: move $a0, $a2
143140
; LA64-NEXT: ret
144141
%result = atomicrmw uinc_wrap ptr %ptr, i32 %val seq_cst
145142
ret i32 %result
@@ -212,15 +209,16 @@ define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {
212209
; LA64-NEXT: andi $a6, $a6, 255
213210
; LA64-NEXT: sll.w $a6, $a6, $a0
214211
; LA64-NEXT: and $a7, $a3, $a4
215-
; LA64-NEXT: or $a7, $a7, $a6
212+
; LA64-NEXT: or $a6, $a7, $a6
213+
; LA64-NEXT: addi.w $a7, $a3, 0
216214
; LA64-NEXT: .LBB4_3: # %atomicrmw.start
217215
; LA64-NEXT: # Parent Loop BB4_1 Depth=1
218216
; LA64-NEXT: # => This Inner Loop Header: Depth=2
219-
; LA64-NEXT: ll.w $a6, $a2, 0
220-
; LA64-NEXT: bne $a6, $a3, .LBB4_5
217+
; LA64-NEXT: ll.w $a3, $a2, 0
218+
; LA64-NEXT: bne $a3, $a7, .LBB4_5
221219
; LA64-NEXT: # %bb.4: # %atomicrmw.start
222220
; LA64-NEXT: # in Loop: Header=BB4_3 Depth=2
223-
; LA64-NEXT: move $t0, $a7
221+
; LA64-NEXT: move $t0, $a6
224222
; LA64-NEXT: sc.w $t0, $a2, 0
225223
; LA64-NEXT: beqz $t0, .LBB4_3
226224
; LA64-NEXT: b .LBB4_6
@@ -229,11 +227,9 @@ define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {
229227
; LA64-NEXT: dbar 20
230228
; LA64-NEXT: .LBB4_6: # %atomicrmw.start
231229
; LA64-NEXT: # in Loop: Header=BB4_1 Depth=1
232-
; LA64-NEXT: addi.w $a7, $a3, 0
233-
; LA64-NEXT: move $a3, $a6
234-
; LA64-NEXT: bne $a6, $a7, .LBB4_1
230+
; LA64-NEXT: bne $a3, $a7, .LBB4_1
235231
; LA64-NEXT: # %bb.2: # %atomicrmw.end
236-
; LA64-NEXT: srl.w $a0, $a6, $a0
232+
; LA64-NEXT: srl.w $a0, $a3, $a0
237233
; LA64-NEXT: ret
238234
%result = atomicrmw udec_wrap ptr %ptr, i8 %val seq_cst
239235
ret i8 %result
@@ -270,15 +266,16 @@ define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {
270266
; LA64-NEXT: bstrpick.d $a6, $a6, 15, 0
271267
; LA64-NEXT: sll.w $a6, $a6, $a0
272268
; LA64-NEXT: and $a7, $a3, $a4
273-
; LA64-NEXT: or $a7, $a7, $a6
269+
; LA64-NEXT: or $a6, $a7, $a6
270+
; LA64-NEXT: addi.w $a7, $a3, 0
274271
; LA64-NEXT: .LBB5_3: # %atomicrmw.start
275272
; LA64-NEXT: # Parent Loop BB5_1 Depth=1
276273
; LA64-NEXT: # => This Inner Loop Header: Depth=2
277-
; LA64-NEXT: ll.w $a6, $a2, 0
278-
; LA64-NEXT: bne $a6, $a3, .LBB5_5
274+
; LA64-NEXT: ll.w $a3, $a2, 0
275+
; LA64-NEXT: bne $a3, $a7, .LBB5_5
279276
; LA64-NEXT: # %bb.4: # %atomicrmw.start
280277
; LA64-NEXT: # in Loop: Header=BB5_3 Depth=2
281-
; LA64-NEXT: move $t0, $a7
278+
; LA64-NEXT: move $t0, $a6
282279
; LA64-NEXT: sc.w $t0, $a2, 0
283280
; LA64-NEXT: beqz $t0, .LBB5_3
284281
; LA64-NEXT: b .LBB5_6
@@ -287,11 +284,9 @@ define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {
287284
; LA64-NEXT: dbar 20
288285
; LA64-NEXT: .LBB5_6: # %atomicrmw.start
289286
; LA64-NEXT: # in Loop: Header=BB5_1 Depth=1
290-
; LA64-NEXT: addi.w $a7, $a3, 0
291-
; LA64-NEXT: move $a3, $a6
292-
; LA64-NEXT: bne $a6, $a7, .LBB5_1
287+
; LA64-NEXT: bne $a3, $a7, .LBB5_1
293288
; LA64-NEXT: # %bb.2: # %atomicrmw.end
294-
; LA64-NEXT: srl.w $a0, $a6, $a0
289+
; LA64-NEXT: srl.w $a0, $a3, $a0
295290
; LA64-NEXT: ret
296291
%result = atomicrmw udec_wrap ptr %ptr, i16 %val seq_cst
297292
ret i16 %result
@@ -300,40 +295,39 @@ define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {
300295
define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) {
301296
; LA64-LABEL: atomicrmw_udec_wrap_i32:
302297
; LA64: # %bb.0:
303-
; LA64-NEXT: ld.w $a4, $a0, 0
298+
; LA64-NEXT: ld.w $a2, $a0, 0
304299
; LA64-NEXT: addi.w $a3, $a1, 0
305300
; LA64-NEXT: .p2align 4, , 16
306301
; LA64-NEXT: .LBB6_1: # %atomicrmw.start
307302
; LA64-NEXT: # =>This Loop Header: Depth=1
308303
; LA64-NEXT: # Child Loop BB6_3 Depth 2
309-
; LA64-NEXT: addi.w $a5, $a4, 0
310-
; LA64-NEXT: sltu $a2, $a3, $a5
311-
; LA64-NEXT: addi.d $a6, $a4, -1
312-
; LA64-NEXT: masknez $a6, $a6, $a2
313-
; LA64-NEXT: maskeqz $a2, $a1, $a2
314-
; LA64-NEXT: or $a2, $a2, $a6
315-
; LA64-NEXT: sltui $a6, $a5, 1
316-
; LA64-NEXT: masknez $a2, $a2, $a6
317-
; LA64-NEXT: maskeqz $a6, $a1, $a6
318-
; LA64-NEXT: or $a6, $a6, $a2
304+
; LA64-NEXT: addi.w $a4, $a2, 0
305+
; LA64-NEXT: sltu $a5, $a3, $a4
306+
; LA64-NEXT: addi.d $a2, $a2, -1
307+
; LA64-NEXT: masknez $a2, $a2, $a5
308+
; LA64-NEXT: maskeqz $a5, $a1, $a5
309+
; LA64-NEXT: or $a2, $a5, $a2
310+
; LA64-NEXT: sltui $a5, $a4, 1
311+
; LA64-NEXT: masknez $a2, $a2, $a5
312+
; LA64-NEXT: maskeqz $a5, $a1, $a5
313+
; LA64-NEXT: or $a5, $a5, $a2
319314
; LA64-NEXT: .LBB6_3: # %atomicrmw.start
320315
; LA64-NEXT: # Parent Loop BB6_1 Depth=1
321316
; LA64-NEXT: # => This Inner Loop Header: Depth=2
322317
; LA64-NEXT: ll.w $a2, $a0, 0
323318
; LA64-NEXT: bne $a2, $a4, .LBB6_5
324319
; LA64-NEXT: # %bb.4: # %atomicrmw.start
325320
; LA64-NEXT: # in Loop: Header=BB6_3 Depth=2
326-
; LA64-NEXT: move $a7, $a6
327-
; LA64-NEXT: sc.w $a7, $a0, 0
328-
; LA64-NEXT: beqz $a7, .LBB6_3
321+
; LA64-NEXT: move $a6, $a5
322+
; LA64-NEXT: sc.w $a6, $a0, 0
323+
; LA64-NEXT: beqz $a6, .LBB6_3
329324
; LA64-NEXT: b .LBB6_6
330325
; LA64-NEXT: .LBB6_5: # %atomicrmw.start
331326
; LA64-NEXT: # in Loop: Header=BB6_1 Depth=1
332327
; LA64-NEXT: dbar 20
333328
; LA64-NEXT: .LBB6_6: # %atomicrmw.start
334329
; LA64-NEXT: # in Loop: Header=BB6_1 Depth=1
335-
; LA64-NEXT: move $a4, $a2
336-
; LA64-NEXT: bne $a2, $a5, .LBB6_1
330+
; LA64-NEXT: bne $a2, $a4, .LBB6_1
337331
; LA64-NEXT: # %bb.2: # %atomicrmw.end
338332
; LA64-NEXT: move $a0, $a2
339333
; LA64-NEXT: ret

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ define void @cmpxchg_i16_acquire_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind
7171
define void @cmpxchg_i32_acquire_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind {
7272
; LA64-LABEL: cmpxchg_i32_acquire_acquire:
7373
; LA64: # %bb.0:
74+
; LA64-NEXT: addi.w $a1, $a1, 0
7475
; LA64-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
7576
; LA64-NEXT: ll.w $a3, $a0, 0
7677
; LA64-NEXT: bne $a3, $a1, .LBB2_3
@@ -176,6 +177,7 @@ define void @cmpxchg_i16_acquire_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwin
176177
define void @cmpxchg_i32_acquire_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
177178
; LA64-LABEL: cmpxchg_i32_acquire_monotonic:
178179
; LA64: # %bb.0:
180+
; LA64-NEXT: addi.w $a1, $a1, 0
179181
; LA64-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1
180182
; LA64-NEXT: ll.w $a3, $a0, 0
181183
; LA64-NEXT: bne $a3, $a1, .LBB6_3
@@ -285,9 +287,10 @@ define i16 @cmpxchg_i16_acquire_acquire_reti16(ptr %ptr, i16 %cmp, i16 %val) nou
285287
define i32 @cmpxchg_i32_acquire_acquire_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind {
286288
; LA64-LABEL: cmpxchg_i32_acquire_acquire_reti32:
287289
; LA64: # %bb.0:
290+
; LA64-NEXT: addi.w $a3, $a1, 0
288291
; LA64-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1
289-
; LA64-NEXT: ll.w $a3, $a0, 0
290-
; LA64-NEXT: bne $a3, $a1, .LBB10_3
292+
; LA64-NEXT: ll.w $a1, $a0, 0
293+
; LA64-NEXT: bne $a1, $a3, .LBB10_3
291294
; LA64-NEXT: # %bb.2: # in Loop: Header=BB10_1 Depth=1
292295
; LA64-NEXT: move $a4, $a2
293296
; LA64-NEXT: sc.w $a4, $a0, 0
@@ -296,7 +299,7 @@ define i32 @cmpxchg_i32_acquire_acquire_reti32(ptr %ptr, i32 %cmp, i32 %val) nou
296299
; LA64-NEXT: .LBB10_3:
297300
; LA64-NEXT: dbar 20
298301
; LA64-NEXT: .LBB10_4:
299-
; LA64-NEXT: move $a0, $a3
302+
; LA64-NEXT: move $a0, $a1
300303
; LA64-NEXT: ret
301304
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire
302305
%res = extractvalue { i32, i1 } %tmp, 0
@@ -404,6 +407,7 @@ define i1 @cmpxchg_i16_acquire_acquire_reti1(ptr %ptr, i16 %cmp, i16 %val) nounw
404407
define i1 @cmpxchg_i32_acquire_acquire_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind {
405408
; LA64-LABEL: cmpxchg_i32_acquire_acquire_reti1:
406409
; LA64: # %bb.0:
410+
; LA64-NEXT: addi.w $a1, $a1, 0
407411
; LA64-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1
408412
; LA64-NEXT: ll.w $a3, $a0, 0
409413
; LA64-NEXT: bne $a3, $a1, .LBB14_3
@@ -415,8 +419,7 @@ define i1 @cmpxchg_i32_acquire_acquire_reti1(ptr %ptr, i32 %cmp, i32 %val) nounw
415419
; LA64-NEXT: .LBB14_3:
416420
; LA64-NEXT: dbar 20
417421
; LA64-NEXT: .LBB14_4:
418-
; LA64-NEXT: addi.w $a0, $a1, 0
419-
; LA64-NEXT: xor $a0, $a3, $a0
422+
; LA64-NEXT: xor $a0, $a3, $a1
420423
; LA64-NEXT: sltui $a0, $a0, 1
421424
; LA64-NEXT: ret
422425
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire
@@ -516,6 +519,7 @@ define void @cmpxchg_i16_monotonic_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounw
516519
define void @cmpxchg_i32_monotonic_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
517520
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic:
518521
; LA64: # %bb.0:
522+
; LA64-NEXT: addi.w $a1, $a1, 0
519523
; LA64-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
520524
; LA64-NEXT: ll.w $a3, $a0, 0
521525
; LA64-NEXT: bne $a3, $a1, .LBB18_3
@@ -625,9 +629,10 @@ define i16 @cmpxchg_i16_monotonic_monotonic_reti16(ptr %ptr, i16 %cmp, i16 %val)
625629
define i32 @cmpxchg_i32_monotonic_monotonic_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind {
626630
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic_reti32:
627631
; LA64: # %bb.0:
632+
; LA64-NEXT: addi.w $a3, $a1, 0
628633
; LA64-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
629-
; LA64-NEXT: ll.w $a3, $a0, 0
630-
; LA64-NEXT: bne $a3, $a1, .LBB22_3
634+
; LA64-NEXT: ll.w $a1, $a0, 0
635+
; LA64-NEXT: bne $a1, $a3, .LBB22_3
631636
; LA64-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1
632637
; LA64-NEXT: move $a4, $a2
633638
; LA64-NEXT: sc.w $a4, $a0, 0
@@ -636,7 +641,7 @@ define i32 @cmpxchg_i32_monotonic_monotonic_reti32(ptr %ptr, i32 %cmp, i32 %val)
636641
; LA64-NEXT: .LBB22_3:
637642
; LA64-NEXT: dbar 1792
638643
; LA64-NEXT: .LBB22_4:
639-
; LA64-NEXT: move $a0, $a3
644+
; LA64-NEXT: move $a0, $a1
640645
; LA64-NEXT: ret
641646
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
642647
%res = extractvalue { i32, i1 } %tmp, 0
@@ -744,6 +749,7 @@ define i1 @cmpxchg_i16_monotonic_monotonic_reti1(ptr %ptr, i16 %cmp, i16 %val) n
744749
define i1 @cmpxchg_i32_monotonic_monotonic_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind {
745750
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic_reti1:
746751
; LA64: # %bb.0:
752+
; LA64-NEXT: addi.w $a1, $a1, 0
747753
; LA64-NEXT: .LBB26_1: # =>This Inner Loop Header: Depth=1
748754
; LA64-NEXT: ll.w $a3, $a0, 0
749755
; LA64-NEXT: bne $a3, $a1, .LBB26_3
@@ -755,8 +761,7 @@ define i1 @cmpxchg_i32_monotonic_monotonic_reti1(ptr %ptr, i32 %cmp, i32 %val) n
755761
; LA64-NEXT: .LBB26_3:
756762
; LA64-NEXT: dbar 1792
757763
; LA64-NEXT: .LBB26_4:
758-
; LA64-NEXT: addi.w $a0, $a1, 0
759-
; LA64-NEXT: xor $a0, $a3, $a0
764+
; LA64-NEXT: xor $a0, $a3, $a1
760765
; LA64-NEXT: sltui $a0, $a0, 1
761766
; LA64-NEXT: ret
762767
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic

0 commit comments

Comments
 (0)