3331 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-amd-amdhsa -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX678,GFX6 %s3; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -check-prefixes=GFX678,GFX8 %s4; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GFX9 %s5; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s6; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s7; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-TRUE16 %s8; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-FAKE16 %s9 10declare float @llvm.fabs.f32(float) #011declare float @llvm.canonicalize.f32(float) #012declare <2 x float> @llvm.canonicalize.v2f32(<2 x float>) #013declare <3 x float> @llvm.canonicalize.v3f32(<3 x float>) #014declare <4 x float> @llvm.canonicalize.v4f32(<4 x float>) #015declare <8 x float> @llvm.canonicalize.v8f32(<8 x float>) #016declare double @llvm.fabs.f64(double) #017declare double @llvm.canonicalize.f64(double) #018declare <2 x double> @llvm.canonicalize.v2f64(<2 x double>) #019declare <3 x double> @llvm.canonicalize.v3f64(<3 x double>) #020declare <4 x double> @llvm.canonicalize.v4f64(<4 x double>) #021declare half @llvm.canonicalize.f16(half) #022declare <2 x half> @llvm.canonicalize.v2f16(<2 x half>) #023declare i32 @llvm.amdgcn.workitem.id.x() #024 25define amdgpu_kernel void @v_test_canonicalize_var_f32(ptr addrspace(1) %out) #1 {26; GFX678-LABEL: v_test_canonicalize_var_f32:27; GFX678: ; %bb.0:28; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x029; GFX678-NEXT: s_add_i32 s12, s12, s1730; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s1331; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 832; GFX678-NEXT: s_waitcnt lgkmcnt(0)33; GFX678-NEXT: v_mov_b32_e32 v0, s034; GFX678-NEXT: v_mov_b32_e32 v1, s135; GFX678-NEXT: flat_load_dword v2, v[0:1]36; GFX678-NEXT: s_waitcnt vmcnt(0)37; GFX678-NEXT: v_mul_f32_e32 v2, 1.0, v238; GFX678-NEXT: flat_store_dword v[0:1], v239; GFX678-NEXT: s_endpgm40;41; GFX9-LABEL: v_test_canonicalize_var_f32:42; GFX9: ; %bb.0:43; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x044; GFX9-NEXT: v_mov_b32_e32 v0, 045; GFX9-NEXT: s_waitcnt lgkmcnt(0)46; GFX9-NEXT: global_load_dword v1, v0, s[0:1]47; GFX9-NEXT: s_waitcnt vmcnt(0)48; GFX9-NEXT: v_max_f32_e32 v1, v1, v149; GFX9-NEXT: global_store_dword v0, v1, s[0:1]50; GFX9-NEXT: s_endpgm51;52; GFX11-LABEL: v_test_canonicalize_var_f32:53; GFX11: ; %bb.0:54; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x055; GFX11-NEXT: v_mov_b32_e32 v0, 056; GFX11-NEXT: s_waitcnt lgkmcnt(0)57; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]58; GFX11-NEXT: s_waitcnt vmcnt(0)59; GFX11-NEXT: v_max_f32_e32 v1, v1, v160; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]61; GFX11-NEXT: s_endpgm62;63; GFX12-LABEL: v_test_canonicalize_var_f32:64; GFX12: ; %bb.0:65; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x066; GFX12-NEXT: v_mov_b32_e32 v0, 067; GFX12-NEXT: s_wait_kmcnt 0x068; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]69; GFX12-NEXT: s_wait_loadcnt 0x070; GFX12-NEXT: v_max_num_f32_e32 v1, v1, v171; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]72; GFX12-NEXT: s_endpgm73 %val = load float, ptr addrspace(1) %out74 %canonicalized = call float @llvm.canonicalize.f32(float %val)75 store float %canonicalized, ptr addrspace(1) %out76 ret void77}78 79define amdgpu_kernel void @s_test_canonicalize_var_f32(ptr addrspace(1) %out, float %val) #1 {80; GFX6-LABEL: s_test_canonicalize_var_f32:81; GFX6: ; %bb.0:82; GFX6-NEXT: s_load_dword s2, s[8:9], 0x283; GFX6-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x084; GFX6-NEXT: s_add_i32 s12, s12, s1785; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s1386; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 887; GFX6-NEXT: s_waitcnt lgkmcnt(0)88; GFX6-NEXT: v_mul_f32_e64 v2, 1.0, s289; GFX6-NEXT: v_mov_b32_e32 v0, s090; GFX6-NEXT: v_mov_b32_e32 v1, s191; GFX6-NEXT: flat_store_dword v[0:1], v292; GFX6-NEXT: s_endpgm93;94; GFX8-LABEL: s_test_canonicalize_var_f32:95; GFX8: ; %bb.0:96; GFX8-NEXT: s_load_dword s2, s[8:9], 0x897; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x098; GFX8-NEXT: s_add_i32 s12, s12, s1799; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s13100; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8101; GFX8-NEXT: s_waitcnt lgkmcnt(0)102; GFX8-NEXT: v_mul_f32_e64 v2, 1.0, s2103; GFX8-NEXT: v_mov_b32_e32 v0, s0104; GFX8-NEXT: v_mov_b32_e32 v1, s1105; GFX8-NEXT: flat_store_dword v[0:1], v2106; GFX8-NEXT: s_endpgm107;108; GFX9-LABEL: s_test_canonicalize_var_f32:109; GFX9: ; %bb.0:110; GFX9-NEXT: s_load_dword s2, s[8:9], 0x8111; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0112; GFX9-NEXT: v_mov_b32_e32 v0, 0113; GFX9-NEXT: s_waitcnt lgkmcnt(0)114; GFX9-NEXT: v_max_f32_e64 v1, s2, s2115; GFX9-NEXT: global_store_dword v0, v1, s[0:1]116; GFX9-NEXT: s_endpgm117;118; GFX11-LABEL: s_test_canonicalize_var_f32:119; GFX11: ; %bb.0:120; GFX11-NEXT: s_clause 0x1121; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x8122; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0123; GFX11-NEXT: v_mov_b32_e32 v0, 0124; GFX11-NEXT: s_waitcnt lgkmcnt(0)125; GFX11-NEXT: v_max_f32_e64 v1, s2, s2126; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]127; GFX11-NEXT: s_endpgm128;129; GFX12-LABEL: s_test_canonicalize_var_f32:130; GFX12: ; %bb.0:131; GFX12-NEXT: s_load_b96 s[0:2], s[4:5], 0x0132; GFX12-NEXT: v_mov_b32_e32 v0, 0133; GFX12-NEXT: s_wait_kmcnt 0x0134; GFX12-NEXT: v_max_num_f32_e64 v1, s2, s2135; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]136; GFX12-NEXT: s_endpgm137 %canonicalized = call float @llvm.canonicalize.f32(float %val)138 store float %canonicalized, ptr addrspace(1) %out139 ret void140}141 142define amdgpu_kernel void @v_test_canonicalize_fabs_var_f32(ptr addrspace(1) %out) #1 {143; GFX678-LABEL: v_test_canonicalize_fabs_var_f32:144; GFX678: ; %bb.0:145; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0146; GFX678-NEXT: s_add_i32 s12, s12, s17147; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13148; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8149; GFX678-NEXT: s_waitcnt lgkmcnt(0)150; GFX678-NEXT: v_mov_b32_e32 v0, s0151; GFX678-NEXT: v_mov_b32_e32 v1, s1152; GFX678-NEXT: flat_load_dword v2, v[0:1]153; GFX678-NEXT: s_waitcnt vmcnt(0)154; GFX678-NEXT: v_mul_f32_e64 v2, 1.0, |v2|155; GFX678-NEXT: flat_store_dword v[0:1], v2156; GFX678-NEXT: s_endpgm157;158; GFX9-LABEL: v_test_canonicalize_fabs_var_f32:159; GFX9: ; %bb.0:160; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0161; GFX9-NEXT: v_mov_b32_e32 v0, 0162; GFX9-NEXT: s_waitcnt lgkmcnt(0)163; GFX9-NEXT: global_load_dword v1, v0, s[0:1]164; GFX9-NEXT: s_waitcnt vmcnt(0)165; GFX9-NEXT: v_max_f32_e64 v1, |v1|, |v1|166; GFX9-NEXT: global_store_dword v0, v1, s[0:1]167; GFX9-NEXT: s_endpgm168;169; GFX11-LABEL: v_test_canonicalize_fabs_var_f32:170; GFX11: ; %bb.0:171; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0172; GFX11-NEXT: v_mov_b32_e32 v0, 0173; GFX11-NEXT: s_waitcnt lgkmcnt(0)174; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]175; GFX11-NEXT: s_waitcnt vmcnt(0)176; GFX11-NEXT: v_max_f32_e64 v1, |v1|, |v1|177; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]178; GFX11-NEXT: s_endpgm179;180; GFX12-LABEL: v_test_canonicalize_fabs_var_f32:181; GFX12: ; %bb.0:182; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0183; GFX12-NEXT: v_mov_b32_e32 v0, 0184; GFX12-NEXT: s_wait_kmcnt 0x0185; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]186; GFX12-NEXT: s_wait_loadcnt 0x0187; GFX12-NEXT: v_max_num_f32_e64 v1, |v1|, |v1|188; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]189; GFX12-NEXT: s_endpgm190 %val = load float, ptr addrspace(1) %out191 %val.fabs = call float @llvm.fabs.f32(float %val)192 %canonicalized = call float @llvm.canonicalize.f32(float %val.fabs)193 store float %canonicalized, ptr addrspace(1) %out194 ret void195}196 197define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f32(ptr addrspace(1) %out) #1 {198; GFX678-LABEL: v_test_canonicalize_fneg_fabs_var_f32:199; GFX678: ; %bb.0:200; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0201; GFX678-NEXT: s_add_i32 s12, s12, s17202; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13203; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8204; GFX678-NEXT: s_waitcnt lgkmcnt(0)205; GFX678-NEXT: v_mov_b32_e32 v0, s0206; GFX678-NEXT: v_mov_b32_e32 v1, s1207; GFX678-NEXT: flat_load_dword v2, v[0:1]208; GFX678-NEXT: s_waitcnt vmcnt(0)209; GFX678-NEXT: v_mul_f32_e64 v2, -1.0, |v2|210; GFX678-NEXT: flat_store_dword v[0:1], v2211; GFX678-NEXT: s_endpgm212;213; GFX9-LABEL: v_test_canonicalize_fneg_fabs_var_f32:214; GFX9: ; %bb.0:215; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0216; GFX9-NEXT: v_mov_b32_e32 v0, 0217; GFX9-NEXT: s_waitcnt lgkmcnt(0)218; GFX9-NEXT: global_load_dword v1, v0, s[0:1]219; GFX9-NEXT: s_waitcnt vmcnt(0)220; GFX9-NEXT: v_max_f32_e64 v1, -|v1|, -|v1|221; GFX9-NEXT: global_store_dword v0, v1, s[0:1]222; GFX9-NEXT: s_endpgm223;224; GFX11-LABEL: v_test_canonicalize_fneg_fabs_var_f32:225; GFX11: ; %bb.0:226; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0227; GFX11-NEXT: v_mov_b32_e32 v0, 0228; GFX11-NEXT: s_waitcnt lgkmcnt(0)229; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]230; GFX11-NEXT: s_waitcnt vmcnt(0)231; GFX11-NEXT: v_max_f32_e64 v1, -|v1|, -|v1|232; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]233; GFX11-NEXT: s_endpgm234;235; GFX12-LABEL: v_test_canonicalize_fneg_fabs_var_f32:236; GFX12: ; %bb.0:237; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0238; GFX12-NEXT: v_mov_b32_e32 v0, 0239; GFX12-NEXT: s_wait_kmcnt 0x0240; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]241; GFX12-NEXT: s_wait_loadcnt 0x0242; GFX12-NEXT: v_max_num_f32_e64 v1, -|v1|, -|v1|243; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]244; GFX12-NEXT: s_endpgm245 %val = load float, ptr addrspace(1) %out246 %val.fabs = call float @llvm.fabs.f32(float %val)247 %val.fabs.fneg = fneg float %val.fabs248 %canonicalized = call float @llvm.canonicalize.f32(float %val.fabs.fneg)249 store float %canonicalized, ptr addrspace(1) %out250 ret void251}252 253define amdgpu_kernel void @v_test_canonicalize_fneg_var_f32(ptr addrspace(1) %out) #1 {254; GFX678-LABEL: v_test_canonicalize_fneg_var_f32:255; GFX678: ; %bb.0:256; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0257; GFX678-NEXT: s_add_i32 s12, s12, s17258; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13259; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8260; GFX678-NEXT: s_waitcnt lgkmcnt(0)261; GFX678-NEXT: v_mov_b32_e32 v0, s0262; GFX678-NEXT: v_mov_b32_e32 v1, s1263; GFX678-NEXT: flat_load_dword v2, v[0:1]264; GFX678-NEXT: s_waitcnt vmcnt(0)265; GFX678-NEXT: v_mul_f32_e32 v2, -1.0, v2266; GFX678-NEXT: flat_store_dword v[0:1], v2267; GFX678-NEXT: s_endpgm268;269; GFX9-LABEL: v_test_canonicalize_fneg_var_f32:270; GFX9: ; %bb.0:271; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0272; GFX9-NEXT: v_mov_b32_e32 v0, 0273; GFX9-NEXT: s_waitcnt lgkmcnt(0)274; GFX9-NEXT: global_load_dword v1, v0, s[0:1]275; GFX9-NEXT: s_waitcnt vmcnt(0)276; GFX9-NEXT: v_max_f32_e64 v1, -v1, -v1277; GFX9-NEXT: global_store_dword v0, v1, s[0:1]278; GFX9-NEXT: s_endpgm279;280; GFX11-LABEL: v_test_canonicalize_fneg_var_f32:281; GFX11: ; %bb.0:282; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0283; GFX11-NEXT: v_mov_b32_e32 v0, 0284; GFX11-NEXT: s_waitcnt lgkmcnt(0)285; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]286; GFX11-NEXT: s_waitcnt vmcnt(0)287; GFX11-NEXT: v_max_f32_e64 v1, -v1, -v1288; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]289; GFX11-NEXT: s_endpgm290;291; GFX12-LABEL: v_test_canonicalize_fneg_var_f32:292; GFX12: ; %bb.0:293; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0294; GFX12-NEXT: v_mov_b32_e32 v0, 0295; GFX12-NEXT: s_wait_kmcnt 0x0296; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]297; GFX12-NEXT: s_wait_loadcnt 0x0298; GFX12-NEXT: v_max_num_f32_e64 v1, -v1, -v1299; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]300; GFX12-NEXT: s_endpgm301 %val = load float, ptr addrspace(1) %out302 %val.fneg = fneg float %val303 %canonicalized = call float @llvm.canonicalize.f32(float %val.fneg)304 store float %canonicalized, ptr addrspace(1) %out305 ret void306}307 308define amdgpu_kernel void @test_fold_canonicalize_undef_f32(ptr addrspace(1) %out) #1 {309; GFX678-LABEL: test_fold_canonicalize_undef_f32:310; GFX678: ; %bb.0:311; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0312; GFX678-NEXT: s_add_i32 s12, s12, s17313; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13314; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8315; GFX678-NEXT: v_mov_b32_e32 v2, 0316; GFX678-NEXT: s_waitcnt lgkmcnt(0)317; GFX678-NEXT: v_mov_b32_e32 v0, s0318; GFX678-NEXT: v_mov_b32_e32 v1, s1319; GFX678-NEXT: flat_store_dword v[0:1], v2320; GFX678-NEXT: s_endpgm321;322; GFX9-LABEL: test_fold_canonicalize_undef_f32:323; GFX9: ; %bb.0:324; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0325; GFX9-NEXT: v_mov_b32_e32 v0, 0326; GFX9-NEXT: s_waitcnt lgkmcnt(0)327; GFX9-NEXT: global_store_dword v0, v0, s[0:1]328; GFX9-NEXT: s_endpgm329;330; GFX11-LABEL: test_fold_canonicalize_undef_f32:331; GFX11: ; %bb.0:332; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0333; GFX11-NEXT: v_mov_b32_e32 v0, 0334; GFX11-NEXT: s_waitcnt lgkmcnt(0)335; GFX11-NEXT: global_store_b32 v0, v0, s[0:1]336; GFX11-NEXT: s_endpgm337;338; GFX12-LABEL: test_fold_canonicalize_undef_f32:339; GFX12: ; %bb.0:340; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0341; GFX12-NEXT: v_mov_b32_e32 v0, 0342; GFX12-NEXT: s_wait_kmcnt 0x0343; GFX12-NEXT: global_store_b32 v0, v0, s[0:1]344; GFX12-NEXT: s_endpgm345 %canonicalized = call float @llvm.canonicalize.f32(float undef)346 store float %canonicalized, ptr addrspace(1) %out347 ret void348}349 350define amdgpu_kernel void @test_fold_canonicalize_p0_f32(ptr addrspace(1) %out) #1 {351; GFX678-LABEL: test_fold_canonicalize_p0_f32:352; GFX678: ; %bb.0:353; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0354; GFX678-NEXT: s_add_i32 s12, s12, s17355; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13356; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8357; GFX678-NEXT: v_mov_b32_e32 v2, 0358; GFX678-NEXT: s_waitcnt lgkmcnt(0)359; GFX678-NEXT: v_mov_b32_e32 v0, s0360; GFX678-NEXT: v_mov_b32_e32 v1, s1361; GFX678-NEXT: flat_store_dword v[0:1], v2362; GFX678-NEXT: s_endpgm363;364; GFX9-LABEL: test_fold_canonicalize_p0_f32:365; GFX9: ; %bb.0:366; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0367; GFX9-NEXT: v_mov_b32_e32 v0, 0368; GFX9-NEXT: s_waitcnt lgkmcnt(0)369; GFX9-NEXT: global_store_dword v0, v0, s[0:1]370; GFX9-NEXT: s_endpgm371;372; GFX11-LABEL: test_fold_canonicalize_p0_f32:373; GFX11: ; %bb.0:374; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0375; GFX11-NEXT: v_mov_b32_e32 v0, 0376; GFX11-NEXT: s_waitcnt lgkmcnt(0)377; GFX11-NEXT: global_store_b32 v0, v0, s[0:1]378; GFX11-NEXT: s_endpgm379;380; GFX12-LABEL: test_fold_canonicalize_p0_f32:381; GFX12: ; %bb.0:382; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0383; GFX12-NEXT: v_mov_b32_e32 v0, 0384; GFX12-NEXT: s_wait_kmcnt 0x0385; GFX12-NEXT: global_store_b32 v0, v0, s[0:1]386; GFX12-NEXT: s_endpgm387 %canonicalized = call float @llvm.canonicalize.f32(float 0.0)388 store float %canonicalized, ptr addrspace(1) %out389 ret void390}391 392define amdgpu_kernel void @test_fold_canonicalize_n0_f32(ptr addrspace(1) %out) #1 {393; GFX678-LABEL: test_fold_canonicalize_n0_f32:394; GFX678: ; %bb.0:395; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0396; GFX678-NEXT: s_add_i32 s12, s12, s17397; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13398; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8399; GFX678-NEXT: v_bfrev_b32_e32 v2, 1400; GFX678-NEXT: s_waitcnt lgkmcnt(0)401; GFX678-NEXT: v_mov_b32_e32 v0, s0402; GFX678-NEXT: v_mov_b32_e32 v1, s1403; GFX678-NEXT: flat_store_dword v[0:1], v2404; GFX678-NEXT: s_endpgm405;406; GFX9-LABEL: test_fold_canonicalize_n0_f32:407; GFX9: ; %bb.0:408; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0409; GFX9-NEXT: v_mov_b32_e32 v0, 0410; GFX9-NEXT: v_bfrev_b32_e32 v1, 1411; GFX9-NEXT: s_waitcnt lgkmcnt(0)412; GFX9-NEXT: global_store_dword v0, v1, s[0:1]413; GFX9-NEXT: s_endpgm414;415; GFX11-LABEL: test_fold_canonicalize_n0_f32:416; GFX11: ; %bb.0:417; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0418; GFX11-NEXT: v_mov_b32_e32 v0, 0419; GFX11-NEXT: v_bfrev_b32_e32 v1, 1420; GFX11-NEXT: s_waitcnt lgkmcnt(0)421; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]422; GFX11-NEXT: s_endpgm423;424; GFX12-LABEL: test_fold_canonicalize_n0_f32:425; GFX12: ; %bb.0:426; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0427; GFX12-NEXT: v_mov_b32_e32 v0, 0428; GFX12-NEXT: v_bfrev_b32_e32 v1, 1429; GFX12-NEXT: s_wait_kmcnt 0x0430; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]431; GFX12-NEXT: s_endpgm432 %canonicalized = call float @llvm.canonicalize.f32(float -0.0)433 store float %canonicalized, ptr addrspace(1) %out434 ret void435}436 437define amdgpu_kernel void @test_fold_canonicalize_p1_f32(ptr addrspace(1) %out) #1 {438; GFX678-LABEL: test_fold_canonicalize_p1_f32:439; GFX678: ; %bb.0:440; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0441; GFX678-NEXT: s_add_i32 s12, s12, s17442; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13443; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8444; GFX678-NEXT: v_mov_b32_e32 v2, 1.0445; GFX678-NEXT: s_waitcnt lgkmcnt(0)446; GFX678-NEXT: v_mov_b32_e32 v0, s0447; GFX678-NEXT: v_mov_b32_e32 v1, s1448; GFX678-NEXT: flat_store_dword v[0:1], v2449; GFX678-NEXT: s_endpgm450;451; GFX9-LABEL: test_fold_canonicalize_p1_f32:452; GFX9: ; %bb.0:453; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0454; GFX9-NEXT: v_mov_b32_e32 v0, 0455; GFX9-NEXT: v_mov_b32_e32 v1, 1.0456; GFX9-NEXT: s_waitcnt lgkmcnt(0)457; GFX9-NEXT: global_store_dword v0, v1, s[0:1]458; GFX9-NEXT: s_endpgm459;460; GFX11-LABEL: test_fold_canonicalize_p1_f32:461; GFX11: ; %bb.0:462; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0463; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 1.0464; GFX11-NEXT: s_waitcnt lgkmcnt(0)465; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]466; GFX11-NEXT: s_endpgm467;468; GFX12-LABEL: test_fold_canonicalize_p1_f32:469; GFX12: ; %bb.0:470; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0471; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 1.0472; GFX12-NEXT: s_wait_kmcnt 0x0473; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]474; GFX12-NEXT: s_endpgm475 %canonicalized = call float @llvm.canonicalize.f32(float 1.0)476 store float %canonicalized, ptr addrspace(1) %out477 ret void478}479 480define amdgpu_kernel void @test_fold_canonicalize_n1_f32(ptr addrspace(1) %out) #1 {481; GFX678-LABEL: test_fold_canonicalize_n1_f32:482; GFX678: ; %bb.0:483; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0484; GFX678-NEXT: s_add_i32 s12, s12, s17485; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13486; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8487; GFX678-NEXT: v_mov_b32_e32 v2, -1.0488; GFX678-NEXT: s_waitcnt lgkmcnt(0)489; GFX678-NEXT: v_mov_b32_e32 v0, s0490; GFX678-NEXT: v_mov_b32_e32 v1, s1491; GFX678-NEXT: flat_store_dword v[0:1], v2492; GFX678-NEXT: s_endpgm493;494; GFX9-LABEL: test_fold_canonicalize_n1_f32:495; GFX9: ; %bb.0:496; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0497; GFX9-NEXT: v_mov_b32_e32 v0, 0498; GFX9-NEXT: v_mov_b32_e32 v1, -1.0499; GFX9-NEXT: s_waitcnt lgkmcnt(0)500; GFX9-NEXT: global_store_dword v0, v1, s[0:1]501; GFX9-NEXT: s_endpgm502;503; GFX11-LABEL: test_fold_canonicalize_n1_f32:504; GFX11: ; %bb.0:505; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0506; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, -1.0507; GFX11-NEXT: s_waitcnt lgkmcnt(0)508; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]509; GFX11-NEXT: s_endpgm510;511; GFX12-LABEL: test_fold_canonicalize_n1_f32:512; GFX12: ; %bb.0:513; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0514; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, -1.0515; GFX12-NEXT: s_wait_kmcnt 0x0516; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]517; GFX12-NEXT: s_endpgm518 %canonicalized = call float @llvm.canonicalize.f32(float -1.0)519 store float %canonicalized, ptr addrspace(1) %out520 ret void521}522 523define amdgpu_kernel void @test_fold_canonicalize_literal_f32(ptr addrspace(1) %out) #1 {524; GFX678-LABEL: test_fold_canonicalize_literal_f32:525; GFX678: ; %bb.0:526; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0527; GFX678-NEXT: s_add_i32 s12, s12, s17528; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13529; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8530; GFX678-NEXT: v_mov_b32_e32 v2, 0x41800000531; GFX678-NEXT: s_waitcnt lgkmcnt(0)532; GFX678-NEXT: v_mov_b32_e32 v0, s0533; GFX678-NEXT: v_mov_b32_e32 v1, s1534; GFX678-NEXT: flat_store_dword v[0:1], v2535; GFX678-NEXT: s_endpgm536;537; GFX9-LABEL: test_fold_canonicalize_literal_f32:538; GFX9: ; %bb.0:539; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0540; GFX9-NEXT: v_mov_b32_e32 v0, 0541; GFX9-NEXT: v_mov_b32_e32 v1, 0x41800000542; GFX9-NEXT: s_waitcnt lgkmcnt(0)543; GFX9-NEXT: global_store_dword v0, v1, s[0:1]544; GFX9-NEXT: s_endpgm545;546; GFX11-LABEL: test_fold_canonicalize_literal_f32:547; GFX11: ; %bb.0:548; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0549; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x41800000550; GFX11-NEXT: s_waitcnt lgkmcnt(0)551; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]552; GFX11-NEXT: s_endpgm553;554; GFX12-LABEL: test_fold_canonicalize_literal_f32:555; GFX12: ; %bb.0:556; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0557; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x41800000558; GFX12-NEXT: s_wait_kmcnt 0x0559; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]560; GFX12-NEXT: s_endpgm561 %canonicalized = call float @llvm.canonicalize.f32(float 16.0)562 store float %canonicalized, ptr addrspace(1) %out563 ret void564}565 566define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32(ptr addrspace(1) %out) #1 {567; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32:568; GFX678: ; %bb.0:569; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0570; GFX678-NEXT: s_add_i32 s12, s12, s17571; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13572; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8573; GFX678-NEXT: v_mov_b32_e32 v2, 0574; GFX678-NEXT: s_waitcnt lgkmcnt(0)575; GFX678-NEXT: v_mov_b32_e32 v0, s0576; GFX678-NEXT: v_mov_b32_e32 v1, s1577; GFX678-NEXT: flat_store_dword v[0:1], v2578; GFX678-NEXT: s_endpgm579;580; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32:581; GFX9: ; %bb.0:582; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0583; GFX9-NEXT: v_mov_b32_e32 v0, 0584; GFX9-NEXT: s_waitcnt lgkmcnt(0)585; GFX9-NEXT: global_store_dword v0, v0, s[0:1]586; GFX9-NEXT: s_endpgm587;588; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32:589; GFX11: ; %bb.0:590; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0591; GFX11-NEXT: v_mov_b32_e32 v0, 0592; GFX11-NEXT: s_waitcnt lgkmcnt(0)593; GFX11-NEXT: global_store_b32 v0, v0, s[0:1]594; GFX11-NEXT: s_endpgm595;596; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32:597; GFX12: ; %bb.0:598; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0599; GFX12-NEXT: v_mov_b32_e32 v0, 0600; GFX12-NEXT: s_wait_kmcnt 0x0601; GFX12-NEXT: global_store_b32 v0, v0, s[0:1]602; GFX12-NEXT: s_endpgm603 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))604 store float %canonicalized, ptr addrspace(1) %out605 ret void606}607 608define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32_dynamic(ptr addrspace(1) %out) #5 {609; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:610; GFX678: ; %bb.0:611; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0612; GFX678-NEXT: s_add_i32 s12, s12, s17613; GFX678-NEXT: s_mov_b32 s2, 0x7fffff614; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13615; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8616; GFX678-NEXT: s_waitcnt lgkmcnt(0)617; GFX678-NEXT: v_mov_b32_e32 v0, s0618; GFX678-NEXT: v_mul_f32_e64 v2, 1.0, s2619; GFX678-NEXT: v_mov_b32_e32 v1, s1620; GFX678-NEXT: flat_store_dword v[0:1], v2621; GFX678-NEXT: s_endpgm622;623; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:624; GFX9: ; %bb.0:625; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0626; GFX9-NEXT: s_mov_b32 s2, 0x7fffff627; GFX9-NEXT: v_mov_b32_e32 v0, 0628; GFX9-NEXT: v_max_f32_e64 v1, s2, s2629; GFX9-NEXT: s_waitcnt lgkmcnt(0)630; GFX9-NEXT: global_store_dword v0, v1, s[0:1]631; GFX9-NEXT: s_endpgm632;633; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:634; GFX11: ; %bb.0:635; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0636; GFX11-NEXT: v_mov_b32_e32 v0, 0637; GFX11-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff638; GFX11-NEXT: s_waitcnt lgkmcnt(0)639; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]640; GFX11-NEXT: s_endpgm641;642; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic:643; GFX12: ; %bb.0:644; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0645; GFX12-NEXT: v_mov_b32_e32 v0, 0646; GFX12-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff647; GFX12-NEXT: s_wait_kmcnt 0x0648; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]649; GFX12-NEXT: s_endpgm650 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))651 store float %canonicalized, ptr addrspace(1) %out652 ret void653}654 655define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out(ptr addrspace(1) %out) #6 {656; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:657; GFX678: ; %bb.0:658; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0659; GFX678-NEXT: s_add_i32 s12, s12, s17660; GFX678-NEXT: s_mov_b32 s2, 0x7fffff661; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13662; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8663; GFX678-NEXT: s_waitcnt lgkmcnt(0)664; GFX678-NEXT: v_mov_b32_e32 v0, s0665; GFX678-NEXT: v_mul_f32_e64 v2, 1.0, s2666; GFX678-NEXT: v_mov_b32_e32 v1, s1667; GFX678-NEXT: flat_store_dword v[0:1], v2668; GFX678-NEXT: s_endpgm669;670; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:671; GFX9: ; %bb.0:672; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0673; GFX9-NEXT: s_mov_b32 s2, 0x7fffff674; GFX9-NEXT: v_mov_b32_e32 v0, 0675; GFX9-NEXT: v_max_f32_e64 v1, s2, s2676; GFX9-NEXT: s_waitcnt lgkmcnt(0)677; GFX9-NEXT: global_store_dword v0, v1, s[0:1]678; GFX9-NEXT: s_endpgm679;680; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:681; GFX11: ; %bb.0:682; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0683; GFX11-NEXT: v_mov_b32_e32 v0, 0684; GFX11-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff685; GFX11-NEXT: s_waitcnt lgkmcnt(0)686; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]687; GFX11-NEXT: s_endpgm688;689; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_out:690; GFX12: ; %bb.0:691; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0692; GFX12-NEXT: v_mov_b32_e32 v0, 0693; GFX12-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff694; GFX12-NEXT: s_wait_kmcnt 0x0695; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]696; GFX12-NEXT: s_endpgm697 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))698 store float %canonicalized, ptr addrspace(1) %out699 ret void700}701 702define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in(ptr addrspace(1) %out) #7 {703; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:704; GFX678: ; %bb.0:705; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0706; GFX678-NEXT: s_add_i32 s12, s12, s17707; GFX678-NEXT: s_mov_b32 s2, 0x7fffff708; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13709; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8710; GFX678-NEXT: s_waitcnt lgkmcnt(0)711; GFX678-NEXT: v_mov_b32_e32 v0, s0712; GFX678-NEXT: v_mul_f32_e64 v2, 1.0, s2713; GFX678-NEXT: v_mov_b32_e32 v1, s1714; GFX678-NEXT: flat_store_dword v[0:1], v2715; GFX678-NEXT: s_endpgm716;717; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:718; GFX9: ; %bb.0:719; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0720; GFX9-NEXT: s_mov_b32 s2, 0x7fffff721; GFX9-NEXT: v_mov_b32_e32 v0, 0722; GFX9-NEXT: v_max_f32_e64 v1, s2, s2723; GFX9-NEXT: s_waitcnt lgkmcnt(0)724; GFX9-NEXT: global_store_dword v0, v1, s[0:1]725; GFX9-NEXT: s_endpgm726;727; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:728; GFX11: ; %bb.0:729; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0730; GFX11-NEXT: v_mov_b32_e32 v0, 0731; GFX11-NEXT: v_max_f32_e64 v1, 0x7fffff, 0x7fffff732; GFX11-NEXT: s_waitcnt lgkmcnt(0)733; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]734; GFX11-NEXT: s_endpgm735;736; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f32_dynamic_in:737; GFX12: ; %bb.0:738; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0739; GFX12-NEXT: v_mov_b32_e32 v0, 0740; GFX12-NEXT: v_max_num_f32_e64 v1, 0x7fffff, 0x7fffff741; GFX12-NEXT: s_wait_kmcnt 0x0742; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]743; GFX12-NEXT: s_endpgm744 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))745 store float %canonicalized, ptr addrspace(1) %out746 ret void747}748 749define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f32(ptr addrspace(1) %out) #3 {750; GFX678-LABEL: test_denormals_fold_canonicalize_denormal0_f32:751; GFX678: ; %bb.0:752; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0753; GFX678-NEXT: s_add_i32 s12, s12, s17754; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13755; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8756; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fffff757; GFX678-NEXT: s_waitcnt lgkmcnt(0)758; GFX678-NEXT: v_mov_b32_e32 v0, s0759; GFX678-NEXT: v_mov_b32_e32 v1, s1760; GFX678-NEXT: flat_store_dword v[0:1], v2761; GFX678-NEXT: s_endpgm762;763; GFX9-LABEL: test_denormals_fold_canonicalize_denormal0_f32:764; GFX9: ; %bb.0:765; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0766; GFX9-NEXT: v_mov_b32_e32 v0, 0767; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fffff768; GFX9-NEXT: s_waitcnt lgkmcnt(0)769; GFX9-NEXT: global_store_dword v0, v1, s[0:1]770; GFX9-NEXT: s_endpgm771;772; GFX11-LABEL: test_denormals_fold_canonicalize_denormal0_f32:773; GFX11: ; %bb.0:774; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0775; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fffff776; GFX11-NEXT: s_waitcnt lgkmcnt(0)777; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]778; GFX11-NEXT: s_endpgm779;780; GFX12-LABEL: test_denormals_fold_canonicalize_denormal0_f32:781; GFX12: ; %bb.0:782; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0783; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fffff784; GFX12-NEXT: s_wait_kmcnt 0x0785; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]786; GFX12-NEXT: s_endpgm787 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))788 store float %canonicalized, ptr addrspace(1) %out789 ret void790}791 792define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal1_f32(ptr addrspace(1) %out) #1 {793; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:794; GFX678: ; %bb.0:795; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0796; GFX678-NEXT: s_add_i32 s12, s12, s17797; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13798; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8799; GFX678-NEXT: v_bfrev_b32_e32 v2, 1800; GFX678-NEXT: s_waitcnt lgkmcnt(0)801; GFX678-NEXT: v_mov_b32_e32 v0, s0802; GFX678-NEXT: v_mov_b32_e32 v1, s1803; GFX678-NEXT: flat_store_dword v[0:1], v2804; GFX678-NEXT: s_endpgm805;806; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:807; GFX9: ; %bb.0:808; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0809; GFX9-NEXT: v_mov_b32_e32 v0, 0810; GFX9-NEXT: v_bfrev_b32_e32 v1, 1811; GFX9-NEXT: s_waitcnt lgkmcnt(0)812; GFX9-NEXT: global_store_dword v0, v1, s[0:1]813; GFX9-NEXT: s_endpgm814;815; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:816; GFX11: ; %bb.0:817; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0818; GFX11-NEXT: v_mov_b32_e32 v0, 0819; GFX11-NEXT: v_bfrev_b32_e32 v1, 1820; GFX11-NEXT: s_waitcnt lgkmcnt(0)821; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]822; GFX11-NEXT: s_endpgm823;824; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal1_f32:825; GFX12: ; %bb.0:826; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0827; GFX12-NEXT: v_mov_b32_e32 v0, 0828; GFX12-NEXT: v_bfrev_b32_e32 v1, 1829; GFX12-NEXT: s_wait_kmcnt 0x0830; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]831; GFX12-NEXT: s_endpgm832 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))833 store float %canonicalized, ptr addrspace(1) %out834 ret void835}836 837define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal1_f32(ptr addrspace(1) %out) #3 {838; GFX678-LABEL: test_denormals_fold_canonicalize_denormal1_f32:839; GFX678: ; %bb.0:840; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0841; GFX678-NEXT: s_add_i32 s12, s12, s17842; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13843; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8844; GFX678-NEXT: v_mov_b32_e32 v2, 0x807fffff845; GFX678-NEXT: s_waitcnt lgkmcnt(0)846; GFX678-NEXT: v_mov_b32_e32 v0, s0847; GFX678-NEXT: v_mov_b32_e32 v1, s1848; GFX678-NEXT: flat_store_dword v[0:1], v2849; GFX678-NEXT: s_endpgm850;851; GFX9-LABEL: test_denormals_fold_canonicalize_denormal1_f32:852; GFX9: ; %bb.0:853; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0854; GFX9-NEXT: v_mov_b32_e32 v0, 0855; GFX9-NEXT: v_mov_b32_e32 v1, 0x807fffff856; GFX9-NEXT: s_waitcnt lgkmcnt(0)857; GFX9-NEXT: global_store_dword v0, v1, s[0:1]858; GFX9-NEXT: s_endpgm859;860; GFX11-LABEL: test_denormals_fold_canonicalize_denormal1_f32:861; GFX11: ; %bb.0:862; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0863; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x807fffff864; GFX11-NEXT: s_waitcnt lgkmcnt(0)865; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]866; GFX11-NEXT: s_endpgm867;868; GFX12-LABEL: test_denormals_fold_canonicalize_denormal1_f32:869; GFX12: ; %bb.0:870; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0871; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x807fffff872; GFX12-NEXT: s_wait_kmcnt 0x0873; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]874; GFX12-NEXT: s_endpgm875 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2155872255 to float))876 store float %canonicalized, ptr addrspace(1) %out877 ret void878}879 880define amdgpu_kernel void @test_fold_canonicalize_qnan_f32(ptr addrspace(1) %out) #1 {881; GFX678-LABEL: test_fold_canonicalize_qnan_f32:882; GFX678: ; %bb.0:883; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0884; GFX678-NEXT: s_add_i32 s12, s12, s17885; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13886; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8887; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000888; GFX678-NEXT: s_waitcnt lgkmcnt(0)889; GFX678-NEXT: v_mov_b32_e32 v0, s0890; GFX678-NEXT: v_mov_b32_e32 v1, s1891; GFX678-NEXT: flat_store_dword v[0:1], v2892; GFX678-NEXT: s_endpgm893;894; GFX9-LABEL: test_fold_canonicalize_qnan_f32:895; GFX9: ; %bb.0:896; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0897; GFX9-NEXT: v_mov_b32_e32 v0, 0898; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000899; GFX9-NEXT: s_waitcnt lgkmcnt(0)900; GFX9-NEXT: global_store_dword v0, v1, s[0:1]901; GFX9-NEXT: s_endpgm902;903; GFX11-LABEL: test_fold_canonicalize_qnan_f32:904; GFX11: ; %bb.0:905; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0906; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000907; GFX11-NEXT: s_waitcnt lgkmcnt(0)908; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]909; GFX11-NEXT: s_endpgm910;911; GFX12-LABEL: test_fold_canonicalize_qnan_f32:912; GFX12: ; %bb.0:913; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0914; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000915; GFX12-NEXT: s_wait_kmcnt 0x0916; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]917; GFX12-NEXT: s_endpgm918 %canonicalized = call float @llvm.canonicalize.f32(float 0x7FF8000000000000)919 store float %canonicalized, ptr addrspace(1) %out920 ret void921}922 923define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg1_f32(ptr addrspace(1) %out) #1 {924; GFX678-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:925; GFX678: ; %bb.0:926; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0927; GFX678-NEXT: s_add_i32 s12, s12, s17928; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13929; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8930; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000931; GFX678-NEXT: s_waitcnt lgkmcnt(0)932; GFX678-NEXT: v_mov_b32_e32 v0, s0933; GFX678-NEXT: v_mov_b32_e32 v1, s1934; GFX678-NEXT: flat_store_dword v[0:1], v2935; GFX678-NEXT: s_endpgm936;937; GFX9-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:938; GFX9: ; %bb.0:939; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0940; GFX9-NEXT: v_mov_b32_e32 v0, 0941; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000942; GFX9-NEXT: s_waitcnt lgkmcnt(0)943; GFX9-NEXT: global_store_dword v0, v1, s[0:1]944; GFX9-NEXT: s_endpgm945;946; GFX11-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:947; GFX11: ; %bb.0:948; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0949; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000950; GFX11-NEXT: s_waitcnt lgkmcnt(0)951; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]952; GFX11-NEXT: s_endpgm953;954; GFX12-LABEL: test_fold_canonicalize_qnan_value_neg1_f32:955; GFX12: ; %bb.0:956; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x0957; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000958; GFX12-NEXT: s_wait_kmcnt 0x0959; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]960; GFX12-NEXT: s_endpgm961 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -1 to float))962 store float %canonicalized, ptr addrspace(1) %out963 ret void964}965 966define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg2_f32(ptr addrspace(1) %out) #1 {967; GFX678-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:968; GFX678: ; %bb.0:969; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0970; GFX678-NEXT: s_add_i32 s12, s12, s17971; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s13972; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 8973; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc00000974; GFX678-NEXT: s_waitcnt lgkmcnt(0)975; GFX678-NEXT: v_mov_b32_e32 v0, s0976; GFX678-NEXT: v_mov_b32_e32 v1, s1977; GFX678-NEXT: flat_store_dword v[0:1], v2978; GFX678-NEXT: s_endpgm979;980; GFX9-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:981; GFX9: ; %bb.0:982; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x0983; GFX9-NEXT: v_mov_b32_e32 v0, 0984; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc00000985; GFX9-NEXT: s_waitcnt lgkmcnt(0)986; GFX9-NEXT: global_store_dword v0, v1, s[0:1]987; GFX9-NEXT: s_endpgm988;989; GFX11-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:990; GFX11: ; %bb.0:991; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x0992; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc00000993; GFX11-NEXT: s_waitcnt lgkmcnt(0)994; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]995; GFX11-NEXT: s_endpgm996;997; GFX12-LABEL: test_fold_canonicalize_qnan_value_neg2_f32:998; GFX12: ; %bb.0:999; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01000; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001001; GFX12-NEXT: s_wait_kmcnt 0x01002; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1003; GFX12-NEXT: s_endpgm1004 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 -2 to float))1005 store float %canonicalized, ptr addrspace(1) %out1006 ret void1007}1008 1009define amdgpu_kernel void @test_fold_canonicalize_snan0_value_f32(ptr addrspace(1) %out) #1 {1010; GFX678-LABEL: test_fold_canonicalize_snan0_value_f32:1011; GFX678: ; %bb.0:1012; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01013; GFX678-NEXT: s_add_i32 s12, s12, s171014; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131015; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81016; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc000001017; GFX678-NEXT: s_waitcnt lgkmcnt(0)1018; GFX678-NEXT: v_mov_b32_e32 v0, s01019; GFX678-NEXT: v_mov_b32_e32 v1, s11020; GFX678-NEXT: flat_store_dword v[0:1], v21021; GFX678-NEXT: s_endpgm1022;1023; GFX9-LABEL: test_fold_canonicalize_snan0_value_f32:1024; GFX9: ; %bb.0:1025; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01026; GFX9-NEXT: v_mov_b32_e32 v0, 01027; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc000001028; GFX9-NEXT: s_waitcnt lgkmcnt(0)1029; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1030; GFX9-NEXT: s_endpgm1031;1032; GFX11-LABEL: test_fold_canonicalize_snan0_value_f32:1033; GFX11: ; %bb.0:1034; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01035; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001036; GFX11-NEXT: s_waitcnt lgkmcnt(0)1037; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1038; GFX11-NEXT: s_endpgm1039;1040; GFX12-LABEL: test_fold_canonicalize_snan0_value_f32:1041; GFX12: ; %bb.0:1042; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01043; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001044; GFX12-NEXT: s_wait_kmcnt 0x01045; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1046; GFX12-NEXT: s_endpgm1047 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2139095041 to float))1048 store float %canonicalized, ptr addrspace(1) %out1049 ret void1050}1051 1052define amdgpu_kernel void @test_fold_canonicalize_snan1_value_f32(ptr addrspace(1) %out) #1 {1053; GFX678-LABEL: test_fold_canonicalize_snan1_value_f32:1054; GFX678: ; %bb.0:1055; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01056; GFX678-NEXT: s_add_i32 s12, s12, s171057; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131058; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81059; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc000001060; GFX678-NEXT: s_waitcnt lgkmcnt(0)1061; GFX678-NEXT: v_mov_b32_e32 v0, s01062; GFX678-NEXT: v_mov_b32_e32 v1, s11063; GFX678-NEXT: flat_store_dword v[0:1], v21064; GFX678-NEXT: s_endpgm1065;1066; GFX9-LABEL: test_fold_canonicalize_snan1_value_f32:1067; GFX9: ; %bb.0:1068; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01069; GFX9-NEXT: v_mov_b32_e32 v0, 01070; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc000001071; GFX9-NEXT: s_waitcnt lgkmcnt(0)1072; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1073; GFX9-NEXT: s_endpgm1074;1075; GFX11-LABEL: test_fold_canonicalize_snan1_value_f32:1076; GFX11: ; %bb.0:1077; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01078; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001079; GFX11-NEXT: s_waitcnt lgkmcnt(0)1080; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1081; GFX11-NEXT: s_endpgm1082;1083; GFX12-LABEL: test_fold_canonicalize_snan1_value_f32:1084; GFX12: ; %bb.0:1085; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01086; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001087; GFX12-NEXT: s_wait_kmcnt 0x01088; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1089; GFX12-NEXT: s_endpgm1090 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 2143289343 to float))1091 store float %canonicalized, ptr addrspace(1) %out1092 ret void1093}1094 1095define amdgpu_kernel void @test_fold_canonicalize_snan2_value_f32(ptr addrspace(1) %out) #1 {1096; GFX678-LABEL: test_fold_canonicalize_snan2_value_f32:1097; GFX678: ; %bb.0:1098; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01099; GFX678-NEXT: s_add_i32 s12, s12, s171100; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131101; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81102; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc000001103; GFX678-NEXT: s_waitcnt lgkmcnt(0)1104; GFX678-NEXT: v_mov_b32_e32 v0, s01105; GFX678-NEXT: v_mov_b32_e32 v1, s11106; GFX678-NEXT: flat_store_dword v[0:1], v21107; GFX678-NEXT: s_endpgm1108;1109; GFX9-LABEL: test_fold_canonicalize_snan2_value_f32:1110; GFX9: ; %bb.0:1111; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01112; GFX9-NEXT: v_mov_b32_e32 v0, 01113; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc000001114; GFX9-NEXT: s_waitcnt lgkmcnt(0)1115; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1116; GFX9-NEXT: s_endpgm1117;1118; GFX11-LABEL: test_fold_canonicalize_snan2_value_f32:1119; GFX11: ; %bb.0:1120; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01121; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001122; GFX11-NEXT: s_waitcnt lgkmcnt(0)1123; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1124; GFX11-NEXT: s_endpgm1125;1126; GFX12-LABEL: test_fold_canonicalize_snan2_value_f32:1127; GFX12: ; %bb.0:1128; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01129; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001130; GFX12-NEXT: s_wait_kmcnt 0x01131; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1132; GFX12-NEXT: s_endpgm1133 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4286578689 to float))1134 store float %canonicalized, ptr addrspace(1) %out1135 ret void1136}1137 1138define amdgpu_kernel void @test_fold_canonicalize_snan3_value_f32(ptr addrspace(1) %out) #1 {1139; GFX678-LABEL: test_fold_canonicalize_snan3_value_f32:1140; GFX678: ; %bb.0:1141; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01142; GFX678-NEXT: s_add_i32 s12, s12, s171143; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131144; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81145; GFX678-NEXT: v_mov_b32_e32 v2, 0x7fc000001146; GFX678-NEXT: s_waitcnt lgkmcnt(0)1147; GFX678-NEXT: v_mov_b32_e32 v0, s01148; GFX678-NEXT: v_mov_b32_e32 v1, s11149; GFX678-NEXT: flat_store_dword v[0:1], v21150; GFX678-NEXT: s_endpgm1151;1152; GFX9-LABEL: test_fold_canonicalize_snan3_value_f32:1153; GFX9: ; %bb.0:1154; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01155; GFX9-NEXT: v_mov_b32_e32 v0, 01156; GFX9-NEXT: v_mov_b32_e32 v1, 0x7fc000001157; GFX9-NEXT: s_waitcnt lgkmcnt(0)1158; GFX9-NEXT: global_store_dword v0, v1, s[0:1]1159; GFX9-NEXT: s_endpgm1160;1161; GFX11-LABEL: test_fold_canonicalize_snan3_value_f32:1162; GFX11: ; %bb.0:1163; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01164; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001165; GFX11-NEXT: s_waitcnt lgkmcnt(0)1166; GFX11-NEXT: global_store_b32 v0, v1, s[0:1]1167; GFX11-NEXT: s_endpgm1168;1169; GFX12-LABEL: test_fold_canonicalize_snan3_value_f32:1170; GFX12: ; %bb.0:1171; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01172; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7fc000001173; GFX12-NEXT: s_wait_kmcnt 0x01174; GFX12-NEXT: global_store_b32 v0, v1, s[0:1]1175; GFX12-NEXT: s_endpgm1176 %canonicalized = call float @llvm.canonicalize.f32(float bitcast (i32 4290772991 to float))1177 store float %canonicalized, ptr addrspace(1) %out1178 ret void1179}1180 1181define amdgpu_kernel void @v_test_canonicalize_var_f64(ptr addrspace(1) %out) #1 {1182; GFX678-LABEL: v_test_canonicalize_var_f64:1183; GFX678: ; %bb.0:1184; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01185; GFX678-NEXT: s_add_i32 s12, s12, s171186; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131187; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81188; GFX678-NEXT: s_waitcnt lgkmcnt(0)1189; GFX678-NEXT: v_mov_b32_e32 v0, s01190; GFX678-NEXT: v_mov_b32_e32 v1, s11191; GFX678-NEXT: flat_load_dwordx2 v[2:3], v[0:1]1192; GFX678-NEXT: s_waitcnt vmcnt(0)1193; GFX678-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]1194; GFX678-NEXT: flat_store_dwordx2 v[0:1], v[2:3]1195; GFX678-NEXT: s_endpgm1196;1197; GFX9-LABEL: v_test_canonicalize_var_f64:1198; GFX9: ; %bb.0:1199; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01200; GFX9-NEXT: v_mov_b32_e32 v2, 01201; GFX9-NEXT: s_waitcnt lgkmcnt(0)1202; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]1203; GFX9-NEXT: s_waitcnt vmcnt(0)1204; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]1205; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1206; GFX9-NEXT: s_endpgm1207;1208; GFX11-LABEL: v_test_canonicalize_var_f64:1209; GFX11: ; %bb.0:1210; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01211; GFX11-NEXT: v_mov_b32_e32 v2, 01212; GFX11-NEXT: s_waitcnt lgkmcnt(0)1213; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]1214; GFX11-NEXT: s_waitcnt vmcnt(0)1215; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]1216; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1217; GFX11-NEXT: s_endpgm1218;1219; GFX12-LABEL: v_test_canonicalize_var_f64:1220; GFX12: ; %bb.0:1221; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01222; GFX12-NEXT: v_mov_b32_e32 v2, 01223; GFX12-NEXT: s_wait_kmcnt 0x01224; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]1225; GFX12-NEXT: s_wait_loadcnt 0x01226; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]1227; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1228; GFX12-NEXT: s_endpgm1229 %val = load double, ptr addrspace(1) %out1230 %canonicalized = call double @llvm.canonicalize.f64(double %val)1231 store double %canonicalized, ptr addrspace(1) %out1232 ret void1233}1234 1235define amdgpu_kernel void @s_test_canonicalize_var_f64(ptr addrspace(1) %out, double %val) #1 {1236; GFX6-LABEL: s_test_canonicalize_var_f64:1237; GFX6: ; %bb.0:1238; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x01239; GFX6-NEXT: s_add_i32 s12, s12, s171240; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s131241; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81242; GFX6-NEXT: s_waitcnt lgkmcnt(0)1243; GFX6-NEXT: v_max_f64 v[2:3], s[2:3], s[2:3]1244; GFX6-NEXT: v_mov_b32_e32 v0, s01245; GFX6-NEXT: v_mov_b32_e32 v1, s11246; GFX6-NEXT: flat_store_dwordx2 v[0:1], v[2:3]1247; GFX6-NEXT: s_endpgm1248;1249; GFX8-LABEL: s_test_canonicalize_var_f64:1250; GFX8: ; %bb.0:1251; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x01252; GFX8-NEXT: s_add_i32 s12, s12, s171253; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s131254; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81255; GFX8-NEXT: s_waitcnt lgkmcnt(0)1256; GFX8-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]1257; GFX8-NEXT: v_mov_b32_e32 v2, s01258; GFX8-NEXT: v_mov_b32_e32 v3, s11259; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1260; GFX8-NEXT: s_endpgm1261;1262; GFX9-LABEL: s_test_canonicalize_var_f64:1263; GFX9: ; %bb.0:1264; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x01265; GFX9-NEXT: v_mov_b32_e32 v2, 01266; GFX9-NEXT: s_waitcnt lgkmcnt(0)1267; GFX9-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]1268; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1269; GFX9-NEXT: s_endpgm1270;1271; GFX11-LABEL: s_test_canonicalize_var_f64:1272; GFX11: ; %bb.0:1273; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x01274; GFX11-NEXT: v_mov_b32_e32 v2, 01275; GFX11-NEXT: s_waitcnt lgkmcnt(0)1276; GFX11-NEXT: v_max_f64 v[0:1], s[2:3], s[2:3]1277; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1278; GFX11-NEXT: s_endpgm1279;1280; GFX12-LABEL: s_test_canonicalize_var_f64:1281; GFX12: ; %bb.0:1282; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x01283; GFX12-NEXT: v_mov_b32_e32 v2, 01284; GFX12-NEXT: s_wait_kmcnt 0x01285; GFX12-NEXT: v_max_num_f64_e64 v[0:1], s[2:3], s[2:3]1286; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1287; GFX12-NEXT: s_endpgm1288 %canonicalized = call double @llvm.canonicalize.f64(double %val)1289 store double %canonicalized, ptr addrspace(1) %out1290 ret void1291}1292 1293define amdgpu_kernel void @v_test_canonicalize_fabs_var_f64(ptr addrspace(1) %out) #1 {1294; GFX678-LABEL: v_test_canonicalize_fabs_var_f64:1295; GFX678: ; %bb.0:1296; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01297; GFX678-NEXT: s_add_i32 s12, s12, s171298; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131299; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81300; GFX678-NEXT: s_waitcnt lgkmcnt(0)1301; GFX678-NEXT: v_mov_b32_e32 v0, s01302; GFX678-NEXT: v_mov_b32_e32 v1, s11303; GFX678-NEXT: flat_load_dwordx2 v[2:3], v[0:1]1304; GFX678-NEXT: s_waitcnt vmcnt(0)1305; GFX678-NEXT: v_max_f64 v[2:3], |v[2:3]|, |v[2:3]|1306; GFX678-NEXT: flat_store_dwordx2 v[0:1], v[2:3]1307; GFX678-NEXT: s_endpgm1308;1309; GFX9-LABEL: v_test_canonicalize_fabs_var_f64:1310; GFX9: ; %bb.0:1311; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01312; GFX9-NEXT: v_mov_b32_e32 v2, 01313; GFX9-NEXT: s_waitcnt lgkmcnt(0)1314; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]1315; GFX9-NEXT: s_waitcnt vmcnt(0)1316; GFX9-NEXT: v_max_f64 v[0:1], |v[0:1]|, |v[0:1]|1317; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1318; GFX9-NEXT: s_endpgm1319;1320; GFX11-LABEL: v_test_canonicalize_fabs_var_f64:1321; GFX11: ; %bb.0:1322; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01323; GFX11-NEXT: v_mov_b32_e32 v2, 01324; GFX11-NEXT: s_waitcnt lgkmcnt(0)1325; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]1326; GFX11-NEXT: s_waitcnt vmcnt(0)1327; GFX11-NEXT: v_max_f64 v[0:1], |v[0:1]|, |v[0:1]|1328; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1329; GFX11-NEXT: s_endpgm1330;1331; GFX12-LABEL: v_test_canonicalize_fabs_var_f64:1332; GFX12: ; %bb.0:1333; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01334; GFX12-NEXT: v_mov_b32_e32 v2, 01335; GFX12-NEXT: s_wait_kmcnt 0x01336; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]1337; GFX12-NEXT: s_wait_loadcnt 0x01338; GFX12-NEXT: v_max_num_f64_e64 v[0:1], |v[0:1]|, |v[0:1]|1339; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1340; GFX12-NEXT: s_endpgm1341 %val = load double, ptr addrspace(1) %out1342 %val.fabs = call double @llvm.fabs.f64(double %val)1343 %canonicalized = call double @llvm.canonicalize.f64(double %val.fabs)1344 store double %canonicalized, ptr addrspace(1) %out1345 ret void1346}1347 1348define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f64(ptr addrspace(1) %out) #1 {1349; GFX678-LABEL: v_test_canonicalize_fneg_fabs_var_f64:1350; GFX678: ; %bb.0:1351; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01352; GFX678-NEXT: s_add_i32 s12, s12, s171353; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131354; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81355; GFX678-NEXT: s_waitcnt lgkmcnt(0)1356; GFX678-NEXT: v_mov_b32_e32 v0, s01357; GFX678-NEXT: v_mov_b32_e32 v1, s11358; GFX678-NEXT: flat_load_dwordx2 v[2:3], v[0:1]1359; GFX678-NEXT: s_waitcnt vmcnt(0)1360; GFX678-NEXT: v_max_f64 v[2:3], -|v[2:3]|, -|v[2:3]|1361; GFX678-NEXT: flat_store_dwordx2 v[0:1], v[2:3]1362; GFX678-NEXT: s_endpgm1363;1364; GFX9-LABEL: v_test_canonicalize_fneg_fabs_var_f64:1365; GFX9: ; %bb.0:1366; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01367; GFX9-NEXT: v_mov_b32_e32 v2, 01368; GFX9-NEXT: s_waitcnt lgkmcnt(0)1369; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]1370; GFX9-NEXT: s_waitcnt vmcnt(0)1371; GFX9-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]|1372; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1373; GFX9-NEXT: s_endpgm1374;1375; GFX11-LABEL: v_test_canonicalize_fneg_fabs_var_f64:1376; GFX11: ; %bb.0:1377; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01378; GFX11-NEXT: v_mov_b32_e32 v2, 01379; GFX11-NEXT: s_waitcnt lgkmcnt(0)1380; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]1381; GFX11-NEXT: s_waitcnt vmcnt(0)1382; GFX11-NEXT: v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]|1383; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1384; GFX11-NEXT: s_endpgm1385;1386; GFX12-LABEL: v_test_canonicalize_fneg_fabs_var_f64:1387; GFX12: ; %bb.0:1388; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01389; GFX12-NEXT: v_mov_b32_e32 v2, 01390; GFX12-NEXT: s_wait_kmcnt 0x01391; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]1392; GFX12-NEXT: s_wait_loadcnt 0x01393; GFX12-NEXT: v_max_num_f64_e64 v[0:1], -|v[0:1]|, -|v[0:1]|1394; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1395; GFX12-NEXT: s_endpgm1396 %val = load double, ptr addrspace(1) %out1397 %val.fabs = call double @llvm.fabs.f64(double %val)1398 %val.fabs.fneg = fneg double %val.fabs1399 %canonicalized = call double @llvm.canonicalize.f64(double %val.fabs.fneg)1400 store double %canonicalized, ptr addrspace(1) %out1401 ret void1402}1403 1404define amdgpu_kernel void @v_test_canonicalize_fneg_var_f64(ptr addrspace(1) %out) #1 {1405; GFX678-LABEL: v_test_canonicalize_fneg_var_f64:1406; GFX678: ; %bb.0:1407; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01408; GFX678-NEXT: s_add_i32 s12, s12, s171409; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131410; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81411; GFX678-NEXT: s_waitcnt lgkmcnt(0)1412; GFX678-NEXT: v_mov_b32_e32 v0, s01413; GFX678-NEXT: v_mov_b32_e32 v1, s11414; GFX678-NEXT: flat_load_dwordx2 v[2:3], v[0:1]1415; GFX678-NEXT: s_waitcnt vmcnt(0)1416; GFX678-NEXT: v_max_f64 v[2:3], -v[2:3], -v[2:3]1417; GFX678-NEXT: flat_store_dwordx2 v[0:1], v[2:3]1418; GFX678-NEXT: s_endpgm1419;1420; GFX9-LABEL: v_test_canonicalize_fneg_var_f64:1421; GFX9: ; %bb.0:1422; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01423; GFX9-NEXT: v_mov_b32_e32 v2, 01424; GFX9-NEXT: s_waitcnt lgkmcnt(0)1425; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]1426; GFX9-NEXT: s_waitcnt vmcnt(0)1427; GFX9-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]1428; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1429; GFX9-NEXT: s_endpgm1430;1431; GFX11-LABEL: v_test_canonicalize_fneg_var_f64:1432; GFX11: ; %bb.0:1433; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01434; GFX11-NEXT: v_mov_b32_e32 v2, 01435; GFX11-NEXT: s_waitcnt lgkmcnt(0)1436; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]1437; GFX11-NEXT: s_waitcnt vmcnt(0)1438; GFX11-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]1439; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1440; GFX11-NEXT: s_endpgm1441;1442; GFX12-LABEL: v_test_canonicalize_fneg_var_f64:1443; GFX12: ; %bb.0:1444; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01445; GFX12-NEXT: v_mov_b32_e32 v2, 01446; GFX12-NEXT: s_wait_kmcnt 0x01447; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]1448; GFX12-NEXT: s_wait_loadcnt 0x01449; GFX12-NEXT: v_max_num_f64_e64 v[0:1], -v[0:1], -v[0:1]1450; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1451; GFX12-NEXT: s_endpgm1452 %val = load double, ptr addrspace(1) %out1453 %val.fneg = fneg double %val1454 %canonicalized = call double @llvm.canonicalize.f64(double %val.fneg)1455 store double %canonicalized, ptr addrspace(1) %out1456 ret void1457}1458 1459define amdgpu_kernel void @test_fold_canonicalize_p0_f64(ptr addrspace(1) %out) #1 {1460; GFX678-LABEL: test_fold_canonicalize_p0_f64:1461; GFX678: ; %bb.0:1462; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01463; GFX678-NEXT: s_add_i32 s12, s12, s171464; GFX678-NEXT: v_mov_b32_e32 v0, 01465; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131466; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81467; GFX678-NEXT: s_waitcnt lgkmcnt(0)1468; GFX678-NEXT: v_mov_b32_e32 v3, s11469; GFX678-NEXT: v_mov_b32_e32 v1, v01470; GFX678-NEXT: v_mov_b32_e32 v2, s01471; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1472; GFX678-NEXT: s_endpgm1473;1474; GFX9-LABEL: test_fold_canonicalize_p0_f64:1475; GFX9: ; %bb.0:1476; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01477; GFX9-NEXT: v_mov_b32_e32 v0, 01478; GFX9-NEXT: v_mov_b32_e32 v1, v01479; GFX9-NEXT: s_waitcnt lgkmcnt(0)1480; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1481; GFX9-NEXT: s_endpgm1482;1483; GFX11-LABEL: test_fold_canonicalize_p0_f64:1484; GFX11: ; %bb.0:1485; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01486; GFX11-NEXT: v_mov_b32_e32 v0, 01487; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1488; GFX11-NEXT: v_mov_b32_e32 v1, v01489; GFX11-NEXT: s_waitcnt lgkmcnt(0)1490; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1491; GFX11-NEXT: s_endpgm1492;1493; GFX12-LABEL: test_fold_canonicalize_p0_f64:1494; GFX12: ; %bb.0:1495; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01496; GFX12-NEXT: v_mov_b32_e32 v0, 01497; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1498; GFX12-NEXT: v_mov_b32_e32 v1, v01499; GFX12-NEXT: s_wait_kmcnt 0x01500; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1501; GFX12-NEXT: s_endpgm1502 %canonicalized = call double @llvm.canonicalize.f64(double 0.0)1503 store double %canonicalized, ptr addrspace(1) %out1504 ret void1505}1506 1507define amdgpu_kernel void @test_fold_canonicalize_n0_f64(ptr addrspace(1) %out) #1 {1508; GFX678-LABEL: test_fold_canonicalize_n0_f64:1509; GFX678: ; %bb.0:1510; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01511; GFX678-NEXT: s_add_i32 s12, s12, s171512; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131513; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81514; GFX678-NEXT: v_mov_b32_e32 v0, 01515; GFX678-NEXT: s_waitcnt lgkmcnt(0)1516; GFX678-NEXT: v_mov_b32_e32 v3, s11517; GFX678-NEXT: v_bfrev_b32_e32 v1, 11518; GFX678-NEXT: v_mov_b32_e32 v2, s01519; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1520; GFX678-NEXT: s_endpgm1521;1522; GFX9-LABEL: test_fold_canonicalize_n0_f64:1523; GFX9: ; %bb.0:1524; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01525; GFX9-NEXT: v_mov_b32_e32 v0, 01526; GFX9-NEXT: v_bfrev_b32_e32 v1, 11527; GFX9-NEXT: s_waitcnt lgkmcnt(0)1528; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1529; GFX9-NEXT: s_endpgm1530;1531; GFX11-LABEL: test_fold_canonicalize_n0_f64:1532; GFX11: ; %bb.0:1533; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01534; GFX11-NEXT: v_mov_b32_e32 v0, 01535; GFX11-NEXT: v_bfrev_b32_e32 v1, 11536; GFX11-NEXT: s_waitcnt lgkmcnt(0)1537; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1538; GFX11-NEXT: s_endpgm1539;1540; GFX12-LABEL: test_fold_canonicalize_n0_f64:1541; GFX12: ; %bb.0:1542; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01543; GFX12-NEXT: v_mov_b32_e32 v0, 01544; GFX12-NEXT: v_bfrev_b32_e32 v1, 11545; GFX12-NEXT: s_wait_kmcnt 0x01546; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1547; GFX12-NEXT: s_endpgm1548 %canonicalized = call double @llvm.canonicalize.f64(double -0.0)1549 store double %canonicalized, ptr addrspace(1) %out1550 ret void1551}1552 1553define amdgpu_kernel void @test_fold_canonicalize_p1_f64(ptr addrspace(1) %out) #1 {1554; GFX678-LABEL: test_fold_canonicalize_p1_f64:1555; GFX678: ; %bb.0:1556; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01557; GFX678-NEXT: s_add_i32 s12, s12, s171558; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131559; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81560; GFX678-NEXT: v_mov_b32_e32 v0, 01561; GFX678-NEXT: s_waitcnt lgkmcnt(0)1562; GFX678-NEXT: v_mov_b32_e32 v3, s11563; GFX678-NEXT: v_mov_b32_e32 v1, 0x3ff000001564; GFX678-NEXT: v_mov_b32_e32 v2, s01565; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1566; GFX678-NEXT: s_endpgm1567;1568; GFX9-LABEL: test_fold_canonicalize_p1_f64:1569; GFX9: ; %bb.0:1570; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01571; GFX9-NEXT: v_mov_b32_e32 v0, 01572; GFX9-NEXT: v_mov_b32_e32 v1, 0x3ff000001573; GFX9-NEXT: s_waitcnt lgkmcnt(0)1574; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1575; GFX9-NEXT: s_endpgm1576;1577; GFX11-LABEL: test_fold_canonicalize_p1_f64:1578; GFX11: ; %bb.0:1579; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01580; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x3ff000001581; GFX11-NEXT: s_waitcnt lgkmcnt(0)1582; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1583; GFX11-NEXT: s_endpgm1584;1585; GFX12-LABEL: test_fold_canonicalize_p1_f64:1586; GFX12: ; %bb.0:1587; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01588; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x3ff000001589; GFX12-NEXT: s_wait_kmcnt 0x01590; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1591; GFX12-NEXT: s_endpgm1592 %canonicalized = call double @llvm.canonicalize.f64(double 1.0)1593 store double %canonicalized, ptr addrspace(1) %out1594 ret void1595}1596 1597define amdgpu_kernel void @test_fold_canonicalize_n1_f64(ptr addrspace(1) %out) #1 {1598; GFX678-LABEL: test_fold_canonicalize_n1_f64:1599; GFX678: ; %bb.0:1600; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01601; GFX678-NEXT: s_add_i32 s12, s12, s171602; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131603; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81604; GFX678-NEXT: v_mov_b32_e32 v0, 01605; GFX678-NEXT: s_waitcnt lgkmcnt(0)1606; GFX678-NEXT: v_mov_b32_e32 v3, s11607; GFX678-NEXT: v_mov_b32_e32 v1, 0xbff000001608; GFX678-NEXT: v_mov_b32_e32 v2, s01609; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1610; GFX678-NEXT: s_endpgm1611;1612; GFX9-LABEL: test_fold_canonicalize_n1_f64:1613; GFX9: ; %bb.0:1614; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01615; GFX9-NEXT: v_mov_b32_e32 v0, 01616; GFX9-NEXT: v_mov_b32_e32 v1, 0xbff000001617; GFX9-NEXT: s_waitcnt lgkmcnt(0)1618; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1619; GFX9-NEXT: s_endpgm1620;1621; GFX11-LABEL: test_fold_canonicalize_n1_f64:1622; GFX11: ; %bb.0:1623; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01624; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0xbff000001625; GFX11-NEXT: s_waitcnt lgkmcnt(0)1626; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1627; GFX11-NEXT: s_endpgm1628;1629; GFX12-LABEL: test_fold_canonicalize_n1_f64:1630; GFX12: ; %bb.0:1631; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01632; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0xbff000001633; GFX12-NEXT: s_wait_kmcnt 0x01634; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1635; GFX12-NEXT: s_endpgm1636 %canonicalized = call double @llvm.canonicalize.f64(double -1.0)1637 store double %canonicalized, ptr addrspace(1) %out1638 ret void1639}1640 1641define amdgpu_kernel void @test_fold_canonicalize_literal_f64(ptr addrspace(1) %out) #1 {1642; GFX678-LABEL: test_fold_canonicalize_literal_f64:1643; GFX678: ; %bb.0:1644; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01645; GFX678-NEXT: s_add_i32 s12, s12, s171646; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131647; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81648; GFX678-NEXT: v_mov_b32_e32 v0, 01649; GFX678-NEXT: s_waitcnt lgkmcnt(0)1650; GFX678-NEXT: v_mov_b32_e32 v3, s11651; GFX678-NEXT: v_mov_b32_e32 v1, 0x403000001652; GFX678-NEXT: v_mov_b32_e32 v2, s01653; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1654; GFX678-NEXT: s_endpgm1655;1656; GFX9-LABEL: test_fold_canonicalize_literal_f64:1657; GFX9: ; %bb.0:1658; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01659; GFX9-NEXT: v_mov_b32_e32 v0, 01660; GFX9-NEXT: v_mov_b32_e32 v1, 0x403000001661; GFX9-NEXT: s_waitcnt lgkmcnt(0)1662; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1663; GFX9-NEXT: s_endpgm1664;1665; GFX11-LABEL: test_fold_canonicalize_literal_f64:1666; GFX11: ; %bb.0:1667; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01668; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x403000001669; GFX11-NEXT: s_waitcnt lgkmcnt(0)1670; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1671; GFX11-NEXT: s_endpgm1672;1673; GFX12-LABEL: test_fold_canonicalize_literal_f64:1674; GFX12: ; %bb.0:1675; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01676; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x403000001677; GFX12-NEXT: s_wait_kmcnt 0x01678; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1679; GFX12-NEXT: s_endpgm1680 %canonicalized = call double @llvm.canonicalize.f64(double 16.0)1681 store double %canonicalized, ptr addrspace(1) %out1682 ret void1683}1684 1685define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal0_f64(ptr addrspace(1) %out) #2 {1686; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:1687; GFX678: ; %bb.0:1688; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01689; GFX678-NEXT: s_add_i32 s12, s12, s171690; GFX678-NEXT: v_mov_b32_e32 v0, 01691; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131692; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81693; GFX678-NEXT: s_waitcnt lgkmcnt(0)1694; GFX678-NEXT: v_mov_b32_e32 v3, s11695; GFX678-NEXT: v_mov_b32_e32 v1, v01696; GFX678-NEXT: v_mov_b32_e32 v2, s01697; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1698; GFX678-NEXT: s_endpgm1699;1700; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:1701; GFX9: ; %bb.0:1702; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01703; GFX9-NEXT: v_mov_b32_e32 v0, 01704; GFX9-NEXT: v_mov_b32_e32 v1, v01705; GFX9-NEXT: s_waitcnt lgkmcnt(0)1706; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1707; GFX9-NEXT: s_endpgm1708;1709; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:1710; GFX11: ; %bb.0:1711; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01712; GFX11-NEXT: v_mov_b32_e32 v0, 01713; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1714; GFX11-NEXT: v_mov_b32_e32 v1, v01715; GFX11-NEXT: s_waitcnt lgkmcnt(0)1716; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1717; GFX11-NEXT: s_endpgm1718;1719; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal0_f64:1720; GFX12: ; %bb.0:1721; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01722; GFX12-NEXT: v_mov_b32_e32 v0, 01723; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)1724; GFX12-NEXT: v_mov_b32_e32 v1, v01725; GFX12-NEXT: s_wait_kmcnt 0x01726; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1727; GFX12-NEXT: s_endpgm1728 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))1729 store double %canonicalized, ptr addrspace(1) %out1730 ret void1731}1732 1733define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal0_f64(ptr addrspace(1) %out) #3 {1734; GFX678-LABEL: test_denormals_fold_canonicalize_denormal0_f64:1735; GFX678: ; %bb.0:1736; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01737; GFX678-NEXT: s_add_i32 s12, s12, s171738; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131739; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81740; GFX678-NEXT: v_mov_b32_e32 v0, -11741; GFX678-NEXT: s_waitcnt lgkmcnt(0)1742; GFX678-NEXT: v_mov_b32_e32 v3, s11743; GFX678-NEXT: v_mov_b32_e32 v1, 0xfffff1744; GFX678-NEXT: v_mov_b32_e32 v2, s01745; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1746; GFX678-NEXT: s_endpgm1747;1748; GFX9-LABEL: test_denormals_fold_canonicalize_denormal0_f64:1749; GFX9: ; %bb.0:1750; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01751; GFX9-NEXT: v_mov_b32_e32 v2, 01752; GFX9-NEXT: v_mov_b32_e32 v0, -11753; GFX9-NEXT: v_mov_b32_e32 v1, 0xfffff1754; GFX9-NEXT: s_waitcnt lgkmcnt(0)1755; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1756; GFX9-NEXT: s_endpgm1757;1758; GFX11-LABEL: test_denormals_fold_canonicalize_denormal0_f64:1759; GFX11: ; %bb.0:1760; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01761; GFX11-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0xfffff1762; GFX11-NEXT: v_mov_b32_e32 v0, -11763; GFX11-NEXT: s_waitcnt lgkmcnt(0)1764; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1765; GFX11-NEXT: s_endpgm1766;1767; GFX12-LABEL: test_denormals_fold_canonicalize_denormal0_f64:1768; GFX12: ; %bb.0:1769; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01770; GFX12-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0xfffff1771; GFX12-NEXT: v_mov_b32_e32 v0, -11772; GFX12-NEXT: s_wait_kmcnt 0x01773; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1774; GFX12-NEXT: s_endpgm1775 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 4503599627370495 to double))1776 store double %canonicalized, ptr addrspace(1) %out1777 ret void1778}1779 1780define amdgpu_kernel void @test_no_denormals_fold_canonicalize_denormal1_f64(ptr addrspace(1) %out) #2 {1781; GFX678-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:1782; GFX678: ; %bb.0:1783; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01784; GFX678-NEXT: s_add_i32 s12, s12, s171785; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131786; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81787; GFX678-NEXT: v_mov_b32_e32 v0, 01788; GFX678-NEXT: s_waitcnt lgkmcnt(0)1789; GFX678-NEXT: v_mov_b32_e32 v3, s11790; GFX678-NEXT: v_bfrev_b32_e32 v1, 11791; GFX678-NEXT: v_mov_b32_e32 v2, s01792; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1793; GFX678-NEXT: s_endpgm1794;1795; GFX9-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:1796; GFX9: ; %bb.0:1797; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01798; GFX9-NEXT: v_mov_b32_e32 v0, 01799; GFX9-NEXT: v_bfrev_b32_e32 v1, 11800; GFX9-NEXT: s_waitcnt lgkmcnt(0)1801; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1802; GFX9-NEXT: s_endpgm1803;1804; GFX11-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:1805; GFX11: ; %bb.0:1806; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01807; GFX11-NEXT: v_mov_b32_e32 v0, 01808; GFX11-NEXT: v_bfrev_b32_e32 v1, 11809; GFX11-NEXT: s_waitcnt lgkmcnt(0)1810; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1811; GFX11-NEXT: s_endpgm1812;1813; GFX12-LABEL: test_no_denormals_fold_canonicalize_denormal1_f64:1814; GFX12: ; %bb.0:1815; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01816; GFX12-NEXT: v_mov_b32_e32 v0, 01817; GFX12-NEXT: v_bfrev_b32_e32 v1, 11818; GFX12-NEXT: s_wait_kmcnt 0x01819; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1820; GFX12-NEXT: s_endpgm1821 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))1822 store double %canonicalized, ptr addrspace(1) %out1823 ret void1824}1825 1826define amdgpu_kernel void @test_denormals_fold_canonicalize_denormal1_f64(ptr addrspace(1) %out) #3 {1827; GFX678-LABEL: test_denormals_fold_canonicalize_denormal1_f64:1828; GFX678: ; %bb.0:1829; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01830; GFX678-NEXT: s_add_i32 s12, s12, s171831; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131832; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81833; GFX678-NEXT: v_mov_b32_e32 v0, -11834; GFX678-NEXT: s_waitcnt lgkmcnt(0)1835; GFX678-NEXT: v_mov_b32_e32 v3, s11836; GFX678-NEXT: v_mov_b32_e32 v1, 0x800fffff1837; GFX678-NEXT: v_mov_b32_e32 v2, s01838; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1839; GFX678-NEXT: s_endpgm1840;1841; GFX9-LABEL: test_denormals_fold_canonicalize_denormal1_f64:1842; GFX9: ; %bb.0:1843; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01844; GFX9-NEXT: v_mov_b32_e32 v2, 01845; GFX9-NEXT: v_mov_b32_e32 v0, -11846; GFX9-NEXT: v_mov_b32_e32 v1, 0x800fffff1847; GFX9-NEXT: s_waitcnt lgkmcnt(0)1848; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1849; GFX9-NEXT: s_endpgm1850;1851; GFX11-LABEL: test_denormals_fold_canonicalize_denormal1_f64:1852; GFX11: ; %bb.0:1853; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01854; GFX11-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0x800fffff1855; GFX11-NEXT: v_mov_b32_e32 v0, -11856; GFX11-NEXT: s_waitcnt lgkmcnt(0)1857; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1858; GFX11-NEXT: s_endpgm1859;1860; GFX12-LABEL: test_denormals_fold_canonicalize_denormal1_f64:1861; GFX12: ; %bb.0:1862; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01863; GFX12-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, 0x800fffff1864; GFX12-NEXT: v_mov_b32_e32 v0, -11865; GFX12-NEXT: s_wait_kmcnt 0x01866; GFX12-NEXT: global_store_b64 v2, v[0:1], s[0:1]1867; GFX12-NEXT: s_endpgm1868 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9227875636482146303 to double))1869 store double %canonicalized, ptr addrspace(1) %out1870 ret void1871}1872 1873define amdgpu_kernel void @test_fold_canonicalize_qnan_f64(ptr addrspace(1) %out) #1 {1874; GFX678-LABEL: test_fold_canonicalize_qnan_f64:1875; GFX678: ; %bb.0:1876; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01877; GFX678-NEXT: s_add_i32 s12, s12, s171878; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131879; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81880; GFX678-NEXT: v_mov_b32_e32 v0, 01881; GFX678-NEXT: s_waitcnt lgkmcnt(0)1882; GFX678-NEXT: v_mov_b32_e32 v3, s11883; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff800001884; GFX678-NEXT: v_mov_b32_e32 v2, s01885; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1886; GFX678-NEXT: s_endpgm1887;1888; GFX9-LABEL: test_fold_canonicalize_qnan_f64:1889; GFX9: ; %bb.0:1890; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01891; GFX9-NEXT: v_mov_b32_e32 v0, 01892; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff800001893; GFX9-NEXT: s_waitcnt lgkmcnt(0)1894; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1895; GFX9-NEXT: s_endpgm1896;1897; GFX11-LABEL: test_fold_canonicalize_qnan_f64:1898; GFX11: ; %bb.0:1899; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01900; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800001901; GFX11-NEXT: s_waitcnt lgkmcnt(0)1902; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1903; GFX11-NEXT: s_endpgm1904;1905; GFX12-LABEL: test_fold_canonicalize_qnan_f64:1906; GFX12: ; %bb.0:1907; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01908; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800001909; GFX12-NEXT: s_wait_kmcnt 0x01910; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1911; GFX12-NEXT: s_endpgm1912 %canonicalized = call double @llvm.canonicalize.f64(double 0x7FF8000000000000)1913 store double %canonicalized, ptr addrspace(1) %out1914 ret void1915}1916 1917define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg1_f64(ptr addrspace(1) %out) #1 {1918; GFX678-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:1919; GFX678: ; %bb.0:1920; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01921; GFX678-NEXT: s_add_i32 s12, s12, s171922; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131923; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81924; GFX678-NEXT: v_mov_b32_e32 v0, 01925; GFX678-NEXT: s_waitcnt lgkmcnt(0)1926; GFX678-NEXT: v_mov_b32_e32 v3, s11927; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff800001928; GFX678-NEXT: v_mov_b32_e32 v2, s01929; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1930; GFX678-NEXT: s_endpgm1931;1932; GFX9-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:1933; GFX9: ; %bb.0:1934; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01935; GFX9-NEXT: v_mov_b32_e32 v0, 01936; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff800001937; GFX9-NEXT: s_waitcnt lgkmcnt(0)1938; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1939; GFX9-NEXT: s_endpgm1940;1941; GFX11-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:1942; GFX11: ; %bb.0:1943; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01944; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800001945; GFX11-NEXT: s_waitcnt lgkmcnt(0)1946; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1947; GFX11-NEXT: s_endpgm1948;1949; GFX12-LABEL: test_fold_canonicalize_qnan_value_neg1_f64:1950; GFX12: ; %bb.0:1951; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01952; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800001953; GFX12-NEXT: s_wait_kmcnt 0x01954; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1955; GFX12-NEXT: s_endpgm1956 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -1 to double))1957 store double %canonicalized, ptr addrspace(1) %out1958 ret void1959}1960 1961define amdgpu_kernel void @test_fold_canonicalize_qnan_value_neg2_f64(ptr addrspace(1) %out) #1 {1962; GFX678-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:1963; GFX678: ; %bb.0:1964; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01965; GFX678-NEXT: s_add_i32 s12, s12, s171966; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s131967; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 81968; GFX678-NEXT: v_mov_b32_e32 v0, 01969; GFX678-NEXT: s_waitcnt lgkmcnt(0)1970; GFX678-NEXT: v_mov_b32_e32 v3, s11971; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff800001972; GFX678-NEXT: v_mov_b32_e32 v2, s01973; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1974; GFX678-NEXT: s_endpgm1975;1976; GFX9-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:1977; GFX9: ; %bb.0:1978; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x01979; GFX9-NEXT: v_mov_b32_e32 v0, 01980; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff800001981; GFX9-NEXT: s_waitcnt lgkmcnt(0)1982; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]1983; GFX9-NEXT: s_endpgm1984;1985; GFX11-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:1986; GFX11: ; %bb.0:1987; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x01988; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800001989; GFX11-NEXT: s_waitcnt lgkmcnt(0)1990; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]1991; GFX11-NEXT: s_endpgm1992;1993; GFX12-LABEL: test_fold_canonicalize_qnan_value_neg2_f64:1994; GFX12: ; %bb.0:1995; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x01996; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800001997; GFX12-NEXT: s_wait_kmcnt 0x01998; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]1999; GFX12-NEXT: s_endpgm2000 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 -2 to double))2001 store double %canonicalized, ptr addrspace(1) %out2002 ret void2003}2004 2005define amdgpu_kernel void @test_fold_canonicalize_snan0_value_f64(ptr addrspace(1) %out) #1 {2006; GFX678-LABEL: test_fold_canonicalize_snan0_value_f64:2007; GFX678: ; %bb.0:2008; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02009; GFX678-NEXT: s_add_i32 s12, s12, s172010; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s132011; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82012; GFX678-NEXT: v_mov_b32_e32 v0, 02013; GFX678-NEXT: s_waitcnt lgkmcnt(0)2014; GFX678-NEXT: v_mov_b32_e32 v3, s12015; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff800002016; GFX678-NEXT: v_mov_b32_e32 v2, s02017; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2018; GFX678-NEXT: s_endpgm2019;2020; GFX9-LABEL: test_fold_canonicalize_snan0_value_f64:2021; GFX9: ; %bb.0:2022; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02023; GFX9-NEXT: v_mov_b32_e32 v0, 02024; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff800002025; GFX9-NEXT: s_waitcnt lgkmcnt(0)2026; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]2027; GFX9-NEXT: s_endpgm2028;2029; GFX11-LABEL: test_fold_canonicalize_snan0_value_f64:2030; GFX11: ; %bb.0:2031; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x02032; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800002033; GFX11-NEXT: s_waitcnt lgkmcnt(0)2034; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]2035; GFX11-NEXT: s_endpgm2036;2037; GFX12-LABEL: test_fold_canonicalize_snan0_value_f64:2038; GFX12: ; %bb.0:2039; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x02040; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800002041; GFX12-NEXT: s_wait_kmcnt 0x02042; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]2043; GFX12-NEXT: s_endpgm2044 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9218868437227405313 to double))2045 store double %canonicalized, ptr addrspace(1) %out2046 ret void2047}2048 2049define amdgpu_kernel void @test_fold_canonicalize_snan1_value_f64(ptr addrspace(1) %out) #1 {2050; GFX678-LABEL: test_fold_canonicalize_snan1_value_f64:2051; GFX678: ; %bb.0:2052; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02053; GFX678-NEXT: s_add_i32 s12, s12, s172054; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s132055; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82056; GFX678-NEXT: v_mov_b32_e32 v0, 02057; GFX678-NEXT: s_waitcnt lgkmcnt(0)2058; GFX678-NEXT: v_mov_b32_e32 v3, s12059; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff800002060; GFX678-NEXT: v_mov_b32_e32 v2, s02061; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2062; GFX678-NEXT: s_endpgm2063;2064; GFX9-LABEL: test_fold_canonicalize_snan1_value_f64:2065; GFX9: ; %bb.0:2066; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02067; GFX9-NEXT: v_mov_b32_e32 v0, 02068; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff800002069; GFX9-NEXT: s_waitcnt lgkmcnt(0)2070; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]2071; GFX9-NEXT: s_endpgm2072;2073; GFX11-LABEL: test_fold_canonicalize_snan1_value_f64:2074; GFX11: ; %bb.0:2075; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x02076; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800002077; GFX11-NEXT: s_waitcnt lgkmcnt(0)2078; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]2079; GFX11-NEXT: s_endpgm2080;2081; GFX12-LABEL: test_fold_canonicalize_snan1_value_f64:2082; GFX12: ; %bb.0:2083; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x02084; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800002085; GFX12-NEXT: s_wait_kmcnt 0x02086; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]2087; GFX12-NEXT: s_endpgm2088 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 9223372036854775807 to double))2089 store double %canonicalized, ptr addrspace(1) %out2090 ret void2091}2092 2093define amdgpu_kernel void @test_fold_canonicalize_snan2_value_f64(ptr addrspace(1) %out) #1 {2094; GFX678-LABEL: test_fold_canonicalize_snan2_value_f64:2095; GFX678: ; %bb.0:2096; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02097; GFX678-NEXT: s_add_i32 s12, s12, s172098; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s132099; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82100; GFX678-NEXT: v_mov_b32_e32 v0, 02101; GFX678-NEXT: s_waitcnt lgkmcnt(0)2102; GFX678-NEXT: v_mov_b32_e32 v3, s12103; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff800002104; GFX678-NEXT: v_mov_b32_e32 v2, s02105; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2106; GFX678-NEXT: s_endpgm2107;2108; GFX9-LABEL: test_fold_canonicalize_snan2_value_f64:2109; GFX9: ; %bb.0:2110; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02111; GFX9-NEXT: v_mov_b32_e32 v0, 02112; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff800002113; GFX9-NEXT: s_waitcnt lgkmcnt(0)2114; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]2115; GFX9-NEXT: s_endpgm2116;2117; GFX11-LABEL: test_fold_canonicalize_snan2_value_f64:2118; GFX11: ; %bb.0:2119; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x02120; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800002121; GFX11-NEXT: s_waitcnt lgkmcnt(0)2122; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]2123; GFX11-NEXT: s_endpgm2124;2125; GFX12-LABEL: test_fold_canonicalize_snan2_value_f64:2126; GFX12: ; %bb.0:2127; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x02128; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800002129; GFX12-NEXT: s_wait_kmcnt 0x02130; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]2131; GFX12-NEXT: s_endpgm2132 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18442240474082181121 to double))2133 store double %canonicalized, ptr addrspace(1) %out2134 ret void2135}2136 2137define amdgpu_kernel void @test_fold_canonicalize_snan3_value_f64(ptr addrspace(1) %out) #1 {2138; GFX678-LABEL: test_fold_canonicalize_snan3_value_f64:2139; GFX678: ; %bb.0:2140; GFX678-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02141; GFX678-NEXT: s_add_i32 s12, s12, s172142; GFX678-NEXT: s_mov_b32 flat_scratch_lo, s132143; GFX678-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82144; GFX678-NEXT: v_mov_b32_e32 v0, 02145; GFX678-NEXT: s_waitcnt lgkmcnt(0)2146; GFX678-NEXT: v_mov_b32_e32 v3, s12147; GFX678-NEXT: v_mov_b32_e32 v1, 0x7ff800002148; GFX678-NEXT: v_mov_b32_e32 v2, s02149; GFX678-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2150; GFX678-NEXT: s_endpgm2151;2152; GFX9-LABEL: test_fold_canonicalize_snan3_value_f64:2153; GFX9: ; %bb.0:2154; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02155; GFX9-NEXT: v_mov_b32_e32 v0, 02156; GFX9-NEXT: v_mov_b32_e32 v1, 0x7ff800002157; GFX9-NEXT: s_waitcnt lgkmcnt(0)2158; GFX9-NEXT: global_store_dwordx2 v0, v[0:1], s[0:1]2159; GFX9-NEXT: s_endpgm2160;2161; GFX11-LABEL: test_fold_canonicalize_snan3_value_f64:2162; GFX11: ; %bb.0:2163; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x02164; GFX11-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800002165; GFX11-NEXT: s_waitcnt lgkmcnt(0)2166; GFX11-NEXT: global_store_b64 v0, v[0:1], s[0:1]2167; GFX11-NEXT: s_endpgm2168;2169; GFX12-LABEL: test_fold_canonicalize_snan3_value_f64:2170; GFX12: ; %bb.0:2171; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x02172; GFX12-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7ff800002173; GFX12-NEXT: s_wait_kmcnt 0x02174; GFX12-NEXT: global_store_b64 v0, v[0:1], s[0:1]2175; GFX12-NEXT: s_endpgm2176 %canonicalized = call double @llvm.canonicalize.f64(double bitcast (i64 18446744073709551615 to double))2177 store double %canonicalized, ptr addrspace(1) %out2178 ret void2179}2180 2181define amdgpu_kernel void @test_canonicalize_value_f64_flush(ptr addrspace(1) %arg, ptr addrspace(1) %out) #4 {2182; GFX6-LABEL: test_canonicalize_value_f64_flush:2183; GFX6: ; %bb.0:2184; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02185; GFX6-NEXT: v_lshlrev_b32_e32 v2, 3, v02186; GFX6-NEXT: s_add_i32 s12, s12, s172187; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132188; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82189; GFX6-NEXT: s_waitcnt lgkmcnt(0)2190; GFX6-NEXT: v_mov_b32_e32 v1, s12191; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v22192; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2193; GFX6-NEXT: flat_load_dwordx2 v[0:1], v[0:1]2194; GFX6-NEXT: v_mov_b32_e32 v3, s32195; GFX6-NEXT: v_add_i32_e32 v2, vcc, s2, v22196; GFX6-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc2197; GFX6-NEXT: s_waitcnt vmcnt(0)2198; GFX6-NEXT: v_mul_f64 v[0:1], 1.0, v[0:1]2199; GFX6-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2200; GFX6-NEXT: s_endpgm2201;2202; GFX8-LABEL: test_canonicalize_value_f64_flush:2203; GFX8: ; %bb.0:2204; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02205; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v02206; GFX8-NEXT: s_add_i32 s12, s12, s172207; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132208; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82209; GFX8-NEXT: s_waitcnt lgkmcnt(0)2210; GFX8-NEXT: v_mov_b32_e32 v1, s12211; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22212; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2213; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]2214; GFX8-NEXT: v_mov_b32_e32 v3, s32215; GFX8-NEXT: v_add_u32_e32 v2, vcc, s2, v22216; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc2217; GFX8-NEXT: s_waitcnt vmcnt(0)2218; GFX8-NEXT: v_mul_f64 v[0:1], 1.0, v[0:1]2219; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2220; GFX8-NEXT: s_endpgm2221;2222; GFX9-LABEL: test_canonicalize_value_f64_flush:2223; GFX9: ; %bb.0:2224; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02225; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v02226; GFX9-NEXT: s_waitcnt lgkmcnt(0)2227; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]2228; GFX9-NEXT: s_waitcnt vmcnt(0)2229; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2230; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[2:3]2231; GFX9-NEXT: s_endpgm2232;2233; GFX11-LABEL: test_canonicalize_value_f64_flush:2234; GFX11: ; %bb.0:2235; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x02236; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02237; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2238; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v02239; GFX11-NEXT: s_waitcnt lgkmcnt(0)2240; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]2241; GFX11-NEXT: s_waitcnt vmcnt(0)2242; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2243; GFX11-NEXT: global_store_b64 v2, v[0:1], s[2:3]2244; GFX11-NEXT: s_endpgm2245;2246; GFX12-LABEL: test_canonicalize_value_f64_flush:2247; GFX12: ; %bb.0:2248; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x02249; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02250; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2251; GFX12-NEXT: v_lshlrev_b32_e32 v2, 3, v02252; GFX12-NEXT: s_wait_kmcnt 0x02253; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]2254; GFX12-NEXT: s_wait_loadcnt 0x02255; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]2256; GFX12-NEXT: global_store_b64 v2, v[0:1], s[2:3]2257; GFX12-NEXT: s_endpgm2258 %id = tail call i32 @llvm.amdgcn.workitem.id.x()2259 %gep = getelementptr inbounds double, ptr addrspace(1) %arg, i32 %id2260 %v = load double, ptr addrspace(1) %gep, align 82261 %canonicalized = tail call double @llvm.canonicalize.f64(double %v)2262 %gep2 = getelementptr inbounds double, ptr addrspace(1) %out, i32 %id2263 store double %canonicalized, ptr addrspace(1) %gep2, align 82264 ret void2265}2266 2267define amdgpu_kernel void @test_canonicalize_value_f32_flush(ptr addrspace(1) %arg, ptr addrspace(1) %out) #4 {2268; GFX6-LABEL: test_canonicalize_value_f32_flush:2269; GFX6: ; %bb.0:2270; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02271; GFX6-NEXT: v_lshlrev_b32_e32 v2, 2, v02272; GFX6-NEXT: s_add_i32 s12, s12, s172273; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132274; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82275; GFX6-NEXT: s_waitcnt lgkmcnt(0)2276; GFX6-NEXT: v_mov_b32_e32 v1, s12277; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v22278; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2279; GFX6-NEXT: flat_load_dword v0, v[0:1]2280; GFX6-NEXT: v_mov_b32_e32 v1, s32281; GFX6-NEXT: s_waitcnt vmcnt(0)2282; GFX6-NEXT: v_mul_f32_e32 v3, 1.0, v02283; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v22284; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2285; GFX6-NEXT: flat_store_dword v[0:1], v32286; GFX6-NEXT: s_endpgm2287;2288; GFX8-LABEL: test_canonicalize_value_f32_flush:2289; GFX8: ; %bb.0:2290; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02291; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02292; GFX8-NEXT: s_add_i32 s12, s12, s172293; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132294; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82295; GFX8-NEXT: s_waitcnt lgkmcnt(0)2296; GFX8-NEXT: v_mov_b32_e32 v1, s12297; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22298; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2299; GFX8-NEXT: flat_load_dword v0, v[0:1]2300; GFX8-NEXT: v_mov_b32_e32 v1, s32301; GFX8-NEXT: s_waitcnt vmcnt(0)2302; GFX8-NEXT: v_mul_f32_e32 v3, 1.0, v02303; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22304; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2305; GFX8-NEXT: flat_store_dword v[0:1], v32306; GFX8-NEXT: s_endpgm2307;2308; GFX9-LABEL: test_canonicalize_value_f32_flush:2309; GFX9: ; %bb.0:2310; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02311; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02312; GFX9-NEXT: s_waitcnt lgkmcnt(0)2313; GFX9-NEXT: global_load_dword v1, v0, s[0:1]2314; GFX9-NEXT: s_waitcnt vmcnt(0)2315; GFX9-NEXT: v_max_f32_e32 v1, v1, v12316; GFX9-NEXT: global_store_dword v0, v1, s[2:3]2317; GFX9-NEXT: s_endpgm2318;2319; GFX11-LABEL: test_canonicalize_value_f32_flush:2320; GFX11: ; %bb.0:2321; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x02322; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02323; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2324; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02325; GFX11-NEXT: s_waitcnt lgkmcnt(0)2326; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]2327; GFX11-NEXT: s_waitcnt vmcnt(0)2328; GFX11-NEXT: v_max_f32_e32 v1, v1, v12329; GFX11-NEXT: global_store_b32 v0, v1, s[2:3]2330; GFX11-NEXT: s_endpgm2331;2332; GFX12-LABEL: test_canonicalize_value_f32_flush:2333; GFX12: ; %bb.0:2334; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x02335; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02336; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2337; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02338; GFX12-NEXT: s_wait_kmcnt 0x02339; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]2340; GFX12-NEXT: s_wait_loadcnt 0x02341; GFX12-NEXT: v_max_num_f32_e32 v1, v1, v12342; GFX12-NEXT: global_store_b32 v0, v1, s[2:3]2343; GFX12-NEXT: s_endpgm2344 %id = tail call i32 @llvm.amdgcn.workitem.id.x()2345 %gep = getelementptr inbounds float, ptr addrspace(1) %arg, i32 %id2346 %v = load float, ptr addrspace(1) %gep, align 42347 %canonicalized = tail call float @llvm.canonicalize.f32(float %v)2348 %gep2 = getelementptr inbounds float, ptr addrspace(1) %out, i32 %id2349 store float %canonicalized, ptr addrspace(1) %gep2, align 42350 ret void2351}2352 2353define amdgpu_kernel void @test_canonicalize_value_f16_flush(ptr addrspace(1) %arg, ptr addrspace(1) %out) #4 {2354; GFX6-LABEL: test_canonicalize_value_f16_flush:2355; GFX6: ; %bb.0:2356; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02357; GFX6-NEXT: v_lshlrev_b32_e32 v2, 1, v02358; GFX6-NEXT: s_add_i32 s12, s12, s172359; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132360; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82361; GFX6-NEXT: s_waitcnt lgkmcnt(0)2362; GFX6-NEXT: v_mov_b32_e32 v1, s12363; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v22364; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2365; GFX6-NEXT: flat_load_ushort v0, v[0:1]2366; GFX6-NEXT: v_mov_b32_e32 v1, s32367; GFX6-NEXT: s_waitcnt vmcnt(0)2368; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v02369; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v02370; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v22371; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2372; GFX6-NEXT: flat_store_short v[0:1], v32373; GFX6-NEXT: s_endpgm2374;2375; GFX8-LABEL: test_canonicalize_value_f16_flush:2376; GFX8: ; %bb.0:2377; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02378; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v02379; GFX8-NEXT: s_add_i32 s12, s12, s172380; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132381; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82382; GFX8-NEXT: s_waitcnt lgkmcnt(0)2383; GFX8-NEXT: v_mov_b32_e32 v1, s12384; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22385; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2386; GFX8-NEXT: flat_load_ushort v0, v[0:1]2387; GFX8-NEXT: v_mov_b32_e32 v1, s32388; GFX8-NEXT: s_waitcnt vmcnt(0)2389; GFX8-NEXT: v_mul_f16_e32 v3, 1.0, v02390; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22391; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2392; GFX8-NEXT: flat_store_short v[0:1], v32393; GFX8-NEXT: s_endpgm2394;2395; GFX9-LABEL: test_canonicalize_value_f16_flush:2396; GFX9: ; %bb.0:2397; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02398; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v02399; GFX9-NEXT: s_waitcnt lgkmcnt(0)2400; GFX9-NEXT: global_load_ushort v1, v0, s[0:1]2401; GFX9-NEXT: s_waitcnt vmcnt(0)2402; GFX9-NEXT: v_max_f16_e32 v1, v1, v12403; GFX9-NEXT: global_store_short v0, v1, s[2:3]2404; GFX9-NEXT: s_endpgm2405;2406; GFX11-TRUE16-LABEL: test_canonicalize_value_f16_flush:2407; GFX11-TRUE16: ; %bb.0:2408; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x02409; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02410; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2411; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v02412; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)2413; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[0:1]2414; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)2415; GFX11-TRUE16-NEXT: v_max_f16_e32 v0.l, v0.l, v0.l2416; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[2:3]2417; GFX11-TRUE16-NEXT: s_endpgm2418;2419; GFX11-FAKE16-LABEL: test_canonicalize_value_f16_flush:2420; GFX11-FAKE16: ; %bb.0:2421; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x02422; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02423; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2424; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v02425; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)2426; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[0:1]2427; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)2428; GFX11-FAKE16-NEXT: v_max_f16_e32 v1, v1, v12429; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[2:3]2430; GFX11-FAKE16-NEXT: s_endpgm2431;2432; GFX12-TRUE16-LABEL: test_canonicalize_value_f16_flush:2433; GFX12-TRUE16: ; %bb.0:2434; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x02435; GFX12-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02436; GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2437; GFX12-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v02438; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x02439; GFX12-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[0:1]2440; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x02441; GFX12-TRUE16-NEXT: v_max_num_f16_e32 v0.l, v0.l, v0.l2442; GFX12-TRUE16-NEXT: global_store_b16 v1, v0, s[2:3]2443; GFX12-TRUE16-NEXT: s_endpgm2444;2445; GFX12-FAKE16-LABEL: test_canonicalize_value_f16_flush:2446; GFX12-FAKE16: ; %bb.0:2447; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x02448; GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02449; GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2450; GFX12-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v02451; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x02452; GFX12-FAKE16-NEXT: global_load_u16 v1, v0, s[0:1]2453; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x02454; GFX12-FAKE16-NEXT: v_max_num_f16_e32 v1, v1, v12455; GFX12-FAKE16-NEXT: global_store_b16 v0, v1, s[2:3]2456; GFX12-FAKE16-NEXT: s_endpgm2457 %id = tail call i32 @llvm.amdgcn.workitem.id.x()2458 %gep = getelementptr inbounds half, ptr addrspace(1) %arg, i32 %id2459 %v = load half, ptr addrspace(1) %gep, align 22460 %canonicalized = tail call half @llvm.canonicalize.f16(half %v)2461 %gep2 = getelementptr inbounds half, ptr addrspace(1) %out, i32 %id2462 store half %canonicalized, ptr addrspace(1) %gep2, align 22463 ret void2464}2465 2466 2467define amdgpu_kernel void @test_canonicalize_value_v2f16_flush(ptr addrspace(1) %arg, ptr addrspace(1) %out) #4 {2468; GFX6-LABEL: test_canonicalize_value_v2f16_flush:2469; GFX6: ; %bb.0:2470; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02471; GFX6-NEXT: v_lshlrev_b32_e32 v2, 2, v02472; GFX6-NEXT: s_add_i32 s12, s12, s172473; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132474; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82475; GFX6-NEXT: s_waitcnt lgkmcnt(0)2476; GFX6-NEXT: v_mov_b32_e32 v1, s12477; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v22478; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2479; GFX6-NEXT: flat_load_dword v0, v[0:1]2480; GFX6-NEXT: v_mov_b32_e32 v3, s32481; GFX6-NEXT: s_waitcnt vmcnt(0)2482; GFX6-NEXT: v_lshrrev_b32_e32 v1, 16, v02483; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v12484; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v02485; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v12486; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v02487; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v12488; GFX6-NEXT: v_or_b32_e32 v4, v0, v12489; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v22490; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc2491; GFX6-NEXT: flat_store_dword v[0:1], v42492; GFX6-NEXT: s_endpgm2493;2494; GFX8-LABEL: test_canonicalize_value_v2f16_flush:2495; GFX8: ; %bb.0:2496; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02497; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02498; GFX8-NEXT: s_add_i32 s12, s12, s172499; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132500; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82501; GFX8-NEXT: s_waitcnt lgkmcnt(0)2502; GFX8-NEXT: v_mov_b32_e32 v1, s12503; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22504; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2505; GFX8-NEXT: flat_load_dword v0, v[0:1]2506; GFX8-NEXT: v_mov_b32_e32 v1, 0x3c002507; GFX8-NEXT: v_mov_b32_e32 v3, s32508; GFX8-NEXT: s_waitcnt vmcnt(0)2509; GFX8-NEXT: v_mul_f16_sdwa v1, v1, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:WORD_12510; GFX8-NEXT: v_mul_f16_e32 v0, 1.0, v02511; GFX8-NEXT: v_or_b32_e32 v4, v0, v12512; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22513; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc2514; GFX8-NEXT: flat_store_dword v[0:1], v42515; GFX8-NEXT: s_endpgm2516;2517; GFX9-LABEL: test_canonicalize_value_v2f16_flush:2518; GFX9: ; %bb.0:2519; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02520; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02521; GFX9-NEXT: s_waitcnt lgkmcnt(0)2522; GFX9-NEXT: global_load_dword v1, v0, s[0:1]2523; GFX9-NEXT: s_waitcnt vmcnt(0)2524; GFX9-NEXT: v_pk_max_f16 v1, v1, v12525; GFX9-NEXT: global_store_dword v0, v1, s[2:3]2526; GFX9-NEXT: s_endpgm2527;2528; GFX11-LABEL: test_canonicalize_value_v2f16_flush:2529; GFX11: ; %bb.0:2530; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x02531; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02532; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2533; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02534; GFX11-NEXT: s_waitcnt lgkmcnt(0)2535; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]2536; GFX11-NEXT: s_waitcnt vmcnt(0)2537; GFX11-NEXT: v_pk_max_f16 v1, v1, v12538; GFX11-NEXT: global_store_b32 v0, v1, s[2:3]2539; GFX11-NEXT: s_endpgm2540;2541; GFX12-LABEL: test_canonicalize_value_v2f16_flush:2542; GFX12: ; %bb.0:2543; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x02544; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02545; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2546; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02547; GFX12-NEXT: s_wait_kmcnt 0x02548; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]2549; GFX12-NEXT: s_wait_loadcnt 0x02550; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v12551; GFX12-NEXT: global_store_b32 v0, v1, s[2:3]2552; GFX12-NEXT: s_endpgm2553 %id = tail call i32 @llvm.amdgcn.workitem.id.x()2554 %gep = getelementptr inbounds <2 x half>, ptr addrspace(1) %arg, i32 %id2555 %v = load <2 x half>, ptr addrspace(1) %gep, align 42556 %canonicalized = tail call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %v)2557 %gep2 = getelementptr inbounds <2 x half>, ptr addrspace(1) %out, i32 %id2558 store <2 x half> %canonicalized, ptr addrspace(1) %gep2, align 22559 ret void2560}2561 2562define amdgpu_kernel void @test_canonicalize_value_f64_denorm(ptr addrspace(1) %arg, ptr addrspace(1) %out) #3 {2563; GFX6-LABEL: test_canonicalize_value_f64_denorm:2564; GFX6: ; %bb.0:2565; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02566; GFX6-NEXT: v_lshlrev_b32_e32 v2, 3, v02567; GFX6-NEXT: s_add_i32 s12, s12, s172568; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132569; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82570; GFX6-NEXT: s_waitcnt lgkmcnt(0)2571; GFX6-NEXT: v_mov_b32_e32 v1, s12572; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v22573; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2574; GFX6-NEXT: flat_load_dwordx2 v[0:1], v[0:1]2575; GFX6-NEXT: v_mov_b32_e32 v3, s32576; GFX6-NEXT: v_add_i32_e32 v2, vcc, s2, v22577; GFX6-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc2578; GFX6-NEXT: s_waitcnt vmcnt(0)2579; GFX6-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2580; GFX6-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2581; GFX6-NEXT: s_endpgm2582;2583; GFX8-LABEL: test_canonicalize_value_f64_denorm:2584; GFX8: ; %bb.0:2585; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02586; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v02587; GFX8-NEXT: s_add_i32 s12, s12, s172588; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132589; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82590; GFX8-NEXT: s_waitcnt lgkmcnt(0)2591; GFX8-NEXT: v_mov_b32_e32 v1, s12592; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22593; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2594; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]2595; GFX8-NEXT: v_mov_b32_e32 v3, s32596; GFX8-NEXT: v_add_u32_e32 v2, vcc, s2, v22597; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc2598; GFX8-NEXT: s_waitcnt vmcnt(0)2599; GFX8-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2600; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]2601; GFX8-NEXT: s_endpgm2602;2603; GFX9-LABEL: test_canonicalize_value_f64_denorm:2604; GFX9: ; %bb.0:2605; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02606; GFX9-NEXT: v_lshlrev_b32_e32 v2, 3, v02607; GFX9-NEXT: s_waitcnt lgkmcnt(0)2608; GFX9-NEXT: global_load_dwordx2 v[0:1], v2, s[0:1]2609; GFX9-NEXT: s_waitcnt vmcnt(0)2610; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2611; GFX9-NEXT: global_store_dwordx2 v2, v[0:1], s[2:3]2612; GFX9-NEXT: s_endpgm2613;2614; GFX11-LABEL: test_canonicalize_value_f64_denorm:2615; GFX11: ; %bb.0:2616; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x02617; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02618; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2619; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v02620; GFX11-NEXT: s_waitcnt lgkmcnt(0)2621; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1]2622; GFX11-NEXT: s_waitcnt vmcnt(0)2623; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2624; GFX11-NEXT: global_store_b64 v2, v[0:1], s[2:3]2625; GFX11-NEXT: s_endpgm2626;2627; GFX12-LABEL: test_canonicalize_value_f64_denorm:2628; GFX12: ; %bb.0:2629; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x02630; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02631; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2632; GFX12-NEXT: v_lshlrev_b32_e32 v2, 3, v02633; GFX12-NEXT: s_wait_kmcnt 0x02634; GFX12-NEXT: global_load_b64 v[0:1], v2, s[0:1]2635; GFX12-NEXT: s_wait_loadcnt 0x02636; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]2637; GFX12-NEXT: global_store_b64 v2, v[0:1], s[2:3]2638; GFX12-NEXT: s_endpgm2639 %id = tail call i32 @llvm.amdgcn.workitem.id.x()2640 %gep = getelementptr inbounds double, ptr addrspace(1) %arg, i32 %id2641 %v = load double, ptr addrspace(1) %gep, align 82642 %canonicalized = tail call double @llvm.canonicalize.f64(double %v)2643 %gep2 = getelementptr inbounds double, ptr addrspace(1) %out, i32 %id2644 store double %canonicalized, ptr addrspace(1) %gep2, align 82645 ret void2646}2647 2648define amdgpu_kernel void @test_canonicalize_value_f32_denorm(ptr addrspace(1) %arg, ptr addrspace(1) %out) #3 {2649; GFX6-LABEL: test_canonicalize_value_f32_denorm:2650; GFX6: ; %bb.0:2651; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02652; GFX6-NEXT: v_lshlrev_b32_e32 v2, 2, v02653; GFX6-NEXT: s_add_i32 s12, s12, s172654; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132655; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82656; GFX6-NEXT: s_waitcnt lgkmcnt(0)2657; GFX6-NEXT: v_mov_b32_e32 v1, s12658; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v22659; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2660; GFX6-NEXT: flat_load_dword v0, v[0:1]2661; GFX6-NEXT: v_mov_b32_e32 v1, s32662; GFX6-NEXT: s_waitcnt vmcnt(0)2663; GFX6-NEXT: v_mul_f32_e32 v3, 1.0, v02664; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v22665; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2666; GFX6-NEXT: flat_store_dword v[0:1], v32667; GFX6-NEXT: s_endpgm2668;2669; GFX8-LABEL: test_canonicalize_value_f32_denorm:2670; GFX8: ; %bb.0:2671; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02672; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02673; GFX8-NEXT: s_add_i32 s12, s12, s172674; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132675; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82676; GFX8-NEXT: s_waitcnt lgkmcnt(0)2677; GFX8-NEXT: v_mov_b32_e32 v1, s12678; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22679; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2680; GFX8-NEXT: flat_load_dword v0, v[0:1]2681; GFX8-NEXT: v_mov_b32_e32 v1, s32682; GFX8-NEXT: s_waitcnt vmcnt(0)2683; GFX8-NEXT: v_mul_f32_e32 v3, 1.0, v02684; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22685; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2686; GFX8-NEXT: flat_store_dword v[0:1], v32687; GFX8-NEXT: s_endpgm2688;2689; GFX9-LABEL: test_canonicalize_value_f32_denorm:2690; GFX9: ; %bb.0:2691; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02692; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02693; GFX9-NEXT: s_waitcnt lgkmcnt(0)2694; GFX9-NEXT: global_load_dword v1, v0, s[0:1]2695; GFX9-NEXT: s_waitcnt vmcnt(0)2696; GFX9-NEXT: v_max_f32_e32 v1, v1, v12697; GFX9-NEXT: global_store_dword v0, v1, s[2:3]2698; GFX9-NEXT: s_endpgm2699;2700; GFX11-LABEL: test_canonicalize_value_f32_denorm:2701; GFX11: ; %bb.0:2702; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x02703; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02704; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2705; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02706; GFX11-NEXT: s_waitcnt lgkmcnt(0)2707; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]2708; GFX11-NEXT: s_waitcnt vmcnt(0)2709; GFX11-NEXT: v_max_f32_e32 v1, v1, v12710; GFX11-NEXT: global_store_b32 v0, v1, s[2:3]2711; GFX11-NEXT: s_endpgm2712;2713; GFX12-LABEL: test_canonicalize_value_f32_denorm:2714; GFX12: ; %bb.0:2715; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x02716; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02717; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2718; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02719; GFX12-NEXT: s_wait_kmcnt 0x02720; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]2721; GFX12-NEXT: s_wait_loadcnt 0x02722; GFX12-NEXT: v_max_num_f32_e32 v1, v1, v12723; GFX12-NEXT: global_store_b32 v0, v1, s[2:3]2724; GFX12-NEXT: s_endpgm2725 %id = tail call i32 @llvm.amdgcn.workitem.id.x()2726 %gep = getelementptr inbounds float, ptr addrspace(1) %arg, i32 %id2727 %v = load float, ptr addrspace(1) %gep, align 42728 %canonicalized = tail call float @llvm.canonicalize.f32(float %v)2729 %gep2 = getelementptr inbounds float, ptr addrspace(1) %out, i32 %id2730 store float %canonicalized, ptr addrspace(1) %gep2, align 42731 ret void2732}2733 2734; FIXME: Conversion to float should count as the canonicalize pre-gfx82735define amdgpu_kernel void @test_canonicalize_value_f16_denorm(ptr addrspace(1) %arg, ptr addrspace(1) %out) #3 {2736; GFX6-LABEL: test_canonicalize_value_f16_denorm:2737; GFX6: ; %bb.0:2738; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02739; GFX6-NEXT: v_lshlrev_b32_e32 v2, 1, v02740; GFX6-NEXT: s_add_i32 s12, s12, s172741; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132742; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82743; GFX6-NEXT: s_waitcnt lgkmcnt(0)2744; GFX6-NEXT: v_mov_b32_e32 v1, s12745; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v22746; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2747; GFX6-NEXT: flat_load_ushort v0, v[0:1]2748; GFX6-NEXT: v_mov_b32_e32 v1, s32749; GFX6-NEXT: s_waitcnt vmcnt(0)2750; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v02751; GFX6-NEXT: v_cvt_f16_f32_e32 v3, v02752; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v22753; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2754; GFX6-NEXT: flat_store_short v[0:1], v32755; GFX6-NEXT: s_endpgm2756;2757; GFX8-LABEL: test_canonicalize_value_f16_denorm:2758; GFX8: ; %bb.0:2759; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02760; GFX8-NEXT: v_lshlrev_b32_e32 v2, 1, v02761; GFX8-NEXT: s_add_i32 s12, s12, s172762; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132763; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82764; GFX8-NEXT: s_waitcnt lgkmcnt(0)2765; GFX8-NEXT: v_mov_b32_e32 v1, s12766; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22767; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2768; GFX8-NEXT: flat_load_ushort v0, v[0:1]2769; GFX8-NEXT: v_mov_b32_e32 v1, s32770; GFX8-NEXT: s_waitcnt vmcnt(0)2771; GFX8-NEXT: v_max_f16_e32 v3, v0, v02772; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22773; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2774; GFX8-NEXT: flat_store_short v[0:1], v32775; GFX8-NEXT: s_endpgm2776;2777; GFX9-LABEL: test_canonicalize_value_f16_denorm:2778; GFX9: ; %bb.0:2779; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02780; GFX9-NEXT: v_lshlrev_b32_e32 v0, 1, v02781; GFX9-NEXT: s_waitcnt lgkmcnt(0)2782; GFX9-NEXT: global_load_ushort v1, v0, s[0:1]2783; GFX9-NEXT: s_waitcnt vmcnt(0)2784; GFX9-NEXT: v_max_f16_e32 v1, v1, v12785; GFX9-NEXT: global_store_short v0, v1, s[2:3]2786; GFX9-NEXT: s_endpgm2787;2788; GFX11-TRUE16-LABEL: test_canonicalize_value_f16_denorm:2789; GFX11-TRUE16: ; %bb.0:2790; GFX11-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x02791; GFX11-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02792; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2793; GFX11-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v02794; GFX11-TRUE16-NEXT: s_waitcnt lgkmcnt(0)2795; GFX11-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[0:1]2796; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0)2797; GFX11-TRUE16-NEXT: v_max_f16_e32 v0.l, v0.l, v0.l2798; GFX11-TRUE16-NEXT: global_store_b16 v1, v0, s[2:3]2799; GFX11-TRUE16-NEXT: s_endpgm2800;2801; GFX11-FAKE16-LABEL: test_canonicalize_value_f16_denorm:2802; GFX11-FAKE16: ; %bb.0:2803; GFX11-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x02804; GFX11-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02805; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2806; GFX11-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v02807; GFX11-FAKE16-NEXT: s_waitcnt lgkmcnt(0)2808; GFX11-FAKE16-NEXT: global_load_u16 v1, v0, s[0:1]2809; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0)2810; GFX11-FAKE16-NEXT: v_max_f16_e32 v1, v1, v12811; GFX11-FAKE16-NEXT: global_store_b16 v0, v1, s[2:3]2812; GFX11-FAKE16-NEXT: s_endpgm2813;2814; GFX12-TRUE16-LABEL: test_canonicalize_value_f16_denorm:2815; GFX12-TRUE16: ; %bb.0:2816; GFX12-TRUE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x02817; GFX12-TRUE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02818; GFX12-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2819; GFX12-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 1, v02820; GFX12-TRUE16-NEXT: s_wait_kmcnt 0x02821; GFX12-TRUE16-NEXT: global_load_d16_b16 v0, v1, s[0:1]2822; GFX12-TRUE16-NEXT: s_wait_loadcnt 0x02823; GFX12-TRUE16-NEXT: v_max_num_f16_e32 v0.l, v0.l, v0.l2824; GFX12-TRUE16-NEXT: global_store_b16 v1, v0, s[2:3]2825; GFX12-TRUE16-NEXT: s_endpgm2826;2827; GFX12-FAKE16-LABEL: test_canonicalize_value_f16_denorm:2828; GFX12-FAKE16: ; %bb.0:2829; GFX12-FAKE16-NEXT: s_load_b128 s[0:3], s[4:5], 0x02830; GFX12-FAKE16-NEXT: v_and_b32_e32 v0, 0x3ff, v02831; GFX12-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1)2832; GFX12-FAKE16-NEXT: v_lshlrev_b32_e32 v0, 1, v02833; GFX12-FAKE16-NEXT: s_wait_kmcnt 0x02834; GFX12-FAKE16-NEXT: global_load_u16 v1, v0, s[0:1]2835; GFX12-FAKE16-NEXT: s_wait_loadcnt 0x02836; GFX12-FAKE16-NEXT: v_max_num_f16_e32 v1, v1, v12837; GFX12-FAKE16-NEXT: global_store_b16 v0, v1, s[2:3]2838; GFX12-FAKE16-NEXT: s_endpgm2839 %id = tail call i32 @llvm.amdgcn.workitem.id.x()2840 %gep = getelementptr inbounds half, ptr addrspace(1) %arg, i32 %id2841 %v = load half, ptr addrspace(1) %gep, align 22842 %canonicalized = tail call half @llvm.canonicalize.f16(half %v)2843 %gep2 = getelementptr inbounds half, ptr addrspace(1) %out, i32 %id2844 store half %canonicalized, ptr addrspace(1) %gep2, align 22845 ret void2846}2847 2848 2849 2850define amdgpu_kernel void @test_canonicalize_value_v2f16_denorm(ptr addrspace(1) %arg, ptr addrspace(1) %out) #3 {2851; GFX6-LABEL: test_canonicalize_value_v2f16_denorm:2852; GFX6: ; %bb.0:2853; GFX6-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02854; GFX6-NEXT: v_lshlrev_b32_e32 v2, 2, v02855; GFX6-NEXT: s_add_i32 s12, s12, s172856; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132857; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82858; GFX6-NEXT: s_waitcnt lgkmcnt(0)2859; GFX6-NEXT: v_mov_b32_e32 v1, s12860; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v22861; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2862; GFX6-NEXT: flat_load_dword v0, v[0:1]2863; GFX6-NEXT: v_mov_b32_e32 v3, s32864; GFX6-NEXT: s_waitcnt vmcnt(0)2865; GFX6-NEXT: v_lshrrev_b32_e32 v1, 16, v02866; GFX6-NEXT: v_cvt_f32_f16_e32 v1, v12867; GFX6-NEXT: v_cvt_f32_f16_e32 v0, v02868; GFX6-NEXT: v_cvt_f16_f32_e32 v1, v12869; GFX6-NEXT: v_cvt_f16_f32_e32 v0, v02870; GFX6-NEXT: v_lshlrev_b32_e32 v1, 16, v12871; GFX6-NEXT: v_or_b32_e32 v4, v0, v12872; GFX6-NEXT: v_add_i32_e32 v0, vcc, s2, v22873; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc2874; GFX6-NEXT: flat_store_dword v[0:1], v42875; GFX6-NEXT: s_endpgm2876;2877; GFX8-LABEL: test_canonicalize_value_v2f16_denorm:2878; GFX8: ; %bb.0:2879; GFX8-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02880; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v02881; GFX8-NEXT: s_add_i32 s12, s12, s172882; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132883; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82884; GFX8-NEXT: s_waitcnt lgkmcnt(0)2885; GFX8-NEXT: v_mov_b32_e32 v1, s12886; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v22887; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2888; GFX8-NEXT: flat_load_dword v0, v[0:1]2889; GFX8-NEXT: v_mov_b32_e32 v1, s32890; GFX8-NEXT: s_waitcnt vmcnt(0)2891; GFX8-NEXT: v_max_f16_sdwa v3, v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_12892; GFX8-NEXT: v_max_f16_e32 v0, v0, v02893; GFX8-NEXT: v_or_b32_e32 v3, v0, v32894; GFX8-NEXT: v_add_u32_e32 v0, vcc, s2, v22895; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2896; GFX8-NEXT: flat_store_dword v[0:1], v32897; GFX8-NEXT: s_endpgm2898;2899; GFX9-LABEL: test_canonicalize_value_v2f16_denorm:2900; GFX9: ; %bb.0:2901; GFX9-NEXT: s_load_dwordx4 s[0:3], s[8:9], 0x02902; GFX9-NEXT: v_lshlrev_b32_e32 v0, 2, v02903; GFX9-NEXT: s_waitcnt lgkmcnt(0)2904; GFX9-NEXT: global_load_dword v1, v0, s[0:1]2905; GFX9-NEXT: s_waitcnt vmcnt(0)2906; GFX9-NEXT: v_pk_max_f16 v1, v1, v12907; GFX9-NEXT: global_store_dword v0, v1, s[2:3]2908; GFX9-NEXT: s_endpgm2909;2910; GFX11-LABEL: test_canonicalize_value_v2f16_denorm:2911; GFX11: ; %bb.0:2912; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x02913; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v02914; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)2915; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v02916; GFX11-NEXT: s_waitcnt lgkmcnt(0)2917; GFX11-NEXT: global_load_b32 v1, v0, s[0:1]2918; GFX11-NEXT: s_waitcnt vmcnt(0)2919; GFX11-NEXT: v_pk_max_f16 v1, v1, v12920; GFX11-NEXT: global_store_b32 v0, v1, s[2:3]2921; GFX11-NEXT: s_endpgm2922;2923; GFX12-LABEL: test_canonicalize_value_v2f16_denorm:2924; GFX12: ; %bb.0:2925; GFX12-NEXT: s_load_b128 s[0:3], s[4:5], 0x02926; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v02927; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1)2928; GFX12-NEXT: v_lshlrev_b32_e32 v0, 2, v02929; GFX12-NEXT: s_wait_kmcnt 0x02930; GFX12-NEXT: global_load_b32 v1, v0, s[0:1]2931; GFX12-NEXT: s_wait_loadcnt 0x02932; GFX12-NEXT: v_pk_max_num_f16 v1, v1, v12933; GFX12-NEXT: global_store_b32 v0, v1, s[2:3]2934; GFX12-NEXT: s_endpgm2935 %id = tail call i32 @llvm.amdgcn.workitem.id.x()2936 %gep = getelementptr inbounds <2 x half>, ptr addrspace(1) %arg, i32 %id2937 %v = load <2 x half>, ptr addrspace(1) %gep, align 42938 %canonicalized = tail call <2 x half> @llvm.canonicalize.v2f16(<2 x half> %v)2939 %gep2 = getelementptr inbounds <2 x half>, ptr addrspace(1) %out, i32 %id2940 store <2 x half> %canonicalized, ptr addrspace(1) %gep2, align 22941 ret void2942}2943 2944define amdgpu_kernel void @v_test_canonicalize_var_v2f64(ptr addrspace(1) %out) #1 {2945; GFX6-LABEL: v_test_canonicalize_var_v2f64:2946; GFX6: ; %bb.0:2947; GFX6-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02948; GFX6-NEXT: v_lshlrev_b32_e32 v0, 4, v02949; GFX6-NEXT: s_add_i32 s12, s12, s172950; GFX6-NEXT: s_mov_b32 flat_scratch_lo, s132951; GFX6-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82952; GFX6-NEXT: s_waitcnt lgkmcnt(0)2953; GFX6-NEXT: v_mov_b32_e32 v1, s12954; GFX6-NEXT: v_add_i32_e32 v0, vcc, s0, v02955; GFX6-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2956; GFX6-NEXT: flat_load_dwordx4 v[0:3], v[0:1]2957; GFX6-NEXT: v_mov_b32_e32 v5, s12958; GFX6-NEXT: v_mov_b32_e32 v4, s02959; GFX6-NEXT: s_waitcnt vmcnt(0)2960; GFX6-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]2961; GFX6-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2962; GFX6-NEXT: flat_store_dwordx4 v[4:5], v[0:3]2963; GFX6-NEXT: s_endpgm2964;2965; GFX8-LABEL: v_test_canonicalize_var_v2f64:2966; GFX8: ; %bb.0:2967; GFX8-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02968; GFX8-NEXT: v_lshlrev_b32_e32 v0, 4, v02969; GFX8-NEXT: s_add_i32 s12, s12, s172970; GFX8-NEXT: s_mov_b32 flat_scratch_lo, s132971; GFX8-NEXT: s_lshr_b32 flat_scratch_hi, s12, 82972; GFX8-NEXT: s_waitcnt lgkmcnt(0)2973; GFX8-NEXT: v_mov_b32_e32 v1, s12974; GFX8-NEXT: v_add_u32_e32 v0, vcc, s0, v02975; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc2976; GFX8-NEXT: flat_load_dwordx4 v[0:3], v[0:1]2977; GFX8-NEXT: v_mov_b32_e32 v5, s12978; GFX8-NEXT: v_mov_b32_e32 v4, s02979; GFX8-NEXT: s_waitcnt vmcnt(0)2980; GFX8-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]2981; GFX8-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2982; GFX8-NEXT: flat_store_dwordx4 v[4:5], v[0:3]2983; GFX8-NEXT: s_endpgm2984;2985; GFX9-LABEL: v_test_canonicalize_var_v2f64:2986; GFX9: ; %bb.0:2987; GFX9-NEXT: s_load_dwordx2 s[0:1], s[8:9], 0x02988; GFX9-NEXT: v_lshlrev_b32_e32 v0, 4, v02989; GFX9-NEXT: v_mov_b32_e32 v4, 02990; GFX9-NEXT: s_waitcnt lgkmcnt(0)2991; GFX9-NEXT: global_load_dwordx4 v[0:3], v0, s[0:1]2992; GFX9-NEXT: s_waitcnt vmcnt(0)2993; GFX9-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]2994; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]2995; GFX9-NEXT: global_store_dwordx4 v4, v[0:3], s[0:1]2996; GFX9-NEXT: s_endpgm2997;2998; GFX11-LABEL: v_test_canonicalize_var_v2f64:2999; GFX11: ; %bb.0:3000; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x03001; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v03002; GFX11-NEXT: v_mov_b32_e32 v4, 03003; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)3004; GFX11-NEXT: v_lshlrev_b32_e32 v0, 4, v03005; GFX11-NEXT: s_waitcnt lgkmcnt(0)3006; GFX11-NEXT: global_load_b128 v[0:3], v0, s[0:1]3007; GFX11-NEXT: s_waitcnt vmcnt(0)3008; GFX11-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3009; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3010; GFX11-NEXT: global_store_b128 v4, v[0:3], s[0:1]3011; GFX11-NEXT: s_endpgm3012;3013; GFX12-LABEL: v_test_canonicalize_var_v2f64:3014; GFX12: ; %bb.0:3015; GFX12-NEXT: s_load_b64 s[0:1], s[4:5], 0x03016; GFX12-NEXT: v_and_b32_e32 v0, 0x3ff, v03017; GFX12-NEXT: v_mov_b32_e32 v4, 03018; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_2)3019; GFX12-NEXT: v_lshlrev_b32_e32 v0, 4, v03020; GFX12-NEXT: s_wait_kmcnt 0x03021; GFX12-NEXT: global_load_b128 v[0:3], v0, s[0:1]3022; GFX12-NEXT: s_wait_loadcnt 0x03023; GFX12-NEXT: v_max_num_f64_e32 v[2:3], v[2:3], v[2:3]3024; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]3025; GFX12-NEXT: global_store_b128 v4, v[0:3], s[0:1]3026; GFX12-NEXT: s_endpgm3027 %tid = call i32 @llvm.amdgcn.workitem.id.x()3028 %gep = getelementptr <2 x double>, ptr addrspace(1) %out, i32 %tid3029 %val = load <2 x double>, ptr addrspace(1) %gep3030 %canonicalized = call <2 x double> @llvm.canonicalize.v2f64(<2 x double> %val)3031 store <2 x double> %canonicalized, ptr addrspace(1) %out3032 ret void3033}3034 3035 3036define <2 x float> @v_test_canonicalize_v2f32_flush(<2 x float> %arg) #1 {3037; GFX678-LABEL: v_test_canonicalize_v2f32_flush:3038; GFX678: ; %bb.0:3039; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3040; GFX678-NEXT: v_mul_f32_e32 v0, 1.0, v03041; GFX678-NEXT: v_mul_f32_e32 v1, 1.0, v13042; GFX678-NEXT: s_setpc_b64 s[30:31]3043;3044; GFX9-LABEL: v_test_canonicalize_v2f32_flush:3045; GFX9: ; %bb.0:3046; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3047; GFX9-NEXT: v_max_f32_e32 v0, v0, v03048; GFX9-NEXT: v_max_f32_e32 v1, v1, v13049; GFX9-NEXT: s_setpc_b64 s[30:31]3050;3051; GFX11-LABEL: v_test_canonicalize_v2f32_flush:3052; GFX11: ; %bb.0:3053; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3054; GFX11-NEXT: v_dual_max_f32 v0, v0, v0 :: v_dual_max_f32 v1, v1, v13055; GFX11-NEXT: s_setpc_b64 s[30:31]3056;3057; GFX12-LABEL: v_test_canonicalize_v2f32_flush:3058; GFX12: ; %bb.0:3059; GFX12-NEXT: s_wait_loadcnt_dscnt 0x03060; GFX12-NEXT: s_wait_expcnt 0x03061; GFX12-NEXT: s_wait_samplecnt 0x03062; GFX12-NEXT: s_wait_bvhcnt 0x03063; GFX12-NEXT: s_wait_kmcnt 0x03064; GFX12-NEXT: v_dual_max_num_f32 v0, v0, v0 :: v_dual_max_num_f32 v1, v1, v13065; GFX12-NEXT: s_setpc_b64 s[30:31]3066 %canon = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %arg)3067 ret <2 x float> %canon3068}3069 3070 3071define <3 x float> @v_test_canonicalize_v3f32_flush(<3 x float> %arg) #1 {3072; GFX678-LABEL: v_test_canonicalize_v3f32_flush:3073; GFX678: ; %bb.0:3074; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3075; GFX678-NEXT: v_mul_f32_e32 v0, 1.0, v03076; GFX678-NEXT: v_mul_f32_e32 v1, 1.0, v13077; GFX678-NEXT: v_mul_f32_e32 v2, 1.0, v23078; GFX678-NEXT: s_setpc_b64 s[30:31]3079;3080; GFX9-LABEL: v_test_canonicalize_v3f32_flush:3081; GFX9: ; %bb.0:3082; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3083; GFX9-NEXT: v_max_f32_e32 v0, v0, v03084; GFX9-NEXT: v_max_f32_e32 v1, v1, v13085; GFX9-NEXT: v_max_f32_e32 v2, v2, v23086; GFX9-NEXT: s_setpc_b64 s[30:31]3087;3088; GFX11-LABEL: v_test_canonicalize_v3f32_flush:3089; GFX11: ; %bb.0:3090; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3091; GFX11-NEXT: v_dual_max_f32 v0, v0, v0 :: v_dual_max_f32 v1, v1, v13092; GFX11-NEXT: v_max_f32_e32 v2, v2, v23093; GFX11-NEXT: s_setpc_b64 s[30:31]3094;3095; GFX12-LABEL: v_test_canonicalize_v3f32_flush:3096; GFX12: ; %bb.0:3097; GFX12-NEXT: s_wait_loadcnt_dscnt 0x03098; GFX12-NEXT: s_wait_expcnt 0x03099; GFX12-NEXT: s_wait_samplecnt 0x03100; GFX12-NEXT: s_wait_bvhcnt 0x03101; GFX12-NEXT: s_wait_kmcnt 0x03102; GFX12-NEXT: v_dual_max_num_f32 v0, v0, v0 :: v_dual_max_num_f32 v1, v1, v13103; GFX12-NEXT: v_max_num_f32_e32 v2, v2, v23104; GFX12-NEXT: s_setpc_b64 s[30:31]3105 %canon = call <3 x float> @llvm.canonicalize.v3f32(<3 x float> %arg)3106 ret <3 x float> %canon3107}3108 3109 3110define <4 x float> @v_test_canonicalize_v4f32_flush(<4 x float> %arg) #1 {3111; GFX678-LABEL: v_test_canonicalize_v4f32_flush:3112; GFX678: ; %bb.0:3113; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3114; GFX678-NEXT: v_mul_f32_e32 v0, 1.0, v03115; GFX678-NEXT: v_mul_f32_e32 v1, 1.0, v13116; GFX678-NEXT: v_mul_f32_e32 v2, 1.0, v23117; GFX678-NEXT: v_mul_f32_e32 v3, 1.0, v33118; GFX678-NEXT: s_setpc_b64 s[30:31]3119;3120; GFX9-LABEL: v_test_canonicalize_v4f32_flush:3121; GFX9: ; %bb.0:3122; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3123; GFX9-NEXT: v_max_f32_e32 v0, v0, v03124; GFX9-NEXT: v_max_f32_e32 v1, v1, v13125; GFX9-NEXT: v_max_f32_e32 v2, v2, v23126; GFX9-NEXT: v_max_f32_e32 v3, v3, v33127; GFX9-NEXT: s_setpc_b64 s[30:31]3128;3129; GFX11-LABEL: v_test_canonicalize_v4f32_flush:3130; GFX11: ; %bb.0:3131; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3132; GFX11-NEXT: v_dual_max_f32 v0, v0, v0 :: v_dual_max_f32 v1, v1, v13133; GFX11-NEXT: v_dual_max_f32 v2, v2, v2 :: v_dual_max_f32 v3, v3, v33134; GFX11-NEXT: s_setpc_b64 s[30:31]3135;3136; GFX12-LABEL: v_test_canonicalize_v4f32_flush:3137; GFX12: ; %bb.0:3138; GFX12-NEXT: s_wait_loadcnt_dscnt 0x03139; GFX12-NEXT: s_wait_expcnt 0x03140; GFX12-NEXT: s_wait_samplecnt 0x03141; GFX12-NEXT: s_wait_bvhcnt 0x03142; GFX12-NEXT: s_wait_kmcnt 0x03143; GFX12-NEXT: v_dual_max_num_f32 v0, v0, v0 :: v_dual_max_num_f32 v1, v1, v13144; GFX12-NEXT: v_dual_max_num_f32 v2, v2, v2 :: v_dual_max_num_f32 v3, v3, v33145; GFX12-NEXT: s_setpc_b64 s[30:31]3146 %canon = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %arg)3147 ret <4 x float> %canon3148}3149 3150 3151define <8 x float> @v_test_canonicalize_v8f32_flush(<8 x float> %arg) #1 {3152; GFX678-LABEL: v_test_canonicalize_v8f32_flush:3153; GFX678: ; %bb.0:3154; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3155; GFX678-NEXT: v_mul_f32_e32 v0, 1.0, v03156; GFX678-NEXT: v_mul_f32_e32 v1, 1.0, v13157; GFX678-NEXT: v_mul_f32_e32 v2, 1.0, v23158; GFX678-NEXT: v_mul_f32_e32 v3, 1.0, v33159; GFX678-NEXT: v_mul_f32_e32 v4, 1.0, v43160; GFX678-NEXT: v_mul_f32_e32 v5, 1.0, v53161; GFX678-NEXT: v_mul_f32_e32 v6, 1.0, v63162; GFX678-NEXT: v_mul_f32_e32 v7, 1.0, v73163; GFX678-NEXT: s_setpc_b64 s[30:31]3164;3165; GFX9-LABEL: v_test_canonicalize_v8f32_flush:3166; GFX9: ; %bb.0:3167; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3168; GFX9-NEXT: v_max_f32_e32 v0, v0, v03169; GFX9-NEXT: v_max_f32_e32 v1, v1, v13170; GFX9-NEXT: v_max_f32_e32 v2, v2, v23171; GFX9-NEXT: v_max_f32_e32 v3, v3, v33172; GFX9-NEXT: v_max_f32_e32 v4, v4, v43173; GFX9-NEXT: v_max_f32_e32 v5, v5, v53174; GFX9-NEXT: v_max_f32_e32 v6, v6, v63175; GFX9-NEXT: v_max_f32_e32 v7, v7, v73176; GFX9-NEXT: s_setpc_b64 s[30:31]3177;3178; GFX11-LABEL: v_test_canonicalize_v8f32_flush:3179; GFX11: ; %bb.0:3180; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3181; GFX11-NEXT: v_dual_max_f32 v0, v0, v0 :: v_dual_max_f32 v1, v1, v13182; GFX11-NEXT: v_dual_max_f32 v2, v2, v2 :: v_dual_max_f32 v3, v3, v33183; GFX11-NEXT: v_dual_max_f32 v4, v4, v4 :: v_dual_max_f32 v5, v5, v53184; GFX11-NEXT: v_dual_max_f32 v6, v6, v6 :: v_dual_max_f32 v7, v7, v73185; GFX11-NEXT: s_setpc_b64 s[30:31]3186;3187; GFX12-LABEL: v_test_canonicalize_v8f32_flush:3188; GFX12: ; %bb.0:3189; GFX12-NEXT: s_wait_loadcnt_dscnt 0x03190; GFX12-NEXT: s_wait_expcnt 0x03191; GFX12-NEXT: s_wait_samplecnt 0x03192; GFX12-NEXT: s_wait_bvhcnt 0x03193; GFX12-NEXT: s_wait_kmcnt 0x03194; GFX12-NEXT: v_dual_max_num_f32 v0, v0, v0 :: v_dual_max_num_f32 v1, v1, v13195; GFX12-NEXT: v_dual_max_num_f32 v2, v2, v2 :: v_dual_max_num_f32 v3, v3, v33196; GFX12-NEXT: v_dual_max_num_f32 v4, v4, v4 :: v_dual_max_num_f32 v5, v5, v53197; GFX12-NEXT: v_dual_max_num_f32 v6, v6, v6 :: v_dual_max_num_f32 v7, v7, v73198; GFX12-NEXT: s_setpc_b64 s[30:31]3199 %canon = call <8 x float> @llvm.canonicalize.v8f32(<8 x float> %arg)3200 ret <8 x float> %canon3201}3202 3203define <2 x double> @v_test_canonicalize_v2f64(<2 x double> %arg) #1 {3204; GFX678-LABEL: v_test_canonicalize_v2f64:3205; GFX678: ; %bb.0:3206; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3207; GFX678-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3208; GFX678-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3209; GFX678-NEXT: s_setpc_b64 s[30:31]3210;3211; GFX9-LABEL: v_test_canonicalize_v2f64:3212; GFX9: ; %bb.0:3213; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3214; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3215; GFX9-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3216; GFX9-NEXT: s_setpc_b64 s[30:31]3217;3218; GFX11-LABEL: v_test_canonicalize_v2f64:3219; GFX11: ; %bb.0:3220; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3221; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3222; GFX11-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3223; GFX11-NEXT: s_setpc_b64 s[30:31]3224;3225; GFX12-LABEL: v_test_canonicalize_v2f64:3226; GFX12: ; %bb.0:3227; GFX12-NEXT: s_wait_loadcnt_dscnt 0x03228; GFX12-NEXT: s_wait_expcnt 0x03229; GFX12-NEXT: s_wait_samplecnt 0x03230; GFX12-NEXT: s_wait_bvhcnt 0x03231; GFX12-NEXT: s_wait_kmcnt 0x03232; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]3233; GFX12-NEXT: v_max_num_f64_e32 v[2:3], v[2:3], v[2:3]3234; GFX12-NEXT: s_setpc_b64 s[30:31]3235 %canon = call <2 x double> @llvm.canonicalize.v2f64(<2 x double> %arg)3236 ret <2 x double> %canon3237}3238 3239define <3 x double> @v_test_canonicalize_v3f64(<3 x double> %arg) #1 {3240; GFX678-LABEL: v_test_canonicalize_v3f64:3241; GFX678: ; %bb.0:3242; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3243; GFX678-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3244; GFX678-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3245; GFX678-NEXT: v_max_f64 v[4:5], v[4:5], v[4:5]3246; GFX678-NEXT: s_setpc_b64 s[30:31]3247;3248; GFX9-LABEL: v_test_canonicalize_v3f64:3249; GFX9: ; %bb.0:3250; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3251; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3252; GFX9-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3253; GFX9-NEXT: v_max_f64 v[4:5], v[4:5], v[4:5]3254; GFX9-NEXT: s_setpc_b64 s[30:31]3255;3256; GFX11-LABEL: v_test_canonicalize_v3f64:3257; GFX11: ; %bb.0:3258; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3259; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3260; GFX11-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3261; GFX11-NEXT: v_max_f64 v[4:5], v[4:5], v[4:5]3262; GFX11-NEXT: s_setpc_b64 s[30:31]3263;3264; GFX12-LABEL: v_test_canonicalize_v3f64:3265; GFX12: ; %bb.0:3266; GFX12-NEXT: s_wait_loadcnt_dscnt 0x03267; GFX12-NEXT: s_wait_expcnt 0x03268; GFX12-NEXT: s_wait_samplecnt 0x03269; GFX12-NEXT: s_wait_bvhcnt 0x03270; GFX12-NEXT: s_wait_kmcnt 0x03271; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]3272; GFX12-NEXT: v_max_num_f64_e32 v[2:3], v[2:3], v[2:3]3273; GFX12-NEXT: v_max_num_f64_e32 v[4:5], v[4:5], v[4:5]3274; GFX12-NEXT: s_setpc_b64 s[30:31]3275 %canon = call <3 x double> @llvm.canonicalize.v3f64(<3 x double> %arg)3276 ret <3 x double> %canon3277}3278 3279define <4 x double> @v_test_canonicalize_v4f64(<4 x double> %arg) #1 {3280; GFX678-LABEL: v_test_canonicalize_v4f64:3281; GFX678: ; %bb.0:3282; GFX678-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3283; GFX678-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3284; GFX678-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3285; GFX678-NEXT: v_max_f64 v[4:5], v[4:5], v[4:5]3286; GFX678-NEXT: v_max_f64 v[6:7], v[6:7], v[6:7]3287; GFX678-NEXT: s_setpc_b64 s[30:31]3288;3289; GFX9-LABEL: v_test_canonicalize_v4f64:3290; GFX9: ; %bb.0:3291; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3292; GFX9-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3293; GFX9-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3294; GFX9-NEXT: v_max_f64 v[4:5], v[4:5], v[4:5]3295; GFX9-NEXT: v_max_f64 v[6:7], v[6:7], v[6:7]3296; GFX9-NEXT: s_setpc_b64 s[30:31]3297;3298; GFX11-LABEL: v_test_canonicalize_v4f64:3299; GFX11: ; %bb.0:3300; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)3301; GFX11-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]3302; GFX11-NEXT: v_max_f64 v[2:3], v[2:3], v[2:3]3303; GFX11-NEXT: v_max_f64 v[4:5], v[4:5], v[4:5]3304; GFX11-NEXT: v_max_f64 v[6:7], v[6:7], v[6:7]3305; GFX11-NEXT: s_setpc_b64 s[30:31]3306;3307; GFX12-LABEL: v_test_canonicalize_v4f64:3308; GFX12: ; %bb.0:3309; GFX12-NEXT: s_wait_loadcnt_dscnt 0x03310; GFX12-NEXT: s_wait_expcnt 0x03311; GFX12-NEXT: s_wait_samplecnt 0x03312; GFX12-NEXT: s_wait_bvhcnt 0x03313; GFX12-NEXT: s_wait_kmcnt 0x03314; GFX12-NEXT: v_max_num_f64_e32 v[0:1], v[0:1], v[0:1]3315; GFX12-NEXT: v_max_num_f64_e32 v[2:3], v[2:3], v[2:3]3316; GFX12-NEXT: v_max_num_f64_e32 v[4:5], v[4:5], v[4:5]3317; GFX12-NEXT: v_max_num_f64_e32 v[6:7], v[6:7], v[6:7]3318; GFX12-NEXT: s_setpc_b64 s[30:31]3319 %canon = call <4 x double> @llvm.canonicalize.v4f64(<4 x double> %arg)3320 ret <4 x double> %canon3321}3322 3323attributes #0 = { nounwind readnone }3324attributes #1 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }3325attributes #2 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" }3326attributes #3 = { nounwind "denormal-fp-math"="ieee,ieee" }3327attributes #4 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" }3328attributes #5 = { nounwind "denormal-fp-math-f32"="dynamic,dynamic" }3329attributes #6 = { nounwind "denormal-fp-math-f32"="dynamic,ieee" }3330attributes #7 = { nounwind "denormal-fp-math-f32"="ieee,dynamic" }3331