Skip to content

Commit 129d5ce

Browse files
authored
[RISCV][GISel] Use LBU for anyext i8 atomic_load. (#161588)
This matches what we do for regular i8 extload due to the lack of c.lb in Zbc. This only affects global isel because SelectionDAG won't create an anyext i8 atomic_load today.
1 parent 2d06374 commit 129d5ce

File tree

3 files changed

+27
-25
lines changed

3 files changed

+27
-25
lines changed

llvm/lib/Target/RISCV/RISCVGISel.td

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,9 @@ def : LdPat<extloadi8, LBU, i16>; // Prefer unsigned due to no c.lb in Zcb.
109109
def : StPat<truncstorei8, SB, GPR, i16>;
110110

111111
let Predicates = [HasAtomicLdSt] in {
112-
def : LdPat<atomic_load_aext_8, LB, i16>;
113-
def : LdPat<atomic_load_nonext_16, LH, i16>;
112+
// Prefer unsigned due to no c.lb in Zcb.
113+
def : LdPat<atomic_load_aext_8, LBU, i16>;
114+
def : LdPat<atomic_load_nonext_16, LH, i16>;
114115

115116
def : StPat<atomic_store_8, SB, GPR, i16>;
116117
def : StPat<atomic_store_16, SH, GPR, i16>;

llvm/lib/Target/RISCV/RISCVInstrInfoA.td

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,11 @@ class seq_cst_store<PatFrag base>
165165
// any ordering. This is necessary because AtomicExpandPass has added fences to
166166
// atomic load/stores and changed them to unordered ones.
167167
let Predicates = [HasAtomicLdSt] in {
168-
def : LdPat<relaxed_load<atomic_load_asext_8>, LB>;
168+
// Use unsigned for aext due to no c.lb in Zcb.
169+
def : LdPat<relaxed_load<atomic_load_sext_8>, LB>;
170+
def : LdPat<relaxed_load<atomic_load_azext_8>, LBU>;
169171
def : LdPat<relaxed_load<atomic_load_asext_16>, LH>;
170-
def : LdPat<relaxed_load<atomic_load_zext_8>, LBU>;
171-
def : LdPat<relaxed_load<atomic_load_zext_16>, LHU>;
172+
def : LdPat<relaxed_load<atomic_load_zext_16>, LHU>;
172173

173174
def : StPat<relaxed_store<atomic_store_8>, SB, GPR, XLenVT>;
174175
def : StPat<relaxed_store<atomic_store_16>, SH, GPR, XLenVT>;

llvm/test/CodeGen/RISCV/GlobalISel/atomic-load-store.ll

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ define i8 @atomic_load_i8_unordered(ptr %a) nounwind {
3737
;
3838
; RV32IA-LABEL: atomic_load_i8_unordered:
3939
; RV32IA: # %bb.0:
40-
; RV32IA-NEXT: lb a0, 0(a0)
40+
; RV32IA-NEXT: lbu a0, 0(a0)
4141
; RV32IA-NEXT: ret
4242
;
4343
; RV64I-LABEL: atomic_load_i8_unordered:
@@ -52,7 +52,7 @@ define i8 @atomic_load_i8_unordered(ptr %a) nounwind {
5252
;
5353
; RV64IA-LABEL: atomic_load_i8_unordered:
5454
; RV64IA: # %bb.0:
55-
; RV64IA-NEXT: lb a0, 0(a0)
55+
; RV64IA-NEXT: lbu a0, 0(a0)
5656
; RV64IA-NEXT: ret
5757
%1 = load atomic i8, ptr %a unordered, align 1
5858
ret i8 %1
@@ -71,7 +71,7 @@ define i8 @atomic_load_i8_monotonic(ptr %a) nounwind {
7171
;
7272
; RV32IA-LABEL: atomic_load_i8_monotonic:
7373
; RV32IA: # %bb.0:
74-
; RV32IA-NEXT: lb a0, 0(a0)
74+
; RV32IA-NEXT: lbu a0, 0(a0)
7575
; RV32IA-NEXT: ret
7676
;
7777
; RV64I-LABEL: atomic_load_i8_monotonic:
@@ -86,7 +86,7 @@ define i8 @atomic_load_i8_monotonic(ptr %a) nounwind {
8686
;
8787
; RV64IA-LABEL: atomic_load_i8_monotonic:
8888
; RV64IA: # %bb.0:
89-
; RV64IA-NEXT: lb a0, 0(a0)
89+
; RV64IA-NEXT: lbu a0, 0(a0)
9090
; RV64IA-NEXT: ret
9191
%1 = load atomic i8, ptr %a monotonic, align 1
9292
ret i8 %1
@@ -105,13 +105,13 @@ define i8 @atomic_load_i8_acquire(ptr %a) nounwind {
105105
;
106106
; RV32IA-WMO-LABEL: atomic_load_i8_acquire:
107107
; RV32IA-WMO: # %bb.0:
108-
; RV32IA-WMO-NEXT: lb a0, 0(a0)
108+
; RV32IA-WMO-NEXT: lbu a0, 0(a0)
109109
; RV32IA-WMO-NEXT: fence r, rw
110110
; RV32IA-WMO-NEXT: ret
111111
;
112112
; RV32IA-TSO-LABEL: atomic_load_i8_acquire:
113113
; RV32IA-TSO: # %bb.0:
114-
; RV32IA-TSO-NEXT: lb a0, 0(a0)
114+
; RV32IA-TSO-NEXT: lbu a0, 0(a0)
115115
; RV32IA-TSO-NEXT: ret
116116
;
117117
; RV64I-LABEL: atomic_load_i8_acquire:
@@ -126,35 +126,35 @@ define i8 @atomic_load_i8_acquire(ptr %a) nounwind {
126126
;
127127
; RV64IA-WMO-LABEL: atomic_load_i8_acquire:
128128
; RV64IA-WMO: # %bb.0:
129-
; RV64IA-WMO-NEXT: lb a0, 0(a0)
129+
; RV64IA-WMO-NEXT: lbu a0, 0(a0)
130130
; RV64IA-WMO-NEXT: fence r, rw
131131
; RV64IA-WMO-NEXT: ret
132132
;
133133
; RV64IA-TSO-LABEL: atomic_load_i8_acquire:
134134
; RV64IA-TSO: # %bb.0:
135-
; RV64IA-TSO-NEXT: lb a0, 0(a0)
135+
; RV64IA-TSO-NEXT: lbu a0, 0(a0)
136136
; RV64IA-TSO-NEXT: ret
137137
;
138138
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
139139
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
140-
; RV32IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
140+
; RV32IA-WMO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)
141141
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
142142
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
143143
;
144144
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
145145
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
146-
; RV32IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
146+
; RV32IA-TSO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)
147147
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
148148
;
149149
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
150150
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
151-
; RV64IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
151+
; RV64IA-WMO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)
152152
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
153153
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
154154
;
155155
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
156156
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
157-
; RV64IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
157+
; RV64IA-TSO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)
158158
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
159159
%1 = load atomic i8, ptr %a acquire, align 1
160160
ret i8 %1
@@ -174,14 +174,14 @@ define i8 @atomic_load_i8_seq_cst(ptr %a) nounwind {
174174
; RV32IA-WMO-LABEL: atomic_load_i8_seq_cst:
175175
; RV32IA-WMO: # %bb.0:
176176
; RV32IA-WMO-NEXT: fence rw, rw
177-
; RV32IA-WMO-NEXT: lb a0, 0(a0)
177+
; RV32IA-WMO-NEXT: lbu a0, 0(a0)
178178
; RV32IA-WMO-NEXT: fence r, rw
179179
; RV32IA-WMO-NEXT: ret
180180
;
181181
; RV32IA-TSO-LABEL: atomic_load_i8_seq_cst:
182182
; RV32IA-TSO: # %bb.0:
183183
; RV32IA-TSO-NEXT: fence rw, rw
184-
; RV32IA-TSO-NEXT: lb a0, 0(a0)
184+
; RV32IA-TSO-NEXT: lbu a0, 0(a0)
185185
; RV32IA-TSO-NEXT: ret
186186
;
187187
; RV64I-LABEL: atomic_load_i8_seq_cst:
@@ -197,40 +197,40 @@ define i8 @atomic_load_i8_seq_cst(ptr %a) nounwind {
197197
; RV64IA-WMO-LABEL: atomic_load_i8_seq_cst:
198198
; RV64IA-WMO: # %bb.0:
199199
; RV64IA-WMO-NEXT: fence rw, rw
200-
; RV64IA-WMO-NEXT: lb a0, 0(a0)
200+
; RV64IA-WMO-NEXT: lbu a0, 0(a0)
201201
; RV64IA-WMO-NEXT: fence r, rw
202202
; RV64IA-WMO-NEXT: ret
203203
;
204204
; RV64IA-TSO-LABEL: atomic_load_i8_seq_cst:
205205
; RV64IA-TSO: # %bb.0:
206206
; RV64IA-TSO-NEXT: fence rw, rw
207-
; RV64IA-TSO-NEXT: lb a0, 0(a0)
207+
; RV64IA-TSO-NEXT: lbu a0, 0(a0)
208208
; RV64IA-TSO-NEXT: ret
209209
;
210210
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
211211
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
212212
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
213-
; RV32IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
213+
; RV32IA-WMO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)
214214
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
215215
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
216216
;
217217
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
218218
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
219219
; RV32IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
220-
; RV32IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
220+
; RV32IA-TSO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)
221221
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
222222
;
223223
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
224224
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
225225
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
226-
; RV64IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
226+
; RV64IA-WMO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)
227227
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
228228
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
229229
;
230230
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
231231
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
232232
; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
233-
; RV64IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
233+
; RV64IA-TSO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)
234234
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
235235
%1 = load atomic i8, ptr %a seq_cst, align 1
236236
ret i8 %1

0 commit comments

Comments
 (0)