291 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx942 < %s | FileCheck -check-prefixes=GFX942 %s3; RUN: opt -mtriple=amdgcn-amd-amdhsa -S -passes=atomic-expand < %s | FileCheck --check-prefix=OPT %s4 5define i32 @global_agent_monotonic_idempotent_or(ptr addrspace(1) %in) {6; GFX942-LABEL: global_agent_monotonic_idempotent_or:7; GFX942: ; %bb.0: ; %entry8; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)9; GFX942-NEXT: global_load_dword v0, v[0:1], off sc110; GFX942-NEXT: s_waitcnt vmcnt(0)11; GFX942-NEXT: s_setpc_b64 s[30:31]12; OPT-LABEL: @global_agent_monotonic_idempotent_or(13; OPT-NEXT: entry:14; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] syncscope("agent-one-as") monotonic, align 415; OPT-NEXT: ret i32 [[VAL]]16;17entry:18 %val = atomicrmw or ptr addrspace(1) %in, i32 0 syncscope("agent-one-as") monotonic, align 419 ret i32 %val20}21 22define i32 @global_agent_acquire_idempotent_or(ptr addrspace(1) %in) {23; GFX942-LABEL: global_agent_acquire_idempotent_or:24; GFX942: ; %bb.0: ; %entry25; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)26; GFX942-NEXT: global_load_dword v0, v[0:1], off sc127; GFX942-NEXT: s_waitcnt vmcnt(0)28; GFX942-NEXT: buffer_inv sc129; GFX942-NEXT: s_setpc_b64 s[30:31]30; OPT-LABEL: @global_agent_acquire_idempotent_or(31; OPT-NEXT: entry:32; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] syncscope("agent-one-as") acquire, align 433; OPT-NEXT: ret i32 [[VAL]]34;35entry:36 %val = atomicrmw or ptr addrspace(1) %in, i32 0 syncscope("agent-one-as") acquire, align 437 ret i32 %val38}39 40define i32 @global_agent_release_idempotent_or(ptr addrspace(1) %in) {41; GFX942-LABEL: global_agent_release_idempotent_or:42; GFX942: ; %bb.0: ; %entry43; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)44; GFX942-NEXT: v_mov_b32_e32 v2, 045; GFX942-NEXT: buffer_wbl2 sc146; GFX942-NEXT: global_atomic_or v0, v[0:1], v2, off sc047; GFX942-NEXT: s_waitcnt vmcnt(0)48; GFX942-NEXT: s_setpc_b64 s[30:31]49; OPT-LABEL: @global_agent_release_idempotent_or(50; OPT-NEXT: entry:51; OPT-NEXT: [[VAL:%.*]] = atomicrmw add ptr addrspace(1) [[IN:%.*]], i32 0 syncscope("agent-one-as") release, align 452; OPT-NEXT: ret i32 [[VAL]]53;54entry:55 %val = atomicrmw or ptr addrspace(1) %in, i32 0 syncscope("agent-one-as") release, align 456 ret i32 %val57}58 59define i32 @global_agent_release_idempotent_or_no_remote(ptr addrspace(1) %in) {60; GFX942-LABEL: global_agent_release_idempotent_or_no_remote:61; GFX942: ; %bb.0: ; %entry62; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)63; GFX942-NEXT: v_mov_b32_e32 v2, 064; GFX942-NEXT: buffer_wbl2 sc165; GFX942-NEXT: global_atomic_or v0, v[0:1], v2, off sc066; GFX942-NEXT: s_waitcnt vmcnt(0)67; GFX942-NEXT: s_setpc_b64 s[30:31]68; OPT-LABEL: @global_agent_release_idempotent_or_no_remote(69; OPT-NEXT: entry:70; OPT-NEXT: [[VAL:%.*]] = atomicrmw or ptr addrspace(1) [[IN:%.*]], i32 0 syncscope("agent-one-as") release, align 4, !amdgpu.no.remote.memory [[META0:![0-9]+]]71; OPT-NEXT: ret i32 [[VAL]]72entry:73 %val = atomicrmw or ptr addrspace(1) %in, i32 0 syncscope("agent-one-as") release, align 4, !amdgpu.no.remote.memory !074 ret i32 %val75}76 77define i32 @global_agent_release_idempotent_or_no_fine_grained(ptr addrspace(1) %in) {78; GFX942-LABEL: global_agent_release_idempotent_or_no_fine_grained:79; GFX942: ; %bb.0: ; %entry80; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)81; GFX942-NEXT: v_mov_b32_e32 v2, 082; GFX942-NEXT: buffer_wbl2 sc183; GFX942-NEXT: global_atomic_or v0, v[0:1], v2, off sc084; GFX942-NEXT: s_waitcnt vmcnt(0)85; GFX942-NEXT: s_setpc_b64 s[30:31]86; OPT-LABEL: @global_agent_release_idempotent_or_no_fine_grained(87; OPT-NEXT: entry:88; OPT-NEXT: [[VAL:%.*]] = atomicrmw or ptr addrspace(1) [[IN:%.*]], i32 0 syncscope("agent-one-as") release, align 4, !amdgpu.no.fine.grained.memory [[META0]]89; OPT-NEXT: ret i32 [[VAL]]90entry:91 %val = atomicrmw or ptr addrspace(1) %in, i32 0 syncscope("agent-one-as") release, align 4, !amdgpu.no.fine.grained.memory !092 ret i32 %val93}94 95define i32 @global_agent_acquire_release_idempotent_or(ptr addrspace(1) %in) {96; GFX942-LABEL: global_agent_acquire_release_idempotent_or:97; GFX942: ; %bb.0: ; %entry98; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)99; GFX942-NEXT: v_mov_b32_e32 v2, 0100; GFX942-NEXT: buffer_wbl2 sc1101; GFX942-NEXT: global_atomic_or v0, v[0:1], v2, off sc0102; GFX942-NEXT: s_waitcnt vmcnt(0)103; GFX942-NEXT: buffer_inv sc1104; GFX942-NEXT: s_setpc_b64 s[30:31]105; OPT-LABEL: @global_agent_acquire_release_idempotent_or(106; OPT-NEXT: entry:107; OPT-NEXT: [[VAL:%.*]] = atomicrmw add ptr addrspace(1) [[IN:%.*]], i32 0 syncscope("agent-one-as") acq_rel, align 4108; OPT-NEXT: ret i32 [[VAL]]109;110entry:111 %val = atomicrmw or ptr addrspace(1) %in, i32 0 syncscope("agent-one-as") acq_rel, align 4112 ret i32 %val113}114 115define i32 @global_agent_acquire_release_idempotent_or__no_fine_grained(ptr addrspace(1) %in) {116; GFX942-LABEL: global_agent_acquire_release_idempotent_or__no_fine_grained:117; GFX942: ; %bb.0: ; %entry118; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)119; GFX942-NEXT: v_mov_b32_e32 v2, 0120; GFX942-NEXT: buffer_wbl2 sc1121; GFX942-NEXT: global_atomic_or v0, v[0:1], v2, off sc0122; GFX942-NEXT: s_waitcnt vmcnt(0)123; GFX942-NEXT: buffer_inv sc1124; GFX942-NEXT: s_setpc_b64 s[30:31]125; OPT-LABEL: @global_agent_acquire_release_idempotent_or__no_fine_grained(126; OPT-NEXT: entry:127; OPT-NEXT: [[VAL:%.*]] = atomicrmw or ptr addrspace(1) [[IN:%.*]], i32 0 syncscope("agent-one-as") acq_rel, align 4, !amdgpu.no.fine.grained.memory [[META0]]128; OPT-NEXT: ret i32 [[VAL]]129entry:130 %val = atomicrmw or ptr addrspace(1) %in, i32 0 syncscope("agent-one-as") acq_rel, align 4, !amdgpu.no.fine.grained.memory !0131 ret i32 %val132}133 134define i32 @global_agent_seq_cst_idempotent_or(ptr addrspace(1) %in) {135; GFX942-LABEL: global_agent_seq_cst_idempotent_or:136; GFX942: ; %bb.0: ; %entry137; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)138; GFX942-NEXT: v_mov_b32_e32 v2, 0139; GFX942-NEXT: buffer_wbl2 sc1140; GFX942-NEXT: global_atomic_or v0, v[0:1], v2, off sc0141; GFX942-NEXT: s_waitcnt vmcnt(0)142; GFX942-NEXT: buffer_inv sc1143; GFX942-NEXT: s_setpc_b64 s[30:31]144; OPT-LABEL: @global_agent_seq_cst_idempotent_or(145; OPT-NEXT: entry:146; OPT-NEXT: [[VAL:%.*]] = atomicrmw add ptr addrspace(1) [[IN:%.*]], i32 0 syncscope("agent-one-as") seq_cst, align 4147; OPT-NEXT: ret i32 [[VAL]]148;149entry:150 %val = atomicrmw or ptr addrspace(1) %in, i32 0 syncscope("agent-one-as") seq_cst, align 4151 ret i32 %val152}153 154define i32 @global_agent_monotonic_idempotent_add(ptr addrspace(1) %in) {155; GFX942-LABEL: global_agent_monotonic_idempotent_add:156; GFX942: ; %bb.0: ; %entry157; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)158; GFX942-NEXT: global_load_dword v0, v[0:1], off sc0159; GFX942-NEXT: s_waitcnt vmcnt(0)160; GFX942-NEXT: s_setpc_b64 s[30:31]161; OPT-LABEL: @global_agent_monotonic_idempotent_add(162; OPT-NEXT: entry:163; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] syncscope("workgroup") monotonic, align 4164; OPT-NEXT: ret i32 [[VAL]]165;166entry:167 %val = atomicrmw add ptr addrspace(1) %in, i32 0 syncscope("workgroup") monotonic, align 4168 ret i32 %val169}170 171define i32 @global_agent_monotonic_idempotent_add__no_fine_grained(ptr addrspace(1) %in) {172; GFX942-LABEL: global_agent_monotonic_idempotent_add__no_fine_grained:173; GFX942: ; %bb.0: ; %entry174; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)175; GFX942-NEXT: global_load_dword v0, v[0:1], off sc0176; GFX942-NEXT: s_waitcnt vmcnt(0)177; GFX942-NEXT: s_setpc_b64 s[30:31]178; OPT-LABEL: @global_agent_monotonic_idempotent_add__no_fine_grained(179; OPT-NEXT: entry:180; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] syncscope("workgroup") monotonic, align 4, !amdgpu.no.fine.grained.memory [[META0]]181; OPT-NEXT: ret i32 [[VAL]]182;183entry:184 %val = atomicrmw add ptr addrspace(1) %in, i32 0 syncscope("workgroup") monotonic, align 4, !amdgpu.no.fine.grained.memory !0185 ret i32 %val186}187 188define i32 @global_agent_monotonic_idempotent_sub(ptr addrspace(1) %in) {189; GFX942-LABEL: global_agent_monotonic_idempotent_sub:190; GFX942: ; %bb.0: ; %entry191; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)192; GFX942-NEXT: global_load_dword v0, v[0:1], off193; GFX942-NEXT: s_waitcnt vmcnt(0)194; GFX942-NEXT: s_setpc_b64 s[30:31]195; OPT-LABEL: @global_agent_monotonic_idempotent_sub(196; OPT-NEXT: entry:197; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] syncscope("wavefront") monotonic, align 4198; OPT-NEXT: ret i32 [[VAL]]199;200entry:201 %val = atomicrmw sub ptr addrspace(1) %in, i32 0 syncscope("wavefront") monotonic, align 4202 ret i32 %val203}204 205define i32 @global_agent_monotonic_idempotent_sub__no_fine_grained(ptr addrspace(1) %in) {206; GFX942-LABEL: global_agent_monotonic_idempotent_sub__no_fine_grained:207; GFX942: ; %bb.0: ; %entry208; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)209; GFX942-NEXT: global_load_dword v0, v[0:1], off210; GFX942-NEXT: s_waitcnt vmcnt(0)211; GFX942-NEXT: s_setpc_b64 s[30:31]212; OPT-LABEL: @global_agent_monotonic_idempotent_sub__no_fine_grained(213; OPT-NEXT: entry:214; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] syncscope("wavefront") monotonic, align 4, !amdgpu.no.fine.grained.memory [[META0]]215; OPT-NEXT: ret i32 [[VAL]]216;217entry:218 %val = atomicrmw sub ptr addrspace(1) %in, i32 0 syncscope("wavefront") monotonic, align 4, !amdgpu.no.fine.grained.memory !0219 ret i32 %val220}221 222define i32 @global_system_monotonic_idempotent_xor(ptr addrspace(1) %in) {223; GFX942-LABEL: global_system_monotonic_idempotent_xor:224; GFX942: ; %bb.0: ; %entry225; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)226; GFX942-NEXT: global_load_dword v0, v[0:1], off sc0 sc1227; GFX942-NEXT: s_waitcnt vmcnt(0)228; GFX942-NEXT: s_setpc_b64 s[30:31]229; OPT-LABEL: @global_system_monotonic_idempotent_xor(230; OPT-NEXT: entry:231; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] monotonic, align 4232; OPT-NEXT: ret i32 [[VAL]]233;234entry:235 %val = atomicrmw xor ptr addrspace(1) %in, i32 0 monotonic, align 4236 ret i32 %val237}238 239define i32 @global_system_monotonic_idempotent_xor__no_fine_grained(ptr addrspace(1) %in) {240; GFX942-LABEL: global_system_monotonic_idempotent_xor__no_fine_grained:241; GFX942: ; %bb.0: ; %entry242; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)243; GFX942-NEXT: global_load_dword v0, v[0:1], off sc0 sc1244; GFX942-NEXT: s_waitcnt vmcnt(0)245; GFX942-NEXT: s_setpc_b64 s[30:31]246; OPT-LABEL: @global_system_monotonic_idempotent_xor__no_fine_grained(247; OPT-NEXT: entry:248; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] monotonic, align 4, !amdgpu.no.fine.grained.memory [[META0]]249; OPT-NEXT: ret i32 [[VAL]]250;251entry:252 %val = atomicrmw xor ptr addrspace(1) %in, i32 0 monotonic, align 4, !amdgpu.no.fine.grained.memory !0253 ret i32 %val254}255 256define i32 @global_agent_monotonic_idempotent_and(ptr addrspace(1) %in) {257; GFX942-LABEL: global_agent_monotonic_idempotent_and:258; GFX942: ; %bb.0: ; %entry259; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)260; GFX942-NEXT: global_load_dword v0, v[0:1], off261; GFX942-NEXT: s_waitcnt vmcnt(0)262; GFX942-NEXT: s_setpc_b64 s[30:31]263; OPT-LABEL: @global_agent_monotonic_idempotent_and(264; OPT-NEXT: entry:265; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] syncscope("singlethread") monotonic, align 4266; OPT-NEXT: ret i32 [[VAL]]267;268entry:269 %val = atomicrmw and ptr addrspace(1) %in, i32 -1 syncscope("singlethread") monotonic, align 4270 ret i32 %val271}272 273define i32 @global_agent_monotonic_idempotent_and_no_fined_grain(ptr addrspace(1) %in) {274; GFX942-LABEL: global_agent_monotonic_idempotent_and_no_fined_grain:275; GFX942: ; %bb.0: ; %entry276; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)277; GFX942-NEXT: global_load_dword v0, v[0:1], off278; GFX942-NEXT: s_waitcnt vmcnt(0)279; GFX942-NEXT: s_setpc_b64 s[30:31]280; OPT-LABEL: @global_agent_monotonic_idempotent_and_no_fined_grain(281; OPT-NEXT: entry:282; OPT-NEXT: [[VAL:%.*]] = load atomic i32, ptr addrspace(1) [[IN:%.*]] syncscope("singlethread") monotonic, align 4, !amdgpu.no.fine.grained.memory [[META0]]283; OPT-NEXT: ret i32 [[VAL]]284;285entry:286 %val = atomicrmw and ptr addrspace(1) %in, i32 -1 syncscope("singlethread") monotonic, align 4, !amdgpu.no.fine.grained.memory !0287 ret i32 %val288}289 290!0 = !{}291