1; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s 2; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,VI %s 3 4; GCN-LABEL: {{^}}load_local_hi_v2i16_undeflo: 5; GCN: s_waitcnt 6; GFX9-NEXT: ds_read_u16_d16_hi v0, v0 7; GFX9-NEXT: s_waitcnt 8; GFX9-NEXT: s_setpc_b64 9 10; VI: ds_read_u16 v 11define <2 x i16> @load_local_hi_v2i16_undeflo(i16 addrspace(3)* %in) #0 { 12entry: 13 %load = load i16, i16 addrspace(3)* %in 14 %build = insertelement <2 x i16> undef, i16 %load, i32 1 15 ret <2 x i16> %build 16} 17 18; GCN-LABEL: {{^}}load_local_hi_v2i16_reglo: 19; GCN: s_waitcnt 20; GFX9-NEXT: ds_read_u16_d16_hi v1, v0 21; GFX9-NEXT: s_waitcnt 22; GFX9-NEXT: v_mov_b32_e32 v0, v1 23; GFX9-NEXT: s_setpc_b64 24 25; VI: ds_read_u16 v 26define <2 x i16> @load_local_hi_v2i16_reglo(i16 addrspace(3)* %in, i16 %reg) #0 { 27entry: 28 %load = load i16, i16 addrspace(3)* %in 29 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 30 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1 31 ret <2 x i16> %build1 32} 33 34; Show that we get reasonable regalloc without physreg constraints. 35; GCN-LABEL: {{^}}load_local_hi_v2i16_reglo_vreg: 36; GCN: s_waitcnt 37; GFX9-NEXT: ds_read_u16_d16_hi v1, v0 38; GFX9-NEXT: s_waitcnt 39; GFX9-NEXT: global_store_dword v[0:1], v1, off{{$}} 40; GFX9-NEXT: s_waitcnt 41; GFX9-NEXT: s_setpc_b64 42 43; VI: ds_read_u16 v 44define void @load_local_hi_v2i16_reglo_vreg(i16 addrspace(3)* %in, i16 %reg) #0 { 45entry: 46 %load = load i16, i16 addrspace(3)* %in 47 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 48 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1 49 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 50 ret void 51} 52 53; GCN-LABEL: {{^}}load_local_hi_v2i16_zerolo: 54; GCN: s_waitcnt 55; GFX9-NEXT: v_mov_b32_e32 v1, 0 56; GFX9-NEXT: ds_read_u16_d16_hi v1, v0 57; GFX9-NEXT: s_waitcnt 58; GFX9-NEXT: v_mov_b32_e32 v0, v1 59; GFX9-NEXT: s_setpc_b64 60 61; VI: ds_read_u16 v 62define <2 x i16> @load_local_hi_v2i16_zerolo(i16 addrspace(3)* %in) #0 { 63entry: 64 %load = load i16, i16 addrspace(3)* %in 65 %build = insertelement <2 x i16> zeroinitializer, i16 %load, i32 1 66 ret <2 x i16> %build 67} 68 69; FIXME: Remove m0 initialization 70; GCN-LABEL: {{^}}load_local_hi_v2i16_zerolo_shift: 71; GCN: s_waitcnt 72; GFX9-NEXT: s_mov_b32 m0, -1 73; GFX9-NEXT: ds_read_u16 v0, v0 74; GFX9-NEXT: s_waitcnt lgkmcnt(0) 75; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 76; GFX9-NEXT: s_setpc_b64 77 78; VI: ds_read_u16 v 79; VI: v_lshlrev_b32_e32 v0, 16, v0 80define i32 @load_local_hi_v2i16_zerolo_shift(i16 addrspace(3)* %in) #0 { 81entry: 82 %load = load i16, i16 addrspace(3)* %in 83 %zext = zext i16 %load to i32 84 %shift = shl i32 %zext, 16 85 ret i32 %shift 86} 87 88; GCN-LABEL: {{^}}load_local_hi_v2f16_reglo_vreg: 89; GCN: s_waitcnt 90; GFX9-NEXT: ds_read_u16_d16_hi v1, v0 91; GFX9-NEXT: s_waitcnt 92; GFX9-NEXT: global_store_dword v[0:1], v1, off{{$}} 93; GFX9-NEXT: s_waitcnt 94; GFX9-NEXT: s_setpc_b64 95 96; VI: ds_read_u16 v 97define void @load_local_hi_v2f16_reglo_vreg(half addrspace(3)* %in, half %reg) #0 { 98entry: 99 %load = load half, half addrspace(3)* %in 100 %build0 = insertelement <2 x half> undef, half %reg, i32 0 101 %build1 = insertelement <2 x half> %build0, half %load, i32 1 102 store <2 x half> %build1, <2 x half> addrspace(1)* undef 103 ret void 104} 105 106; GCN-LABEL: {{^}}load_local_hi_v2i16_reglo_vreg_zexti8: 107; GCN: s_waitcnt 108; GFX9-NEXT: ds_read_u8_d16_hi v1, v0 109; GFX9-NEXT: s_waitcnt 110; GFX9-NEXT: global_store_dword v[0:1], v1, off{{$}} 111; GFX9-NEXT: s_waitcnt 112; GFX9-NEXT: s_setpc_b64 113 114; VI: ds_read_u8 v 115define void @load_local_hi_v2i16_reglo_vreg_zexti8(i8 addrspace(3)* %in, i16 %reg) #0 { 116entry: 117 %load = load i8, i8 addrspace(3)* %in 118 %ext = zext i8 %load to i16 119 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 120 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 121 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 122 ret void 123} 124 125; GCN-LABEL: {{^}}load_local_hi_v2i16_reglo_vreg_sexti8: 126; GCN: s_waitcnt 127; GFX9-NEXT: ds_read_i8_d16_hi v1, v0 128; GFX9-NEXT: s_waitcnt 129; GFX9-NEXT: global_store_dword v[0:1], v1, off{{$}} 130; GFX9-NEXT: s_waitcnt 131; GFX9-NEXT: s_setpc_b64 132 133; VI: ds_read_i8 v 134define void @load_local_hi_v2i16_reglo_vreg_sexti8(i8 addrspace(3)* %in, i16 %reg) #0 { 135entry: 136 %load = load i8, i8 addrspace(3)* %in 137 %ext = sext i8 %load to i16 138 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 139 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 140 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 141 ret void 142} 143 144; GCN-LABEL: {{^}}load_global_hi_v2i16_reglo_vreg: 145; GCN: s_waitcnt 146; GFX9-NEXT: global_load_short_d16_hi v2, v[0:1], off offset:-4094 147; GFX9-NEXT: s_waitcnt 148; GFX9-NEXT: global_store_dword 149; GFX9-NEXT: s_waitcnt 150; GFX9-NEXT: s_setpc_b64 151define void @load_global_hi_v2i16_reglo_vreg(i16 addrspace(1)* %in, i16 %reg) #0 { 152entry: 153 %gep = getelementptr inbounds i16, i16 addrspace(1)* %in, i64 -2047 154 %load = load i16, i16 addrspace(1)* %gep 155 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 156 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1 157 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 158 ret void 159} 160 161; GCN-LABEL: {{^}}load_global_hi_v2f16_reglo_vreg: 162; GCN: s_waitcnt 163; GFX9-NEXT: global_load_short_d16_hi v2, v[0:1], off offset:-4094 164; GFX9-NEXT: s_waitcnt 165; GFX9-NEXT: global_store_dword 166; GFX9-NEXT: s_waitcnt 167; GFX9-NEXT: s_setpc_b64 168define void @load_global_hi_v2f16_reglo_vreg(half addrspace(1)* %in, half %reg) #0 { 169entry: 170 %gep = getelementptr inbounds half, half addrspace(1)* %in, i64 -2047 171 %load = load half, half addrspace(1)* %gep 172 %build0 = insertelement <2 x half> undef, half %reg, i32 0 173 %build1 = insertelement <2 x half> %build0, half %load, i32 1 174 store <2 x half> %build1, <2 x half> addrspace(1)* undef 175 ret void 176} 177 178; GCN-LABEL: {{^}}load_global_hi_v2i16_reglo_vreg_zexti8: 179; GCN: s_waitcnt 180; GFX9-NEXT: global_load_ubyte_d16_hi v2, v[0:1], off offset:-4095 181; GFX9-NEXT: s_waitcnt 182; GFX9-NEXT: global_store_dword 183; GFX9-NEXT: s_waitcnt 184; GFX9-NEXT: s_setpc_b64 185define void @load_global_hi_v2i16_reglo_vreg_zexti8(i8 addrspace(1)* %in, i16 %reg) #0 { 186entry: 187 %gep = getelementptr inbounds i8, i8 addrspace(1)* %in, i64 -4095 188 %load = load i8, i8 addrspace(1)* %gep 189 %ext = zext i8 %load to i16 190 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 191 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 192 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 193 ret void 194} 195 196; GCN-LABEL: {{^}}load_global_hi_v2i16_reglo_vreg_sexti8: 197; GCN: s_waitcnt 198; GFX9-NEXT: global_load_sbyte_d16_hi v2, v[0:1], off offset:-4095 199; GFX9-NEXT: s_waitcnt 200; GFX9-NEXT: global_store_dword 201; GFX9-NEXT: s_waitcnt 202; GFX9-NEXT: s_setpc_b64 203define void @load_global_hi_v2i16_reglo_vreg_sexti8(i8 addrspace(1)* %in, i16 %reg) #0 { 204entry: 205 %gep = getelementptr inbounds i8, i8 addrspace(1)* %in, i64 -4095 206 %load = load i8, i8 addrspace(1)* %gep 207 %ext = sext i8 %load to i16 208 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 209 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 210 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 211 ret void 212} 213 214; GCN-LABEL: load_flat_hi_v2i16_reglo_vreg: 215; GCN: s_waitcnt 216; GFX9-NEXT: flat_load_short_d16_hi v2, v[0:1] 217; GFX9-NEXT: s_waitcnt 218; GFX9-NEXT: global_store_dword v[0:1], v2 219; GFX9-NEXT: s_waitcnt 220; GFX9-NEXT: s_setpc_b64 221 222; VI: flat_load_ushort v{{[0-9]+}} 223; VI: v_lshlrev_b32_e32 v{{[0-9]+}}, 16, 224; VI: v_or_b32_sdwa 225define void @load_flat_hi_v2i16_reglo_vreg(i16 addrspace(4)* %in, i16 %reg) #0 { 226entry: 227 %load = load i16, i16 addrspace(4)* %in 228 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 229 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1 230 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 231 ret void 232} 233 234; GCN-LABEL: {{^}}load_flat_hi_v2f16_reglo_vreg: 235; GCN: s_waitcnt 236; GFX9-NEXT: flat_load_short_d16_hi v2, v[0:1] 237; GFX9-NEXT: s_waitcnt 238; GFX9-NEXT: global_store_dword v[0:1], v2 239; GFX9-NEXT: s_waitcnt 240; GFX9-NEXT: s_setpc_b64 241 242; VI: flat_load_ushort v{{[0-9]+}} 243; VI: v_lshlrev_b32_e32 v{{[0-9]+}}, 16, 244; VI: v_or_b32_sdwa 245define void @load_flat_hi_v2f16_reglo_vreg(half addrspace(4)* %in, half %reg) #0 { 246entry: 247 %load = load half, half addrspace(4)* %in 248 %build0 = insertelement <2 x half> undef, half %reg, i32 0 249 %build1 = insertelement <2 x half> %build0, half %load, i32 1 250 store <2 x half> %build1, <2 x half> addrspace(1)* undef 251 ret void 252} 253 254; GCN-LABEL: {{^}}load_flat_hi_v2i16_reglo_vreg_zexti8: 255; GCN: s_waitcnt 256; GFX9-NEXT: flat_load_ubyte_d16_hi v2, v[0:1] 257; GFX9-NEXT: s_waitcnt 258; GFX9-NEXT: global_store_dword v[0:1], v2 259; GFX9-NEXT: s_waitcnt 260; GFX9-NEXT: s_setpc_b64 261 262; VI: flat_load_ubyte v{{[0-9]+}} 263; VI: v_lshlrev_b32_e32 v{{[0-9]+}}, 16, 264; VI: v_or_b32_sdwa 265define void @load_flat_hi_v2i16_reglo_vreg_zexti8(i8 addrspace(4)* %in, i16 %reg) #0 { 266entry: 267 %load = load i8, i8 addrspace(4)* %in 268 %ext = zext i8 %load to i16 269 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 270 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 271 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 272 ret void 273} 274 275; GCN-LABEL: {{^}}load_flat_hi_v2i16_reglo_vreg_sexti8: 276; GCN: s_waitcnt 277; GFX9-NEXT: flat_load_sbyte_d16_hi v2, v[0:1] 278; GFX9-NEXT: s_waitcnt 279; GFX9-NEXT: global_store_dword v[0:1], v2 280; GFX9-NEXT: s_waitcnt 281; GFX9-NEXT: s_setpc_b64 282 283; VI: flat_load_sbyte v{{[0-9]+}} 284; VI: v_lshlrev_b32_e32 v{{[0-9]+}}, 16, 285; VI: v_or_b32_sdwa 286define void @load_flat_hi_v2i16_reglo_vreg_sexti8(i8 addrspace(4)* %in, i16 %reg) #0 { 287entry: 288 %load = load i8, i8 addrspace(4)* %in 289 %ext = sext i8 %load to i16 290 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 291 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 292 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 293 ret void 294} 295 296; GCN-LABEL: {{^}}load_private_hi_v2i16_reglo_vreg: 297; GCN: s_waitcnt 298; GFX9-NEXT: buffer_load_short_d16_hi v1, v0, s[0:3], s4 offen offset:4094{{$}} 299; GFX9-NEXT: s_waitcnt 300; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 301; GFX9-NEXT: s_waitcnt 302; GFX9-NEXT: s_setpc_b64 303 304; VI: buffer_load_ushort v{{[0-9]+}}, v0, s[0:3], s4 offen offset:4094{{$}} 305define void @load_private_hi_v2i16_reglo_vreg(i16* %in, i16 %reg) #0 { 306entry: 307 %gep = getelementptr inbounds i16, i16* %in, i64 2047 308 %load = load i16, i16* %gep 309 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 310 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1 311 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 312 ret void 313} 314 315; GCN-LABEL: {{^}}load_private_hi_v2f16_reglo_vreg: 316; GCN: s_waitcnt 317; GFX9-NEXT: buffer_load_short_d16_hi v1, v0, s[0:3], s4 offen offset:4094{{$}} 318; GFX9-NEXT: s_waitcnt 319; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 320; GFX9-NEXT: s_waitcnt 321; GFX9-NEXT: s_setpc_b64 322 323; VI: buffer_load_ushort v{{[0-9]+}}, v0, s[0:3], s4 offen offset:4094{{$}} 324define void @load_private_hi_v2f16_reglo_vreg(half* %in, half %reg) #0 { 325entry: 326 %gep = getelementptr inbounds half, half* %in, i64 2047 327 %load = load half, half* %gep 328 %build0 = insertelement <2 x half> undef, half %reg, i32 0 329 %build1 = insertelement <2 x half> %build0, half %load, i32 1 330 store <2 x half> %build1, <2 x half> addrspace(1)* undef 331 ret void 332} 333 334; GCN-LABEL: {{^}}load_private_hi_v2i16_reglo_vreg_nooff: 335; GCN: s_waitcnt 336; GFX9-NEXT: buffer_load_short_d16_hi v1, off, s[0:3], s4 offset:4094{{$}} 337; GFX9-NEXT: s_waitcnt 338; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 339; GFX9-NEXT: s_waitcnt 340; GFX9-NEXT: s_setpc_b64 341 342; VI: buffer_load_ushort v{{[0-9]+}}, off, s[0:3], s4 offset:4094{{$}} 343define void @load_private_hi_v2i16_reglo_vreg_nooff(i16* %in, i16 %reg) #0 { 344entry: 345 %load = load volatile i16, i16* inttoptr (i32 4094 to i16*) 346 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 347 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1 348 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 349 ret void 350} 351 352; GCN-LABEL: {{^}}load_private_hi_v2f16_reglo_vreg_nooff: 353; GCN: s_waitcnt 354; GFX9-NEXT: buffer_load_short_d16_hi v1, off, s[0:3], s4 offset:4094{{$}} 355; GFX9-NEXT: s_waitcnt 356; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 357; GFX9-NEXT: s_waitcnt 358; GFX9-NEXT: s_setpc_b64 359 360; VI: buffer_load_ushort v{{[0-9]+}}, off, s[0:3], s4 offset:4094{{$}} 361define void @load_private_hi_v2f16_reglo_vreg_nooff(half* %in, half %reg) #0 { 362entry: 363 %load = load volatile half, half* inttoptr (i32 4094 to half*) 364 %build0 = insertelement <2 x half> undef, half %reg, i32 0 365 %build1 = insertelement <2 x half> %build0, half %load, i32 1 366 store <2 x half> %build1, <2 x half> addrspace(1)* undef 367 ret void 368} 369 370; GCN-LABEL: {{^}}load_private_hi_v2i16_reglo_vreg_zexti8: 371; GCN: s_waitcnt 372; GFX9-NEXT: buffer_load_ubyte_d16_hi v1, v0, s[0:3], s4 offen offset:2047{{$}} 373; GFX9-NEXT: s_waitcnt 374; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 375; GFX9-NEXT: s_waitcnt 376; GFX9-NEXT: s_setpc_b64 377 378; VI: buffer_load_ubyte v{{[0-9]+}}, v0, s[0:3], s4 offen offset:2047{{$}} 379define void @load_private_hi_v2i16_reglo_vreg_zexti8(i8* %in, i16 %reg) #0 { 380entry: 381 %gep = getelementptr inbounds i8, i8* %in, i64 2047 382 %load = load i8, i8* %gep 383 %ext = zext i8 %load to i16 384 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 385 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 386 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 387 ret void 388} 389 390; GCN-LABEL: {{^}}load_private_hi_v2i16_reglo_vreg_sexti8: 391; GCN: s_waitcnt 392; GFX9-NEXT: buffer_load_sbyte_d16_hi v1, v0, s[0:3], s4 offen offset:2047{{$}} 393; GFX9-NEXT: s_waitcnt 394; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 395; GFX9-NEXT: s_waitcnt 396; GFX9-NEXT: s_setpc_b64 397 398; VI: buffer_load_sbyte v{{[0-9]+}}, v0, s[0:3], s4 offen offset:2047{{$}} 399define void @load_private_hi_v2i16_reglo_vreg_sexti8(i8* %in, i16 %reg) #0 { 400entry: 401 %gep = getelementptr inbounds i8, i8* %in, i64 2047 402 %load = load i8, i8* %gep 403 %ext = sext i8 %load to i16 404 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 405 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 406 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 407 ret void 408} 409 410; GCN-LABEL: {{^}}load_private_hi_v2i16_reglo_vreg_nooff_zexti8: 411; GCN: s_waitcnt 412; GFX9-NEXT: buffer_load_ubyte_d16_hi v1, off, s[0:3], s4 offset:4094{{$}} 413; GFX9-NEXT: s_waitcnt 414; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 415; GFX9-NEXT: s_waitcnt 416; GFX9-NEXT: s_setpc_b64 417 418; VI: buffer_load_ubyte v0, off, s[0:3], s4 offset:4094{{$}} 419define void @load_private_hi_v2i16_reglo_vreg_nooff_zexti8(i8* %in, i16 %reg) #0 { 420entry: 421 %load = load volatile i8, i8* inttoptr (i32 4094 to i8*) 422 %ext = zext i8 %load to i16 423 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 424 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 425 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 426 ret void 427} 428 429; GCN-LABEL: {{^}}load_private_hi_v2i16_reglo_vreg_nooff_sexti8: 430; GCN: s_waitcnt 431; GFX9-NEXT: buffer_load_sbyte_d16_hi v1, off, s[0:3], s4 offset:4094{{$}} 432; GFX9-NEXT: s_waitcnt 433; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 434; GFX9-NEXT: s_waitcnt 435; GFX9-NEXT: s_setpc_b64 436 437; VI: buffer_load_sbyte v0, off, s[0:3], s4 offset:4094{{$}} 438define void @load_private_hi_v2i16_reglo_vreg_nooff_sexti8(i8* %in, i16 %reg) #0 { 439entry: 440 %load = load volatile i8, i8* inttoptr (i32 4094 to i8*) 441 %ext = sext i8 %load to i16 442 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 443 %build1 = insertelement <2 x i16> %build0, i16 %ext, i32 1 444 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 445 ret void 446} 447 448; GCN-LABEL: {{^}}load_private_hi_v2f16_reglo_vreg_nooff_zexti8: 449; GCN: s_waitcnt 450; GFX9-NEXT: buffer_load_ubyte_d16_hi v1, off, s[0:3], s4 offset:4094{{$}} 451; GFX9-NEXT: s_waitcnt 452; GFX9-NEXT: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v1 453; GFX9-NEXT: s_waitcnt 454; GFX9-NEXT: s_setpc_b64 455 456; VI: buffer_load_ubyte v0, off, s[0:3], s4 offset:4094{{$}} 457define void @load_private_hi_v2f16_reglo_vreg_nooff_zexti8(i8* %in, half %reg) #0 { 458entry: 459 %load = load volatile i8, i8* inttoptr (i32 4094 to i8*) 460 %ext = zext i8 %load to i16 461 %bc.ext = bitcast i16 %ext to half 462 %build0 = insertelement <2 x half> undef, half %reg, i32 0 463 %build1 = insertelement <2 x half> %build0, half %bc.ext, i32 1 464 store <2 x half> %build1, <2 x half> addrspace(1)* undef 465 ret void 466} 467 468; GCN-LABEL: {{^}}load_constant_hi_v2i16_reglo_vreg: 469; GCN: s_waitcnt 470; GFX9-NEXT: global_load_short_d16_hi v2, v[0:1], off offset:-4094 471; GFX9-NEXT: s_waitcnt 472; GFX9-NEXT: global_store_dword 473; GFX9-NEXT: s_waitcnt 474; GFX9-NEXT: s_setpc_b64 475 476; VI: flat_load_ushort 477define void @load_constant_hi_v2i16_reglo_vreg(i16 addrspace(2)* %in, i16 %reg) #0 { 478entry: 479 %gep = getelementptr inbounds i16, i16 addrspace(2)* %in, i64 -2047 480 %load = load i16, i16 addrspace(2)* %gep 481 %build0 = insertelement <2 x i16> undef, i16 %reg, i32 0 482 %build1 = insertelement <2 x i16> %build0, i16 %load, i32 1 483 store <2 x i16> %build1, <2 x i16> addrspace(1)* undef 484 ret void 485} 486 487; GCN-LABEL: load_constant_hi_v2f16_reglo_vreg 488; GCN: s_waitcnt 489; GFX9-NEXT: global_load_short_d16_hi v2, v[0:1], off offset:-4094 490; GFX9-NEXT: s_waitcnt 491; GFX9-NEXT: global_store_dword 492; GFX9-NEXT: s_waitcnt 493; GFX9-NEXT: s_setpc_b64 494 495; VI: flat_load_ushort 496define void @load_constant_hi_v2f16_reglo_vreg(half addrspace(2)* %in, half %reg) #0 { 497entry: 498 %gep = getelementptr inbounds half, half addrspace(2)* %in, i64 -2047 499 %load = load half, half addrspace(2)* %gep 500 %build0 = insertelement <2 x half> undef, half %reg, i32 0 501 %build1 = insertelement <2 x half> %build0, half %load, i32 1 502 store <2 x half> %build1, <2 x half> addrspace(1)* undef 503 ret void 504} 505 506attributes #0 = { nounwind } 507