4956 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s3; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GCN,GFX10 %s4; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+real-true16 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s5; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s6; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 -mattr=+real-true16 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-SDAG-TRUE16 %s7; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 -mattr=-real-true16 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-SDAG-FAKE16 %s8; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 -mattr=+real-true16 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-GISEL-TRUE16 %s9; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 -mattr=-real-true16 -mattr=+wavefrontsize64 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-GISEL-FAKE16 %s10 11; Test using saddr addressing mode of global_*load_* flat instructions.12 13; --------------------------------------------------------------------------------14; No vgpr offset, constants15; --------------------------------------------------------------------------------16 17; SGPR base only18define amdgpu_ps float @global_load_saddr_i8_offset_0(ptr addrspace(1) inreg %sbase) {19; GCN-LABEL: global_load_saddr_i8_offset_0:20; GCN: ; %bb.0:21; GCN-NEXT: v_mov_b32_e32 v0, 022; GCN-NEXT: global_load_ubyte v0, v0, s[2:3]23; GCN-NEXT: s_waitcnt vmcnt(0)24; GCN-NEXT: ; return to shader part epilog25;26; GFX11-LABEL: global_load_saddr_i8_offset_0:27; GFX11: ; %bb.0:28; GFX11-NEXT: v_mov_b32_e32 v0, 029; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]30; GFX11-NEXT: s_waitcnt vmcnt(0)31; GFX11-NEXT: ; return to shader part epilog32;33; GFX12-LABEL: global_load_saddr_i8_offset_0:34; GFX12: ; %bb.0:35; GFX12-NEXT: s_load_u8 s0, s[2:3], 0x036; GFX12-NEXT: s_wait_kmcnt 0x037; GFX12-NEXT: v_mov_b32_e32 v0, s038; GFX12-NEXT: ; return to shader part epilog39 %load = load i8, ptr addrspace(1) %sbase40 %zext = zext i8 %load to i3241 %to.vgpr = bitcast i32 %zext to float42 ret float %to.vgpr43}44 45; SGPR base with maximum gfx9 immediate offset46define amdgpu_ps float @global_load_saddr_i8_offset_4095(ptr addrspace(1) inreg %sbase) {47; GFX9-LABEL: global_load_saddr_i8_offset_4095:48; GFX9: ; %bb.0:49; GFX9-NEXT: v_mov_b32_e32 v0, 050; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:409551; GFX9-NEXT: s_waitcnt vmcnt(0)52; GFX9-NEXT: ; return to shader part epilog53;54; GFX10-LABEL: global_load_saddr_i8_offset_4095:55; GFX10: ; %bb.0:56; GFX10-NEXT: v_mov_b32_e32 v0, 0x80057; GFX10-NEXT: global_load_ubyte v0, v0, s[2:3] offset:204758; GFX10-NEXT: s_waitcnt vmcnt(0)59; GFX10-NEXT: ; return to shader part epilog60;61; GFX11-LABEL: global_load_saddr_i8_offset_4095:62; GFX11: ; %bb.0:63; GFX11-NEXT: v_mov_b32_e32 v0, 064; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:409565; GFX11-NEXT: s_waitcnt vmcnt(0)66; GFX11-NEXT: ; return to shader part epilog67;68; GFX12-LABEL: global_load_saddr_i8_offset_4095:69; GFX12: ; %bb.0:70; GFX12-NEXT: s_load_u8 s0, s[2:3], 0xfff71; GFX12-NEXT: s_wait_kmcnt 0x072; GFX12-NEXT: v_mov_b32_e32 v0, s073; GFX12-NEXT: ; return to shader part epilog74 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 409575 %load = load i8, ptr addrspace(1) %gep076 %zext = zext i8 %load to i3277 %to.vgpr = bitcast i32 %zext to float78 ret float %to.vgpr79}80 81; SGPR base with maximum gfx9 immediate offset + 182define amdgpu_ps float @global_load_saddr_i8_offset_4096(ptr addrspace(1) inreg %sbase) {83; GCN-LABEL: global_load_saddr_i8_offset_4096:84; GCN: ; %bb.0:85; GCN-NEXT: v_mov_b32_e32 v0, 0x100086; GCN-NEXT: global_load_ubyte v0, v0, s[2:3]87; GCN-NEXT: s_waitcnt vmcnt(0)88; GCN-NEXT: ; return to shader part epilog89;90; GFX11-LABEL: global_load_saddr_i8_offset_4096:91; GFX11: ; %bb.0:92; GFX11-NEXT: v_mov_b32_e32 v0, 0x100093; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]94; GFX11-NEXT: s_waitcnt vmcnt(0)95; GFX11-NEXT: ; return to shader part epilog96;97; GFX12-LABEL: global_load_saddr_i8_offset_4096:98; GFX12: ; %bb.0:99; GFX12-NEXT: s_load_u8 s0, s[2:3], 0x1000100; GFX12-NEXT: s_wait_kmcnt 0x0101; GFX12-NEXT: v_mov_b32_e32 v0, s0102; GFX12-NEXT: ; return to shader part epilog103 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 4096104 %load = load i8, ptr addrspace(1) %gep0105 %zext = zext i8 %load to i32106 %to.vgpr = bitcast i32 %zext to float107 ret float %to.vgpr108}109 110; SGPR base with maximum gfx9 immediate offset + 2111define amdgpu_ps float @global_load_saddr_i8_offset_4097(ptr addrspace(1) inreg %sbase) {112; GCN-LABEL: global_load_saddr_i8_offset_4097:113; GCN: ; %bb.0:114; GCN-NEXT: v_mov_b32_e32 v0, 0x1000115; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:1116; GCN-NEXT: s_waitcnt vmcnt(0)117; GCN-NEXT: ; return to shader part epilog118;119; GFX11-LABEL: global_load_saddr_i8_offset_4097:120; GFX11: ; %bb.0:121; GFX11-NEXT: v_mov_b32_e32 v0, 0x1000122; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:1123; GFX11-NEXT: s_waitcnt vmcnt(0)124; GFX11-NEXT: ; return to shader part epilog125;126; GFX12-LABEL: global_load_saddr_i8_offset_4097:127; GFX12: ; %bb.0:128; GFX12-NEXT: s_load_u8 s0, s[2:3], 0x1001129; GFX12-NEXT: s_wait_kmcnt 0x0130; GFX12-NEXT: v_mov_b32_e32 v0, s0131; GFX12-NEXT: ; return to shader part epilog132 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 4097133 %load = load i8, ptr addrspace(1) %gep0134 %zext = zext i8 %load to i32135 %to.vgpr = bitcast i32 %zext to float136 ret float %to.vgpr137}138 139; SGPR base with maximum negative gfx9 immediate offset140define amdgpu_ps float @global_load_saddr_i8_offset_neg4096(ptr addrspace(1) inreg %sbase) {141; GFX9-LABEL: global_load_saddr_i8_offset_neg4096:142; GFX9: ; %bb.0:143; GFX9-NEXT: v_mov_b32_e32 v0, 0144; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-4096145; GFX9-NEXT: s_waitcnt vmcnt(0)146; GFX9-NEXT: ; return to shader part epilog147;148; GFX10-LABEL: global_load_saddr_i8_offset_neg4096:149; GFX10: ; %bb.0:150; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0xfffff000, s2151; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], -1, s3, s[0:1]152; GFX10-NEXT: global_load_ubyte v0, v[0:1], off153; GFX10-NEXT: s_waitcnt vmcnt(0)154; GFX10-NEXT: ; return to shader part epilog155;156; GFX11-LABEL: global_load_saddr_i8_offset_neg4096:157; GFX11: ; %bb.0:158; GFX11-NEXT: v_mov_b32_e32 v0, 0159; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-4096160; GFX11-NEXT: s_waitcnt vmcnt(0)161; GFX11-NEXT: ; return to shader part epilog162;163; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg4096:164; GFX12-SDAG: ; %bb.0:165; GFX12-SDAG-NEXT: s_movk_i32 s0, 0xf000166; GFX12-SDAG-NEXT: s_mov_b32 s1, -1167; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)168; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]169; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0170; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0171; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0172; GFX12-SDAG-NEXT: ; return to shader part epilog173;174; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg4096:175; GFX12-GISEL: ; %bb.0:176; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0xfffff000177; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1178; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0179; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0180; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0181; GFX12-GISEL-NEXT: ; return to shader part epilog182 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -4096183 %load = load i8, ptr addrspace(1) %gep0184 %zext = zext i8 %load to i32185 %to.vgpr = bitcast i32 %zext to float186 ret float %to.vgpr187}188 189; SGPR base with maximum negative gfx9 immediate offset -1190define amdgpu_ps float @global_load_saddr_i8_offset_neg4097(ptr addrspace(1) inreg %sbase) {191; GFX9-LABEL: global_load_saddr_i8_offset_neg4097:192; GFX9: ; %bb.0:193; GFX9-NEXT: s_add_u32 s0, s2, 0xffffefff194; GFX9-NEXT: s_addc_u32 s1, s3, -1195; GFX9-NEXT: v_mov_b32_e32 v0, 0196; GFX9-NEXT: global_load_ubyte v0, v0, s[0:1]197; GFX9-NEXT: s_waitcnt vmcnt(0)198; GFX9-NEXT: ; return to shader part epilog199;200; GFX10-LABEL: global_load_saddr_i8_offset_neg4097:201; GFX10: ; %bb.0:202; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0xfffff000, s2203; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], -1, s3, s[0:1]204; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:-1205; GFX10-NEXT: s_waitcnt vmcnt(0)206; GFX10-NEXT: ; return to shader part epilog207;208; GFX11-LABEL: global_load_saddr_i8_offset_neg4097:209; GFX11: ; %bb.0:210; GFX11-NEXT: v_add_co_u32 v0, s[0:1], 0xfffff000, s2211; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)212; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, -1, s3, s[0:1]213; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:-1214; GFX11-NEXT: s_waitcnt vmcnt(0)215; GFX11-NEXT: ; return to shader part epilog216;217; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg4097:218; GFX12-SDAG: ; %bb.0:219; GFX12-SDAG-NEXT: s_movk_i32 s0, 0xefff220; GFX12-SDAG-NEXT: s_mov_b32 s1, -1221; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)222; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]223; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0224; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0225; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0226; GFX12-SDAG-NEXT: ; return to shader part epilog227;228; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg4097:229; GFX12-GISEL: ; %bb.0:230; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0xffffefff231; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1232; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0233; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0234; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0235; GFX12-GISEL-NEXT: ; return to shader part epilog236 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -4097237 %load = load i8, ptr addrspace(1) %gep0238 %zext = zext i8 %load to i32239 %to.vgpr = bitcast i32 %zext to float240 ret float %to.vgpr241}242 243; SGPR base with maximum negative gfx9 immediate offset -2244define amdgpu_ps float @global_load_saddr_i8_offset_neg4098(ptr addrspace(1) inreg %sbase) {245; GFX9-LABEL: global_load_saddr_i8_offset_neg4098:246; GFX9: ; %bb.0:247; GFX9-NEXT: s_add_u32 s0, s2, 0xffffeffe248; GFX9-NEXT: s_addc_u32 s1, s3, -1249; GFX9-NEXT: v_mov_b32_e32 v0, 0250; GFX9-NEXT: global_load_ubyte v0, v0, s[0:1]251; GFX9-NEXT: s_waitcnt vmcnt(0)252; GFX9-NEXT: ; return to shader part epilog253;254; GFX10-LABEL: global_load_saddr_i8_offset_neg4098:255; GFX10: ; %bb.0:256; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0xfffff000, s2257; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], -1, s3, s[0:1]258; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:-2259; GFX10-NEXT: s_waitcnt vmcnt(0)260; GFX10-NEXT: ; return to shader part epilog261;262; GFX11-LABEL: global_load_saddr_i8_offset_neg4098:263; GFX11: ; %bb.0:264; GFX11-NEXT: v_add_co_u32 v0, s[0:1], 0xfffff000, s2265; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)266; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, -1, s3, s[0:1]267; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:-2268; GFX11-NEXT: s_waitcnt vmcnt(0)269; GFX11-NEXT: ; return to shader part epilog270;271; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg4098:272; GFX12-SDAG: ; %bb.0:273; GFX12-SDAG-NEXT: s_movk_i32 s0, 0xeffe274; GFX12-SDAG-NEXT: s_mov_b32 s1, -1275; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)276; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]277; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0278; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0279; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0280; GFX12-SDAG-NEXT: ; return to shader part epilog281;282; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg4098:283; GFX12-GISEL: ; %bb.0:284; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0xffffeffe285; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1286; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0287; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0288; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0289; GFX12-GISEL-NEXT: ; return to shader part epilog290 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -4098291 %load = load i8, ptr addrspace(1) %gep0292 %zext = zext i8 %load to i32293 %to.vgpr = bitcast i32 %zext to float294 ret float %to.vgpr295}296 297; SGPR base with maximum gfx10 immediate offset298define amdgpu_ps float @global_load_saddr_i8_offset_2048(ptr addrspace(1) inreg %sbase) {299; GFX9-LABEL: global_load_saddr_i8_offset_2048:300; GFX9: ; %bb.0:301; GFX9-NEXT: v_mov_b32_e32 v0, 0302; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:2048303; GFX9-NEXT: s_waitcnt vmcnt(0)304; GFX9-NEXT: ; return to shader part epilog305;306; GFX10-LABEL: global_load_saddr_i8_offset_2048:307; GFX10: ; %bb.0:308; GFX10-NEXT: v_mov_b32_e32 v0, 0x800309; GFX10-NEXT: global_load_ubyte v0, v0, s[2:3]310; GFX10-NEXT: s_waitcnt vmcnt(0)311; GFX10-NEXT: ; return to shader part epilog312;313; GFX11-LABEL: global_load_saddr_i8_offset_2048:314; GFX11: ; %bb.0:315; GFX11-NEXT: v_mov_b32_e32 v0, 0316; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:2048317; GFX11-NEXT: s_waitcnt vmcnt(0)318; GFX11-NEXT: ; return to shader part epilog319;320; GFX12-LABEL: global_load_saddr_i8_offset_2048:321; GFX12: ; %bb.0:322; GFX12-NEXT: s_load_u8 s0, s[2:3], 0x800323; GFX12-NEXT: s_wait_kmcnt 0x0324; GFX12-NEXT: v_mov_b32_e32 v0, s0325; GFX12-NEXT: ; return to shader part epilog326 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 2048327 %load = load i8, ptr addrspace(1) %gep0328 %zext = zext i8 %load to i32329 %to.vgpr = bitcast i32 %zext to float330 ret float %to.vgpr331}332 333; SGPR base with maximum gfx10 immediate offset + 1334define amdgpu_ps float @global_load_saddr_i8_offset_2049(ptr addrspace(1) inreg %sbase) {335; GFX9-LABEL: global_load_saddr_i8_offset_2049:336; GFX9: ; %bb.0:337; GFX9-NEXT: v_mov_b32_e32 v0, 0338; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:2049339; GFX9-NEXT: s_waitcnt vmcnt(0)340; GFX9-NEXT: ; return to shader part epilog341;342; GFX10-LABEL: global_load_saddr_i8_offset_2049:343; GFX10: ; %bb.0:344; GFX10-NEXT: v_mov_b32_e32 v0, 0x800345; GFX10-NEXT: global_load_ubyte v0, v0, s[2:3] offset:1346; GFX10-NEXT: s_waitcnt vmcnt(0)347; GFX10-NEXT: ; return to shader part epilog348;349; GFX11-LABEL: global_load_saddr_i8_offset_2049:350; GFX11: ; %bb.0:351; GFX11-NEXT: v_mov_b32_e32 v0, 0352; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:2049353; GFX11-NEXT: s_waitcnt vmcnt(0)354; GFX11-NEXT: ; return to shader part epilog355;356; GFX12-LABEL: global_load_saddr_i8_offset_2049:357; GFX12: ; %bb.0:358; GFX12-NEXT: s_load_u8 s0, s[2:3], 0x801359; GFX12-NEXT: s_wait_kmcnt 0x0360; GFX12-NEXT: v_mov_b32_e32 v0, s0361; GFX12-NEXT: ; return to shader part epilog362 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 2049363 %load = load i8, ptr addrspace(1) %gep0364 %zext = zext i8 %load to i32365 %to.vgpr = bitcast i32 %zext to float366 ret float %to.vgpr367}368 369; SGPR base with maximum gfx10 immediate offset + 2370define amdgpu_ps float @global_load_saddr_i8_offset_2050(ptr addrspace(1) inreg %sbase) {371; GFX9-LABEL: global_load_saddr_i8_offset_2050:372; GFX9: ; %bb.0:373; GFX9-NEXT: v_mov_b32_e32 v0, 0374; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:2050375; GFX9-NEXT: s_waitcnt vmcnt(0)376; GFX9-NEXT: ; return to shader part epilog377;378; GFX10-LABEL: global_load_saddr_i8_offset_2050:379; GFX10: ; %bb.0:380; GFX10-NEXT: v_mov_b32_e32 v0, 0x800381; GFX10-NEXT: global_load_ubyte v0, v0, s[2:3] offset:2382; GFX10-NEXT: s_waitcnt vmcnt(0)383; GFX10-NEXT: ; return to shader part epilog384;385; GFX11-LABEL: global_load_saddr_i8_offset_2050:386; GFX11: ; %bb.0:387; GFX11-NEXT: v_mov_b32_e32 v0, 0388; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:2050389; GFX11-NEXT: s_waitcnt vmcnt(0)390; GFX11-NEXT: ; return to shader part epilog391;392; GFX12-LABEL: global_load_saddr_i8_offset_2050:393; GFX12: ; %bb.0:394; GFX12-NEXT: s_load_u8 s0, s[2:3], 0x802395; GFX12-NEXT: s_wait_kmcnt 0x0396; GFX12-NEXT: v_mov_b32_e32 v0, s0397; GFX12-NEXT: ; return to shader part epilog398 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 2050399 %load = load i8, ptr addrspace(1) %gep0400 %zext = zext i8 %load to i32401 %to.vgpr = bitcast i32 %zext to float402 ret float %to.vgpr403}404 405; SGPR base with maximum negative gfx10 immediate offset406define amdgpu_ps float @global_load_saddr_i8_offset_neg2048(ptr addrspace(1) inreg %sbase) {407; GCN-LABEL: global_load_saddr_i8_offset_neg2048:408; GCN: ; %bb.0:409; GCN-NEXT: v_mov_b32_e32 v0, 0410; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-2048411; GCN-NEXT: s_waitcnt vmcnt(0)412; GCN-NEXT: ; return to shader part epilog413;414; GFX11-LABEL: global_load_saddr_i8_offset_neg2048:415; GFX11: ; %bb.0:416; GFX11-NEXT: v_mov_b32_e32 v0, 0417; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-2048418; GFX11-NEXT: s_waitcnt vmcnt(0)419; GFX11-NEXT: ; return to shader part epilog420;421; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg2048:422; GFX12-SDAG: ; %bb.0:423; GFX12-SDAG-NEXT: s_movk_i32 s0, 0xf800424; GFX12-SDAG-NEXT: s_mov_b32 s1, -1425; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)426; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]427; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0428; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0429; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0430; GFX12-SDAG-NEXT: ; return to shader part epilog431;432; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg2048:433; GFX12-GISEL: ; %bb.0:434; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0xfffff800435; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1436; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0437; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0438; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0439; GFX12-GISEL-NEXT: ; return to shader part epilog440 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -2048441 %load = load i8, ptr addrspace(1) %gep0442 %zext = zext i8 %load to i32443 %to.vgpr = bitcast i32 %zext to float444 ret float %to.vgpr445}446 447; SGPR base with maximum negative gfx10 immediate offset - 1448define amdgpu_ps float @global_load_saddr_i8_offset_neg2049(ptr addrspace(1) inreg %sbase) {449; GFX9-LABEL: global_load_saddr_i8_offset_neg2049:450; GFX9: ; %bb.0:451; GFX9-NEXT: v_mov_b32_e32 v0, 0452; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-2049453; GFX9-NEXT: s_waitcnt vmcnt(0)454; GFX9-NEXT: ; return to shader part epilog455;456; GFX10-LABEL: global_load_saddr_i8_offset_neg2049:457; GFX10: ; %bb.0:458; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0xfffff800, s2459; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], -1, s3, s[0:1]460; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:-1461; GFX10-NEXT: s_waitcnt vmcnt(0)462; GFX10-NEXT: ; return to shader part epilog463;464; GFX11-LABEL: global_load_saddr_i8_offset_neg2049:465; GFX11: ; %bb.0:466; GFX11-NEXT: v_mov_b32_e32 v0, 0467; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-2049468; GFX11-NEXT: s_waitcnt vmcnt(0)469; GFX11-NEXT: ; return to shader part epilog470;471; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg2049:472; GFX12-SDAG: ; %bb.0:473; GFX12-SDAG-NEXT: s_movk_i32 s0, 0xf7ff474; GFX12-SDAG-NEXT: s_mov_b32 s1, -1475; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)476; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]477; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0478; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0479; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0480; GFX12-SDAG-NEXT: ; return to shader part epilog481;482; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg2049:483; GFX12-GISEL: ; %bb.0:484; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0xfffff7ff485; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1486; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0487; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0488; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0489; GFX12-GISEL-NEXT: ; return to shader part epilog490 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -2049491 %load = load i8, ptr addrspace(1) %gep0492 %zext = zext i8 %load to i32493 %to.vgpr = bitcast i32 %zext to float494 ret float %to.vgpr495}496 497; SGPR base with maximum negative gfx10 immediate offset - 1498define amdgpu_ps float @global_load_saddr_i8_offset_neg2050(ptr addrspace(1) inreg %sbase) {499; GFX9-LABEL: global_load_saddr_i8_offset_neg2050:500; GFX9: ; %bb.0:501; GFX9-NEXT: v_mov_b32_e32 v0, 0502; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-2050503; GFX9-NEXT: s_waitcnt vmcnt(0)504; GFX9-NEXT: ; return to shader part epilog505;506; GFX10-LABEL: global_load_saddr_i8_offset_neg2050:507; GFX10: ; %bb.0:508; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0xfffff800, s2509; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], -1, s3, s[0:1]510; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:-2511; GFX10-NEXT: s_waitcnt vmcnt(0)512; GFX10-NEXT: ; return to shader part epilog513;514; GFX11-LABEL: global_load_saddr_i8_offset_neg2050:515; GFX11: ; %bb.0:516; GFX11-NEXT: v_mov_b32_e32 v0, 0517; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-2050518; GFX11-NEXT: s_waitcnt vmcnt(0)519; GFX11-NEXT: ; return to shader part epilog520;521; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg2050:522; GFX12-SDAG: ; %bb.0:523; GFX12-SDAG-NEXT: s_movk_i32 s0, 0xf7fe524; GFX12-SDAG-NEXT: s_mov_b32 s1, -1525; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)526; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]527; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0528; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0529; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0530; GFX12-SDAG-NEXT: ; return to shader part epilog531;532; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg2050:533; GFX12-GISEL: ; %bb.0:534; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0xfffff7fe535; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1536; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0537; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0538; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0539; GFX12-GISEL-NEXT: ; return to shader part epilog540 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -2050541 %load = load i8, ptr addrspace(1) %gep0542 %zext = zext i8 %load to i32543 %to.vgpr = bitcast i32 %zext to float544 ret float %to.vgpr545}546 547define amdgpu_ps float @global_load_saddr_i8_offset_0x7FFFFF(ptr addrspace(1) inreg %sbase) {548; GFX9-LABEL: global_load_saddr_i8_offset_0x7FFFFF:549; GFX9: ; %bb.0:550; GFX9-NEXT: v_mov_b32_e32 v0, 0x7ff000551; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:4095552; GFX9-NEXT: s_waitcnt vmcnt(0)553; GFX9-NEXT: ; return to shader part epilog554;555; GFX10-LABEL: global_load_saddr_i8_offset_0x7FFFFF:556; GFX10: ; %bb.0:557; GFX10-NEXT: v_mov_b32_e32 v0, 0x7ff800558; GFX10-NEXT: global_load_ubyte v0, v0, s[2:3] offset:2047559; GFX10-NEXT: s_waitcnt vmcnt(0)560; GFX10-NEXT: ; return to shader part epilog561;562; GFX11-LABEL: global_load_saddr_i8_offset_0x7FFFFF:563; GFX11: ; %bb.0:564; GFX11-NEXT: v_mov_b32_e32 v0, 0x7ff000565; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:4095566; GFX11-NEXT: s_waitcnt vmcnt(0)567; GFX11-NEXT: ; return to shader part epilog568;569; GFX12-LABEL: global_load_saddr_i8_offset_0x7FFFFF:570; GFX12: ; %bb.0:571; GFX12-NEXT: s_load_u8 s0, s[2:3], 0x7fffff572; GFX12-NEXT: s_wait_kmcnt 0x0573; GFX12-NEXT: v_mov_b32_e32 v0, s0574; GFX12-NEXT: ; return to shader part epilog575 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 8388607576 %load = load i8, ptr addrspace(1) %gep0577 %zext = zext i8 %load to i32578 %to.vgpr = bitcast i32 %zext to float579 ret float %to.vgpr580}581 582define amdgpu_ps float @global_load_saddr_i8_offset_0xFFFFFF(ptr addrspace(1) inreg %sbase) {583; GFX9-LABEL: global_load_saddr_i8_offset_0xFFFFFF:584; GFX9: ; %bb.0:585; GFX9-NEXT: s_add_u32 s0, s2, 0xff800000586; GFX9-NEXT: s_addc_u32 s1, s3, -1587; GFX9-NEXT: v_mov_b32_e32 v0, 0588; GFX9-NEXT: global_load_ubyte v0, v0, s[0:1]589; GFX9-NEXT: s_waitcnt vmcnt(0)590; GFX9-NEXT: ; return to shader part epilog591;592; GFX10-LABEL: global_load_saddr_i8_offset_0xFFFFFF:593; GFX10: ; %bb.0:594; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0xff800000, s2595; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], -1, s3, s[0:1]596; GFX10-NEXT: global_load_ubyte v0, v[0:1], off597; GFX10-NEXT: s_waitcnt vmcnt(0)598; GFX10-NEXT: ; return to shader part epilog599;600; GFX11-LABEL: global_load_saddr_i8_offset_0xFFFFFF:601; GFX11: ; %bb.0:602; GFX11-NEXT: v_add_co_u32 v0, s[0:1], 0xff800000, s2603; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)604; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, -1, s3, s[0:1]605; GFX11-NEXT: global_load_u8 v0, v[0:1], off606; GFX11-NEXT: s_waitcnt vmcnt(0)607; GFX11-NEXT: ; return to shader part epilog608;609; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_0xFFFFFF:610; GFX12-SDAG: ; %bb.0:611; GFX12-SDAG-NEXT: s_mov_b32 s0, 0xff800000612; GFX12-SDAG-NEXT: s_mov_b32 s1, -1613; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)614; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]615; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0616; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0617; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0618; GFX12-SDAG-NEXT: ; return to shader part epilog619;620; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_0xFFFFFF:621; GFX12-GISEL: ; %bb.0:622; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0xff800000623; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1624; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0625; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0626; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0627; GFX12-GISEL-NEXT: ; return to shader part epilog628 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -8388608629 %load = load i8, ptr addrspace(1) %gep0630 %zext = zext i8 %load to i32631 %to.vgpr = bitcast i32 %zext to float632 ret float %to.vgpr633}634 635define amdgpu_ps float @global_load_saddr_i8_offset_0xFFFFFFFF(ptr addrspace(1) inreg %sbase) {636; GFX9-LABEL: global_load_saddr_i8_offset_0xFFFFFFFF:637; GFX9: ; %bb.0:638; GFX9-NEXT: v_mov_b32_e32 v0, 0xfffff000639; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:4095640; GFX9-NEXT: s_waitcnt vmcnt(0)641; GFX9-NEXT: ; return to shader part epilog642;643; GFX10-LABEL: global_load_saddr_i8_offset_0xFFFFFFFF:644; GFX10: ; %bb.0:645; GFX10-NEXT: v_mov_b32_e32 v0, 0xfffff800646; GFX10-NEXT: global_load_ubyte v0, v0, s[2:3] offset:2047647; GFX10-NEXT: s_waitcnt vmcnt(0)648; GFX10-NEXT: ; return to shader part epilog649;650; GFX11-LABEL: global_load_saddr_i8_offset_0xFFFFFFFF:651; GFX11: ; %bb.0:652; GFX11-NEXT: v_mov_b32_e32 v0, 0xfffff000653; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:4095654; GFX11-NEXT: s_waitcnt vmcnt(0)655; GFX11-NEXT: ; return to shader part epilog656;657; GFX12-LABEL: global_load_saddr_i8_offset_0xFFFFFFFF:658; GFX12: ; %bb.0:659; GFX12-NEXT: s_mov_b32 s0, -1660; GFX12-NEXT: s_load_u8 s0, s[2:3], s0 offset:0x0661; GFX12-NEXT: s_wait_kmcnt 0x0662; GFX12-NEXT: v_mov_b32_e32 v0, s0663; GFX12-NEXT: ; return to shader part epilog664 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 4294967295665 %load = load i8, ptr addrspace(1) %gep0666 %zext = zext i8 %load to i32667 %to.vgpr = bitcast i32 %zext to float668 ret float %to.vgpr669}670 671define amdgpu_ps float @global_load_saddr_i8_offset_0x100000000(ptr addrspace(1) inreg %sbase) {672; GFX9-LABEL: global_load_saddr_i8_offset_0x100000000:673; GFX9: ; %bb.0:674; GFX9-NEXT: s_add_i32 s3, s3, 1675; GFX9-NEXT: v_mov_b32_e32 v0, 0676; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3]677; GFX9-NEXT: s_waitcnt vmcnt(0)678; GFX9-NEXT: ; return to shader part epilog679;680; GFX10-LABEL: global_load_saddr_i8_offset_0x100000000:681; GFX10: ; %bb.0:682; GFX10-NEXT: v_mov_b32_e32 v0, 0683; GFX10-NEXT: s_add_i32 s3, s3, 1684; GFX10-NEXT: global_load_ubyte v0, v0, s[2:3]685; GFX10-NEXT: s_waitcnt vmcnt(0)686; GFX10-NEXT: ; return to shader part epilog687;688; GFX11-LABEL: global_load_saddr_i8_offset_0x100000000:689; GFX11: ; %bb.0:690; GFX11-NEXT: v_mov_b32_e32 v0, 0691; GFX11-NEXT: s_add_i32 s3, s3, 1692; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]693; GFX11-NEXT: s_waitcnt vmcnt(0)694; GFX11-NEXT: ; return to shader part epilog695;696; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_0x100000000:697; GFX12-SDAG: ; %bb.0:698; GFX12-SDAG-NEXT: s_add_co_i32 s3, s3, 1699; GFX12-SDAG-NEXT: s_load_u8 s0, s[2:3], 0x0700; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0701; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0702; GFX12-SDAG-NEXT: ; return to shader part epilog703;704; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_0x100000000:705; GFX12-GISEL: ; %bb.0:706; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0707; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, 1708; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0709; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0710; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0711; GFX12-GISEL-NEXT: ; return to shader part epilog712 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 4294967296713 %load = load i8, ptr addrspace(1) %gep0714 %zext = zext i8 %load to i32715 %to.vgpr = bitcast i32 %zext to float716 ret float %to.vgpr717}718 719define amdgpu_ps float @global_load_saddr_i8_offset_0x100000001(ptr addrspace(1) inreg %sbase) {720; GFX9-LABEL: global_load_saddr_i8_offset_0x100000001:721; GFX9: ; %bb.0:722; GFX9-NEXT: v_mov_b32_e32 v1, s3723; GFX9-NEXT: v_add_co_u32_e64 v0, vcc, 0, s2724; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 1, v1, vcc725; GFX9-NEXT: global_load_ubyte v0, v[0:1], off offset:1726; GFX9-NEXT: s_waitcnt vmcnt(0)727; GFX9-NEXT: ; return to shader part epilog728;729; GFX10-LABEL: global_load_saddr_i8_offset_0x100000001:730; GFX10: ; %bb.0:731; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0, s2732; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], 1, s3, s[0:1]733; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:1734; GFX10-NEXT: s_waitcnt vmcnt(0)735; GFX10-NEXT: ; return to shader part epilog736;737; GFX11-LABEL: global_load_saddr_i8_offset_0x100000001:738; GFX11: ; %bb.0:739; GFX11-NEXT: v_add_co_u32 v0, s[0:1], 0, s2740; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)741; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, 1, s3, s[0:1]742; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:1743; GFX11-NEXT: s_waitcnt vmcnt(0)744; GFX11-NEXT: ; return to shader part epilog745;746; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_0x100000001:747; GFX12-SDAG: ; %bb.0:748; GFX12-SDAG-NEXT: s_mov_b32 s0, 1749; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)750; GFX12-SDAG-NEXT: s_mov_b32 s1, s0751; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]752; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0753; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0754; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0755; GFX12-SDAG-NEXT: ; return to shader part epilog756;757; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_0x100000001:758; GFX12-GISEL: ; %bb.0:759; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 1760; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, 1761; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0762; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0763; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0764; GFX12-GISEL-NEXT: ; return to shader part epilog765 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 4294967297766 %load = load i8, ptr addrspace(1) %gep0767 %zext = zext i8 %load to i32768 %to.vgpr = bitcast i32 %zext to float769 ret float %to.vgpr770}771 772define amdgpu_ps float @global_load_saddr_i8_offset_0x100000FFF(ptr addrspace(1) inreg %sbase) {773; GFX9-LABEL: global_load_saddr_i8_offset_0x100000FFF:774; GFX9: ; %bb.0:775; GFX9-NEXT: s_add_u32 s0, s2, 0xfff776; GFX9-NEXT: s_addc_u32 s1, s3, 1777; GFX9-NEXT: v_mov_b32_e32 v0, 0778; GFX9-NEXT: global_load_ubyte v0, v0, s[0:1]779; GFX9-NEXT: s_waitcnt vmcnt(0)780; GFX9-NEXT: ; return to shader part epilog781;782; GFX10-LABEL: global_load_saddr_i8_offset_0x100000FFF:783; GFX10: ; %bb.0:784; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0x800, s2785; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], 1, s3, s[0:1]786; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:2047787; GFX10-NEXT: s_waitcnt vmcnt(0)788; GFX10-NEXT: ; return to shader part epilog789;790; GFX11-LABEL: global_load_saddr_i8_offset_0x100000FFF:791; GFX11: ; %bb.0:792; GFX11-NEXT: v_add_co_u32 v0, s[0:1], 0, s2793; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)794; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, 1, s3, s[0:1]795; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:4095796; GFX11-NEXT: s_waitcnt vmcnt(0)797; GFX11-NEXT: ; return to shader part epilog798;799; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_0x100000FFF:800; GFX12-SDAG: ; %bb.0:801; GFX12-SDAG-NEXT: s_movk_i32 s0, 0xfff802; GFX12-SDAG-NEXT: s_mov_b32 s1, 1803; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)804; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]805; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0806; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0807; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0808; GFX12-SDAG-NEXT: ; return to shader part epilog809;810; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_0x100000FFF:811; GFX12-GISEL: ; %bb.0:812; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0xfff813; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, 1814; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0815; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0816; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0817; GFX12-GISEL-NEXT: ; return to shader part epilog818 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 4294971391819 %load = load i8, ptr addrspace(1) %gep0820 %zext = zext i8 %load to i32821 %to.vgpr = bitcast i32 %zext to float822 ret float %to.vgpr823}824 825define amdgpu_ps float @global_load_saddr_i8_offset_0x100001000(ptr addrspace(1) inreg %sbase) {826; GFX9-LABEL: global_load_saddr_i8_offset_0x100001000:827; GFX9: ; %bb.0:828; GFX9-NEXT: s_add_u32 s0, s2, 0x1000829; GFX9-NEXT: s_addc_u32 s1, s3, 1830; GFX9-NEXT: v_mov_b32_e32 v0, 0831; GFX9-NEXT: global_load_ubyte v0, v0, s[0:1]832; GFX9-NEXT: s_waitcnt vmcnt(0)833; GFX9-NEXT: ; return to shader part epilog834;835; GFX10-LABEL: global_load_saddr_i8_offset_0x100001000:836; GFX10: ; %bb.0:837; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0x1000, s2838; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], 1, s3, s[0:1]839; GFX10-NEXT: global_load_ubyte v0, v[0:1], off840; GFX10-NEXT: s_waitcnt vmcnt(0)841; GFX10-NEXT: ; return to shader part epilog842;843; GFX11-LABEL: global_load_saddr_i8_offset_0x100001000:844; GFX11: ; %bb.0:845; GFX11-NEXT: v_add_co_u32 v0, s[0:1], 0x1000, s2846; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)847; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, 1, s3, s[0:1]848; GFX11-NEXT: global_load_u8 v0, v[0:1], off849; GFX11-NEXT: s_waitcnt vmcnt(0)850; GFX11-NEXT: ; return to shader part epilog851;852; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_0x100001000:853; GFX12-SDAG: ; %bb.0:854; GFX12-SDAG-NEXT: s_movk_i32 s0, 0x1000855; GFX12-SDAG-NEXT: s_mov_b32 s1, 1856; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)857; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]858; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0859; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0860; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0861; GFX12-SDAG-NEXT: ; return to shader part epilog862;863; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_0x100001000:864; GFX12-GISEL: ; %bb.0:865; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0x1000866; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, 1867; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0868; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0869; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0870; GFX12-GISEL-NEXT: ; return to shader part epilog871 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 4294971392872 %load = load i8, ptr addrspace(1) %gep0873 %zext = zext i8 %load to i32874 %to.vgpr = bitcast i32 %zext to float875 ret float %to.vgpr876}877 878define amdgpu_ps float @global_load_saddr_i8_offset_neg0xFFFFFFFF(ptr addrspace(1) inreg %sbase) {879; GFX9-LABEL: global_load_saddr_i8_offset_neg0xFFFFFFFF:880; GFX9: ; %bb.0:881; GFX9-NEXT: v_mov_b32_e32 v0, s2882; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x1000, v0883; GFX9-NEXT: v_mov_b32_e32 v1, s3884; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, -1, v1, vcc885; GFX9-NEXT: global_load_ubyte v0, v[0:1], off offset:-4095886; GFX9-NEXT: s_waitcnt vmcnt(0)887; GFX9-NEXT: ; return to shader part epilog888;889; GFX10-LABEL: global_load_saddr_i8_offset_neg0xFFFFFFFF:890; GFX10: ; %bb.0:891; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0x800, s2892; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], -1, s3, s[0:1]893; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:-2047894; GFX10-NEXT: s_waitcnt vmcnt(0)895; GFX10-NEXT: ; return to shader part epilog896;897; GFX11-LABEL: global_load_saddr_i8_offset_neg0xFFFFFFFF:898; GFX11: ; %bb.0:899; GFX11-NEXT: v_add_co_u32 v0, s[0:1], 0x1000, s2900; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)901; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, -1, s3, s[0:1]902; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:-4095903; GFX11-NEXT: s_waitcnt vmcnt(0)904; GFX11-NEXT: ; return to shader part epilog905;906; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg0xFFFFFFFF:907; GFX12-SDAG: ; %bb.0:908; GFX12-SDAG-NEXT: s_mov_b32 s0, 1909; GFX12-SDAG-NEXT: s_mov_b32 s1, -1910; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)911; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]912; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x0913; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0914; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0915; GFX12-SDAG-NEXT: ; return to shader part epilog916;917; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg0xFFFFFFFF:918; GFX12-GISEL: ; %bb.0:919; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 1920; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1921; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0922; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0923; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0924; GFX12-GISEL-NEXT: ; return to shader part epilog925 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -4294967295926 %load = load i8, ptr addrspace(1) %gep0927 %zext = zext i8 %load to i32928 %to.vgpr = bitcast i32 %zext to float929 ret float %to.vgpr930}931 932define amdgpu_ps float @global_load_saddr_i8_offset_neg0x100000000(ptr addrspace(1) inreg %sbase) {933; GFX9-LABEL: global_load_saddr_i8_offset_neg0x100000000:934; GFX9: ; %bb.0:935; GFX9-NEXT: s_add_i32 s3, s3, -1936; GFX9-NEXT: v_mov_b32_e32 v0, 0937; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3]938; GFX9-NEXT: s_waitcnt vmcnt(0)939; GFX9-NEXT: ; return to shader part epilog940;941; GFX10-LABEL: global_load_saddr_i8_offset_neg0x100000000:942; GFX10: ; %bb.0:943; GFX10-NEXT: v_mov_b32_e32 v0, 0944; GFX10-NEXT: s_add_i32 s3, s3, -1945; GFX10-NEXT: global_load_ubyte v0, v0, s[2:3]946; GFX10-NEXT: s_waitcnt vmcnt(0)947; GFX10-NEXT: ; return to shader part epilog948;949; GFX11-LABEL: global_load_saddr_i8_offset_neg0x100000000:950; GFX11: ; %bb.0:951; GFX11-NEXT: v_mov_b32_e32 v0, 0952; GFX11-NEXT: s_add_i32 s3, s3, -1953; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]954; GFX11-NEXT: s_waitcnt vmcnt(0)955; GFX11-NEXT: ; return to shader part epilog956;957; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg0x100000000:958; GFX12-SDAG: ; %bb.0:959; GFX12-SDAG-NEXT: s_add_co_i32 s3, s3, -1960; GFX12-SDAG-NEXT: s_load_u8 s0, s[2:3], 0x0961; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0962; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0963; GFX12-SDAG-NEXT: ; return to shader part epilog964;965; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg0x100000000:966; GFX12-GISEL: ; %bb.0:967; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, 0968; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -1969; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x0970; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0971; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0972; GFX12-GISEL-NEXT: ; return to shader part epilog973 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -4294967296974 %load = load i8, ptr addrspace(1) %gep0975 %zext = zext i8 %load to i32976 %to.vgpr = bitcast i32 %zext to float977 ret float %to.vgpr978}979 980define amdgpu_ps float @global_load_saddr_i8_offset_neg0x100000001(ptr addrspace(1) inreg %sbase) {981; GFX9-LABEL: global_load_saddr_i8_offset_neg0x100000001:982; GFX9: ; %bb.0:983; GFX9-NEXT: v_mov_b32_e32 v1, s3984; GFX9-NEXT: v_add_co_u32_e64 v0, vcc, 0, s2985; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, -1, v1, vcc986; GFX9-NEXT: global_load_ubyte v0, v[0:1], off offset:-1987; GFX9-NEXT: s_waitcnt vmcnt(0)988; GFX9-NEXT: ; return to shader part epilog989;990; GFX10-LABEL: global_load_saddr_i8_offset_neg0x100000001:991; GFX10: ; %bb.0:992; GFX10-NEXT: v_add_co_u32 v0, s[0:1], 0, s2993; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], -1, s3, s[0:1]994; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:-1995; GFX10-NEXT: s_waitcnt vmcnt(0)996; GFX10-NEXT: ; return to shader part epilog997;998; GFX11-LABEL: global_load_saddr_i8_offset_neg0x100000001:999; GFX11: ; %bb.0:1000; GFX11-NEXT: v_add_co_u32 v0, s[0:1], 0, s21001; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1002; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, -1, s3, s[0:1]1003; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:-11004; GFX11-NEXT: s_waitcnt vmcnt(0)1005; GFX11-NEXT: ; return to shader part epilog1006;1007; GFX12-SDAG-LABEL: global_load_saddr_i8_offset_neg0x100000001:1008; GFX12-SDAG: ; %bb.0:1009; GFX12-SDAG-NEXT: s_mov_b32 s0, -11010; GFX12-SDAG-NEXT: s_mov_b32 s1, -21011; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)1012; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[0:1]1013; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x01014; GFX12-SDAG-NEXT: s_wait_kmcnt 0x01015; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s01016; GFX12-SDAG-NEXT: ; return to shader part epilog1017;1018; GFX12-GISEL-LABEL: global_load_saddr_i8_offset_neg0x100000001:1019; GFX12-GISEL: ; %bb.0:1020; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, -11021; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, -21022; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x01023; GFX12-GISEL-NEXT: s_wait_kmcnt 0x01024; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s01025; GFX12-GISEL-NEXT: ; return to shader part epilog1026 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 -42949672971027 %load = load i8, ptr addrspace(1) %gep01028 %zext = zext i8 %load to i321029 %to.vgpr = bitcast i32 %zext to float1030 ret float %to.vgpr1031}1032 1033; --------------------------------------------------------------------------------1034; Basic addressing patterns1035; --------------------------------------------------------------------------------1036 1037; Basic pattern, no immediate offset.1038define amdgpu_ps float @global_load_saddr_i8_zext_vgpr(ptr addrspace(1) inreg %sbase, i32 %voffset) {1039; GCN-LABEL: global_load_saddr_i8_zext_vgpr:1040; GCN: ; %bb.0:1041; GCN-NEXT: global_load_ubyte v0, v0, s[2:3]1042; GCN-NEXT: s_waitcnt vmcnt(0)1043; GCN-NEXT: ; return to shader part epilog1044;1045; GFX11-LABEL: global_load_saddr_i8_zext_vgpr:1046; GFX11: ; %bb.0:1047; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]1048; GFX11-NEXT: s_waitcnt vmcnt(0)1049; GFX11-NEXT: ; return to shader part epilog1050;1051; GFX12-LABEL: global_load_saddr_i8_zext_vgpr:1052; GFX12: ; %bb.0:1053; GFX12-NEXT: global_load_u8 v0, v0, s[2:3]1054; GFX12-NEXT: s_wait_loadcnt 0x01055; GFX12-NEXT: ; return to shader part epilog1056 %zext.offset = zext i32 %voffset to i641057 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1058 %load = load i8, ptr addrspace(1) %gep01059 %zext = zext i8 %load to i321060 %to.vgpr = bitcast i32 %zext to float1061 ret float %to.vgpr1062}1063 1064; Maximum positive offset on gfx91065define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_4095(ptr addrspace(1) inreg %sbase, i32 %voffset) {1066; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_4095:1067; GFX9: ; %bb.0:1068; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:40951069; GFX9-NEXT: s_waitcnt vmcnt(0)1070; GFX9-NEXT: ; return to shader part epilog1071;1072; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_4095:1073; GFX10: ; %bb.0:1074; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01075; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1076; GFX10-NEXT: v_add_co_u32 v0, vcc, 0x800, v01077; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, 0, v1, vcc1078; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:20471079; GFX10-NEXT: s_waitcnt vmcnt(0)1080; GFX10-NEXT: ; return to shader part epilog1081;1082; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_4095:1083; GFX11: ; %bb.0:1084; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:40951085; GFX11-NEXT: s_waitcnt vmcnt(0)1086; GFX11-NEXT: ; return to shader part epilog1087;1088; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_4095:1089; GFX12: ; %bb.0:1090; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:40951091; GFX12-NEXT: s_wait_loadcnt 0x01092; GFX12-NEXT: ; return to shader part epilog1093 %zext.offset = zext i32 %voffset to i641094 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1095 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 40951096 %load = load i8, ptr addrspace(1) %gep11097 %zext = zext i8 %load to i321098 %to.vgpr = bitcast i32 %zext to float1099 ret float %to.vgpr1100}1101 1102; Maximum positive offset on gfx9 + 11103define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_4096(ptr addrspace(1) inreg %sbase, i32 %voffset) {1104; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_4096:1105; GFX9: ; %bb.0:1106; GFX9-NEXT: v_mov_b32_e32 v1, s31107; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, s2, v01108; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1109; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x1000, v01110; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1111; GFX9-NEXT: global_load_ubyte v0, v[0:1], off1112; GFX9-NEXT: s_waitcnt vmcnt(0)1113; GFX9-NEXT: ; return to shader part epilog1114;1115; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_4096:1116; GFX10: ; %bb.0:1117; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01118; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1119; GFX10-NEXT: v_add_co_u32 v0, vcc, 0x1000, v01120; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, 0, v1, vcc1121; GFX10-NEXT: global_load_ubyte v0, v[0:1], off1122; GFX10-NEXT: s_waitcnt vmcnt(0)1123; GFX10-NEXT: ; return to shader part epilog1124;1125; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_4096:1126; GFX11: ; %bb.0:1127; GFX11-NEXT: v_add_co_u32 v0, s[0:1], s2, v01128; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)1129; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s3, 0, s[0:1]1130; GFX11-NEXT: v_add_co_u32 v0, vcc, 0x1000, v01131; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1132; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc1133; GFX11-NEXT: global_load_u8 v0, v[0:1], off1134; GFX11-NEXT: s_waitcnt vmcnt(0)1135; GFX11-NEXT: ; return to shader part epilog1136;1137; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_4096:1138; GFX12: ; %bb.0:1139; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:40961140; GFX12-NEXT: s_wait_loadcnt 0x01141; GFX12-NEXT: ; return to shader part epilog1142 %zext.offset = zext i32 %voffset to i641143 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1144 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 40961145 %load = load i8, ptr addrspace(1) %gep11146 %zext = zext i8 %load to i321147 %to.vgpr = bitcast i32 %zext to float1148 ret float %to.vgpr1149}1150 1151; Maximum negative offset on gfx91152define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_neg4096(ptr addrspace(1) inreg %sbase, i32 %voffset) {1153; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg4096:1154; GFX9: ; %bb.0:1155; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-40961156; GFX9-NEXT: s_waitcnt vmcnt(0)1157; GFX9-NEXT: ; return to shader part epilog1158;1159; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg4096:1160; GFX10: ; %bb.0:1161; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01162; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1163; GFX10-NEXT: v_add_co_u32 v0, vcc, 0xfffff000, v01164; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, -1, v1, vcc1165; GFX10-NEXT: global_load_ubyte v0, v[0:1], off1166; GFX10-NEXT: s_waitcnt vmcnt(0)1167; GFX10-NEXT: ; return to shader part epilog1168;1169; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg4096:1170; GFX11: ; %bb.0:1171; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-40961172; GFX11-NEXT: s_waitcnt vmcnt(0)1173; GFX11-NEXT: ; return to shader part epilog1174;1175; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg4096:1176; GFX12: ; %bb.0:1177; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:-40961178; GFX12-NEXT: s_wait_loadcnt 0x01179; GFX12-NEXT: ; return to shader part epilog1180 %zext.offset = zext i32 %voffset to i641181 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1182 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -40961183 %load = load i8, ptr addrspace(1) %gep11184 %zext = zext i8 %load to i321185 %to.vgpr = bitcast i32 %zext to float1186 ret float %to.vgpr1187}1188 1189; Maximum negative offset on gfx9 - 11190define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_neg4097(ptr addrspace(1) inreg %sbase, i32 %voffset) {1191; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg4097:1192; GFX9: ; %bb.0:1193; GFX9-NEXT: v_mov_b32_e32 v1, s31194; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, s2, v01195; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1196; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0xfffff000, v01197; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, -1, v1, vcc1198; GFX9-NEXT: global_load_ubyte v0, v[0:1], off offset:-11199; GFX9-NEXT: s_waitcnt vmcnt(0)1200; GFX9-NEXT: ; return to shader part epilog1201;1202; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg4097:1203; GFX10: ; %bb.0:1204; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01205; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1206; GFX10-NEXT: v_add_co_u32 v0, vcc, 0xfffff000, v01207; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, -1, v1, vcc1208; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:-11209; GFX10-NEXT: s_waitcnt vmcnt(0)1210; GFX10-NEXT: ; return to shader part epilog1211;1212; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg4097:1213; GFX11: ; %bb.0:1214; GFX11-NEXT: v_add_co_u32 v0, s[0:1], s2, v01215; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)1216; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s3, 0, s[0:1]1217; GFX11-NEXT: v_add_co_u32 v0, vcc, 0xfffff000, v01218; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1219; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, -1, v1, vcc1220; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:-11221; GFX11-NEXT: s_waitcnt vmcnt(0)1222; GFX11-NEXT: ; return to shader part epilog1223;1224; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg4097:1225; GFX12: ; %bb.0:1226; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:-40971227; GFX12-NEXT: s_wait_loadcnt 0x01228; GFX12-NEXT: ; return to shader part epilog1229 %zext.offset = zext i32 %voffset to i641230 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1231 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -40971232 %load = load i8, ptr addrspace(1) %gep11233 %zext = zext i8 %load to i321234 %to.vgpr = bitcast i32 %zext to float1235 ret float %to.vgpr1236}1237 1238; Maximum positive offset on gfx101239define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_2047(ptr addrspace(1) inreg %sbase, i32 %voffset) {1240; GCN-LABEL: global_load_saddr_i8_zext_vgpr_offset_2047:1241; GCN: ; %bb.0:1242; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:20471243; GCN-NEXT: s_waitcnt vmcnt(0)1244; GCN-NEXT: ; return to shader part epilog1245;1246; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_2047:1247; GFX11: ; %bb.0:1248; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:20471249; GFX11-NEXT: s_waitcnt vmcnt(0)1250; GFX11-NEXT: ; return to shader part epilog1251;1252; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_2047:1253; GFX12: ; %bb.0:1254; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:20471255; GFX12-NEXT: s_wait_loadcnt 0x01256; GFX12-NEXT: ; return to shader part epilog1257 %zext.offset = zext i32 %voffset to i641258 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1259 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 20471260 %load = load i8, ptr addrspace(1) %gep11261 %zext = zext i8 %load to i321262 %to.vgpr = bitcast i32 %zext to float1263 ret float %to.vgpr1264}1265 1266; Maximum positive offset on gfx10 + 11267define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_2048(ptr addrspace(1) inreg %sbase, i32 %voffset) {1268; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_2048:1269; GFX9: ; %bb.0:1270; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:20481271; GFX9-NEXT: s_waitcnt vmcnt(0)1272; GFX9-NEXT: ; return to shader part epilog1273;1274; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_2048:1275; GFX10: ; %bb.0:1276; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01277; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1278; GFX10-NEXT: v_add_co_u32 v0, vcc, 0x800, v01279; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, 0, v1, vcc1280; GFX10-NEXT: global_load_ubyte v0, v[0:1], off1281; GFX10-NEXT: s_waitcnt vmcnt(0)1282; GFX10-NEXT: ; return to shader part epilog1283;1284; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_2048:1285; GFX11: ; %bb.0:1286; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:20481287; GFX11-NEXT: s_waitcnt vmcnt(0)1288; GFX11-NEXT: ; return to shader part epilog1289;1290; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_2048:1291; GFX12: ; %bb.0:1292; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:20481293; GFX12-NEXT: s_wait_loadcnt 0x01294; GFX12-NEXT: ; return to shader part epilog1295 %zext.offset = zext i32 %voffset to i641296 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1297 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 20481298 %load = load i8, ptr addrspace(1) %gep11299 %zext = zext i8 %load to i321300 %to.vgpr = bitcast i32 %zext to float1301 ret float %to.vgpr1302}1303 1304; Maximum negative offset on gfx101305define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_neg2048(ptr addrspace(1) inreg %sbase, i32 %voffset) {1306; GCN-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg2048:1307; GCN: ; %bb.0:1308; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-20481309; GCN-NEXT: s_waitcnt vmcnt(0)1310; GCN-NEXT: ; return to shader part epilog1311;1312; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg2048:1313; GFX11: ; %bb.0:1314; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-20481315; GFX11-NEXT: s_waitcnt vmcnt(0)1316; GFX11-NEXT: ; return to shader part epilog1317;1318; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg2048:1319; GFX12: ; %bb.0:1320; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:-20481321; GFX12-NEXT: s_wait_loadcnt 0x01322; GFX12-NEXT: ; return to shader part epilog1323 %zext.offset = zext i32 %voffset to i641324 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1325 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -20481326 %load = load i8, ptr addrspace(1) %gep11327 %zext = zext i8 %load to i321328 %to.vgpr = bitcast i32 %zext to float1329 ret float %to.vgpr1330}1331 1332; Maximum negative offset on gfx10 - 11333define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_neg2049(ptr addrspace(1) inreg %sbase, i32 %voffset) {1334; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg2049:1335; GFX9: ; %bb.0:1336; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-20491337; GFX9-NEXT: s_waitcnt vmcnt(0)1338; GFX9-NEXT: ; return to shader part epilog1339;1340; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg2049:1341; GFX10: ; %bb.0:1342; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01343; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1344; GFX10-NEXT: v_add_co_u32 v0, vcc, 0xfffff800, v01345; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, -1, v1, vcc1346; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:-11347; GFX10-NEXT: s_waitcnt vmcnt(0)1348; GFX10-NEXT: ; return to shader part epilog1349;1350; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg2049:1351; GFX11: ; %bb.0:1352; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-20491353; GFX11-NEXT: s_waitcnt vmcnt(0)1354; GFX11-NEXT: ; return to shader part epilog1355;1356; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_neg2049:1357; GFX12: ; %bb.0:1358; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:-20491359; GFX12-NEXT: s_wait_loadcnt 0x01360; GFX12-NEXT: ; return to shader part epilog1361 %zext.offset = zext i32 %voffset to i641362 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1363 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -20491364 %load = load i8, ptr addrspace(1) %gep11365 %zext = zext i8 %load to i321366 %to.vgpr = bitcast i32 %zext to float1367 ret float %to.vgpr1368}1369 1370; Maximum positive offset on gfx12.1371define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_0x7FFFFF(ptr addrspace(1) inreg %sbase, i32 %voffset) { %zext.offset = zext i32 %voffset to i641372; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_0x7FFFFF:1373; GFX9: ; %bb.0:1374; GFX9-NEXT: v_mov_b32_e32 v1, s31375; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, s2, v01376; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1377; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0x7ff000, v01378; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1379; GFX9-NEXT: global_load_ubyte v0, v[0:1], off offset:40951380; GFX9-NEXT: s_waitcnt vmcnt(0)1381; GFX9-NEXT: ; return to shader part epilog1382;1383; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_0x7FFFFF:1384; GFX10: ; %bb.0:1385; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01386; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1387; GFX10-NEXT: v_add_co_u32 v0, vcc, 0x7ff800, v01388; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, 0, v1, vcc1389; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:20471390; GFX10-NEXT: s_waitcnt vmcnt(0)1391; GFX10-NEXT: ; return to shader part epilog1392;1393; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_0x7FFFFF:1394; GFX11: ; %bb.0:1395; GFX11-NEXT: v_add_co_u32 v0, s[0:1], s2, v01396; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)1397; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s3, 0, s[0:1]1398; GFX11-NEXT: v_add_co_u32 v0, vcc, 0x7ff000, v01399; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1400; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc1401; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:40951402; GFX11-NEXT: s_waitcnt vmcnt(0)1403; GFX11-NEXT: ; return to shader part epilog1404;1405; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_0x7FFFFF:1406; GFX12: ; %bb.0:1407; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:83886071408; GFX12-NEXT: s_wait_loadcnt 0x01409; GFX12-NEXT: ; return to shader part epilog1410 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1411 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 83886071412 %load = load i8, ptr addrspace(1) %gep11413 %zext = zext i8 %load to i321414 %to.vgpr = bitcast i32 %zext to float1415 ret float %to.vgpr1416}1417 1418; Minimum offset on gfx12.1419define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_0xFFFFFF(ptr addrspace(1) inreg %sbase, i32 %voffset) { %zext.offset = zext i32 %voffset to i641420; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_0xFFFFFF:1421; GFX9: ; %bb.0:1422; GFX9-NEXT: v_mov_b32_e32 v1, s31423; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, s2, v01424; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1425; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, 0xff800000, v01426; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, -1, v1, vcc1427; GFX9-NEXT: global_load_ubyte v0, v[0:1], off1428; GFX9-NEXT: s_waitcnt vmcnt(0)1429; GFX9-NEXT: ; return to shader part epilog1430;1431; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_0xFFFFFF:1432; GFX10: ; %bb.0:1433; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01434; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1435; GFX10-NEXT: v_add_co_u32 v0, vcc, 0xff800000, v01436; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, -1, v1, vcc1437; GFX10-NEXT: global_load_ubyte v0, v[0:1], off1438; GFX10-NEXT: s_waitcnt vmcnt(0)1439; GFX10-NEXT: ; return to shader part epilog1440;1441; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_0xFFFFFF:1442; GFX11: ; %bb.0:1443; GFX11-NEXT: v_add_co_u32 v0, s[0:1], s2, v01444; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)1445; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s3, 0, s[0:1]1446; GFX11-NEXT: v_add_co_u32 v0, vcc, 0xff800000, v01447; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1448; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, -1, v1, vcc1449; GFX11-NEXT: global_load_u8 v0, v[0:1], off1450; GFX11-NEXT: s_waitcnt vmcnt(0)1451; GFX11-NEXT: ; return to shader part epilog1452;1453; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_0xFFFFFF:1454; GFX12: ; %bb.0:1455; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:-83886081456; GFX12-NEXT: s_wait_loadcnt 0x01457; GFX12-NEXT: ; return to shader part epilog1458 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1459 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -83886081460 %load = load i8, ptr addrspace(1) %gep11461 %zext = zext i8 %load to i321462 %to.vgpr = bitcast i32 %zext to float1463 ret float %to.vgpr1464}1465 1466 1467; Maximum positive offset on gfx9, and immediate needs to be moved lower.1468define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_offset_4095_gep_order(ptr addrspace(1) inreg %sbase, i32 %voffset) {1469; GFX9-LABEL: global_load_saddr_i8_zext_vgpr_offset_4095_gep_order:1470; GFX9: ; %bb.0:1471; GFX9-NEXT: global_load_ubyte v0, v0, s[2:3] offset:40951472; GFX9-NEXT: s_waitcnt vmcnt(0)1473; GFX9-NEXT: ; return to shader part epilog1474;1475; GFX10-LABEL: global_load_saddr_i8_zext_vgpr_offset_4095_gep_order:1476; GFX10: ; %bb.0:1477; GFX10-NEXT: v_add_co_u32 v0, s[0:1], s2, v01478; GFX10-NEXT: v_add_co_ci_u32_e64 v1, s[0:1], s3, 0, s[0:1]1479; GFX10-NEXT: v_add_co_u32 v0, vcc, 0x800, v01480; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, 0, v1, vcc1481; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:20471482; GFX10-NEXT: s_waitcnt vmcnt(0)1483; GFX10-NEXT: ; return to shader part epilog1484;1485; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_offset_4095_gep_order:1486; GFX11: ; %bb.0:1487; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:40951488; GFX11-NEXT: s_waitcnt vmcnt(0)1489; GFX11-NEXT: ; return to shader part epilog1490;1491; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_offset_4095_gep_order:1492; GFX12: ; %bb.0:1493; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:40951494; GFX12-NEXT: s_wait_loadcnt 0x01495; GFX12-NEXT: ; return to shader part epilog1496 %zext.offset = zext i32 %voffset to i641497 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 40951498 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 %zext.offset1499 %load = load i8, ptr addrspace(1) %gep11500 %zext = zext i8 %load to i321501 %to.vgpr = bitcast i32 %zext to float1502 ret float %to.vgpr1503}1504 1505; pointer addressing done in integers1506define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_ptrtoint(ptr addrspace(1) inreg %sbase, i32 %voffset) {1507; GCN-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint:1508; GCN: ; %bb.0:1509; GCN-NEXT: global_load_ubyte v0, v0, s[2:3]1510; GCN-NEXT: s_waitcnt vmcnt(0)1511; GCN-NEXT: ; return to shader part epilog1512;1513; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint:1514; GFX11: ; %bb.0:1515; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]1516; GFX11-NEXT: s_waitcnt vmcnt(0)1517; GFX11-NEXT: ; return to shader part epilog1518;1519; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint:1520; GFX12: ; %bb.0:1521; GFX12-NEXT: global_load_u8 v0, v0, s[2:3]1522; GFX12-NEXT: s_wait_loadcnt 0x01523; GFX12-NEXT: ; return to shader part epilog1524 %zext.offset = zext i32 %voffset to i641525 %sbase.as.int = ptrtoint ptr addrspace(1) %sbase to i641526 %add = add i64 %sbase.as.int, %zext.offset1527 %dirty.gep = inttoptr i64 %add to ptr addrspace(1)1528 %load = load i8, ptr addrspace(1) %dirty.gep1529 %zext = zext i8 %load to i321530 %to.vgpr = bitcast i32 %zext to float1531 ret float %to.vgpr1532}1533 1534; zext forced to LHS of addressing expression1535define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add(ptr addrspace(1) inreg %sbase, i32 %voffset) {1536; GCN-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add:1537; GCN: ; %bb.0:1538; GCN-NEXT: global_load_ubyte v0, v0, s[2:3]1539; GCN-NEXT: s_waitcnt vmcnt(0)1540; GCN-NEXT: ; return to shader part epilog1541;1542; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add:1543; GFX11: ; %bb.0:1544; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]1545; GFX11-NEXT: s_waitcnt vmcnt(0)1546; GFX11-NEXT: ; return to shader part epilog1547;1548; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add:1549; GFX12: ; %bb.0:1550; GFX12-NEXT: global_load_u8 v0, v0, s[2:3]1551; GFX12-NEXT: s_wait_loadcnt 0x01552; GFX12-NEXT: ; return to shader part epilog1553 %zext.offset = zext i32 %voffset to i641554 %sbase.as.int = ptrtoint ptr addrspace(1) %sbase to i641555 %add = add i64 %zext.offset, %sbase.as.int1556 %dirty.gep = inttoptr i64 %add to ptr addrspace(1)1557 %load = load i8, ptr addrspace(1) %dirty.gep1558 %zext = zext i8 %load to i321559 %to.vgpr = bitcast i32 %zext to float1560 ret float %to.vgpr1561}1562 1563; zext forced to LHS of addressing expression, with immediate offset1564define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add_imm_offset0(ptr addrspace(1) inreg %sbase, i32 %voffset) {1565; GCN-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add_imm_offset0:1566; GCN: ; %bb.0:1567; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:1281568; GCN-NEXT: s_waitcnt vmcnt(0)1569; GCN-NEXT: ; return to shader part epilog1570;1571; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add_imm_offset0:1572; GFX11: ; %bb.0:1573; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:1281574; GFX11-NEXT: s_waitcnt vmcnt(0)1575; GFX11-NEXT: ; return to shader part epilog1576;1577; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add_imm_offset0:1578; GFX12: ; %bb.0:1579; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:1281580; GFX12-NEXT: s_wait_loadcnt 0x01581; GFX12-NEXT: ; return to shader part epilog1582 %zext.offset = zext i32 %voffset to i641583 %sbase.as.int = ptrtoint ptr addrspace(1) %sbase to i641584 %add = add i64 %zext.offset, %sbase.as.int1585 %add.immoffset = add i64 %add, 1281586 %dirty.gep = inttoptr i64 %add.immoffset to ptr addrspace(1)1587 %load = load i8, ptr addrspace(1) %dirty.gep1588 %zext = zext i8 %load to i321589 %to.vgpr = bitcast i32 %zext to float1590 ret float %to.vgpr1591}1592 1593; zext forced to LHS of addressing expression, with immediate offset in non-canonical position1594define amdgpu_ps float @global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add_imm_offset1(ptr addrspace(1) inreg %sbase, i32 %voffset) {1595; GCN-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add_imm_offset1:1596; GCN: ; %bb.0:1597; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:1281598; GCN-NEXT: s_waitcnt vmcnt(0)1599; GCN-NEXT: ; return to shader part epilog1600;1601; GFX11-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add_imm_offset1:1602; GFX11: ; %bb.0:1603; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:1281604; GFX11-NEXT: s_waitcnt vmcnt(0)1605; GFX11-NEXT: ; return to shader part epilog1606;1607; GFX12-LABEL: global_load_saddr_i8_zext_vgpr_ptrtoint_commute_add_imm_offset1:1608; GFX12: ; %bb.0:1609; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:1281610; GFX12-NEXT: s_wait_loadcnt 0x01611; GFX12-NEXT: ; return to shader part epilog1612 %zext.offset = zext i32 %voffset to i641613 %sbase.as.int = ptrtoint ptr addrspace(1) %sbase to i641614 %add.immoffset = add i64 %sbase.as.int, 1281615 %add = add i64 %zext.offset, %add.immoffset1616 %dirty.gep = inttoptr i64 %add to ptr addrspace(1)1617 %load = load i8, ptr addrspace(1) %dirty.gep1618 %zext = zext i8 %load to i321619 %to.vgpr = bitcast i32 %zext to float1620 ret float %to.vgpr1621}1622 1623; --------------------------------------------------------------------------------1624; Uniformity edge cases1625; --------------------------------------------------------------------------------1626 1627@ptr.in.lds = internal addrspace(3) global ptr addrspace(1) poison1628 1629; Base pointer is uniform, but also in VGPRs1630define amdgpu_ps float @global_load_saddr_uniform_ptr_in_vgprs(i32 %voffset) {1631; GFX9-LABEL: global_load_saddr_uniform_ptr_in_vgprs:1632; GFX9: ; %bb.0:1633; GFX9-NEXT: v_mov_b32_e32 v1, 01634; GFX9-NEXT: ds_read_b64 v[1:2], v11635; GFX9-NEXT: s_waitcnt lgkmcnt(0)1636; GFX9-NEXT: v_readfirstlane_b32 s0, v11637; GFX9-NEXT: v_readfirstlane_b32 s1, v21638; GFX9-NEXT: s_nop 41639; GFX9-NEXT: global_load_ubyte v0, v0, s[0:1]1640; GFX9-NEXT: s_waitcnt vmcnt(0)1641; GFX9-NEXT: ; return to shader part epilog1642;1643; GFX10-LABEL: global_load_saddr_uniform_ptr_in_vgprs:1644; GFX10: ; %bb.0:1645; GFX10-NEXT: v_mov_b32_e32 v1, 01646; GFX10-NEXT: ds_read_b64 v[1:2], v11647; GFX10-NEXT: s_waitcnt lgkmcnt(0)1648; GFX10-NEXT: v_readfirstlane_b32 s0, v11649; GFX10-NEXT: v_readfirstlane_b32 s1, v21650; GFX10-NEXT: global_load_ubyte v0, v0, s[0:1]1651; GFX10-NEXT: s_waitcnt vmcnt(0)1652; GFX10-NEXT: ; return to shader part epilog1653;1654; GFX11-LABEL: global_load_saddr_uniform_ptr_in_vgprs:1655; GFX11: ; %bb.0:1656; GFX11-NEXT: v_mov_b32_e32 v1, 01657; GFX11-NEXT: ds_load_b64 v[1:2], v11658; GFX11-NEXT: s_waitcnt lgkmcnt(0)1659; GFX11-NEXT: v_readfirstlane_b32 s0, v11660; GFX11-NEXT: v_readfirstlane_b32 s1, v21661; GFX11-NEXT: global_load_u8 v0, v0, s[0:1]1662; GFX11-NEXT: s_waitcnt vmcnt(0)1663; GFX11-NEXT: ; return to shader part epilog1664;1665; GFX12-SDAG-LABEL: global_load_saddr_uniform_ptr_in_vgprs:1666; GFX12-SDAG: ; %bb.0:1667; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 01668; GFX12-SDAG-NEXT: ds_load_b64 v[1:2], v11669; GFX12-SDAG-NEXT: s_wait_dscnt 0x01670; GFX12-SDAG-NEXT: v_readfirstlane_b32 s0, v11671; GFX12-SDAG-NEXT: v_readfirstlane_b32 s1, v21672; GFX12-SDAG-NEXT: global_load_u8 v0, v0, s[0:1]1673; GFX12-SDAG-NEXT: s_wait_loadcnt 0x01674; GFX12-SDAG-NEXT: ; return to shader part epilog1675;1676; GFX12-GISEL-LABEL: global_load_saddr_uniform_ptr_in_vgprs:1677; GFX12-GISEL: ; %bb.0:1678; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 01679; GFX12-GISEL-NEXT: ds_load_b64 v[1:2], v11680; GFX12-GISEL-NEXT: s_wait_dscnt 0x01681; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc, v1, v01682; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)1683; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v2, vcc1684; GFX12-GISEL-NEXT: global_load_u8 v0, v[0:1], off1685; GFX12-GISEL-NEXT: s_wait_loadcnt 0x01686; GFX12-GISEL-NEXT: ; return to shader part epilog1687 %sbase = load ptr addrspace(1), ptr addrspace(3) @ptr.in.lds1688 %zext.offset = zext i32 %voffset to i641689 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1690 %load = load i8, ptr addrspace(1) %gep01691 %zext = zext i8 %load to i321692 %to.vgpr = bitcast i32 %zext to float1693 ret float %to.vgpr1694}1695 1696; Base pointer is uniform, but also in VGPRs, with imm offset1697define amdgpu_ps float @global_load_saddr_uniform_ptr_in_vgprs_immoffset(i32 %voffset) {1698; GFX9-LABEL: global_load_saddr_uniform_ptr_in_vgprs_immoffset:1699; GFX9: ; %bb.0:1700; GFX9-NEXT: v_mov_b32_e32 v1, 01701; GFX9-NEXT: ds_read_b64 v[1:2], v11702; GFX9-NEXT: s_waitcnt lgkmcnt(0)1703; GFX9-NEXT: v_readfirstlane_b32 s0, v11704; GFX9-NEXT: v_readfirstlane_b32 s1, v21705; GFX9-NEXT: s_nop 41706; GFX9-NEXT: global_load_ubyte v0, v0, s[0:1] offset:421707; GFX9-NEXT: s_waitcnt vmcnt(0)1708; GFX9-NEXT: ; return to shader part epilog1709;1710; GFX10-LABEL: global_load_saddr_uniform_ptr_in_vgprs_immoffset:1711; GFX10: ; %bb.0:1712; GFX10-NEXT: v_mov_b32_e32 v1, 01713; GFX10-NEXT: ds_read_b64 v[1:2], v11714; GFX10-NEXT: s_waitcnt lgkmcnt(0)1715; GFX10-NEXT: v_readfirstlane_b32 s0, v11716; GFX10-NEXT: v_readfirstlane_b32 s1, v21717; GFX10-NEXT: global_load_ubyte v0, v0, s[0:1] offset:421718; GFX10-NEXT: s_waitcnt vmcnt(0)1719; GFX10-NEXT: ; return to shader part epilog1720;1721; GFX11-LABEL: global_load_saddr_uniform_ptr_in_vgprs_immoffset:1722; GFX11: ; %bb.0:1723; GFX11-NEXT: v_mov_b32_e32 v1, 01724; GFX11-NEXT: ds_load_b64 v[1:2], v11725; GFX11-NEXT: s_waitcnt lgkmcnt(0)1726; GFX11-NEXT: v_readfirstlane_b32 s0, v11727; GFX11-NEXT: v_readfirstlane_b32 s1, v21728; GFX11-NEXT: global_load_u8 v0, v0, s[0:1] offset:421729; GFX11-NEXT: s_waitcnt vmcnt(0)1730; GFX11-NEXT: ; return to shader part epilog1731;1732; GFX12-SDAG-LABEL: global_load_saddr_uniform_ptr_in_vgprs_immoffset:1733; GFX12-SDAG: ; %bb.0:1734; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 01735; GFX12-SDAG-NEXT: ds_load_b64 v[1:2], v11736; GFX12-SDAG-NEXT: s_wait_dscnt 0x01737; GFX12-SDAG-NEXT: v_readfirstlane_b32 s0, v11738; GFX12-SDAG-NEXT: v_readfirstlane_b32 s1, v21739; GFX12-SDAG-NEXT: global_load_u8 v0, v0, s[0:1] offset:421740; GFX12-SDAG-NEXT: s_wait_loadcnt 0x01741; GFX12-SDAG-NEXT: ; return to shader part epilog1742;1743; GFX12-GISEL-LABEL: global_load_saddr_uniform_ptr_in_vgprs_immoffset:1744; GFX12-GISEL: ; %bb.0:1745; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 01746; GFX12-GISEL-NEXT: ds_load_b64 v[1:2], v11747; GFX12-GISEL-NEXT: s_wait_dscnt 0x01748; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc, v1, v01749; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)1750; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v2, vcc1751; GFX12-GISEL-NEXT: global_load_u8 v0, v[0:1], off offset:421752; GFX12-GISEL-NEXT: s_wait_loadcnt 0x01753; GFX12-GISEL-NEXT: ; return to shader part epilog1754 %sbase = load ptr addrspace(1), ptr addrspace(3) @ptr.in.lds1755 %zext.offset = zext i32 %voffset to i641756 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1757 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 421758 %load = load i8, ptr addrspace(1) %gep11759 %zext = zext i8 %load to i321760 %to.vgpr = bitcast i32 %zext to float1761 ret float %to.vgpr1762}1763 1764; Both 64-bit base and 32-bit offset are scalar1765define amdgpu_ps float @global_load_saddr_i8_zext_uniform_offset(ptr addrspace(1) inreg %sbase, i32 inreg %soffset) {1766; GCN-LABEL: global_load_saddr_i8_zext_uniform_offset:1767; GCN: ; %bb.0:1768; GCN-NEXT: v_mov_b32_e32 v0, s41769; GCN-NEXT: global_load_ubyte v0, v0, s[2:3]1770; GCN-NEXT: s_waitcnt vmcnt(0)1771; GCN-NEXT: ; return to shader part epilog1772;1773; GFX11-LABEL: global_load_saddr_i8_zext_uniform_offset:1774; GFX11: ; %bb.0:1775; GFX11-NEXT: v_mov_b32_e32 v0, s41776; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]1777; GFX11-NEXT: s_waitcnt vmcnt(0)1778; GFX11-NEXT: ; return to shader part epilog1779;1780; GFX12-LABEL: global_load_saddr_i8_zext_uniform_offset:1781; GFX12: ; %bb.0:1782; GFX12-NEXT: s_load_u8 s0, s[2:3], s4 offset:0x01783; GFX12-NEXT: s_wait_kmcnt 0x01784; GFX12-NEXT: v_mov_b32_e32 v0, s01785; GFX12-NEXT: ; return to shader part epilog1786 %zext.offset = zext i32 %soffset to i641787 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1788 %load = load i8, ptr addrspace(1) %gep01789 %zext = zext i8 %load to i321790 %to.vgpr = bitcast i32 %zext to float1791 ret float %to.vgpr1792}1793 1794; Both 64-bit base and 32-bit offset are scalar, with immediate offset.1795define amdgpu_ps float @global_load_saddr_i8_zext_uniform_offset_immoffset(ptr addrspace(1) inreg %sbase, i32 inreg %soffset) {1796; GCN-LABEL: global_load_saddr_i8_zext_uniform_offset_immoffset:1797; GCN: ; %bb.0:1798; GCN-NEXT: v_mov_b32_e32 v0, s41799; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-241800; GCN-NEXT: s_waitcnt vmcnt(0)1801; GCN-NEXT: ; return to shader part epilog1802;1803; GFX11-LABEL: global_load_saddr_i8_zext_uniform_offset_immoffset:1804; GFX11: ; %bb.0:1805; GFX11-NEXT: v_mov_b32_e32 v0, s41806; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-241807; GFX11-NEXT: s_waitcnt vmcnt(0)1808; GFX11-NEXT: ; return to shader part epilog1809;1810; GFX12-SDAG-LABEL: global_load_saddr_i8_zext_uniform_offset_immoffset:1811; GFX12-SDAG: ; %bb.0:1812; GFX12-SDAG-NEXT: s_mov_b32 s5, 01813; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_2) | instid1(SALU_CYCLE_1)1814; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[2:3], s[4:5]1815; GFX12-SDAG-NEXT: s_movk_i32 s2, 0xffe81816; GFX12-SDAG-NEXT: s_mov_b32 s3, -11817; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], s[2:3]1818; GFX12-SDAG-NEXT: s_load_u8 s0, s[0:1], 0x01819; GFX12-SDAG-NEXT: s_wait_kmcnt 0x01820; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s01821; GFX12-SDAG-NEXT: ; return to shader part epilog1822;1823; GFX12-GISEL-LABEL: global_load_saddr_i8_zext_uniform_offset_immoffset:1824; GFX12-GISEL: ; %bb.0:1825; GFX12-GISEL-NEXT: s_add_co_u32 s0, s2, s41826; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s3, 01827; GFX12-GISEL-NEXT: s_add_co_u32 s0, s0, 0xffffffe81828; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s1, -11829; GFX12-GISEL-NEXT: s_load_u8 s0, s[0:1], 0x01830; GFX12-GISEL-NEXT: s_wait_kmcnt 0x01831; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s01832; GFX12-GISEL-NEXT: ; return to shader part epilog1833 %zext.offset = zext i32 %soffset to i641834 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset1835 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -241836 %load = load i8, ptr addrspace(1) %gep11837 %zext = zext i8 %load to i321838 %to.vgpr = bitcast i32 %zext to float1839 ret float %to.vgpr1840}1841 1842; Both components uniform, zext forced to LHS of addressing expression1843define amdgpu_ps float @global_load_saddr_i8_zext_sgpr_ptrtoint_commute_add(ptr addrspace(1) inreg %sbase, i32 inreg %soffset) {1844; GCN-LABEL: global_load_saddr_i8_zext_sgpr_ptrtoint_commute_add:1845; GCN: ; %bb.0:1846; GCN-NEXT: v_mov_b32_e32 v0, s41847; GCN-NEXT: global_load_ubyte v0, v0, s[2:3]1848; GCN-NEXT: s_waitcnt vmcnt(0)1849; GCN-NEXT: ; return to shader part epilog1850;1851; GFX11-LABEL: global_load_saddr_i8_zext_sgpr_ptrtoint_commute_add:1852; GFX11: ; %bb.0:1853; GFX11-NEXT: v_mov_b32_e32 v0, s41854; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]1855; GFX11-NEXT: s_waitcnt vmcnt(0)1856; GFX11-NEXT: ; return to shader part epilog1857;1858; GFX12-LABEL: global_load_saddr_i8_zext_sgpr_ptrtoint_commute_add:1859; GFX12: ; %bb.0:1860; GFX12-NEXT: s_load_u8 s0, s[2:3], s4 offset:0x01861; GFX12-NEXT: s_wait_kmcnt 0x01862; GFX12-NEXT: v_mov_b32_e32 v0, s01863; GFX12-NEXT: ; return to shader part epilog1864 %zext.offset = zext i32 %soffset to i641865 %sbase.as.int = ptrtoint ptr addrspace(1) %sbase to i641866 %add = add i64 %zext.offset, %sbase.as.int1867 %dirty.gep = inttoptr i64 %add to ptr addrspace(1)1868 %load = load i8, ptr addrspace(1) %dirty.gep1869 %zext = zext i8 %load to i321870 %to.vgpr = bitcast i32 %zext to float1871 ret float %to.vgpr1872}1873 1874; Both components uniform, zext forced to LHS of addressing expression, with immediate offset1875define amdgpu_ps float @global_load_saddr_i8_zext_sgpr_ptrtoint_commute_add_imm_offset0(ptr addrspace(1) inreg %sbase, i32 inreg %soffset) {1876; GCN-LABEL: global_load_saddr_i8_zext_sgpr_ptrtoint_commute_add_imm_offset0:1877; GCN: ; %bb.0:1878; GCN-NEXT: v_mov_b32_e32 v0, s41879; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:1281880; GCN-NEXT: s_waitcnt vmcnt(0)1881; GCN-NEXT: ; return to shader part epilog1882;1883; GFX11-LABEL: global_load_saddr_i8_zext_sgpr_ptrtoint_commute_add_imm_offset0:1884; GFX11: ; %bb.0:1885; GFX11-NEXT: v_mov_b32_e32 v0, s41886; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:1281887; GFX11-NEXT: s_waitcnt vmcnt(0)1888; GFX11-NEXT: ; return to shader part epilog1889;1890; GFX12-LABEL: global_load_saddr_i8_zext_sgpr_ptrtoint_commute_add_imm_offset0:1891; GFX12: ; %bb.0:1892; GFX12-NEXT: s_load_u8 s0, s[2:3], s4 offset:0x801893; GFX12-NEXT: s_wait_kmcnt 0x01894; GFX12-NEXT: v_mov_b32_e32 v0, s01895; GFX12-NEXT: ; return to shader part epilog1896 %zext.offset = zext i32 %soffset to i641897 %sbase.as.int = ptrtoint ptr addrspace(1) %sbase to i641898 %add = add i64 %zext.offset, %sbase.as.int1899 %add.immoffset = add i64 %add, 1281900 %dirty.gep = inttoptr i64 %add.immoffset to ptr addrspace(1)1901 %load = load i8, ptr addrspace(1) %dirty.gep1902 %zext = zext i8 %load to i321903 %to.vgpr = bitcast i32 %zext to float1904 ret float %to.vgpr1905}1906 1907; divergent 64-bit base, 32-bit scalar offset.1908define amdgpu_ps float @global_load_i8_vgpr64_sgpr32(ptr addrspace(1) %vbase, i32 inreg %soffset) {1909; GFX9-LABEL: global_load_i8_vgpr64_sgpr32:1910; GFX9: ; %bb.0:1911; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, s2, v01912; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1913; GFX9-NEXT: global_load_ubyte v0, v[0:1], off1914; GFX9-NEXT: s_waitcnt vmcnt(0)1915; GFX9-NEXT: ; return to shader part epilog1916;1917; GFX10-LABEL: global_load_i8_vgpr64_sgpr32:1918; GFX10: ; %bb.0:1919; GFX10-NEXT: v_add_co_u32 v0, vcc, v0, s21920; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, 0, v1, vcc1921; GFX10-NEXT: global_load_ubyte v0, v[0:1], off1922; GFX10-NEXT: s_waitcnt vmcnt(0)1923; GFX10-NEXT: ; return to shader part epilog1924;1925; GFX11-LABEL: global_load_i8_vgpr64_sgpr32:1926; GFX11: ; %bb.0:1927; GFX11-NEXT: v_add_co_u32 v0, vcc, v0, s21928; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1929; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc1930; GFX11-NEXT: global_load_u8 v0, v[0:1], off1931; GFX11-NEXT: s_waitcnt vmcnt(0)1932; GFX11-NEXT: ; return to shader part epilog1933;1934; GFX12-SDAG-LABEL: global_load_i8_vgpr64_sgpr32:1935; GFX12-SDAG: ; %bb.0:1936; GFX12-SDAG-NEXT: v_add_co_u32 v0, vcc, v0, s21937; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)1938; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc1939; GFX12-SDAG-NEXT: global_load_u8 v0, v[0:1], off1940; GFX12-SDAG-NEXT: s_wait_loadcnt 0x01941; GFX12-SDAG-NEXT: ; return to shader part epilog1942;1943; GFX12-GISEL-LABEL: global_load_i8_vgpr64_sgpr32:1944; GFX12-GISEL: ; %bb.0:1945; GFX12-GISEL-NEXT: s_mov_b32 s3, 01946; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s21947; GFX12-GISEL-NEXT: v_mov_b32_e32 v3, s31948; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)1949; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc, v0, v21950; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, v1, v3, vcc1951; GFX12-GISEL-NEXT: global_load_u8 v0, v[0:1], off1952; GFX12-GISEL-NEXT: s_wait_loadcnt 0x01953; GFX12-GISEL-NEXT: ; return to shader part epilog1954 %zext.offset = zext i32 %soffset to i641955 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %vbase, i64 %zext.offset1956 %load = load i8, ptr addrspace(1) %gep01957 %zext = zext i8 %load to i321958 %to.vgpr = bitcast i32 %zext to float1959 ret float %to.vgpr1960}1961 1962; divergent 64-bit base, 32-bit scalar offset, with imm offset1963define amdgpu_ps float @global_load_i8_vgpr64_sgpr32_offset_4095(ptr addrspace(1) %vbase, i32 inreg %soffset) {1964; GFX9-LABEL: global_load_i8_vgpr64_sgpr32_offset_4095:1965; GFX9: ; %bb.0:1966; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, s2, v01967; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc1968; GFX9-NEXT: global_load_ubyte v0, v[0:1], off offset:40951969; GFX9-NEXT: s_waitcnt vmcnt(0)1970; GFX9-NEXT: ; return to shader part epilog1971;1972; GFX10-LABEL: global_load_i8_vgpr64_sgpr32_offset_4095:1973; GFX10: ; %bb.0:1974; GFX10-NEXT: v_add_co_u32 v0, vcc, v0, s21975; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, 0, v1, vcc1976; GFX10-NEXT: v_add_co_u32 v0, vcc, 0x800, v01977; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, 0, v1, vcc1978; GFX10-NEXT: global_load_ubyte v0, v[0:1], off offset:20471979; GFX10-NEXT: s_waitcnt vmcnt(0)1980; GFX10-NEXT: ; return to shader part epilog1981;1982; GFX11-LABEL: global_load_i8_vgpr64_sgpr32_offset_4095:1983; GFX11: ; %bb.0:1984; GFX11-NEXT: v_add_co_u32 v0, vcc, v0, s21985; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1986; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc1987; GFX11-NEXT: global_load_u8 v0, v[0:1], off offset:40951988; GFX11-NEXT: s_waitcnt vmcnt(0)1989; GFX11-NEXT: ; return to shader part epilog1990;1991; GFX12-SDAG-LABEL: global_load_i8_vgpr64_sgpr32_offset_4095:1992; GFX12-SDAG: ; %bb.0:1993; GFX12-SDAG-NEXT: v_add_co_u32 v0, vcc, v0, s21994; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)1995; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc1996; GFX12-SDAG-NEXT: global_load_u8 v0, v[0:1], off offset:40951997; GFX12-SDAG-NEXT: s_wait_loadcnt 0x01998; GFX12-SDAG-NEXT: ; return to shader part epilog1999;2000; GFX12-GISEL-LABEL: global_load_i8_vgpr64_sgpr32_offset_4095:2001; GFX12-GISEL: ; %bb.0:2002; GFX12-GISEL-NEXT: s_mov_b32 s3, 02003; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s22004; GFX12-GISEL-NEXT: v_mov_b32_e32 v3, s32005; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)2006; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc, v0, v22007; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, v1, v3, vcc2008; GFX12-GISEL-NEXT: global_load_u8 v0, v[0:1], off offset:40952009; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02010; GFX12-GISEL-NEXT: ; return to shader part epilog2011 %zext.offset = zext i32 %soffset to i642012 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %vbase, i64 %zext.offset2013 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 40952014 %load = load i8, ptr addrspace(1) %gep12015 %zext = zext i8 %load to i322016 %to.vgpr = bitcast i32 %zext to float2017 ret float %to.vgpr2018}2019 2020; --------------------------------------------------------------------------------2021; Natural addressing shifts with restricted range2022; --------------------------------------------------------------------------------2023 2024; Cannot push the shift into 32-bits, and cannot match.2025define amdgpu_ps float @global_load_saddr_f32_natural_addressing(ptr addrspace(1) inreg %sbase, ptr addrspace(1) %voffset.ptr) {2026; GFX9-LABEL: global_load_saddr_f32_natural_addressing:2027; GFX9: ; %bb.0:2028; GFX9-NEXT: global_load_dword v0, v[0:1], off2029; GFX9-NEXT: v_mov_b32_e32 v1, 02030; GFX9-NEXT: v_mov_b32_e32 v2, s32031; GFX9-NEXT: s_waitcnt vmcnt(0)2032; GFX9-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1]2033; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, s2, v02034; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, v2, v1, vcc2035; GFX9-NEXT: global_load_dword v0, v[0:1], off2036; GFX9-NEXT: s_waitcnt vmcnt(0)2037; GFX9-NEXT: ; return to shader part epilog2038;2039; GFX10-LABEL: global_load_saddr_f32_natural_addressing:2040; GFX10: ; %bb.0:2041; GFX10-NEXT: global_load_dword v0, v[0:1], off2042; GFX10-NEXT: v_mov_b32_e32 v1, 02043; GFX10-NEXT: s_waitcnt vmcnt(0)2044; GFX10-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1]2045; GFX10-NEXT: v_add_co_u32 v0, vcc, s2, v02046; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, s3, v1, vcc2047; GFX10-NEXT: global_load_dword v0, v[0:1], off2048; GFX10-NEXT: s_waitcnt vmcnt(0)2049; GFX10-NEXT: ; return to shader part epilog2050;2051; GFX11-LABEL: global_load_saddr_f32_natural_addressing:2052; GFX11: ; %bb.0:2053; GFX11-NEXT: global_load_b32 v0, v[0:1], off2054; GFX11-NEXT: v_mov_b32_e32 v1, 02055; GFX11-NEXT: s_waitcnt vmcnt(0)2056; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)2057; GFX11-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1]2058; GFX11-NEXT: v_add_co_u32 v0, vcc, s2, v02059; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2060; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s3, v1, vcc2061; GFX11-NEXT: global_load_b32 v0, v[0:1], off2062; GFX11-NEXT: s_waitcnt vmcnt(0)2063; GFX11-NEXT: ; return to shader part epilog2064;2065; GFX12-SDAG-LABEL: global_load_saddr_f32_natural_addressing:2066; GFX12-SDAG: ; %bb.0:2067; GFX12-SDAG-NEXT: global_load_b32 v0, v[0:1], off2068; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 02069; GFX12-SDAG-NEXT: s_wait_loadcnt 0x02070; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)2071; GFX12-SDAG-NEXT: v_lshlrev_b64_e32 v[0:1], 2, v[0:1]2072; GFX12-SDAG-NEXT: v_add_co_u32 v0, vcc, s2, v02073; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)2074; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s3, v1, vcc2075; GFX12-SDAG-NEXT: global_load_b32 v0, v[0:1], off2076; GFX12-SDAG-NEXT: s_wait_loadcnt 0x02077; GFX12-SDAG-NEXT: ; return to shader part epilog2078;2079; GFX12-GISEL-LABEL: global_load_saddr_f32_natural_addressing:2080; GFX12-GISEL: ; %bb.0:2081; GFX12-GISEL-NEXT: global_load_b32 v0, v[0:1], off2082; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 02083; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s22084; GFX12-GISEL-NEXT: v_mov_b32_e32 v3, s32085; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02086; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)2087; GFX12-GISEL-NEXT: v_lshlrev_b64_e32 v[0:1], 2, v[0:1]2088; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc, v2, v02089; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)2090; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, v3, v1, vcc2091; GFX12-GISEL-NEXT: global_load_b32 v0, v[0:1], off2092; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02093; GFX12-GISEL-NEXT: ; return to shader part epilog2094 %voffset = load i32, ptr addrspace(1) %voffset.ptr2095 %zext.offset = zext i32 %voffset to i642096 %gep = getelementptr inbounds float, ptr addrspace(1) %sbase, i64 %zext.offset2097 %load = load float, ptr addrspace(1) %gep2098 ret float %load2099}2100 2101; Cannot push the shift into 32-bits, with an immediate offset.2102define amdgpu_ps float @global_load_saddr_f32_natural_addressing_immoffset(ptr addrspace(1) inreg %sbase, ptr addrspace(1) %voffset.ptr) {2103; GCN-LABEL: global_load_saddr_f32_natural_addressing_immoffset:2104; GCN: ; %bb.0:2105; GCN-NEXT: global_load_dword v0, v[0:1], off2106; GCN-NEXT: s_waitcnt vmcnt(0)2107; GCN-NEXT: global_load_dword v0, v0, s[2:3] offset:1282108; GCN-NEXT: s_waitcnt vmcnt(0)2109; GCN-NEXT: ; return to shader part epilog2110;2111; GFX11-LABEL: global_load_saddr_f32_natural_addressing_immoffset:2112; GFX11: ; %bb.0:2113; GFX11-NEXT: global_load_b32 v0, v[0:1], off2114; GFX11-NEXT: s_waitcnt vmcnt(0)2115; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:1282116; GFX11-NEXT: s_waitcnt vmcnt(0)2117; GFX11-NEXT: ; return to shader part epilog2118;2119; GFX12-LABEL: global_load_saddr_f32_natural_addressing_immoffset:2120; GFX12: ; %bb.0:2121; GFX12-NEXT: global_load_b32 v0, v[0:1], off2122; GFX12-NEXT: s_wait_loadcnt 0x02123; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] offset:1282124; GFX12-NEXT: s_wait_loadcnt 0x02125; GFX12-NEXT: ; return to shader part epilog2126 %voffset = load i32, ptr addrspace(1) %voffset.ptr2127 %zext.offset = zext i32 %voffset to i642128 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2129 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 1282130 %load = load float, ptr addrspace(1) %gep12131 ret float %load2132}2133 2134; Range is sufficiently restricted to push the shift into 32-bits.2135define amdgpu_ps float @global_load_f32_saddr_zext_vgpr_range(ptr addrspace(1) inreg %sbase, ptr addrspace(1) %voffset.ptr) {2136; GCN-LABEL: global_load_f32_saddr_zext_vgpr_range:2137; GCN: ; %bb.0:2138; GCN-NEXT: global_load_dword v0, v[0:1], off2139; GCN-NEXT: s_waitcnt vmcnt(0)2140; GCN-NEXT: v_lshlrev_b32_e32 v0, 2, v02141; GCN-NEXT: global_load_dword v0, v0, s[2:3]2142; GCN-NEXT: s_waitcnt vmcnt(0)2143; GCN-NEXT: ; return to shader part epilog2144;2145; GFX11-LABEL: global_load_f32_saddr_zext_vgpr_range:2146; GFX11: ; %bb.0:2147; GFX11-NEXT: global_load_b32 v0, v[0:1], off2148; GFX11-NEXT: s_waitcnt vmcnt(0)2149; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02150; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]2151; GFX11-NEXT: s_waitcnt vmcnt(0)2152; GFX11-NEXT: ; return to shader part epilog2153;2154; GFX12-LABEL: global_load_f32_saddr_zext_vgpr_range:2155; GFX12: ; %bb.0:2156; GFX12-NEXT: global_load_b32 v0, v[0:1], off2157; GFX12-NEXT: s_wait_loadcnt 0x02158; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02159; GFX12-NEXT: global_load_b32 v0, v0, s[2:3]2160; GFX12-NEXT: s_wait_loadcnt 0x02161; GFX12-NEXT: ; return to shader part epilog2162 %voffset = load i32, ptr addrspace(1) %voffset.ptr, !range !0, !noundef !{}2163 %zext.offset = zext i32 %voffset to i642164 %gep = getelementptr inbounds float, ptr addrspace(1) %sbase, i64 %zext.offset2165 %load = load float, ptr addrspace(1) %gep2166 ret float %load2167}2168 2169; Range is sufficiently restricted to push the shift into 32-bits, with an imm offset2170define amdgpu_ps float @global_load_f32_saddr_zext_vgpr_range_imm_offset(ptr addrspace(1) inreg %sbase, ptr addrspace(1) %voffset.ptr) {2171; GCN-LABEL: global_load_f32_saddr_zext_vgpr_range_imm_offset:2172; GCN: ; %bb.0:2173; GCN-NEXT: global_load_dword v0, v[0:1], off2174; GCN-NEXT: s_waitcnt vmcnt(0)2175; GCN-NEXT: v_lshlrev_b32_e32 v0, 2, v02176; GCN-NEXT: global_load_dword v0, v0, s[2:3] offset:4002177; GCN-NEXT: s_waitcnt vmcnt(0)2178; GCN-NEXT: ; return to shader part epilog2179;2180; GFX11-LABEL: global_load_f32_saddr_zext_vgpr_range_imm_offset:2181; GFX11: ; %bb.0:2182; GFX11-NEXT: global_load_b32 v0, v[0:1], off2183; GFX11-NEXT: s_waitcnt vmcnt(0)2184; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02185; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:4002186; GFX11-NEXT: s_waitcnt vmcnt(0)2187; GFX11-NEXT: ; return to shader part epilog2188;2189; GFX12-LABEL: global_load_f32_saddr_zext_vgpr_range_imm_offset:2190; GFX12: ; %bb.0:2191; GFX12-NEXT: global_load_b32 v0, v[0:1], off2192; GFX12-NEXT: s_wait_loadcnt 0x02193; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02194; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] offset:4002195; GFX12-NEXT: s_wait_loadcnt 0x02196; GFX12-NEXT: ; return to shader part epilog2197 %voffset = load i32, ptr addrspace(1) %voffset.ptr, !range !0, !noundef !{}2198 %zext.offset = zext i32 %voffset to i642199 %gep0 = getelementptr inbounds float, ptr addrspace(1) %sbase, i64 %zext.offset2200 %gep1 = getelementptr inbounds float, ptr addrspace(1) %gep0, i64 1002201 %load = load float, ptr addrspace(1) %gep12202 ret float %load2203}2204 2205; Range is 1 beyond the limit where we can move the shift into 32-bits.2206define amdgpu_ps float @global_load_f32_saddr_zext_vgpr_range_too_large(ptr addrspace(1) inreg %sbase, ptr addrspace(1) %voffset.ptr) {2207; GFX9-LABEL: global_load_f32_saddr_zext_vgpr_range_too_large:2208; GFX9: ; %bb.0:2209; GFX9-NEXT: global_load_dword v0, v[0:1], off2210; GFX9-NEXT: v_mov_b32_e32 v1, 02211; GFX9-NEXT: v_mov_b32_e32 v2, s32212; GFX9-NEXT: s_waitcnt vmcnt(0)2213; GFX9-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1]2214; GFX9-NEXT: v_add_co_u32_e32 v0, vcc, s2, v02215; GFX9-NEXT: v_addc_co_u32_e32 v1, vcc, v2, v1, vcc2216; GFX9-NEXT: global_load_dword v0, v[0:1], off2217; GFX9-NEXT: s_waitcnt vmcnt(0)2218; GFX9-NEXT: ; return to shader part epilog2219;2220; GFX10-LABEL: global_load_f32_saddr_zext_vgpr_range_too_large:2221; GFX10: ; %bb.0:2222; GFX10-NEXT: global_load_dword v0, v[0:1], off2223; GFX10-NEXT: v_mov_b32_e32 v1, 02224; GFX10-NEXT: s_waitcnt vmcnt(0)2225; GFX10-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1]2226; GFX10-NEXT: v_add_co_u32 v0, vcc, s2, v02227; GFX10-NEXT: v_add_co_ci_u32_e32 v1, vcc, s3, v1, vcc2228; GFX10-NEXT: global_load_dword v0, v[0:1], off2229; GFX10-NEXT: s_waitcnt vmcnt(0)2230; GFX10-NEXT: ; return to shader part epilog2231;2232; GFX11-LABEL: global_load_f32_saddr_zext_vgpr_range_too_large:2233; GFX11: ; %bb.0:2234; GFX11-NEXT: global_load_b32 v0, v[0:1], off2235; GFX11-NEXT: v_mov_b32_e32 v1, 02236; GFX11-NEXT: s_waitcnt vmcnt(0)2237; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)2238; GFX11-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1]2239; GFX11-NEXT: v_add_co_u32 v0, vcc, s2, v02240; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2241; GFX11-NEXT: v_add_co_ci_u32_e64 v1, null, s3, v1, vcc2242; GFX11-NEXT: global_load_b32 v0, v[0:1], off2243; GFX11-NEXT: s_waitcnt vmcnt(0)2244; GFX11-NEXT: ; return to shader part epilog2245;2246; GFX12-SDAG-LABEL: global_load_f32_saddr_zext_vgpr_range_too_large:2247; GFX12-SDAG: ; %bb.0:2248; GFX12-SDAG-NEXT: global_load_b32 v0, v[0:1], off2249; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 02250; GFX12-SDAG-NEXT: s_wait_loadcnt 0x02251; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)2252; GFX12-SDAG-NEXT: v_lshlrev_b64_e32 v[0:1], 2, v[0:1]2253; GFX12-SDAG-NEXT: v_add_co_u32 v0, vcc, s2, v02254; GFX12-SDAG-NEXT: s_delay_alu instid0(VALU_DEP_1)2255; GFX12-SDAG-NEXT: v_add_co_ci_u32_e64 v1, null, s3, v1, vcc2256; GFX12-SDAG-NEXT: global_load_b32 v0, v[0:1], off2257; GFX12-SDAG-NEXT: s_wait_loadcnt 0x02258; GFX12-SDAG-NEXT: ; return to shader part epilog2259;2260; GFX12-GISEL-LABEL: global_load_f32_saddr_zext_vgpr_range_too_large:2261; GFX12-GISEL: ; %bb.0:2262; GFX12-GISEL-NEXT: global_load_b32 v0, v[0:1], off2263; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, 02264; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s22265; GFX12-GISEL-NEXT: v_mov_b32_e32 v3, s32266; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02267; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)2268; GFX12-GISEL-NEXT: v_lshlrev_b64_e32 v[0:1], 2, v[0:1]2269; GFX12-GISEL-NEXT: v_add_co_u32 v0, vcc, v2, v02270; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1)2271; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v1, null, v3, v1, vcc2272; GFX12-GISEL-NEXT: global_load_b32 v0, v[0:1], off2273; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02274; GFX12-GISEL-NEXT: ; return to shader part epilog2275 %voffset = load i32, ptr addrspace(1) %voffset.ptr, !range !1, !noundef !{}2276 %zext.offset = zext i32 %voffset to i642277 %gep = getelementptr inbounds float, ptr addrspace(1) %sbase, i64 %zext.offset2278 %load = load float, ptr addrspace(1) %gep2279 ret float %load2280}2281 2282; --------------------------------------------------------------------------------2283; Stress various type loads2284; --------------------------------------------------------------------------------2285 2286define amdgpu_ps half @global_load_saddr_i16(ptr addrspace(1) inreg %sbase, i32 %voffset) {2287; GCN-LABEL: global_load_saddr_i16:2288; GCN: ; %bb.0:2289; GCN-NEXT: global_load_ushort v0, v0, s[2:3]2290; GCN-NEXT: s_waitcnt vmcnt(0)2291; GCN-NEXT: ; return to shader part epilog2292;2293; GFX11-TRUE16-LABEL: global_load_saddr_i16:2294; GFX11-TRUE16: ; %bb.0:2295; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3]2296; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)2297; GFX11-TRUE16-NEXT: ; return to shader part epilog2298;2299; GFX11-FAKE16-LABEL: global_load_saddr_i16:2300; GFX11-FAKE16: ; %bb.0:2301; GFX11-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3]2302; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)2303; GFX11-FAKE16-NEXT: ; return to shader part epilog2304;2305; GFX12-SDAG-TRUE16-LABEL: global_load_saddr_i16:2306; GFX12-SDAG-TRUE16: ; %bb.0:2307; GFX12-SDAG-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3]2308; GFX12-SDAG-TRUE16-NEXT: s_wait_loadcnt 0x02309; GFX12-SDAG-TRUE16-NEXT: ; return to shader part epilog2310;2311; GFX12-SDAG-FAKE16-LABEL: global_load_saddr_i16:2312; GFX12-SDAG-FAKE16: ; %bb.0:2313; GFX12-SDAG-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3]2314; GFX12-SDAG-FAKE16-NEXT: s_wait_loadcnt 0x02315; GFX12-SDAG-FAKE16-NEXT: ; return to shader part epilog2316;2317; GFX12-GISEL-LABEL: global_load_saddr_i16:2318; GFX12-GISEL: ; %bb.0:2319; GFX12-GISEL-NEXT: global_load_u16 v0, v0, s[2:3]2320; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02321; GFX12-GISEL-NEXT: ; return to shader part epilog2322 %zext.offset = zext i32 %voffset to i642323 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2324 %load = load i16, ptr addrspace(1) %gep02325 %cast.load = bitcast i16 %load to half2326 ret half %cast.load2327}2328 2329define amdgpu_ps half @global_load_saddr_i16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2330; GCN-LABEL: global_load_saddr_i16_immneg128:2331; GCN: ; %bb.0:2332; GCN-NEXT: global_load_ushort v0, v0, s[2:3] offset:-1282333; GCN-NEXT: s_waitcnt vmcnt(0)2334; GCN-NEXT: ; return to shader part epilog2335;2336; GFX11-TRUE16-LABEL: global_load_saddr_i16_immneg128:2337; GFX11-TRUE16: ; %bb.0:2338; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1282339; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)2340; GFX11-TRUE16-NEXT: ; return to shader part epilog2341;2342; GFX11-FAKE16-LABEL: global_load_saddr_i16_immneg128:2343; GFX11-FAKE16: ; %bb.0:2344; GFX11-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1282345; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)2346; GFX11-FAKE16-NEXT: ; return to shader part epilog2347;2348; GFX12-SDAG-TRUE16-LABEL: global_load_saddr_i16_immneg128:2349; GFX12-SDAG-TRUE16: ; %bb.0:2350; GFX12-SDAG-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1282351; GFX12-SDAG-TRUE16-NEXT: s_wait_loadcnt 0x02352; GFX12-SDAG-TRUE16-NEXT: ; return to shader part epilog2353;2354; GFX12-SDAG-FAKE16-LABEL: global_load_saddr_i16_immneg128:2355; GFX12-SDAG-FAKE16: ; %bb.0:2356; GFX12-SDAG-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1282357; GFX12-SDAG-FAKE16-NEXT: s_wait_loadcnt 0x02358; GFX12-SDAG-FAKE16-NEXT: ; return to shader part epilog2359;2360; GFX12-GISEL-LABEL: global_load_saddr_i16_immneg128:2361; GFX12-GISEL: ; %bb.0:2362; GFX12-GISEL-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1282363; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02364; GFX12-GISEL-NEXT: ; return to shader part epilog2365 %zext.offset = zext i32 %voffset to i642366 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2367 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282368 %load = load i16, ptr addrspace(1) %gep12369 %cast.load = bitcast i16 %load to half2370 ret half %cast.load2371}2372 2373define amdgpu_ps half @global_load_saddr_f16(ptr addrspace(1) inreg %sbase, i32 %voffset) {2374; GCN-LABEL: global_load_saddr_f16:2375; GCN: ; %bb.0:2376; GCN-NEXT: global_load_ushort v0, v0, s[2:3]2377; GCN-NEXT: s_waitcnt vmcnt(0)2378; GCN-NEXT: ; return to shader part epilog2379;2380; GFX11-TRUE16-LABEL: global_load_saddr_f16:2381; GFX11-TRUE16: ; %bb.0:2382; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3]2383; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)2384; GFX11-TRUE16-NEXT: ; return to shader part epilog2385;2386; GFX11-FAKE16-LABEL: global_load_saddr_f16:2387; GFX11-FAKE16: ; %bb.0:2388; GFX11-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3]2389; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)2390; GFX11-FAKE16-NEXT: ; return to shader part epilog2391;2392; GFX12-SDAG-TRUE16-LABEL: global_load_saddr_f16:2393; GFX12-SDAG-TRUE16: ; %bb.0:2394; GFX12-SDAG-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3]2395; GFX12-SDAG-TRUE16-NEXT: s_wait_loadcnt 0x02396; GFX12-SDAG-TRUE16-NEXT: ; return to shader part epilog2397;2398; GFX12-SDAG-FAKE16-LABEL: global_load_saddr_f16:2399; GFX12-SDAG-FAKE16: ; %bb.0:2400; GFX12-SDAG-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3]2401; GFX12-SDAG-FAKE16-NEXT: s_wait_loadcnt 0x02402; GFX12-SDAG-FAKE16-NEXT: ; return to shader part epilog2403;2404; GFX12-GISEL-LABEL: global_load_saddr_f16:2405; GFX12-GISEL: ; %bb.0:2406; GFX12-GISEL-NEXT: global_load_u16 v0, v0, s[2:3]2407; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02408; GFX12-GISEL-NEXT: ; return to shader part epilog2409 %zext.offset = zext i32 %voffset to i642410 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2411 %load = load half, ptr addrspace(1) %gep02412 ret half %load2413}2414 2415define amdgpu_ps half @global_load_saddr_f16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2416; GCN-LABEL: global_load_saddr_f16_immneg128:2417; GCN: ; %bb.0:2418; GCN-NEXT: global_load_ushort v0, v0, s[2:3] offset:-1282419; GCN-NEXT: s_waitcnt vmcnt(0)2420; GCN-NEXT: ; return to shader part epilog2421;2422; GFX11-TRUE16-LABEL: global_load_saddr_f16_immneg128:2423; GFX11-TRUE16: ; %bb.0:2424; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1282425; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)2426; GFX11-TRUE16-NEXT: ; return to shader part epilog2427;2428; GFX11-FAKE16-LABEL: global_load_saddr_f16_immneg128:2429; GFX11-FAKE16: ; %bb.0:2430; GFX11-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1282431; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)2432; GFX11-FAKE16-NEXT: ; return to shader part epilog2433;2434; GFX12-SDAG-TRUE16-LABEL: global_load_saddr_f16_immneg128:2435; GFX12-SDAG-TRUE16: ; %bb.0:2436; GFX12-SDAG-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1282437; GFX12-SDAG-TRUE16-NEXT: s_wait_loadcnt 0x02438; GFX12-SDAG-TRUE16-NEXT: ; return to shader part epilog2439;2440; GFX12-SDAG-FAKE16-LABEL: global_load_saddr_f16_immneg128:2441; GFX12-SDAG-FAKE16: ; %bb.0:2442; GFX12-SDAG-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1282443; GFX12-SDAG-FAKE16-NEXT: s_wait_loadcnt 0x02444; GFX12-SDAG-FAKE16-NEXT: ; return to shader part epilog2445;2446; GFX12-GISEL-LABEL: global_load_saddr_f16_immneg128:2447; GFX12-GISEL: ; %bb.0:2448; GFX12-GISEL-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1282449; GFX12-GISEL-NEXT: s_wait_loadcnt 0x02450; GFX12-GISEL-NEXT: ; return to shader part epilog2451 %zext.offset = zext i32 %voffset to i642452 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2453 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282454 %load = load half, ptr addrspace(1) %gep12455 ret half %load2456}2457 2458define amdgpu_ps float @global_load_saddr_i32(ptr addrspace(1) inreg %sbase, i32 %voffset) {2459; GCN-LABEL: global_load_saddr_i32:2460; GCN: ; %bb.0:2461; GCN-NEXT: global_load_dword v0, v0, s[2:3]2462; GCN-NEXT: s_waitcnt vmcnt(0)2463; GCN-NEXT: ; return to shader part epilog2464;2465; GFX11-LABEL: global_load_saddr_i32:2466; GFX11: ; %bb.0:2467; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]2468; GFX11-NEXT: s_waitcnt vmcnt(0)2469; GFX11-NEXT: ; return to shader part epilog2470;2471; GFX12-LABEL: global_load_saddr_i32:2472; GFX12: ; %bb.0:2473; GFX12-NEXT: global_load_b32 v0, v0, s[2:3]2474; GFX12-NEXT: s_wait_loadcnt 0x02475; GFX12-NEXT: ; return to shader part epilog2476 %zext.offset = zext i32 %voffset to i642477 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2478 %load = load i32, ptr addrspace(1) %gep02479 %cast.load = bitcast i32 %load to float2480 ret float %cast.load2481}2482 2483define amdgpu_ps float @global_load_saddr_i32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2484; GCN-LABEL: global_load_saddr_i32_immneg128:2485; GCN: ; %bb.0:2486; GCN-NEXT: global_load_dword v0, v0, s[2:3] offset:-1282487; GCN-NEXT: s_waitcnt vmcnt(0)2488; GCN-NEXT: ; return to shader part epilog2489;2490; GFX11-LABEL: global_load_saddr_i32_immneg128:2491; GFX11: ; %bb.0:2492; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282493; GFX11-NEXT: s_waitcnt vmcnt(0)2494; GFX11-NEXT: ; return to shader part epilog2495;2496; GFX12-LABEL: global_load_saddr_i32_immneg128:2497; GFX12: ; %bb.0:2498; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282499; GFX12-NEXT: s_wait_loadcnt 0x02500; GFX12-NEXT: ; return to shader part epilog2501 %zext.offset = zext i32 %voffset to i642502 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2503 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282504 %load = load i32, ptr addrspace(1) %gep12505 %cast.load = bitcast i32 %load to float2506 ret float %cast.load2507}2508 2509define amdgpu_ps float @global_load_saddr_f32(ptr addrspace(1) inreg %sbase, i32 %voffset) {2510; GCN-LABEL: global_load_saddr_f32:2511; GCN: ; %bb.0:2512; GCN-NEXT: global_load_dword v0, v0, s[2:3]2513; GCN-NEXT: s_waitcnt vmcnt(0)2514; GCN-NEXT: ; return to shader part epilog2515;2516; GFX11-LABEL: global_load_saddr_f32:2517; GFX11: ; %bb.0:2518; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]2519; GFX11-NEXT: s_waitcnt vmcnt(0)2520; GFX11-NEXT: ; return to shader part epilog2521;2522; GFX12-LABEL: global_load_saddr_f32:2523; GFX12: ; %bb.0:2524; GFX12-NEXT: global_load_b32 v0, v0, s[2:3]2525; GFX12-NEXT: s_wait_loadcnt 0x02526; GFX12-NEXT: ; return to shader part epilog2527 %zext.offset = zext i32 %voffset to i642528 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2529 %load = load float, ptr addrspace(1) %gep02530 ret float %load2531}2532 2533define amdgpu_ps float @global_load_saddr_f32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2534; GCN-LABEL: global_load_saddr_f32_immneg128:2535; GCN: ; %bb.0:2536; GCN-NEXT: global_load_dword v0, v0, s[2:3] offset:-1282537; GCN-NEXT: s_waitcnt vmcnt(0)2538; GCN-NEXT: ; return to shader part epilog2539;2540; GFX11-LABEL: global_load_saddr_f32_immneg128:2541; GFX11: ; %bb.0:2542; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282543; GFX11-NEXT: s_waitcnt vmcnt(0)2544; GFX11-NEXT: ; return to shader part epilog2545;2546; GFX12-LABEL: global_load_saddr_f32_immneg128:2547; GFX12: ; %bb.0:2548; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282549; GFX12-NEXT: s_wait_loadcnt 0x02550; GFX12-NEXT: ; return to shader part epilog2551 %zext.offset = zext i32 %voffset to i642552 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2553 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282554 %load = load float, ptr addrspace(1) %gep12555 ret float %load2556}2557 2558define amdgpu_ps <2 x half> @global_load_saddr_v2i16(ptr addrspace(1) inreg %sbase, i32 %voffset) {2559; GCN-LABEL: global_load_saddr_v2i16:2560; GCN: ; %bb.0:2561; GCN-NEXT: global_load_dword v0, v0, s[2:3]2562; GCN-NEXT: s_waitcnt vmcnt(0)2563; GCN-NEXT: ; return to shader part epilog2564;2565; GFX11-LABEL: global_load_saddr_v2i16:2566; GFX11: ; %bb.0:2567; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]2568; GFX11-NEXT: s_waitcnt vmcnt(0)2569; GFX11-NEXT: ; return to shader part epilog2570;2571; GFX12-LABEL: global_load_saddr_v2i16:2572; GFX12: ; %bb.0:2573; GFX12-NEXT: global_load_b32 v0, v0, s[2:3]2574; GFX12-NEXT: s_wait_loadcnt 0x02575; GFX12-NEXT: ; return to shader part epilog2576 %zext.offset = zext i32 %voffset to i642577 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2578 %load = load <2 x i16>, ptr addrspace(1) %gep02579 %cast.load = bitcast <2 x i16> %load to <2 x half>2580 ret <2 x half> %cast.load2581}2582 2583define amdgpu_ps <2 x half> @global_load_saddr_v2i16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2584; GCN-LABEL: global_load_saddr_v2i16_immneg128:2585; GCN: ; %bb.0:2586; GCN-NEXT: global_load_dword v0, v0, s[2:3] offset:-1282587; GCN-NEXT: s_waitcnt vmcnt(0)2588; GCN-NEXT: ; return to shader part epilog2589;2590; GFX11-LABEL: global_load_saddr_v2i16_immneg128:2591; GFX11: ; %bb.0:2592; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282593; GFX11-NEXT: s_waitcnt vmcnt(0)2594; GFX11-NEXT: ; return to shader part epilog2595;2596; GFX12-LABEL: global_load_saddr_v2i16_immneg128:2597; GFX12: ; %bb.0:2598; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282599; GFX12-NEXT: s_wait_loadcnt 0x02600; GFX12-NEXT: ; return to shader part epilog2601 %zext.offset = zext i32 %voffset to i642602 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2603 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282604 %load = load <2 x i16>, ptr addrspace(1) %gep12605 %cast.load = bitcast <2 x i16> %load to <2 x half>2606 ret <2 x half> %cast.load2607}2608 2609define amdgpu_ps <2 x half> @global_load_saddr_v2f16(ptr addrspace(1) inreg %sbase, i32 %voffset) {2610; GCN-LABEL: global_load_saddr_v2f16:2611; GCN: ; %bb.0:2612; GCN-NEXT: global_load_dword v0, v0, s[2:3]2613; GCN-NEXT: s_waitcnt vmcnt(0)2614; GCN-NEXT: ; return to shader part epilog2615;2616; GFX11-LABEL: global_load_saddr_v2f16:2617; GFX11: ; %bb.0:2618; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]2619; GFX11-NEXT: s_waitcnt vmcnt(0)2620; GFX11-NEXT: ; return to shader part epilog2621;2622; GFX12-LABEL: global_load_saddr_v2f16:2623; GFX12: ; %bb.0:2624; GFX12-NEXT: global_load_b32 v0, v0, s[2:3]2625; GFX12-NEXT: s_wait_loadcnt 0x02626; GFX12-NEXT: ; return to shader part epilog2627 %zext.offset = zext i32 %voffset to i642628 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2629 %load = load <2 x half>, ptr addrspace(1) %gep02630 ret <2 x half> %load2631}2632 2633define amdgpu_ps <2 x half> @global_load_saddr_v2f16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2634; GCN-LABEL: global_load_saddr_v2f16_immneg128:2635; GCN: ; %bb.0:2636; GCN-NEXT: global_load_dword v0, v0, s[2:3] offset:-1282637; GCN-NEXT: s_waitcnt vmcnt(0)2638; GCN-NEXT: ; return to shader part epilog2639;2640; GFX11-LABEL: global_load_saddr_v2f16_immneg128:2641; GFX11: ; %bb.0:2642; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282643; GFX11-NEXT: s_waitcnt vmcnt(0)2644; GFX11-NEXT: ; return to shader part epilog2645;2646; GFX12-LABEL: global_load_saddr_v2f16_immneg128:2647; GFX12: ; %bb.0:2648; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282649; GFX12-NEXT: s_wait_loadcnt 0x02650; GFX12-NEXT: ; return to shader part epilog2651 %zext.offset = zext i32 %voffset to i642652 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2653 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282654 %load = load <2 x half>, ptr addrspace(1) %gep12655 ret <2 x half> %load2656}2657 2658define amdgpu_ps <2 x half> @global_load_saddr_p3(ptr addrspace(1) inreg %sbase, i32 %voffset) {2659; GCN-LABEL: global_load_saddr_p3:2660; GCN: ; %bb.0:2661; GCN-NEXT: global_load_dword v0, v0, s[2:3]2662; GCN-NEXT: s_waitcnt vmcnt(0)2663; GCN-NEXT: ; return to shader part epilog2664;2665; GFX11-LABEL: global_load_saddr_p3:2666; GFX11: ; %bb.0:2667; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]2668; GFX11-NEXT: s_waitcnt vmcnt(0)2669; GFX11-NEXT: ; return to shader part epilog2670;2671; GFX12-LABEL: global_load_saddr_p3:2672; GFX12: ; %bb.0:2673; GFX12-NEXT: global_load_b32 v0, v0, s[2:3]2674; GFX12-NEXT: s_wait_loadcnt 0x02675; GFX12-NEXT: ; return to shader part epilog2676 %zext.offset = zext i32 %voffset to i642677 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2678 %load = load ptr addrspace(3), ptr addrspace(1) %gep02679 %cast.load0 = ptrtoint ptr addrspace(3) %load to i322680 %cast.load1 = bitcast i32 %cast.load0 to <2 x half>2681 ret <2 x half> %cast.load12682}2683 2684define amdgpu_ps <2 x half> @global_load_saddr_p3_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2685; GCN-LABEL: global_load_saddr_p3_immneg128:2686; GCN: ; %bb.0:2687; GCN-NEXT: global_load_dword v0, v0, s[2:3] offset:-1282688; GCN-NEXT: s_waitcnt vmcnt(0)2689; GCN-NEXT: ; return to shader part epilog2690;2691; GFX11-LABEL: global_load_saddr_p3_immneg128:2692; GFX11: ; %bb.0:2693; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282694; GFX11-NEXT: s_waitcnt vmcnt(0)2695; GFX11-NEXT: ; return to shader part epilog2696;2697; GFX12-LABEL: global_load_saddr_p3_immneg128:2698; GFX12: ; %bb.0:2699; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] offset:-1282700; GFX12-NEXT: s_wait_loadcnt 0x02701; GFX12-NEXT: ; return to shader part epilog2702 %zext.offset = zext i32 %voffset to i642703 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2704 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282705 %load = load ptr addrspace(3), ptr addrspace(1) %gep12706 %cast.load0 = ptrtoint ptr addrspace(3) %load to i322707 %cast.load1 = bitcast i32 %cast.load0 to <2 x half>2708 ret <2 x half> %cast.load12709}2710 2711define amdgpu_ps <2 x float> @global_load_saddr_f64(ptr addrspace(1) inreg %sbase, i32 %voffset) {2712; GCN-LABEL: global_load_saddr_f64:2713; GCN: ; %bb.0:2714; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]2715; GCN-NEXT: s_waitcnt vmcnt(0)2716; GCN-NEXT: ; return to shader part epilog2717;2718; GFX11-LABEL: global_load_saddr_f64:2719; GFX11: ; %bb.0:2720; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]2721; GFX11-NEXT: s_waitcnt vmcnt(0)2722; GFX11-NEXT: ; return to shader part epilog2723;2724; GFX12-LABEL: global_load_saddr_f64:2725; GFX12: ; %bb.0:2726; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3]2727; GFX12-NEXT: s_wait_loadcnt 0x02728; GFX12-NEXT: ; return to shader part epilog2729 %zext.offset = zext i32 %voffset to i642730 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2731 %load = load double, ptr addrspace(1) %gep02732 %cast.load = bitcast double %load to <2 x float>2733 ret <2 x float> %cast.load2734}2735 2736define amdgpu_ps <2 x float> @global_load_saddr_f64_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2737; GCN-LABEL: global_load_saddr_f64_immneg128:2738; GCN: ; %bb.0:2739; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-1282740; GCN-NEXT: s_waitcnt vmcnt(0)2741; GCN-NEXT: ; return to shader part epilog2742;2743; GFX11-LABEL: global_load_saddr_f64_immneg128:2744; GFX11: ; %bb.0:2745; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282746; GFX11-NEXT: s_waitcnt vmcnt(0)2747; GFX11-NEXT: ; return to shader part epilog2748;2749; GFX12-LABEL: global_load_saddr_f64_immneg128:2750; GFX12: ; %bb.0:2751; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282752; GFX12-NEXT: s_wait_loadcnt 0x02753; GFX12-NEXT: ; return to shader part epilog2754 %zext.offset = zext i32 %voffset to i642755 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2756 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282757 %load = load double, ptr addrspace(1) %gep12758 %cast.load = bitcast double %load to <2 x float>2759 ret <2 x float> %cast.load2760}2761 2762define amdgpu_ps <2 x float> @global_load_saddr_i64(ptr addrspace(1) inreg %sbase, i32 %voffset) {2763; GCN-LABEL: global_load_saddr_i64:2764; GCN: ; %bb.0:2765; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]2766; GCN-NEXT: s_waitcnt vmcnt(0)2767; GCN-NEXT: ; return to shader part epilog2768;2769; GFX11-LABEL: global_load_saddr_i64:2770; GFX11: ; %bb.0:2771; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]2772; GFX11-NEXT: s_waitcnt vmcnt(0)2773; GFX11-NEXT: ; return to shader part epilog2774;2775; GFX12-LABEL: global_load_saddr_i64:2776; GFX12: ; %bb.0:2777; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3]2778; GFX12-NEXT: s_wait_loadcnt 0x02779; GFX12-NEXT: ; return to shader part epilog2780 %zext.offset = zext i32 %voffset to i642781 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2782 %load = load i64, ptr addrspace(1) %gep02783 %cast.load = bitcast i64 %load to <2 x float>2784 ret <2 x float> %cast.load2785}2786 2787define amdgpu_ps <2 x float> @global_load_saddr_i64_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2788; GCN-LABEL: global_load_saddr_i64_immneg128:2789; GCN: ; %bb.0:2790; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-1282791; GCN-NEXT: s_waitcnt vmcnt(0)2792; GCN-NEXT: ; return to shader part epilog2793;2794; GFX11-LABEL: global_load_saddr_i64_immneg128:2795; GFX11: ; %bb.0:2796; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282797; GFX11-NEXT: s_waitcnt vmcnt(0)2798; GFX11-NEXT: ; return to shader part epilog2799;2800; GFX12-LABEL: global_load_saddr_i64_immneg128:2801; GFX12: ; %bb.0:2802; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282803; GFX12-NEXT: s_wait_loadcnt 0x02804; GFX12-NEXT: ; return to shader part epilog2805 %zext.offset = zext i32 %voffset to i642806 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2807 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282808 %load = load i64, ptr addrspace(1) %gep12809 %cast.load = bitcast i64 %load to <2 x float>2810 ret <2 x float> %cast.load2811}2812 2813define amdgpu_ps <2 x float> @global_load_saddr_v2f32(ptr addrspace(1) inreg %sbase, i32 %voffset) {2814; GCN-LABEL: global_load_saddr_v2f32:2815; GCN: ; %bb.0:2816; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]2817; GCN-NEXT: s_waitcnt vmcnt(0)2818; GCN-NEXT: ; return to shader part epilog2819;2820; GFX11-LABEL: global_load_saddr_v2f32:2821; GFX11: ; %bb.0:2822; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]2823; GFX11-NEXT: s_waitcnt vmcnt(0)2824; GFX11-NEXT: ; return to shader part epilog2825;2826; GFX12-LABEL: global_load_saddr_v2f32:2827; GFX12: ; %bb.0:2828; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3]2829; GFX12-NEXT: s_wait_loadcnt 0x02830; GFX12-NEXT: ; return to shader part epilog2831 %zext.offset = zext i32 %voffset to i642832 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2833 %load = load <2 x float>, ptr addrspace(1) %gep02834 ret <2 x float> %load2835}2836 2837define amdgpu_ps <2 x float> @global_load_saddr_v2f32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2838; GCN-LABEL: global_load_saddr_v2f32_immneg128:2839; GCN: ; %bb.0:2840; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-1282841; GCN-NEXT: s_waitcnt vmcnt(0)2842; GCN-NEXT: ; return to shader part epilog2843;2844; GFX11-LABEL: global_load_saddr_v2f32_immneg128:2845; GFX11: ; %bb.0:2846; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282847; GFX11-NEXT: s_waitcnt vmcnt(0)2848; GFX11-NEXT: ; return to shader part epilog2849;2850; GFX12-LABEL: global_load_saddr_v2f32_immneg128:2851; GFX12: ; %bb.0:2852; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282853; GFX12-NEXT: s_wait_loadcnt 0x02854; GFX12-NEXT: ; return to shader part epilog2855 %zext.offset = zext i32 %voffset to i642856 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2857 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282858 %load = load <2 x float>, ptr addrspace(1) %gep12859 ret <2 x float> %load2860}2861 2862define amdgpu_ps <2 x float> @global_load_saddr_v2i32(ptr addrspace(1) inreg %sbase, i32 %voffset) {2863; GCN-LABEL: global_load_saddr_v2i32:2864; GCN: ; %bb.0:2865; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]2866; GCN-NEXT: s_waitcnt vmcnt(0)2867; GCN-NEXT: ; return to shader part epilog2868;2869; GFX11-LABEL: global_load_saddr_v2i32:2870; GFX11: ; %bb.0:2871; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]2872; GFX11-NEXT: s_waitcnt vmcnt(0)2873; GFX11-NEXT: ; return to shader part epilog2874;2875; GFX12-LABEL: global_load_saddr_v2i32:2876; GFX12: ; %bb.0:2877; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3]2878; GFX12-NEXT: s_wait_loadcnt 0x02879; GFX12-NEXT: ; return to shader part epilog2880 %zext.offset = zext i32 %voffset to i642881 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2882 %load = load <2 x i32>, ptr addrspace(1) %gep02883 %cast.load = bitcast <2 x i32> %load to <2 x float>2884 ret <2 x float> %cast.load2885}2886 2887define amdgpu_ps <2 x float> @global_load_saddr_v2i32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2888; GCN-LABEL: global_load_saddr_v2i32_immneg128:2889; GCN: ; %bb.0:2890; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-1282891; GCN-NEXT: s_waitcnt vmcnt(0)2892; GCN-NEXT: ; return to shader part epilog2893;2894; GFX11-LABEL: global_load_saddr_v2i32_immneg128:2895; GFX11: ; %bb.0:2896; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282897; GFX11-NEXT: s_waitcnt vmcnt(0)2898; GFX11-NEXT: ; return to shader part epilog2899;2900; GFX12-LABEL: global_load_saddr_v2i32_immneg128:2901; GFX12: ; %bb.0:2902; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282903; GFX12-NEXT: s_wait_loadcnt 0x02904; GFX12-NEXT: ; return to shader part epilog2905 %zext.offset = zext i32 %voffset to i642906 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2907 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282908 %load = load <2 x i32>, ptr addrspace(1) %gep12909 %cast.load = bitcast <2 x i32> %load to <2 x float>2910 ret <2 x float> %cast.load2911}2912 2913define amdgpu_ps <2 x float> @global_load_saddr_v4i16(ptr addrspace(1) inreg %sbase, i32 %voffset) {2914; GCN-LABEL: global_load_saddr_v4i16:2915; GCN: ; %bb.0:2916; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]2917; GCN-NEXT: s_waitcnt vmcnt(0)2918; GCN-NEXT: ; return to shader part epilog2919;2920; GFX11-LABEL: global_load_saddr_v4i16:2921; GFX11: ; %bb.0:2922; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]2923; GFX11-NEXT: s_waitcnt vmcnt(0)2924; GFX11-NEXT: ; return to shader part epilog2925;2926; GFX12-LABEL: global_load_saddr_v4i16:2927; GFX12: ; %bb.0:2928; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3]2929; GFX12-NEXT: s_wait_loadcnt 0x02930; GFX12-NEXT: ; return to shader part epilog2931 %zext.offset = zext i32 %voffset to i642932 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2933 %load = load <4 x i16>, ptr addrspace(1) %gep02934 %cast.load = bitcast <4 x i16> %load to <2 x float>2935 ret <2 x float> %cast.load2936}2937 2938define amdgpu_ps <2 x float> @global_load_saddr_v4i16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2939; GCN-LABEL: global_load_saddr_v4i16_immneg128:2940; GCN: ; %bb.0:2941; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-1282942; GCN-NEXT: s_waitcnt vmcnt(0)2943; GCN-NEXT: ; return to shader part epilog2944;2945; GFX11-LABEL: global_load_saddr_v4i16_immneg128:2946; GFX11: ; %bb.0:2947; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282948; GFX11-NEXT: s_waitcnt vmcnt(0)2949; GFX11-NEXT: ; return to shader part epilog2950;2951; GFX12-LABEL: global_load_saddr_v4i16_immneg128:2952; GFX12: ; %bb.0:2953; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282954; GFX12-NEXT: s_wait_loadcnt 0x02955; GFX12-NEXT: ; return to shader part epilog2956 %zext.offset = zext i32 %voffset to i642957 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2958 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1282959 %load = load <4 x i16>, ptr addrspace(1) %gep12960 %cast.load = bitcast <4 x i16> %load to <2 x float>2961 ret <2 x float> %cast.load2962}2963 2964define amdgpu_ps <2 x float> @global_load_saddr_v4f16(ptr addrspace(1) inreg %sbase, i32 %voffset) {2965; GCN-LABEL: global_load_saddr_v4f16:2966; GCN: ; %bb.0:2967; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]2968; GCN-NEXT: s_waitcnt vmcnt(0)2969; GCN-NEXT: ; return to shader part epilog2970;2971; GFX11-LABEL: global_load_saddr_v4f16:2972; GFX11: ; %bb.0:2973; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]2974; GFX11-NEXT: s_waitcnt vmcnt(0)2975; GFX11-NEXT: ; return to shader part epilog2976;2977; GFX12-LABEL: global_load_saddr_v4f16:2978; GFX12: ; %bb.0:2979; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3]2980; GFX12-NEXT: s_wait_loadcnt 0x02981; GFX12-NEXT: ; return to shader part epilog2982 %zext.offset = zext i32 %voffset to i642983 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset2984 %load = load <4 x half>, ptr addrspace(1) %gep02985 %cast.load = bitcast <4 x half> %load to <2 x float>2986 ret <2 x float> %cast.load2987}2988 2989define amdgpu_ps <2 x float> @global_load_saddr_v4f16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {2990; GCN-LABEL: global_load_saddr_v4f16_immneg128:2991; GCN: ; %bb.0:2992; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-1282993; GCN-NEXT: s_waitcnt vmcnt(0)2994; GCN-NEXT: ; return to shader part epilog2995;2996; GFX11-LABEL: global_load_saddr_v4f16_immneg128:2997; GFX11: ; %bb.0:2998; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1282999; GFX11-NEXT: s_waitcnt vmcnt(0)3000; GFX11-NEXT: ; return to shader part epilog3001;3002; GFX12-LABEL: global_load_saddr_v4f16_immneg128:3003; GFX12: ; %bb.0:3004; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1283005; GFX12-NEXT: s_wait_loadcnt 0x03006; GFX12-NEXT: ; return to shader part epilog3007 %zext.offset = zext i32 %voffset to i643008 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3009 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283010 %load = load <4 x half>, ptr addrspace(1) %gep13011 %cast.load = bitcast <4 x half> %load to <2 x float>3012 ret <2 x float> %cast.load3013}3014 3015define amdgpu_ps <2 x float> @global_load_saddr_p1(ptr addrspace(1) inreg %sbase, i32 %voffset) {3016; GCN-LABEL: global_load_saddr_p1:3017; GCN: ; %bb.0:3018; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]3019; GCN-NEXT: s_waitcnt vmcnt(0)3020; GCN-NEXT: ; return to shader part epilog3021;3022; GFX11-LABEL: global_load_saddr_p1:3023; GFX11: ; %bb.0:3024; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]3025; GFX11-NEXT: s_waitcnt vmcnt(0)3026; GFX11-NEXT: ; return to shader part epilog3027;3028; GFX12-LABEL: global_load_saddr_p1:3029; GFX12: ; %bb.0:3030; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3]3031; GFX12-NEXT: s_wait_loadcnt 0x03032; GFX12-NEXT: ; return to shader part epilog3033 %zext.offset = zext i32 %voffset to i643034 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3035 %load = load ptr addrspace(1), ptr addrspace(1) %gep03036 %cast.load0 = ptrtoint ptr addrspace(1) %load to i643037 %cast.load1 = bitcast i64 %cast.load0 to <2 x float>3038 ret <2 x float> %cast.load13039}3040 3041define amdgpu_ps <2 x float> @global_load_saddr_p1_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3042; GCN-LABEL: global_load_saddr_p1_immneg128:3043; GCN: ; %bb.0:3044; GCN-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-1283045; GCN-NEXT: s_waitcnt vmcnt(0)3046; GCN-NEXT: ; return to shader part epilog3047;3048; GFX11-LABEL: global_load_saddr_p1_immneg128:3049; GFX11: ; %bb.0:3050; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1283051; GFX11-NEXT: s_waitcnt vmcnt(0)3052; GFX11-NEXT: ; return to shader part epilog3053;3054; GFX12-LABEL: global_load_saddr_p1_immneg128:3055; GFX12: ; %bb.0:3056; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-1283057; GFX12-NEXT: s_wait_loadcnt 0x03058; GFX12-NEXT: ; return to shader part epilog3059 %zext.offset = zext i32 %voffset to i643060 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3061 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283062 %load = load ptr addrspace(1), ptr addrspace(1) %gep13063 %cast.load0 = ptrtoint ptr addrspace(1) %load to i643064 %cast.load1 = bitcast i64 %cast.load0 to <2 x float>3065 ret <2 x float> %cast.load13066}3067 3068define amdgpu_ps <3 x float> @global_load_saddr_v3f32(ptr addrspace(1) inreg %sbase, i32 %voffset) {3069; GCN-LABEL: global_load_saddr_v3f32:3070; GCN: ; %bb.0:3071; GCN-NEXT: global_load_dwordx3 v[0:2], v0, s[2:3]3072; GCN-NEXT: s_waitcnt vmcnt(0)3073; GCN-NEXT: ; return to shader part epilog3074;3075; GFX11-LABEL: global_load_saddr_v3f32:3076; GFX11: ; %bb.0:3077; GFX11-NEXT: global_load_b96 v[0:2], v0, s[2:3]3078; GFX11-NEXT: s_waitcnt vmcnt(0)3079; GFX11-NEXT: ; return to shader part epilog3080;3081; GFX12-LABEL: global_load_saddr_v3f32:3082; GFX12: ; %bb.0:3083; GFX12-NEXT: global_load_b96 v[0:2], v0, s[2:3]3084; GFX12-NEXT: s_wait_loadcnt 0x03085; GFX12-NEXT: ; return to shader part epilog3086 %zext.offset = zext i32 %voffset to i643087 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3088 %load = load <3 x float>, ptr addrspace(1) %gep03089 ret <3 x float> %load3090}3091 3092define amdgpu_ps <3 x float> @global_load_saddr_v3f32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3093; GCN-LABEL: global_load_saddr_v3f32_immneg128:3094; GCN: ; %bb.0:3095; GCN-NEXT: global_load_dwordx3 v[0:2], v0, s[2:3] offset:-1283096; GCN-NEXT: s_waitcnt vmcnt(0)3097; GCN-NEXT: ; return to shader part epilog3098;3099; GFX11-LABEL: global_load_saddr_v3f32_immneg128:3100; GFX11: ; %bb.0:3101; GFX11-NEXT: global_load_b96 v[0:2], v0, s[2:3] offset:-1283102; GFX11-NEXT: s_waitcnt vmcnt(0)3103; GFX11-NEXT: ; return to shader part epilog3104;3105; GFX12-LABEL: global_load_saddr_v3f32_immneg128:3106; GFX12: ; %bb.0:3107; GFX12-NEXT: global_load_b96 v[0:2], v0, s[2:3] offset:-1283108; GFX12-NEXT: s_wait_loadcnt 0x03109; GFX12-NEXT: ; return to shader part epilog3110 %zext.offset = zext i32 %voffset to i643111 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3112 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283113 %load = load <3 x float>, ptr addrspace(1) %gep13114 ret <3 x float> %load3115}3116 3117define amdgpu_ps <3 x float> @global_load_saddr_v3i32(ptr addrspace(1) inreg %sbase, i32 %voffset) {3118; GCN-LABEL: global_load_saddr_v3i32:3119; GCN: ; %bb.0:3120; GCN-NEXT: global_load_dwordx3 v[0:2], v0, s[2:3]3121; GCN-NEXT: s_waitcnt vmcnt(0)3122; GCN-NEXT: ; return to shader part epilog3123;3124; GFX11-LABEL: global_load_saddr_v3i32:3125; GFX11: ; %bb.0:3126; GFX11-NEXT: global_load_b96 v[0:2], v0, s[2:3]3127; GFX11-NEXT: s_waitcnt vmcnt(0)3128; GFX11-NEXT: ; return to shader part epilog3129;3130; GFX12-LABEL: global_load_saddr_v3i32:3131; GFX12: ; %bb.0:3132; GFX12-NEXT: global_load_b96 v[0:2], v0, s[2:3]3133; GFX12-NEXT: s_wait_loadcnt 0x03134; GFX12-NEXT: ; return to shader part epilog3135 %zext.offset = zext i32 %voffset to i643136 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3137 %load = load <3 x i32>, ptr addrspace(1) %gep03138 %cast.load = bitcast <3 x i32> %load to <3 x float>3139 ret <3 x float> %cast.load3140}3141 3142define amdgpu_ps <3 x float> @global_load_saddr_v3i32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3143; GCN-LABEL: global_load_saddr_v3i32_immneg128:3144; GCN: ; %bb.0:3145; GCN-NEXT: global_load_dwordx3 v[0:2], v0, s[2:3] offset:-1283146; GCN-NEXT: s_waitcnt vmcnt(0)3147; GCN-NEXT: ; return to shader part epilog3148;3149; GFX11-LABEL: global_load_saddr_v3i32_immneg128:3150; GFX11: ; %bb.0:3151; GFX11-NEXT: global_load_b96 v[0:2], v0, s[2:3] offset:-1283152; GFX11-NEXT: s_waitcnt vmcnt(0)3153; GFX11-NEXT: ; return to shader part epilog3154;3155; GFX12-LABEL: global_load_saddr_v3i32_immneg128:3156; GFX12: ; %bb.0:3157; GFX12-NEXT: global_load_b96 v[0:2], v0, s[2:3] offset:-1283158; GFX12-NEXT: s_wait_loadcnt 0x03159; GFX12-NEXT: ; return to shader part epilog3160 %zext.offset = zext i32 %voffset to i643161 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3162 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283163 %load = load <3 x i32>, ptr addrspace(1) %gep13164 %cast.load = bitcast <3 x i32> %load to <3 x float>3165 ret <3 x float> %cast.load3166}3167 3168define amdgpu_ps <6 x half> @global_load_saddr_v6f16(ptr addrspace(1) inreg %sbase, i32 %voffset) {3169; GCN-LABEL: global_load_saddr_v6f16:3170; GCN: ; %bb.0:3171; GCN-NEXT: global_load_dwordx3 v[0:2], v0, s[2:3]3172; GCN-NEXT: s_waitcnt vmcnt(0)3173; GCN-NEXT: ; return to shader part epilog3174;3175; GFX11-LABEL: global_load_saddr_v6f16:3176; GFX11: ; %bb.0:3177; GFX11-NEXT: global_load_b96 v[0:2], v0, s[2:3]3178; GFX11-NEXT: s_waitcnt vmcnt(0)3179; GFX11-NEXT: ; return to shader part epilog3180;3181; GFX12-LABEL: global_load_saddr_v6f16:3182; GFX12: ; %bb.0:3183; GFX12-NEXT: global_load_b96 v[0:2], v0, s[2:3]3184; GFX12-NEXT: s_wait_loadcnt 0x03185; GFX12-NEXT: ; return to shader part epilog3186 %zext.offset = zext i32 %voffset to i643187 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3188 %load = load <6 x half>, ptr addrspace(1) %gep03189 ret <6 x half> %load3190}3191 3192define amdgpu_ps <6 x half> @global_load_saddr_v6f16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3193; GCN-LABEL: global_load_saddr_v6f16_immneg128:3194; GCN: ; %bb.0:3195; GCN-NEXT: global_load_dwordx3 v[0:2], v0, s[2:3] offset:-1283196; GCN-NEXT: s_waitcnt vmcnt(0)3197; GCN-NEXT: ; return to shader part epilog3198;3199; GFX11-LABEL: global_load_saddr_v6f16_immneg128:3200; GFX11: ; %bb.0:3201; GFX11-NEXT: global_load_b96 v[0:2], v0, s[2:3] offset:-1283202; GFX11-NEXT: s_waitcnt vmcnt(0)3203; GFX11-NEXT: ; return to shader part epilog3204;3205; GFX12-LABEL: global_load_saddr_v6f16_immneg128:3206; GFX12: ; %bb.0:3207; GFX12-NEXT: global_load_b96 v[0:2], v0, s[2:3] offset:-1283208; GFX12-NEXT: s_wait_loadcnt 0x03209; GFX12-NEXT: ; return to shader part epilog3210 %zext.offset = zext i32 %voffset to i643211 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3212 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283213 %load = load <6 x half>, ptr addrspace(1) %gep13214 ret <6 x half> %load3215}3216 3217define amdgpu_ps <4 x float> @global_load_saddr_v4f32(ptr addrspace(1) inreg %sbase, i32 %voffset) {3218; GCN-LABEL: global_load_saddr_v4f32:3219; GCN: ; %bb.0:3220; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3]3221; GCN-NEXT: s_waitcnt vmcnt(0)3222; GCN-NEXT: ; return to shader part epilog3223;3224; GFX11-LABEL: global_load_saddr_v4f32:3225; GFX11: ; %bb.0:3226; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]3227; GFX11-NEXT: s_waitcnt vmcnt(0)3228; GFX11-NEXT: ; return to shader part epilog3229;3230; GFX12-LABEL: global_load_saddr_v4f32:3231; GFX12: ; %bb.0:3232; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3]3233; GFX12-NEXT: s_wait_loadcnt 0x03234; GFX12-NEXT: ; return to shader part epilog3235 %zext.offset = zext i32 %voffset to i643236 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3237 %load = load <4 x float>, ptr addrspace(1) %gep03238 ret <4 x float> %load3239}3240 3241define amdgpu_ps <4 x float> @global_load_saddr_v4f32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3242; GCN-LABEL: global_load_saddr_v4f32_immneg128:3243; GCN: ; %bb.0:3244; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3] offset:-1283245; GCN-NEXT: s_waitcnt vmcnt(0)3246; GCN-NEXT: ; return to shader part epilog3247;3248; GFX11-LABEL: global_load_saddr_v4f32_immneg128:3249; GFX11: ; %bb.0:3250; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283251; GFX11-NEXT: s_waitcnt vmcnt(0)3252; GFX11-NEXT: ; return to shader part epilog3253;3254; GFX12-LABEL: global_load_saddr_v4f32_immneg128:3255; GFX12: ; %bb.0:3256; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283257; GFX12-NEXT: s_wait_loadcnt 0x03258; GFX12-NEXT: ; return to shader part epilog3259 %zext.offset = zext i32 %voffset to i643260 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3261 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283262 %load = load <4 x float>, ptr addrspace(1) %gep13263 ret <4 x float> %load3264}3265 3266define amdgpu_ps <4 x float> @global_load_saddr_v4i32(ptr addrspace(1) inreg %sbase, i32 %voffset) {3267; GCN-LABEL: global_load_saddr_v4i32:3268; GCN: ; %bb.0:3269; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3]3270; GCN-NEXT: s_waitcnt vmcnt(0)3271; GCN-NEXT: ; return to shader part epilog3272;3273; GFX11-LABEL: global_load_saddr_v4i32:3274; GFX11: ; %bb.0:3275; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]3276; GFX11-NEXT: s_waitcnt vmcnt(0)3277; GFX11-NEXT: ; return to shader part epilog3278;3279; GFX12-LABEL: global_load_saddr_v4i32:3280; GFX12: ; %bb.0:3281; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3]3282; GFX12-NEXT: s_wait_loadcnt 0x03283; GFX12-NEXT: ; return to shader part epilog3284 %zext.offset = zext i32 %voffset to i643285 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3286 %load = load <4 x i32>, ptr addrspace(1) %gep03287 %cast.load = bitcast <4 x i32> %load to <4 x float>3288 ret <4 x float> %cast.load3289}3290 3291define amdgpu_ps <4 x float> @global_load_saddr_v4i32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3292; GCN-LABEL: global_load_saddr_v4i32_immneg128:3293; GCN: ; %bb.0:3294; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3] offset:-1283295; GCN-NEXT: s_waitcnt vmcnt(0)3296; GCN-NEXT: ; return to shader part epilog3297;3298; GFX11-LABEL: global_load_saddr_v4i32_immneg128:3299; GFX11: ; %bb.0:3300; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283301; GFX11-NEXT: s_waitcnt vmcnt(0)3302; GFX11-NEXT: ; return to shader part epilog3303;3304; GFX12-LABEL: global_load_saddr_v4i32_immneg128:3305; GFX12: ; %bb.0:3306; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283307; GFX12-NEXT: s_wait_loadcnt 0x03308; GFX12-NEXT: ; return to shader part epilog3309 %zext.offset = zext i32 %voffset to i643310 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3311 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283312 %load = load <4 x i32>, ptr addrspace(1) %gep13313 %cast.load = bitcast <4 x i32> %load to <4 x float>3314 ret <4 x float> %cast.load3315}3316 3317define amdgpu_ps <4 x float> @global_load_saddr_v2i64(ptr addrspace(1) inreg %sbase, i32 %voffset) {3318; GCN-LABEL: global_load_saddr_v2i64:3319; GCN: ; %bb.0:3320; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3]3321; GCN-NEXT: s_waitcnt vmcnt(0)3322; GCN-NEXT: ; return to shader part epilog3323;3324; GFX11-LABEL: global_load_saddr_v2i64:3325; GFX11: ; %bb.0:3326; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]3327; GFX11-NEXT: s_waitcnt vmcnt(0)3328; GFX11-NEXT: ; return to shader part epilog3329;3330; GFX12-LABEL: global_load_saddr_v2i64:3331; GFX12: ; %bb.0:3332; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3]3333; GFX12-NEXT: s_wait_loadcnt 0x03334; GFX12-NEXT: ; return to shader part epilog3335 %zext.offset = zext i32 %voffset to i643336 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3337 %load = load <2 x i64>, ptr addrspace(1) %gep03338 %cast.load = bitcast <2 x i64> %load to <4 x float>3339 ret <4 x float> %cast.load3340}3341 3342define amdgpu_ps <4 x float> @global_load_saddr_v2i64_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3343; GCN-LABEL: global_load_saddr_v2i64_immneg128:3344; GCN: ; %bb.0:3345; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3] offset:-1283346; GCN-NEXT: s_waitcnt vmcnt(0)3347; GCN-NEXT: ; return to shader part epilog3348;3349; GFX11-LABEL: global_load_saddr_v2i64_immneg128:3350; GFX11: ; %bb.0:3351; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283352; GFX11-NEXT: s_waitcnt vmcnt(0)3353; GFX11-NEXT: ; return to shader part epilog3354;3355; GFX12-LABEL: global_load_saddr_v2i64_immneg128:3356; GFX12: ; %bb.0:3357; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283358; GFX12-NEXT: s_wait_loadcnt 0x03359; GFX12-NEXT: ; return to shader part epilog3360 %zext.offset = zext i32 %voffset to i643361 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3362 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283363 %load = load <2 x i64>, ptr addrspace(1) %gep13364 %cast.load = bitcast <2 x i64> %load to <4 x float>3365 ret <4 x float> %cast.load3366}3367 3368define amdgpu_ps <4 x float> @global_load_saddr_i128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3369; GCN-LABEL: global_load_saddr_i128:3370; GCN: ; %bb.0:3371; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3]3372; GCN-NEXT: s_waitcnt vmcnt(0)3373; GCN-NEXT: ; return to shader part epilog3374;3375; GFX11-LABEL: global_load_saddr_i128:3376; GFX11: ; %bb.0:3377; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]3378; GFX11-NEXT: s_waitcnt vmcnt(0)3379; GFX11-NEXT: ; return to shader part epilog3380;3381; GFX12-LABEL: global_load_saddr_i128:3382; GFX12: ; %bb.0:3383; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3]3384; GFX12-NEXT: s_wait_loadcnt 0x03385; GFX12-NEXT: ; return to shader part epilog3386 %zext.offset = zext i32 %voffset to i643387 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3388 %load = load i128, ptr addrspace(1) %gep03389 %cast.load = bitcast i128 %load to <4 x float>3390 ret <4 x float> %cast.load3391}3392 3393define amdgpu_ps <4 x float> @global_load_saddr_i128_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3394; GCN-LABEL: global_load_saddr_i128_immneg128:3395; GCN: ; %bb.0:3396; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3] offset:-1283397; GCN-NEXT: s_waitcnt vmcnt(0)3398; GCN-NEXT: ; return to shader part epilog3399;3400; GFX11-LABEL: global_load_saddr_i128_immneg128:3401; GFX11: ; %bb.0:3402; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283403; GFX11-NEXT: s_waitcnt vmcnt(0)3404; GFX11-NEXT: ; return to shader part epilog3405;3406; GFX12-LABEL: global_load_saddr_i128_immneg128:3407; GFX12: ; %bb.0:3408; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283409; GFX12-NEXT: s_wait_loadcnt 0x03410; GFX12-NEXT: ; return to shader part epilog3411 %zext.offset = zext i32 %voffset to i643412 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3413 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283414 %load = load i128, ptr addrspace(1) %gep13415 %cast.load = bitcast i128 %load to <4 x float>3416 ret <4 x float> %cast.load3417}3418 3419define amdgpu_ps <4 x float> @global_load_saddr_v2p1(ptr addrspace(1) inreg %sbase, i32 %voffset) {3420; GCN-LABEL: global_load_saddr_v2p1:3421; GCN: ; %bb.0:3422; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3]3423; GCN-NEXT: s_waitcnt vmcnt(0)3424; GCN-NEXT: ; return to shader part epilog3425;3426; GFX11-LABEL: global_load_saddr_v2p1:3427; GFX11: ; %bb.0:3428; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]3429; GFX11-NEXT: s_waitcnt vmcnt(0)3430; GFX11-NEXT: ; return to shader part epilog3431;3432; GFX12-LABEL: global_load_saddr_v2p1:3433; GFX12: ; %bb.0:3434; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3]3435; GFX12-NEXT: s_wait_loadcnt 0x03436; GFX12-NEXT: ; return to shader part epilog3437 %zext.offset = zext i32 %voffset to i643438 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3439 %load = load <2 x ptr addrspace(1)>, ptr addrspace(1) %gep03440 %cast.load0 = ptrtoint <2 x ptr addrspace(1)> %load to <2 x i64>3441 %cast.load1 = bitcast <2 x i64> %cast.load0 to <4 x float>3442 ret <4 x float> %cast.load13443}3444 3445define amdgpu_ps <4 x float> @global_load_saddr_v2p1_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3446; GCN-LABEL: global_load_saddr_v2p1_immneg128:3447; GCN: ; %bb.0:3448; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3] offset:-1283449; GCN-NEXT: s_waitcnt vmcnt(0)3450; GCN-NEXT: ; return to shader part epilog3451;3452; GFX11-LABEL: global_load_saddr_v2p1_immneg128:3453; GFX11: ; %bb.0:3454; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283455; GFX11-NEXT: s_waitcnt vmcnt(0)3456; GFX11-NEXT: ; return to shader part epilog3457;3458; GFX12-LABEL: global_load_saddr_v2p1_immneg128:3459; GFX12: ; %bb.0:3460; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283461; GFX12-NEXT: s_wait_loadcnt 0x03462; GFX12-NEXT: ; return to shader part epilog3463 %zext.offset = zext i32 %voffset to i643464 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3465 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283466 %load = load <2 x ptr addrspace(1)>, ptr addrspace(1) %gep13467 %cast.load0 = ptrtoint <2 x ptr addrspace(1)> %load to <2 x i64>3468 %cast.load1 = bitcast <2 x i64> %cast.load0 to <4 x float>3469 ret <4 x float> %cast.load13470}3471 3472define amdgpu_ps <4 x float> @global_load_saddr_v4p3(ptr addrspace(1) inreg %sbase, i32 %voffset) {3473; GCN-LABEL: global_load_saddr_v4p3:3474; GCN: ; %bb.0:3475; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3]3476; GCN-NEXT: s_waitcnt vmcnt(0)3477; GCN-NEXT: ; return to shader part epilog3478;3479; GFX11-LABEL: global_load_saddr_v4p3:3480; GFX11: ; %bb.0:3481; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3]3482; GFX11-NEXT: s_waitcnt vmcnt(0)3483; GFX11-NEXT: ; return to shader part epilog3484;3485; GFX12-LABEL: global_load_saddr_v4p3:3486; GFX12: ; %bb.0:3487; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3]3488; GFX12-NEXT: s_wait_loadcnt 0x03489; GFX12-NEXT: ; return to shader part epilog3490 %zext.offset = zext i32 %voffset to i643491 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3492 %load = load <4 x ptr addrspace(3)>, ptr addrspace(1) %gep03493 %cast.load0 = ptrtoint <4 x ptr addrspace(3)> %load to <4 x i32>3494 %cast.load1 = bitcast <4 x i32> %cast.load0 to <4 x float>3495 ret <4 x float> %cast.load13496}3497 3498define amdgpu_ps <4 x float> @global_load_saddr_v4p3_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3499; GCN-LABEL: global_load_saddr_v4p3_immneg128:3500; GCN: ; %bb.0:3501; GCN-NEXT: global_load_dwordx4 v[0:3], v0, s[2:3] offset:-1283502; GCN-NEXT: s_waitcnt vmcnt(0)3503; GCN-NEXT: ; return to shader part epilog3504;3505; GFX11-LABEL: global_load_saddr_v4p3_immneg128:3506; GFX11: ; %bb.0:3507; GFX11-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283508; GFX11-NEXT: s_waitcnt vmcnt(0)3509; GFX11-NEXT: ; return to shader part epilog3510;3511; GFX12-LABEL: global_load_saddr_v4p3_immneg128:3512; GFX12: ; %bb.0:3513; GFX12-NEXT: global_load_b128 v[0:3], v0, s[2:3] offset:-1283514; GFX12-NEXT: s_wait_loadcnt 0x03515; GFX12-NEXT: ; return to shader part epilog3516 %zext.offset = zext i32 %voffset to i643517 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3518 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283519 %load = load <4 x ptr addrspace(3)>, ptr addrspace(1) %gep13520 %cast.load0 = ptrtoint <4 x ptr addrspace(3)> %load to <4 x i32>3521 %cast.load1 = bitcast <4 x i32> %cast.load0 to <4 x float>3522 ret <4 x float> %cast.load13523}3524 3525; --------------------------------------------------------------------------------3526; Extending loads3527; --------------------------------------------------------------------------------3528 3529define amdgpu_ps float @global_sextload_saddr_i8(ptr addrspace(1) inreg %sbase, i32 %voffset) {3530; GCN-LABEL: global_sextload_saddr_i8:3531; GCN: ; %bb.0:3532; GCN-NEXT: global_load_sbyte v0, v0, s[2:3]3533; GCN-NEXT: s_waitcnt vmcnt(0)3534; GCN-NEXT: ; return to shader part epilog3535;3536; GFX11-LABEL: global_sextload_saddr_i8:3537; GFX11: ; %bb.0:3538; GFX11-NEXT: global_load_i8 v0, v0, s[2:3]3539; GFX11-NEXT: s_waitcnt vmcnt(0)3540; GFX11-NEXT: ; return to shader part epilog3541;3542; GFX12-LABEL: global_sextload_saddr_i8:3543; GFX12: ; %bb.0:3544; GFX12-NEXT: global_load_i8 v0, v0, s[2:3]3545; GFX12-NEXT: s_wait_loadcnt 0x03546; GFX12-NEXT: ; return to shader part epilog3547 %zext.offset = zext i32 %voffset to i643548 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3549 %load = load i8, ptr addrspace(1) %gep03550 %sextload = sext i8 %load to i323551 %cast.load = bitcast i32 %sextload to float3552 ret float %cast.load3553}3554 3555define amdgpu_ps float @global_sextload_saddr_i8_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3556; GCN-LABEL: global_sextload_saddr_i8_immneg128:3557; GCN: ; %bb.0:3558; GCN-NEXT: global_load_sbyte v0, v0, s[2:3] offset:-1283559; GCN-NEXT: s_waitcnt vmcnt(0)3560; GCN-NEXT: ; return to shader part epilog3561;3562; GFX11-LABEL: global_sextload_saddr_i8_immneg128:3563; GFX11: ; %bb.0:3564; GFX11-NEXT: global_load_i8 v0, v0, s[2:3] offset:-1283565; GFX11-NEXT: s_waitcnt vmcnt(0)3566; GFX11-NEXT: ; return to shader part epilog3567;3568; GFX12-LABEL: global_sextload_saddr_i8_immneg128:3569; GFX12: ; %bb.0:3570; GFX12-NEXT: global_load_i8 v0, v0, s[2:3] offset:-1283571; GFX12-NEXT: s_wait_loadcnt 0x03572; GFX12-NEXT: ; return to shader part epilog3573 %zext.offset = zext i32 %voffset to i643574 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3575 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283576 %load = load i8, ptr addrspace(1) %gep13577 %sextload = sext i8 %load to i323578 %cast.load = bitcast i32 %sextload to float3579 ret float %cast.load3580}3581 3582define amdgpu_ps float @global_sextload_saddr_i16(ptr addrspace(1) inreg %sbase, i32 %voffset) {3583; GCN-LABEL: global_sextload_saddr_i16:3584; GCN: ; %bb.0:3585; GCN-NEXT: global_load_sshort v0, v0, s[2:3]3586; GCN-NEXT: s_waitcnt vmcnt(0)3587; GCN-NEXT: ; return to shader part epilog3588;3589; GFX11-LABEL: global_sextload_saddr_i16:3590; GFX11: ; %bb.0:3591; GFX11-NEXT: global_load_i16 v0, v0, s[2:3]3592; GFX11-NEXT: s_waitcnt vmcnt(0)3593; GFX11-NEXT: ; return to shader part epilog3594;3595; GFX12-LABEL: global_sextload_saddr_i16:3596; GFX12: ; %bb.0:3597; GFX12-NEXT: global_load_i16 v0, v0, s[2:3]3598; GFX12-NEXT: s_wait_loadcnt 0x03599; GFX12-NEXT: ; return to shader part epilog3600 %zext.offset = zext i32 %voffset to i643601 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3602 %load = load i16, ptr addrspace(1) %gep03603 %sextload = sext i16 %load to i323604 %cast.load = bitcast i32 %sextload to float3605 ret float %cast.load3606}3607 3608define amdgpu_ps float @global_sextload_saddr_i16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3609; GCN-LABEL: global_sextload_saddr_i16_immneg128:3610; GCN: ; %bb.0:3611; GCN-NEXT: global_load_sshort v0, v0, s[2:3] offset:-1283612; GCN-NEXT: s_waitcnt vmcnt(0)3613; GCN-NEXT: ; return to shader part epilog3614;3615; GFX11-LABEL: global_sextload_saddr_i16_immneg128:3616; GFX11: ; %bb.0:3617; GFX11-NEXT: global_load_i16 v0, v0, s[2:3] offset:-1283618; GFX11-NEXT: s_waitcnt vmcnt(0)3619; GFX11-NEXT: ; return to shader part epilog3620;3621; GFX12-LABEL: global_sextload_saddr_i16_immneg128:3622; GFX12: ; %bb.0:3623; GFX12-NEXT: global_load_i16 v0, v0, s[2:3] offset:-1283624; GFX12-NEXT: s_wait_loadcnt 0x03625; GFX12-NEXT: ; return to shader part epilog3626 %zext.offset = zext i32 %voffset to i643627 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3628 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283629 %load = load i16, ptr addrspace(1) %gep13630 %sextload = sext i16 %load to i323631 %cast.load = bitcast i32 %sextload to float3632 ret float %cast.load3633}3634 3635define amdgpu_ps float @global_zextload_saddr_i8(ptr addrspace(1) inreg %sbase, i32 %voffset) {3636; GCN-LABEL: global_zextload_saddr_i8:3637; GCN: ; %bb.0:3638; GCN-NEXT: global_load_ubyte v0, v0, s[2:3]3639; GCN-NEXT: s_waitcnt vmcnt(0)3640; GCN-NEXT: ; return to shader part epilog3641;3642; GFX11-LABEL: global_zextload_saddr_i8:3643; GFX11: ; %bb.0:3644; GFX11-NEXT: global_load_u8 v0, v0, s[2:3]3645; GFX11-NEXT: s_waitcnt vmcnt(0)3646; GFX11-NEXT: ; return to shader part epilog3647;3648; GFX12-LABEL: global_zextload_saddr_i8:3649; GFX12: ; %bb.0:3650; GFX12-NEXT: global_load_u8 v0, v0, s[2:3]3651; GFX12-NEXT: s_wait_loadcnt 0x03652; GFX12-NEXT: ; return to shader part epilog3653 %zext.offset = zext i32 %voffset to i643654 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3655 %load = load i8, ptr addrspace(1) %gep03656 %zextload = zext i8 %load to i323657 %cast.load = bitcast i32 %zextload to float3658 ret float %cast.load3659}3660 3661define amdgpu_ps float @global_zextload_saddr_i8_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3662; GCN-LABEL: global_zextload_saddr_i8_immneg128:3663; GCN: ; %bb.0:3664; GCN-NEXT: global_load_ubyte v0, v0, s[2:3] offset:-1283665; GCN-NEXT: s_waitcnt vmcnt(0)3666; GCN-NEXT: ; return to shader part epilog3667;3668; GFX11-LABEL: global_zextload_saddr_i8_immneg128:3669; GFX11: ; %bb.0:3670; GFX11-NEXT: global_load_u8 v0, v0, s[2:3] offset:-1283671; GFX11-NEXT: s_waitcnt vmcnt(0)3672; GFX11-NEXT: ; return to shader part epilog3673;3674; GFX12-LABEL: global_zextload_saddr_i8_immneg128:3675; GFX12: ; %bb.0:3676; GFX12-NEXT: global_load_u8 v0, v0, s[2:3] offset:-1283677; GFX12-NEXT: s_wait_loadcnt 0x03678; GFX12-NEXT: ; return to shader part epilog3679 %zext.offset = zext i32 %voffset to i643680 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3681 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283682 %load = load i8, ptr addrspace(1) %gep13683 %zextload = zext i8 %load to i323684 %cast.load = bitcast i32 %zextload to float3685 ret float %cast.load3686}3687 3688define amdgpu_ps float @global_zextload_saddr_i16(ptr addrspace(1) inreg %sbase, i32 %voffset) {3689; GCN-LABEL: global_zextload_saddr_i16:3690; GCN: ; %bb.0:3691; GCN-NEXT: global_load_ushort v0, v0, s[2:3]3692; GCN-NEXT: s_waitcnt vmcnt(0)3693; GCN-NEXT: ; return to shader part epilog3694;3695; GFX11-LABEL: global_zextload_saddr_i16:3696; GFX11: ; %bb.0:3697; GFX11-NEXT: global_load_u16 v0, v0, s[2:3]3698; GFX11-NEXT: s_waitcnt vmcnt(0)3699; GFX11-NEXT: ; return to shader part epilog3700;3701; GFX12-LABEL: global_zextload_saddr_i16:3702; GFX12: ; %bb.0:3703; GFX12-NEXT: global_load_u16 v0, v0, s[2:3]3704; GFX12-NEXT: s_wait_loadcnt 0x03705; GFX12-NEXT: ; return to shader part epilog3706 %zext.offset = zext i32 %voffset to i643707 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3708 %load = load i16, ptr addrspace(1) %gep03709 %zextload = zext i16 %load to i323710 %cast.load = bitcast i32 %zextload to float3711 ret float %cast.load3712}3713 3714define amdgpu_ps float @global_zextload_saddr_i16_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3715; GCN-LABEL: global_zextload_saddr_i16_immneg128:3716; GCN: ; %bb.0:3717; GCN-NEXT: global_load_ushort v0, v0, s[2:3] offset:-1283718; GCN-NEXT: s_waitcnt vmcnt(0)3719; GCN-NEXT: ; return to shader part epilog3720;3721; GFX11-LABEL: global_zextload_saddr_i16_immneg128:3722; GFX11: ; %bb.0:3723; GFX11-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1283724; GFX11-NEXT: s_waitcnt vmcnt(0)3725; GFX11-NEXT: ; return to shader part epilog3726;3727; GFX12-LABEL: global_zextload_saddr_i16_immneg128:3728; GFX12: ; %bb.0:3729; GFX12-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1283730; GFX12-NEXT: s_wait_loadcnt 0x03731; GFX12-NEXT: ; return to shader part epilog3732 %zext.offset = zext i32 %voffset to i643733 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3734 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283735 %load = load i16, ptr addrspace(1) %gep13736 %zextload = zext i16 %load to i323737 %cast.load = bitcast i32 %zextload to float3738 ret float %cast.load3739}3740 3741; --------------------------------------------------------------------------------3742; Atomic load3743; --------------------------------------------------------------------------------3744 3745define amdgpu_ps float @atomic_global_load_saddr_i32(ptr addrspace(1) inreg %sbase, i32 %voffset) {3746; GFX9-LABEL: atomic_global_load_saddr_i32:3747; GFX9: ; %bb.0:3748; GFX9-NEXT: global_load_dword v0, v0, s[2:3] glc3749; GFX9-NEXT: s_waitcnt vmcnt(0)3750; GFX9-NEXT: buffer_wbinvl13751; GFX9-NEXT: ; return to shader part epilog3752;3753; GFX10-LABEL: atomic_global_load_saddr_i32:3754; GFX10: ; %bb.0:3755; GFX10-NEXT: global_load_dword v0, v0, s[2:3] glc dlc3756; GFX10-NEXT: s_waitcnt vmcnt(0)3757; GFX10-NEXT: buffer_gl1_inv3758; GFX10-NEXT: buffer_gl0_inv3759; GFX10-NEXT: ; return to shader part epilog3760;3761; GFX11-LABEL: atomic_global_load_saddr_i32:3762; GFX11: ; %bb.0:3763; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] glc3764; GFX11-NEXT: s_waitcnt vmcnt(0)3765; GFX11-NEXT: buffer_gl1_inv3766; GFX11-NEXT: buffer_gl0_inv3767; GFX11-NEXT: ; return to shader part epilog3768;3769; GFX12-LABEL: atomic_global_load_saddr_i32:3770; GFX12: ; %bb.0:3771; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] scope:SCOPE_SYS3772; GFX12-NEXT: s_wait_loadcnt 0x03773; GFX12-NEXT: global_inv scope:SCOPE_SYS3774; GFX12-NEXT: s_wait_loadcnt 0x03775; GFX12-NEXT: ; return to shader part epilog3776 %zext.offset = zext i32 %voffset to i643777 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3778 %load = load atomic i32, ptr addrspace(1) %gep0 seq_cst, align 43779 %cast.load = bitcast i32 %load to float3780 ret float %cast.load3781}3782 3783define amdgpu_ps float @atomic_global_load_saddr_i32_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3784; GFX9-LABEL: atomic_global_load_saddr_i32_immneg128:3785; GFX9: ; %bb.0:3786; GFX9-NEXT: global_load_dword v0, v0, s[2:3] offset:-128 glc3787; GFX9-NEXT: s_waitcnt vmcnt(0)3788; GFX9-NEXT: buffer_wbinvl13789; GFX9-NEXT: ; return to shader part epilog3790;3791; GFX10-LABEL: atomic_global_load_saddr_i32_immneg128:3792; GFX10: ; %bb.0:3793; GFX10-NEXT: global_load_dword v0, v0, s[2:3] offset:-128 glc dlc3794; GFX10-NEXT: s_waitcnt vmcnt(0)3795; GFX10-NEXT: buffer_gl1_inv3796; GFX10-NEXT: buffer_gl0_inv3797; GFX10-NEXT: ; return to shader part epilog3798;3799; GFX11-LABEL: atomic_global_load_saddr_i32_immneg128:3800; GFX11: ; %bb.0:3801; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:-128 glc3802; GFX11-NEXT: s_waitcnt vmcnt(0)3803; GFX11-NEXT: buffer_gl1_inv3804; GFX11-NEXT: buffer_gl0_inv3805; GFX11-NEXT: ; return to shader part epilog3806;3807; GFX12-LABEL: atomic_global_load_saddr_i32_immneg128:3808; GFX12: ; %bb.0:3809; GFX12-NEXT: global_load_b32 v0, v0, s[2:3] offset:-128 scope:SCOPE_SYS3810; GFX12-NEXT: s_wait_loadcnt 0x03811; GFX12-NEXT: global_inv scope:SCOPE_SYS3812; GFX12-NEXT: s_wait_loadcnt 0x03813; GFX12-NEXT: ; return to shader part epilog3814 %zext.offset = zext i32 %voffset to i643815 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3816 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283817 %load = load atomic i32, ptr addrspace(1) %gep1 seq_cst, align 43818 %cast.load = bitcast i32 %load to float3819 ret float %cast.load3820}3821 3822define amdgpu_ps <2 x float> @atomic_global_load_saddr_i64(ptr addrspace(1) inreg %sbase, i32 %voffset) {3823; GFX9-LABEL: atomic_global_load_saddr_i64:3824; GFX9: ; %bb.0:3825; GFX9-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] glc3826; GFX9-NEXT: s_waitcnt vmcnt(0)3827; GFX9-NEXT: buffer_wbinvl13828; GFX9-NEXT: ; return to shader part epilog3829;3830; GFX10-LABEL: atomic_global_load_saddr_i64:3831; GFX10: ; %bb.0:3832; GFX10-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] glc dlc3833; GFX10-NEXT: s_waitcnt vmcnt(0)3834; GFX10-NEXT: buffer_gl1_inv3835; GFX10-NEXT: buffer_gl0_inv3836; GFX10-NEXT: ; return to shader part epilog3837;3838; GFX11-LABEL: atomic_global_load_saddr_i64:3839; GFX11: ; %bb.0:3840; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] glc3841; GFX11-NEXT: s_waitcnt vmcnt(0)3842; GFX11-NEXT: buffer_gl1_inv3843; GFX11-NEXT: buffer_gl0_inv3844; GFX11-NEXT: ; return to shader part epilog3845;3846; GFX12-LABEL: atomic_global_load_saddr_i64:3847; GFX12: ; %bb.0:3848; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] scope:SCOPE_SYS3849; GFX12-NEXT: s_wait_loadcnt 0x03850; GFX12-NEXT: global_inv scope:SCOPE_SYS3851; GFX12-NEXT: s_wait_loadcnt 0x03852; GFX12-NEXT: ; return to shader part epilog3853 %zext.offset = zext i32 %voffset to i643854 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3855 %load = load atomic i64, ptr addrspace(1) %gep0 seq_cst, align 83856 %cast.load = bitcast i64 %load to <2 x float>3857 ret <2 x float> %cast.load3858}3859 3860define amdgpu_ps <2 x float> @atomic_global_load_saddr_i64_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3861; GFX9-LABEL: atomic_global_load_saddr_i64_immneg128:3862; GFX9: ; %bb.0:3863; GFX9-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-128 glc3864; GFX9-NEXT: s_waitcnt vmcnt(0)3865; GFX9-NEXT: buffer_wbinvl13866; GFX9-NEXT: ; return to shader part epilog3867;3868; GFX10-LABEL: atomic_global_load_saddr_i64_immneg128:3869; GFX10: ; %bb.0:3870; GFX10-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3] offset:-128 glc dlc3871; GFX10-NEXT: s_waitcnt vmcnt(0)3872; GFX10-NEXT: buffer_gl1_inv3873; GFX10-NEXT: buffer_gl0_inv3874; GFX10-NEXT: ; return to shader part epilog3875;3876; GFX11-LABEL: atomic_global_load_saddr_i64_immneg128:3877; GFX11: ; %bb.0:3878; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-128 glc3879; GFX11-NEXT: s_waitcnt vmcnt(0)3880; GFX11-NEXT: buffer_gl1_inv3881; GFX11-NEXT: buffer_gl0_inv3882; GFX11-NEXT: ; return to shader part epilog3883;3884; GFX12-LABEL: atomic_global_load_saddr_i64_immneg128:3885; GFX12: ; %bb.0:3886; GFX12-NEXT: global_load_b64 v[0:1], v0, s[2:3] offset:-128 scope:SCOPE_SYS3887; GFX12-NEXT: s_wait_loadcnt 0x03888; GFX12-NEXT: global_inv scope:SCOPE_SYS3889; GFX12-NEXT: s_wait_loadcnt 0x03890; GFX12-NEXT: ; return to shader part epilog3891 %zext.offset = zext i32 %voffset to i643892 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3893 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283894 %load = load atomic i64, ptr addrspace(1) %gep1 seq_cst, align 83895 %cast.load = bitcast i64 %load to <2 x float>3896 ret <2 x float> %cast.load3897}3898 3899; --------------------------------------------------------------------------------3900; D16 load (low 16)3901; --------------------------------------------------------------------------------3902 3903define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_undef_hi(ptr addrspace(1) inreg %sbase, i32 %voffset) {3904; GCN-LABEL: global_load_saddr_i16_d16lo_undef_hi:3905; GCN: ; %bb.0:3906; GCN-NEXT: global_load_short_d16 v0, v0, s[2:3]3907; GCN-NEXT: s_waitcnt vmcnt(0)3908; GCN-NEXT: ; return to shader part epilog3909;3910; GFX11-LABEL: global_load_saddr_i16_d16lo_undef_hi:3911; GFX11: ; %bb.0:3912; GFX11-NEXT: global_load_d16_b16 v0, v0, s[2:3]3913; GFX11-NEXT: s_waitcnt vmcnt(0)3914; GFX11-NEXT: ; return to shader part epilog3915;3916; GFX12-SDAG-LABEL: global_load_saddr_i16_d16lo_undef_hi:3917; GFX12-SDAG: ; %bb.0:3918; GFX12-SDAG-NEXT: global_load_d16_b16 v0, v0, s[2:3]3919; GFX12-SDAG-NEXT: s_wait_loadcnt 0x03920; GFX12-SDAG-NEXT: ; return to shader part epilog3921;3922; GFX12-GISEL-TRUE16-LABEL: global_load_saddr_i16_d16lo_undef_hi:3923; GFX12-GISEL-TRUE16: ; %bb.0:3924; GFX12-GISEL-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3]3925; GFX12-GISEL-TRUE16-NEXT: s_wait_loadcnt 0x03926; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog3927;3928; GFX12-GISEL-FAKE16-LABEL: global_load_saddr_i16_d16lo_undef_hi:3929; GFX12-GISEL-FAKE16: ; %bb.0:3930; GFX12-GISEL-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3]3931; GFX12-GISEL-FAKE16-NEXT: s_wait_loadcnt 0x03932; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog3933 %zext.offset = zext i32 %voffset to i643934 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3935 %load = load i16, ptr addrspace(1) %gep03936 %build = insertelement <2 x i16> poison, i16 %load, i32 03937 %cast = bitcast <2 x i16> %build to <2 x half>3938 ret <2 x half> %cast3939}3940 3941define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_undef_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {3942; GCN-LABEL: global_load_saddr_i16_d16lo_undef_hi_immneg128:3943; GCN: ; %bb.0:3944; GCN-NEXT: global_load_short_d16 v0, v0, s[2:3] offset:-1283945; GCN-NEXT: s_waitcnt vmcnt(0)3946; GCN-NEXT: ; return to shader part epilog3947;3948; GFX11-LABEL: global_load_saddr_i16_d16lo_undef_hi_immneg128:3949; GFX11: ; %bb.0:3950; GFX11-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1283951; GFX11-NEXT: s_waitcnt vmcnt(0)3952; GFX11-NEXT: ; return to shader part epilog3953;3954; GFX12-SDAG-LABEL: global_load_saddr_i16_d16lo_undef_hi_immneg128:3955; GFX12-SDAG: ; %bb.0:3956; GFX12-SDAG-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1283957; GFX12-SDAG-NEXT: s_wait_loadcnt 0x03958; GFX12-SDAG-NEXT: ; return to shader part epilog3959;3960; GFX12-GISEL-TRUE16-LABEL: global_load_saddr_i16_d16lo_undef_hi_immneg128:3961; GFX12-GISEL-TRUE16: ; %bb.0:3962; GFX12-GISEL-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1283963; GFX12-GISEL-TRUE16-NEXT: s_wait_loadcnt 0x03964; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog3965;3966; GFX12-GISEL-FAKE16-LABEL: global_load_saddr_i16_d16lo_undef_hi_immneg128:3967; GFX12-GISEL-FAKE16: ; %bb.0:3968; GFX12-GISEL-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1283969; GFX12-GISEL-FAKE16-NEXT: s_wait_loadcnt 0x03970; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog3971 %zext.offset = zext i32 %voffset to i643972 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset3973 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1283974 %load = load i16, ptr addrspace(1) %gep13975 %build = insertelement <2 x i16> poison, i16 %load, i32 03976 %cast = bitcast <2 x i16> %build to <2 x half>3977 ret <2 x half> %cast3978}3979 3980define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_zero_hi(ptr addrspace(1) inreg %sbase, i32 %voffset) {3981; GCN-LABEL: global_load_saddr_i16_d16lo_zero_hi:3982; GCN: ; %bb.0:3983; GCN-NEXT: v_mov_b32_e32 v1, 03984; GCN-NEXT: global_load_short_d16 v1, v0, s[2:3]3985; GCN-NEXT: s_waitcnt vmcnt(0)3986; GCN-NEXT: v_mov_b32_e32 v0, v13987; GCN-NEXT: ; return to shader part epilog3988;3989; GFX11-LABEL: global_load_saddr_i16_d16lo_zero_hi:3990; GFX11: ; %bb.0:3991; GFX11-NEXT: v_mov_b32_e32 v1, 03992; GFX11-NEXT: global_load_d16_b16 v1, v0, s[2:3]3993; GFX11-NEXT: s_waitcnt vmcnt(0)3994; GFX11-NEXT: v_mov_b32_e32 v0, v13995; GFX11-NEXT: ; return to shader part epilog3996;3997; GFX12-SDAG-LABEL: global_load_saddr_i16_d16lo_zero_hi:3998; GFX12-SDAG: ; %bb.0:3999; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 04000; GFX12-SDAG-NEXT: global_load_d16_b16 v1, v0, s[2:3]4001; GFX12-SDAG-NEXT: s_wait_loadcnt 0x04002; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, v14003; GFX12-SDAG-NEXT: ; return to shader part epilog4004;4005; GFX12-GISEL-TRUE16-LABEL: global_load_saddr_i16_d16lo_zero_hi:4006; GFX12-GISEL-TRUE16: ; %bb.0:4007; GFX12-GISEL-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3]4008; GFX12-GISEL-TRUE16-NEXT: s_wait_loadcnt 0x04009; GFX12-GISEL-TRUE16-NEXT: v_and_b32_e32 v0, 0xffff, v04010; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)4011; GFX12-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, 0, 16, v04012; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog4013;4014; GFX12-GISEL-FAKE16-LABEL: global_load_saddr_i16_d16lo_zero_hi:4015; GFX12-GISEL-FAKE16: ; %bb.0:4016; GFX12-GISEL-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3]4017; GFX12-GISEL-FAKE16-NEXT: s_wait_loadcnt 0x04018; GFX12-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v04019; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog4020 %zext.offset = zext i32 %voffset to i644021 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4022 %load = load i16, ptr addrspace(1) %gep04023 %build = insertelement <2 x i16> zeroinitializer, i16 %load, i32 04024 %cast = bitcast <2 x i16> %build to <2 x half>4025 ret <2 x half> %cast4026}4027 4028define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_zero_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {4029; GCN-LABEL: global_load_saddr_i16_d16lo_zero_hi_immneg128:4030; GCN: ; %bb.0:4031; GCN-NEXT: v_mov_b32_e32 v1, 04032; GCN-NEXT: global_load_short_d16 v1, v0, s[2:3] offset:-1284033; GCN-NEXT: s_waitcnt vmcnt(0)4034; GCN-NEXT: v_mov_b32_e32 v0, v14035; GCN-NEXT: ; return to shader part epilog4036;4037; GFX11-LABEL: global_load_saddr_i16_d16lo_zero_hi_immneg128:4038; GFX11: ; %bb.0:4039; GFX11-NEXT: v_mov_b32_e32 v1, 04040; GFX11-NEXT: global_load_d16_b16 v1, v0, s[2:3] offset:-1284041; GFX11-NEXT: s_waitcnt vmcnt(0)4042; GFX11-NEXT: v_mov_b32_e32 v0, v14043; GFX11-NEXT: ; return to shader part epilog4044;4045; GFX12-SDAG-LABEL: global_load_saddr_i16_d16lo_zero_hi_immneg128:4046; GFX12-SDAG: ; %bb.0:4047; GFX12-SDAG-NEXT: v_mov_b32_e32 v1, 04048; GFX12-SDAG-NEXT: global_load_d16_b16 v1, v0, s[2:3] offset:-1284049; GFX12-SDAG-NEXT: s_wait_loadcnt 0x04050; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, v14051; GFX12-SDAG-NEXT: ; return to shader part epilog4052;4053; GFX12-GISEL-TRUE16-LABEL: global_load_saddr_i16_d16lo_zero_hi_immneg128:4054; GFX12-GISEL-TRUE16: ; %bb.0:4055; GFX12-GISEL-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1284056; GFX12-GISEL-TRUE16-NEXT: s_wait_loadcnt 0x04057; GFX12-GISEL-TRUE16-NEXT: v_and_b32_e32 v0, 0xffff, v04058; GFX12-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)4059; GFX12-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, 0, 16, v04060; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog4061;4062; GFX12-GISEL-FAKE16-LABEL: global_load_saddr_i16_d16lo_zero_hi_immneg128:4063; GFX12-GISEL-FAKE16: ; %bb.0:4064; GFX12-GISEL-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1284065; GFX12-GISEL-FAKE16-NEXT: s_wait_loadcnt 0x04066; GFX12-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v04067; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog4068 %zext.offset = zext i32 %voffset to i644069 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4070 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284071 %load = load i16, ptr addrspace(1) %gep14072 %build = insertelement <2 x i16> zeroinitializer, i16 %load, i32 04073 %cast = bitcast <2 x i16> %build to <2 x half>4074 ret <2 x half> %cast4075}4076 4077define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_reg_hi(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4078; GCN-LABEL: global_load_saddr_i16_d16lo_reg_hi:4079; GCN: ; %bb.0:4080; GCN-NEXT: global_load_short_d16 v1, v0, s[2:3]4081; GCN-NEXT: s_waitcnt vmcnt(0)4082; GCN-NEXT: v_mov_b32_e32 v0, v14083; GCN-NEXT: ; return to shader part epilog4084;4085; GFX11-LABEL: global_load_saddr_i16_d16lo_reg_hi:4086; GFX11: ; %bb.0:4087; GFX11-NEXT: global_load_d16_b16 v1, v0, s[2:3]4088; GFX11-NEXT: s_waitcnt vmcnt(0)4089; GFX11-NEXT: v_mov_b32_e32 v0, v14090; GFX11-NEXT: ; return to shader part epilog4091;4092; GFX12-LABEL: global_load_saddr_i16_d16lo_reg_hi:4093; GFX12: ; %bb.0:4094; GFX12-NEXT: global_load_d16_b16 v1, v0, s[2:3]4095; GFX12-NEXT: s_wait_loadcnt 0x04096; GFX12-NEXT: v_mov_b32_e32 v0, v14097; GFX12-NEXT: ; return to shader part epilog4098 %zext.offset = zext i32 %voffset to i644099 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4100 %load = load i16, ptr addrspace(1) %gep04101 %build = insertelement <2 x i16> %reg, i16 %load, i32 04102 %cast = bitcast <2 x i16> %build to <2 x half>4103 ret <2 x half> %cast4104}4105 4106define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_reg_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4107; GCN-LABEL: global_load_saddr_i16_d16lo_reg_hi_immneg128:4108; GCN: ; %bb.0:4109; GCN-NEXT: global_load_short_d16 v1, v0, s[2:3] offset:-1284110; GCN-NEXT: s_waitcnt vmcnt(0)4111; GCN-NEXT: v_mov_b32_e32 v0, v14112; GCN-NEXT: ; return to shader part epilog4113;4114; GFX11-LABEL: global_load_saddr_i16_d16lo_reg_hi_immneg128:4115; GFX11: ; %bb.0:4116; GFX11-NEXT: global_load_d16_b16 v1, v0, s[2:3] offset:-1284117; GFX11-NEXT: s_waitcnt vmcnt(0)4118; GFX11-NEXT: v_mov_b32_e32 v0, v14119; GFX11-NEXT: ; return to shader part epilog4120;4121; GFX12-LABEL: global_load_saddr_i16_d16lo_reg_hi_immneg128:4122; GFX12: ; %bb.0:4123; GFX12-NEXT: global_load_d16_b16 v1, v0, s[2:3] offset:-1284124; GFX12-NEXT: s_wait_loadcnt 0x04125; GFX12-NEXT: v_mov_b32_e32 v0, v14126; GFX12-NEXT: ; return to shader part epilog4127 %zext.offset = zext i32 %voffset to i644128 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4129 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284130 %load = load i16, ptr addrspace(1) %gep14131 %build = insertelement <2 x i16> %reg, i16 %load, i32 04132 %cast = bitcast <2 x i16> %build to <2 x half>4133 ret <2 x half> %cast4134}4135 4136define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_zexti8_reg_hi(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4137; GCN-LABEL: global_load_saddr_i16_d16lo_zexti8_reg_hi:4138; GCN: ; %bb.0:4139; GCN-NEXT: global_load_ubyte_d16 v1, v0, s[2:3]4140; GCN-NEXT: s_waitcnt vmcnt(0)4141; GCN-NEXT: v_mov_b32_e32 v0, v14142; GCN-NEXT: ; return to shader part epilog4143;4144; GFX11-LABEL: global_load_saddr_i16_d16lo_zexti8_reg_hi:4145; GFX11: ; %bb.0:4146; GFX11-NEXT: global_load_d16_u8 v1, v0, s[2:3]4147; GFX11-NEXT: s_waitcnt vmcnt(0)4148; GFX11-NEXT: v_mov_b32_e32 v0, v14149; GFX11-NEXT: ; return to shader part epilog4150;4151; GFX12-LABEL: global_load_saddr_i16_d16lo_zexti8_reg_hi:4152; GFX12: ; %bb.0:4153; GFX12-NEXT: global_load_d16_u8 v1, v0, s[2:3]4154; GFX12-NEXT: s_wait_loadcnt 0x04155; GFX12-NEXT: v_mov_b32_e32 v0, v14156; GFX12-NEXT: ; return to shader part epilog4157 %zext.offset = zext i32 %voffset to i644158 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4159 %load = load i8, ptr addrspace(1) %gep04160 %zext.load = zext i8 %load to i164161 %build = insertelement <2 x i16> %reg, i16 %zext.load, i32 04162 %cast = bitcast <2 x i16> %build to <2 x half>4163 ret <2 x half> %cast4164}4165 4166define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_zexti8_reg_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4167; GCN-LABEL: global_load_saddr_i16_d16lo_zexti8_reg_hi_immneg128:4168; GCN: ; %bb.0:4169; GCN-NEXT: global_load_ubyte_d16 v1, v0, s[2:3] offset:-1284170; GCN-NEXT: s_waitcnt vmcnt(0)4171; GCN-NEXT: v_mov_b32_e32 v0, v14172; GCN-NEXT: ; return to shader part epilog4173;4174; GFX11-LABEL: global_load_saddr_i16_d16lo_zexti8_reg_hi_immneg128:4175; GFX11: ; %bb.0:4176; GFX11-NEXT: global_load_d16_u8 v1, v0, s[2:3] offset:-1284177; GFX11-NEXT: s_waitcnt vmcnt(0)4178; GFX11-NEXT: v_mov_b32_e32 v0, v14179; GFX11-NEXT: ; return to shader part epilog4180;4181; GFX12-LABEL: global_load_saddr_i16_d16lo_zexti8_reg_hi_immneg128:4182; GFX12: ; %bb.0:4183; GFX12-NEXT: global_load_d16_u8 v1, v0, s[2:3] offset:-1284184; GFX12-NEXT: s_wait_loadcnt 0x04185; GFX12-NEXT: v_mov_b32_e32 v0, v14186; GFX12-NEXT: ; return to shader part epilog4187 %zext.offset = zext i32 %voffset to i644188 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4189 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284190 %load = load i8, ptr addrspace(1) %gep14191 %zext.load = zext i8 %load to i164192 %build = insertelement <2 x i16> %reg, i16 %zext.load, i32 04193 %cast = bitcast <2 x i16> %build to <2 x half>4194 ret <2 x half> %cast4195}4196 4197define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_sexti8_reg_hi(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4198; GCN-LABEL: global_load_saddr_i16_d16lo_sexti8_reg_hi:4199; GCN: ; %bb.0:4200; GCN-NEXT: global_load_sbyte_d16 v1, v0, s[2:3]4201; GCN-NEXT: s_waitcnt vmcnt(0)4202; GCN-NEXT: v_mov_b32_e32 v0, v14203; GCN-NEXT: ; return to shader part epilog4204;4205; GFX11-LABEL: global_load_saddr_i16_d16lo_sexti8_reg_hi:4206; GFX11: ; %bb.0:4207; GFX11-NEXT: global_load_d16_i8 v1, v0, s[2:3]4208; GFX11-NEXT: s_waitcnt vmcnt(0)4209; GFX11-NEXT: v_mov_b32_e32 v0, v14210; GFX11-NEXT: ; return to shader part epilog4211;4212; GFX12-LABEL: global_load_saddr_i16_d16lo_sexti8_reg_hi:4213; GFX12: ; %bb.0:4214; GFX12-NEXT: global_load_d16_i8 v1, v0, s[2:3]4215; GFX12-NEXT: s_wait_loadcnt 0x04216; GFX12-NEXT: v_mov_b32_e32 v0, v14217; GFX12-NEXT: ; return to shader part epilog4218 %zext.offset = zext i32 %voffset to i644219 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4220 %load = load i8, ptr addrspace(1) %gep04221 %sext.load = sext i8 %load to i164222 %build = insertelement <2 x i16> %reg, i16 %sext.load, i32 04223 %cast = bitcast <2 x i16> %build to <2 x half>4224 ret <2 x half> %cast4225}4226 4227define amdgpu_ps <2 x half> @global_load_saddr_i16_d16lo_sexti8_reg_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4228; GCN-LABEL: global_load_saddr_i16_d16lo_sexti8_reg_hi_immneg128:4229; GCN: ; %bb.0:4230; GCN-NEXT: global_load_sbyte_d16 v1, v0, s[2:3] offset:-1284231; GCN-NEXT: s_waitcnt vmcnt(0)4232; GCN-NEXT: v_mov_b32_e32 v0, v14233; GCN-NEXT: ; return to shader part epilog4234;4235; GFX11-LABEL: global_load_saddr_i16_d16lo_sexti8_reg_hi_immneg128:4236; GFX11: ; %bb.0:4237; GFX11-NEXT: global_load_d16_i8 v1, v0, s[2:3] offset:-1284238; GFX11-NEXT: s_waitcnt vmcnt(0)4239; GFX11-NEXT: v_mov_b32_e32 v0, v14240; GFX11-NEXT: ; return to shader part epilog4241;4242; GFX12-LABEL: global_load_saddr_i16_d16lo_sexti8_reg_hi_immneg128:4243; GFX12: ; %bb.0:4244; GFX12-NEXT: global_load_d16_i8 v1, v0, s[2:3] offset:-1284245; GFX12-NEXT: s_wait_loadcnt 0x04246; GFX12-NEXT: v_mov_b32_e32 v0, v14247; GFX12-NEXT: ; return to shader part epilog4248 %zext.offset = zext i32 %voffset to i644249 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4250 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284251 %load = load i8, ptr addrspace(1) %gep14252 %sext.load = sext i8 %load to i164253 %build = insertelement <2 x i16> %reg, i16 %sext.load, i32 04254 %cast = bitcast <2 x i16> %build to <2 x half>4255 ret <2 x half> %cast4256}4257 4258; --------------------------------------------------------------------------------4259; D16 hi load (hi16)4260; --------------------------------------------------------------------------------4261 4262define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_undef_hi(ptr addrspace(1) inreg %sbase, i32 %voffset) {4263; GCN-LABEL: global_load_saddr_i16_d16hi_undef_hi:4264; GCN: ; %bb.0:4265; GCN-NEXT: global_load_short_d16_hi v0, v0, s[2:3]4266; GCN-NEXT: s_waitcnt vmcnt(0)4267; GCN-NEXT: ; return to shader part epilog4268;4269; GFX11-LABEL: global_load_saddr_i16_d16hi_undef_hi:4270; GFX11: ; %bb.0:4271; GFX11-NEXT: global_load_d16_hi_b16 v0, v0, s[2:3]4272; GFX11-NEXT: s_waitcnt vmcnt(0)4273; GFX11-NEXT: ; return to shader part epilog4274;4275; GFX12-SDAG-LABEL: global_load_saddr_i16_d16hi_undef_hi:4276; GFX12-SDAG: ; %bb.0:4277; GFX12-SDAG-NEXT: global_load_d16_hi_b16 v0, v0, s[2:3]4278; GFX12-SDAG-NEXT: s_wait_loadcnt 0x04279; GFX12-SDAG-NEXT: ; return to shader part epilog4280;4281; GFX12-GISEL-TRUE16-LABEL: global_load_saddr_i16_d16hi_undef_hi:4282; GFX12-GISEL-TRUE16: ; %bb.0:4283; GFX12-GISEL-TRUE16-NEXT: global_load_d16_hi_b16 v0, v0, s[2:3]4284; GFX12-GISEL-TRUE16-NEXT: s_wait_loadcnt 0x04285; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog4286;4287; GFX12-GISEL-FAKE16-LABEL: global_load_saddr_i16_d16hi_undef_hi:4288; GFX12-GISEL-FAKE16: ; %bb.0:4289; GFX12-GISEL-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3]4290; GFX12-GISEL-FAKE16-NEXT: s_wait_loadcnt 0x04291; GFX12-GISEL-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 16, v04292; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog4293 %zext.offset = zext i32 %voffset to i644294 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4295 %load = load i16, ptr addrspace(1) %gep04296 %build = insertelement <2 x i16> poison, i16 %load, i32 14297 %cast = bitcast <2 x i16> %build to <2 x half>4298 ret <2 x half> %cast4299}4300 4301define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_undef_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {4302; GCN-LABEL: global_load_saddr_i16_d16hi_undef_hi_immneg128:4303; GCN: ; %bb.0:4304; GCN-NEXT: global_load_short_d16_hi v0, v0, s[2:3] offset:-1284305; GCN-NEXT: s_waitcnt vmcnt(0)4306; GCN-NEXT: ; return to shader part epilog4307;4308; GFX11-LABEL: global_load_saddr_i16_d16hi_undef_hi_immneg128:4309; GFX11: ; %bb.0:4310; GFX11-NEXT: global_load_d16_hi_b16 v0, v0, s[2:3] offset:-1284311; GFX11-NEXT: s_waitcnt vmcnt(0)4312; GFX11-NEXT: ; return to shader part epilog4313;4314; GFX12-SDAG-LABEL: global_load_saddr_i16_d16hi_undef_hi_immneg128:4315; GFX12-SDAG: ; %bb.0:4316; GFX12-SDAG-NEXT: global_load_d16_hi_b16 v0, v0, s[2:3] offset:-1284317; GFX12-SDAG-NEXT: s_wait_loadcnt 0x04318; GFX12-SDAG-NEXT: ; return to shader part epilog4319;4320; GFX12-GISEL-TRUE16-LABEL: global_load_saddr_i16_d16hi_undef_hi_immneg128:4321; GFX12-GISEL-TRUE16: ; %bb.0:4322; GFX12-GISEL-TRUE16-NEXT: global_load_d16_hi_b16 v0, v0, s[2:3] offset:-1284323; GFX12-GISEL-TRUE16-NEXT: s_wait_loadcnt 0x04324; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog4325;4326; GFX12-GISEL-FAKE16-LABEL: global_load_saddr_i16_d16hi_undef_hi_immneg128:4327; GFX12-GISEL-FAKE16: ; %bb.0:4328; GFX12-GISEL-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1284329; GFX12-GISEL-FAKE16-NEXT: s_wait_loadcnt 0x04330; GFX12-GISEL-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 16, v04331; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog4332 %zext.offset = zext i32 %voffset to i644333 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4334 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284335 %load = load i16, ptr addrspace(1) %gep14336 %build = insertelement <2 x i16> poison, i16 %load, i32 14337 %cast = bitcast <2 x i16> %build to <2 x half>4338 ret <2 x half> %cast4339}4340 4341define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_zero_hi(ptr addrspace(1) inreg %sbase, i32 %voffset) {4342; GCN-LABEL: global_load_saddr_i16_d16hi_zero_hi:4343; GCN: ; %bb.0:4344; GCN-NEXT: v_mov_b32_e32 v1, 04345; GCN-NEXT: global_load_short_d16_hi v1, v0, s[2:3]4346; GCN-NEXT: s_waitcnt vmcnt(0)4347; GCN-NEXT: v_mov_b32_e32 v0, v14348; GCN-NEXT: ; return to shader part epilog4349;4350; GFX11-TRUE16-LABEL: global_load_saddr_i16_d16hi_zero_hi:4351; GFX11-TRUE16: ; %bb.0:4352; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, 04353; GFX11-TRUE16-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3]4354; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)4355; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, v14356; GFX11-TRUE16-NEXT: ; return to shader part epilog4357;4358; GFX11-FAKE16-LABEL: global_load_saddr_i16_d16hi_zero_hi:4359; GFX11-FAKE16: ; %bb.0:4360; GFX11-FAKE16-NEXT: v_mov_b32_e32 v1, 04361; GFX11-FAKE16-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3]4362; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)4363; GFX11-FAKE16-NEXT: v_mov_b32_e32 v0, v14364; GFX11-FAKE16-NEXT: ; return to shader part epilog4365;4366; GFX12-SDAG-TRUE16-LABEL: global_load_saddr_i16_d16hi_zero_hi:4367; GFX12-SDAG-TRUE16: ; %bb.0:4368; GFX12-SDAG-TRUE16-NEXT: v_mov_b16_e32 v1.l, 04369; GFX12-SDAG-TRUE16-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3]4370; GFX12-SDAG-TRUE16-NEXT: s_wait_loadcnt 0x04371; GFX12-SDAG-TRUE16-NEXT: v_mov_b32_e32 v0, v14372; GFX12-SDAG-TRUE16-NEXT: ; return to shader part epilog4373;4374; GFX12-SDAG-FAKE16-LABEL: global_load_saddr_i16_d16hi_zero_hi:4375; GFX12-SDAG-FAKE16: ; %bb.0:4376; GFX12-SDAG-FAKE16-NEXT: v_mov_b32_e32 v1, 04377; GFX12-SDAG-FAKE16-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3]4378; GFX12-SDAG-FAKE16-NEXT: s_wait_loadcnt 0x04379; GFX12-SDAG-FAKE16-NEXT: v_mov_b32_e32 v0, v14380; GFX12-SDAG-FAKE16-NEXT: ; return to shader part epilog4381;4382; GFX12-GISEL-TRUE16-LABEL: global_load_saddr_i16_d16hi_zero_hi:4383; GFX12-GISEL-TRUE16: ; %bb.0:4384; GFX12-GISEL-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3]4385; GFX12-GISEL-TRUE16-NEXT: s_wait_loadcnt 0x04386; GFX12-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, v0, 16, 04387; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog4388;4389; GFX12-GISEL-FAKE16-LABEL: global_load_saddr_i16_d16hi_zero_hi:4390; GFX12-GISEL-FAKE16: ; %bb.0:4391; GFX12-GISEL-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3]4392; GFX12-GISEL-FAKE16-NEXT: s_wait_loadcnt 0x04393; GFX12-GISEL-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 16, v04394; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog4395 %zext.offset = zext i32 %voffset to i644396 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4397 %load = load i16, ptr addrspace(1) %gep04398 %build = insertelement <2 x i16> zeroinitializer, i16 %load, i32 14399 %cast = bitcast <2 x i16> %build to <2 x half>4400 ret <2 x half> %cast4401}4402 4403define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_zero_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset) {4404; GCN-LABEL: global_load_saddr_i16_d16hi_zero_hi_immneg128:4405; GCN: ; %bb.0:4406; GCN-NEXT: v_mov_b32_e32 v1, 04407; GCN-NEXT: global_load_short_d16_hi v1, v0, s[2:3] offset:-1284408; GCN-NEXT: s_waitcnt vmcnt(0)4409; GCN-NEXT: v_mov_b32_e32 v0, v14410; GCN-NEXT: ; return to shader part epilog4411;4412; GFX11-TRUE16-LABEL: global_load_saddr_i16_d16hi_zero_hi_immneg128:4413; GFX11-TRUE16: ; %bb.0:4414; GFX11-TRUE16-NEXT: v_mov_b16_e32 v1.l, 04415; GFX11-TRUE16-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3] offset:-1284416; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)4417; GFX11-TRUE16-NEXT: v_mov_b32_e32 v0, v14418; GFX11-TRUE16-NEXT: ; return to shader part epilog4419;4420; GFX11-FAKE16-LABEL: global_load_saddr_i16_d16hi_zero_hi_immneg128:4421; GFX11-FAKE16: ; %bb.0:4422; GFX11-FAKE16-NEXT: v_mov_b32_e32 v1, 04423; GFX11-FAKE16-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3] offset:-1284424; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)4425; GFX11-FAKE16-NEXT: v_mov_b32_e32 v0, v14426; GFX11-FAKE16-NEXT: ; return to shader part epilog4427;4428; GFX12-SDAG-TRUE16-LABEL: global_load_saddr_i16_d16hi_zero_hi_immneg128:4429; GFX12-SDAG-TRUE16: ; %bb.0:4430; GFX12-SDAG-TRUE16-NEXT: v_mov_b16_e32 v1.l, 04431; GFX12-SDAG-TRUE16-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3] offset:-1284432; GFX12-SDAG-TRUE16-NEXT: s_wait_loadcnt 0x04433; GFX12-SDAG-TRUE16-NEXT: v_mov_b32_e32 v0, v14434; GFX12-SDAG-TRUE16-NEXT: ; return to shader part epilog4435;4436; GFX12-SDAG-FAKE16-LABEL: global_load_saddr_i16_d16hi_zero_hi_immneg128:4437; GFX12-SDAG-FAKE16: ; %bb.0:4438; GFX12-SDAG-FAKE16-NEXT: v_mov_b32_e32 v1, 04439; GFX12-SDAG-FAKE16-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3] offset:-1284440; GFX12-SDAG-FAKE16-NEXT: s_wait_loadcnt 0x04441; GFX12-SDAG-FAKE16-NEXT: v_mov_b32_e32 v0, v14442; GFX12-SDAG-FAKE16-NEXT: ; return to shader part epilog4443;4444; GFX12-GISEL-TRUE16-LABEL: global_load_saddr_i16_d16hi_zero_hi_immneg128:4445; GFX12-GISEL-TRUE16: ; %bb.0:4446; GFX12-GISEL-TRUE16-NEXT: global_load_d16_b16 v0, v0, s[2:3] offset:-1284447; GFX12-GISEL-TRUE16-NEXT: s_wait_loadcnt 0x04448; GFX12-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, v0, 16, 04449; GFX12-GISEL-TRUE16-NEXT: ; return to shader part epilog4450;4451; GFX12-GISEL-FAKE16-LABEL: global_load_saddr_i16_d16hi_zero_hi_immneg128:4452; GFX12-GISEL-FAKE16: ; %bb.0:4453; GFX12-GISEL-FAKE16-NEXT: global_load_u16 v0, v0, s[2:3] offset:-1284454; GFX12-GISEL-FAKE16-NEXT: s_wait_loadcnt 0x04455; GFX12-GISEL-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 16, v04456; GFX12-GISEL-FAKE16-NEXT: ; return to shader part epilog4457 %zext.offset = zext i32 %voffset to i644458 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4459 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284460 %load = load i16, ptr addrspace(1) %gep14461 %build = insertelement <2 x i16> zeroinitializer, i16 %load, i32 14462 %cast = bitcast <2 x i16> %build to <2 x half>4463 ret <2 x half> %cast4464}4465 4466define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_reg_hi(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4467; GCN-LABEL: global_load_saddr_i16_d16hi_reg_hi:4468; GCN: ; %bb.0:4469; GCN-NEXT: global_load_short_d16_hi v1, v0, s[2:3]4470; GCN-NEXT: s_waitcnt vmcnt(0)4471; GCN-NEXT: v_mov_b32_e32 v0, v14472; GCN-NEXT: ; return to shader part epilog4473;4474; GFX11-LABEL: global_load_saddr_i16_d16hi_reg_hi:4475; GFX11: ; %bb.0:4476; GFX11-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3]4477; GFX11-NEXT: s_waitcnt vmcnt(0)4478; GFX11-NEXT: v_mov_b32_e32 v0, v14479; GFX11-NEXT: ; return to shader part epilog4480;4481; GFX12-LABEL: global_load_saddr_i16_d16hi_reg_hi:4482; GFX12: ; %bb.0:4483; GFX12-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3]4484; GFX12-NEXT: s_wait_loadcnt 0x04485; GFX12-NEXT: v_mov_b32_e32 v0, v14486; GFX12-NEXT: ; return to shader part epilog4487 %zext.offset = zext i32 %voffset to i644488 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4489 %load = load i16, ptr addrspace(1) %gep04490 %build = insertelement <2 x i16> %reg, i16 %load, i32 14491 %cast = bitcast <2 x i16> %build to <2 x half>4492 ret <2 x half> %cast4493}4494 4495define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_reg_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4496; GCN-LABEL: global_load_saddr_i16_d16hi_reg_hi_immneg128:4497; GCN: ; %bb.0:4498; GCN-NEXT: global_load_short_d16_hi v1, v0, s[2:3] offset:-1284499; GCN-NEXT: s_waitcnt vmcnt(0)4500; GCN-NEXT: v_mov_b32_e32 v0, v14501; GCN-NEXT: ; return to shader part epilog4502;4503; GFX11-LABEL: global_load_saddr_i16_d16hi_reg_hi_immneg128:4504; GFX11: ; %bb.0:4505; GFX11-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3] offset:-1284506; GFX11-NEXT: s_waitcnt vmcnt(0)4507; GFX11-NEXT: v_mov_b32_e32 v0, v14508; GFX11-NEXT: ; return to shader part epilog4509;4510; GFX12-LABEL: global_load_saddr_i16_d16hi_reg_hi_immneg128:4511; GFX12: ; %bb.0:4512; GFX12-NEXT: global_load_d16_hi_b16 v1, v0, s[2:3] offset:-1284513; GFX12-NEXT: s_wait_loadcnt 0x04514; GFX12-NEXT: v_mov_b32_e32 v0, v14515; GFX12-NEXT: ; return to shader part epilog4516 %zext.offset = zext i32 %voffset to i644517 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4518 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284519 %load = load i16, ptr addrspace(1) %gep14520 %build = insertelement <2 x i16> %reg, i16 %load, i32 14521 %cast = bitcast <2 x i16> %build to <2 x half>4522 ret <2 x half> %cast4523}4524 4525define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_zexti8_reg_hi(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4526; GCN-LABEL: global_load_saddr_i16_d16hi_zexti8_reg_hi:4527; GCN: ; %bb.0:4528; GCN-NEXT: global_load_ubyte_d16_hi v1, v0, s[2:3]4529; GCN-NEXT: s_waitcnt vmcnt(0)4530; GCN-NEXT: v_mov_b32_e32 v0, v14531; GCN-NEXT: ; return to shader part epilog4532;4533; GFX11-LABEL: global_load_saddr_i16_d16hi_zexti8_reg_hi:4534; GFX11: ; %bb.0:4535; GFX11-NEXT: global_load_d16_hi_u8 v1, v0, s[2:3]4536; GFX11-NEXT: s_waitcnt vmcnt(0)4537; GFX11-NEXT: v_mov_b32_e32 v0, v14538; GFX11-NEXT: ; return to shader part epilog4539;4540; GFX12-LABEL: global_load_saddr_i16_d16hi_zexti8_reg_hi:4541; GFX12: ; %bb.0:4542; GFX12-NEXT: global_load_d16_hi_u8 v1, v0, s[2:3]4543; GFX12-NEXT: s_wait_loadcnt 0x04544; GFX12-NEXT: v_mov_b32_e32 v0, v14545; GFX12-NEXT: ; return to shader part epilog4546 %zext.offset = zext i32 %voffset to i644547 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4548 %load = load i8, ptr addrspace(1) %gep04549 %zext.load = zext i8 %load to i164550 %build = insertelement <2 x i16> %reg, i16 %zext.load, i32 14551 %cast = bitcast <2 x i16> %build to <2 x half>4552 ret <2 x half> %cast4553}4554 4555define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_zexti8_reg_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4556; GCN-LABEL: global_load_saddr_i16_d16hi_zexti8_reg_hi_immneg128:4557; GCN: ; %bb.0:4558; GCN-NEXT: global_load_ubyte_d16_hi v1, v0, s[2:3] offset:-1284559; GCN-NEXT: s_waitcnt vmcnt(0)4560; GCN-NEXT: v_mov_b32_e32 v0, v14561; GCN-NEXT: ; return to shader part epilog4562;4563; GFX11-LABEL: global_load_saddr_i16_d16hi_zexti8_reg_hi_immneg128:4564; GFX11: ; %bb.0:4565; GFX11-NEXT: global_load_d16_hi_u8 v1, v0, s[2:3] offset:-1284566; GFX11-NEXT: s_waitcnt vmcnt(0)4567; GFX11-NEXT: v_mov_b32_e32 v0, v14568; GFX11-NEXT: ; return to shader part epilog4569;4570; GFX12-LABEL: global_load_saddr_i16_d16hi_zexti8_reg_hi_immneg128:4571; GFX12: ; %bb.0:4572; GFX12-NEXT: global_load_d16_hi_u8 v1, v0, s[2:3] offset:-1284573; GFX12-NEXT: s_wait_loadcnt 0x04574; GFX12-NEXT: v_mov_b32_e32 v0, v14575; GFX12-NEXT: ; return to shader part epilog4576 %zext.offset = zext i32 %voffset to i644577 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4578 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284579 %load = load i8, ptr addrspace(1) %gep14580 %zext.load = zext i8 %load to i164581 %build = insertelement <2 x i16> %reg, i16 %zext.load, i32 14582 %cast = bitcast <2 x i16> %build to <2 x half>4583 ret <2 x half> %cast4584}4585 4586define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_sexti8_reg_hi(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4587; GCN-LABEL: global_load_saddr_i16_d16hi_sexti8_reg_hi:4588; GCN: ; %bb.0:4589; GCN-NEXT: global_load_sbyte_d16_hi v1, v0, s[2:3]4590; GCN-NEXT: s_waitcnt vmcnt(0)4591; GCN-NEXT: v_mov_b32_e32 v0, v14592; GCN-NEXT: ; return to shader part epilog4593;4594; GFX11-LABEL: global_load_saddr_i16_d16hi_sexti8_reg_hi:4595; GFX11: ; %bb.0:4596; GFX11-NEXT: global_load_d16_hi_i8 v1, v0, s[2:3]4597; GFX11-NEXT: s_waitcnt vmcnt(0)4598; GFX11-NEXT: v_mov_b32_e32 v0, v14599; GFX11-NEXT: ; return to shader part epilog4600;4601; GFX12-LABEL: global_load_saddr_i16_d16hi_sexti8_reg_hi:4602; GFX12: ; %bb.0:4603; GFX12-NEXT: global_load_d16_hi_i8 v1, v0, s[2:3]4604; GFX12-NEXT: s_wait_loadcnt 0x04605; GFX12-NEXT: v_mov_b32_e32 v0, v14606; GFX12-NEXT: ; return to shader part epilog4607 %zext.offset = zext i32 %voffset to i644608 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4609 %load = load i8, ptr addrspace(1) %gep04610 %sext.load = sext i8 %load to i164611 %build = insertelement <2 x i16> %reg, i16 %sext.load, i32 14612 %cast = bitcast <2 x i16> %build to <2 x half>4613 ret <2 x half> %cast4614}4615 4616define amdgpu_ps <2 x half> @global_load_saddr_i16_d16hi_sexti8_reg_hi_immneg128(ptr addrspace(1) inreg %sbase, i32 %voffset, <2 x i16> %reg) {4617; GCN-LABEL: global_load_saddr_i16_d16hi_sexti8_reg_hi_immneg128:4618; GCN: ; %bb.0:4619; GCN-NEXT: global_load_sbyte_d16_hi v1, v0, s[2:3] offset:-1284620; GCN-NEXT: s_waitcnt vmcnt(0)4621; GCN-NEXT: v_mov_b32_e32 v0, v14622; GCN-NEXT: ; return to shader part epilog4623;4624; GFX11-LABEL: global_load_saddr_i16_d16hi_sexti8_reg_hi_immneg128:4625; GFX11: ; %bb.0:4626; GFX11-NEXT: global_load_d16_hi_i8 v1, v0, s[2:3] offset:-1284627; GFX11-NEXT: s_waitcnt vmcnt(0)4628; GFX11-NEXT: v_mov_b32_e32 v0, v14629; GFX11-NEXT: ; return to shader part epilog4630;4631; GFX12-LABEL: global_load_saddr_i16_d16hi_sexti8_reg_hi_immneg128:4632; GFX12: ; %bb.0:4633; GFX12-NEXT: global_load_d16_hi_i8 v1, v0, s[2:3] offset:-1284634; GFX12-NEXT: s_wait_loadcnt 0x04635; GFX12-NEXT: v_mov_b32_e32 v0, v14636; GFX12-NEXT: ; return to shader part epilog4637 %zext.offset = zext i32 %voffset to i644638 %gep0 = getelementptr inbounds i8, ptr addrspace(1) %sbase, i64 %zext.offset4639 %gep1 = getelementptr inbounds i8, ptr addrspace(1) %gep0, i64 -1284640 %load = load i8, ptr addrspace(1) %gep14641 %sext.load = sext i8 %load to i164642 %build = insertelement <2 x i16> %reg, i16 %sext.load, i32 14643 %cast = bitcast <2 x i16> %build to <2 x half>4644 ret <2 x half> %cast4645}4646 4647; --------------------------------------------------------------------------------4648; or-with-constant as add4649; --------------------------------------------------------------------------------4650 4651; Check add-as-or with split 64-bit or.4652define amdgpu_ps float @global_load_saddr_i8_offset_or_i64_imm_offset_16(ptr addrspace(6) inreg %sbase, i32 %idx) {4653; GCN-LABEL: global_load_saddr_i8_offset_or_i64_imm_offset_16:4654; GCN: ; %bb.0:4655; GCN-NEXT: v_or_b32_e32 v0, 16, v04656; GCN-NEXT: v_mov_b32_e32 v1, 04657; GCN-NEXT: global_load_ubyte v0, v[0:1], off4658; GCN-NEXT: s_waitcnt vmcnt(0)4659; GCN-NEXT: ; return to shader part epilog4660;4661; GFX11-LABEL: global_load_saddr_i8_offset_or_i64_imm_offset_16:4662; GFX11: ; %bb.0:4663; GFX11-NEXT: v_or_b32_e32 v0, 16, v04664; GFX11-NEXT: v_mov_b32_e32 v1, 04665; GFX11-NEXT: global_load_u8 v0, v[0:1], off4666; GFX11-NEXT: s_waitcnt vmcnt(0)4667; GFX11-NEXT: ; return to shader part epilog4668;4669; GFX12-LABEL: global_load_saddr_i8_offset_or_i64_imm_offset_16:4670; GFX12: ; %bb.0:4671; GFX12-NEXT: v_or_b32_e32 v0, 16, v04672; GFX12-NEXT: v_mov_b32_e32 v1, 04673; GFX12-NEXT: global_load_u8 v0, v[0:1], off4674; GFX12-NEXT: s_wait_loadcnt 0x04675; GFX12-NEXT: ; return to shader part epilog4676 %zext.idx = zext i32 %idx to i644677 %or = or i64 %zext.idx, 164678 %addr = inttoptr i64 %or to ptr addrspace(1)4679 %load = load i8, ptr addrspace(1) %addr4680 %zext = zext i8 %load to i324681 %to.vgpr = bitcast i32 %zext to float4682 ret float %to.vgpr4683}4684 4685define amdgpu_ps float @global_load_saddr_i8_offset_or_i64_imm_offset_4160(ptr addrspace(6) inreg %sbase, i32 %idx) {4686; GCN-LABEL: global_load_saddr_i8_offset_or_i64_imm_offset_4160:4687; GCN: ; %bb.0:4688; GCN-NEXT: v_or_b32_e32 v0, 0x1040, v04689; GCN-NEXT: v_mov_b32_e32 v1, 04690; GCN-NEXT: global_load_ubyte v0, v[0:1], off4691; GCN-NEXT: s_waitcnt vmcnt(0)4692; GCN-NEXT: ; return to shader part epilog4693;4694; GFX11-LABEL: global_load_saddr_i8_offset_or_i64_imm_offset_4160:4695; GFX11: ; %bb.0:4696; GFX11-NEXT: v_or_b32_e32 v0, 0x1040, v04697; GFX11-NEXT: v_mov_b32_e32 v1, 04698; GFX11-NEXT: global_load_u8 v0, v[0:1], off4699; GFX11-NEXT: s_waitcnt vmcnt(0)4700; GFX11-NEXT: ; return to shader part epilog4701;4702; GFX12-LABEL: global_load_saddr_i8_offset_or_i64_imm_offset_4160:4703; GFX12: ; %bb.0:4704; GFX12-NEXT: v_or_b32_e32 v0, 0x1040, v04705; GFX12-NEXT: v_mov_b32_e32 v1, 04706; GFX12-NEXT: global_load_u8 v0, v[0:1], off4707; GFX12-NEXT: s_wait_loadcnt 0x04708; GFX12-NEXT: ; return to shader part epilog4709 %zext.idx = zext i32 %idx to i644710 %or = or i64 %zext.idx, 41604711 %addr = inttoptr i64 %or to ptr addrspace(1)4712 %load = load i8, ptr addrspace(1) %addr4713 %zext = zext i8 %load to i324714 %to.vgpr = bitcast i32 %zext to float4715 ret float %to.vgpr4716}4717 4718; --------------------------------------------------------------------------------4719; Full 64-bit scalar add.4720; --------------------------------------------------------------------------------4721 4722define amdgpu_ps void @global_addr_64bit_lsr_iv(ptr addrspace(1) inreg %arg) {4723; GFX9-LABEL: global_addr_64bit_lsr_iv:4724; GFX9: ; %bb.0: ; %bb4725; GFX9-NEXT: s_mov_b64 s[0:1], 04726; GFX9-NEXT: v_mov_b32_e32 v0, 04727; GFX9-NEXT: .LBB132_1: ; %bb34728; GFX9-NEXT: ; =>This Inner Loop Header: Depth=14729; GFX9-NEXT: s_add_u32 s4, s2, s04730; GFX9-NEXT: s_addc_u32 s5, s3, s14731; GFX9-NEXT: global_load_dword v1, v0, s[4:5] glc4732; GFX9-NEXT: s_waitcnt vmcnt(0)4733; GFX9-NEXT: s_add_u32 s0, s0, 44734; GFX9-NEXT: s_addc_u32 s1, s1, 04735; GFX9-NEXT: s_cmpk_eq_i32 s0, 0x4004736; GFX9-NEXT: s_cbranch_scc0 .LBB132_14737; GFX9-NEXT: ; %bb.2: ; %bb24738; GFX9-NEXT: s_endpgm4739;4740; GFX10-LABEL: global_addr_64bit_lsr_iv:4741; GFX10: ; %bb.0: ; %bb4742; GFX10-NEXT: v_mov_b32_e32 v0, 04743; GFX10-NEXT: s_mov_b64 s[0:1], 04744; GFX10-NEXT: .LBB132_1: ; %bb34745; GFX10-NEXT: ; =>This Inner Loop Header: Depth=14746; GFX10-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)4747; GFX10-NEXT: s_add_u32 s4, s2, s04748; GFX10-NEXT: s_addc_u32 s5, s3, s14749; GFX10-NEXT: s_add_u32 s0, s0, 44750; GFX10-NEXT: global_load_dword v1, v0, s[4:5] glc dlc4751; GFX10-NEXT: s_waitcnt vmcnt(0)4752; GFX10-NEXT: s_addc_u32 s1, s1, 04753; GFX10-NEXT: s_cmpk_eq_i32 s0, 0x4004754; GFX10-NEXT: s_cbranch_scc0 .LBB132_14755; GFX10-NEXT: ; %bb.2: ; %bb24756; GFX10-NEXT: s_endpgm4757;4758; GFX11-LABEL: global_addr_64bit_lsr_iv:4759; GFX11: ; %bb.0: ; %bb4760; GFX11-NEXT: v_mov_b32_e32 v0, 04761; GFX11-NEXT: s_mov_b64 s[0:1], 04762; GFX11-NEXT: .LBB132_1: ; %bb34763; GFX11-NEXT: ; =>This Inner Loop Header: Depth=14764; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)4765; GFX11-NEXT: s_add_u32 s4, s2, s04766; GFX11-NEXT: s_addc_u32 s5, s3, s14767; GFX11-NEXT: s_add_u32 s0, s0, 44768; GFX11-NEXT: global_load_b32 v1, v0, s[4:5] glc dlc4769; GFX11-NEXT: s_waitcnt vmcnt(0)4770; GFX11-NEXT: s_addc_u32 s1, s1, 04771; GFX11-NEXT: s_cmpk_eq_i32 s0, 0x4004772; GFX11-NEXT: s_cbranch_scc0 .LBB132_14773; GFX11-NEXT: ; %bb.2: ; %bb24774; GFX11-NEXT: s_endpgm4775;4776; GFX12-SDAG-LABEL: global_addr_64bit_lsr_iv:4777; GFX12-SDAG: ; %bb.0: ; %bb4778; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 04779; GFX12-SDAG-NEXT: s_mov_b64 s[0:1], 04780; GFX12-SDAG-NEXT: .LBB132_1: ; %bb34781; GFX12-SDAG-NEXT: ; =>This Inner Loop Header: Depth=14782; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)4783; GFX12-SDAG-NEXT: s_add_nc_u64 s[4:5], s[2:3], s[0:1]4784; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], 44785; GFX12-SDAG-NEXT: global_load_b32 v1, v0, s[4:5] scope:SCOPE_SYS4786; GFX12-SDAG-NEXT: s_wait_loadcnt 0x04787; GFX12-SDAG-NEXT: s_cmp_eq_u32 s0, 0x4004788; GFX12-SDAG-NEXT: s_cbranch_scc0 .LBB132_14789; GFX12-SDAG-NEXT: ; %bb.2: ; %bb24790; GFX12-SDAG-NEXT: s_endpgm4791;4792; GFX12-GISEL-LABEL: global_addr_64bit_lsr_iv:4793; GFX12-GISEL: ; %bb.0: ; %bb4794; GFX12-GISEL-NEXT: s_mov_b64 s[0:1], 04795; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s24796; GFX12-GISEL-NEXT: v_mov_b32_e32 v3, s14797; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, s34798; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s04799; GFX12-GISEL-NEXT: .LBB132_1: ; %bb34800; GFX12-GISEL-NEXT: ; =>This Inner Loop Header: Depth=14801; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_3)4802; GFX12-GISEL-NEXT: v_add_co_u32 v4, vcc, v0, v24803; GFX12-GISEL-NEXT: s_wait_alu depctr_va_vcc(0)4804; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v5, null, v1, v3, vcc4805; GFX12-GISEL-NEXT: v_add_co_u32 v2, vcc, v2, 44806; GFX12-GISEL-NEXT: s_wait_alu depctr_va_vcc(0)4807; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v3, null, 0, v3, vcc4808; GFX12-GISEL-NEXT: global_load_b32 v4, v[4:5], off scope:SCOPE_SYS4809; GFX12-GISEL-NEXT: s_wait_loadcnt 0x04810; GFX12-GISEL-NEXT: v_cmp_eq_u32_e32 vcc, 0x400, v24811; GFX12-GISEL-NEXT: s_cbranch_vccz .LBB132_14812; GFX12-GISEL-NEXT: ; %bb.2: ; %bb24813; GFX12-GISEL-NEXT: s_endpgm4814bb:4815 br label %bb34816 4817bb2: ; preds = %bb34818 ret void4819 4820bb3: ; preds = %bb3, %bb4821 %i = phi i32 [ 0, %bb ], [ %i8, %bb3 ]4822 %i4 = zext i32 %i to i644823 %i5 = getelementptr inbounds float, ptr addrspace(1) %arg, i64 %i44824 %i6 = load volatile float, ptr addrspace(1) %i5, align 44825 %i8 = add nuw nsw i32 %i, 14826 %i9 = icmp eq i32 %i8, 2564827 br i1 %i9, label %bb2, label %bb34828}4829 4830; Make sure we only have a single zero vaddr initialization.4831 4832define amdgpu_ps void @global_addr_64bit_lsr_iv_multiload(ptr addrspace(1) inreg %arg, ptr addrspace(1) inreg %arg.1) {4833; GFX9-LABEL: global_addr_64bit_lsr_iv_multiload:4834; GFX9: ; %bb.0: ; %bb4835; GFX9-NEXT: s_mov_b64 s[0:1], 04836; GFX9-NEXT: v_mov_b32_e32 v0, 04837; GFX9-NEXT: .LBB133_1: ; %bb34838; GFX9-NEXT: ; =>This Inner Loop Header: Depth=14839; GFX9-NEXT: s_add_u32 s4, s2, s04840; GFX9-NEXT: s_addc_u32 s5, s3, s14841; GFX9-NEXT: global_load_dword v1, v0, s[4:5] glc4842; GFX9-NEXT: s_waitcnt vmcnt(0)4843; GFX9-NEXT: global_load_dword v1, v0, s[4:5] glc4844; GFX9-NEXT: s_waitcnt vmcnt(0)4845; GFX9-NEXT: s_add_u32 s0, s0, 44846; GFX9-NEXT: s_addc_u32 s1, s1, 04847; GFX9-NEXT: s_cmpk_eq_i32 s0, 0x4004848; GFX9-NEXT: ; kill: killed $sgpr4 killed $sgpr54849; GFX9-NEXT: s_cbranch_scc0 .LBB133_14850; GFX9-NEXT: ; %bb.2: ; %bb24851; GFX9-NEXT: s_endpgm4852;4853; GFX10-LABEL: global_addr_64bit_lsr_iv_multiload:4854; GFX10: ; %bb.0: ; %bb4855; GFX10-NEXT: v_mov_b32_e32 v0, 04856; GFX10-NEXT: s_mov_b64 s[0:1], 04857; GFX10-NEXT: .LBB133_1: ; %bb34858; GFX10-NEXT: ; =>This Inner Loop Header: Depth=14859; GFX10-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)4860; GFX10-NEXT: s_add_u32 s4, s2, s04861; GFX10-NEXT: s_addc_u32 s5, s3, s14862; GFX10-NEXT: s_add_u32 s0, s0, 44863; GFX10-NEXT: global_load_dword v1, v0, s[4:5] glc dlc4864; GFX10-NEXT: s_waitcnt vmcnt(0)4865; GFX10-NEXT: global_load_dword v1, v0, s[4:5] glc dlc4866; GFX10-NEXT: s_waitcnt vmcnt(0)4867; GFX10-NEXT: s_addc_u32 s1, s1, 04868; GFX10-NEXT: s_cmpk_eq_i32 s0, 0x4004869; GFX10-NEXT: ; kill: killed $sgpr4 killed $sgpr54870; GFX10-NEXT: s_cbranch_scc0 .LBB133_14871; GFX10-NEXT: ; %bb.2: ; %bb24872; GFX10-NEXT: s_endpgm4873;4874; GFX11-LABEL: global_addr_64bit_lsr_iv_multiload:4875; GFX11: ; %bb.0: ; %bb4876; GFX11-NEXT: v_mov_b32_e32 v0, 04877; GFX11-NEXT: s_mov_b64 s[0:1], 04878; GFX11-NEXT: .LBB133_1: ; %bb34879; GFX11-NEXT: ; =>This Inner Loop Header: Depth=14880; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)4881; GFX11-NEXT: s_add_u32 s4, s2, s04882; GFX11-NEXT: s_addc_u32 s5, s3, s14883; GFX11-NEXT: s_add_u32 s0, s0, 44884; GFX11-NEXT: global_load_b32 v1, v0, s[4:5] glc dlc4885; GFX11-NEXT: s_waitcnt vmcnt(0)4886; GFX11-NEXT: global_load_b32 v1, v0, s[4:5] glc dlc4887; GFX11-NEXT: s_waitcnt vmcnt(0)4888; GFX11-NEXT: s_addc_u32 s1, s1, 04889; GFX11-NEXT: s_cmpk_eq_i32 s0, 0x4004890; GFX11-NEXT: s_cbranch_scc0 .LBB133_14891; GFX11-NEXT: ; %bb.2: ; %bb24892; GFX11-NEXT: s_endpgm4893;4894; GFX12-SDAG-LABEL: global_addr_64bit_lsr_iv_multiload:4895; GFX12-SDAG: ; %bb.0: ; %bb4896; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, 04897; GFX12-SDAG-NEXT: s_mov_b64 s[0:1], 04898; GFX12-SDAG-NEXT: .LBB133_1: ; %bb34899; GFX12-SDAG-NEXT: ; =>This Inner Loop Header: Depth=14900; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)4901; GFX12-SDAG-NEXT: s_add_nc_u64 s[4:5], s[2:3], s[0:1]4902; GFX12-SDAG-NEXT: s_add_nc_u64 s[0:1], s[0:1], 44903; GFX12-SDAG-NEXT: global_load_b32 v1, v0, s[4:5] scope:SCOPE_SYS4904; GFX12-SDAG-NEXT: s_wait_loadcnt 0x04905; GFX12-SDAG-NEXT: global_load_b32 v1, v0, s[4:5] scope:SCOPE_SYS4906; GFX12-SDAG-NEXT: s_wait_loadcnt 0x04907; GFX12-SDAG-NEXT: s_cmp_eq_u32 s0, 0x4004908; GFX12-SDAG-NEXT: s_cbranch_scc0 .LBB133_14909; GFX12-SDAG-NEXT: ; %bb.2: ; %bb24910; GFX12-SDAG-NEXT: s_endpgm4911;4912; GFX12-GISEL-LABEL: global_addr_64bit_lsr_iv_multiload:4913; GFX12-GISEL: ; %bb.0: ; %bb4914; GFX12-GISEL-NEXT: s_mov_b64 s[0:1], 04915; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s24916; GFX12-GISEL-NEXT: v_mov_b32_e32 v3, s14917; GFX12-GISEL-NEXT: v_mov_b32_e32 v1, s34918; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s04919; GFX12-GISEL-NEXT: .LBB133_1: ; %bb34920; GFX12-GISEL-NEXT: ; =>This Inner Loop Header: Depth=14921; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_3)4922; GFX12-GISEL-NEXT: v_add_co_u32 v4, vcc, v0, v24923; GFX12-GISEL-NEXT: s_wait_alu depctr_va_vcc(0)4924; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v5, null, v1, v3, vcc4925; GFX12-GISEL-NEXT: v_add_co_u32 v2, vcc, v2, 44926; GFX12-GISEL-NEXT: s_wait_alu depctr_va_vcc(0)4927; GFX12-GISEL-NEXT: v_add_co_ci_u32_e64 v3, null, 0, v3, vcc4928; GFX12-GISEL-NEXT: global_load_b32 v6, v[4:5], off scope:SCOPE_SYS4929; GFX12-GISEL-NEXT: s_wait_loadcnt 0x04930; GFX12-GISEL-NEXT: global_load_b32 v4, v[4:5], off scope:SCOPE_SYS4931; GFX12-GISEL-NEXT: s_wait_loadcnt 0x04932; GFX12-GISEL-NEXT: v_cmp_eq_u32_e32 vcc, 0x400, v24933; GFX12-GISEL-NEXT: s_cbranch_vccz .LBB133_14934; GFX12-GISEL-NEXT: ; %bb.2: ; %bb24935; GFX12-GISEL-NEXT: s_endpgm4936bb:4937 br label %bb34938 4939bb2: ; preds = %bb34940 ret void4941 4942bb3: ; preds = %bb3, %bb4943 %i = phi i32 [ 0, %bb ], [ %i8, %bb3 ]4944 %i4 = zext i32 %i to i644945 %i5 = getelementptr inbounds float, ptr addrspace(1) %arg, i64 %i44946 %i6 = load volatile float, ptr addrspace(1) %i5, align 44947 %i5.1 = getelementptr inbounds float, ptr addrspace(1) %arg.1, i64 %i44948 %i6.1 = load volatile float, ptr addrspace(1) %i5, align 44949 %i8 = add nuw nsw i32 %i, 14950 %i9 = icmp eq i32 %i8, 2564951 br i1 %i9, label %bb2, label %bb34952}4953 4954!0 = !{i32 0, i32 1073741824} ; (1 << 30)4955!1 = !{i32 0, i32 1073741825} ; (1 << 30) + 14956