1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX900 %s 3; RUN: llc -march=amdgcn -mcpu=gfx908 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX908 %s 4; RUN: llc -march=amdgcn -mcpu=gfx90a -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX90A %s 5 6define amdgpu_kernel void @global_atomic_fadd_ret_f32(float addrspace(1)* %ptr) #0 { 7; GFX900-LABEL: global_atomic_fadd_ret_f32: 8; GFX900: ; %bb.0: 9; GFX900-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 10; GFX900-NEXT: s_mov_b64 s[2:3], 0 11; GFX900-NEXT: s_waitcnt lgkmcnt(0) 12; GFX900-NEXT: s_load_dword s4, s[0:1], 0x0 13; GFX900-NEXT: s_waitcnt lgkmcnt(0) 14; GFX900-NEXT: v_mov_b32_e32 v0, s4 15; GFX900-NEXT: BB0_1: ; %atomicrmw.start 16; GFX900-NEXT: ; =>This Inner Loop Header: Depth=1 17; GFX900-NEXT: v_mov_b32_e32 v1, v0 18; GFX900-NEXT: v_mov_b32_e32 v2, 0 19; GFX900-NEXT: v_add_f32_e32 v0, 4.0, v1 20; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 21; GFX900-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc 22; GFX900-NEXT: s_waitcnt vmcnt(0) 23; GFX900-NEXT: buffer_wbinvl1_vol 24; GFX900-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1 25; GFX900-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 26; GFX900-NEXT: s_andn2_b64 exec, exec, s[2:3] 27; GFX900-NEXT: s_cbranch_execnz BB0_1 28; GFX900-NEXT: ; %bb.2: ; %atomicrmw.end 29; GFX900-NEXT: s_or_b64 exec, exec, s[2:3] 30; GFX900-NEXT: global_store_dword v[0:1], v0, off 31; GFX900-NEXT: s_endpgm 32; 33; GFX908-LABEL: global_atomic_fadd_ret_f32: 34; GFX908: ; %bb.0: 35; GFX908-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 36; GFX908-NEXT: s_mov_b64 s[2:3], 0 37; GFX908-NEXT: s_waitcnt lgkmcnt(0) 38; GFX908-NEXT: s_load_dword s4, s[0:1], 0x0 39; GFX908-NEXT: s_waitcnt lgkmcnt(0) 40; GFX908-NEXT: v_mov_b32_e32 v0, s4 41; GFX908-NEXT: BB0_1: ; %atomicrmw.start 42; GFX908-NEXT: ; =>This Inner Loop Header: Depth=1 43; GFX908-NEXT: v_mov_b32_e32 v1, v0 44; GFX908-NEXT: v_mov_b32_e32 v2, 0 45; GFX908-NEXT: v_add_f32_e32 v0, 4.0, v1 46; GFX908-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 47; GFX908-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc 48; GFX908-NEXT: s_waitcnt vmcnt(0) 49; GFX908-NEXT: buffer_wbinvl1_vol 50; GFX908-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1 51; GFX908-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 52; GFX908-NEXT: s_andn2_b64 exec, exec, s[2:3] 53; GFX908-NEXT: s_cbranch_execnz BB0_1 54; GFX908-NEXT: ; %bb.2: ; %atomicrmw.end 55; GFX908-NEXT: s_or_b64 exec, exec, s[2:3] 56; GFX908-NEXT: global_store_dword v[0:1], v0, off 57; GFX908-NEXT: s_endpgm 58; 59; GFX90A-LABEL: global_atomic_fadd_ret_f32: 60; GFX90A: ; %bb.0: 61; GFX90A-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 62; GFX90A-NEXT: v_mov_b32_e32 v0, 0 63; GFX90A-NEXT: v_mov_b32_e32 v1, 4.0 64; GFX90A-NEXT: buffer_wbl2 65; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 66; GFX90A-NEXT: global_atomic_add_f32 v0, v0, v1, s[0:1] glc scc 67; GFX90A-NEXT: s_waitcnt vmcnt(0) 68; GFX90A-NEXT: buffer_invl2 69; GFX90A-NEXT: s_waitcnt vmcnt(0) 70; GFX90A-NEXT: buffer_wbinvl1_vol 71; GFX90A-NEXT: global_store_dword v[0:1], v0, off 72; GFX90A-NEXT: s_endpgm 73 %result = atomicrmw fadd float addrspace(1)* %ptr, float 4.0 seq_cst 74 store float %result, float addrspace(1)* undef 75 ret void 76} 77 78define amdgpu_kernel void @global_atomic_fadd_ret_f32_ieee(float addrspace(1)* %ptr) #2 { 79; GFX900-LABEL: global_atomic_fadd_ret_f32_ieee: 80; GFX900: ; %bb.0: 81; GFX900-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 82; GFX900-NEXT: s_mov_b64 s[2:3], 0 83; GFX900-NEXT: s_waitcnt lgkmcnt(0) 84; GFX900-NEXT: s_load_dword s4, s[0:1], 0x0 85; GFX900-NEXT: s_waitcnt lgkmcnt(0) 86; GFX900-NEXT: v_mov_b32_e32 v0, s4 87; GFX900-NEXT: BB1_1: ; %atomicrmw.start 88; GFX900-NEXT: ; =>This Inner Loop Header: Depth=1 89; GFX900-NEXT: v_mov_b32_e32 v1, v0 90; GFX900-NEXT: v_mov_b32_e32 v2, 0 91; GFX900-NEXT: v_add_f32_e32 v0, 4.0, v1 92; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 93; GFX900-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc 94; GFX900-NEXT: s_waitcnt vmcnt(0) 95; GFX900-NEXT: buffer_wbinvl1_vol 96; GFX900-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1 97; GFX900-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 98; GFX900-NEXT: s_andn2_b64 exec, exec, s[2:3] 99; GFX900-NEXT: s_cbranch_execnz BB1_1 100; GFX900-NEXT: ; %bb.2: ; %atomicrmw.end 101; GFX900-NEXT: s_or_b64 exec, exec, s[2:3] 102; GFX900-NEXT: global_store_dword v[0:1], v0, off 103; GFX900-NEXT: s_endpgm 104; 105; GFX908-LABEL: global_atomic_fadd_ret_f32_ieee: 106; GFX908: ; %bb.0: 107; GFX908-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 108; GFX908-NEXT: s_mov_b64 s[2:3], 0 109; GFX908-NEXT: s_waitcnt lgkmcnt(0) 110; GFX908-NEXT: s_load_dword s4, s[0:1], 0x0 111; GFX908-NEXT: s_waitcnt lgkmcnt(0) 112; GFX908-NEXT: v_mov_b32_e32 v0, s4 113; GFX908-NEXT: BB1_1: ; %atomicrmw.start 114; GFX908-NEXT: ; =>This Inner Loop Header: Depth=1 115; GFX908-NEXT: v_mov_b32_e32 v1, v0 116; GFX908-NEXT: v_mov_b32_e32 v2, 0 117; GFX908-NEXT: v_add_f32_e32 v0, 4.0, v1 118; GFX908-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 119; GFX908-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc 120; GFX908-NEXT: s_waitcnt vmcnt(0) 121; GFX908-NEXT: buffer_wbinvl1_vol 122; GFX908-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1 123; GFX908-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 124; GFX908-NEXT: s_andn2_b64 exec, exec, s[2:3] 125; GFX908-NEXT: s_cbranch_execnz BB1_1 126; GFX908-NEXT: ; %bb.2: ; %atomicrmw.end 127; GFX908-NEXT: s_or_b64 exec, exec, s[2:3] 128; GFX908-NEXT: global_store_dword v[0:1], v0, off 129; GFX908-NEXT: s_endpgm 130; 131; GFX90A-LABEL: global_atomic_fadd_ret_f32_ieee: 132; GFX90A: ; %bb.0: 133; GFX90A-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 134; GFX90A-NEXT: s_mov_b64 s[2:3], 0 135; GFX90A-NEXT: s_waitcnt lgkmcnt(0) 136; GFX90A-NEXT: s_load_dword s4, s[0:1], 0x0 137; GFX90A-NEXT: s_waitcnt lgkmcnt(0) 138; GFX90A-NEXT: v_mov_b32_e32 v0, s4 139; GFX90A-NEXT: BB1_1: ; %atomicrmw.start 140; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=1 141; GFX90A-NEXT: v_mov_b32_e32 v3, v0 142; GFX90A-NEXT: v_mov_b32_e32 v2, 0 143; GFX90A-NEXT: v_add_f32_e32 v0, 4.0, v3 144; GFX90A-NEXT: v_mov_b32_e32 v1, v3 145; GFX90A-NEXT: buffer_wbl2 146; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 147; GFX90A-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc scc 148; GFX90A-NEXT: s_waitcnt vmcnt(0) 149; GFX90A-NEXT: buffer_invl2 150; GFX90A-NEXT: s_waitcnt vmcnt(0) 151; GFX90A-NEXT: buffer_wbinvl1_vol 152; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v0, v3 153; GFX90A-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 154; GFX90A-NEXT: s_andn2_b64 exec, exec, s[2:3] 155; GFX90A-NEXT: s_cbranch_execnz BB1_1 156; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end 157; GFX90A-NEXT: s_or_b64 exec, exec, s[2:3] 158; GFX90A-NEXT: global_store_dword v[0:1], v0, off 159; GFX90A-NEXT: s_endpgm 160 %result = atomicrmw fadd float addrspace(1)* %ptr, float 4.0 seq_cst 161 store float %result, float addrspace(1)* undef 162 ret void 163} 164 165define amdgpu_kernel void @global_atomic_fadd_noret_f32(float addrspace(1)* %ptr) #0 { 166; GFX900-LABEL: global_atomic_fadd_noret_f32: 167; GFX900: ; %bb.0: 168; GFX900-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 169; GFX900-NEXT: s_mov_b64 s[2:3], 0 170; GFX900-NEXT: s_waitcnt lgkmcnt(0) 171; GFX900-NEXT: s_load_dword s4, s[0:1], 0x0 172; GFX900-NEXT: s_waitcnt lgkmcnt(0) 173; GFX900-NEXT: v_mov_b32_e32 v1, s4 174; GFX900-NEXT: BB2_1: ; %atomicrmw.start 175; GFX900-NEXT: ; =>This Inner Loop Header: Depth=1 176; GFX900-NEXT: v_mov_b32_e32 v2, 0 177; GFX900-NEXT: v_add_f32_e32 v0, 4.0, v1 178; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 179; GFX900-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc 180; GFX900-NEXT: s_waitcnt vmcnt(0) 181; GFX900-NEXT: buffer_wbinvl1_vol 182; GFX900-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1 183; GFX900-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 184; GFX900-NEXT: v_mov_b32_e32 v1, v0 185; GFX900-NEXT: s_andn2_b64 exec, exec, s[2:3] 186; GFX900-NEXT: s_cbranch_execnz BB2_1 187; GFX900-NEXT: ; %bb.2: ; %atomicrmw.end 188; GFX900-NEXT: s_endpgm 189; 190; GFX908-LABEL: global_atomic_fadd_noret_f32: 191; GFX908: ; %bb.0: 192; GFX908-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 193; GFX908-NEXT: v_mov_b32_e32 v0, 0 194; GFX908-NEXT: v_mov_b32_e32 v1, 4.0 195; GFX908-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 196; GFX908-NEXT: global_atomic_add_f32 v0, v1, s[0:1] 197; GFX908-NEXT: s_waitcnt vmcnt(0) 198; GFX908-NEXT: buffer_wbinvl1_vol 199; GFX908-NEXT: s_endpgm 200; 201; GFX90A-LABEL: global_atomic_fadd_noret_f32: 202; GFX90A: ; %bb.0: 203; GFX90A-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 204; GFX90A-NEXT: v_mov_b32_e32 v0, 0 205; GFX90A-NEXT: v_mov_b32_e32 v1, 4.0 206; GFX90A-NEXT: buffer_wbl2 207; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 208; GFX90A-NEXT: global_atomic_add_f32 v0, v1, s[0:1] scc 209; GFX90A-NEXT: s_waitcnt vmcnt(0) 210; GFX90A-NEXT: buffer_invl2 211; GFX90A-NEXT: s_waitcnt vmcnt(0) 212; GFX90A-NEXT: buffer_wbinvl1_vol 213; GFX90A-NEXT: s_endpgm 214 %result = atomicrmw fadd float addrspace(1)* %ptr, float 4.0 seq_cst 215 ret void 216} 217 218define amdgpu_kernel void @global_atomic_fadd_noret_f32_ieee(float addrspace(1)* %ptr) #2 { 219; GFX900-LABEL: global_atomic_fadd_noret_f32_ieee: 220; GFX900: ; %bb.0: 221; GFX900-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 222; GFX900-NEXT: s_mov_b64 s[2:3], 0 223; GFX900-NEXT: s_waitcnt lgkmcnt(0) 224; GFX900-NEXT: s_load_dword s4, s[0:1], 0x0 225; GFX900-NEXT: s_waitcnt lgkmcnt(0) 226; GFX900-NEXT: v_mov_b32_e32 v1, s4 227; GFX900-NEXT: BB3_1: ; %atomicrmw.start 228; GFX900-NEXT: ; =>This Inner Loop Header: Depth=1 229; GFX900-NEXT: v_mov_b32_e32 v2, 0 230; GFX900-NEXT: v_add_f32_e32 v0, 4.0, v1 231; GFX900-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 232; GFX900-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc 233; GFX900-NEXT: s_waitcnt vmcnt(0) 234; GFX900-NEXT: buffer_wbinvl1_vol 235; GFX900-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1 236; GFX900-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 237; GFX900-NEXT: v_mov_b32_e32 v1, v0 238; GFX900-NEXT: s_andn2_b64 exec, exec, s[2:3] 239; GFX900-NEXT: s_cbranch_execnz BB3_1 240; GFX900-NEXT: ; %bb.2: ; %atomicrmw.end 241; GFX900-NEXT: s_endpgm 242; 243; GFX908-LABEL: global_atomic_fadd_noret_f32_ieee: 244; GFX908: ; %bb.0: 245; GFX908-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 246; GFX908-NEXT: s_mov_b64 s[2:3], 0 247; GFX908-NEXT: s_waitcnt lgkmcnt(0) 248; GFX908-NEXT: s_load_dword s4, s[0:1], 0x0 249; GFX908-NEXT: s_waitcnt lgkmcnt(0) 250; GFX908-NEXT: v_mov_b32_e32 v1, s4 251; GFX908-NEXT: BB3_1: ; %atomicrmw.start 252; GFX908-NEXT: ; =>This Inner Loop Header: Depth=1 253; GFX908-NEXT: v_mov_b32_e32 v2, 0 254; GFX908-NEXT: v_add_f32_e32 v0, 4.0, v1 255; GFX908-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 256; GFX908-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc 257; GFX908-NEXT: s_waitcnt vmcnt(0) 258; GFX908-NEXT: buffer_wbinvl1_vol 259; GFX908-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1 260; GFX908-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 261; GFX908-NEXT: v_mov_b32_e32 v1, v0 262; GFX908-NEXT: s_andn2_b64 exec, exec, s[2:3] 263; GFX908-NEXT: s_cbranch_execnz BB3_1 264; GFX908-NEXT: ; %bb.2: ; %atomicrmw.end 265; GFX908-NEXT: s_endpgm 266; 267; GFX90A-LABEL: global_atomic_fadd_noret_f32_ieee: 268; GFX90A: ; %bb.0: 269; GFX90A-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 270; GFX90A-NEXT: s_mov_b64 s[2:3], 0 271; GFX90A-NEXT: s_waitcnt lgkmcnt(0) 272; GFX90A-NEXT: s_load_dword s4, s[0:1], 0x0 273; GFX90A-NEXT: s_waitcnt lgkmcnt(0) 274; GFX90A-NEXT: v_mov_b32_e32 v0, s4 275; GFX90A-NEXT: BB3_1: ; %atomicrmw.start 276; GFX90A-NEXT: ; =>This Inner Loop Header: Depth=1 277; GFX90A-NEXT: v_mov_b32_e32 v1, 0 278; GFX90A-NEXT: v_add_f32_e32 v2, 4.0, v0 279; GFX90A-NEXT: v_mov_b32_e32 v3, v0 280; GFX90A-NEXT: buffer_wbl2 281; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 282; GFX90A-NEXT: global_atomic_cmpswap v1, v1, v[2:3], s[0:1] glc scc 283; GFX90A-NEXT: s_waitcnt vmcnt(0) 284; GFX90A-NEXT: buffer_invl2 285; GFX90A-NEXT: s_waitcnt vmcnt(0) 286; GFX90A-NEXT: buffer_wbinvl1_vol 287; GFX90A-NEXT: v_cmp_eq_u32_e32 vcc, v1, v0 288; GFX90A-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 289; GFX90A-NEXT: v_mov_b32_e32 v0, v1 290; GFX90A-NEXT: s_andn2_b64 exec, exec, s[2:3] 291; GFX90A-NEXT: s_cbranch_execnz BB3_1 292; GFX90A-NEXT: ; %bb.2: ; %atomicrmw.end 293; GFX90A-NEXT: s_endpgm 294 %result = atomicrmw fadd float addrspace(1)* %ptr, float 4.0 seq_cst 295 ret void 296} 297 298define amdgpu_kernel void @global_atomic_fadd_ret_f32_wrong_subtarget(float addrspace(1)* %ptr) #1 { 299; GCN-LABEL: global_atomic_fadd_ret_f32_wrong_subtarget: 300; GCN: ; %bb.0: 301; GCN-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 302; GCN-NEXT: s_mov_b64 s[2:3], 0 303; GCN-NEXT: s_waitcnt lgkmcnt(0) 304; GCN-NEXT: s_load_dword s4, s[0:1], 0x0 305; GCN-NEXT: s_waitcnt lgkmcnt(0) 306; GCN-NEXT: v_mov_b32_e32 v0, s4 307; GCN-NEXT: BB4_1: ; %atomicrmw.start 308; GCN-NEXT: ; =>This Inner Loop Header: Depth=1 309; GCN-NEXT: v_mov_b32_e32 v1, v0 310; GCN-NEXT: v_mov_b32_e32 v2, 0 311; GCN-NEXT: v_add_f32_e32 v0, 4.0, v1 312; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 313; GCN-NEXT: global_atomic_cmpswap v0, v2, v[0:1], s[0:1] glc 314; GCN-NEXT: s_waitcnt vmcnt(0) 315; GCN-NEXT: buffer_wbinvl1_vol 316; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v0, v1 317; GCN-NEXT: s_or_b64 s[2:3], vcc, s[2:3] 318; GCN-NEXT: s_andn2_b64 exec, exec, s[2:3] 319; GCN-NEXT: s_cbranch_execnz BB4_1 320; GCN-NEXT: ; %bb.2: ; %atomicrmw.end 321; GCN-NEXT: s_or_b64 exec, exec, s[2:3] 322; GCN-NEXT: global_store_dword v[0:1], v0, off 323; GCN-NEXT: s_endpgm 324 %result = atomicrmw fadd float addrspace(1)* %ptr, float 4.0 seq_cst 325 store float %result, float addrspace(1)* undef 326 ret void 327} 328 329define amdgpu_kernel void @global_atomic_fadd_noret_f32_wrong_subtarget(float addrspace(1)* %ptr) #1 { 330; GCN-LABEL: global_atomic_fadd_noret_f32_wrong_subtarget: 331; GCN: ; %bb.0: 332; GCN-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x24 333; GCN-NEXT: v_mov_b32_e32 v0, 0 334; GCN-NEXT: v_mov_b32_e32 v1, 4.0 335; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0) 336; GCN-NEXT: global_atomic_add_f32 v0, v1, s[0:1] 337; GCN-NEXT: s_waitcnt vmcnt(0) 338; GCN-NEXT: buffer_wbinvl1_vol 339; GCN-NEXT: s_endpgm 340 %result = atomicrmw fadd float addrspace(1)* %ptr, float 4.0 seq_cst 341 ret void 342} 343 344attributes #0 = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" "amdgpu-unsafe-fp-atomics"="true" } 345attributes #1 = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" "target-cpu"="gfx803" "target-features"="+atomic-fadd-insts" "amdgpu-unsafe-fp-atomics"="true" } 346attributes #2 = { "amdgpu-unsafe-fp-atomics"="true" } 347