@@ -176,9 +176,9 @@ define i16 @test_atomicrmw_and_i16_global_agent_align4(ptr addrspace(1) %ptr, i1
176
176
ret i16 %res
177
177
}
178
178
179
- ; Preserve unknown metadata
180
- define i16 @test_atomicrmw_and_i16_global_agent_preserve_md (ptr addrspace (1 ) %ptr , i16 %value ) {
181
- ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_preserve_md (
179
+ ; Drop unknown metadata and noundef
180
+ define i16 @test_atomicrmw_and_i16_global_agent_drop_md (ptr addrspace (1 ) %ptr , i16 %value ) {
181
+ ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_drop_md (
182
182
; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)
183
183
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64
184
184
; CHECK-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3
@@ -198,9 +198,9 @@ define i16 @test_atomicrmw_and_i16_global_agent_preserve_md(ptr addrspace(1) %pt
198
198
ret i16 %res
199
199
}
200
200
201
- ; Preserve unknown metadata
202
- define i16 @test_atomicrmw_and_i16_global_agent_align4_preserve_md (ptr addrspace (1 ) %ptr , i16 %value ) {
203
- ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4_preserve_md (
201
+ ; Drop unknown metadata
202
+ define i16 @test_atomicrmw_and_i16_global_agent_align4_drop_md (ptr addrspace (1 ) %ptr , i16 %value ) {
203
+ ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4_drop_md (
204
204
; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32
205
205
; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536
206
206
; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4
@@ -211,6 +211,89 @@ define i16 @test_atomicrmw_and_i16_global_agent_align4_preserve_md(ptr addrspace
211
211
ret i16 %res
212
212
}
213
213
214
+ ; Drop noundef, preserve mmra
215
+ define i16 @test_atomicrmw_and_i16_global_agent_preserve_mmra (ptr addrspace (1 ) %ptr , i16 %value ) {
216
+ ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_preserve_mmra(
217
+ ; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)
218
+ ; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64
219
+ ; CHECK-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3
220
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3
221
+ ; CHECK-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32
222
+ ; CHECK-NEXT: [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]]
223
+ ; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1
224
+ ; CHECK-NEXT: [[TMP3:%.*]] = zext i16 [[VALUE:%.*]] to i32
225
+ ; CHECK-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]
226
+ ; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]]
227
+ ; CHECK-NEXT: [[TMP4:%.*]] = atomicrmw and ptr addrspace(1) [[ALIGNEDADDR]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !mmra [[META0:![0-9]+]]
228
+ ; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]
229
+ ; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
230
+ ; CHECK-NEXT: ret i16 [[EXTRACTED]]
231
+ ;
232
+ %res = atomicrmw and ptr addrspace (1 ) %ptr , i16 %value syncscope("agent" ) seq_cst , !noundef !0 , !mmra !1
233
+ ret i16 %res
234
+ }
235
+
236
+ ; Drop noundef, preserve mmra
237
+ define i16 @test_atomicrmw_and_i16_global_agent_align4_preserve_mmra (ptr addrspace (1 ) %ptr , i16 %value ) {
238
+ ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4_preserve_mmra(
239
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32
240
+ ; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536
241
+ ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !mmra [[META0]]
242
+ ; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16
243
+ ; CHECK-NEXT: ret i16 [[EXTRACTED]]
244
+ ;
245
+ %res = atomicrmw and ptr addrspace (1 ) %ptr , i16 %value syncscope("agent" ) seq_cst , align 4 , !noundef !0 , !mmra !1
246
+ ret i16 %res
247
+ }
248
+
249
+ define i16 @test_atomicrmw_and_i16_global_agent_align4_preserve_alias_scope (ptr addrspace (1 ) %ptr , i16 %value ) {
250
+ ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4_preserve_alias_scope(
251
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32
252
+ ; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536
253
+ ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !alias.scope [[META1:![0-9]+]]
254
+ ; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16
255
+ ; CHECK-NEXT: ret i16 [[EXTRACTED]]
256
+ ;
257
+ %res = atomicrmw and ptr addrspace (1 ) %ptr , i16 %value syncscope("agent" ) seq_cst , align 4 , !alias.scope !2
258
+ ret i16 %res
259
+ }
260
+
261
+ define i16 @test_atomicrmw_and_i16_global_agent_align4_preserve_noalias (ptr addrspace (1 ) %ptr , i16 %value ) {
262
+ ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4_preserve_noalias(
263
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32
264
+ ; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536
265
+ ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !noalias [[META1]]
266
+ ; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16
267
+ ; CHECK-NEXT: ret i16 [[EXTRACTED]]
268
+ ;
269
+ %res = atomicrmw and ptr addrspace (1 ) %ptr , i16 %value syncscope("agent" ) seq_cst , align 4 , !noalias !2
270
+ ret i16 %res
271
+ }
272
+
273
+ define i16 @test_atomicrmw_and_i16_global_agent_align4_preserve_tbaa_struct (ptr addrspace (1 ) %ptr , i16 %value ) {
274
+ ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4_preserve_tbaa_struct(
275
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32
276
+ ; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536
277
+ ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !tbaa.struct [[TBAA_STRUCT4:![0-9]+]]
278
+ ; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16
279
+ ; CHECK-NEXT: ret i16 [[EXTRACTED]]
280
+ ;
281
+ %res = atomicrmw and ptr addrspace (1 ) %ptr , i16 %value syncscope("agent" ) seq_cst , align 4 , !tbaa.struct !5
282
+ ret i16 %res
283
+ }
284
+
285
+ define i16 @test_atomicrmw_and_i16_global_agent_align4_preserve_tbaa (ptr addrspace (1 ) %ptr , i16 %value ) {
286
+ ; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4_preserve_tbaa(
287
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32
288
+ ; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536
289
+ ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !tbaa [[TBAA5:![0-9]+]]
290
+ ; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16
291
+ ; CHECK-NEXT: ret i16 [[EXTRACTED]]
292
+ ;
293
+ %res = atomicrmw and ptr addrspace (1 ) %ptr , i16 %value syncscope("agent" ) seq_cst , align 4 , !tbaa !6
294
+ ret i16 %res
295
+ }
296
+
214
297
define i16 @test_atomicrmw_and_i16_global_agent__amdgpu_no_remote_memory (ptr addrspace (1 ) %ptr , i16 %value ) {
215
298
; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent__amdgpu_no_remote_memory(
216
299
; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)
@@ -223,7 +306,7 @@ define i16 @test_atomicrmw_and_i16_global_agent__amdgpu_no_remote_memory(ptr add
223
306
; CHECK-NEXT: [[TMP3:%.*]] = zext i16 [[VALUE:%.*]] to i32
224
307
; CHECK-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]
225
308
; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]]
226
- ; CHECK-NEXT: [[TMP4:%.*]] = atomicrmw and ptr addrspace(1) [[ALIGNEDADDR]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4
309
+ ; CHECK-NEXT: [[TMP4:%.*]] = atomicrmw and ptr addrspace(1) [[ALIGNEDADDR]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META8:![0-9]+]]
227
310
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]
228
311
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
229
312
; CHECK-NEXT: ret i16 [[EXTRACTED]]
@@ -236,7 +319,7 @@ define i16 @test_atomicrmw_and_i16_global_agent_align4__amdgpu_no_remote_memory(
236
319
; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4__amdgpu_no_remote_memory(
237
320
; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32
238
321
; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536
239
- ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4
322
+ ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META8]]
240
323
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16
241
324
; CHECK-NEXT: ret i16 [[EXTRACTED]]
242
325
;
@@ -256,7 +339,7 @@ define i16 @test_atomicrmw_and_i16_global_agent__amdgpu_no_fine_grained_memory(p
256
339
; CHECK-NEXT: [[TMP3:%.*]] = zext i16 [[VALUE:%.*]] to i32
257
340
; CHECK-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]
258
341
; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]]
259
- ; CHECK-NEXT: [[TMP4:%.*]] = atomicrmw and ptr addrspace(1) [[ALIGNEDADDR]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4
342
+ ; CHECK-NEXT: [[TMP4:%.*]] = atomicrmw and ptr addrspace(1) [[ALIGNEDADDR]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META8]]
260
343
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]
261
344
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16
262
345
; CHECK-NEXT: ret i16 [[EXTRACTED]]
@@ -269,7 +352,7 @@ define i16 @test_atomicrmw_and_i16_global_agent_align4__amdgpu_no_fine_grained_m
269
352
; CHECK-LABEL: @test_atomicrmw_and_i16_global_agent_align4__amdgpu_no_fine_grained_memory(
270
353
; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[VALUE:%.*]] to i32
271
354
; CHECK-NEXT: [[ANDOPERAND:%.*]] = or i32 [[TMP1]], -65536
272
- ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4
355
+ ; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw and ptr addrspace(1) [[PTR:%.*]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META8]]
273
356
; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP2]] to i16
274
357
; CHECK-NEXT: ret i16 [[EXTRACTED]]
275
358
;
@@ -1180,6 +1263,15 @@ define bfloat @test_atomicrmw_xchg_bf16_global_agent_align4(ptr addrspace(1) %pt
1180
1263
}
1181
1264
1182
1265
!0 = !{}
1266
+ !1 = !{!"foo" , !"bar" }
1267
+ !2 = !{!3 }
1268
+ !3 = distinct !{!3 , !4 }
1269
+ !4 = distinct !{!4 }
1270
+ !5 = !{i64 0 , i64 4 , !1 , i64 8 , i64 4 }
1271
+ !6 = !{!7 , !7 , i64 0 }
1272
+ !7 = !{!"omnipotent char" , !8 , i64 0 }
1273
+ !8 = !{!"Simple C/C++ TBAA" }
1274
+
1183
1275
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
1184
1276
; BASE: {{.*}}
1185
1277
; GCN: {{.*}}
0 commit comments