198 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=SI %s3; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=fiji -mattr=-flat-for-global < %s | FileCheck -check-prefixes=VI %s4; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16,-flat-for-global < %s | FileCheck -check-prefixes=GFX11 %s5; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16,-flat-for-global < %s | FileCheck -check-prefixes=GFX11-FAKE16 %s6 7declare half @llvm.ceil.f16(half %a)8declare <2 x half> @llvm.ceil.v2f16(<2 x half> %a)9 10define amdgpu_kernel void @ceil_f16(11; SI-LABEL: ceil_f16:12; SI: ; %bb.0: ; %entry13; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x914; SI-NEXT: s_mov_b32 s7, 0xf00015; SI-NEXT: s_mov_b32 s6, -116; SI-NEXT: s_mov_b32 s10, s617; SI-NEXT: s_mov_b32 s11, s718; SI-NEXT: s_waitcnt lgkmcnt(0)19; SI-NEXT: s_mov_b32 s8, s220; SI-NEXT: s_mov_b32 s9, s321; SI-NEXT: buffer_load_ushort v0, off, s[8:11], 022; SI-NEXT: s_mov_b32 s4, s023; SI-NEXT: s_mov_b32 s5, s124; SI-NEXT: s_waitcnt vmcnt(0)25; SI-NEXT: v_cvt_f32_f16_e32 v0, v026; SI-NEXT: v_ceil_f32_e32 v0, v027; SI-NEXT: v_cvt_f16_f32_e32 v0, v028; SI-NEXT: buffer_store_short v0, off, s[4:7], 029; SI-NEXT: s_endpgm30;31; VI-LABEL: ceil_f16:32; VI: ; %bb.0: ; %entry33; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2434; VI-NEXT: s_mov_b32 s7, 0xf00035; VI-NEXT: s_mov_b32 s6, -136; VI-NEXT: s_mov_b32 s10, s637; VI-NEXT: s_mov_b32 s11, s738; VI-NEXT: s_waitcnt lgkmcnt(0)39; VI-NEXT: s_mov_b32 s8, s240; VI-NEXT: s_mov_b32 s9, s341; VI-NEXT: buffer_load_ushort v0, off, s[8:11], 042; VI-NEXT: s_mov_b32 s4, s043; VI-NEXT: s_mov_b32 s5, s144; VI-NEXT: s_waitcnt vmcnt(0)45; VI-NEXT: v_ceil_f16_e32 v0, v046; VI-NEXT: buffer_store_short v0, off, s[4:7], 047; VI-NEXT: s_endpgm48;49; GFX11-LABEL: ceil_f16:50; GFX11: ; %bb.0: ; %entry51; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x2452; GFX11-NEXT: s_mov_b32 s6, -153; GFX11-NEXT: s_mov_b32 s7, 0x3101600054; GFX11-NEXT: s_mov_b32 s10, s655; GFX11-NEXT: s_mov_b32 s11, s756; GFX11-NEXT: s_waitcnt lgkmcnt(0)57; GFX11-NEXT: s_mov_b32 s8, s258; GFX11-NEXT: s_mov_b32 s9, s359; GFX11-NEXT: s_mov_b32 s4, s060; GFX11-NEXT: buffer_load_u16 v0, off, s[8:11], 061; GFX11-NEXT: s_mov_b32 s5, s162; GFX11-NEXT: s_waitcnt vmcnt(0)63; GFX11-NEXT: v_ceil_f16_e32 v0.l, v0.l64; GFX11-NEXT: buffer_store_b16 v0, off, s[4:7], 065; GFX11-NEXT: s_endpgm66;67; GFX11-FAKE16-LABEL: ceil_f16:68; GFX11-FAKE16: ; %bb.0: ; %entry69; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x2470; GFX11-FAKE16-NEXT: s_mov_b32 s6, -171; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x3101600072; GFX11-FAKE16-NEXT: s_mov_b32 s10, s673; GFX11-FAKE16-NEXT: s_mov_b32 s11, s774; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)75; GFX11-FAKE16-NEXT: s_mov_b32 s8, s276; GFX11-FAKE16-NEXT: s_mov_b32 s9, s377; GFX11-FAKE16-NEXT: s_mov_b32 s4, s078; GFX11-FAKE16-NEXT: buffer_load_u16 v0, off, s[8:11], 079; GFX11-FAKE16-NEXT: s_mov_b32 s5, s180; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)81; GFX11-FAKE16-NEXT: v_ceil_f16_e32 v0, v082; GFX11-FAKE16-NEXT: buffer_store_b16 v0, off, s[4:7], 083; GFX11-FAKE16-NEXT: s_endpgm84 ptr addrspace(1) %r,85 ptr addrspace(1) %a) {86entry:87 %a.val = load half, ptr addrspace(1) %a88 %r.val = call half @llvm.ceil.f16(half %a.val)89 store half %r.val, ptr addrspace(1) %r90 ret void91}92 93; The original test with manual checks also had these NOT directives:94; COM: SI: v_lshlrev_b32_e32 v[[R_F16_HI:[0-9]+]], 16, v[[R_F16_1]]95; COM: SI-NOT: and96; COM: SI: v_or_b32_e32 v[[R_V2_F16:[0-9]+]], v[[R_F16_0]], v[[R_F16_HI]]97; COM: VI-DAG: v_ceil_f16_sdwa v[[R_F16_1:[0-9]+]], v[[A_V2_F16]] dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_198; COM: VI-NOT: and99; COM: VI: v_or_b32_e32 v[[R_V2_F16:[0-9]+]], v[[R_F16_0]], v[[R_F16_1]]100define amdgpu_kernel void @ceil_v2f16(101; SI-LABEL: ceil_v2f16:102; SI: ; %bb.0: ; %entry103; SI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9104; SI-NEXT: s_mov_b32 s7, 0xf000105; SI-NEXT: s_mov_b32 s6, -1106; SI-NEXT: s_mov_b32 s10, s6107; SI-NEXT: s_mov_b32 s11, s7108; SI-NEXT: s_waitcnt lgkmcnt(0)109; SI-NEXT: s_mov_b32 s8, s2110; SI-NEXT: s_mov_b32 s9, s3111; SI-NEXT: buffer_load_dword v0, off, s[8:11], 0112; SI-NEXT: s_mov_b32 s4, s0113; SI-NEXT: s_mov_b32 s5, s1114; SI-NEXT: s_waitcnt vmcnt(0)115; SI-NEXT: v_lshrrev_b32_e32 v1, 16, v0116; SI-NEXT: v_cvt_f32_f16_e32 v1, v1117; SI-NEXT: v_cvt_f32_f16_e32 v0, v0118; SI-NEXT: v_ceil_f32_e32 v1, v1119; SI-NEXT: v_cvt_f16_f32_e32 v1, v1120; SI-NEXT: v_ceil_f32_e32 v0, v0121; SI-NEXT: v_cvt_f16_f32_e32 v0, v0122; SI-NEXT: v_lshlrev_b32_e32 v1, 16, v1123; SI-NEXT: v_or_b32_e32 v0, v0, v1124; SI-NEXT: buffer_store_dword v0, off, s[4:7], 0125; SI-NEXT: s_endpgm126;127; VI-LABEL: ceil_v2f16:128; VI: ; %bb.0: ; %entry129; VI-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24130; VI-NEXT: s_mov_b32 s7, 0xf000131; VI-NEXT: s_mov_b32 s6, -1132; VI-NEXT: s_mov_b32 s10, s6133; VI-NEXT: s_mov_b32 s11, s7134; VI-NEXT: s_waitcnt lgkmcnt(0)135; VI-NEXT: s_mov_b32 s8, s2136; VI-NEXT: s_mov_b32 s9, s3137; VI-NEXT: buffer_load_dword v0, off, s[8:11], 0138; VI-NEXT: s_mov_b32 s4, s0139; VI-NEXT: s_mov_b32 s5, s1140; VI-NEXT: s_waitcnt vmcnt(0)141; VI-NEXT: v_ceil_f16_sdwa v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1142; VI-NEXT: v_ceil_f16_e32 v0, v0143; VI-NEXT: v_or_b32_e32 v0, v0, v1144; VI-NEXT: buffer_store_dword v0, off, s[4:7], 0145; VI-NEXT: s_endpgm146;147; GFX11-LABEL: ceil_v2f16:148; GFX11: ; %bb.0: ; %entry149; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24150; GFX11-NEXT: s_mov_b32 s6, -1151; GFX11-NEXT: s_mov_b32 s7, 0x31016000152; GFX11-NEXT: s_mov_b32 s10, s6153; GFX11-NEXT: s_mov_b32 s11, s7154; GFX11-NEXT: s_waitcnt lgkmcnt(0)155; GFX11-NEXT: s_mov_b32 s8, s2156; GFX11-NEXT: s_mov_b32 s9, s3157; GFX11-NEXT: s_mov_b32 s4, s0158; GFX11-NEXT: buffer_load_b32 v0, off, s[8:11], 0159; GFX11-NEXT: s_mov_b32 s5, s1160; GFX11-NEXT: s_waitcnt vmcnt(0)161; GFX11-NEXT: v_lshrrev_b32_e32 v1, 16, v0162; GFX11-NEXT: v_ceil_f16_e32 v0.l, v0.l163; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)164; GFX11-NEXT: v_ceil_f16_e32 v0.h, v1.l165; GFX11-NEXT: v_pack_b32_f16 v0, v0.l, v0.h166; GFX11-NEXT: buffer_store_b32 v0, off, s[4:7], 0167; GFX11-NEXT: s_endpgm168;169; GFX11-FAKE16-LABEL: ceil_v2f16:170; GFX11-FAKE16: ; %bb.0: ; %entry171; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x24172; GFX11-FAKE16-NEXT: s_mov_b32 s6, -1173; GFX11-FAKE16-NEXT: s_mov_b32 s7, 0x31016000174; GFX11-FAKE16-NEXT: s_mov_b32 s10, s6175; GFX11-FAKE16-NEXT: s_mov_b32 s11, s7176; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)177; GFX11-FAKE16-NEXT: s_mov_b32 s8, s2178; GFX11-FAKE16-NEXT: s_mov_b32 s9, s3179; GFX11-FAKE16-NEXT: s_mov_b32 s4, s0180; GFX11-FAKE16-NEXT: buffer_load_b32 v0, off, s[8:11], 0181; GFX11-FAKE16-NEXT: s_mov_b32 s5, s1182; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)183; GFX11-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 16, v0184; GFX11-FAKE16-NEXT: v_ceil_f16_e32 v0, v0185; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)186; GFX11-FAKE16-NEXT: v_ceil_f16_e32 v1, v1187; GFX11-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v1188; GFX11-FAKE16-NEXT: buffer_store_b32 v0, off, s[4:7], 0189; GFX11-FAKE16-NEXT: s_endpgm190 ptr addrspace(1) %r,191 ptr addrspace(1) %a) {192entry:193 %a.val = load <2 x half>, ptr addrspace(1) %a194 %r.val = call <2 x half> @llvm.ceil.v2f16(<2 x half> %a.val)195 store <2 x half> %r.val, ptr addrspace(1) %r196 ret void197}198