brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.6 KiB · 185f42e Raw
375 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 42; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand -mcpu=gfx803 %s | FileCheck -check-prefixes=CHECK,GFX803 %s3; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand -mcpu=gfx900 %s | FileCheck -check-prefixes=CHECK,GFX900 %s4; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand -mcpu=gfx90a %s | FileCheck -check-prefixes=CHECK,GFX90A %s5; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand -mcpu=gfx1030 %s | FileCheck -check-prefixes=CHECK,GFX10 %s6; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand -mcpu=gfx1100 %s | FileCheck -check-prefixes=CHECK,GFX11 %s7; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand -mcpu=gfx942 %s | FileCheck -check-prefixes=CHECK,GFX942 %s8; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand -mcpu=gfx1200 %s | FileCheck -check-prefixes=CHECK,GFX12 %s9 10; Test that system scoped atomicrmw or 0 is transformed to add 0.11 12; Transform to add13define i32 @test_atomicrmw_or_0_global_system(ptr addrspace(1) %ptr) {14; CHECK-LABEL: define i32 @test_atomicrmw_or_0_global_system(15; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0:[0-9]+]] {16; CHECK-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !foo.md [[META0:![0-9]+]]17; CHECK-NEXT:    ret i32 [[RES]]18;19  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 seq_cst, !foo.md !020  ret i32 %res21}22 23; Transform to add24define i32 @test_atomicrmw_or_0_global_one_as(ptr addrspace(1) %ptr) {25; CHECK-LABEL: define i32 @test_atomicrmw_or_0_global_one_as(26; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {27; CHECK-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 syncscope("one-as") seq_cst, align 428; CHECK-NEXT:    ret i32 [[RES]]29;30  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 syncscope("one-as") seq_cst31  ret i32 %res32}33 34; Transform to add35define i32 @test_atomicrmw_or_0_flat_system(ptr %ptr) {36; CHECK-LABEL: define i32 @test_atomicrmw_or_0_flat_system(37; CHECK-SAME: ptr [[PTR:%.*]]) #[[ATTR0]] {38; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])39; CHECK-NEXT:    br i1 [[IS_PRIVATE]], label [[ATOMICRMW_PRIVATE:%.*]], label [[ATOMICRMW_GLOBAL:%.*]]40; CHECK:       atomicrmw.private:41; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)42; CHECK-NEXT:    [[LOADED_PRIVATE:%.*]] = load i32, ptr addrspace(5) [[TMP1]], align 443; CHECK-NEXT:    [[NEW:%.*]] = add i32 [[LOADED_PRIVATE]], 044; CHECK-NEXT:    store i32 [[NEW]], ptr addrspace(5) [[TMP1]], align 445; CHECK-NEXT:    br label [[ATOMICRMW_PHI:%.*]]46; CHECK:       atomicrmw.global:47; CHECK-NEXT:    [[TMP2:%.*]] = atomicrmw add ptr [[PTR]], i32 0 seq_cst, align 4, !noalias.addrspace [[META1:![0-9]+]]48; CHECK-NEXT:    br label [[ATOMICRMW_PHI]]49; CHECK:       atomicrmw.phi:50; CHECK-NEXT:    [[RES1:%.*]] = phi i32 [ [[LOADED_PRIVATE]], [[ATOMICRMW_PRIVATE]] ], [ [[TMP2]], [[ATOMICRMW_GLOBAL]] ]51; CHECK-NEXT:    br label [[ATOMICRMW_END:%.*]]52; CHECK:       atomicrmw.end:53; CHECK-NEXT:    ret i32 [[RES1]]54;55  %res = atomicrmw or ptr %ptr, i32 0 seq_cst56  ret i32 %res57}58 59; Transform to add60define i32 @test_atomicrmw_or_0_as999_system(ptr addrspace(999) %ptr) {61; CHECK-LABEL: define i32 @test_atomicrmw_or_0_as999_system(62; CHECK-SAME: ptr addrspace(999) [[PTR:%.*]]) #[[ATTR0]] {63; CHECK-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(999) [[PTR]], i32 0 seq_cst, align 464; CHECK-NEXT:    ret i32 [[RES]]65;66  %res = atomicrmw or ptr addrspace(999) %ptr, i32 0 seq_cst67  ret i32 %res68}69 70; Leave as-is, only system scope should be changed.71define i32 @test_atomicrmw_or_0_global_agent(ptr addrspace(1) %ptr) {72; GFX803-LABEL: define i32 @test_atomicrmw_or_0_global_agent(73; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {74; GFX803-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 475; GFX803-NEXT:    ret i32 [[RES]]76;77; GFX900-LABEL: define i32 @test_atomicrmw_or_0_global_agent(78; GFX900-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {79; GFX900-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 480; GFX900-NEXT:    ret i32 [[RES]]81;82; GFX90A-LABEL: define i32 @test_atomicrmw_or_0_global_agent(83; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {84; GFX90A-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 485; GFX90A-NEXT:    ret i32 [[RES]]86;87; GFX10-LABEL: define i32 @test_atomicrmw_or_0_global_agent(88; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {89; GFX10-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 490; GFX10-NEXT:    ret i32 [[RES]]91;92; GFX11-LABEL: define i32 @test_atomicrmw_or_0_global_agent(93; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {94; GFX11-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 495; GFX11-NEXT:    ret i32 [[RES]]96;97; GFX942-LABEL: define i32 @test_atomicrmw_or_0_global_agent(98; GFX942-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {99; GFX942-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4100; GFX942-NEXT:    ret i32 [[RES]]101;102; GFX12-LABEL: define i32 @test_atomicrmw_or_0_global_agent(103; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {104; GFX12-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4105; GFX12-NEXT:    ret i32 [[RES]]106;107  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst108  ret i32 %res109}110 111; Leave as-is, LDS atomics aren't relevant.112define i32 @test_atomicrmw_or_0_local(ptr addrspace(3) %ptr) {113; CHECK-LABEL: define i32 @test_atomicrmw_or_0_local(114; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) #[[ATTR0]] {115; CHECK-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(3) [[PTR]], i32 0 seq_cst, align 4116; CHECK-NEXT:    ret i32 [[RES]]117;118  %res = atomicrmw or ptr addrspace(3) %ptr, i32 0 seq_cst119  ret i32 %res120}121 122; Leave non-0 values alone.123define i32 @test_atomicrmw_or_1_global_system(ptr addrspace(1) %ptr) {124; CHECK-LABEL: define i32 @test_atomicrmw_or_1_global_system(125; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {126; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4127; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]128; CHECK:       atomicrmw.start:129; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[RES:%.*]], [[ATOMICRMW_START]] ]130; CHECK-NEXT:    [[NEW:%.*]] = or i32 [[LOADED]], 1131; CHECK-NEXT:    [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] seq_cst seq_cst, align 4132; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1133; CHECK-NEXT:    [[RES]] = extractvalue { i32, i1 } [[TMP2]], 0134; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]135; CHECK:       atomicrmw.end:136; CHECK-NEXT:    ret i32 [[RES]]137;138  %res = atomicrmw or ptr addrspace(1) %ptr, i32 1 seq_cst139  ret i32 %res140}141 142define i32 @test_atomicrmw_or_var_global_system(ptr addrspace(1) %ptr, i32 %val) {143; CHECK-LABEL: define i32 @test_atomicrmw_or_var_global_system(144; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VAL:%.*]]) #[[ATTR0]] {145; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4146; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]147; CHECK:       atomicrmw.start:148; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[RES:%.*]], [[ATOMICRMW_START]] ]149; CHECK-NEXT:    [[NEW:%.*]] = or i32 [[LOADED]], [[VAL]]150; CHECK-NEXT:    [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] seq_cst seq_cst, align 4151; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1152; CHECK-NEXT:    [[RES]] = extractvalue { i32, i1 } [[TMP2]], 0153; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]154; CHECK:       atomicrmw.end:155; CHECK-NEXT:    ret i32 [[RES]]156;157  %res = atomicrmw or ptr addrspace(1) %ptr, i32 %val seq_cst158  ret i32 %res159}160 161; Leave as-is162define i32 @test_atomicrmw_add_0_global_system(ptr addrspace(1) %ptr) {163; CHECK-LABEL: define i32 @test_atomicrmw_add_0_global_system(164; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {165; CHECK-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4166; CHECK-NEXT:    ret i32 [[RES]]167;168  %res = atomicrmw add ptr addrspace(1) %ptr, i32 0 seq_cst169  ret i32 %res170}171 172; Transform to add173define i32 @test_atomicrmw_sub_0_global_system(ptr addrspace(1) %ptr) {174; CHECK-LABEL: define i32 @test_atomicrmw_sub_0_global_system(175; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {176; CHECK-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !foo.md [[META0]]177; CHECK-NEXT:    ret i32 [[RES]]178;179  %res = atomicrmw sub ptr addrspace(1) %ptr, i32 0 seq_cst, !foo.md !0180  ret i32 %res181}182 183; Transform to add184define i32 @test_atomicrmw_xor_0_global_system(ptr addrspace(1) %ptr) {185; CHECK-LABEL: define i32 @test_atomicrmw_xor_0_global_system(186; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {187; CHECK-NEXT:    [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !foo.md [[META0]]188; CHECK-NEXT:    ret i32 [[RES]]189;190  %res = atomicrmw xor ptr addrspace(1) %ptr, i32 0 seq_cst, !foo.md !0191  ret i32 %res192}193 194define i32 @test_atomicrmw_or_0_global_system__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr) {195; CHECK-LABEL: define i32 @test_atomicrmw_or_0_global_system__amdgpu_no_fine_grained_memory(196; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {197; CHECK-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]198; CHECK-NEXT:    ret i32 [[RES]]199;200  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.fine.grained.memory !0201  ret i32 %res202}203 204define i32 @test_atomicrmw_or_0_global_system__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {205; CHECK-LABEL: define i32 @test_atomicrmw_or_0_global_system__amdgpu_no_remote_memory(206; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {207; CHECK-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]208; CHECK-NEXT:    ret i32 [[RES]]209;210  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.remote.memory !0211  ret i32 %res212}213 214define i32 @test_atomicrmw_or_0_global_system__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {215; CHECK-LABEL: define i32 @test_atomicrmw_or_0_global_system__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(216; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {217; CHECK-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]218; CHECK-NEXT:    ret i32 [[RES]]219;220  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0221  ret i32 %res222}223 224define i32 @test_atomicrmw_xor_0_global_system__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr) {225; CHECK-LABEL: define i32 @test_atomicrmw_xor_0_global_system__amdgpu_no_fine_grained_memory(226; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {227; CHECK-NEXT:    [[RES:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]228; CHECK-NEXT:    ret i32 [[RES]]229;230  %res = atomicrmw xor ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.fine.grained.memory !0231  ret i32 %res232}233 234define i32 @test_atomicrmw_xor_0_global_system__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {235; CHECK-LABEL: define i32 @test_atomicrmw_xor_0_global_system__amdgpu_no_remote_memory(236; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {237; CHECK-NEXT:    [[RES:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]238; CHECK-NEXT:    ret i32 [[RES]]239;240  %res = atomicrmw xor ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.remote.memory !0241  ret i32 %res242}243 244define i32 @test_atomicrmw_xor_0_global_system__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {245; CHECK-LABEL: define i32 @test_atomicrmw_xor_0_global_system__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(246; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {247; CHECK-NEXT:    [[RES:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]248; CHECK-NEXT:    ret i32 [[RES]]249;250  %res = atomicrmw xor ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0251  ret i32 %res252}253 254define i32 @test_atomicrmw_sub_0_global_system__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr) {255; CHECK-LABEL: define i32 @test_atomicrmw_sub_0_global_system__amdgpu_no_fine_grained_memory(256; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {257; CHECK-NEXT:    [[RES:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]258; CHECK-NEXT:    ret i32 [[RES]]259;260  %res = atomicrmw sub ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.fine.grained.memory !0261  ret i32 %res262}263 264define i32 @test_atomicrmw_sub_0_global_system__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {265; CHECK-LABEL: define i32 @test_atomicrmw_sub_0_global_system__amdgpu_no_remote_memory(266; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {267; CHECK-NEXT:    [[RES:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]268; CHECK-NEXT:    ret i32 [[RES]]269;270  %res = atomicrmw sub ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.remote.memory !0271  ret i32 %res272}273 274define i32 @test_atomicrmw_sub_0_global_system__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {275; CHECK-LABEL: define i32 @test_atomicrmw_sub_0_global_system__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(276; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {277; CHECK-NEXT:    [[RES:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 0 seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]278; CHECK-NEXT:    ret i32 [[RES]]279;280  %res = atomicrmw sub ptr addrspace(1) %ptr, i32 0 seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0281  ret i32 %res282}283 284define i32 @test_atomicrmw_or_0_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr) {285; CHECK-LABEL: define i32 @test_atomicrmw_or_0_global_agent__amdgpu_no_fine_grained_memory(286; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {287; CHECK-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]288; CHECK-NEXT:    ret i32 [[RES]]289;290  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0291  ret i32 %res292}293 294define i32 @test_atomicrmw_or_0_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {295; CHECK-LABEL: define i32 @test_atomicrmw_or_0_global_agent__amdgpu_no_remote_memory(296; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {297; CHECK-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]298; CHECK-NEXT:    ret i32 [[RES]]299;300  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0301  ret i32 %res302}303 304define i32 @test_atomicrmw_or_0_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {305; CHECK-LABEL: define i32 @test_atomicrmw_or_0_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(306; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {307; CHECK-NEXT:    [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]308; CHECK-NEXT:    ret i32 [[RES]]309;310  %res = atomicrmw or ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0311  ret i32 %res312}313 314define i32 @test_atomicrmw_xor_0_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr) {315; CHECK-LABEL: define i32 @test_atomicrmw_xor_0_global_agent__amdgpu_no_fine_grained_memory(316; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {317; CHECK-NEXT:    [[RES:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]318; CHECK-NEXT:    ret i32 [[RES]]319;320  %res = atomicrmw xor ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0321  ret i32 %res322}323 324define i32 @test_atomicrmw_xor_0_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {325; CHECK-LABEL: define i32 @test_atomicrmw_xor_0_global_agent__amdgpu_no_remote_memory(326; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {327; CHECK-NEXT:    [[RES:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]328; CHECK-NEXT:    ret i32 [[RES]]329;330  %res = atomicrmw xor ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0331  ret i32 %res332}333 334define i32 @test_atomicrmw_xor_0_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {335; CHECK-LABEL: define i32 @test_atomicrmw_xor_0_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(336; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {337; CHECK-NEXT:    [[RES:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]338; CHECK-NEXT:    ret i32 [[RES]]339;340  %res = atomicrmw xor ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0341  ret i32 %res342}343 344define i32 @test_atomicrmw_sub_0_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr) {345; CHECK-LABEL: define i32 @test_atomicrmw_sub_0_global_agent__amdgpu_no_fine_grained_memory(346; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {347; CHECK-NEXT:    [[RES:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]348; CHECK-NEXT:    ret i32 [[RES]]349;350  %res = atomicrmw sub ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0351  ret i32 %res352}353 354define i32 @test_atomicrmw_sub_0_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {355; CHECK-LABEL: define i32 @test_atomicrmw_sub_0_global_agent__amdgpu_no_remote_memory(356; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {357; CHECK-NEXT:    [[RES:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]358; CHECK-NEXT:    ret i32 [[RES]]359;360  %res = atomicrmw sub ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0361  ret i32 %res362}363 364define i32 @test_atomicrmw_sub_0_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr) {365; CHECK-LABEL: define i32 @test_atomicrmw_sub_0_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(366; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] {367; CHECK-NEXT:    [[RES:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 0 syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]368; CHECK-NEXT:    ret i32 [[RES]]369;370  %res = atomicrmw sub ptr addrspace(1) %ptr, i32 0 syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0371  ret i32 %res372}373 374!0 = !{}375