brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.4 KiB · 74ee867 Raw
339 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck %s3 4; Check that nofpclass attributes on call returns are used in5; selectiondag.6 7define internal float @func_f32(ptr addrspace(1) %ptr) {8; CHECK-LABEL: func_f32:9; CHECK:       ; %bb.0:10; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11; CHECK-NEXT:    global_load_dword v0, v[0:1], off glc12; CHECK-NEXT:    s_waitcnt vmcnt(0)13; CHECK-NEXT:    s_setpc_b64 s[30:31]14  %ld = load volatile float, ptr addrspace(1) %ptr15  ret float %ld16}17 18define float @call_nofpclass_funcs_f32(ptr addrspace(1) %ptr) {19; CHECK-LABEL: call_nofpclass_funcs_f32:20; CHECK:       ; %bb.0:21; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)22; CHECK-NEXT:    s_mov_b32 s18, s3323; CHECK-NEXT:    s_mov_b32 s33, s3224; CHECK-NEXT:    s_xor_saveexec_b64 s[16:17], -125; CHECK-NEXT:    buffer_store_dword v4, off, s[0:3], s33 ; 4-byte Folded Spill26; CHECK-NEXT:    s_mov_b64 exec, s[16:17]27; CHECK-NEXT:    s_addk_i32 s32, 0x40028; CHECK-NEXT:    v_writelane_b32 v4, s30, 029; CHECK-NEXT:    s_getpc_b64 s[16:17]30; CHECK-NEXT:    s_add_u32 s16, s16, func_f32@rel32@lo+431; CHECK-NEXT:    s_addc_u32 s17, s17, func_f32@rel32@hi+1232; CHECK-NEXT:    v_writelane_b32 v4, s31, 133; CHECK-NEXT:    v_mov_b32_e32 v2, v034; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]35; CHECK-NEXT:    v_mov_b32_e32 v3, v036; CHECK-NEXT:    v_mov_b32_e32 v0, v237; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]38; CHECK-NEXT:    v_min_f32_e32 v0, v3, v039; CHECK-NEXT:    v_readlane_b32 s31, v4, 140; CHECK-NEXT:    v_readlane_b32 s30, v4, 041; CHECK-NEXT:    s_mov_b32 s32, s3342; CHECK-NEXT:    s_xor_saveexec_b64 s[4:5], -143; CHECK-NEXT:    buffer_load_dword v4, off, s[0:3], s33 ; 4-byte Folded Reload44; CHECK-NEXT:    s_mov_b64 exec, s[4:5]45; CHECK-NEXT:    s_mov_b32 s33, s1846; CHECK-NEXT:    s_waitcnt vmcnt(0)47; CHECK-NEXT:    s_setpc_b64 s[30:31]48  %call0 = call nofpclass(nan) float @func_f32(ptr addrspace(1) %ptr)49  %call1 = call nofpclass(nan) float @func_f32(ptr addrspace(1) %ptr)50  %min = call float @llvm.minnum.f32(float %call0, float %call1)51  ret float %min52}53 54define internal <2 x float> @func_v2f32(ptr addrspace(1) %ptr) {55; CHECK-LABEL: func_v2f32:56; CHECK:       ; %bb.0:57; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)58; CHECK-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off glc59; CHECK-NEXT:    s_waitcnt vmcnt(0)60; CHECK-NEXT:    s_setpc_b64 s[30:31]61  %ld = load volatile <2 x float>, ptr addrspace(1) %ptr62  ret <2 x float> %ld63}64 65define <2 x float> @call_nofpclass_funcs_v2f32(ptr addrspace(1) %ptr) {66; CHECK-LABEL: call_nofpclass_funcs_v2f32:67; CHECK:       ; %bb.0:68; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)69; CHECK-NEXT:    s_mov_b32 s18, s3370; CHECK-NEXT:    s_mov_b32 s33, s3271; CHECK-NEXT:    s_xor_saveexec_b64 s[16:17], -172; CHECK-NEXT:    buffer_store_dword v6, off, s[0:3], s33 ; 4-byte Folded Spill73; CHECK-NEXT:    s_mov_b64 exec, s[16:17]74; CHECK-NEXT:    s_addk_i32 s32, 0x40075; CHECK-NEXT:    v_writelane_b32 v6, s30, 076; CHECK-NEXT:    s_getpc_b64 s[16:17]77; CHECK-NEXT:    s_add_u32 s16, s16, func_v2f32@rel32@lo+478; CHECK-NEXT:    s_addc_u32 s17, s17, func_v2f32@rel32@hi+1279; CHECK-NEXT:    v_writelane_b32 v6, s31, 180; CHECK-NEXT:    v_mov_b32_e32 v2, v181; CHECK-NEXT:    v_mov_b32_e32 v3, v082; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]83; CHECK-NEXT:    v_mov_b32_e32 v4, v084; CHECK-NEXT:    v_mov_b32_e32 v5, v185; CHECK-NEXT:    v_mov_b32_e32 v0, v386; CHECK-NEXT:    v_mov_b32_e32 v1, v287; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]88; CHECK-NEXT:    v_min_f32_e32 v0, v4, v089; CHECK-NEXT:    v_min_f32_e32 v1, v5, v190; CHECK-NEXT:    v_readlane_b32 s31, v6, 191; CHECK-NEXT:    v_readlane_b32 s30, v6, 092; CHECK-NEXT:    s_mov_b32 s32, s3393; CHECK-NEXT:    s_xor_saveexec_b64 s[4:5], -194; CHECK-NEXT:    buffer_load_dword v6, off, s[0:3], s33 ; 4-byte Folded Reload95; CHECK-NEXT:    s_mov_b64 exec, s[4:5]96; CHECK-NEXT:    s_mov_b32 s33, s1897; CHECK-NEXT:    s_waitcnt vmcnt(0)98; CHECK-NEXT:    s_setpc_b64 s[30:31]99  %call0 = call nofpclass(nan) <2 x float> @func_v2f32(ptr addrspace(1) %ptr)100  %call1 = call nofpclass(nan) <2 x float> @func_v2f32(ptr addrspace(1) %ptr)101  %min = call <2 x float> @llvm.minnum.v2f32(<2 x float> %call0, <2 x float> %call1)102  ret <2 x float> %min103}104 105define internal double @func_f64(ptr addrspace(1) %ptr) {106; CHECK-LABEL: func_f64:107; CHECK:       ; %bb.0:108; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)109; CHECK-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off glc110; CHECK-NEXT:    s_waitcnt vmcnt(0)111; CHECK-NEXT:    s_setpc_b64 s[30:31]112  %ld = load volatile double, ptr addrspace(1) %ptr113  ret double %ld114}115 116define double @call_nofpclass_funcs_f64(ptr addrspace(1) %ptr) {117; CHECK-LABEL: call_nofpclass_funcs_f64:118; CHECK:       ; %bb.0:119; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)120; CHECK-NEXT:    s_mov_b32 s18, s33121; CHECK-NEXT:    s_mov_b32 s33, s32122; CHECK-NEXT:    s_xor_saveexec_b64 s[16:17], -1123; CHECK-NEXT:    buffer_store_dword v6, off, s[0:3], s33 ; 4-byte Folded Spill124; CHECK-NEXT:    s_mov_b64 exec, s[16:17]125; CHECK-NEXT:    s_addk_i32 s32, 0x400126; CHECK-NEXT:    v_writelane_b32 v6, s30, 0127; CHECK-NEXT:    s_getpc_b64 s[16:17]128; CHECK-NEXT:    s_add_u32 s16, s16, func_f64@rel32@lo+4129; CHECK-NEXT:    s_addc_u32 s17, s17, func_f64@rel32@hi+12130; CHECK-NEXT:    v_writelane_b32 v6, s31, 1131; CHECK-NEXT:    v_mov_b32_e32 v4, v1132; CHECK-NEXT:    v_mov_b32_e32 v5, v0133; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]134; CHECK-NEXT:    v_mov_b32_e32 v2, v0135; CHECK-NEXT:    v_mov_b32_e32 v3, v1136; CHECK-NEXT:    v_mov_b32_e32 v0, v5137; CHECK-NEXT:    v_mov_b32_e32 v1, v4138; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]139; CHECK-NEXT:    v_min_f64 v[0:1], v[2:3], v[0:1]140; CHECK-NEXT:    v_readlane_b32 s31, v6, 1141; CHECK-NEXT:    v_readlane_b32 s30, v6, 0142; CHECK-NEXT:    s_mov_b32 s32, s33143; CHECK-NEXT:    s_xor_saveexec_b64 s[4:5], -1144; CHECK-NEXT:    buffer_load_dword v6, off, s[0:3], s33 ; 4-byte Folded Reload145; CHECK-NEXT:    s_mov_b64 exec, s[4:5]146; CHECK-NEXT:    s_mov_b32 s33, s18147; CHECK-NEXT:    s_waitcnt vmcnt(0)148; CHECK-NEXT:    s_setpc_b64 s[30:31]149  %call0 = call nofpclass(nan) double @func_f64(ptr addrspace(1) %ptr)150  %call1 = call nofpclass(nan) double @func_f64(ptr addrspace(1) %ptr)151  %min = call double @llvm.minnum.f64(double %call0, double %call1)152  ret double %min153}154 155define float @call_nofpclass_intrinsic_f32(float %x, float %y, float %z) {156; CHECK-LABEL: call_nofpclass_intrinsic_f32:157; CHECK:       ; %bb.0:158; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)159; CHECK-NEXT:    v_sqrt_f32_e32 v0, v0160; CHECK-NEXT:    v_sqrt_f32_e32 v1, v1161; CHECK-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1162; CHECK-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc163; CHECK-NEXT:    s_setpc_b64 s[30:31]164  %call0 = call nofpclass(nan) float @llvm.amdgcn.sqrt.f32(float %x)165  %call1 = call nofpclass(nan) float @llvm.amdgcn.sqrt.f32(float %y)166  %lt = fcmp olt float %call0, %call1167  %min = select nsz i1 %lt, float %call0, float %call1168  ret float %min169}170 171define <2 x half> @call_nofpclass_intrinsic_v2f16(float %x, float %y, float %z, float %w) {172; CHECK-LABEL: call_nofpclass_intrinsic_v2f16:173; CHECK:       ; %bb.0:174; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)175; CHECK-NEXT:    v_cvt_pkrtz_f16_f32 v0, v0, v1176; CHECK-NEXT:    v_cvt_pkrtz_f16_f32 v1, v2, v3177; CHECK-NEXT:    v_lshrrev_b32_e32 v2, 16, v1178; CHECK-NEXT:    v_lshrrev_b32_e32 v3, 16, v0179; CHECK-NEXT:    v_cmp_lt_f16_e32 vcc, v0, v1180; CHECK-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc181; CHECK-NEXT:    v_cmp_lt_f16_e32 vcc, v3, v2182; CHECK-NEXT:    v_cndmask_b32_e32 v1, v2, v3, vcc183; CHECK-NEXT:    s_mov_b32 s4, 0x5040100184; CHECK-NEXT:    v_perm_b32 v0, v1, v0, s4185; CHECK-NEXT:    s_setpc_b64 s[30:31]186  %call0 = call nofpclass(nan) <2 x half> @llvm.amdgcn.cvt.pkrtz(float %x, float %y)187  %call1 = call nofpclass(nan) <2 x half> @llvm.amdgcn.cvt.pkrtz(float %z, float %w)188  %lt = fcmp olt <2 x half> %call0, %call1189  %min = select nsz <2 x i1> %lt, <2 x half> %call0, <2 x half> %call1190  ret <2 x half> %min191}192 193define nofpclass(nan inf) { double, double } @aggregate() {194; CHECK-LABEL: aggregate:195; CHECK:       ; %bb.0: ; %entry196; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)197; CHECK-NEXT:    s_mov_b32 s16, s33198; CHECK-NEXT:    s_mov_b32 s33, s32199; CHECK-NEXT:    s_or_saveexec_b64 s[18:19], -1200; CHECK-NEXT:    buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill201; CHECK-NEXT:    s_mov_b64 exec, s[18:19]202; CHECK-NEXT:    s_addk_i32 s32, 0x400203; CHECK-NEXT:    v_writelane_b32 v40, s16, 2204; CHECK-NEXT:    s_getpc_b64 s[16:17]205; CHECK-NEXT:    s_add_u32 s16, s16, aggregate@gotpcrel32@lo+4206; CHECK-NEXT:    s_addc_u32 s17, s17, aggregate@gotpcrel32@hi+12207; CHECK-NEXT:    s_load_dwordx2 s[16:17], s[16:17], 0x0208; CHECK-NEXT:    v_writelane_b32 v40, s30, 0209; CHECK-NEXT:    v_writelane_b32 v40, s31, 1210; CHECK-NEXT:    s_waitcnt lgkmcnt(0)211; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]212; CHECK-NEXT:    v_readlane_b32 s31, v40, 1213; CHECK-NEXT:    v_readlane_b32 s30, v40, 0214; CHECK-NEXT:    s_mov_b32 s32, s33215; CHECK-NEXT:    v_readlane_b32 s4, v40, 2216; CHECK-NEXT:    s_or_saveexec_b64 s[6:7], -1217; CHECK-NEXT:    buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload218; CHECK-NEXT:    s_mov_b64 exec, s[6:7]219; CHECK-NEXT:    s_mov_b32 s33, s4220; CHECK-NEXT:    s_waitcnt vmcnt(0)221; CHECK-NEXT:    s_setpc_b64 s[30:31]222entry:223  %call.i.i = call { double, double } @aggregate()224  ret { double, double } %call.i.i225}226 227declare hidden nofpclass(nan inf) { float, float } @aggregate_f32()228 229define { float, float } @aggregate_use(float %z) {230; CHECK-LABEL: aggregate_use:231; CHECK:       ; %bb.0:232; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)233; CHECK-NEXT:    s_mov_b32 s16, s33234; CHECK-NEXT:    s_mov_b32 s33, s32235; CHECK-NEXT:    s_or_saveexec_b64 s[18:19], -1236; CHECK-NEXT:    buffer_store_dword v41, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill237; CHECK-NEXT:    s_mov_b64 exec, s[18:19]238; CHECK-NEXT:    v_writelane_b32 v41, s16, 2239; CHECK-NEXT:    s_addk_i32 s32, 0x400240; CHECK-NEXT:    v_writelane_b32 v41, s30, 0241; CHECK-NEXT:    s_getpc_b64 s[16:17]242; CHECK-NEXT:    s_add_u32 s16, s16, aggregate_f32@rel32@lo+4243; CHECK-NEXT:    s_addc_u32 s17, s17, aggregate_f32@rel32@hi+12244; CHECK-NEXT:    buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill245; CHECK-NEXT:    v_writelane_b32 v41, s31, 1246; CHECK-NEXT:    v_mov_b32_e32 v40, v0247; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]248; CHECK-NEXT:    v_max_f32_e32 v2, v40, v40249; CHECK-NEXT:    buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload250; CHECK-NEXT:    v_min_f32_e32 v0, v0, v2251; CHECK-NEXT:    v_min_f32_e32 v1, v1, v2252; CHECK-NEXT:    v_readlane_b32 s31, v41, 1253; CHECK-NEXT:    v_readlane_b32 s30, v41, 0254; CHECK-NEXT:    s_mov_b32 s32, s33255; CHECK-NEXT:    v_readlane_b32 s4, v41, 2256; CHECK-NEXT:    s_or_saveexec_b64 s[6:7], -1257; CHECK-NEXT:    buffer_load_dword v41, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload258; CHECK-NEXT:    s_mov_b64 exec, s[6:7]259; CHECK-NEXT:    s_mov_b32 s33, s4260; CHECK-NEXT:    s_waitcnt vmcnt(0)261; CHECK-NEXT:    s_setpc_b64 s[30:31]262   %call = call nofpclass(nan inf) { float, float } @aggregate_f32()263   %i = extractvalue { float, float } %call, 0264   %i1 = extractvalue { float, float } %call, 1265   %min0 = call float @llvm.minnum.f32(float %i, float %z)266   %min1 = call float @llvm.minnum.f32(float %i1, float %z)267   %insert.0 = insertvalue { float, float } poison, float %min0, 0268   %insert.1 = insertvalue { float, float } %insert.0, float %min1, 1269   ret { float, float } %insert.1270}271 272define internal <5 x double> @func_v5f64(ptr addrspace(1) %ptr) {273; CHECK-LABEL: func_v5f64:274; CHECK:       ; %bb.0:275; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)276; CHECK-NEXT:    v_mov_b32_e32 v11, v1277; CHECK-NEXT:    v_mov_b32_e32 v10, v0278; CHECK-NEXT:    global_load_dwordx4 v[0:3], v[10:11], off glc279; CHECK-NEXT:    s_waitcnt vmcnt(0)280; CHECK-NEXT:    global_load_dwordx4 v[4:7], v[10:11], off offset:16 glc281; CHECK-NEXT:    s_waitcnt vmcnt(0)282; CHECK-NEXT:    global_load_dwordx2 v[8:9], v[10:11], off offset:32 glc283; CHECK-NEXT:    s_waitcnt vmcnt(0)284; CHECK-NEXT:    s_setpc_b64 s[30:31]285  %ld = load volatile <5 x double>, ptr addrspace(1) %ptr286  ret <5 x double> %ld287}288 289define <5 x double> @call_nofpclass_funcs_v5f64_non_mvt_vector(ptr addrspace(1) %ptr) {290; CHECK-LABEL: call_nofpclass_funcs_v5f64_non_mvt_vector:291; CHECK:       ; %bb.0:292; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)293; CHECK-NEXT:    s_mov_b32 s18, s33294; CHECK-NEXT:    s_mov_b32 s33, s32295; CHECK-NEXT:    s_xor_saveexec_b64 s[16:17], -1296; CHECK-NEXT:    buffer_store_dword v24, off, s[0:3], s33 ; 4-byte Folded Spill297; CHECK-NEXT:    s_mov_b64 exec, s[16:17]298; CHECK-NEXT:    s_addk_i32 s32, 0x400299; CHECK-NEXT:    v_writelane_b32 v24, s30, 0300; CHECK-NEXT:    s_getpc_b64 s[16:17]301; CHECK-NEXT:    s_add_u32 s16, s16, func_v5f64@rel32@lo+4302; CHECK-NEXT:    s_addc_u32 s17, s17, func_v5f64@rel32@hi+12303; CHECK-NEXT:    v_writelane_b32 v24, s31, 1304; CHECK-NEXT:    v_mov_b32_e32 v22, v1305; CHECK-NEXT:    v_mov_b32_e32 v23, v0306; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]307; CHECK-NEXT:    v_mov_b32_e32 v12, v0308; CHECK-NEXT:    v_mov_b32_e32 v13, v1309; CHECK-NEXT:    v_mov_b32_e32 v0, v23310; CHECK-NEXT:    v_mov_b32_e32 v1, v22311; CHECK-NEXT:    v_mov_b32_e32 v14, v2312; CHECK-NEXT:    v_mov_b32_e32 v15, v3313; CHECK-NEXT:    v_mov_b32_e32 v16, v4314; CHECK-NEXT:    v_mov_b32_e32 v17, v5315; CHECK-NEXT:    v_mov_b32_e32 v18, v6316; CHECK-NEXT:    v_mov_b32_e32 v19, v7317; CHECK-NEXT:    v_mov_b32_e32 v20, v8318; CHECK-NEXT:    v_mov_b32_e32 v21, v9319; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]320; CHECK-NEXT:    v_min_f64 v[0:1], v[12:13], v[0:1]321; CHECK-NEXT:    v_min_f64 v[2:3], v[14:15], v[2:3]322; CHECK-NEXT:    v_min_f64 v[4:5], v[16:17], v[4:5]323; CHECK-NEXT:    v_min_f64 v[6:7], v[18:19], v[6:7]324; CHECK-NEXT:    v_min_f64 v[8:9], v[20:21], v[8:9]325; CHECK-NEXT:    v_readlane_b32 s31, v24, 1326; CHECK-NEXT:    v_readlane_b32 s30, v24, 0327; CHECK-NEXT:    s_mov_b32 s32, s33328; CHECK-NEXT:    s_xor_saveexec_b64 s[4:5], -1329; CHECK-NEXT:    buffer_load_dword v24, off, s[0:3], s33 ; 4-byte Folded Reload330; CHECK-NEXT:    s_mov_b64 exec, s[4:5]331; CHECK-NEXT:    s_mov_b32 s33, s18332; CHECK-NEXT:    s_waitcnt vmcnt(0)333; CHECK-NEXT:    s_setpc_b64 s[30:31]334  %call0 = call nofpclass(nan) <5 x double> @func_v5f64(ptr addrspace(1) %ptr)335  %call1 = call nofpclass(nan) <5 x double> @func_v5f64(ptr addrspace(1) %ptr)336  %min = call <5 x double> @llvm.minnum.v5f64(<5 x double> %call0, <5 x double> %call1)337  ret <5 x double> %min338}339