Skip to content

Commit 88b368a

Browse files
committed
[PowerPC] Set setMaxAtomicSizeInBitsSupported appropriately for 32-bit PowerPC in PPCTargetLowering
Reviewed By: nemanjai Differential Revision: https://reviews.llvm.org/D86165
1 parent 889cf9b commit 88b368a

File tree

3 files changed

+503
-77
lines changed

3 files changed

+503
-77
lines changed

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,9 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
11991199
setLibcallName(RTLIB::SRA_I128, nullptr);
12001200
}
12011201

1202+
if (!isPPC64)
1203+
setMaxAtomicSizeInBitsSupported(32);
1204+
12021205
setStackPointerRegisterToSaveRestore(isPPC64 ? PPC::X1 : PPC::R1);
12031206

12041207
// We have target-specific dag combine patterns for the following nodes:

llvm/test/CodeGen/PowerPC/atomics-indexed.ll

Lines changed: 113 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
12
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -verify-machineinstrs -ppc-asm-full-reg-names | FileCheck %s --check-prefix=CHECK --check-prefix=PPC32
23
; FIXME: -verify-machineinstrs currently fail on ppc64 (mismatched register/instruction).
34
; This is already checked for in Atomics-64.ll
@@ -8,9 +9,25 @@
89

910
; Indexed version of loads
1011
define i8 @load_x_i8_seq_cst([100000 x i8]* %mem) {
11-
; CHECK-LABEL: load_x_i8_seq_cst
12-
; CHECK: sync
13-
; CHECK: lbzx [[VAL:r[0-9]+]]
12+
; PPC32-LABEL: load_x_i8_seq_cst:
13+
; PPC32: # %bb.0:
14+
; PPC32-NEXT: lis r4, 1
15+
; PPC32-NEXT: sync
16+
; PPC32-NEXT: ori r4, r4, 24464
17+
; PPC32-NEXT: lbzx r3, r3, r4
18+
; PPC32-NEXT: lwsync
19+
; PPC32-NEXT: blr
20+
;
21+
; PPC64-LABEL: load_x_i8_seq_cst:
22+
; PPC64: # %bb.0:
23+
; PPC64-NEXT: lis r4, 1
24+
; PPC64-NEXT: sync
25+
; PPC64-NEXT: ori r4, r4, 24464
26+
; PPC64-NEXT: lbzx r3, r3, r4
27+
; PPC64-NEXT: cmpd cr7, r3, r3
28+
; PPC64-NEXT: bne- cr7, .+4
29+
; PPC64-NEXT: isync
30+
; PPC64-NEXT: blr
1431
; CHECK-PPC32: lwsync
1532
; CHECK-PPC64: cmpw [[CR:cr[0-9]+]], [[VAL]], [[VAL]]
1633
; CHECK-PPC64: bne- [[CR]], .+4
@@ -20,8 +37,23 @@ define i8 @load_x_i8_seq_cst([100000 x i8]* %mem) {
2037
ret i8 %val
2138
}
2239
define i16 @load_x_i16_acquire([100000 x i16]* %mem) {
23-
; CHECK-LABEL: load_x_i16_acquire
24-
; CHECK: lhzx [[VAL:r[0-9]+]]
40+
; PPC32-LABEL: load_x_i16_acquire:
41+
; PPC32: # %bb.0:
42+
; PPC32-NEXT: lis r4, 2
43+
; PPC32-NEXT: ori r4, r4, 48928
44+
; PPC32-NEXT: lhzx r3, r3, r4
45+
; PPC32-NEXT: lwsync
46+
; PPC32-NEXT: blr
47+
;
48+
; PPC64-LABEL: load_x_i16_acquire:
49+
; PPC64: # %bb.0:
50+
; PPC64-NEXT: lis r4, 2
51+
; PPC64-NEXT: ori r4, r4, 48928
52+
; PPC64-NEXT: lhzx r3, r3, r4
53+
; PPC64-NEXT: cmpd cr7, r3, r3
54+
; PPC64-NEXT: bne- cr7, .+4
55+
; PPC64-NEXT: isync
56+
; PPC64-NEXT: blr
2557
; CHECK-PPC32: lwsync
2658
; CHECK-PPC64: cmpw [[CR:cr[0-9]+]], [[VAL]], [[VAL]]
2759
; CHECK-PPC64: bne- [[CR]], .+4
@@ -31,55 +63,109 @@ define i16 @load_x_i16_acquire([100000 x i16]* %mem) {
3163
ret i16 %val
3264
}
3365
define i32 @load_x_i32_monotonic([100000 x i32]* %mem) {
34-
; CHECK-LABEL: load_x_i32_monotonic
35-
; CHECK: lwzx
36-
; CHECK-NOT: sync
66+
; CHECK-LABEL: load_x_i32_monotonic:
67+
; CHECK: # %bb.0:
68+
; CHECK-NEXT: lis r4, 5
69+
; CHECK-NEXT: ori r4, r4, 32320
70+
; CHECK-NEXT: lwzx r3, r3, r4
71+
; CHECK-NEXT: blr
3772
%ptr = getelementptr inbounds [100000 x i32], [100000 x i32]* %mem, i64 0, i64 90000
3873
%val = load atomic i32, i32* %ptr monotonic, align 4
3974
ret i32 %val
4075
}
4176
define i64 @load_x_i64_unordered([100000 x i64]* %mem) {
42-
; CHECK-LABEL: load_x_i64_unordered
43-
; PPC32: __sync_
44-
; PPC64-NOT: __sync_
45-
; PPC64: ldx
46-
; CHECK-NOT: sync
77+
; PPC32-LABEL: load_x_i64_unordered:
78+
; PPC32: # %bb.0:
79+
; PPC32-NEXT: mflr r0
80+
; PPC32-NEXT: stw r0, 4(r1)
81+
; PPC32-NEXT: stwu r1, -16(r1)
82+
; PPC32-NEXT: .cfi_def_cfa_offset 16
83+
; PPC32-NEXT: .cfi_offset lr, 4
84+
; PPC32-NEXT: addi r3, r3, -896
85+
; PPC32-NEXT: addis r3, r3, 11
86+
; PPC32-NEXT: li r4, 0
87+
; PPC32-NEXT: bl __atomic_load_8
88+
; PPC32-NEXT: lwz r0, 20(r1)
89+
; PPC32-NEXT: addi r1, r1, 16
90+
; PPC32-NEXT: mtlr r0
91+
; PPC32-NEXT: blr
92+
;
93+
; PPC64-LABEL: load_x_i64_unordered:
94+
; PPC64: # %bb.0:
95+
; PPC64-NEXT: lis r4, 10
96+
; PPC64-NEXT: ori r4, r4, 64640
97+
; PPC64-NEXT: ldx r3, r3, r4
98+
; PPC64-NEXT: blr
4799
%ptr = getelementptr inbounds [100000 x i64], [100000 x i64]* %mem, i64 0, i64 90000
48100
%val = load atomic i64, i64* %ptr unordered, align 8
49101
ret i64 %val
50102
}
51103

52104
; Indexed version of stores
53105
define void @store_x_i8_seq_cst([100000 x i8]* %mem) {
54-
; CHECK-LABEL: store_x_i8_seq_cst
55-
; CHECK: sync
56-
; CHECK: stbx
106+
; CHECK-LABEL: store_x_i8_seq_cst:
107+
; CHECK: # %bb.0:
108+
; CHECK-NEXT: lis r4, 1
109+
; CHECK-NEXT: ori r4, r4, 24464
110+
; CHECK-NEXT: li r5, 42
111+
; CHECK-NEXT: sync
112+
; CHECK-NEXT: stbx r5, r3, r4
113+
; CHECK-NEXT: blr
57114
%ptr = getelementptr inbounds [100000 x i8], [100000 x i8]* %mem, i64 0, i64 90000
58115
store atomic i8 42, i8* %ptr seq_cst, align 1
59116
ret void
60117
}
61118
define void @store_x_i16_release([100000 x i16]* %mem) {
62-
; CHECK-LABEL: store_x_i16_release
63-
; CHECK: lwsync
64-
; CHECK: sthx
119+
; CHECK-LABEL: store_x_i16_release:
120+
; CHECK: # %bb.0:
121+
; CHECK-NEXT: lis r4, 2
122+
; CHECK-NEXT: ori r4, r4, 48928
123+
; CHECK-NEXT: li r5, 42
124+
; CHECK-NEXT: lwsync
125+
; CHECK-NEXT: sthx r5, r3, r4
126+
; CHECK-NEXT: blr
65127
%ptr = getelementptr inbounds [100000 x i16], [100000 x i16]* %mem, i64 0, i64 90000
66128
store atomic i16 42, i16* %ptr release, align 2
67129
ret void
68130
}
69131
define void @store_x_i32_monotonic([100000 x i32]* %mem) {
70-
; CHECK-LABEL: store_x_i32_monotonic
71-
; CHECK-NOT: sync
72-
; CHECK: stwx
132+
; CHECK-LABEL: store_x_i32_monotonic:
133+
; CHECK: # %bb.0:
134+
; CHECK-NEXT: lis r4, 5
135+
; CHECK-NEXT: ori r4, r4, 32320
136+
; CHECK-NEXT: li r5, 42
137+
; CHECK-NEXT: stwx r5, r3, r4
138+
; CHECK-NEXT: blr
73139
%ptr = getelementptr inbounds [100000 x i32], [100000 x i32]* %mem, i64 0, i64 90000
74140
store atomic i32 42, i32* %ptr monotonic, align 4
75141
ret void
76142
}
77143
define void @store_x_i64_unordered([100000 x i64]* %mem) {
78-
; CHECK-LABEL: store_x_i64_unordered
79-
; CHECK-NOT: sync
80-
; PPC32: __sync_
81-
; PPC64-NOT: __sync_
82-
; PPC64: stdx
144+
; PPC32-LABEL: store_x_i64_unordered:
145+
; PPC32: # %bb.0:
146+
; PPC32-NEXT: mflr r0
147+
; PPC32-NEXT: stw r0, 4(r1)
148+
; PPC32-NEXT: stwu r1, -16(r1)
149+
; PPC32-NEXT: .cfi_def_cfa_offset 16
150+
; PPC32-NEXT: .cfi_offset lr, 4
151+
; PPC32-NEXT: addi r3, r3, -896
152+
; PPC32-NEXT: addis r3, r3, 11
153+
; PPC32-NEXT: li r5, 0
154+
; PPC32-NEXT: li r6, 42
155+
; PPC32-NEXT: li r7, 0
156+
; PPC32-NEXT: bl __atomic_store_8
157+
; PPC32-NEXT: lwz r0, 20(r1)
158+
; PPC32-NEXT: addi r1, r1, 16
159+
; PPC32-NEXT: mtlr r0
160+
; PPC32-NEXT: blr
161+
;
162+
; PPC64-LABEL: store_x_i64_unordered:
163+
; PPC64: # %bb.0:
164+
; PPC64-NEXT: lis r4, 10
165+
; PPC64-NEXT: ori r4, r4, 64640
166+
; PPC64-NEXT: li r5, 42
167+
; PPC64-NEXT: stdx r5, r3, r4
168+
; PPC64-NEXT: blr
83169
%ptr = getelementptr inbounds [100000 x i64], [100000 x i64]* %mem, i64 0, i64 90000
84170
store atomic i64 42, i64* %ptr unordered, align 8
85171
ret void

0 commit comments

Comments
 (0)