1456 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2;RUN: llc < %s -mtriple=amdgcn -mcpu=verde | FileCheck %s --check-prefixes=PREGFX103;RUN: llc < %s -mtriple=amdgcn -mcpu=tonga | FileCheck %s --check-prefixes=PREGFX104;RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1010 | FileCheck %s --check-prefixes=GFX105;RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 | FileCheck %s --check-prefixes=GFX116;RUN: llc < %s -mtriple=amdgcn -mcpu=gfx1200 -amdgpu-enable-delay-alu=0 | FileCheck %s --check-prefixes=GFX12,GFX12-SDAG7;RUN: llc < %s -global-isel -mtriple=amdgcn -mcpu=gfx1200 -amdgpu-enable-delay-alu=0 | FileCheck %s --check-prefixes=GFX12,GFX12-GISEL8 9define amdgpu_ps {<4 x float>, <4 x float>, <4 x float>} @buffer_load(<4 x i32> inreg) {10; PREGFX10-LABEL: buffer_load:11; PREGFX10: ; %bb.0: ; %main_body12; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 013; PREGFX10-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 glc14; PREGFX10-NEXT: buffer_load_dwordx4 v[8:11], off, s[0:3], 0 slc15; PREGFX10-NEXT: s_waitcnt vmcnt(0)16; PREGFX10-NEXT: ; return to shader part epilog17;18; GFX10-LABEL: buffer_load:19; GFX10: ; %bb.0: ; %main_body20; GFX10-NEXT: s_clause 0x221; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 022; GFX10-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 glc23; GFX10-NEXT: buffer_load_dwordx4 v[8:11], off, s[0:3], 0 slc24; GFX10-NEXT: s_waitcnt vmcnt(0)25; GFX10-NEXT: ; return to shader part epilog26;27; GFX11-LABEL: buffer_load:28; GFX11: ; %bb.0: ; %main_body29; GFX11-NEXT: s_clause 0x230; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 031; GFX11-NEXT: buffer_load_b128 v[4:7], off, s[0:3], 0 glc32; GFX11-NEXT: buffer_load_b128 v[8:11], off, s[0:3], 0 slc33; GFX11-NEXT: s_waitcnt vmcnt(0)34; GFX11-NEXT: ; return to shader part epilog35;36; GFX12-LABEL: buffer_load:37; GFX12: ; %bb.0: ; %main_body38; GFX12-NEXT: s_clause 0x239; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null40; GFX12-NEXT: buffer_load_b128 v[4:7], off, s[0:3], null th:TH_LOAD_NT41; GFX12-NEXT: buffer_load_b128 v[8:11], off, s[0:3], null th:TH_LOAD_HT42; GFX12-NEXT: s_wait_loadcnt 0x043; GFX12-NEXT: ; return to shader part epilog44main_body:45 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 0, i32 0, i32 0)46 %data_glc = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 0, i32 0, i32 1)47 %data_slc = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 0, i32 0, i32 2)48 %r0 = insertvalue {<4 x float>, <4 x float>, <4 x float>} poison, <4 x float> %data, 049 %r1 = insertvalue {<4 x float>, <4 x float>, <4 x float>} %r0, <4 x float> %data_glc, 150 %r2 = insertvalue {<4 x float>, <4 x float>, <4 x float>} %r1, <4 x float> %data_slc, 251 ret {<4 x float>, <4 x float>, <4 x float>} %r252}53 54define amdgpu_ps {<4 x float>, <4 x float>, <4 x float>} @buffer_load_dlc(<4 x i32> inreg) {55; PREGFX10-LABEL: buffer_load_dlc:56; PREGFX10: ; %bb.0: ; %main_body57; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 058; PREGFX10-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 glc59; PREGFX10-NEXT: buffer_load_dwordx4 v[8:11], off, s[0:3], 0 slc60; PREGFX10-NEXT: s_waitcnt vmcnt(0)61; PREGFX10-NEXT: ; return to shader part epilog62;63; GFX10-LABEL: buffer_load_dlc:64; GFX10: ; %bb.0: ; %main_body65; GFX10-NEXT: s_clause 0x266; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 dlc67; GFX10-NEXT: buffer_load_dwordx4 v[4:7], off, s[0:3], 0 glc dlc68; GFX10-NEXT: buffer_load_dwordx4 v[8:11], off, s[0:3], 0 slc dlc69; GFX10-NEXT: s_waitcnt vmcnt(0)70; GFX10-NEXT: ; return to shader part epilog71;72; GFX11-LABEL: buffer_load_dlc:73; GFX11: ; %bb.0: ; %main_body74; GFX11-NEXT: s_clause 0x275; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0 dlc76; GFX11-NEXT: buffer_load_b128 v[4:7], off, s[0:3], 0 glc dlc77; GFX11-NEXT: buffer_load_b128 v[8:11], off, s[0:3], 0 slc dlc78; GFX11-NEXT: s_waitcnt vmcnt(0)79; GFX11-NEXT: ; return to shader part epilog80;81; GFX12-LABEL: buffer_load_dlc:82; GFX12: ; %bb.0: ; %main_body83; GFX12-NEXT: s_clause 0x284; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null th:TH_LOAD_NT_RT85; GFX12-NEXT: buffer_load_b128 v[4:7], off, s[0:3], null th:TH_LOAD_RT_NT86; GFX12-NEXT: buffer_load_b128 v[8:11], off, s[0:3], null th:TH_LOAD_NT_HT87; GFX12-NEXT: s_wait_loadcnt 0x088; GFX12-NEXT: ; return to shader part epilog89main_body:90 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 0, i32 0, i32 4)91 %data_glc = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 0, i32 0, i32 5)92 %data_slc = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 0, i32 0, i32 6)93 %r0 = insertvalue {<4 x float>, <4 x float>, <4 x float>} poison, <4 x float> %data, 094 %r1 = insertvalue {<4 x float>, <4 x float>, <4 x float>} %r0, <4 x float> %data_glc, 195 %r2 = insertvalue {<4 x float>, <4 x float>, <4 x float>} %r1, <4 x float> %data_slc, 296 ret {<4 x float>, <4 x float>, <4 x float>} %r297}98 99define amdgpu_ps <4 x float> @buffer_load_immoffs(<4 x i32> inreg) {100; PREGFX10-LABEL: buffer_load_immoffs:101; PREGFX10: ; %bb.0: ; %main_body102; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:40103; PREGFX10-NEXT: s_waitcnt vmcnt(0)104; PREGFX10-NEXT: ; return to shader part epilog105;106; GFX10-LABEL: buffer_load_immoffs:107; GFX10: ; %bb.0: ; %main_body108; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:40109; GFX10-NEXT: s_waitcnt vmcnt(0)110; GFX10-NEXT: ; return to shader part epilog111;112; GFX11-LABEL: buffer_load_immoffs:113; GFX11: ; %bb.0: ; %main_body114; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0 offset:40115; GFX11-NEXT: s_waitcnt vmcnt(0)116; GFX11-NEXT: ; return to shader part epilog117;118; GFX12-LABEL: buffer_load_immoffs:119; GFX12: ; %bb.0: ; %main_body120; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:40121; GFX12-NEXT: s_wait_loadcnt 0x0122; GFX12-NEXT: ; return to shader part epilog123main_body:124 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 40, i32 0, i32 0)125 ret <4 x float> %data126}127 128define amdgpu_ps <4 x float> @buffer_load_immoffs_large(<4 x i32> inreg) {129; PREGFX10-LABEL: buffer_load_immoffs_large:130; PREGFX10: ; %bb.0: ; %main_body131; PREGFX10-NEXT: s_movk_i32 s4, 0x1ffc132; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], s4 offset:4133; PREGFX10-NEXT: s_waitcnt vmcnt(0)134; PREGFX10-NEXT: ; return to shader part epilog135;136; GFX10-LABEL: buffer_load_immoffs_large:137; GFX10: ; %bb.0: ; %main_body138; GFX10-NEXT: s_movk_i32 s4, 0x1ffc139; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], s4 offset:4140; GFX10-NEXT: s_waitcnt vmcnt(0)141; GFX10-NEXT: ; return to shader part epilog142;143; GFX11-LABEL: buffer_load_immoffs_large:144; GFX11: ; %bb.0: ; %main_body145; GFX11-NEXT: s_movk_i32 s4, 0x1ffc146; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], s4 offset:4147; GFX11-NEXT: s_waitcnt vmcnt(0)148; GFX11-NEXT: ; return to shader part epilog149;150; GFX12-LABEL: buffer_load_immoffs_large:151; GFX12: ; %bb.0: ; %main_body152; GFX12-NEXT: s_movk_i32 s4, 0x1ffc153; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], s4 offset:4154; GFX12-NEXT: s_wait_loadcnt 0x0155; GFX12-NEXT: ; return to shader part epilog156main_body:157 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 4, i32 8188, i32 0)158 ret <4 x float> %data159}160 161define amdgpu_ps <4 x float> @buffer_load_ofs(<4 x i32> inreg, i32) {162; PREGFX10-LABEL: buffer_load_ofs:163; PREGFX10: ; %bb.0: ; %main_body164; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen165; PREGFX10-NEXT: s_waitcnt vmcnt(0)166; PREGFX10-NEXT: ; return to shader part epilog167;168; GFX10-LABEL: buffer_load_ofs:169; GFX10: ; %bb.0: ; %main_body170; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen171; GFX10-NEXT: s_waitcnt vmcnt(0)172; GFX10-NEXT: ; return to shader part epilog173;174; GFX11-LABEL: buffer_load_ofs:175; GFX11: ; %bb.0: ; %main_body176; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen177; GFX11-NEXT: s_waitcnt vmcnt(0)178; GFX11-NEXT: ; return to shader part epilog179;180; GFX12-LABEL: buffer_load_ofs:181; GFX12: ; %bb.0: ; %main_body182; GFX12-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], null offen183; GFX12-NEXT: s_wait_loadcnt 0x0184; GFX12-NEXT: ; return to shader part epilog185main_body:186 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 %1, i32 0, i32 0)187 ret <4 x float> %data188}189 190define amdgpu_ps <4 x float> @buffer_load_ofs_imm(<4 x i32> inreg, i32) {191; PREGFX10-LABEL: buffer_load_ofs_imm:192; PREGFX10: ; %bb.0: ; %main_body193; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:60194; PREGFX10-NEXT: s_waitcnt vmcnt(0)195; PREGFX10-NEXT: ; return to shader part epilog196;197; GFX10-LABEL: buffer_load_ofs_imm:198; GFX10: ; %bb.0: ; %main_body199; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:60200; GFX10-NEXT: s_waitcnt vmcnt(0)201; GFX10-NEXT: ; return to shader part epilog202;203; GFX11-LABEL: buffer_load_ofs_imm:204; GFX11: ; %bb.0: ; %main_body205; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen offset:60206; GFX11-NEXT: s_waitcnt vmcnt(0)207; GFX11-NEXT: ; return to shader part epilog208;209; GFX12-LABEL: buffer_load_ofs_imm:210; GFX12: ; %bb.0: ; %main_body211; GFX12-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], null offen offset:60212; GFX12-NEXT: s_wait_loadcnt 0x0213; GFX12-NEXT: ; return to shader part epilog214main_body:215 %ofs = add i32 %1, 60216 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 %ofs, i32 0, i32 0)217 ret <4 x float> %data218}219 220define amdgpu_ps <4 x float> @buffer_load_voffset_large_12bit(<4 x i32> inreg) {221; PREGFX10-LABEL: buffer_load_voffset_large_12bit:222; PREGFX10: ; %bb.0: ; %main_body223; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:4092224; PREGFX10-NEXT: s_waitcnt vmcnt(0)225; PREGFX10-NEXT: ; return to shader part epilog226;227; GFX10-LABEL: buffer_load_voffset_large_12bit:228; GFX10: ; %bb.0: ; %main_body229; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:4092230; GFX10-NEXT: s_waitcnt vmcnt(0)231; GFX10-NEXT: ; return to shader part epilog232;233; GFX11-LABEL: buffer_load_voffset_large_12bit:234; GFX11: ; %bb.0: ; %main_body235; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0 offset:4092236; GFX11-NEXT: s_waitcnt vmcnt(0)237; GFX11-NEXT: ; return to shader part epilog238;239; GFX12-LABEL: buffer_load_voffset_large_12bit:240; GFX12: ; %bb.0: ; %main_body241; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:4092242; GFX12-NEXT: s_wait_loadcnt 0x0243; GFX12-NEXT: ; return to shader part epilog244main_body:245 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 4092, i32 0, i32 0)246 ret <4 x float> %data247}248 249define amdgpu_ps <4 x float> @buffer_load_voffset_large_13bit(<4 x i32> inreg) {250; PREGFX10-LABEL: buffer_load_voffset_large_13bit:251; PREGFX10: ; %bb.0: ; %main_body252; PREGFX10-NEXT: v_mov_b32_e32 v0, 0x1000253; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4092254; PREGFX10-NEXT: s_waitcnt vmcnt(0)255; PREGFX10-NEXT: ; return to shader part epilog256;257; GFX10-LABEL: buffer_load_voffset_large_13bit:258; GFX10: ; %bb.0: ; %main_body259; GFX10-NEXT: v_mov_b32_e32 v0, 0x1000260; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4092261; GFX10-NEXT: s_waitcnt vmcnt(0)262; GFX10-NEXT: ; return to shader part epilog263;264; GFX11-LABEL: buffer_load_voffset_large_13bit:265; GFX11: ; %bb.0: ; %main_body266; GFX11-NEXT: v_mov_b32_e32 v0, 0x1000267; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen offset:4092268; GFX11-NEXT: s_waitcnt vmcnt(0)269; GFX11-NEXT: ; return to shader part epilog270;271; GFX12-LABEL: buffer_load_voffset_large_13bit:272; GFX12: ; %bb.0: ; %main_body273; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:8188274; GFX12-NEXT: s_wait_loadcnt 0x0275; GFX12-NEXT: ; return to shader part epilog276main_body:277 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 8188, i32 0, i32 0)278 ret <4 x float> %data279}280 281define amdgpu_ps <4 x float> @buffer_load_voffset_large_16bit(<4 x i32> inreg) {282; PREGFX10-LABEL: buffer_load_voffset_large_16bit:283; PREGFX10: ; %bb.0: ; %main_body284; PREGFX10-NEXT: v_mov_b32_e32 v0, 0xf000285; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4092286; PREGFX10-NEXT: s_waitcnt vmcnt(0)287; PREGFX10-NEXT: ; return to shader part epilog288;289; GFX10-LABEL: buffer_load_voffset_large_16bit:290; GFX10: ; %bb.0: ; %main_body291; GFX10-NEXT: v_mov_b32_e32 v0, 0xf000292; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4092293; GFX10-NEXT: s_waitcnt vmcnt(0)294; GFX10-NEXT: ; return to shader part epilog295;296; GFX11-LABEL: buffer_load_voffset_large_16bit:297; GFX11: ; %bb.0: ; %main_body298; GFX11-NEXT: v_mov_b32_e32 v0, 0xf000299; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen offset:4092300; GFX11-NEXT: s_waitcnt vmcnt(0)301; GFX11-NEXT: ; return to shader part epilog302;303; GFX12-LABEL: buffer_load_voffset_large_16bit:304; GFX12: ; %bb.0: ; %main_body305; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:65532306; GFX12-NEXT: s_wait_loadcnt 0x0307; GFX12-NEXT: ; return to shader part epilog308main_body:309 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 65532, i32 0, i32 0)310 ret <4 x float> %data311}312 313define amdgpu_ps <4 x float> @buffer_load_voffset_large_23bit(<4 x i32> inreg) {314; PREGFX10-LABEL: buffer_load_voffset_large_23bit:315; PREGFX10: ; %bb.0: ; %main_body316; PREGFX10-NEXT: v_mov_b32_e32 v0, 0x7ff000317; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4092318; PREGFX10-NEXT: s_waitcnt vmcnt(0)319; PREGFX10-NEXT: ; return to shader part epilog320;321; GFX10-LABEL: buffer_load_voffset_large_23bit:322; GFX10: ; %bb.0: ; %main_body323; GFX10-NEXT: v_mov_b32_e32 v0, 0x7ff000324; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4092325; GFX10-NEXT: s_waitcnt vmcnt(0)326; GFX10-NEXT: ; return to shader part epilog327;328; GFX11-LABEL: buffer_load_voffset_large_23bit:329; GFX11: ; %bb.0: ; %main_body330; GFX11-NEXT: v_mov_b32_e32 v0, 0x7ff000331; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen offset:4092332; GFX11-NEXT: s_waitcnt vmcnt(0)333; GFX11-NEXT: ; return to shader part epilog334;335; GFX12-LABEL: buffer_load_voffset_large_23bit:336; GFX12: ; %bb.0: ; %main_body337; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:8388604338; GFX12-NEXT: s_wait_loadcnt 0x0339; GFX12-NEXT: ; return to shader part epilog340main_body:341 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 8388604, i32 0, i32 0)342 ret <4 x float> %data343}344 345define amdgpu_ps <4 x float> @buffer_load_voffset_large_24bit(<4 x i32> inreg) {346; PREGFX10-LABEL: buffer_load_voffset_large_24bit:347; PREGFX10: ; %bb.0: ; %main_body348; PREGFX10-NEXT: v_mov_b32_e32 v0, 0xfff000349; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4092350; PREGFX10-NEXT: s_waitcnt vmcnt(0)351; PREGFX10-NEXT: ; return to shader part epilog352;353; GFX10-LABEL: buffer_load_voffset_large_24bit:354; GFX10: ; %bb.0: ; %main_body355; GFX10-NEXT: v_mov_b32_e32 v0, 0xfff000356; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4092357; GFX10-NEXT: s_waitcnt vmcnt(0)358; GFX10-NEXT: ; return to shader part epilog359;360; GFX11-LABEL: buffer_load_voffset_large_24bit:361; GFX11: ; %bb.0: ; %main_body362; GFX11-NEXT: v_mov_b32_e32 v0, 0xfff000363; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen offset:4092364; GFX11-NEXT: s_waitcnt vmcnt(0)365; GFX11-NEXT: ; return to shader part epilog366;367; GFX12-LABEL: buffer_load_voffset_large_24bit:368; GFX12: ; %bb.0: ; %main_body369; GFX12-NEXT: v_mov_b32_e32 v0, 0x800000370; GFX12-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], null offen offset:8388604371; GFX12-NEXT: s_wait_loadcnt 0x0372; GFX12-NEXT: ; return to shader part epilog373main_body:374 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 16777212, i32 0, i32 0)375 ret <4 x float> %data376}377 378 379define amdgpu_ps float @buffer_load_x1(<4 x i32> inreg %rsrc, i32 %ofs) {380; PREGFX10-LABEL: buffer_load_x1:381; PREGFX10: ; %bb.0: ; %main_body382; PREGFX10-NEXT: buffer_load_dword v0, v0, s[0:3], 0 offen383; PREGFX10-NEXT: s_waitcnt vmcnt(0)384; PREGFX10-NEXT: ; return to shader part epilog385;386; GFX10-LABEL: buffer_load_x1:387; GFX10: ; %bb.0: ; %main_body388; GFX10-NEXT: buffer_load_dword v0, v0, s[0:3], 0 offen389; GFX10-NEXT: s_waitcnt vmcnt(0)390; GFX10-NEXT: ; return to shader part epilog391;392; GFX11-LABEL: buffer_load_x1:393; GFX11: ; %bb.0: ; %main_body394; GFX11-NEXT: buffer_load_b32 v0, v0, s[0:3], 0 offen395; GFX11-NEXT: s_waitcnt vmcnt(0)396; GFX11-NEXT: ; return to shader part epilog397;398; GFX12-LABEL: buffer_load_x1:399; GFX12: ; %bb.0: ; %main_body400; GFX12-NEXT: buffer_load_b32 v0, v0, s[0:3], null offen401; GFX12-NEXT: s_wait_loadcnt 0x0402; GFX12-NEXT: ; return to shader part epilog403main_body:404 %data = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %ofs, i32 0, i32 0)405 ret float %data406}407 408define amdgpu_ps <2 x float> @buffer_load_x2(<4 x i32> inreg %rsrc, i32 %ofs) {409; PREGFX10-LABEL: buffer_load_x2:410; PREGFX10: ; %bb.0: ; %main_body411; PREGFX10-NEXT: buffer_load_dwordx2 v[0:1], v0, s[0:3], 0 offen412; PREGFX10-NEXT: s_waitcnt vmcnt(0)413; PREGFX10-NEXT: ; return to shader part epilog414;415; GFX10-LABEL: buffer_load_x2:416; GFX10: ; %bb.0: ; %main_body417; GFX10-NEXT: buffer_load_dwordx2 v[0:1], v0, s[0:3], 0 offen418; GFX10-NEXT: s_waitcnt vmcnt(0)419; GFX10-NEXT: ; return to shader part epilog420;421; GFX11-LABEL: buffer_load_x2:422; GFX11: ; %bb.0: ; %main_body423; GFX11-NEXT: buffer_load_b64 v[0:1], v0, s[0:3], 0 offen424; GFX11-NEXT: s_waitcnt vmcnt(0)425; GFX11-NEXT: ; return to shader part epilog426;427; GFX12-LABEL: buffer_load_x2:428; GFX12: ; %bb.0: ; %main_body429; GFX12-NEXT: buffer_load_b64 v[0:1], v0, s[0:3], null offen430; GFX12-NEXT: s_wait_loadcnt 0x0431; GFX12-NEXT: ; return to shader part epilog432main_body:433 %data = call <2 x float> @llvm.amdgcn.raw.buffer.load.v2f32(<4 x i32> %rsrc, i32 %ofs, i32 0, i32 0)434 ret <2 x float> %data435}436 437define amdgpu_ps <4 x float> @buffer_load_negative_offset(<4 x i32> inreg, i32 %ofs) {438; GFX10-LABEL: buffer_load_negative_offset:439; GFX10: ; %bb.0: ; %main_body440; GFX10-NEXT: v_add_nc_u32_e32 v0, -16, v0441; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen442; GFX10-NEXT: s_waitcnt vmcnt(0)443; GFX10-NEXT: ; return to shader part epilog444;445; GFX11-LABEL: buffer_load_negative_offset:446; GFX11: ; %bb.0: ; %main_body447; GFX11-NEXT: v_add_nc_u32_e32 v0, -16, v0448; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen449; GFX11-NEXT: s_waitcnt vmcnt(0)450; GFX11-NEXT: ; return to shader part epilog451;452; GFX12-LABEL: buffer_load_negative_offset:453; GFX12: ; %bb.0: ; %main_body454; GFX12-NEXT: v_add_nc_u32_e32 v0, -16, v0455; GFX12-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], null offen456; GFX12-NEXT: s_wait_loadcnt 0x0457; GFX12-NEXT: ; return to shader part epilog458main_body:459 %ofs.1 = add i32 %ofs, -16460 %data = call <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32> %0, i32 %ofs.1, i32 0, i32 0)461 ret <4 x float> %data462}463 464define amdgpu_ps float @buffer_load_mmo(<4 x i32> inreg %rsrc, ptr addrspace(3) %lds) {465; GFX10-LABEL: buffer_load_mmo:466; GFX10: ; %bb.0: ; %entry467; GFX10-NEXT: buffer_load_dword v1, off, s[0:3], 0468; GFX10-NEXT: v_mov_b32_e32 v2, 0469; GFX10-NEXT: ds_write2_b32 v0, v2, v2 offset1:4470; GFX10-NEXT: s_waitcnt vmcnt(0)471; GFX10-NEXT: v_mov_b32_e32 v0, v1472; GFX10-NEXT: s_waitcnt lgkmcnt(0)473; GFX10-NEXT: ; return to shader part epilog474;475; GFX11-LABEL: buffer_load_mmo:476; GFX11: ; %bb.0: ; %entry477; GFX11-NEXT: buffer_load_b32 v1, off, s[0:3], 0478; GFX11-NEXT: v_mov_b32_e32 v2, 0479; GFX11-NEXT: ds_store_2addr_b32 v0, v2, v2 offset1:4480; GFX11-NEXT: s_waitcnt vmcnt(0)481; GFX11-NEXT: v_mov_b32_e32 v0, v1482; GFX11-NEXT: s_waitcnt lgkmcnt(0)483; GFX11-NEXT: ; return to shader part epilog484;485; GFX12-LABEL: buffer_load_mmo:486; GFX12: ; %bb.0: ; %entry487; GFX12-NEXT: buffer_load_b32 v1, off, s[0:3], null488; GFX12-NEXT: v_mov_b32_e32 v2, 0489; GFX12-NEXT: ds_store_2addr_b32 v0, v2, v2 offset1:4490; GFX12-NEXT: s_wait_loadcnt 0x0491; GFX12-NEXT: v_mov_b32_e32 v0, v1492; GFX12-NEXT: s_wait_dscnt 0x0493; GFX12-NEXT: ; return to shader part epilog494entry:495 store float 0.0, ptr addrspace(3) %lds496 %val = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 0, i32 0, i32 0)497 %tmp2 = getelementptr float, ptr addrspace(3) %lds, i32 4498 store float 0.0, ptr addrspace(3) %tmp2499 ret float %val500}501 502define amdgpu_ps void @buffer_load_x1_offen_merged_and(<4 x i32> inreg %rsrc, i32 %a) {503; PREGFX10-LABEL: buffer_load_x1_offen_merged_and:504; PREGFX10: ; %bb.0: ; %main_body505; PREGFX10-NEXT: buffer_load_dwordx4 v[1:4], v0, s[0:3], 0 offen offset:4506; PREGFX10-NEXT: buffer_load_dwordx2 v[5:6], v0, s[0:3], 0 offen offset:28507; PREGFX10-NEXT: s_waitcnt vmcnt(1)508; PREGFX10-NEXT: exp mrt0 v1, v2, v3, v4 done vm509; PREGFX10-NEXT: s_waitcnt vmcnt(0)510; PREGFX10-NEXT: exp mrt0 v5, v6, v0, v0 done vm511; PREGFX10-NEXT: s_endpgm512;513; GFX10-LABEL: buffer_load_x1_offen_merged_and:514; GFX10: ; %bb.0: ; %main_body515; GFX10-NEXT: s_clause 0x1516; GFX10-NEXT: buffer_load_dwordx4 v[1:4], v0, s[0:3], 0 offen offset:4517; GFX10-NEXT: buffer_load_dwordx2 v[5:6], v0, s[0:3], 0 offen offset:28518; GFX10-NEXT: s_waitcnt vmcnt(1)519; GFX10-NEXT: exp mrt0 v1, v2, v3, v4 done vm520; GFX10-NEXT: s_waitcnt vmcnt(0)521; GFX10-NEXT: exp mrt0 v5, v6, v0, v0 done vm522; GFX10-NEXT: s_endpgm523;524; GFX11-LABEL: buffer_load_x1_offen_merged_and:525; GFX11: ; %bb.0: ; %main_body526; GFX11-NEXT: s_clause 0x1527; GFX11-NEXT: buffer_load_b128 v[1:4], v0, s[0:3], 0 offen offset:4528; GFX11-NEXT: buffer_load_b64 v[5:6], v0, s[0:3], 0 offen offset:28529; GFX11-NEXT: s_waitcnt vmcnt(1)530; GFX11-NEXT: exp mrt0 v1, v2, v3, v4 done531; GFX11-NEXT: s_waitcnt vmcnt(0)532; GFX11-NEXT: exp mrt0 v5, v6, v0, v0 done533; GFX11-NEXT: s_endpgm534;535; GFX12-LABEL: buffer_load_x1_offen_merged_and:536; GFX12: ; %bb.0: ; %main_body537; GFX12-NEXT: s_clause 0x1538; GFX12-NEXT: buffer_load_b128 v[1:4], v0, s[0:3], null offen offset:4539; GFX12-NEXT: buffer_load_b64 v[5:6], v0, s[0:3], null offen offset:28540; GFX12-NEXT: s_wait_loadcnt 0x1541; GFX12-NEXT: export mrt0 v1, v2, v3, v4 done542; GFX12-NEXT: s_wait_loadcnt 0x0543; GFX12-NEXT: export mrt0 v5, v6, v0, v0 done544; GFX12-NEXT: s_endpgm545main_body:546 %a1 = add i32 %a, 4547 %a2 = add i32 %a, 8548 %a3 = add i32 %a, 12549 %a4 = add i32 %a, 16550 %a5 = add i32 %a, 28551 %a6 = add i32 %a, 32552 %r1 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a1, i32 0, i32 0)553 %r2 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a2, i32 0, i32 0)554 %r3 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a3, i32 0, i32 0)555 %r4 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a4, i32 0, i32 0)556 %r5 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a5, i32 0, i32 0)557 %r6 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a6, i32 0, i32 0)558 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)559 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r5, float %r6, float poison, float poison, i1 true, i1 true)560 ret void561}562 563define amdgpu_ps void @buffer_load_x1_offen_merged_or(<4 x i32> inreg %rsrc, i32 %inp) {564; PREGFX10-LABEL: buffer_load_x1_offen_merged_or:565; PREGFX10: ; %bb.0: ; %main_body566; PREGFX10-NEXT: v_lshlrev_b32_e32 v4, 6, v0567; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v4, s[0:3], 0 offen offset:4568; PREGFX10-NEXT: buffer_load_dwordx2 v[4:5], v4, s[0:3], 0 offen offset:28569; PREGFX10-NEXT: s_waitcnt vmcnt(1)570; PREGFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm571; PREGFX10-NEXT: s_waitcnt vmcnt(0)572; PREGFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm573; PREGFX10-NEXT: s_endpgm574;575; GFX10-LABEL: buffer_load_x1_offen_merged_or:576; GFX10: ; %bb.0: ; %main_body577; GFX10-NEXT: v_lshlrev_b32_e32 v6, 6, v0578; GFX10-NEXT: s_clause 0x1579; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v6, s[0:3], 0 offen offset:4580; GFX10-NEXT: buffer_load_dwordx2 v[4:5], v6, s[0:3], 0 offen offset:28581; GFX10-NEXT: s_waitcnt vmcnt(1)582; GFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm583; GFX10-NEXT: s_waitcnt vmcnt(0)584; GFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm585; GFX10-NEXT: s_endpgm586;587; GFX11-LABEL: buffer_load_x1_offen_merged_or:588; GFX11: ; %bb.0: ; %main_body589; GFX11-NEXT: v_lshlrev_b32_e32 v4, 6, v0590; GFX11-NEXT: s_clause 0x1591; GFX11-NEXT: buffer_load_b128 v[0:3], v4, s[0:3], 0 offen offset:4592; GFX11-NEXT: buffer_load_b64 v[4:5], v4, s[0:3], 0 offen offset:28593; GFX11-NEXT: s_waitcnt vmcnt(1)594; GFX11-NEXT: exp mrt0 v0, v1, v2, v3 done595; GFX11-NEXT: s_waitcnt vmcnt(0)596; GFX11-NEXT: exp mrt0 v4, v5, v0, v0 done597; GFX11-NEXT: s_endpgm598;599; GFX12-SDAG-LABEL: buffer_load_x1_offen_merged_or:600; GFX12-SDAG: ; %bb.0: ; %main_body601; GFX12-SDAG-NEXT: v_lshlrev_b32_e32 v4, 6, v0602; GFX12-SDAG-NEXT: s_clause 0x1603; GFX12-SDAG-NEXT: buffer_load_b128 v[0:3], v4, s[0:3], null offen offset:4604; GFX12-SDAG-NEXT: buffer_load_b64 v[4:5], v4, s[0:3], null offen offset:28605; GFX12-SDAG-NEXT: s_wait_loadcnt 0x1606; GFX12-SDAG-NEXT: export mrt0 v0, v1, v2, v3 done607; GFX12-SDAG-NEXT: s_wait_loadcnt 0x0608; GFX12-SDAG-NEXT: export mrt0 v4, v5, v0, v0 done609; GFX12-SDAG-NEXT: s_endpgm610;611; GFX12-GISEL-LABEL: buffer_load_x1_offen_merged_or:612; GFX12-GISEL: ; %bb.0: ; %main_body613; GFX12-GISEL-NEXT: v_lshlrev_b32_e32 v0, 6, v0614; GFX12-GISEL-NEXT: v_or_b32_e32 v1, 4, v0615; GFX12-GISEL-NEXT: v_or_b32_e32 v2, 8, v0616; GFX12-GISEL-NEXT: v_or_b32_e32 v3, 12, v0617; GFX12-GISEL-NEXT: v_or_b32_e32 v4, 16, v0618; GFX12-GISEL-NEXT: v_or_b32_e32 v5, 28, v0619; GFX12-GISEL-NEXT: v_or_b32_e32 v0, 32, v0620; GFX12-GISEL-NEXT: s_clause 0x5621; GFX12-GISEL-NEXT: buffer_load_b32 v1, v1, s[0:3], null offen622; GFX12-GISEL-NEXT: buffer_load_b32 v2, v2, s[0:3], null offen623; GFX12-GISEL-NEXT: buffer_load_b32 v3, v3, s[0:3], null offen624; GFX12-GISEL-NEXT: buffer_load_b32 v4, v4, s[0:3], null offen625; GFX12-GISEL-NEXT: buffer_load_b32 v5, v5, s[0:3], null offen626; GFX12-GISEL-NEXT: buffer_load_b32 v0, v0, s[0:3], null offen627; GFX12-GISEL-NEXT: s_wait_loadcnt 0x2628; GFX12-GISEL-NEXT: export mrt0 v1, v2, v3, v4 done629; GFX12-GISEL-NEXT: s_wait_loadcnt 0x0630; GFX12-GISEL-NEXT: export mrt0 v5, v0, v0, v0 done631; GFX12-GISEL-NEXT: s_endpgm632main_body:633 %a = shl i32 %inp, 6634 %a1 = or i32 %a, 4635 %a2 = or i32 %a, 8636 %a3 = or i32 %a, 12637 %a4 = or i32 %a, 16638 %a5 = or i32 %a, 28639 %a6 = or i32 %a, 32640 %r1 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a1, i32 0, i32 0)641 %r2 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a2, i32 0, i32 0)642 %r3 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a3, i32 0, i32 0)643 %r4 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a4, i32 0, i32 0)644 %r5 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a5, i32 0, i32 0)645 %r6 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a6, i32 0, i32 0)646 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)647 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r5, float %r6, float poison, float poison, i1 true, i1 true)648 ret void649}650 651define amdgpu_ps void @buffer_load_x1_offen_merged_glc_slc(<4 x i32> inreg %rsrc, i32 %a) {652; PREGFX10-LABEL: buffer_load_x1_offen_merged_glc_slc:653; PREGFX10: ; %bb.0: ; %main_body654; PREGFX10-NEXT: buffer_load_dwordx2 v[1:2], v0, s[0:3], 0 offen offset:4655; PREGFX10-NEXT: buffer_load_dwordx2 v[3:4], v0, s[0:3], 0 offen offset:12 glc656; PREGFX10-NEXT: buffer_load_dwordx2 v[5:6], v0, s[0:3], 0 offen offset:28 glc slc657; PREGFX10-NEXT: s_waitcnt vmcnt(1)658; PREGFX10-NEXT: exp mrt0 v1, v2, v3, v4 done vm659; PREGFX10-NEXT: s_waitcnt vmcnt(0)660; PREGFX10-NEXT: exp mrt0 v5, v6, v0, v0 done vm661; PREGFX10-NEXT: s_endpgm662;663; GFX10-LABEL: buffer_load_x1_offen_merged_glc_slc:664; GFX10: ; %bb.0: ; %main_body665; GFX10-NEXT: s_clause 0x2666; GFX10-NEXT: buffer_load_dwordx2 v[1:2], v0, s[0:3], 0 offen offset:4667; GFX10-NEXT: buffer_load_dwordx2 v[3:4], v0, s[0:3], 0 offen offset:12 glc668; GFX10-NEXT: buffer_load_dwordx2 v[5:6], v0, s[0:3], 0 offen offset:28 glc slc669; GFX10-NEXT: s_waitcnt vmcnt(1)670; GFX10-NEXT: exp mrt0 v1, v2, v3, v4 done vm671; GFX10-NEXT: s_waitcnt vmcnt(0)672; GFX10-NEXT: exp mrt0 v5, v6, v0, v0 done vm673; GFX10-NEXT: s_endpgm674;675; GFX11-LABEL: buffer_load_x1_offen_merged_glc_slc:676; GFX11: ; %bb.0: ; %main_body677; GFX11-NEXT: s_clause 0x2678; GFX11-NEXT: buffer_load_b64 v[1:2], v0, s[0:3], 0 offen offset:4679; GFX11-NEXT: buffer_load_b64 v[3:4], v0, s[0:3], 0 offen offset:12 glc680; GFX11-NEXT: buffer_load_b64 v[5:6], v0, s[0:3], 0 offen offset:28 glc slc681; GFX11-NEXT: s_waitcnt vmcnt(1)682; GFX11-NEXT: exp mrt0 v1, v2, v3, v4 done683; GFX11-NEXT: s_waitcnt vmcnt(0)684; GFX11-NEXT: exp mrt0 v5, v6, v0, v0 done685; GFX11-NEXT: s_endpgm686;687; GFX12-LABEL: buffer_load_x1_offen_merged_glc_slc:688; GFX12: ; %bb.0: ; %main_body689; GFX12-NEXT: s_clause 0x2690; GFX12-NEXT: buffer_load_b64 v[1:2], v0, s[0:3], null offen offset:4691; GFX12-NEXT: buffer_load_b64 v[3:4], v0, s[0:3], null offen offset:12 th:TH_LOAD_NT692; GFX12-NEXT: buffer_load_b64 v[5:6], v0, s[0:3], null offen offset:28 th:TH_LOAD_LU693; GFX12-NEXT: s_wait_loadcnt 0x1694; GFX12-NEXT: export mrt0 v1, v2, v3, v4 done695; GFX12-NEXT: s_wait_loadcnt 0x0696; GFX12-NEXT: export mrt0 v5, v6, v0, v0 done697; GFX12-NEXT: s_endpgm698main_body:699 %a1 = add i32 %a, 4700 %a2 = add i32 %a, 8701 %a3 = add i32 %a, 12702 %a4 = add i32 %a, 16703 %a5 = add i32 %a, 28704 %a6 = add i32 %a, 32705 %r1 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a1, i32 0, i32 0)706 %r2 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a2, i32 0, i32 0)707 %r3 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a3, i32 0, i32 1)708 %r4 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a4, i32 0, i32 1)709 %r5 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a5, i32 0, i32 3)710 %r6 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 %a6, i32 0, i32 3)711 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)712 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r5, float %r6, float poison, float poison, i1 true, i1 true)713 ret void714}715 716define amdgpu_ps void @buffer_load_x2_offen_merged_and(<4 x i32> inreg %rsrc, i32 %a) {717; PREGFX10-LABEL: buffer_load_x2_offen_merged_and:718; PREGFX10: ; %bb.0: ; %main_body719; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4720; PREGFX10-NEXT: s_waitcnt vmcnt(0)721; PREGFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm722; PREGFX10-NEXT: s_endpgm723;724; GFX10-LABEL: buffer_load_x2_offen_merged_and:725; GFX10: ; %bb.0: ; %main_body726; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4727; GFX10-NEXT: s_waitcnt vmcnt(0)728; GFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm729; GFX10-NEXT: s_endpgm730;731; GFX11-LABEL: buffer_load_x2_offen_merged_and:732; GFX11: ; %bb.0: ; %main_body733; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen offset:4734; GFX11-NEXT: s_waitcnt vmcnt(0)735; GFX11-NEXT: exp mrt0 v0, v1, v2, v3 done736; GFX11-NEXT: s_endpgm737;738; GFX12-LABEL: buffer_load_x2_offen_merged_and:739; GFX12: ; %bb.0: ; %main_body740; GFX12-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], null offen offset:4741; GFX12-NEXT: s_wait_loadcnt 0x0742; GFX12-NEXT: export mrt0 v0, v1, v2, v3 done743; GFX12-NEXT: s_endpgm744main_body:745 %a1 = add i32 %a, 4746 %a2 = add i32 %a, 12747 %vr1 = call <2 x float> @llvm.amdgcn.raw.buffer.load.v2f32(<4 x i32> %rsrc, i32 %a1, i32 0, i32 0)748 %vr2 = call <2 x float> @llvm.amdgcn.raw.buffer.load.v2f32(<4 x i32> %rsrc, i32 %a2, i32 0, i32 0)749 %r1 = extractelement <2 x float> %vr1, i32 0750 %r2 = extractelement <2 x float> %vr1, i32 1751 %r3 = extractelement <2 x float> %vr2, i32 0752 %r4 = extractelement <2 x float> %vr2, i32 1753 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)754 ret void755}756 757define amdgpu_ps void @buffer_load_x2_offen_merged_or(<4 x i32> inreg %rsrc, i32 %inp) {758; PREGFX10-LABEL: buffer_load_x2_offen_merged_or:759; PREGFX10: ; %bb.0: ; %main_body760; PREGFX10-NEXT: v_lshlrev_b32_e32 v0, 4, v0761; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4762; PREGFX10-NEXT: s_waitcnt vmcnt(0)763; PREGFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm764; PREGFX10-NEXT: s_endpgm765;766; GFX10-LABEL: buffer_load_x2_offen_merged_or:767; GFX10: ; %bb.0: ; %main_body768; GFX10-NEXT: v_lshlrev_b32_e32 v0, 4, v0769; GFX10-NEXT: buffer_load_dwordx4 v[0:3], v0, s[0:3], 0 offen offset:4770; GFX10-NEXT: s_waitcnt vmcnt(0)771; GFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm772; GFX10-NEXT: s_endpgm773;774; GFX11-LABEL: buffer_load_x2_offen_merged_or:775; GFX11: ; %bb.0: ; %main_body776; GFX11-NEXT: v_lshlrev_b32_e32 v0, 4, v0777; GFX11-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen offset:4778; GFX11-NEXT: s_waitcnt vmcnt(0)779; GFX11-NEXT: exp mrt0 v0, v1, v2, v3 done780; GFX11-NEXT: s_endpgm781;782; GFX12-LABEL: buffer_load_x2_offen_merged_or:783; GFX12: ; %bb.0: ; %main_body784; GFX12-NEXT: v_lshlrev_b32_e32 v0, 4, v0785; GFX12-NEXT: buffer_load_b128 v[0:3], v0, s[0:3], null offen offset:4786; GFX12-NEXT: s_wait_loadcnt 0x0787; GFX12-NEXT: export mrt0 v0, v1, v2, v3 done788; GFX12-NEXT: s_endpgm789main_body:790 %a = shl i32 %inp, 4791 %a1 = add i32 %a, 4792 %a2 = add i32 %a, 12793 %vr1 = call <2 x float> @llvm.amdgcn.raw.buffer.load.v2f32(<4 x i32> %rsrc, i32 %a1, i32 0, i32 0)794 %vr2 = call <2 x float> @llvm.amdgcn.raw.buffer.load.v2f32(<4 x i32> %rsrc, i32 %a2, i32 0, i32 0)795 %r1 = extractelement <2 x float> %vr1, i32 0796 %r2 = extractelement <2 x float> %vr1, i32 1797 %r3 = extractelement <2 x float> %vr2, i32 0798 %r4 = extractelement <2 x float> %vr2, i32 1799 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)800 ret void801}802 803define amdgpu_ps void @buffer_load_x1_offset_merged(<4 x i32> inreg %rsrc) {804; PREGFX10-LABEL: buffer_load_x1_offset_merged:805; PREGFX10: ; %bb.0: ; %main_body806; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:4807; PREGFX10-NEXT: buffer_load_dwordx2 v[4:5], off, s[0:3], 0 offset:28808; PREGFX10-NEXT: s_waitcnt vmcnt(1)809; PREGFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm810; PREGFX10-NEXT: s_waitcnt vmcnt(0)811; PREGFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm812; PREGFX10-NEXT: s_endpgm813;814; GFX10-LABEL: buffer_load_x1_offset_merged:815; GFX10: ; %bb.0: ; %main_body816; GFX10-NEXT: s_clause 0x1817; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:4818; GFX10-NEXT: buffer_load_dwordx2 v[4:5], off, s[0:3], 0 offset:28819; GFX10-NEXT: s_waitcnt vmcnt(1)820; GFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm821; GFX10-NEXT: s_waitcnt vmcnt(0)822; GFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm823; GFX10-NEXT: s_endpgm824;825; GFX11-LABEL: buffer_load_x1_offset_merged:826; GFX11: ; %bb.0: ; %main_body827; GFX11-NEXT: s_clause 0x1828; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0 offset:4829; GFX11-NEXT: buffer_load_b64 v[4:5], off, s[0:3], 0 offset:28830; GFX11-NEXT: s_waitcnt vmcnt(1)831; GFX11-NEXT: exp mrt0 v0, v1, v2, v3 done832; GFX11-NEXT: s_waitcnt vmcnt(0)833; GFX11-NEXT: exp mrt0 v4, v5, v0, v0 done834; GFX11-NEXT: s_endpgm835;836; GFX12-LABEL: buffer_load_x1_offset_merged:837; GFX12: ; %bb.0: ; %main_body838; GFX12-NEXT: s_clause 0x1839; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:4840; GFX12-NEXT: buffer_load_b64 v[4:5], off, s[0:3], null offset:28841; GFX12-NEXT: s_wait_loadcnt 0x1842; GFX12-NEXT: export mrt0 v0, v1, v2, v3 done843; GFX12-NEXT: s_wait_loadcnt 0x0844; GFX12-NEXT: export mrt0 v4, v5, v0, v0 done845; GFX12-NEXT: s_endpgm846main_body:847 %r1 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 4, i32 0, i32 0)848 %r2 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 8, i32 0, i32 0)849 %r3 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 12, i32 0, i32 0)850 %r4 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 16, i32 0, i32 0)851 %r5 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 28, i32 0, i32 0)852 %r6 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 32, i32 0, i32 0)853 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)854 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r5, float %r6, float poison, float poison, i1 true, i1 true)855 ret void856}857 858define amdgpu_ps void @buffer_load_x2_offset_merged(<4 x i32> inreg %rsrc) {859; PREGFX10-LABEL: buffer_load_x2_offset_merged:860; PREGFX10: ; %bb.0: ; %main_body861; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:4862; PREGFX10-NEXT: s_waitcnt vmcnt(0)863; PREGFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm864; PREGFX10-NEXT: s_endpgm865;866; GFX10-LABEL: buffer_load_x2_offset_merged:867; GFX10: ; %bb.0: ; %main_body868; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:4869; GFX10-NEXT: s_waitcnt vmcnt(0)870; GFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm871; GFX10-NEXT: s_endpgm872;873; GFX11-LABEL: buffer_load_x2_offset_merged:874; GFX11: ; %bb.0: ; %main_body875; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0 offset:4876; GFX11-NEXT: s_waitcnt vmcnt(0)877; GFX11-NEXT: exp mrt0 v0, v1, v2, v3 done878; GFX11-NEXT: s_endpgm879;880; GFX12-LABEL: buffer_load_x2_offset_merged:881; GFX12: ; %bb.0: ; %main_body882; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:4883; GFX12-NEXT: s_wait_loadcnt 0x0884; GFX12-NEXT: export mrt0 v0, v1, v2, v3 done885; GFX12-NEXT: s_endpgm886main_body:887 %vr1 = call <2 x float> @llvm.amdgcn.raw.buffer.load.v2f32(<4 x i32> %rsrc, i32 4, i32 0, i32 0)888 %vr2 = call <2 x float> @llvm.amdgcn.raw.buffer.load.v2f32(<4 x i32> %rsrc, i32 12, i32 0, i32 0)889 %r1 = extractelement <2 x float> %vr1, i32 0890 %r2 = extractelement <2 x float> %vr1, i32 1891 %r3 = extractelement <2 x float> %vr2, i32 0892 %r4 = extractelement <2 x float> %vr2, i32 1893 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)894 ret void895}896 897define amdgpu_ps {<4 x float>, <2 x float>, float} @buffer_load_int(<4 x i32> inreg) {898; PREGFX10-LABEL: buffer_load_int:899; PREGFX10: ; %bb.0: ; %main_body900; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0901; PREGFX10-NEXT: buffer_load_dwordx2 v[4:5], off, s[0:3], 0 glc902; PREGFX10-NEXT: buffer_load_dword v6, off, s[0:3], 0 slc903; PREGFX10-NEXT: s_waitcnt vmcnt(0)904; PREGFX10-NEXT: ; return to shader part epilog905;906; GFX10-LABEL: buffer_load_int:907; GFX10: ; %bb.0: ; %main_body908; GFX10-NEXT: s_clause 0x2909; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0910; GFX10-NEXT: buffer_load_dwordx2 v[4:5], off, s[0:3], 0 glc911; GFX10-NEXT: buffer_load_dword v6, off, s[0:3], 0 slc912; GFX10-NEXT: s_waitcnt vmcnt(0)913; GFX10-NEXT: ; return to shader part epilog914;915; GFX11-LABEL: buffer_load_int:916; GFX11: ; %bb.0: ; %main_body917; GFX11-NEXT: s_clause 0x2918; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0919; GFX11-NEXT: buffer_load_b64 v[4:5], off, s[0:3], 0 glc920; GFX11-NEXT: buffer_load_b32 v6, off, s[0:3], 0 slc921; GFX11-NEXT: s_waitcnt vmcnt(0)922; GFX11-NEXT: ; return to shader part epilog923;924; GFX12-LABEL: buffer_load_int:925; GFX12: ; %bb.0: ; %main_body926; GFX12-NEXT: s_clause 0x2927; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null928; GFX12-NEXT: buffer_load_b64 v[4:5], off, s[0:3], null th:TH_LOAD_NT929; GFX12-NEXT: buffer_load_b32 v6, off, s[0:3], null th:TH_LOAD_HT930; GFX12-NEXT: s_wait_loadcnt 0x0931; GFX12-NEXT: ; return to shader part epilog932main_body:933 %data = call <4 x i32> @llvm.amdgcn.raw.buffer.load.v4i32(<4 x i32> %0, i32 0, i32 0, i32 0)934 %data_glc = call <2 x i32> @llvm.amdgcn.raw.buffer.load.v2i32(<4 x i32> %0, i32 0, i32 0, i32 1)935 %data_slc = call i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32> %0, i32 0, i32 0, i32 2)936 %fdata = bitcast <4 x i32> %data to <4 x float>937 %fdata_glc = bitcast <2 x i32> %data_glc to <2 x float>938 %fdata_slc = bitcast i32 %data_slc to float939 %r0 = insertvalue {<4 x float>, <2 x float>, float} poison, <4 x float> %fdata, 0940 %r1 = insertvalue {<4 x float>, <2 x float>, float} %r0, <2 x float> %fdata_glc, 1941 %r2 = insertvalue {<4 x float>, <2 x float>, float} %r1, float %fdata_slc, 2942 ret {<4 x float>, <2 x float>, float} %r2943}944 945define amdgpu_ps float @raw_buffer_load_ubyte(<4 x i32> inreg %rsrc) {946; PREGFX10-LABEL: raw_buffer_load_ubyte:947; PREGFX10: ; %bb.0: ; %main_body948; PREGFX10-NEXT: buffer_load_ubyte v0, off, s[0:3], 0949; PREGFX10-NEXT: s_waitcnt vmcnt(0)950; PREGFX10-NEXT: v_cvt_f32_ubyte0_e32 v0, v0951; PREGFX10-NEXT: ; return to shader part epilog952;953; GFX10-LABEL: raw_buffer_load_ubyte:954; GFX10: ; %bb.0: ; %main_body955; GFX10-NEXT: buffer_load_ubyte v0, off, s[0:3], 0956; GFX10-NEXT: s_waitcnt vmcnt(0)957; GFX10-NEXT: v_cvt_f32_ubyte0_e32 v0, v0958; GFX10-NEXT: ; return to shader part epilog959;960; GFX11-LABEL: raw_buffer_load_ubyte:961; GFX11: ; %bb.0: ; %main_body962; GFX11-NEXT: buffer_load_u8 v0, off, s[0:3], 0963; GFX11-NEXT: s_waitcnt vmcnt(0)964; GFX11-NEXT: v_cvt_f32_ubyte0_e32 v0, v0965; GFX11-NEXT: ; return to shader part epilog966;967; GFX12-LABEL: raw_buffer_load_ubyte:968; GFX12: ; %bb.0: ; %main_body969; GFX12-NEXT: buffer_load_u8 v0, off, s[0:3], null970; GFX12-NEXT: s_wait_loadcnt 0x0971; GFX12-NEXT: v_cvt_f32_ubyte0_e32 v0, v0972; GFX12-NEXT: ; return to shader part epilog973main_body:974 %tmp = call i8 @llvm.amdgcn.raw.buffer.load.i8(<4 x i32> %rsrc, i32 0, i32 0, i32 0)975 %tmp2 = zext i8 %tmp to i32976 %val = uitofp i32 %tmp2 to float977 ret float %val978}979 980define amdgpu_ps float @raw_buffer_load_i16(<4 x i32> inreg %rsrc) {981; PREGFX10-LABEL: raw_buffer_load_i16:982; PREGFX10: ; %bb.0: ; %main_body983; PREGFX10-NEXT: buffer_load_ushort v0, off, s[0:3], 0984; PREGFX10-NEXT: s_waitcnt vmcnt(0)985; PREGFX10-NEXT: v_cvt_f32_u32_e32 v0, v0986; PREGFX10-NEXT: ; return to shader part epilog987;988; GFX10-LABEL: raw_buffer_load_i16:989; GFX10: ; %bb.0: ; %main_body990; GFX10-NEXT: buffer_load_ushort v0, off, s[0:3], 0991; GFX10-NEXT: s_waitcnt vmcnt(0)992; GFX10-NEXT: v_cvt_f32_u32_e32 v0, v0993; GFX10-NEXT: ; return to shader part epilog994;995; GFX11-LABEL: raw_buffer_load_i16:996; GFX11: ; %bb.0: ; %main_body997; GFX11-NEXT: buffer_load_u16 v0, off, s[0:3], 0998; GFX11-NEXT: s_waitcnt vmcnt(0)999; GFX11-NEXT: v_cvt_f32_u32_e32 v0, v01000; GFX11-NEXT: ; return to shader part epilog1001;1002; GFX12-LABEL: raw_buffer_load_i16:1003; GFX12: ; %bb.0: ; %main_body1004; GFX12-NEXT: buffer_load_u16 v0, off, s[0:3], null1005; GFX12-NEXT: s_wait_loadcnt 0x01006; GFX12-NEXT: v_cvt_f32_u32_e32 v0, v01007; GFX12-NEXT: ; return to shader part epilog1008main_body:1009 %tmp = call i16 @llvm.amdgcn.raw.buffer.load.i16(<4 x i32> %rsrc, i32 0, i32 0, i32 0)1010 %tmp2 = zext i16 %tmp to i321011 %val = uitofp i32 %tmp2 to float1012 ret float %val1013}1014 1015define amdgpu_ps float @raw_buffer_load_sbyte(<4 x i32> inreg %rsrc) {1016; PREGFX10-LABEL: raw_buffer_load_sbyte:1017; PREGFX10: ; %bb.0: ; %main_body1018; PREGFX10-NEXT: buffer_load_sbyte v0, off, s[0:3], 01019; PREGFX10-NEXT: s_waitcnt vmcnt(0)1020; PREGFX10-NEXT: v_cvt_f32_i32_e32 v0, v01021; PREGFX10-NEXT: ; return to shader part epilog1022;1023; GFX10-LABEL: raw_buffer_load_sbyte:1024; GFX10: ; %bb.0: ; %main_body1025; GFX10-NEXT: buffer_load_sbyte v0, off, s[0:3], 01026; GFX10-NEXT: s_waitcnt vmcnt(0)1027; GFX10-NEXT: v_cvt_f32_i32_e32 v0, v01028; GFX10-NEXT: ; return to shader part epilog1029;1030; GFX11-LABEL: raw_buffer_load_sbyte:1031; GFX11: ; %bb.0: ; %main_body1032; GFX11-NEXT: buffer_load_i8 v0, off, s[0:3], 01033; GFX11-NEXT: s_waitcnt vmcnt(0)1034; GFX11-NEXT: v_cvt_f32_i32_e32 v0, v01035; GFX11-NEXT: ; return to shader part epilog1036;1037; GFX12-LABEL: raw_buffer_load_sbyte:1038; GFX12: ; %bb.0: ; %main_body1039; GFX12-NEXT: buffer_load_i8 v0, off, s[0:3], null1040; GFX12-NEXT: s_wait_loadcnt 0x01041; GFX12-NEXT: v_cvt_f32_i32_e32 v0, v01042; GFX12-NEXT: ; return to shader part epilog1043main_body:1044 %tmp = call i8 @llvm.amdgcn.raw.buffer.load.i8(<4 x i32> %rsrc, i32 0, i32 0, i32 0)1045 %tmp2 = sext i8 %tmp to i321046 %val = sitofp i32 %tmp2 to float1047 ret float %val1048}1049 1050define amdgpu_ps float @raw_buffer_load_sshort(<4 x i32> inreg %rsrc) {1051; PREGFX10-LABEL: raw_buffer_load_sshort:1052; PREGFX10: ; %bb.0: ; %main_body1053; PREGFX10-NEXT: buffer_load_sshort v0, off, s[0:3], 01054; PREGFX10-NEXT: s_waitcnt vmcnt(0)1055; PREGFX10-NEXT: v_cvt_f32_i32_e32 v0, v01056; PREGFX10-NEXT: ; return to shader part epilog1057;1058; GFX10-LABEL: raw_buffer_load_sshort:1059; GFX10: ; %bb.0: ; %main_body1060; GFX10-NEXT: buffer_load_sshort v0, off, s[0:3], 01061; GFX10-NEXT: s_waitcnt vmcnt(0)1062; GFX10-NEXT: v_cvt_f32_i32_e32 v0, v01063; GFX10-NEXT: ; return to shader part epilog1064;1065; GFX11-LABEL: raw_buffer_load_sshort:1066; GFX11: ; %bb.0: ; %main_body1067; GFX11-NEXT: buffer_load_i16 v0, off, s[0:3], 01068; GFX11-NEXT: s_waitcnt vmcnt(0)1069; GFX11-NEXT: v_cvt_f32_i32_e32 v0, v01070; GFX11-NEXT: ; return to shader part epilog1071;1072; GFX12-LABEL: raw_buffer_load_sshort:1073; GFX12: ; %bb.0: ; %main_body1074; GFX12-NEXT: buffer_load_i16 v0, off, s[0:3], null1075; GFX12-NEXT: s_wait_loadcnt 0x01076; GFX12-NEXT: v_cvt_f32_i32_e32 v0, v01077; GFX12-NEXT: ; return to shader part epilog1078main_body:1079 %tmp = call i16 @llvm.amdgcn.raw.buffer.load.i16(<4 x i32> %rsrc, i32 0, i32 0, i32 0)1080 %tmp2 = sext i16 %tmp to i321081 %val = sitofp i32 %tmp2 to float1082 ret float %val1083}1084 1085define amdgpu_ps void @raw_buffer_load_f16(<4 x i32> inreg %rsrc, ptr addrspace(3) %ptr) {1086; PREGFX10-LABEL: raw_buffer_load_f16:1087; PREGFX10: ; %bb.0: ; %main_body1088; PREGFX10-NEXT: buffer_load_ushort v1, off, s[0:3], 01089; PREGFX10-NEXT: s_mov_b32 m0, -11090; PREGFX10-NEXT: s_waitcnt vmcnt(0)1091; PREGFX10-NEXT: ds_write_b16 v0, v11092; PREGFX10-NEXT: s_endpgm1093;1094; GFX10-LABEL: raw_buffer_load_f16:1095; GFX10: ; %bb.0: ; %main_body1096; GFX10-NEXT: buffer_load_ushort v1, off, s[0:3], 01097; GFX10-NEXT: s_waitcnt vmcnt(0)1098; GFX10-NEXT: ds_write_b16 v0, v11099; GFX10-NEXT: s_endpgm1100;1101; GFX11-LABEL: raw_buffer_load_f16:1102; GFX11: ; %bb.0: ; %main_body1103; GFX11-NEXT: buffer_load_u16 v1, off, s[0:3], 01104; GFX11-NEXT: s_waitcnt vmcnt(0)1105; GFX11-NEXT: ds_store_b16 v0, v11106; GFX11-NEXT: s_endpgm1107;1108; GFX12-LABEL: raw_buffer_load_f16:1109; GFX12: ; %bb.0: ; %main_body1110; GFX12-NEXT: buffer_load_u16 v1, off, s[0:3], null1111; GFX12-NEXT: s_wait_loadcnt 0x01112; GFX12-NEXT: ds_store_b16 v0, v11113; GFX12-NEXT: s_endpgm1114main_body:1115 %val = call half @llvm.amdgcn.raw.buffer.load.f16(<4 x i32> %rsrc, i32 0, i32 0, i32 0)1116 store half %val, ptr addrspace(3) %ptr1117 ret void1118}1119 1120define amdgpu_ps void @raw_buffer_load_v2f16(<4 x i32> inreg %rsrc, ptr addrspace(3) %ptr) {1121; PREGFX10-LABEL: raw_buffer_load_v2f16:1122; PREGFX10: ; %bb.0: ; %main_body1123; PREGFX10-NEXT: buffer_load_dword v1, off, s[0:3], 01124; PREGFX10-NEXT: s_mov_b32 m0, -11125; PREGFX10-NEXT: s_waitcnt vmcnt(0)1126; PREGFX10-NEXT: ds_write_b32 v0, v11127; PREGFX10-NEXT: s_endpgm1128;1129; GFX10-LABEL: raw_buffer_load_v2f16:1130; GFX10: ; %bb.0: ; %main_body1131; GFX10-NEXT: buffer_load_dword v1, off, s[0:3], 01132; GFX10-NEXT: s_waitcnt vmcnt(0)1133; GFX10-NEXT: ds_write_b32 v0, v11134; GFX10-NEXT: s_endpgm1135;1136; GFX11-LABEL: raw_buffer_load_v2f16:1137; GFX11: ; %bb.0: ; %main_body1138; GFX11-NEXT: buffer_load_b32 v1, off, s[0:3], 01139; GFX11-NEXT: s_waitcnt vmcnt(0)1140; GFX11-NEXT: ds_store_b32 v0, v11141; GFX11-NEXT: s_endpgm1142;1143; GFX12-LABEL: raw_buffer_load_v2f16:1144; GFX12: ; %bb.0: ; %main_body1145; GFX12-NEXT: buffer_load_b32 v1, off, s[0:3], null1146; GFX12-NEXT: s_wait_loadcnt 0x01147; GFX12-NEXT: ds_store_b32 v0, v11148; GFX12-NEXT: s_endpgm1149main_body:1150 %val = call <2 x half> @llvm.amdgcn.raw.buffer.load.v2f16(<4 x i32> %rsrc, i32 0, i32 0, i32 0)1151 store <2 x half> %val, ptr addrspace(3) %ptr1152 ret void1153}1154 1155define amdgpu_ps void @raw_buffer_load_v4f16(<4 x i32> inreg %rsrc, ptr addrspace(3) %ptr) {1156; PREGFX10-LABEL: raw_buffer_load_v4f16:1157; PREGFX10: ; %bb.0: ; %main_body1158; PREGFX10-NEXT: buffer_load_dwordx2 v[1:2], off, s[0:3], 01159; PREGFX10-NEXT: s_mov_b32 m0, -11160; PREGFX10-NEXT: s_waitcnt vmcnt(0)1161; PREGFX10-NEXT: ds_write_b64 v0, v[1:2]1162; PREGFX10-NEXT: s_endpgm1163;1164; GFX10-LABEL: raw_buffer_load_v4f16:1165; GFX10: ; %bb.0: ; %main_body1166; GFX10-NEXT: buffer_load_dwordx2 v[1:2], off, s[0:3], 01167; GFX10-NEXT: s_waitcnt vmcnt(0)1168; GFX10-NEXT: ds_write_b64 v0, v[1:2]1169; GFX10-NEXT: s_endpgm1170;1171; GFX11-LABEL: raw_buffer_load_v4f16:1172; GFX11: ; %bb.0: ; %main_body1173; GFX11-NEXT: buffer_load_b64 v[1:2], off, s[0:3], 01174; GFX11-NEXT: s_waitcnt vmcnt(0)1175; GFX11-NEXT: ds_store_b64 v0, v[1:2]1176; GFX11-NEXT: s_endpgm1177;1178; GFX12-LABEL: raw_buffer_load_v4f16:1179; GFX12: ; %bb.0: ; %main_body1180; GFX12-NEXT: buffer_load_b64 v[1:2], off, s[0:3], null1181; GFX12-NEXT: s_wait_loadcnt 0x01182; GFX12-NEXT: ds_store_b64 v0, v[1:2]1183; GFX12-NEXT: s_endpgm1184main_body:1185 %val = call <4 x half> @llvm.amdgcn.raw.buffer.load.v4f16(<4 x i32> %rsrc, i32 0, i32 0, i32 0)1186 store <4 x half> %val, ptr addrspace(3) %ptr1187 ret void1188}1189 1190define amdgpu_ps void @raw_buffer_load_v2i16(<4 x i32> inreg %rsrc, ptr addrspace(3) %ptr) {1191; PREGFX10-LABEL: raw_buffer_load_v2i16:1192; PREGFX10: ; %bb.0: ; %main_body1193; PREGFX10-NEXT: buffer_load_dword v1, off, s[0:3], 01194; PREGFX10-NEXT: s_mov_b32 m0, -11195; PREGFX10-NEXT: s_waitcnt vmcnt(0)1196; PREGFX10-NEXT: ds_write_b32 v0, v11197; PREGFX10-NEXT: s_endpgm1198;1199; GFX10-LABEL: raw_buffer_load_v2i16:1200; GFX10: ; %bb.0: ; %main_body1201; GFX10-NEXT: buffer_load_dword v1, off, s[0:3], 01202; GFX10-NEXT: s_waitcnt vmcnt(0)1203; GFX10-NEXT: ds_write_b32 v0, v11204; GFX10-NEXT: s_endpgm1205;1206; GFX11-LABEL: raw_buffer_load_v2i16:1207; GFX11: ; %bb.0: ; %main_body1208; GFX11-NEXT: buffer_load_b32 v1, off, s[0:3], 01209; GFX11-NEXT: s_waitcnt vmcnt(0)1210; GFX11-NEXT: ds_store_b32 v0, v11211; GFX11-NEXT: s_endpgm1212;1213; GFX12-LABEL: raw_buffer_load_v2i16:1214; GFX12: ; %bb.0: ; %main_body1215; GFX12-NEXT: buffer_load_b32 v1, off, s[0:3], null1216; GFX12-NEXT: s_wait_loadcnt 0x01217; GFX12-NEXT: ds_store_b32 v0, v11218; GFX12-NEXT: s_endpgm1219main_body:1220 %val = call <2 x i16> @llvm.amdgcn.raw.buffer.load.v2i16(<4 x i32> %rsrc, i32 0, i32 0, i32 0)1221 store <2 x i16> %val, ptr addrspace(3) %ptr1222 ret void1223}1224 1225define amdgpu_ps void @raw_buffer_load_v4i16(<4 x i32> inreg %rsrc, ptr addrspace(3) %ptr) {1226; PREGFX10-LABEL: raw_buffer_load_v4i16:1227; PREGFX10: ; %bb.0: ; %main_body1228; PREGFX10-NEXT: buffer_load_dwordx2 v[1:2], off, s[0:3], 01229; PREGFX10-NEXT: s_mov_b32 m0, -11230; PREGFX10-NEXT: s_waitcnt vmcnt(0)1231; PREGFX10-NEXT: ds_write_b64 v0, v[1:2]1232; PREGFX10-NEXT: s_endpgm1233;1234; GFX10-LABEL: raw_buffer_load_v4i16:1235; GFX10: ; %bb.0: ; %main_body1236; GFX10-NEXT: buffer_load_dwordx2 v[1:2], off, s[0:3], 01237; GFX10-NEXT: s_waitcnt vmcnt(0)1238; GFX10-NEXT: ds_write_b64 v0, v[1:2]1239; GFX10-NEXT: s_endpgm1240;1241; GFX11-LABEL: raw_buffer_load_v4i16:1242; GFX11: ; %bb.0: ; %main_body1243; GFX11-NEXT: buffer_load_b64 v[1:2], off, s[0:3], 01244; GFX11-NEXT: s_waitcnt vmcnt(0)1245; GFX11-NEXT: ds_store_b64 v0, v[1:2]1246; GFX11-NEXT: s_endpgm1247;1248; GFX12-LABEL: raw_buffer_load_v4i16:1249; GFX12: ; %bb.0: ; %main_body1250; GFX12-NEXT: buffer_load_b64 v[1:2], off, s[0:3], null1251; GFX12-NEXT: s_wait_loadcnt 0x01252; GFX12-NEXT: ds_store_b64 v0, v[1:2]1253; GFX12-NEXT: s_endpgm1254main_body:1255 %val = call <4 x i16> @llvm.amdgcn.raw.buffer.load.v4i16(<4 x i32> %rsrc, i32 0, i32 0, i32 0)1256 store <4 x i16> %val, ptr addrspace(3) %ptr1257 ret void1258}1259 1260define amdgpu_ps void @raw_buffer_load_x1_offset_merged(<4 x i32> inreg %rsrc) {1261; PREGFX10-LABEL: raw_buffer_load_x1_offset_merged:1262; PREGFX10: ; %bb.0: ; %main_body1263; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:41264; PREGFX10-NEXT: buffer_load_dwordx2 v[4:5], off, s[0:3], 0 offset:281265; PREGFX10-NEXT: s_waitcnt vmcnt(1)1266; PREGFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm1267; PREGFX10-NEXT: s_waitcnt vmcnt(0)1268; PREGFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm1269; PREGFX10-NEXT: s_endpgm1270;1271; GFX10-LABEL: raw_buffer_load_x1_offset_merged:1272; GFX10: ; %bb.0: ; %main_body1273; GFX10-NEXT: s_clause 0x11274; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:41275; GFX10-NEXT: buffer_load_dwordx2 v[4:5], off, s[0:3], 0 offset:281276; GFX10-NEXT: s_waitcnt vmcnt(1)1277; GFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm1278; GFX10-NEXT: s_waitcnt vmcnt(0)1279; GFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm1280; GFX10-NEXT: s_endpgm1281;1282; GFX11-LABEL: raw_buffer_load_x1_offset_merged:1283; GFX11: ; %bb.0: ; %main_body1284; GFX11-NEXT: s_clause 0x11285; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0 offset:41286; GFX11-NEXT: buffer_load_b64 v[4:5], off, s[0:3], 0 offset:281287; GFX11-NEXT: s_waitcnt vmcnt(1)1288; GFX11-NEXT: exp mrt0 v0, v1, v2, v3 done1289; GFX11-NEXT: s_waitcnt vmcnt(0)1290; GFX11-NEXT: exp mrt0 v4, v5, v0, v0 done1291; GFX11-NEXT: s_endpgm1292;1293; GFX12-LABEL: raw_buffer_load_x1_offset_merged:1294; GFX12: ; %bb.0: ; %main_body1295; GFX12-NEXT: s_clause 0x11296; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:41297; GFX12-NEXT: buffer_load_b64 v[4:5], off, s[0:3], null offset:281298; GFX12-NEXT: s_wait_loadcnt 0x11299; GFX12-NEXT: export mrt0 v0, v1, v2, v3 done1300; GFX12-NEXT: s_wait_loadcnt 0x01301; GFX12-NEXT: export mrt0 v4, v5, v0, v0 done1302; GFX12-NEXT: s_endpgm1303main_body:1304 %r1 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 4, i32 0, i32 0)1305 %r2 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 8, i32 0, i32 0)1306 %r3 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 12, i32 0, i32 0)1307 %r4 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 16, i32 0, i32 0)1308 %r5 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 28, i32 0, i32 0)1309 %r6 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 32, i32 0, i32 0)1310 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)1311 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r5, float %r6, float poison, float poison, i1 true, i1 true)1312 ret void1313}1314 1315define amdgpu_ps void @raw_buffer_load_x1_offset_swizzled_not_merged_pregfx12(<4 x i32> inreg %rsrc) {1316; PREGFX10-LABEL: raw_buffer_load_x1_offset_swizzled_not_merged_pregfx12:1317; PREGFX10: ; %bb.0: ; %main_body1318; PREGFX10-NEXT: buffer_load_dword v0, off, s[0:3], 0 offset:41319; PREGFX10-NEXT: buffer_load_dword v1, off, s[0:3], 0 offset:81320; PREGFX10-NEXT: buffer_load_dword v2, off, s[0:3], 0 offset:121321; PREGFX10-NEXT: buffer_load_dword v3, off, s[0:3], 0 offset:161322; PREGFX10-NEXT: buffer_load_dword v4, off, s[0:3], 0 offset:281323; PREGFX10-NEXT: buffer_load_dword v5, off, s[0:3], 0 offset:321324; PREGFX10-NEXT: s_waitcnt vmcnt(2)1325; PREGFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm1326; PREGFX10-NEXT: s_waitcnt vmcnt(0)1327; PREGFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm1328; PREGFX10-NEXT: s_endpgm1329;1330; GFX10-LABEL: raw_buffer_load_x1_offset_swizzled_not_merged_pregfx12:1331; GFX10: ; %bb.0: ; %main_body1332; GFX10-NEXT: s_clause 0x51333; GFX10-NEXT: buffer_load_dword v0, off, s[0:3], 0 offset:41334; GFX10-NEXT: buffer_load_dword v1, off, s[0:3], 0 offset:81335; GFX10-NEXT: buffer_load_dword v2, off, s[0:3], 0 offset:121336; GFX10-NEXT: buffer_load_dword v3, off, s[0:3], 0 offset:161337; GFX10-NEXT: buffer_load_dword v4, off, s[0:3], 0 offset:281338; GFX10-NEXT: buffer_load_dword v5, off, s[0:3], 0 offset:321339; GFX10-NEXT: s_waitcnt vmcnt(2)1340; GFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm1341; GFX10-NEXT: s_waitcnt vmcnt(0)1342; GFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm1343; GFX10-NEXT: s_endpgm1344;1345; GFX11-LABEL: raw_buffer_load_x1_offset_swizzled_not_merged_pregfx12:1346; GFX11: ; %bb.0: ; %main_body1347; GFX11-NEXT: s_clause 0x51348; GFX11-NEXT: buffer_load_b32 v0, off, s[0:3], 0 offset:41349; GFX11-NEXT: buffer_load_b32 v1, off, s[0:3], 0 offset:81350; GFX11-NEXT: buffer_load_b32 v2, off, s[0:3], 0 offset:121351; GFX11-NEXT: buffer_load_b32 v3, off, s[0:3], 0 offset:161352; GFX11-NEXT: buffer_load_b32 v4, off, s[0:3], 0 offset:281353; GFX11-NEXT: buffer_load_b32 v5, off, s[0:3], 0 offset:321354; GFX11-NEXT: s_waitcnt vmcnt(2)1355; GFX11-NEXT: exp mrt0 v0, v1, v2, v3 done1356; GFX11-NEXT: s_waitcnt vmcnt(0)1357; GFX11-NEXT: exp mrt0 v4, v5, v0, v0 done1358; GFX11-NEXT: s_endpgm1359;1360; GFX12-LABEL: raw_buffer_load_x1_offset_swizzled_not_merged_pregfx12:1361; GFX12: ; %bb.0: ; %main_body1362; GFX12-NEXT: s_clause 0x11363; GFX12-NEXT: buffer_load_b128 v[0:3], off, s[0:3], null offset:4 scope:SCOPE_SE1364; GFX12-NEXT: buffer_load_b64 v[4:5], off, s[0:3], null offset:28 scope:SCOPE_SE1365; GFX12-NEXT: s_wait_loadcnt 0x11366; GFX12-NEXT: export mrt0 v0, v1, v2, v3 done1367; GFX12-NEXT: s_wait_loadcnt 0x01368; GFX12-NEXT: export mrt0 v4, v5, v0, v0 done1369; GFX12-NEXT: s_endpgm1370main_body:1371 %r1 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 4, i32 0, i32 8)1372 %r2 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 8, i32 0, i32 8)1373 %r3 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 12, i32 0, i32 8)1374 %r4 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 16, i32 0, i32 8)1375 %r5 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 28, i32 0, i32 8)1376 %r6 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 32, i32 0, i32 8)1377 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)1378 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r5, float %r6, float poison, float poison, i1 true, i1 true)1379 ret void1380}1381 1382define amdgpu_ps void @raw_buffer_load_x1_offset_swizzled_not_merged(<4 x i32> inreg %rsrc) {1383; PREGFX10-LABEL: raw_buffer_load_x1_offset_swizzled_not_merged:1384; PREGFX10: ; %bb.0: ; %main_body1385; PREGFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:41386; PREGFX10-NEXT: buffer_load_dwordx2 v[4:5], off, s[0:3], 0 offset:281387; PREGFX10-NEXT: s_waitcnt vmcnt(1)1388; PREGFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm1389; PREGFX10-NEXT: s_waitcnt vmcnt(0)1390; PREGFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm1391; PREGFX10-NEXT: s_endpgm1392;1393; GFX10-LABEL: raw_buffer_load_x1_offset_swizzled_not_merged:1394; GFX10: ; %bb.0: ; %main_body1395; GFX10-NEXT: s_clause 0x11396; GFX10-NEXT: buffer_load_dwordx4 v[0:3], off, s[0:3], 0 offset:41397; GFX10-NEXT: buffer_load_dwordx2 v[4:5], off, s[0:3], 0 offset:281398; GFX10-NEXT: s_waitcnt vmcnt(1)1399; GFX10-NEXT: exp mrt0 v0, v1, v2, v3 done vm1400; GFX10-NEXT: s_waitcnt vmcnt(0)1401; GFX10-NEXT: exp mrt0 v4, v5, v0, v0 done vm1402; GFX10-NEXT: s_endpgm1403;1404; GFX11-LABEL: raw_buffer_load_x1_offset_swizzled_not_merged:1405; GFX11: ; %bb.0: ; %main_body1406; GFX11-NEXT: s_clause 0x11407; GFX11-NEXT: buffer_load_b128 v[0:3], off, s[0:3], 0 offset:41408; GFX11-NEXT: buffer_load_b64 v[4:5], off, s[0:3], 0 offset:281409; GFX11-NEXT: s_waitcnt vmcnt(1)1410; GFX11-NEXT: exp mrt0 v0, v1, v2, v3 done1411; GFX11-NEXT: s_waitcnt vmcnt(0)1412; GFX11-NEXT: exp mrt0 v4, v5, v0, v0 done1413; GFX11-NEXT: s_endpgm1414;1415; GFX12-LABEL: raw_buffer_load_x1_offset_swizzled_not_merged:1416; GFX12: ; %bb.0: ; %main_body1417; GFX12-NEXT: s_clause 0x51418; GFX12-NEXT: buffer_load_b32 v0, off, s[0:3], null offset:41419; GFX12-NEXT: buffer_load_b32 v1, off, s[0:3], null offset:81420; GFX12-NEXT: buffer_load_b32 v2, off, s[0:3], null offset:121421; GFX12-NEXT: buffer_load_b32 v3, off, s[0:3], null offset:161422; GFX12-NEXT: buffer_load_b32 v4, off, s[0:3], null offset:281423; GFX12-NEXT: buffer_load_b32 v5, off, s[0:3], null offset:321424; GFX12-NEXT: s_wait_loadcnt 0x21425; GFX12-NEXT: export mrt0 v0, v1, v2, v3 done1426; GFX12-NEXT: s_wait_loadcnt 0x01427; GFX12-NEXT: export mrt0 v4, v5, v0, v0 done1428; GFX12-NEXT: s_endpgm1429main_body:1430 %r1 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 4, i32 0, i32 64)1431 %r2 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 8, i32 0, i32 64)1432 %r3 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 12, i32 0, i32 64)1433 %r4 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 16, i32 0, i32 64)1434 %r5 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 28, i32 0, i32 64)1435 %r6 = call float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32> %rsrc, i32 32, i32 0, i32 64)1436 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r1, float %r2, float %r3, float %r4, i1 true, i1 true)1437 call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %r5, float %r6, float poison, float poison, i1 true, i1 true)1438 ret void1439}1440 1441declare float @llvm.amdgcn.raw.buffer.load.f32(<4 x i32>, i32, i32, i32) #01442declare <2 x float> @llvm.amdgcn.raw.buffer.load.v2f32(<4 x i32>, i32, i32, i32) #01443declare <4 x float> @llvm.amdgcn.raw.buffer.load.v4f32(<4 x i32>, i32, i32, i32) #01444declare i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32>, i32, i32, i32) #01445declare <2 x i32> @llvm.amdgcn.raw.buffer.load.v2i32(<4 x i32>, i32, i32, i32) #01446declare <4 x i32> @llvm.amdgcn.raw.buffer.load.v4i32(<4 x i32>, i32, i32, i32) #01447declare void @llvm.amdgcn.exp.f32(i32, i32, float, float, float, float, i1, i1) #01448declare i8 @llvm.amdgcn.raw.buffer.load.i8(<4 x i32>, i32, i32, i32) #01449declare i16 @llvm.amdgcn.raw.buffer.load.i16(<4 x i32>, i32, i32, i32) #01450declare <2 x i16> @llvm.amdgcn.raw.buffer.load.v2i16(<4 x i32>, i32, i32, i32) #01451declare <4 x i16> @llvm.amdgcn.raw.buffer.load.v4i16(<4 x i32>, i32, i32, i32) #01452declare half @llvm.amdgcn.raw.buffer.load.f16(<4 x i32>, i32, i32, i32) #01453declare <2 x half> @llvm.amdgcn.raw.buffer.load.v2f16(<4 x i32>, i32, i32, i32) #01454declare <4 x half> @llvm.amdgcn.raw.buffer.load.v4f16(<4 x i32>, i32, i32, i32) #01455attributes #0 = { nounwind readonly }1456