1; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 < %s | FileCheck %s -check-prefixes=GCN,MUBUF 2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-misched=0 -post-RA-scheduler=0 -stress-regalloc=8 -amdgpu-enable-flat-scratch < %s | FileCheck %s -check-prefixes=GCN,FLATSCR 3 4; GCN-LABEL: spill_v2i32: 5; MUBUF-DAG: buffer_store_dword v{{.*}} offset:16 ; 4-byte Folded Spill 6; MUBUF-DAG: buffer_store_dword v{{.*}} offset:20 ; 4-byte Folded Spill 7; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:16 ; 4-byte Folded Spill 8; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:20 ; 4-byte Folded Spill 9; GCN: ;;#ASMSTART 10; GCN-NEXT: ;;#ASMEND 11; MUBUF-DAG: buffer_load_dword v{{.*}} offset:16 ; 4-byte Folded Reload 12; MUBUF-DAG: buffer_load_dword v{{.*}} offset:20 ; 4-byte Folded Reload 13; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:16 ; 4-byte Folded Reload 14; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:20 ; 4-byte Folded Reload 15 16define void @spill_v2i32() { 17entry: 18 %alloca = alloca <2 x i32>, i32 2, align 4, addrspace(5) 19 20 %aptr = getelementptr <2 x i32>, <2 x i32> addrspace(5)* %alloca, i32 1 21 %a = load volatile <2 x i32>, <2 x i32> addrspace(5)* %aptr 22 23 ; Force %a to spill. 24 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" () 25 26 %outptr = getelementptr <2 x i32>, <2 x i32> addrspace(5)* %alloca, i32 1 27 store volatile <2 x i32> %a, <2 x i32> addrspace(5)* %outptr 28 29 ret void 30} 31 32; GCN-LABEL: spill_v2f32: 33; MUBUF-DAG: buffer_store_dword v{{.*}} offset:16 ; 4-byte Folded Spill 34; MUBUF-DAG: buffer_store_dword v{{.*}} offset:20 ; 4-byte Folded Spill 35; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:16 ; 4-byte Folded Spill 36; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:20 ; 4-byte Folded Spill 37; GCN: ;;#ASMSTART 38; GCN-NEXT: ;;#ASMEND 39; MUBUF-DAG: buffer_load_dword v{{.*}} offset:16 ; 4-byte Folded Reload 40; MUBUF-DAG: buffer_load_dword v{{.*}} offset:20 ; 4-byte Folded Reload 41; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:16 ; 4-byte Folded Reload 42; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:20 ; 4-byte Folded Reload 43 44define void @spill_v2f32() { 45entry: 46 %alloca = alloca <2 x i32>, i32 2, align 4, addrspace(5) 47 48 %aptr = getelementptr <2 x i32>, <2 x i32> addrspace(5)* %alloca, i32 1 49 %a = load volatile <2 x i32>, <2 x i32> addrspace(5)* %aptr 50 51 ; Force %a to spill. 52 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" () 53 54 %outptr = getelementptr <2 x i32>, <2 x i32> addrspace(5)* %alloca, i32 1 55 store volatile <2 x i32> %a, <2 x i32> addrspace(5)* %outptr 56 57 ret void 58} 59 60; GCN-LABEL: spill_v3i32: 61; MUBUF-DAG: buffer_store_dword v{{.*}} offset:32 ; 4-byte Folded Spill 62; MUBUF-DAG: buffer_store_dword v{{.*}} offset:36 ; 4-byte Folded Spill 63; MUBUF-DAG: buffer_store_dword v{{.*}} offset:40 ; 4-byte Folded Spill 64; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:32 ; 4-byte Folded Spill 65; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:36 ; 4-byte Folded Spill 66; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:40 ; 4-byte Folded Spill 67; GCN: ;;#ASMSTART 68; GCN-NEXT: ;;#ASMEND 69; MUBUF-DAG: buffer_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload 70; MUBUF-DAG: buffer_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload 71; MUBUF-DAG: buffer_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload 72; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload 73; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload 74; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload 75 76define void @spill_v3i32() { 77entry: 78 %alloca = alloca <3 x i32>, i32 2, align 4, addrspace(5) 79 80 %aptr = getelementptr <3 x i32>, <3 x i32> addrspace(5)* %alloca, i32 1 81 %a = load volatile <3 x i32>, <3 x i32> addrspace(5)* %aptr 82 83 ; Force %a to spill. 84 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" () 85 86 %outptr = getelementptr <3 x i32>, <3 x i32> addrspace(5)* %alloca, i32 1 87 store volatile <3 x i32> %a, <3 x i32> addrspace(5)* %outptr 88 89 ret void 90} 91 92; GCN-LABEL: spill_v3f32: 93; MUBUF-DAG: buffer_store_dword v{{.*}} offset:32 ; 4-byte Folded Spill 94; MUBUF-DAG: buffer_store_dword v{{.*}} offset:36 ; 4-byte Folded Spill 95; MUBUF-DAG: buffer_store_dword v{{.*}} offset:40 ; 4-byte Folded Spill 96; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:32 ; 4-byte Folded Spill 97; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:36 ; 4-byte Folded Spill 98; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:40 ; 4-byte Folded Spill 99; GCN: ;;#ASMSTART 100; GCN-NEXT: ;;#ASMEND 101; MUBUF-DAG: buffer_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload 102; MUBUF-DAG: buffer_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload 103; MUBUF-DAG: buffer_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload 104; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload 105; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload 106; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload 107 108define void @spill_v3f32() { 109entry: 110 %alloca = alloca <3 x i32>, i32 2, align 4, addrspace(5) 111 112 %aptr = getelementptr <3 x i32>, <3 x i32> addrspace(5)* %alloca, i32 1 113 %a = load volatile <3 x i32>, <3 x i32> addrspace(5)* %aptr 114 115 ; Force %a to spill. 116 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" () 117 118 %outptr = getelementptr <3 x i32>, <3 x i32> addrspace(5)* %alloca, i32 1 119 store volatile <3 x i32> %a, <3 x i32> addrspace(5)* %outptr 120 121 ret void 122} 123 124; GCN-LABEL: spill_v4i32: 125; MUBUF-DAG: buffer_store_dword v{{.*}} offset:32 ; 4-byte Folded Spill 126; MUBUF-DAG: buffer_store_dword v{{.*}} offset:36 ; 4-byte Folded Spill 127; MUBUF-DAG: buffer_store_dword v{{.*}} offset:40 ; 4-byte Folded Spill 128; MUBUF-DAG: buffer_store_dword v{{.*}} offset:44 ; 4-byte Folded Spill 129; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:32 ; 4-byte Folded Spill 130; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:36 ; 4-byte Folded Spill 131; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:40 ; 4-byte Folded Spill 132; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:44 ; 4-byte Folded Spill 133; GCN: ;;#ASMSTART 134; GCN-NEXT: ;;#ASMEND 135; MUBUF-DAG: buffer_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload 136; MUBUF-DAG: buffer_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload 137; MUBUF-DAG: buffer_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload 138; MUBUF-DAG: buffer_load_dword v{{.*}} offset:44 ; 4-byte Folded Reload 139; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload 140; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload 141; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload 142; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:44 ; 4-byte Folded Reload 143 144define void @spill_v4i32() { 145entry: 146 %alloca = alloca <4 x i32>, i32 2, align 4, addrspace(5) 147 148 %aptr = getelementptr <4 x i32>, <4 x i32> addrspace(5)* %alloca, i32 1 149 %a = load volatile <4 x i32>, <4 x i32> addrspace(5)* %aptr 150 151 ; Force %a to spill. 152 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" () 153 154 %outptr = getelementptr <4 x i32>, <4 x i32> addrspace(5)* %alloca, i32 1 155 store volatile <4 x i32> %a, <4 x i32> addrspace(5)* %outptr 156 157 ret void 158} 159 160; GCN-LABEL: spill_v4f32: 161; MUBUF-DAG: buffer_store_dword v{{.*}} offset:32 ; 4-byte Folded Spill 162; MUBUF-DAG: buffer_store_dword v{{.*}} offset:36 ; 4-byte Folded Spill 163; MUBUF-DAG: buffer_store_dword v{{.*}} offset:40 ; 4-byte Folded Spill 164; MUBUF-DAG: buffer_store_dword v{{.*}} offset:44 ; 4-byte Folded Spill 165; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:32 ; 4-byte Folded Spill 166; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:36 ; 4-byte Folded Spill 167; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:40 ; 4-byte Folded Spill 168; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:44 ; 4-byte Folded Spill 169; GCN: ;;#ASMSTART 170; GCN-NEXT: ;;#ASMEND 171; MUBUF-DAG: buffer_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload 172; MUBUF-DAG: buffer_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload 173; MUBUF-DAG: buffer_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload 174; MUBUF-DAG: buffer_load_dword v{{.*}} offset:44 ; 4-byte Folded Reload 175; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:32 ; 4-byte Folded Reload 176; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:36 ; 4-byte Folded Reload 177; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:40 ; 4-byte Folded Reload 178; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:44 ; 4-byte Folded Reload 179 180define void @spill_v4f32() { 181entry: 182 %alloca = alloca <4 x i32>, i32 2, align 4, addrspace(5) 183 184 %aptr = getelementptr <4 x i32>, <4 x i32> addrspace(5)* %alloca, i32 1 185 %a = load volatile <4 x i32>, <4 x i32> addrspace(5)* %aptr 186 187 ; Force %a to spill. 188 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" () 189 190 %outptr = getelementptr <4 x i32>, <4 x i32> addrspace(5)* %alloca, i32 1 191 store volatile <4 x i32> %a, <4 x i32> addrspace(5)* %outptr 192 193 ret void 194} 195 196; GCN-LABEL: spill_v5i32: 197; MUBUF-DAG: buffer_store_dword v{{.*}} offset:64 ; 4-byte Folded Spill 198; MUBUF-DAG: buffer_store_dword v{{.*}} offset:68 ; 4-byte Folded Spill 199; MUBUF-DAG: buffer_store_dword v{{.*}} offset:72 ; 4-byte Folded Spill 200; MUBUF-DAG: buffer_store_dword v{{.*}} offset:76 ; 4-byte Folded Spill 201; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:64 ; 4-byte Folded Spill 202; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:68 ; 4-byte Folded Spill 203; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:72 ; 4-byte Folded Spill 204; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:76 ; 4-byte Folded Spill 205; GCN: ;;#ASMSTART 206; GCN-NEXT: ;;#ASMEND 207; MUBUF-DAG: buffer_load_dword v{{.*}} offset:64 ; 4-byte Folded Reload 208; MUBUF-DAG: buffer_load_dword v{{.*}} offset:68 ; 4-byte Folded Reload 209; MUBUF-DAG: buffer_load_dword v{{.*}} offset:72 ; 4-byte Folded Reload 210; MUBUF-DAG: buffer_load_dword v{{.*}} offset:76 ; 4-byte Folded Reload 211; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:64 ; 4-byte Folded Reload 212; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:68 ; 4-byte Folded Reload 213; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:72 ; 4-byte Folded Reload 214; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:76 ; 4-byte Folded Reload 215define void @spill_v5i32() { 216entry: 217 %alloca = alloca <5 x i32>, i32 2, align 4, addrspace(5) 218 219 %aptr = getelementptr <5 x i32>, <5 x i32> addrspace(5)* %alloca, i32 1 220 %a = load volatile <5 x i32>, <5 x i32> addrspace(5)* %aptr 221 222 ; Force %a to spill. 223 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" () 224 225 %outptr = getelementptr <5 x i32>, <5 x i32> addrspace(5)* %alloca, i32 1 226 store volatile <5 x i32> %a, <5 x i32> addrspace(5)* %outptr 227 228 ret void 229} 230 231; GCN-LABEL: spill_v5f32: 232; MUBUF-DAG: buffer_store_dword v{{.*}} offset:64 ; 4-byte Folded Spill 233; MUBUF-DAG: buffer_store_dword v{{.*}} offset:68 ; 4-byte Folded Spill 234; MUBUF-DAG: buffer_store_dword v{{.*}} offset:72 ; 4-byte Folded Spill 235; MUBUF-DAG: buffer_store_dword v{{.*}} offset:76 ; 4-byte Folded Spill 236; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:64 ; 4-byte Folded Spill 237; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:68 ; 4-byte Folded Spill 238; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:72 ; 4-byte Folded Spill 239; FLATSCR-DAG: scratch_store_dword off, v{{.*}} offset:76 ; 4-byte Folded Spill 240; GCN: ;;#ASMSTART 241; GCN-NEXT: ;;#ASMEND 242; MUBUF-DAG: buffer_load_dword v{{.*}} offset:64 ; 4-byte Folded Reload 243; MUBUF-DAG: buffer_load_dword v{{.*}} offset:68 ; 4-byte Folded Reload 244; MUBUF-DAG: buffer_load_dword v{{.*}} offset:72 ; 4-byte Folded Reload 245; MUBUF-DAG: buffer_load_dword v{{.*}} offset:76 ; 4-byte Folded Reload 246; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:64 ; 4-byte Folded Reload 247; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:68 ; 4-byte Folded Reload 248; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:72 ; 4-byte Folded Reload 249; FLATSCR-DAG: scratch_load_dword v{{.*}} offset:76 ; 4-byte Folded Reload 250define void @spill_v5f32() { 251entry: 252 %alloca = alloca <5 x i32>, i32 2, align 4, addrspace(5) 253 254 %aptr = getelementptr <5 x i32>, <5 x i32> addrspace(5)* %alloca, i32 1 255 %a = load volatile <5 x i32>, <5 x i32> addrspace(5)* %aptr 256 257 ; Force %a to spill. 258 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}" () 259 260 %outptr = getelementptr <5 x i32>, <5 x i32> addrspace(5)* %alloca, i32 1 261 store volatile <5 x i32> %a, <5 x i32> addrspace(5)* %outptr 262 263 ret void 264} 265