1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx940 < %s | FileCheck %s -check-prefixes=GFX940-SDAG 3; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx940 < %s | FileCheck %s -check-prefixes=GFX940-GISEL 4; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx1100 < %s | FileCheck %s -check-prefixes=GFX11-SDAG 5; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx1100 < %s | FileCheck %s -check-prefixes=GFX11-GISEL 6 7; Test flat scratch SVS addressing mode with various combinations of alignment 8; of soffset, voffset and inst_offset. 9 10declare i32 @llvm.amdgcn.workitem.id.x() 11 12define amdgpu_kernel void @soff1_voff1(i32 %soff) { 13; GFX940-SDAG-LABEL: soff1_voff1: 14; GFX940-SDAG: ; %bb.0: ; %bb 15; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 16; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 17; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 18; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 19; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 20; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 21; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 22; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 23; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 24; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 25; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 26; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 27; GFX940-SDAG-NEXT: s_endpgm 28; 29; GFX940-GISEL-LABEL: soff1_voff1: 30; GFX940-GISEL: ; %bb.0: ; %bb 31; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 32; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 33; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 34; GFX940-GISEL-NEXT: v_mov_b32_e32 v3, 2 35; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 36; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 37; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 38; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 39; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 40; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 41; GFX940-GISEL-NEXT: scratch_store_byte v0, v3, off offset:2 sc0 sc1 42; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 43; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 44; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 45; GFX940-GISEL-NEXT: s_endpgm 46; 47; GFX11-SDAG-LABEL: soff1_voff1: 48; GFX11-SDAG: ; %bb.0: ; %bb 49; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 50; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 51; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 2 52; GFX11-SDAG-NEXT: v_mov_b32_e32 v3, 4 53; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 54; GFX11-SDAG-NEXT: v_add3_u32 v0, 4, s0, v0 55; GFX11-SDAG-NEXT: scratch_store_b8 v0, v1, off offset:1 dlc 56; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 57; GFX11-SDAG-NEXT: scratch_store_b8 v0, v2, off offset:2 dlc 58; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 59; GFX11-SDAG-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 60; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 61; GFX11-SDAG-NEXT: s_endpgm 62; 63; GFX11-GISEL-LABEL: soff1_voff1: 64; GFX11-GISEL: ; %bb.0: ; %bb 65; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 66; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 67; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 68; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 69; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 70; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) 71; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 72; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 73; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 74; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 75; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 76; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 77; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 78; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 79; GFX11-GISEL-NEXT: s_endpgm 80bb: 81 %soff1 = mul i32 %soff, 1 82 %a = alloca i8, i32 64, align 4, addrspace(5) 83 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff1 84 %voff = call i32 @llvm.amdgcn.workitem.id.x() 85 %voff1 = mul i32 %voff, 1 86 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff1 87 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 88 store volatile i8 1, i8 addrspace(5)* %p1 89 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 90 store volatile i8 2, i8 addrspace(5)* %p2 91 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 92 store volatile i8 4, i8 addrspace(5)* %p4 93 ret void 94} 95 96define amdgpu_kernel void @soff1_voff2(i32 %soff) { 97; GFX940-SDAG-LABEL: soff1_voff2: 98; GFX940-SDAG: ; %bb.0: ; %bb 99; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 100; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 101; GFX940-SDAG-NEXT: v_lshlrev_b32_e32 v0, 1, v0 102; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 103; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 104; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 105; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 106; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 107; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 108; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 109; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 110; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 111; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 112; GFX940-SDAG-NEXT: s_endpgm 113; 114; GFX940-GISEL-LABEL: soff1_voff2: 115; GFX940-GISEL: ; %bb.0: ; %bb 116; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 117; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 118; GFX940-GISEL-NEXT: v_lshlrev_b32_e32 v0, 1, v0 119; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 120; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 121; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 122; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 123; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 2 124; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 125; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 126; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:2 sc0 sc1 127; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 128; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 129; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 130; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 131; GFX940-GISEL-NEXT: s_endpgm 132; 133; GFX11-SDAG-LABEL: soff1_voff2: 134; GFX11-SDAG: ; %bb.0: ; %bb 135; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 136; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 1, v0 137; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 138; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 2 139; GFX11-SDAG-NEXT: v_mov_b32_e32 v3, 4 140; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 141; GFX11-SDAG-NEXT: v_add3_u32 v0, 4, s0, v0 142; GFX11-SDAG-NEXT: scratch_store_b8 v0, v1, off offset:1 dlc 143; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 144; GFX11-SDAG-NEXT: scratch_store_b8 v0, v2, off offset:2 dlc 145; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 146; GFX11-SDAG-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 147; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 148; GFX11-SDAG-NEXT: s_endpgm 149; 150; GFX11-GISEL-LABEL: soff1_voff2: 151; GFX11-GISEL: ; %bb.0: ; %bb 152; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 153; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 1, v0 154; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 155; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 156; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 157; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 158; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) 159; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 160; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 161; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 162; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 163; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 164; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 165; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 166; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 167; GFX11-GISEL-NEXT: s_endpgm 168bb: 169 %soff1 = mul i32 %soff, 1 170 %a = alloca i8, i32 64, align 4, addrspace(5) 171 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff1 172 %voff = call i32 @llvm.amdgcn.workitem.id.x() 173 %voff2 = mul i32 %voff, 2 174 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff2 175 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 176 store volatile i8 1, i8 addrspace(5)* %p1 177 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 178 store volatile i8 2, i8 addrspace(5)* %p2 179 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 180 store volatile i8 4, i8 addrspace(5)* %p4 181 ret void 182} 183 184define amdgpu_kernel void @soff1_voff4(i32 %soff) { 185; GFX940-SDAG-LABEL: soff1_voff4: 186; GFX940-SDAG: ; %bb.0: ; %bb 187; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 188; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 189; GFX940-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 190; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 191; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 192; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 193; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 194; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 195; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 196; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 197; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 198; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 199; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 200; GFX940-SDAG-NEXT: s_endpgm 201; 202; GFX940-GISEL-LABEL: soff1_voff4: 203; GFX940-GISEL: ; %bb.0: ; %bb 204; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 205; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 206; GFX940-GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0 207; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 208; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 209; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 210; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 211; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 2 212; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 213; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 214; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:2 sc0 sc1 215; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 216; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 217; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 218; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 219; GFX940-GISEL-NEXT: s_endpgm 220; 221; GFX11-SDAG-LABEL: soff1_voff4: 222; GFX11-SDAG: ; %bb.0: ; %bb 223; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 224; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 225; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 226; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 2 227; GFX11-SDAG-NEXT: v_mov_b32_e32 v3, 4 228; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 229; GFX11-SDAG-NEXT: s_add_i32 s0, s0, 4 230; GFX11-SDAG-NEXT: scratch_store_b8 v0, v1, s0 offset:1 dlc 231; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 232; GFX11-SDAG-NEXT: scratch_store_b8 v0, v2, s0 offset:2 dlc 233; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 234; GFX11-SDAG-NEXT: scratch_store_b8 v0, v3, s0 offset:4 dlc 235; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 236; GFX11-SDAG-NEXT: s_endpgm 237; 238; GFX11-GISEL-LABEL: soff1_voff4: 239; GFX11-GISEL: ; %bb.0: ; %bb 240; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 241; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0 242; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 243; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 244; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 245; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 246; GFX11-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) 247; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 248; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 249; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 250; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 251; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 252; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 253; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 254; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 255; GFX11-GISEL-NEXT: s_endpgm 256bb: 257 %soff1 = mul i32 %soff, 1 258 %a = alloca i8, i32 64, align 4, addrspace(5) 259 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff1 260 %voff = call i32 @llvm.amdgcn.workitem.id.x() 261 %voff4 = mul i32 %voff, 4 262 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff4 263 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 264 store volatile i8 1, i8 addrspace(5)* %p1 265 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 266 store volatile i8 2, i8 addrspace(5)* %p2 267 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 268 store volatile i8 4, i8 addrspace(5)* %p4 269 ret void 270} 271 272define amdgpu_kernel void @soff2_voff1(i32 %soff) { 273; GFX940-SDAG-LABEL: soff2_voff1: 274; GFX940-SDAG: ; %bb.0: ; %bb 275; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 276; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 277; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 278; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 279; GFX940-SDAG-NEXT: s_lshl_b32 s0, s0, 1 280; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 281; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 282; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 283; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 284; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 285; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 286; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 287; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 288; GFX940-SDAG-NEXT: s_endpgm 289; 290; GFX940-GISEL-LABEL: soff2_voff1: 291; GFX940-GISEL: ; %bb.0: ; %bb 292; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 293; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 294; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 295; GFX940-GISEL-NEXT: v_mov_b32_e32 v3, 2 296; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 297; GFX940-GISEL-NEXT: s_lshl_b32 s0, s0, 1 298; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 299; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 300; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 301; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 302; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 303; GFX940-GISEL-NEXT: scratch_store_byte v0, v3, off offset:2 sc0 sc1 304; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 305; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 306; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 307; GFX940-GISEL-NEXT: s_endpgm 308; 309; GFX11-SDAG-LABEL: soff2_voff1: 310; GFX11-SDAG: ; %bb.0: ; %bb 311; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 312; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 313; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 2 314; GFX11-SDAG-NEXT: v_mov_b32_e32 v3, 4 315; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 316; GFX11-SDAG-NEXT: s_lshl_b32 s0, s0, 1 317; GFX11-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) 318; GFX11-SDAG-NEXT: v_add3_u32 v0, 4, s0, v0 319; GFX11-SDAG-NEXT: scratch_store_b8 v0, v1, off offset:1 dlc 320; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 321; GFX11-SDAG-NEXT: scratch_store_b8 v0, v2, off offset:2 dlc 322; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 323; GFX11-SDAG-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 324; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 325; GFX11-SDAG-NEXT: s_endpgm 326; 327; GFX11-GISEL-LABEL: soff2_voff1: 328; GFX11-GISEL: ; %bb.0: ; %bb 329; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 330; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 331; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 332; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 333; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 1 334; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) 335; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 336; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 337; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 338; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 339; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 340; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 341; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 342; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 343; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 344; GFX11-GISEL-NEXT: s_endpgm 345bb: 346 %soff2 = mul i32 %soff, 2 347 %a = alloca i8, i32 64, align 4, addrspace(5) 348 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff2 349 %voff = call i32 @llvm.amdgcn.workitem.id.x() 350 %voff1 = mul i32 %voff, 1 351 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff1 352 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 353 store volatile i8 1, i8 addrspace(5)* %p1 354 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 355 store volatile i8 2, i8 addrspace(5)* %p2 356 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 357 store volatile i8 4, i8 addrspace(5)* %p4 358 ret void 359} 360 361define amdgpu_kernel void @soff2_voff2(i32 %soff) { 362; GFX940-SDAG-LABEL: soff2_voff2: 363; GFX940-SDAG: ; %bb.0: ; %bb 364; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 365; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 366; GFX940-SDAG-NEXT: v_lshlrev_b32_e32 v0, 1, v0 367; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 368; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 369; GFX940-SDAG-NEXT: s_lshl_b32 s0, s0, 1 370; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 371; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 372; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 373; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 374; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 375; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 376; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 377; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 378; GFX940-SDAG-NEXT: s_endpgm 379; 380; GFX940-GISEL-LABEL: soff2_voff2: 381; GFX940-GISEL: ; %bb.0: ; %bb 382; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 383; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 384; GFX940-GISEL-NEXT: v_lshlrev_b32_e32 v0, 1, v0 385; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 386; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 387; GFX940-GISEL-NEXT: s_lshl_b32 s0, s0, 1 388; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 389; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 390; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 2 391; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 392; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 393; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:2 sc0 sc1 394; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 395; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 396; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 397; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 398; GFX940-GISEL-NEXT: s_endpgm 399; 400; GFX11-SDAG-LABEL: soff2_voff2: 401; GFX11-SDAG: ; %bb.0: ; %bb 402; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 403; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 1, v0 404; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 405; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 2 406; GFX11-SDAG-NEXT: v_mov_b32_e32 v3, 4 407; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 408; GFX11-SDAG-NEXT: s_lshl_b32 s0, s0, 1 409; GFX11-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) 410; GFX11-SDAG-NEXT: v_add3_u32 v0, 4, s0, v0 411; GFX11-SDAG-NEXT: scratch_store_b8 v0, v1, off offset:1 dlc 412; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 413; GFX11-SDAG-NEXT: scratch_store_b8 v0, v2, off offset:2 dlc 414; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 415; GFX11-SDAG-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 416; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 417; GFX11-SDAG-NEXT: s_endpgm 418; 419; GFX11-GISEL-LABEL: soff2_voff2: 420; GFX11-GISEL: ; %bb.0: ; %bb 421; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 422; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 1, v0 423; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 424; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 425; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 426; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 1 427; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) 428; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 429; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 430; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 431; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 432; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 433; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 434; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 435; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 436; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 437; GFX11-GISEL-NEXT: s_endpgm 438bb: 439 %soff2 = mul i32 %soff, 2 440 %a = alloca i8, i32 64, align 4, addrspace(5) 441 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff2 442 %voff = call i32 @llvm.amdgcn.workitem.id.x() 443 %voff2 = mul i32 %voff, 2 444 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff2 445 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 446 store volatile i8 1, i8 addrspace(5)* %p1 447 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 448 store volatile i8 2, i8 addrspace(5)* %p2 449 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 450 store volatile i8 4, i8 addrspace(5)* %p4 451 ret void 452} 453 454define amdgpu_kernel void @soff2_voff4(i32 %soff) { 455; GFX940-SDAG-LABEL: soff2_voff4: 456; GFX940-SDAG: ; %bb.0: ; %bb 457; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 458; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 459; GFX940-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 460; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 461; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 462; GFX940-SDAG-NEXT: s_lshl_b32 s0, s0, 1 463; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 464; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 465; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 466; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 467; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 468; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 469; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 470; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 471; GFX940-SDAG-NEXT: s_endpgm 472; 473; GFX940-GISEL-LABEL: soff2_voff4: 474; GFX940-GISEL: ; %bb.0: ; %bb 475; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 476; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 477; GFX940-GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0 478; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 479; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 480; GFX940-GISEL-NEXT: s_lshl_b32 s0, s0, 1 481; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 482; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 483; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 2 484; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 485; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 486; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:2 sc0 sc1 487; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 488; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 489; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 490; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 491; GFX940-GISEL-NEXT: s_endpgm 492; 493; GFX11-SDAG-LABEL: soff2_voff4: 494; GFX11-SDAG: ; %bb.0: ; %bb 495; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 496; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 497; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 498; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 2 499; GFX11-SDAG-NEXT: v_mov_b32_e32 v3, 4 500; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 501; GFX11-SDAG-NEXT: s_lshl_b32 s0, s0, 1 502; GFX11-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) 503; GFX11-SDAG-NEXT: s_add_i32 s0, s0, 4 504; GFX11-SDAG-NEXT: scratch_store_b8 v0, v1, s0 offset:1 dlc 505; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 506; GFX11-SDAG-NEXT: scratch_store_b8 v0, v2, s0 offset:2 dlc 507; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 508; GFX11-SDAG-NEXT: scratch_store_b8 v0, v3, s0 offset:4 dlc 509; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 510; GFX11-SDAG-NEXT: s_endpgm 511; 512; GFX11-GISEL-LABEL: soff2_voff4: 513; GFX11-GISEL: ; %bb.0: ; %bb 514; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 515; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0 516; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 517; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 518; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 519; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 1 520; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) 521; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 522; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 523; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 524; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 525; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 526; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 527; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 528; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 529; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 530; GFX11-GISEL-NEXT: s_endpgm 531bb: 532 %soff2 = mul i32 %soff, 2 533 %a = alloca i8, i32 64, align 4, addrspace(5) 534 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff2 535 %voff = call i32 @llvm.amdgcn.workitem.id.x() 536 %voff4 = mul i32 %voff, 4 537 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff4 538 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 539 store volatile i8 1, i8 addrspace(5)* %p1 540 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 541 store volatile i8 2, i8 addrspace(5)* %p2 542 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 543 store volatile i8 4, i8 addrspace(5)* %p4 544 ret void 545} 546 547define amdgpu_kernel void @soff4_voff1(i32 %soff) { 548; GFX940-SDAG-LABEL: soff4_voff1: 549; GFX940-SDAG: ; %bb.0: ; %bb 550; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 551; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 552; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 553; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 554; GFX940-SDAG-NEXT: s_lshl_b32 s0, s0, 2 555; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 556; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 557; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 558; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 559; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 560; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 561; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 562; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 563; GFX940-SDAG-NEXT: s_endpgm 564; 565; GFX940-GISEL-LABEL: soff4_voff1: 566; GFX940-GISEL: ; %bb.0: ; %bb 567; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 568; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 569; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 570; GFX940-GISEL-NEXT: v_mov_b32_e32 v3, 2 571; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 572; GFX940-GISEL-NEXT: s_lshl_b32 s0, s0, 2 573; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 574; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 575; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 576; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 577; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 578; GFX940-GISEL-NEXT: scratch_store_byte v0, v3, off offset:2 sc0 sc1 579; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 580; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 581; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 582; GFX940-GISEL-NEXT: s_endpgm 583; 584; GFX11-SDAG-LABEL: soff4_voff1: 585; GFX11-SDAG: ; %bb.0: ; %bb 586; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 587; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 588; GFX11-SDAG-NEXT: v_mov_b32_e32 v3, 2 589; GFX11-SDAG-NEXT: v_mov_b32_e32 v4, 4 590; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 591; GFX11-SDAG-NEXT: s_lshl_b32 s0, s0, 2 592; GFX11-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) 593; GFX11-SDAG-NEXT: v_add3_u32 v2, 4, s0, v0 594; GFX11-SDAG-NEXT: s_add_i32 s0, s0, 4 595; GFX11-SDAG-NEXT: scratch_store_b8 v2, v1, off offset:1 dlc 596; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 597; GFX11-SDAG-NEXT: scratch_store_b8 v2, v3, off offset:2 dlc 598; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 599; GFX11-SDAG-NEXT: scratch_store_b8 v0, v4, s0 offset:4 dlc 600; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 601; GFX11-SDAG-NEXT: s_endpgm 602; 603; GFX11-GISEL-LABEL: soff4_voff1: 604; GFX11-GISEL: ; %bb.0: ; %bb 605; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 606; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 607; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 608; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 609; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 610; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) 611; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 612; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 613; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 614; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 615; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 616; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 617; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 618; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 619; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 620; GFX11-GISEL-NEXT: s_endpgm 621bb: 622 %soff4 = mul i32 %soff, 4 623 %a = alloca i8, i32 64, align 4, addrspace(5) 624 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff4 625 %voff = call i32 @llvm.amdgcn.workitem.id.x() 626 %voff1 = mul i32 %voff, 1 627 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff1 628 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 629 store volatile i8 1, i8 addrspace(5)* %p1 630 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 631 store volatile i8 2, i8 addrspace(5)* %p2 632 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 633 store volatile i8 4, i8 addrspace(5)* %p4 634 ret void 635} 636 637define amdgpu_kernel void @soff4_voff2(i32 %soff) { 638; GFX940-SDAG-LABEL: soff4_voff2: 639; GFX940-SDAG: ; %bb.0: ; %bb 640; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 641; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 642; GFX940-SDAG-NEXT: v_lshlrev_b32_e32 v0, 1, v0 643; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 644; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 645; GFX940-SDAG-NEXT: s_lshl_b32 s0, s0, 2 646; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 647; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 648; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 649; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 650; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 651; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 652; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 653; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 654; GFX940-SDAG-NEXT: s_endpgm 655; 656; GFX940-GISEL-LABEL: soff4_voff2: 657; GFX940-GISEL: ; %bb.0: ; %bb 658; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 659; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 660; GFX940-GISEL-NEXT: v_lshlrev_b32_e32 v0, 1, v0 661; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 662; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 663; GFX940-GISEL-NEXT: s_lshl_b32 s0, s0, 2 664; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 665; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 666; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 2 667; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 668; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 669; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:2 sc0 sc1 670; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 671; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 672; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 673; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 674; GFX940-GISEL-NEXT: s_endpgm 675; 676; GFX11-SDAG-LABEL: soff4_voff2: 677; GFX11-SDAG: ; %bb.0: ; %bb 678; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 679; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 1, v0 680; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 681; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 2 682; GFX11-SDAG-NEXT: v_mov_b32_e32 v4, 4 683; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 684; GFX11-SDAG-NEXT: s_lshl_b32 s0, s0, 2 685; GFX11-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) 686; GFX11-SDAG-NEXT: v_add3_u32 v3, 4, s0, v0 687; GFX11-SDAG-NEXT: s_add_i32 s0, s0, 4 688; GFX11-SDAG-NEXT: scratch_store_b8 v0, v1, s0 offset:1 dlc 689; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 690; GFX11-SDAG-NEXT: scratch_store_b8 v3, v2, off offset:2 dlc 691; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 692; GFX11-SDAG-NEXT: scratch_store_b8 v0, v4, s0 offset:4 dlc 693; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 694; GFX11-SDAG-NEXT: s_endpgm 695; 696; GFX11-GISEL-LABEL: soff4_voff2: 697; GFX11-GISEL: ; %bb.0: ; %bb 698; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 699; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 1, v0 700; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 701; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 702; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 703; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 704; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) 705; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 706; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 707; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 708; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 709; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 710; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 711; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 712; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 713; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 714; GFX11-GISEL-NEXT: s_endpgm 715bb: 716 %soff4 = mul i32 %soff, 4 717 %a = alloca i8, i32 64, align 4, addrspace(5) 718 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff4 719 %voff = call i32 @llvm.amdgcn.workitem.id.x() 720 %voff2 = mul i32 %voff, 2 721 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff2 722 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 723 store volatile i8 1, i8 addrspace(5)* %p1 724 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 725 store volatile i8 2, i8 addrspace(5)* %p2 726 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 727 store volatile i8 4, i8 addrspace(5)* %p4 728 ret void 729} 730 731define amdgpu_kernel void @soff4_voff4(i32 %soff) { 732; GFX940-SDAG-LABEL: soff4_voff4: 733; GFX940-SDAG: ; %bb.0: ; %bb 734; GFX940-SDAG-NEXT: s_load_dword s0, s[0:1], 0x24 735; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 1 736; GFX940-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 737; GFX940-SDAG-NEXT: v_mov_b32_e32 v2, 2 738; GFX940-SDAG-NEXT: s_waitcnt lgkmcnt(0) 739; GFX940-SDAG-NEXT: s_lshl_b32 s0, s0, 2 740; GFX940-SDAG-NEXT: s_add_i32 s0, s0, 4 741; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:1 sc0 sc1 742; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 743; GFX940-SDAG-NEXT: scratch_store_byte v0, v2, s0 offset:2 sc0 sc1 744; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 745; GFX940-SDAG-NEXT: v_mov_b32_e32 v1, 4 746; GFX940-SDAG-NEXT: scratch_store_byte v0, v1, s0 offset:4 sc0 sc1 747; GFX940-SDAG-NEXT: s_waitcnt vmcnt(0) 748; GFX940-SDAG-NEXT: s_endpgm 749; 750; GFX940-GISEL-LABEL: soff4_voff4: 751; GFX940-GISEL: ; %bb.0: ; %bb 752; GFX940-GISEL-NEXT: s_load_dword s0, s[0:1], 0x24 753; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 754; GFX940-GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0 755; GFX940-GISEL-NEXT: v_mov_b32_e32 v2, 1 756; GFX940-GISEL-NEXT: s_waitcnt lgkmcnt(0) 757; GFX940-GISEL-NEXT: s_lshl_b32 s0, s0, 2 758; GFX940-GISEL-NEXT: v_add_u32_e32 v1, s0, v1 759; GFX940-GISEL-NEXT: v_add_u32_e32 v0, v1, v0 760; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 2 761; GFX940-GISEL-NEXT: scratch_store_byte v0, v2, off offset:1 sc0 sc1 762; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 763; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:2 sc0 sc1 764; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 765; GFX940-GISEL-NEXT: v_mov_b32_e32 v1, 4 766; GFX940-GISEL-NEXT: scratch_store_byte v0, v1, off offset:4 sc0 sc1 767; GFX940-GISEL-NEXT: s_waitcnt vmcnt(0) 768; GFX940-GISEL-NEXT: s_endpgm 769; 770; GFX11-SDAG-LABEL: soff4_voff4: 771; GFX11-SDAG: ; %bb.0: ; %bb 772; GFX11-SDAG-NEXT: s_load_b32 s0, s[0:1], 0x24 773; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 1 774; GFX11-SDAG-NEXT: v_lshlrev_b32_e32 v0, 2, v0 775; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 2 776; GFX11-SDAG-NEXT: v_mov_b32_e32 v3, 4 777; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0) 778; GFX11-SDAG-NEXT: s_lshl_b32 s0, s0, 2 779; GFX11-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) 780; GFX11-SDAG-NEXT: s_add_i32 s0, s0, 4 781; GFX11-SDAG-NEXT: scratch_store_b8 v0, v1, s0 offset:1 dlc 782; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 783; GFX11-SDAG-NEXT: scratch_store_b8 v0, v2, s0 offset:2 dlc 784; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 785; GFX11-SDAG-NEXT: scratch_store_b8 v0, v3, s0 offset:4 dlc 786; GFX11-SDAG-NEXT: s_waitcnt_vscnt null, 0x0 787; GFX11-SDAG-NEXT: s_endpgm 788; 789; GFX11-GISEL-LABEL: soff4_voff4: 790; GFX11-GISEL: ; %bb.0: ; %bb 791; GFX11-GISEL-NEXT: s_load_b32 s0, s[0:1], 0x24 792; GFX11-GISEL-NEXT: v_lshlrev_b32_e32 v0, 2, v0 793; GFX11-GISEL-NEXT: v_mov_b32_e32 v2, 1 794; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 4 795; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0) 796; GFX11-GISEL-NEXT: s_lshl_b32 s0, s0, 2 797; GFX11-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) 798; GFX11-GISEL-NEXT: v_add_nc_u32_e64 v1, s0, 4 799; GFX11-GISEL-NEXT: v_add_nc_u32_e32 v0, v1, v0 800; GFX11-GISEL-NEXT: v_mov_b32_e32 v1, 2 801; GFX11-GISEL-NEXT: scratch_store_b8 v0, v2, off offset:1 dlc 802; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 803; GFX11-GISEL-NEXT: scratch_store_b8 v0, v1, off offset:2 dlc 804; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 805; GFX11-GISEL-NEXT: scratch_store_b8 v0, v3, off offset:4 dlc 806; GFX11-GISEL-NEXT: s_waitcnt_vscnt null, 0x0 807; GFX11-GISEL-NEXT: s_endpgm 808bb: 809 %soff4 = mul i32 %soff, 4 810 %a = alloca i8, i32 64, align 4, addrspace(5) 811 %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff4 812 %voff = call i32 @llvm.amdgcn.workitem.id.x() 813 %voff4 = mul i32 %voff, 4 814 %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff4 815 %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1 816 store volatile i8 1, i8 addrspace(5)* %p1 817 %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2 818 store volatile i8 2, i8 addrspace(5)* %p2 819 %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4 820 store volatile i8 4, i8 addrspace(5)* %p4 821 ret void 822} 823