brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.7 KiB · 66011ad Raw
643 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; Unknown/default target3; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=instcombine < %s | FileCheck -check-prefixes=NO-FMED3F16,UNKNOWN %s4 5; Known target, no med3_f166; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -passes=instcombine < %s | FileCheck -check-prefixes=NO-FMED3F16,GFX8 %s7 8; Has med3_f169; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=instcombine < %s | FileCheck -check-prefixes=GFX9 %s10 11 12declare float @llvm.fabs.f32(float) #013declare half @llvm.fabs.f16(half) #014declare float @llvm.amdgcn.fmed3.f32(float, float, float) #015 16define float @fmed3_f32_fpext_f16(half %arg0, half %arg1, half %arg2) #1 {17; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f1618; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1:[0-9]+]] {19; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float20; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float21; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float22; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])23; NO-FMED3F16-NEXT:    ret float [[MED3]]24;25; GFX9-LABEL: define float @fmed3_f32_fpext_f1626; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1:[0-9]+]] {27; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[ARG0]], half [[ARG1]], half [[ARG2]])28; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float29; GFX9-NEXT:    ret float [[MED3]]30;31  %arg0.ext = fpext half %arg0 to float32  %arg1.ext = fpext half %arg1 to float33  %arg2.ext = fpext half %arg2 to float34  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)35  ret float %med336}37 38define float @fmed3_f32_fpext_f16_flags(half %arg0, half %arg1, half %arg2) #1 {39; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_flags40; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {41; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float42; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float43; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float44; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call nsz float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])45; NO-FMED3F16-NEXT:    ret float [[MED3]]46;47; GFX9-LABEL: define float @fmed3_f32_fpext_f16_flags48; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {49; GFX9-NEXT:    [[MED31:%.*]] = call nsz half @llvm.amdgcn.fmed3.f16(half [[ARG0]], half [[ARG1]], half [[ARG2]])50; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float51; GFX9-NEXT:    ret float [[MED3]]52;53  %arg0.ext = fpext half %arg0 to float54  %arg1.ext = fpext half %arg1 to float55  %arg2.ext = fpext half %arg2 to float56  %med3 = call nsz float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)57  ret float %med358}59 60define float @fmed3_f32_fpext_f16_k0(half %arg1, half %arg2) #1 {61; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_k062; NO-FMED3F16-SAME: (half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {63; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float64; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float65; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG1_EXT]], float [[ARG2_EXT]], float 2.000000e+00)66; NO-FMED3F16-NEXT:    ret float [[MED3]]67;68; GFX9-LABEL: define float @fmed3_f32_fpext_f16_k069; GFX9-SAME: (half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {70; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[ARG1]], half [[ARG2]], half 0xH4000)71; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float72; GFX9-NEXT:    ret float [[MED3]]73;74  %arg1.ext = fpext half %arg1 to float75  %arg2.ext = fpext half %arg2 to float76  %med3 = call float @llvm.amdgcn.fmed3.f32(float 2.0, float %arg1.ext, float %arg2.ext)77  ret float %med378}79 80define float @fmed3_f32_fpext_f16_k1(half %arg0, half %arg2) #1 {81; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_k182; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {83; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float84; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float85; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG2_EXT]], float 2.000000e+00)86; NO-FMED3F16-NEXT:    ret float [[MED3]]87;88; GFX9-LABEL: define float @fmed3_f32_fpext_f16_k189; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {90; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[ARG0]], half [[ARG2]], half 0xH4000)91; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float92; GFX9-NEXT:    ret float [[MED3]]93;94  %arg0.ext = fpext half %arg0 to float95  %arg2.ext = fpext half %arg2 to float96  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float 2.0, float %arg2.ext)97  ret float %med398}99 100define float @fmed3_f32_fpext_f16_k2(half %arg0, half %arg1) #1 {101; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_k2102; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]]) #[[ATTR1]] {103; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float104; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float105; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float 2.000000e+00)106; NO-FMED3F16-NEXT:    ret float [[MED3]]107;108; GFX9-LABEL: define float @fmed3_f32_fpext_f16_k2109; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]]) #[[ATTR1]] {110; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[ARG0]], half [[ARG1]], half 0xH4000)111; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float112; GFX9-NEXT:    ret float [[MED3]]113;114  %arg0.ext = fpext half %arg0 to float115  %arg1.ext = fpext half %arg1 to float116  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float 2.0)117  ret float %med3118}119 120define float @fmed3_f32_fpext_f16_k0_k1(half %arg2) #1 {121; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_k0_k1122; NO-FMED3F16-SAME: (half [[ARG2:%.*]]) #[[ATTR1]] {123; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float124; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG2_EXT]], float 0.000000e+00, float 1.600000e+01)125; NO-FMED3F16-NEXT:    ret float [[MED3]]126;127; GFX9-LABEL: define float @fmed3_f32_fpext_f16_k0_k1128; GFX9-SAME: (half [[ARG2:%.*]]) #[[ATTR1]] {129; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[ARG2]], half 0xH0000, half 0xH4C00)130; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float131; GFX9-NEXT:    ret float [[MED3]]132;133  %arg2.ext = fpext half %arg2 to float134  %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 16.0, float %arg2.ext)135  ret float %med3136}137 138define float @fmed3_f32_fpext_f16_k0_k2(half %arg1) #1 {139; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_k0_k2140; NO-FMED3F16-SAME: (half [[ARG1:%.*]]) #[[ATTR1]] {141; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float142; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG1_EXT]], float 0.000000e+00, float 2.000000e+00)143; NO-FMED3F16-NEXT:    ret float [[MED3]]144;145; GFX9-LABEL: define float @fmed3_f32_fpext_f16_k0_k2146; GFX9-SAME: (half [[ARG1:%.*]]) #[[ATTR1]] {147; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[ARG1]], half 0xH0000, half 0xH4000)148; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float149; GFX9-NEXT:    ret float [[MED3]]150;151  %arg1.ext = fpext half %arg1 to float152  %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %arg1.ext, float 2.0)153  ret float %med3154}155 156define float @fmed3_f32_fpext_f16_fabs(half %arg0, half %arg1, half %arg2) #1 {157; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_fabs158; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {159; NO-FMED3F16-NEXT:    [[FABS_ARG0:%.*]] = call half @llvm.fabs.f16(half [[ARG0]])160; NO-FMED3F16-NEXT:    [[FABS_ARG1:%.*]] = call half @llvm.fabs.f16(half [[ARG1]])161; NO-FMED3F16-NEXT:    [[FABS_ARG2:%.*]] = call half @llvm.fabs.f16(half [[ARG2]])162; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[FABS_ARG0]] to float163; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[FABS_ARG1]] to float164; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[FABS_ARG2]] to float165; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])166; NO-FMED3F16-NEXT:    ret float [[MED3]]167;168; GFX9-LABEL: define float @fmed3_f32_fpext_f16_fabs169; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {170; GFX9-NEXT:    [[FABS_ARG0:%.*]] = call half @llvm.fabs.f16(half [[ARG0]])171; GFX9-NEXT:    [[FABS_ARG1:%.*]] = call half @llvm.fabs.f16(half [[ARG1]])172; GFX9-NEXT:    [[FABS_ARG2:%.*]] = call half @llvm.fabs.f16(half [[ARG2]])173; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[FABS_ARG0]], half [[FABS_ARG1]], half [[FABS_ARG2]])174; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float175; GFX9-NEXT:    ret float [[MED3]]176;177  %fabs.arg0 = call half @llvm.fabs.f16(half %arg0)178  %fabs.arg1 = call half @llvm.fabs.f16(half %arg1)179  %fabs.arg2 = call half @llvm.fabs.f16(half %arg2)180  %arg0.ext = fpext half %fabs.arg0 to float181  %arg1.ext = fpext half %fabs.arg1 to float182  %arg2.ext = fpext half %fabs.arg2 to float183  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)184  ret float %med3185}186 187define float @fmed3_fabs_f32_fpext_f16(half %arg0, half %arg1, half %arg2) #1 {188; NO-FMED3F16-LABEL: define float @fmed3_fabs_f32_fpext_f16189; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {190; NO-FMED3F16-NEXT:    [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[ARG0]])191; NO-FMED3F16-NEXT:    [[FABS_EXT_ARG0:%.*]] = fpext half [[TMP1]] to float192; NO-FMED3F16-NEXT:    [[TMP2:%.*]] = call half @llvm.fabs.f16(half [[ARG1]])193; NO-FMED3F16-NEXT:    [[FABS_EXT_ARG1:%.*]] = fpext half [[TMP2]] to float194; NO-FMED3F16-NEXT:    [[TMP3:%.*]] = call half @llvm.fabs.f16(half [[ARG2]])195; NO-FMED3F16-NEXT:    [[FABS_EXT_ARG2:%.*]] = fpext half [[TMP3]] to float196; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[FABS_EXT_ARG0]], float [[FABS_EXT_ARG1]], float [[FABS_EXT_ARG2]])197; NO-FMED3F16-NEXT:    ret float [[MED3]]198;199; GFX9-LABEL: define float @fmed3_fabs_f32_fpext_f16200; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {201; GFX9-NEXT:    [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[ARG0]])202; GFX9-NEXT:    [[TMP2:%.*]] = call half @llvm.fabs.f16(half [[ARG1]])203; GFX9-NEXT:    [[TMP3:%.*]] = call half @llvm.fabs.f16(half [[ARG2]])204; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[TMP1]], half [[TMP2]], half [[TMP3]])205; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float206; GFX9-NEXT:    ret float [[MED3]]207;208  %arg0.ext = fpext half %arg0 to float209  %arg1.ext = fpext half %arg1 to float210  %arg2.ext = fpext half %arg2 to float211  %fabs.ext.arg0 = call float @llvm.fabs.f32(float %arg0.ext)212  %fabs.ext.arg1 = call float @llvm.fabs.f32(float %arg1.ext)213  %fabs.ext.arg2 = call float @llvm.fabs.f32(float %arg2.ext)214  %med3 = call float @llvm.amdgcn.fmed3.f32(float %fabs.ext.arg0, float %fabs.ext.arg1, float %fabs.ext.arg2)215  ret float %med3216}217 218define float @fmed3_f32_fpext_f16_fneg(half %arg0, half %arg1, half %arg2) #1 {219; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_fneg220; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {221; NO-FMED3F16-NEXT:    [[FNEG_ARG0:%.*]] = fneg half [[ARG0]]222; NO-FMED3F16-NEXT:    [[FNEG_ARG1:%.*]] = fneg half [[ARG1]]223; NO-FMED3F16-NEXT:    [[FNEG_ARG2:%.*]] = fneg half [[ARG2]]224; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[FNEG_ARG0]] to float225; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[FNEG_ARG1]] to float226; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[FNEG_ARG2]] to float227; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])228; NO-FMED3F16-NEXT:    ret float [[MED3]]229;230; GFX9-LABEL: define float @fmed3_f32_fpext_f16_fneg231; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {232; GFX9-NEXT:    [[FNEG_ARG0:%.*]] = fneg half [[ARG0]]233; GFX9-NEXT:    [[FNEG_ARG1:%.*]] = fneg half [[ARG1]]234; GFX9-NEXT:    [[FNEG_ARG2:%.*]] = fneg half [[ARG2]]235; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[FNEG_ARG0]], half [[FNEG_ARG1]], half [[FNEG_ARG2]])236; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float237; GFX9-NEXT:    ret float [[MED3]]238;239  %fneg.arg0 = fneg half %arg0240  %fneg.arg1 = fneg half %arg1241  %fneg.arg2 = fneg half %arg2242  %arg0.ext = fpext half %fneg.arg0 to float243  %arg1.ext = fpext half %fneg.arg1 to float244  %arg2.ext = fpext half %fneg.arg2 to float245  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)246  ret float %med3247}248 249define float @fmed3_fneg_f32_fpext_f16(half %arg0, half %arg1, half %arg2) #1 {250; NO-FMED3F16-LABEL: define float @fmed3_fneg_f32_fpext_f16251; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {252; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float253; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float254; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float255; NO-FMED3F16-NEXT:    [[FNEG_EXT_ARG0:%.*]] = fneg float [[ARG0_EXT]]256; NO-FMED3F16-NEXT:    [[FNEG_EXT_ARG1:%.*]] = fneg float [[ARG1_EXT]]257; NO-FMED3F16-NEXT:    [[FNEG_EXT_ARG2:%.*]] = fneg float [[ARG2_EXT]]258; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[FNEG_EXT_ARG0]], float [[FNEG_EXT_ARG1]], float [[FNEG_EXT_ARG2]])259; NO-FMED3F16-NEXT:    ret float [[MED3]]260;261; GFX9-LABEL: define float @fmed3_fneg_f32_fpext_f16262; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {263; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float264; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float265; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float266; GFX9-NEXT:    [[FNEG_EXT_ARG0:%.*]] = fneg float [[ARG0_EXT]]267; GFX9-NEXT:    [[FNEG_EXT_ARG1:%.*]] = fneg float [[ARG1_EXT]]268; GFX9-NEXT:    [[FNEG_EXT_ARG2:%.*]] = fneg float [[ARG2_EXT]]269; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[FNEG_EXT_ARG0]], float [[FNEG_EXT_ARG1]], float [[FNEG_EXT_ARG2]])270; GFX9-NEXT:    ret float [[MED3]]271;272  %arg0.ext = fpext half %arg0 to float273  %arg1.ext = fpext half %arg1 to float274  %arg2.ext = fpext half %arg2 to float275  %fneg.ext.arg0 = fneg float %arg0.ext276  %fneg.ext.arg1 = fneg float %arg1.ext277  %fneg.ext.arg2 = fneg float %arg2.ext278  %med3 = call float @llvm.amdgcn.fmed3.f32(float %fneg.ext.arg0, float %fneg.ext.arg1, float %fneg.ext.arg2)279  ret float %med3280}281 282define float @fmed3_f32_fpext_f16_fneg_fabs(half %arg0, half %arg1, half %arg2) #1 {283; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_fneg_fabs284; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {285; NO-FMED3F16-NEXT:    [[FABS_ARG0:%.*]] = call half @llvm.fabs.f16(half [[ARG0]])286; NO-FMED3F16-NEXT:    [[FABS_ARG1:%.*]] = call half @llvm.fabs.f16(half [[ARG1]])287; NO-FMED3F16-NEXT:    [[FABS_ARG2:%.*]] = call half @llvm.fabs.f16(half [[ARG2]])288; NO-FMED3F16-NEXT:    [[FNEG_FABS_ARG0:%.*]] = fneg half [[FABS_ARG0]]289; NO-FMED3F16-NEXT:    [[FNEG_FABS_ARG1:%.*]] = fneg half [[FABS_ARG1]]290; NO-FMED3F16-NEXT:    [[FNEG_FABS_ARG2:%.*]] = fneg half [[FABS_ARG2]]291; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[FNEG_FABS_ARG0]] to float292; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[FNEG_FABS_ARG1]] to float293; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[FNEG_FABS_ARG2]] to float294; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])295; NO-FMED3F16-NEXT:    ret float [[MED3]]296;297; GFX9-LABEL: define float @fmed3_f32_fpext_f16_fneg_fabs298; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {299; GFX9-NEXT:    [[FABS_ARG0:%.*]] = call half @llvm.fabs.f16(half [[ARG0]])300; GFX9-NEXT:    [[FABS_ARG1:%.*]] = call half @llvm.fabs.f16(half [[ARG1]])301; GFX9-NEXT:    [[FABS_ARG2:%.*]] = call half @llvm.fabs.f16(half [[ARG2]])302; GFX9-NEXT:    [[FNEG_FABS_ARG0:%.*]] = fneg half [[FABS_ARG0]]303; GFX9-NEXT:    [[FNEG_FABS_ARG1:%.*]] = fneg half [[FABS_ARG1]]304; GFX9-NEXT:    [[FNEG_FABS_ARG2:%.*]] = fneg half [[FABS_ARG2]]305; GFX9-NEXT:    [[MED31:%.*]] = call half @llvm.amdgcn.fmed3.f16(half [[FNEG_FABS_ARG0]], half [[FNEG_FABS_ARG1]], half [[FNEG_FABS_ARG2]])306; GFX9-NEXT:    [[MED3:%.*]] = fpext half [[MED31]] to float307; GFX9-NEXT:    ret float [[MED3]]308;309  %fabs.arg0 = call half @llvm.fabs.f16(half %arg0)310  %fabs.arg1 = call half @llvm.fabs.f16(half %arg1)311  %fabs.arg2 = call half @llvm.fabs.f16(half %arg2)312  %fneg.fabs.arg0 = fneg half %fabs.arg0313  %fneg.fabs.arg1 = fneg half %fabs.arg1314  %fneg.fabs.arg2 = fneg half %fabs.arg2315  %arg0.ext = fpext half %fneg.fabs.arg0 to float316  %arg1.ext = fpext half %fneg.fabs.arg1 to float317  %arg2.ext = fpext half %fneg.fabs.arg2 to float318  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)319  ret float %med3320}321 322define float @fmed3_fneg_fabs_f32_fpext_f16(half %arg0, half %arg1, half %arg2) #1 {323; NO-FMED3F16-LABEL: define float @fmed3_fneg_fabs_f32_fpext_f16324; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {325; NO-FMED3F16-NEXT:    [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[ARG0]])326; NO-FMED3F16-NEXT:    [[FABS_EXT_ARG0:%.*]] = fpext half [[TMP1]] to float327; NO-FMED3F16-NEXT:    [[TMP2:%.*]] = call half @llvm.fabs.f16(half [[ARG1]])328; NO-FMED3F16-NEXT:    [[FABS_EXT_ARG1:%.*]] = fpext half [[TMP2]] to float329; NO-FMED3F16-NEXT:    [[TMP3:%.*]] = call half @llvm.fabs.f16(half [[ARG2]])330; NO-FMED3F16-NEXT:    [[FABS_EXT_ARG2:%.*]] = fpext half [[TMP3]] to float331; NO-FMED3F16-NEXT:    [[FNEG_FABS_EXT_ARG0:%.*]] = fneg float [[FABS_EXT_ARG0]]332; NO-FMED3F16-NEXT:    [[FNEG_FABS_EXT_ARG1:%.*]] = fneg float [[FABS_EXT_ARG1]]333; NO-FMED3F16-NEXT:    [[FNEG_FABS_EXT_ARG2:%.*]] = fneg float [[FABS_EXT_ARG2]]334; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[FNEG_FABS_EXT_ARG0]], float [[FNEG_FABS_EXT_ARG1]], float [[FNEG_FABS_EXT_ARG2]])335; NO-FMED3F16-NEXT:    ret float [[MED3]]336;337; GFX9-LABEL: define float @fmed3_fneg_fabs_f32_fpext_f16338; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {339; GFX9-NEXT:    [[TMP1:%.*]] = call half @llvm.fabs.f16(half [[ARG0]])340; GFX9-NEXT:    [[FABS_EXT_ARG0:%.*]] = fpext half [[TMP1]] to float341; GFX9-NEXT:    [[TMP2:%.*]] = call half @llvm.fabs.f16(half [[ARG1]])342; GFX9-NEXT:    [[FABS_EXT_ARG1:%.*]] = fpext half [[TMP2]] to float343; GFX9-NEXT:    [[TMP3:%.*]] = call half @llvm.fabs.f16(half [[ARG2]])344; GFX9-NEXT:    [[FABS_EXT_ARG2:%.*]] = fpext half [[TMP3]] to float345; GFX9-NEXT:    [[FNEG_FABS_EXT_ARG0:%.*]] = fneg float [[FABS_EXT_ARG0]]346; GFX9-NEXT:    [[FNEG_FABS_EXT_ARG1:%.*]] = fneg float [[FABS_EXT_ARG1]]347; GFX9-NEXT:    [[FNEG_FABS_EXT_ARG2:%.*]] = fneg float [[FABS_EXT_ARG2]]348; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[FNEG_FABS_EXT_ARG0]], float [[FNEG_FABS_EXT_ARG1]], float [[FNEG_FABS_EXT_ARG2]])349; GFX9-NEXT:    ret float [[MED3]]350;351  %arg0.ext = fpext half %arg0 to float352  %arg1.ext = fpext half %arg1 to float353  %arg2.ext = fpext half %arg2 to float354  %fabs.ext.arg0 = call float @llvm.fabs.f32(float %arg0.ext)355  %fabs.ext.arg1 = call float @llvm.fabs.f32(float %arg1.ext)356  %fabs.ext.arg2 = call float @llvm.fabs.f32(float %arg2.ext)357  %fneg.fabs.ext.arg0 = fneg float %fabs.ext.arg0358  %fneg.fabs.ext.arg1 = fneg float %fabs.ext.arg1359  %fneg.fabs.ext.arg2 = fneg float %fabs.ext.arg2360  %med3 = call float @llvm.amdgcn.fmed3.f32(float %fneg.fabs.ext.arg0, float %fneg.fabs.ext.arg1, float %fneg.fabs.ext.arg2)361  ret float %med3362}363 364; --------------------------------------------------------------------------------365; Negative tests366; --------------------------------------------------------------------------------367 368define float @fmed3_f32_fpext_f16_multi_use_0(half %arg0, half %arg1, half %arg2, ptr addrspace(1) %ptr) #1 {369; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_multi_use_0370; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]], ptr addrspace(1) [[PTR:%.*]]) #[[ATTR1]] {371; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float372; NO-FMED3F16-NEXT:    store float [[ARG0_EXT]], ptr addrspace(1) [[PTR]], align 4373; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float374; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float375; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])376; NO-FMED3F16-NEXT:    ret float [[MED3]]377;378; GFX9-LABEL: define float @fmed3_f32_fpext_f16_multi_use_0379; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]], ptr addrspace(1) [[PTR:%.*]]) #[[ATTR1]] {380; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float381; GFX9-NEXT:    store float [[ARG0_EXT]], ptr addrspace(1) [[PTR]], align 4382; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float383; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float384; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])385; GFX9-NEXT:    ret float [[MED3]]386;387  %arg0.ext = fpext half %arg0 to float388  store float %arg0.ext, ptr addrspace(1) %ptr389  %arg1.ext = fpext half %arg1 to float390  %arg2.ext = fpext half %arg2 to float391  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)392  ret float %med3393}394 395define float @fmed3_f32_fpext_f16_multi_use_1(half %arg0, half %arg1, half %arg2, ptr addrspace(1) %ptr) #1 {396; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_multi_use_1397; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]], ptr addrspace(1) [[PTR:%.*]]) #[[ATTR1]] {398; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float399; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float400; NO-FMED3F16-NEXT:    store float [[ARG1_EXT]], ptr addrspace(1) [[PTR]], align 4401; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float402; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])403; NO-FMED3F16-NEXT:    ret float [[MED3]]404;405; GFX9-LABEL: define float @fmed3_f32_fpext_f16_multi_use_1406; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]], ptr addrspace(1) [[PTR:%.*]]) #[[ATTR1]] {407; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float408; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float409; GFX9-NEXT:    store float [[ARG1_EXT]], ptr addrspace(1) [[PTR]], align 4410; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float411; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])412; GFX9-NEXT:    ret float [[MED3]]413;414  %arg0.ext = fpext half %arg0 to float415  %arg1.ext = fpext half %arg1 to float416  store float %arg1.ext, ptr addrspace(1) %ptr417  %arg2.ext = fpext half %arg2 to float418  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)419  ret float %med3420}421 422define float @fmed3_f32_fpext_f16_multi_use_2(half %arg0, half %arg1, half %arg2, ptr addrspace(1) %ptr) #1 {423; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_multi_use_2424; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]], ptr addrspace(1) [[PTR:%.*]]) #[[ATTR1]] {425; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float426; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float427; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float428; NO-FMED3F16-NEXT:    store float [[ARG2_EXT]], ptr addrspace(1) [[PTR]], align 4429; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])430; NO-FMED3F16-NEXT:    ret float [[MED3]]431;432; GFX9-LABEL: define float @fmed3_f32_fpext_f16_multi_use_2433; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]], ptr addrspace(1) [[PTR:%.*]]) #[[ATTR1]] {434; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float435; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float436; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float437; GFX9-NEXT:    store float [[ARG2_EXT]], ptr addrspace(1) [[PTR]], align 4438; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])439; GFX9-NEXT:    ret float [[MED3]]440;441  %arg0.ext = fpext half %arg0 to float442  %arg1.ext = fpext half %arg1 to float443  %arg2.ext = fpext half %arg2 to float444  store float %arg2.ext, ptr addrspace(1) %ptr445  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)446  ret float %med3447}448 449define float @fmed3_f32_fpext_bf16(bfloat %arg0, bfloat %arg1, bfloat %arg2) #1 {450; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_bf16451; NO-FMED3F16-SAME: (bfloat [[ARG0:%.*]], bfloat [[ARG1:%.*]], bfloat [[ARG2:%.*]]) #[[ATTR1]] {452; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext bfloat [[ARG0]] to float453; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext bfloat [[ARG1]] to float454; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext bfloat [[ARG2]] to float455; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])456; NO-FMED3F16-NEXT:    ret float [[MED3]]457;458; GFX9-LABEL: define float @fmed3_f32_fpext_bf16459; GFX9-SAME: (bfloat [[ARG0:%.*]], bfloat [[ARG1:%.*]], bfloat [[ARG2:%.*]]) #[[ATTR1]] {460; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext bfloat [[ARG0]] to float461; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext bfloat [[ARG1]] to float462; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext bfloat [[ARG2]] to float463; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])464; GFX9-NEXT:    ret float [[MED3]]465;466  %arg0.ext = fpext bfloat %arg0 to float467  %arg1.ext = fpext bfloat %arg1 to float468  %arg2.ext = fpext bfloat %arg2 to float469  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)470  ret float %med3471}472 473define float @fmed3_f32_fpext_f16_bf16_0(bfloat %arg0, half %arg1, half %arg2) #1 {474; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_bf16_0475; NO-FMED3F16-SAME: (bfloat [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {476; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext bfloat [[ARG0]] to float477; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float478; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float479; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])480; NO-FMED3F16-NEXT:    ret float [[MED3]]481;482; GFX9-LABEL: define float @fmed3_f32_fpext_f16_bf16_0483; GFX9-SAME: (bfloat [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {484; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext bfloat [[ARG0]] to float485; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float486; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float487; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])488; GFX9-NEXT:    ret float [[MED3]]489;490  %arg0.ext = fpext bfloat %arg0 to float491  %arg1.ext = fpext half %arg1 to float492  %arg2.ext = fpext half %arg2 to float493  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)494  ret float %med3495}496 497define float @fmed3_f32_fpext_f16_bf16_1(half %arg0, bfloat %arg1, half %arg2) #1 {498; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_bf16_1499; NO-FMED3F16-SAME: (half [[ARG0:%.*]], bfloat [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {500; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float501; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext bfloat [[ARG1]] to float502; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float503; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])504; NO-FMED3F16-NEXT:    ret float [[MED3]]505;506; GFX9-LABEL: define float @fmed3_f32_fpext_f16_bf16_1507; GFX9-SAME: (half [[ARG0:%.*]], bfloat [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {508; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float509; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext bfloat [[ARG1]] to float510; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float511; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])512; GFX9-NEXT:    ret float [[MED3]]513;514  %arg0.ext = fpext half %arg0 to float515  %arg1.ext = fpext bfloat %arg1 to float516  %arg2.ext = fpext half %arg2 to float517  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)518  ret float %med3519}520 521define float @fmed3_f32_fpext_f16_bf16_2(half %arg0, half %arg1, bfloat %arg2) #1 {522; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_bf16_2523; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], bfloat [[ARG2:%.*]]) #[[ATTR1]] {524; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float525; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float526; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext bfloat [[ARG2]] to float527; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])528; NO-FMED3F16-NEXT:    ret float [[MED3]]529;530; GFX9-LABEL: define float @fmed3_f32_fpext_f16_bf16_2531; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], bfloat [[ARG2:%.*]]) #[[ATTR1]] {532; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float533; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float534; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext bfloat [[ARG2]] to float535; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]])536; GFX9-NEXT:    ret float [[MED3]]537;538  %arg0.ext = fpext half %arg0 to float539  %arg1.ext = fpext half %arg1 to float540  %arg2.ext = fpext bfloat %arg2 to float541  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext)542  ret float %med3543}544 545define float @fmed3_f32_fpext_f16_unrepresentable_k0(half %arg1, half %arg2) #1 {546; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_unrepresentable_k0547; NO-FMED3F16-SAME: (half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {548; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float549; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float550; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG1_EXT]], float [[ARG2_EXT]], float 0x41F0000000000000)551; NO-FMED3F16-NEXT:    ret float [[MED3]]552;553; GFX9-LABEL: define float @fmed3_f32_fpext_f16_unrepresentable_k0554; GFX9-SAME: (half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {555; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float556; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float557; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG1_EXT]], float [[ARG2_EXT]], float 0x41F0000000000000)558; GFX9-NEXT:    ret float [[MED3]]559;560  %arg1.ext = fpext half %arg1 to float561  %arg2.ext = fpext half %arg2 to float562  %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x41f0000000000000, float %arg1.ext, float %arg2.ext)563  ret float %med3564}565 566define float @fmed3_f32_fpext_f16_unrepresentable_k1(half %arg0, half %arg2) #1 {567; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_unrepresentable_k1568; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {569; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float570; NO-FMED3F16-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float571; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG2_EXT]], float 0x41F0000000000000)572; NO-FMED3F16-NEXT:    ret float [[MED3]]573;574; GFX9-LABEL: define float @fmed3_f32_fpext_f16_unrepresentable_k1575; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG2:%.*]]) #[[ATTR1]] {576; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float577; GFX9-NEXT:    [[ARG2_EXT:%.*]] = fpext half [[ARG2]] to float578; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG2_EXT]], float 0x41F0000000000000)579; GFX9-NEXT:    ret float [[MED3]]580;581  %arg0.ext = fpext half %arg0 to float582  %arg2.ext = fpext half %arg2 to float583  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float 0x41f0000000000000, float %arg2.ext)584  ret float %med3585}586 587define float @fmed3_f32_fpext_f16_unrepresentable_k2(half %arg0, half %arg1) #1 {588; NO-FMED3F16-LABEL: define float @fmed3_f32_fpext_f16_unrepresentable_k2589; NO-FMED3F16-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]]) #[[ATTR1]] {590; NO-FMED3F16-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float591; NO-FMED3F16-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float592; NO-FMED3F16-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float 0x41F0000000000000)593; NO-FMED3F16-NEXT:    ret float [[MED3]]594;595; GFX9-LABEL: define float @fmed3_f32_fpext_f16_unrepresentable_k2596; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]]) #[[ATTR1]] {597; GFX9-NEXT:    [[ARG0_EXT:%.*]] = fpext half [[ARG0]] to float598; GFX9-NEXT:    [[ARG1_EXT:%.*]] = fpext half [[ARG1]] to float599; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float 0x41F0000000000000)600; GFX9-NEXT:    ret float [[MED3]]601;602  %arg0.ext = fpext half %arg0 to float603  %arg1.ext = fpext half %arg1 to float604  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float 0x41f0000000000000)605  ret float %med3606}607 608define float @fmed3_f32_fpext_f16_strictfp(half %arg0, half %arg1, half %arg2) #2 {609; UNKNOWN-LABEL: define float @fmed3_f32_fpext_f16_strictfp610; UNKNOWN-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR2:[0-9]+]] {611; UNKNOWN-NEXT:    [[ARG0_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG0]], metadata !"fpexcept.strict")612; UNKNOWN-NEXT:    [[ARG1_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG1]], metadata !"fpexcept.strict")613; UNKNOWN-NEXT:    [[ARG2_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG2]], metadata !"fpexcept.strict")614; UNKNOWN-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]]) #[[ATTR2]]615; UNKNOWN-NEXT:    ret float [[MED3]]616;617; GFX8-LABEL: define float @fmed3_f32_fpext_f16_strictfp618; GFX8-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR2:[0-9]+]] {619; GFX8-NEXT:    [[ARG0_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG0]], metadata !"fpexcept.strict")620; GFX8-NEXT:    [[ARG1_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG1]], metadata !"fpexcept.strict")621; GFX8-NEXT:    [[ARG2_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG2]], metadata !"fpexcept.strict")622; GFX8-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]]) #[[ATTR4:[0-9]+]]623; GFX8-NEXT:    ret float [[MED3]]624;625; GFX9-LABEL: define float @fmed3_f32_fpext_f16_strictfp626; GFX9-SAME: (half [[ARG0:%.*]], half [[ARG1:%.*]], half [[ARG2:%.*]]) #[[ATTR2:[0-9]+]] {627; GFX9-NEXT:    [[ARG0_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG0]], metadata !"fpexcept.strict")628; GFX9-NEXT:    [[ARG1_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG1]], metadata !"fpexcept.strict")629; GFX9-NEXT:    [[ARG2_EXT:%.*]] = call float @llvm.experimental.constrained.fpext.f32.f16(half [[ARG2]], metadata !"fpexcept.strict")630; GFX9-NEXT:    [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[ARG0_EXT]], float [[ARG1_EXT]], float [[ARG2_EXT]]) #[[ATTR5:[0-9]+]]631; GFX9-NEXT:    ret float [[MED3]]632;633  %arg0.ext = call float @llvm.experimental.constrained.fpext.f32.f16(half %arg0, metadata !"fpexcept.strict")634  %arg1.ext = call float @llvm.experimental.constrained.fpext.f32.f16(half %arg1, metadata !"fpexcept.strict")635  %arg2.ext = call float @llvm.experimental.constrained.fpext.f32.f16(half %arg2, metadata !"fpexcept.strict")636  %med3 = call float @llvm.amdgcn.fmed3.f32(float %arg0.ext, float %arg1.ext, float %arg2.ext) #2637  ret float %med3638}639 640attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }641attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn }642attributes #2 = { strictfp }643