Skip to content

Commit 816ff98

Browse files
committed
[Sparc] Fix "Cannot select" error for AtomicFence on 32-bit V9
Summary: This also adds testing of 32-bit V9 atomic lowering, splitting the 64-bit-only tests out into their own file. Reviewers: venkatra, jyknight Reviewed By: jyknight Subscribers: hiraditya, fedor.sergeev, jfb, llvm-commits, glaubitz Tags: #llvm Differential Revision: https://reviews.llvm.org/D69352
1 parent bfbbf0a commit 816ff98

File tree

4 files changed

+64
-61
lines changed

4 files changed

+64
-61
lines changed

llvm/lib/Target/Sparc/SparcInstr64Bit.td

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,8 +497,6 @@ let Predicates = [Is64Bit], Constraints = "$swap = $rd", asi = 0b10000000 in {
497497

498498
let Predicates = [Is64Bit] in {
499499

500-
def : Pat<(atomic_fence imm, imm), (MEMBARi 0xf)>;
501-
502500
// atomic_load_64 addr -> load addr
503501
def : Pat<(i64 (atomic_load_64 ADDRrr:$src)), (LDXrr ADDRrr:$src)>;
504502
def : Pat<(i64 (atomic_load_64 ADDRri:$src)), (LDXri ADDRri:$src)>;

llvm/lib/Target/Sparc/SparcInstrInfo.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1678,6 +1678,9 @@ def : Pat<(store (i32 0), ADDRri:$dst), (STri ADDRri:$dst, (i32 G0))>;
16781678
let Predicates = [HasNoV9] in
16791679
def : Pat<(atomic_fence imm, imm), (STBAR)>;
16801680

1681+
let Predicates = [HasV9] in
1682+
def : Pat<(atomic_fence imm, imm), (MEMBARi 0xf)>;
1683+
16811684
// atomic_load addr -> load addr
16821685
def : Pat<(i32 (atomic_load_8 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>;
16831686
def : Pat<(i32 (atomic_load_8 ADDRri:$src)), (LDUBri ADDRri:$src)>;

llvm/test/CodeGen/SPARC/64atomics.ll

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
; RUN: llc < %s -march=sparcv9 -verify-machineinstrs | FileCheck %s
2+
3+
; CHECK-LABEL: test_atomic_i64
4+
; CHECK: ldx [%o0]
5+
; CHECK: membar
6+
; CHECK: ldx [%o1]
7+
; CHECK: membar
8+
; CHECK: membar
9+
; CHECK: stx {{.+}}, [%o2]
10+
define i64 @test_atomic_i64(i64* %ptr1, i64* %ptr2, i64* %ptr3) {
11+
entry:
12+
%0 = load atomic i64, i64* %ptr1 acquire, align 8
13+
%1 = load atomic i64, i64* %ptr2 acquire, align 8
14+
%2 = add i64 %0, %1
15+
store atomic i64 %2, i64* %ptr3 release, align 8
16+
ret i64 %2
17+
}
18+
19+
; CHECK-LABEL: test_cmpxchg_i64
20+
; CHECK: mov 123, [[R:%[gilo][0-7]]]
21+
; CHECK: casx [%o1], %o0, [[R]]
22+
23+
define i64 @test_cmpxchg_i64(i64 %a, i64* %ptr) {
24+
entry:
25+
%pair = cmpxchg i64* %ptr, i64 %a, i64 123 monotonic monotonic
26+
%b = extractvalue { i64, i1 } %pair, 0
27+
ret i64 %b
28+
}
29+
30+
; CHECK-LABEL: test_swap_i64
31+
; CHECK: casx [%o1],
32+
33+
define i64 @test_swap_i64(i64 %a, i64* %ptr) {
34+
entry:
35+
%b = atomicrmw xchg i64* %ptr, i64 42 monotonic
36+
ret i64 %b
37+
}
38+
39+
; CHECK-LABEL: test_load_sub_64
40+
; CHECK: membar
41+
; CHECK: sub
42+
; CHECK: casx [%o0]
43+
; CHECK: membar
44+
define zeroext i64 @test_load_sub_64(i64* %p, i64 zeroext %v) {
45+
entry:
46+
%0 = atomicrmw sub i64* %p, i64 %v seq_cst
47+
ret i64 %0
48+
}
49+
50+
; CHECK-LABEL: test_load_max_64
51+
; CHECK: membar
52+
; CHECK: cmp
53+
; CHECK: movg %xcc
54+
; CHECK: casx [%o0]
55+
; CHECK: membar
56+
define zeroext i64 @test_load_max_64(i64* %p, i64 zeroext %v) {
57+
entry:
58+
%0 = atomicrmw max i64* %p, i64 %v seq_cst
59+
ret i64 %0
60+
}

llvm/test/CodeGen/SPARC/atomics.ll

Lines changed: 1 addition & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; RUN: llc < %s -march=sparc -mcpu=v9 -verify-machineinstrs | FileCheck %s
12
; RUN: llc < %s -march=sparcv9 -verify-machineinstrs | FileCheck %s
23

34
; CHECK-LABEL: test_atomic_i8
@@ -48,22 +49,6 @@ entry:
4849
ret i32 %2
4950
}
5051

51-
; CHECK-LABEL: test_atomic_i64
52-
; CHECK: ldx [%o0]
53-
; CHECK: membar
54-
; CHECK: ldx [%o1]
55-
; CHECK: membar
56-
; CHECK: membar
57-
; CHECK: stx {{.+}}, [%o2]
58-
define i64 @test_atomic_i64(i64* %ptr1, i64* %ptr2, i64* %ptr3) {
59-
entry:
60-
%0 = load atomic i64, i64* %ptr1 acquire, align 8
61-
%1 = load atomic i64, i64* %ptr2 acquire, align 8
62-
%2 = add i64 %0, %1
63-
store atomic i64 %2, i64* %ptr3 release, align 8
64-
ret i64 %2
65-
}
66-
6752
;; TODO: the "move %icc" and related instructions are totally
6853
;; redundant here. There's something weird happening in optimization
6954
;; of the success value of cmpxchg.
@@ -159,17 +144,6 @@ entry:
159144
ret i32 %b
160145
}
161146

162-
; CHECK-LABEL: test_cmpxchg_i64
163-
; CHECK: mov 123, [[R:%[gilo][0-7]]]
164-
; CHECK: casx [%o1], %o0, [[R]]
165-
166-
define i64 @test_cmpxchg_i64(i64 %a, i64* %ptr) {
167-
entry:
168-
%pair = cmpxchg i64* %ptr, i64 %a, i64 123 monotonic monotonic
169-
%b = extractvalue { i64, i1 } %pair, 0
170-
ret i64 %b
171-
}
172-
173147
; CHECK-LABEL: test_swap_i8
174148
; CHECK: mov 42, [[R:%[gilo][0-7]]]
175149
; CHECK: cas
@@ -200,15 +174,6 @@ entry:
200174
ret i32 %b
201175
}
202176

203-
; CHECK-LABEL: test_swap_i64
204-
; CHECK: casx [%o1],
205-
206-
define i64 @test_swap_i64(i64 %a, i64* %ptr) {
207-
entry:
208-
%b = atomicrmw xchg i64* %ptr, i64 42 monotonic
209-
ret i64 %b
210-
}
211-
212177
; CHECK-LABEL: test_load_sub_i8
213178
; CHECK: membar
214179
; CHECK: .L{{.*}}:
@@ -246,17 +211,6 @@ entry:
246211
ret i32 %0
247212
}
248213

249-
; CHECK-LABEL: test_load_sub_64
250-
; CHECK: membar
251-
; CHECK: sub
252-
; CHECK: casx [%o0]
253-
; CHECK: membar
254-
define zeroext i64 @test_load_sub_64(i64* %p, i64 zeroext %v) {
255-
entry:
256-
%0 = atomicrmw sub i64* %p, i64 %v seq_cst
257-
ret i64 %0
258-
}
259-
260214
; CHECK-LABEL: test_load_xor_32
261215
; CHECK: membar
262216
; CHECK: xor
@@ -292,18 +246,6 @@ entry:
292246
ret i32 %0
293247
}
294248

295-
; CHECK-LABEL: test_load_max_64
296-
; CHECK: membar
297-
; CHECK: cmp
298-
; CHECK: movg %xcc
299-
; CHECK: casx [%o0]
300-
; CHECK: membar
301-
define zeroext i64 @test_load_max_64(i64* %p, i64 zeroext %v) {
302-
entry:
303-
%0 = atomicrmw max i64* %p, i64 %v seq_cst
304-
ret i64 %0
305-
}
306-
307249
; CHECK-LABEL: test_load_umin_32
308250
; CHECK: membar
309251
; CHECK: cmp

0 commit comments

Comments
 (0)