Skip to content

Commit 63267ca

Browse files
committed
[LoongArch] Fix the assertion for atomic store with 'ptr' type
1 parent 9211977 commit 63267ca

File tree

2 files changed

+122
-2
lines changed

2 files changed

+122
-2
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5619,8 +5619,9 @@ bool LoongArchTargetLowering::shouldInsertFencesForAtomic(
56195619

56205620
// On LA64, atomic store operations with IntegerBitWidth of 32 and 64 do not
56215621
// require fences beacuse we can use amswap_db.[w/d].
5622-
if (isa<StoreInst>(I)) {
5623-
unsigned Size = I->getOperand(0)->getType()->getIntegerBitWidth();
5622+
Type *Ty = I->getOperand(0)->getType();
5623+
if (isa<StoreInst>(I) && Ty->isIntegerTy()) {
5624+
unsigned Size = Ty->getIntegerBitWidth();
56245625
return (Size == 8 || Size == 16);
56255626
}
56265627

llvm/test/CodeGen/LoongArch/ir-instruction/load-store-atomic.ll

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,22 @@ define i64 @load_acquire_i64(ptr %ptr) {
7272
ret i64 %val
7373
}
7474

75+
define ptr @load_acquire_ptr(ptr %ptr) {
76+
; LA32-LABEL: load_acquire_ptr:
77+
; LA32: # %bb.0:
78+
; LA32-NEXT: ld.w $a0, $a0, 0
79+
; LA32-NEXT: dbar 20
80+
; LA32-NEXT: ret
81+
;
82+
; LA64-LABEL: load_acquire_ptr:
83+
; LA64: # %bb.0:
84+
; LA64-NEXT: ld.d $a0, $a0, 0
85+
; LA64-NEXT: dbar 20
86+
; LA64-NEXT: ret
87+
%val = load atomic ptr, ptr %ptr acquire, align 8
88+
ret ptr %val
89+
}
90+
7591
define i8 @load_unordered_i8(ptr %ptr) {
7692
; LA32-LABEL: load_unordered_i8:
7793
; LA32: # %bb.0:
@@ -135,6 +151,20 @@ define i64 @load_unordered_i64(ptr %ptr) {
135151
ret i64 %val
136152
}
137153

154+
define ptr @load_unordered_ptr(ptr %ptr) {
155+
; LA32-LABEL: load_unordered_ptr:
156+
; LA32: # %bb.0:
157+
; LA32-NEXT: ld.w $a0, $a0, 0
158+
; LA32-NEXT: ret
159+
;
160+
; LA64-LABEL: load_unordered_ptr:
161+
; LA64: # %bb.0:
162+
; LA64-NEXT: ld.d $a0, $a0, 0
163+
; LA64-NEXT: ret
164+
%val = load atomic ptr, ptr %ptr unordered, align 8
165+
ret ptr %val
166+
}
167+
138168
define i8 @load_monotonic_i8(ptr %ptr) {
139169
; LA32-LABEL: load_monotonic_i8:
140170
; LA32: # %bb.0:
@@ -198,6 +228,20 @@ define i64 @load_monotonic_i64(ptr %ptr) {
198228
ret i64 %val
199229
}
200230

231+
define ptr @load_monotonic_ptr(ptr %ptr) {
232+
; LA32-LABEL: load_monotonic_ptr:
233+
; LA32: # %bb.0:
234+
; LA32-NEXT: ld.w $a0, $a0, 0
235+
; LA32-NEXT: ret
236+
;
237+
; LA64-LABEL: load_monotonic_ptr:
238+
; LA64: # %bb.0:
239+
; LA64-NEXT: ld.d $a0, $a0, 0
240+
; LA64-NEXT: ret
241+
%val = load atomic ptr, ptr %ptr monotonic, align 8
242+
ret ptr %val
243+
}
244+
201245
define i8 @load_seq_cst_i8(ptr %ptr) {
202246
; LA32-LABEL: load_seq_cst_i8:
203247
; LA32: # %bb.0:
@@ -268,6 +312,22 @@ define i64 @load_seq_cst_i64(ptr %ptr) {
268312
ret i64 %val
269313
}
270314

315+
define ptr @load_seq_cst_ptr(ptr %ptr) {
316+
; LA32-LABEL: load_seq_cst_ptr:
317+
; LA32: # %bb.0:
318+
; LA32-NEXT: ld.w $a0, $a0, 0
319+
; LA32-NEXT: dbar 16
320+
; LA32-NEXT: ret
321+
;
322+
; LA64-LABEL: load_seq_cst_ptr:
323+
; LA64: # %bb.0:
324+
; LA64-NEXT: ld.d $a0, $a0, 0
325+
; LA64-NEXT: dbar 16
326+
; LA64-NEXT: ret
327+
%val = load atomic ptr, ptr %ptr seq_cst, align 8
328+
ret ptr %val
329+
}
330+
271331
define void @store_release_i8(ptr %ptr, i8 signext %v) {
272332
; LA32-LABEL: store_release_i8:
273333
; LA32: # %bb.0:
@@ -336,6 +396,21 @@ define void @store_release_i64(ptr %ptr, i64 %v) {
336396
ret void
337397
}
338398

399+
define void @store_release_ptr(ptr %ptr, ptr %v) {
400+
; LA32-LABEL: store_release_ptr:
401+
; LA32: # %bb.0:
402+
; LA32-NEXT: dbar 18
403+
; LA32-NEXT: st.w $a1, $a0, 0
404+
; LA32-NEXT: ret
405+
;
406+
; LA64-LABEL: store_release_ptr:
407+
; LA64: # %bb.0:
408+
; LA64-NEXT: amswap_db.d $zero, $a1, $a0
409+
; LA64-NEXT: ret
410+
store atomic ptr %v, ptr %ptr release, align 8
411+
ret void
412+
}
413+
339414
define void @store_unordered_i8(ptr %ptr, i8 signext %v) {
340415
; LA32-LABEL: store_unordered_i8:
341416
; LA32: # %bb.0:
@@ -399,6 +474,20 @@ define void @store_unordered_i64(ptr %ptr, i64 %v) {
399474
ret void
400475
}
401476

477+
define void @store_unordered_ptr(ptr %ptr, ptr %v) {
478+
; LA32-LABEL: store_unordered_ptr:
479+
; LA32: # %bb.0:
480+
; LA32-NEXT: st.w $a1, $a0, 0
481+
; LA32-NEXT: ret
482+
;
483+
; LA64-LABEL: store_unordered_ptr:
484+
; LA64: # %bb.0:
485+
; LA64-NEXT: st.d $a1, $a0, 0
486+
; LA64-NEXT: ret
487+
store atomic ptr %v, ptr %ptr unordered, align 8
488+
ret void
489+
}
490+
402491
define void @store_monotonic_i8(ptr %ptr, i8 signext %v) {
403492
; LA32-LABEL: store_monotonic_i8:
404493
; LA32: # %bb.0:
@@ -462,6 +551,20 @@ define void @store_monotonic_i64(ptr %ptr, i64 %v) {
462551
ret void
463552
}
464553

554+
define void @store_monotonic_ptr(ptr %ptr, ptr %v) {
555+
; LA32-LABEL: store_monotonic_ptr:
556+
; LA32: # %bb.0:
557+
; LA32-NEXT: st.w $a1, $a0, 0
558+
; LA32-NEXT: ret
559+
;
560+
; LA64-LABEL: store_monotonic_ptr:
561+
; LA64: # %bb.0:
562+
; LA64-NEXT: st.d $a1, $a0, 0
563+
; LA64-NEXT: ret
564+
store atomic ptr %v, ptr %ptr monotonic, align 8
565+
ret void
566+
}
567+
465568
define void @store_seq_cst_i8(ptr %ptr, i8 signext %v) {
466569
; LA32-LABEL: store_seq_cst_i8:
467570
; LA32: # %bb.0:
@@ -534,3 +637,19 @@ define void @store_seq_cst_i64(ptr %ptr, i64 %v) {
534637
store atomic i64 %v, ptr %ptr seq_cst, align 8
535638
ret void
536639
}
640+
641+
define void @store_seq_cst_ptr(ptr %ptr, ptr %v) {
642+
; LA32-LABEL: store_seq_cst_ptr:
643+
; LA32: # %bb.0:
644+
; LA32-NEXT: dbar 16
645+
; LA32-NEXT: st.w $a1, $a0, 0
646+
; LA32-NEXT: dbar 16
647+
; LA32-NEXT: ret
648+
;
649+
; LA64-LABEL: store_seq_cst_ptr:
650+
; LA64: # %bb.0:
651+
; LA64-NEXT: amswap_db.d $zero, $a1, $a0
652+
; LA64-NEXT: ret
653+
store atomic ptr %v, ptr %ptr seq_cst, align 8
654+
ret void
655+
}

0 commit comments

Comments
 (0)