Skip to content

Commit a169693

Browse files
SixWeiningMingcongBai
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)
1 parent bb9310a commit a169693

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
@@ -4940,3 +4940,8 @@ bool LoongArchTargetLowering::hasAndNotCompare(SDValue Y) const {
49404940

49414941
return !isa<ConstantSDNode>(Y);
49424942
}
4943+
4944+
ISD::NodeType LoongArchTargetLowering::getExtendForAtomicCmpSwapArg() const {
4945+
// TODO: LAMCAS will use amcas{_DB,}.[bhwd] which does not require extension.
4946+
return ISD::SIGN_EXTEND;
4947+
}

llvm/lib/Target/LoongArch/LoongArchISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ class LoongArchTargetLowering : public TargetLowering {
206206
return ISD::SIGN_EXTEND;
207207
}
208208

209+
ISD::NodeType getExtendForAtomicCmpSwapArg() const override;
210+
209211
Register getRegisterByName(const char *RegName, LLT VT,
210212
const MachineFunction &MF) const override;
211213
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
@@ -25,15 +25,16 @@ define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {
2525
; LA64-NEXT: andi $a5, $a5, 255
2626
; LA64-NEXT: sll.w $a5, $a5, $a3
2727
; LA64-NEXT: and $a6, $a2, $a4
28-
; LA64-NEXT: or $a6, $a6, $a5
28+
; LA64-NEXT: or $a5, $a6, $a5
29+
; LA64-NEXT: addi.w $a6, $a2, 0
2930
; LA64-NEXT: .LBB0_3: # %atomicrmw.start
3031
; LA64-NEXT: # Parent Loop BB0_1 Depth=1
3132
; LA64-NEXT: # => This Inner Loop Header: Depth=2
32-
; LA64-NEXT: ll.w $a5, $a0, 0
33-
; LA64-NEXT: bne $a5, $a2, .LBB0_5
33+
; LA64-NEXT: ll.w $a2, $a0, 0
34+
; LA64-NEXT: bne $a2, $a6, .LBB0_5
3435
; LA64-NEXT: # %bb.4: # %atomicrmw.start
3536
; LA64-NEXT: # in Loop: Header=BB0_3 Depth=2
36-
; LA64-NEXT: move $a7, $a6
37+
; LA64-NEXT: move $a7, $a5
3738
; LA64-NEXT: sc.w $a7, $a0, 0
3839
; LA64-NEXT: beqz $a7, .LBB0_3
3940
; LA64-NEXT: b .LBB0_6
@@ -42,11 +43,9 @@ define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {
4243
; LA64-NEXT: dbar 20
4344
; LA64-NEXT: .LBB0_6: # %atomicrmw.start
4445
; LA64-NEXT: # in Loop: Header=BB0_1 Depth=1
45-
; LA64-NEXT: addi.w $a6, $a2, 0
46-
; LA64-NEXT: move $a2, $a5
47-
; LA64-NEXT: bne $a5, $a6, .LBB0_1
46+
; LA64-NEXT: bne $a2, $a6, .LBB0_1
4847
; LA64-NEXT: # %bb.2: # %atomicrmw.end
49-
; LA64-NEXT: srl.w $a0, $a5, $a3
48+
; LA64-NEXT: srl.w $a0, $a2, $a3
5049
; LA64-NEXT: ret
5150
%result = atomicrmw uinc_wrap ptr %ptr, i8 %val seq_cst
5251
ret i8 %result
@@ -77,15 +76,16 @@ define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {
7776
; LA64-NEXT: bstrpick.d $a5, $a5, 15, 0
7877
; LA64-NEXT: sll.w $a5, $a5, $a3
7978
; LA64-NEXT: and $a6, $a2, $a4
80-
; LA64-NEXT: or $a6, $a6, $a5
79+
; LA64-NEXT: or $a5, $a6, $a5
80+
; LA64-NEXT: addi.w $a6, $a2, 0
8181
; LA64-NEXT: .LBB1_3: # %atomicrmw.start
8282
; LA64-NEXT: # Parent Loop BB1_1 Depth=1
8383
; LA64-NEXT: # => This Inner Loop Header: Depth=2
84-
; LA64-NEXT: ll.w $a5, $a0, 0
85-
; LA64-NEXT: bne $a5, $a2, .LBB1_5
84+
; LA64-NEXT: ll.w $a2, $a0, 0
85+
; LA64-NEXT: bne $a2, $a6, .LBB1_5
8686
; LA64-NEXT: # %bb.4: # %atomicrmw.start
8787
; LA64-NEXT: # in Loop: Header=BB1_3 Depth=2
88-
; LA64-NEXT: move $a7, $a6
88+
; LA64-NEXT: move $a7, $a5
8989
; LA64-NEXT: sc.w $a7, $a0, 0
9090
; LA64-NEXT: beqz $a7, .LBB1_3
9191
; LA64-NEXT: b .LBB1_6
@@ -94,11 +94,9 @@ define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {
9494
; LA64-NEXT: dbar 20
9595
; LA64-NEXT: .LBB1_6: # %atomicrmw.start
9696
; LA64-NEXT: # in Loop: Header=BB1_1 Depth=1
97-
; LA64-NEXT: addi.w $a6, $a2, 0
98-
; LA64-NEXT: move $a2, $a5
99-
; LA64-NEXT: bne $a5, $a6, .LBB1_1
97+
; LA64-NEXT: bne $a2, $a6, .LBB1_1
10098
; LA64-NEXT: # %bb.2: # %atomicrmw.end
101-
; LA64-NEXT: srl.w $a0, $a5, $a3
99+
; LA64-NEXT: srl.w $a0, $a2, $a3
102100
; LA64-NEXT: ret
103101
%result = atomicrmw uinc_wrap ptr %ptr, i16 %val seq_cst
104102
ret i16 %result
@@ -107,37 +105,36 @@ define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {
107105
define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) {
108106
; LA64-LABEL: atomicrmw_uinc_wrap_i32:
109107
; LA64: # %bb.0:
110-
; LA64-NEXT: ld.w $a3, $a0, 0
111-
; LA64-NEXT: addi.w $a2, $a1, 0
108+
; LA64-NEXT: ld.w $a2, $a0, 0
109+
; LA64-NEXT: addi.w $a1, $a1, 0
112110
; LA64-NEXT: .p2align 4, , 16
113111
; LA64-NEXT: .LBB2_1: # %atomicrmw.start
114112
; LA64-NEXT: # =>This Loop Header: Depth=1
115113
; LA64-NEXT: # Child Loop BB2_3 Depth 2
116-
; LA64-NEXT: addi.w $a4, $a3, 0
117-
; LA64-NEXT: sltu $a1, $a4, $a2
118-
; LA64-NEXT: xori $a1, $a1, 1
119-
; LA64-NEXT: addi.d $a5, $a3, 1
120-
; LA64-NEXT: masknez $a5, $a5, $a1
114+
; LA64-NEXT: addi.w $a3, $a2, 0
115+
; LA64-NEXT: sltu $a4, $a3, $a1
116+
; LA64-NEXT: xori $a4, $a4, 1
117+
; LA64-NEXT: addi.d $a2, $a2, 1
118+
; LA64-NEXT: masknez $a4, $a2, $a4
121119
; LA64-NEXT: .LBB2_3: # %atomicrmw.start
122120
; LA64-NEXT: # Parent Loop BB2_1 Depth=1
123121
; LA64-NEXT: # => This Inner Loop Header: Depth=2
124-
; LA64-NEXT: ll.w $a1, $a0, 0
125-
; LA64-NEXT: bne $a1, $a3, .LBB2_5
122+
; LA64-NEXT: ll.w $a2, $a0, 0
123+
; LA64-NEXT: bne $a2, $a3, .LBB2_5
126124
; LA64-NEXT: # %bb.4: # %atomicrmw.start
127125
; LA64-NEXT: # in Loop: Header=BB2_3 Depth=2
128-
; LA64-NEXT: move $a6, $a5
129-
; LA64-NEXT: sc.w $a6, $a0, 0
130-
; LA64-NEXT: beqz $a6, .LBB2_3
126+
; LA64-NEXT: move $a5, $a4
127+
; LA64-NEXT: sc.w $a5, $a0, 0
128+
; LA64-NEXT: beqz $a5, .LBB2_3
131129
; LA64-NEXT: b .LBB2_6
132130
; LA64-NEXT: .LBB2_5: # %atomicrmw.start
133131
; LA64-NEXT: # in Loop: Header=BB2_1 Depth=1
134132
; LA64-NEXT: dbar 20
135133
; LA64-NEXT: .LBB2_6: # %atomicrmw.start
136134
; LA64-NEXT: # in Loop: Header=BB2_1 Depth=1
137-
; LA64-NEXT: move $a3, $a1
138-
; LA64-NEXT: bne $a1, $a4, .LBB2_1
135+
; LA64-NEXT: bne $a2, $a3, .LBB2_1
139136
; LA64-NEXT: # %bb.2: # %atomicrmw.end
140-
; LA64-NEXT: move $a0, $a1
137+
; LA64-NEXT: move $a0, $a2
141138
; LA64-NEXT: ret
142139
%result = atomicrmw uinc_wrap ptr %ptr, i32 %val seq_cst
143140
ret i32 %result
@@ -209,15 +206,16 @@ define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {
209206
; LA64-NEXT: andi $a6, $a6, 255
210207
; LA64-NEXT: sll.w $a6, $a6, $a3
211208
; LA64-NEXT: and $a7, $a2, $a4
212-
; LA64-NEXT: or $a7, $a7, $a6
209+
; LA64-NEXT: or $a6, $a7, $a6
210+
; LA64-NEXT: addi.w $a7, $a2, 0
213211
; LA64-NEXT: .LBB4_3: # %atomicrmw.start
214212
; LA64-NEXT: # Parent Loop BB4_1 Depth=1
215213
; LA64-NEXT: # => This Inner Loop Header: Depth=2
216-
; LA64-NEXT: ll.w $a6, $a0, 0
217-
; LA64-NEXT: bne $a6, $a2, .LBB4_5
214+
; LA64-NEXT: ll.w $a2, $a0, 0
215+
; LA64-NEXT: bne $a2, $a7, .LBB4_5
218216
; LA64-NEXT: # %bb.4: # %atomicrmw.start
219217
; LA64-NEXT: # in Loop: Header=BB4_3 Depth=2
220-
; LA64-NEXT: move $t0, $a7
218+
; LA64-NEXT: move $t0, $a6
221219
; LA64-NEXT: sc.w $t0, $a0, 0
222220
; LA64-NEXT: beqz $t0, .LBB4_3
223221
; LA64-NEXT: b .LBB4_6
@@ -226,11 +224,9 @@ define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {
226224
; LA64-NEXT: dbar 20
227225
; LA64-NEXT: .LBB4_6: # %atomicrmw.start
228226
; LA64-NEXT: # in Loop: Header=BB4_1 Depth=1
229-
; LA64-NEXT: addi.w $a7, $a2, 0
230-
; LA64-NEXT: move $a2, $a6
231-
; LA64-NEXT: bne $a6, $a7, .LBB4_1
227+
; LA64-NEXT: bne $a2, $a7, .LBB4_1
232228
; LA64-NEXT: # %bb.2: # %atomicrmw.end
233-
; LA64-NEXT: srl.w $a0, $a6, $a3
229+
; LA64-NEXT: srl.w $a0, $a2, $a3
234230
; LA64-NEXT: ret
235231
%result = atomicrmw udec_wrap ptr %ptr, i8 %val seq_cst
236232
ret i8 %result
@@ -266,15 +262,16 @@ define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {
266262
; LA64-NEXT: bstrpick.d $a6, $a6, 15, 0
267263
; LA64-NEXT: sll.w $a6, $a6, $a3
268264
; LA64-NEXT: and $a7, $a2, $a4
269-
; LA64-NEXT: or $a7, $a7, $a6
265+
; LA64-NEXT: or $a6, $a7, $a6
266+
; LA64-NEXT: addi.w $a7, $a2, 0
270267
; LA64-NEXT: .LBB5_3: # %atomicrmw.start
271268
; LA64-NEXT: # Parent Loop BB5_1 Depth=1
272269
; LA64-NEXT: # => This Inner Loop Header: Depth=2
273-
; LA64-NEXT: ll.w $a6, $a0, 0
274-
; LA64-NEXT: bne $a6, $a2, .LBB5_5
270+
; LA64-NEXT: ll.w $a2, $a0, 0
271+
; LA64-NEXT: bne $a2, $a7, .LBB5_5
275272
; LA64-NEXT: # %bb.4: # %atomicrmw.start
276273
; LA64-NEXT: # in Loop: Header=BB5_3 Depth=2
277-
; LA64-NEXT: move $t0, $a7
274+
; LA64-NEXT: move $t0, $a6
278275
; LA64-NEXT: sc.w $t0, $a0, 0
279276
; LA64-NEXT: beqz $t0, .LBB5_3
280277
; LA64-NEXT: b .LBB5_6
@@ -283,11 +280,9 @@ define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {
283280
; LA64-NEXT: dbar 20
284281
; LA64-NEXT: .LBB5_6: # %atomicrmw.start
285282
; LA64-NEXT: # in Loop: Header=BB5_1 Depth=1
286-
; LA64-NEXT: addi.w $a7, $a2, 0
287-
; LA64-NEXT: move $a2, $a6
288-
; LA64-NEXT: bne $a6, $a7, .LBB5_1
283+
; LA64-NEXT: bne $a2, $a7, .LBB5_1
289284
; LA64-NEXT: # %bb.2: # %atomicrmw.end
290-
; LA64-NEXT: srl.w $a0, $a6, $a3
285+
; LA64-NEXT: srl.w $a0, $a2, $a3
291286
; LA64-NEXT: ret
292287
%result = atomicrmw udec_wrap ptr %ptr, i16 %val seq_cst
293288
ret i16 %result
@@ -296,40 +291,39 @@ define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {
296291
define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) {
297292
; LA64-LABEL: atomicrmw_udec_wrap_i32:
298293
; LA64: # %bb.0:
299-
; LA64-NEXT: ld.w $a4, $a0, 0
294+
; LA64-NEXT: ld.w $a2, $a0, 0
300295
; LA64-NEXT: addi.w $a3, $a1, 0
301296
; LA64-NEXT: .p2align 4, , 16
302297
; LA64-NEXT: .LBB6_1: # %atomicrmw.start
303298
; LA64-NEXT: # =>This Loop Header: Depth=1
304299
; LA64-NEXT: # Child Loop BB6_3 Depth 2
305-
; LA64-NEXT: addi.w $a5, $a4, 0
306-
; LA64-NEXT: sltu $a2, $a3, $a5
307-
; LA64-NEXT: addi.d $a6, $a4, -1
308-
; LA64-NEXT: masknez $a6, $a6, $a2
309-
; LA64-NEXT: maskeqz $a2, $a1, $a2
310-
; LA64-NEXT: or $a2, $a2, $a6
311-
; LA64-NEXT: sltui $a6, $a5, 1
312-
; LA64-NEXT: masknez $a2, $a2, $a6
313-
; LA64-NEXT: maskeqz $a6, $a1, $a6
314-
; LA64-NEXT: or $a6, $a6, $a2
300+
; LA64-NEXT: addi.w $a4, $a2, 0
301+
; LA64-NEXT: sltu $a5, $a3, $a4
302+
; LA64-NEXT: addi.d $a2, $a2, -1
303+
; LA64-NEXT: masknez $a2, $a2, $a5
304+
; LA64-NEXT: maskeqz $a5, $a1, $a5
305+
; LA64-NEXT: or $a2, $a5, $a2
306+
; LA64-NEXT: sltui $a5, $a4, 1
307+
; LA64-NEXT: masknez $a2, $a2, $a5
308+
; LA64-NEXT: maskeqz $a5, $a1, $a5
309+
; LA64-NEXT: or $a5, $a5, $a2
315310
; LA64-NEXT: .LBB6_3: # %atomicrmw.start
316311
; LA64-NEXT: # Parent Loop BB6_1 Depth=1
317312
; LA64-NEXT: # => This Inner Loop Header: Depth=2
318313
; LA64-NEXT: ll.w $a2, $a0, 0
319314
; LA64-NEXT: bne $a2, $a4, .LBB6_5
320315
; LA64-NEXT: # %bb.4: # %atomicrmw.start
321316
; LA64-NEXT: # in Loop: Header=BB6_3 Depth=2
322-
; LA64-NEXT: move $a7, $a6
323-
; LA64-NEXT: sc.w $a7, $a0, 0
324-
; LA64-NEXT: beqz $a7, .LBB6_3
317+
; LA64-NEXT: move $a6, $a5
318+
; LA64-NEXT: sc.w $a6, $a0, 0
319+
; LA64-NEXT: beqz $a6, .LBB6_3
325320
; LA64-NEXT: b .LBB6_6
326321
; LA64-NEXT: .LBB6_5: # %atomicrmw.start
327322
; LA64-NEXT: # in Loop: Header=BB6_1 Depth=1
328323
; LA64-NEXT: dbar 20
329324
; LA64-NEXT: .LBB6_6: # %atomicrmw.start
330325
; LA64-NEXT: # in Loop: Header=BB6_1 Depth=1
331-
; LA64-NEXT: move $a4, $a2
332-
; LA64-NEXT: bne $a2, $a5, .LBB6_1
326+
; LA64-NEXT: bne $a2, $a4, .LBB6_1
333327
; LA64-NEXT: # %bb.2: # %atomicrmw.end
334328
; LA64-NEXT: move $a0, $a2
335329
; 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
@@ -69,6 +69,7 @@ define void @cmpxchg_i16_acquire_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind
6969
define void @cmpxchg_i32_acquire_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind {
7070
; LA64-LABEL: cmpxchg_i32_acquire_acquire:
7171
; LA64: # %bb.0:
72+
; LA64-NEXT: addi.w $a1, $a1, 0
7273
; LA64-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
7374
; LA64-NEXT: ll.w $a3, $a0, 0
7475
; LA64-NEXT: bne $a3, $a1, .LBB2_3
@@ -172,6 +173,7 @@ define void @cmpxchg_i16_acquire_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwin
172173
define void @cmpxchg_i32_acquire_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
173174
; LA64-LABEL: cmpxchg_i32_acquire_monotonic:
174175
; LA64: # %bb.0:
176+
; LA64-NEXT: addi.w $a1, $a1, 0
175177
; LA64-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1
176178
; LA64-NEXT: ll.w $a3, $a0, 0
177179
; LA64-NEXT: bne $a3, $a1, .LBB6_3
@@ -279,9 +281,10 @@ define i16 @cmpxchg_i16_acquire_acquire_reti16(ptr %ptr, i16 %cmp, i16 %val) nou
279281
define i32 @cmpxchg_i32_acquire_acquire_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind {
280282
; LA64-LABEL: cmpxchg_i32_acquire_acquire_reti32:
281283
; LA64: # %bb.0:
284+
; LA64-NEXT: addi.w $a3, $a1, 0
282285
; LA64-NEXT: .LBB10_1: # =>This Inner Loop Header: Depth=1
283-
; LA64-NEXT: ll.w $a3, $a0, 0
284-
; LA64-NEXT: bne $a3, $a1, .LBB10_3
286+
; LA64-NEXT: ll.w $a1, $a0, 0
287+
; LA64-NEXT: bne $a1, $a3, .LBB10_3
285288
; LA64-NEXT: # %bb.2: # in Loop: Header=BB10_1 Depth=1
286289
; LA64-NEXT: move $a4, $a2
287290
; LA64-NEXT: sc.w $a4, $a0, 0
@@ -290,7 +293,7 @@ define i32 @cmpxchg_i32_acquire_acquire_reti32(ptr %ptr, i32 %cmp, i32 %val) nou
290293
; LA64-NEXT: .LBB10_3:
291294
; LA64-NEXT: dbar 20
292295
; LA64-NEXT: .LBB10_4:
293-
; LA64-NEXT: move $a0, $a3
296+
; LA64-NEXT: move $a0, $a1
294297
; LA64-NEXT: ret
295298
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire
296299
%res = extractvalue { i32, i1 } %tmp, 0
@@ -396,6 +399,7 @@ define i1 @cmpxchg_i16_acquire_acquire_reti1(ptr %ptr, i16 %cmp, i16 %val) nounw
396399
define i1 @cmpxchg_i32_acquire_acquire_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind {
397400
; LA64-LABEL: cmpxchg_i32_acquire_acquire_reti1:
398401
; LA64: # %bb.0:
402+
; LA64-NEXT: addi.w $a1, $a1, 0
399403
; LA64-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1
400404
; LA64-NEXT: ll.w $a3, $a0, 0
401405
; LA64-NEXT: bne $a3, $a1, .LBB14_3
@@ -407,8 +411,7 @@ define i1 @cmpxchg_i32_acquire_acquire_reti1(ptr %ptr, i32 %cmp, i32 %val) nounw
407411
; LA64-NEXT: .LBB14_3:
408412
; LA64-NEXT: dbar 20
409413
; LA64-NEXT: .LBB14_4:
410-
; LA64-NEXT: addi.w $a0, $a1, 0
411-
; LA64-NEXT: xor $a0, $a3, $a0
414+
; LA64-NEXT: xor $a0, $a3, $a1
412415
; LA64-NEXT: sltui $a0, $a0, 1
413416
; LA64-NEXT: ret
414417
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire
@@ -506,6 +509,7 @@ define void @cmpxchg_i16_monotonic_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounw
506509
define void @cmpxchg_i32_monotonic_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
507510
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic:
508511
; LA64: # %bb.0:
512+
; LA64-NEXT: addi.w $a1, $a1, 0
509513
; LA64-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
510514
; LA64-NEXT: ll.w $a3, $a0, 0
511515
; LA64-NEXT: bne $a3, $a1, .LBB18_3
@@ -613,9 +617,10 @@ define i16 @cmpxchg_i16_monotonic_monotonic_reti16(ptr %ptr, i16 %cmp, i16 %val)
613617
define i32 @cmpxchg_i32_monotonic_monotonic_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind {
614618
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic_reti32:
615619
; LA64: # %bb.0:
620+
; LA64-NEXT: addi.w $a3, $a1, 0
616621
; LA64-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
617-
; LA64-NEXT: ll.w $a3, $a0, 0
618-
; LA64-NEXT: bne $a3, $a1, .LBB22_3
622+
; LA64-NEXT: ll.w $a1, $a0, 0
623+
; LA64-NEXT: bne $a1, $a3, .LBB22_3
619624
; LA64-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1
620625
; LA64-NEXT: move $a4, $a2
621626
; LA64-NEXT: sc.w $a4, $a0, 0
@@ -624,7 +629,7 @@ define i32 @cmpxchg_i32_monotonic_monotonic_reti32(ptr %ptr, i32 %cmp, i32 %val)
624629
; LA64-NEXT: .LBB22_3:
625630
; LA64-NEXT: dbar 1792
626631
; LA64-NEXT: .LBB22_4:
627-
; LA64-NEXT: move $a0, $a3
632+
; LA64-NEXT: move $a0, $a1
628633
; LA64-NEXT: ret
629634
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
630635
%res = extractvalue { i32, i1 } %tmp, 0
@@ -730,6 +735,7 @@ define i1 @cmpxchg_i16_monotonic_monotonic_reti1(ptr %ptr, i16 %cmp, i16 %val) n
730735
define i1 @cmpxchg_i32_monotonic_monotonic_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind {
731736
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic_reti1:
732737
; LA64: # %bb.0:
738+
; LA64-NEXT: addi.w $a1, $a1, 0
733739
; LA64-NEXT: .LBB26_1: # =>This Inner Loop Header: Depth=1
734740
; LA64-NEXT: ll.w $a3, $a0, 0
735741
; LA64-NEXT: bne $a3, $a1, .LBB26_3
@@ -741,8 +747,7 @@ define i1 @cmpxchg_i32_monotonic_monotonic_reti1(ptr %ptr, i32 %cmp, i32 %val) n
741747
; LA64-NEXT: .LBB26_3:
742748
; LA64-NEXT: dbar 1792
743749
; LA64-NEXT: .LBB26_4:
744-
; LA64-NEXT: addi.w $a0, $a1, 0
745-
; LA64-NEXT: xor $a0, $a3, $a0
750+
; LA64-NEXT: xor $a0, $a3, $a1
746751
; LA64-NEXT: sltui $a0, $a0, 1
747752
; LA64-NEXT: ret
748753
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic

0 commit comments

Comments
 (0)