846 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52 3; Test with "amdgpu-ieee" set to true and false4; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=instcombine -mcpu=gfx600 < %s | FileCheck -check-prefixes=CHECK,IEEE1,HAS-IEEE-BIT1 %s5; RUN: sed 's/\"true\"/\"false\"/g' %s | opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx600 -passes=instcombine | FileCheck -check-prefixes=CHECK,IEEE0 %s6 7; Test with gfx12 since there is no ieee bit anymore and the attribute is ignored.8; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -passes=instcombine < %s | FileCheck -check-prefixes=CHECK,IEEE1,NO-IEEE-BIT %s9; RUN: sed 's/\"true\"/\"false\"/g' %s | opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -passes=instcombine | FileCheck -check-prefixes=CHECK,IEEE1,NO-IEEE-BIT %s10 11; --------------------------------------------------------------------12; llvm.amdgcn.fmed313; --------------------------------------------------------------------14 15declare float @llvm.amdgcn.fmed3.f32(float, float, float) #016 17define float @fmed3_f32(float %x, float %y, float %z) #1 {18; CHECK-LABEL: define float @fmed3_f32(19; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]], float [[Z:%.*]]) #[[ATTR1:[0-9]+]] {20; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float [[Z]])21; CHECK-NEXT: ret float [[MED3]]22;23 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float %z)24 ret float %med325}26 27define float @fmed3_canonicalize_x_c0_c1_f32(float %x) #1 {28; CHECK-LABEL: define float @fmed3_canonicalize_x_c0_c1_f32(29; CHECK-SAME: float [[X:%.*]]) #[[ATTR1]] {30; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0.000000e+00, float 1.000000e+00)31; CHECK-NEXT: ret float [[MED3]]32;33 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0.0, float 1.0)34 ret float %med335}36 37define float @fmed3_canonicalize_c0_x_c1_f32(float %x) #1 {38; CHECK-LABEL: define float @fmed3_canonicalize_c0_x_c1_f32(39; CHECK-SAME: float [[X:%.*]]) #[[ATTR1]] {40; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0.000000e+00, float 1.000000e+00)41; CHECK-NEXT: ret float [[MED3]]42;43 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %x, float 1.0)44 ret float %med345}46 47define float @fmed3_canonicalize_c0_c1_x_f32(float %x) #1 {48; CHECK-LABEL: define float @fmed3_canonicalize_c0_c1_x_f32(49; CHECK-SAME: float [[X:%.*]]) #[[ATTR1]] {50; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0.000000e+00, float 1.000000e+00)51; CHECK-NEXT: ret float [[MED3]]52;53 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %x)54 ret float %med355}56 57define float @fmed3_canonicalize_x_y_c_f32(float %x, float %y) #1 {58; CHECK-LABEL: define float @fmed3_canonicalize_x_y_c_f32(59; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {60; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 1.000000e+00)61; CHECK-NEXT: ret float [[MED3]]62;63 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 1.0)64 ret float %med365}66 67define float @fmed3_canonicalize_x_c_y_f32(float %x, float %y) #1 {68; CHECK-LABEL: define float @fmed3_canonicalize_x_c_y_f32(69; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {70; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 1.000000e+00)71; CHECK-NEXT: ret float [[MED3]]72;73 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 1.0, float %y)74 ret float %med375}76 77define float @fmed3_canonicalize_c_x_y_f32(float %x, float %y) #1 {78; CHECK-LABEL: define float @fmed3_canonicalize_c_x_y_f32(79; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {80; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 1.000000e+00)81; CHECK-NEXT: ret float [[MED3]]82;83 %med3 = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %x, float %y)84 ret float %med385}86 87define float @fmed3_undef_x_y_f32(float %x, float %y) #1 {88; IEEE1-LABEL: define float @fmed3_undef_x_y_f32(89; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {90; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])91; IEEE1-NEXT: ret float [[MED3]]92;93; IEEE0-LABEL: define float @fmed3_undef_x_y_f32(94; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {95; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])96; IEEE0-NEXT: ret float [[MED3]]97;98 %med3 = call float @llvm.amdgcn.fmed3.f32(float undef, float %x, float %y)99 ret float %med3100}101 102define float @fmed3_fmf_undef_x_y_f32(float %x, float %y) #1 {103; IEEE1-LABEL: define float @fmed3_fmf_undef_x_y_f32(104; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {105; IEEE1-NEXT: [[MED3:%.*]] = call nnan float @llvm.minnum.f32(float [[X]], float [[Y]])106; IEEE1-NEXT: ret float [[MED3]]107;108; IEEE0-LABEL: define float @fmed3_fmf_undef_x_y_f32(109; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {110; IEEE0-NEXT: [[MED3:%.*]] = call nnan float @llvm.minimumnum.f32(float [[X]], float [[Y]])111; IEEE0-NEXT: ret float [[MED3]]112;113 %med3 = call nnan float @llvm.amdgcn.fmed3.f32(float undef, float %x, float %y)114 ret float %med3115}116 117define float @fmed3_x_undef_y_f32(float %x, float %y) #1 {118; IEEE1-LABEL: define float @fmed3_x_undef_y_f32(119; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {120; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])121; IEEE1-NEXT: ret float [[MED3]]122;123; IEEE0-LABEL: define float @fmed3_x_undef_y_f32(124; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {125; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])126; IEEE0-NEXT: ret float [[MED3]]127;128 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float undef, float %y)129 ret float %med3130}131 132define float @fmed3_x_y_undef_f32(float %x, float %y) #1 {133; IEEE1-LABEL: define float @fmed3_x_y_undef_f32(134; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {135; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])136; IEEE1-NEXT: ret float [[MED3]]137;138; IEEE0-LABEL: define float @fmed3_x_y_undef_f32(139; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {140; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])141; IEEE0-NEXT: ret float [[MED3]]142;143 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float undef)144 ret float %med3145}146 147define float @fmed3_qnan0_x_y_f32(float %x, float %y) #1 {148; IEEE1-LABEL: define float @fmed3_qnan0_x_y_f32(149; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {150; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])151; IEEE1-NEXT: ret float [[MED3]]152;153; IEEE0-LABEL: define float @fmed3_qnan0_x_y_f32(154; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {155; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])156; IEEE0-NEXT: ret float [[MED3]]157;158 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000000000000, float %x, float %y)159 ret float %med3160}161 162define float @fmed3_x_qnan0_y_f32(float %x, float %y) #1 {163; IEEE1-LABEL: define float @fmed3_x_qnan0_y_f32(164; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {165; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])166; IEEE1-NEXT: ret float [[MED3]]167;168; IEEE0-LABEL: define float @fmed3_x_qnan0_y_f32(169; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {170; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])171; IEEE0-NEXT: ret float [[MED3]]172;173 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF8000000000000, float %y)174 ret float %med3175}176 177define float @fmed3_x_y_qnan0_f32(float %x, float %y) #1 {178; IEEE1-LABEL: define float @fmed3_x_y_qnan0_f32(179; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {180; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])181; IEEE1-NEXT: ret float [[MED3]]182;183; IEEE0-LABEL: define float @fmed3_x_y_qnan0_f32(184; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {185; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])186; IEEE0-NEXT: ret float [[MED3]]187;188 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF8000000000000)189 ret float %med3190}191 192define float @fmed3_qnan1_x_y_f32(float %x, float %y) #1 {193; IEEE1-LABEL: define float @fmed3_qnan1_x_y_f32(194; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {195; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])196; IEEE1-NEXT: ret float [[MED3]]197;198; IEEE0-LABEL: define float @fmed3_qnan1_x_y_f32(199; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {200; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])201; IEEE0-NEXT: ret float [[MED3]]202;203 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000100000000, float %x, float %y)204 ret float %med3205}206 207; This can return any of the qnans.208define float @fmed3_qnan0_qnan1_qnan2_f32(float %x, float %y) #1 {209; CHECK-LABEL: define float @fmed3_qnan0_qnan1_qnan2_f32(210; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {211; CHECK-NEXT: ret float 0x7FF8030000000000212;213 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000100000000, float 0x7FF8002000000000, float 0x7FF8030000000000)214 ret float %med3215}216 217define float @fmed3_constant_src0_0_f32(float %x, float %y) #1 {218; CHECK-LABEL: define float @fmed3_constant_src0_0_f32(219; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {220; CHECK-NEXT: ret float 5.000000e-01221;222 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.5, float -1.0, float 4.0)223 ret float %med3224}225 226define float @fmed3_constant_src0_1_f32(float %x, float %y) #1 {227; CHECK-LABEL: define float @fmed3_constant_src0_1_f32(228; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {229; CHECK-NEXT: ret float 5.000000e-01230;231 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0.5, float 4.0, float -1.0)232 ret float %med3233}234 235define float @fmed3_constant_src1_0_f32(float %x, float %y) #1 {236; CHECK-LABEL: define float @fmed3_constant_src1_0_f32(237; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {238; CHECK-NEXT: ret float 5.000000e-01239;240 %med3 = call float @llvm.amdgcn.fmed3.f32(float -1.0, float 0.5, float 4.0)241 ret float %med3242}243 244define float @fmed3_constant_src1_1_f32(float %x, float %y) #1 {245; CHECK-LABEL: define float @fmed3_constant_src1_1_f32(246; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {247; CHECK-NEXT: ret float 5.000000e-01248;249 %med3 = call float @llvm.amdgcn.fmed3.f32(float 4.0, float 0.5, float -1.0)250 ret float %med3251}252 253define float @fmed3_constant_src2_0_f32(float %x, float %y) #1 {254; CHECK-LABEL: define float @fmed3_constant_src2_0_f32(255; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {256; CHECK-NEXT: ret float 5.000000e-01257;258 %med3 = call float @llvm.amdgcn.fmed3.f32(float -1.0, float 4.0, float 0.5)259 ret float %med3260}261 262define float @fmed3_constant_src2_1_f32(float %x, float %y) #1 {263; CHECK-LABEL: define float @fmed3_constant_src2_1_f32(264; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {265; CHECK-NEXT: ret float 5.000000e-01266;267 %med3 = call float @llvm.amdgcn.fmed3.f32(float 4.0, float -1.0, float 0.5)268 ret float %med3269}270 271define float @fmed3_x_qnan0_qnan1_f32(float %x) #1 {272; CHECK-LABEL: define float @fmed3_x_qnan0_qnan1_f32(273; CHECK-SAME: float [[X:%.*]]) #[[ATTR1]] {274; CHECK-NEXT: ret float [[X]]275;276 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF8001000000000, float 0x7FF8002000000000)277 ret float %med3278}279 280define float @fmed3_qnan0_x_qnan1_f32(float %x) #1 {281; CHECK-LABEL: define float @fmed3_qnan0_x_qnan1_f32(282; CHECK-SAME: float [[X:%.*]]) #[[ATTR1]] {283; CHECK-NEXT: ret float [[X]]284;285 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8001000000000, float %x, float 0x7FF8002000000000)286 ret float %med3287}288 289define float @fmed3_qnan0_qnan1_x_f32(float %x) #1 {290; CHECK-LABEL: define float @fmed3_qnan0_qnan1_x_f32(291; CHECK-SAME: float [[X:%.*]]) #[[ATTR1]] {292; CHECK-NEXT: ret float [[X]]293;294 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8001000000000, float 0x7FF8002000000000, float %x)295 ret float %med3296}297 298define float @fmed3_nan_0_1_f32() #1 {299; CHECK-LABEL: define float @fmed3_nan_0_1_f32(300; CHECK-SAME: ) #[[ATTR1]] {301; CHECK-NEXT: ret float 0.000000e+00302;303 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8001000000000, float 0.0, float 1.0)304 ret float %med3305}306 307define float @fmed3_0_nan_1_f32() #1 {308; CHECK-LABEL: define float @fmed3_0_nan_1_f32(309; CHECK-SAME: ) #[[ATTR1]] {310; CHECK-NEXT: ret float 0.000000e+00311;312 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 0x7FF8001000000000, float 1.0)313 ret float %med314}315 316define float @fmed3_0_1_nan_f32() #1 {317; IEEE1-LABEL: define float @fmed3_0_1_nan_f32(318; IEEE1-SAME: ) #[[ATTR1]] {319; IEEE1-NEXT: ret float 0.000000e+00320;321; IEEE0-LABEL: define float @fmed3_0_1_nan_f32(322; IEEE0-SAME: ) #[[ATTR1]] {323; IEEE0-NEXT: ret float 1.000000e+00324;325 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8001000000000)326 ret float %med327}328 329define float @fmed3_undef_0_1_f32() #1 {330; CHECK-LABEL: define float @fmed3_undef_0_1_f32(331; CHECK-SAME: ) #[[ATTR1]] {332; CHECK-NEXT: ret float 0.000000e+00333;334 %med3 = call float @llvm.amdgcn.fmed3.f32(float undef, float 0.0, float 1.0)335 ret float %med3336}337 338define float @fmed3_0_undef_1_f32() #1 {339; CHECK-LABEL: define float @fmed3_0_undef_1_f32(340; CHECK-SAME: ) #[[ATTR1]] {341; CHECK-NEXT: ret float 0.000000e+00342;343 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float undef, float 1.0)344 ret float %med345}346 347define float @fmed3_0_1_undef_f32() #1 {348; IEEE1-LABEL: define float @fmed3_0_1_undef_f32(349; IEEE1-SAME: ) #[[ATTR1]] {350; IEEE1-NEXT: ret float 0.000000e+00351;352; IEEE0-LABEL: define float @fmed3_0_1_undef_f32(353; IEEE0-SAME: ) #[[ATTR1]] {354; IEEE0-NEXT: ret float 1.000000e+00355;356 %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float undef)357 ret float %med358}359 360define float @fmed3_poison_x_y_f32(float %x, float %y) #1 {361; CHECK-LABEL: define float @fmed3_poison_x_y_f32(362; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {363; CHECK-NEXT: ret float poison364;365 %med3 = call float @llvm.amdgcn.fmed3.f32(float poison, float %x, float %y)366 ret float %med3367}368 369define float @fmed3_x_poison_y_f32(float %x, float %y) #1 {370; CHECK-LABEL: define float @fmed3_x_poison_y_f32(371; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {372; CHECK-NEXT: ret float poison373;374 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float poison, float %y)375 ret float %med3376}377 378define float @fmed3_x_y_poison_f32(float %x, float %y) #1 {379; CHECK-LABEL: define float @fmed3_x_y_poison_f32(380; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {381; CHECK-NEXT: ret float poison382;383 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float poison)384 ret float %med3385}386 387define float @fmed3_snan1_x_y_f32(float %x, float %y) #1 {388; IEEE1-LABEL: define float @fmed3_snan1_x_y_f32(389; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {390; IEEE1-NEXT: ret float [[Y]]391;392; IEEE0-LABEL: define float @fmed3_snan1_x_y_f32(393; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {394; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])395; IEEE0-NEXT: ret float [[MED3]]396;397 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float %x, float %y)398 ret float %med3399}400 401define float @fmed3_x_snan1_y_f32(float %x, float %y) #1 {402; IEEE1-LABEL: define float @fmed3_x_snan1_y_f32(403; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {404; IEEE1-NEXT: ret float [[Y]]405;406; IEEE0-LABEL: define float @fmed3_x_snan1_y_f32(407; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {408; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])409; IEEE0-NEXT: ret float [[MED3]]410;411 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF4000000000000, float %y)412 ret float %med3413}414 415define float @fmed3_x_y_snan1_f32(float %x, float %y) #1 {416; IEEE1-LABEL: define float @fmed3_x_y_snan1_f32(417; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {418; IEEE1-NEXT: ret float 0x7FFC000000000000419;420; IEEE0-LABEL: define float @fmed3_x_y_snan1_f32(421; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {422; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])423; IEEE0-NEXT: ret float [[MED3]]424;425 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF4000000000000)426 ret float %med3427}428 429define float @fmed3_snan1_x_snan2_f32(float %x) #1 {430; IEEE1-LABEL: define float @fmed3_snan1_x_snan2_f32(431; IEEE1-SAME: float [[X:%.*]]) #[[ATTR1]] {432; IEEE1-NEXT: ret float 0x7FF0000040000000433;434; IEEE0-LABEL: define float @fmed3_snan1_x_snan2_f32(435; IEEE0-SAME: float [[X:%.*]]) #[[ATTR1]] {436; IEEE0-NEXT: ret float [[X]]437;438 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF0000020000000, float %x, float 0x7FF0000040000000)439 ret float %med3440}441 442define float @fmed3_x_snan1_snan2_f32(float %x) #1 {443; IEEE1-LABEL: define float @fmed3_x_snan1_snan2_f32(444; IEEE1-SAME: float [[X:%.*]]) #[[ATTR1]] {445; IEEE1-NEXT: ret float 0x7FF0000040000000446;447; IEEE0-LABEL: define float @fmed3_x_snan1_snan2_f32(448; IEEE0-SAME: float [[X:%.*]]) #[[ATTR1]] {449; IEEE0-NEXT: ret float [[X]]450;451 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF0000020000000, float 0x7FF0000040000000)452 ret float %med3453}454 455define float @fmed3_snan1_snan2_snan3_f32(float %x) #1 {456; IEEE1-LABEL: define float @fmed3_snan1_snan2_snan3_f32(457; IEEE1-SAME: float [[X:%.*]]) #[[ATTR1]] {458; IEEE1-NEXT: ret float 0x7FF0000040000000459;460; IEEE0-LABEL: define float @fmed3_snan1_snan2_snan3_f32(461; IEEE0-SAME: float [[X:%.*]]) #[[ATTR1]] {462; IEEE0-NEXT: ret float 0x7FF8000040000000463;464 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float 0x7FF0000020000000, float 0x7FF0000040000000)465 ret float %med3466}467 468define float @fmed3_snan1_1_2_f32(float %x, float %y) #1 {469; IEEE1-LABEL: define float @fmed3_snan1_1_2_f32(470; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {471; IEEE1-NEXT: ret float 2.000000e+00472;473; IEEE0-LABEL: define float @fmed3_snan1_1_2_f32(474; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {475; IEEE0-NEXT: ret float 1.000000e+00476;477 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float 1.0, float 2.0)478 ret float %med3479}480 481define float @fmed3_snan1_neg1_2_f32(float %x, float %y) #1 {482; IEEE1-LABEL: define float @fmed3_snan1_neg1_2_f32(483; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {484; IEEE1-NEXT: ret float 2.000000e+00485;486; IEEE0-LABEL: define float @fmed3_snan1_neg1_2_f32(487; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {488; IEEE0-NEXT: ret float -1.000000e+00489;490 %med3 = call float @llvm.amdgcn.fmed3.f32(float -1.0, float 0x7FF4000000000000, float 2.0)491 ret float %med3492}493 494define float @fmed3_neg2_3_snan1_f32(float %x, float %y) #1 {495; IEEE1-LABEL: define float @fmed3_neg2_3_snan1_f32(496; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {497; IEEE1-NEXT: ret float 0x7FFC000000000000498;499; IEEE0-LABEL: define float @fmed3_neg2_3_snan1_f32(500; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {501; IEEE0-NEXT: ret float 3.000000e+00502;503 %med3 = call float @llvm.amdgcn.fmed3.f32(float -2.0, float 3.0, float 0x7FF4000000000000)504 ret float %med3505}506 507define float @fmed3_inf_x_y_f32(float %x, float %y) #1 {508; IEEE1-LABEL: define float @fmed3_inf_x_y_f32(509; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {510; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X]], float [[Y]])511; IEEE1-NEXT: ret float [[MED3]]512;513; IEEE0-LABEL: define float @fmed3_inf_x_y_f32(514; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {515; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])516; IEEE0-NEXT: ret float [[MED3]]517;518 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF0000000000000, float %x, float %y)519 ret float %med3520}521 522define float @fmed3_x_inf_y_f32(float %x, float %y) #1 {523; IEEE1-LABEL: define float @fmed3_x_inf_y_f32(524; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {525; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X]], float [[Y]])526; IEEE1-NEXT: ret float [[MED3]]527;528; IEEE0-LABEL: define float @fmed3_x_inf_y_f32(529; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {530; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])531; IEEE0-NEXT: ret float [[MED3]]532;533 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF0000000000000, float %y)534 ret float %med3535}536 537define float @fmed3_x_y_inf_f32(float %x, float %y) #1 {538; IEEE1-LABEL: define float @fmed3_x_y_inf_f32(539; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {540; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X]], float [[Y]])541; IEEE1-NEXT: ret float [[MED3]]542;543; IEEE0-LABEL: define float @fmed3_x_y_inf_f32(544; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {545; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])546; IEEE0-NEXT: ret float [[MED3]]547;548 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF0000000000000)549 ret float %med3550}551 552define float @fmed3_ninf_x_y_f32(float %x, float %y) #1 {553; IEEE1-LABEL: define float @fmed3_ninf_x_y_f32(554; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {555; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])556; IEEE1-NEXT: ret float [[MED3]]557;558; IEEE0-LABEL: define float @fmed3_ninf_x_y_f32(559; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {560; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])561; IEEE0-NEXT: ret float [[MED3]]562;563 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0xFFF0000000000000, float %x, float %y)564 ret float %med3565}566 567define float @fmed3_x_ninf_y_f32(float %x, float %y) #1 {568; IEEE1-LABEL: define float @fmed3_x_ninf_y_f32(569; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {570; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])571; IEEE1-NEXT: ret float [[MED3]]572;573; IEEE0-LABEL: define float @fmed3_x_ninf_y_f32(574; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {575; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])576; IEEE0-NEXT: ret float [[MED3]]577;578 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0xFFF0000000000000, float %y)579 ret float %med3580}581 582define float @fmed3_x_y_ninf_f32(float %x, float %y) #1 {583; IEEE1-LABEL: define float @fmed3_x_y_ninf_f32(584; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {585; IEEE1-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])586; IEEE1-NEXT: ret float [[MED3]]587;588; IEEE0-LABEL: define float @fmed3_x_y_ninf_f32(589; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {590; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])591; IEEE0-NEXT: ret float [[MED3]]592;593 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0xFFF0000000000000)594 ret float %med3595}596 597; --------------------------------------------------------------------598; llvm.amdgcn.fmed3 with default mode implied by shader CC599; --------------------------------------------------------------------600 601define amdgpu_ps float @amdgpu_ps_default_fmed3_snan1_x_y_f32(float %x, float %y) {602; HAS-IEEE-BIT1-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_snan1_x_y_f32(603; HAS-IEEE-BIT1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2:[0-9]+]] {604; HAS-IEEE-BIT1-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])605; HAS-IEEE-BIT1-NEXT: ret float [[MED3]]606;607; IEEE0-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_snan1_x_y_f32(608; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2:[0-9]+]] {609; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])610; IEEE0-NEXT: ret float [[MED3]]611;612; NO-IEEE-BIT-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_snan1_x_y_f32(613; NO-IEEE-BIT-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2:[0-9]+]] {614; NO-IEEE-BIT-NEXT: ret float [[Y]]615;616 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float %x, float %y)617 ret float %med3618}619 620define amdgpu_ps float @amdgpu_ps_default_fmed3_x_snan1_y_f32(float %x, float %y) {621; HAS-IEEE-BIT1-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_x_snan1_y_f32(622; HAS-IEEE-BIT1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2]] {623; HAS-IEEE-BIT1-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])624; HAS-IEEE-BIT1-NEXT: ret float [[MED3]]625;626; IEEE0-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_x_snan1_y_f32(627; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2]] {628; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])629; IEEE0-NEXT: ret float [[MED3]]630;631; NO-IEEE-BIT-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_x_snan1_y_f32(632; NO-IEEE-BIT-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2]] {633; NO-IEEE-BIT-NEXT: ret float [[Y]]634;635 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF4000000000000, float %y)636 ret float %med3637}638 639define amdgpu_ps float @amdgpu_ps_default_fmed3_x_y_snan1_f32(float %x, float %y) {640; HAS-IEEE-BIT1-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_x_y_snan1_f32(641; HAS-IEEE-BIT1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2]] {642; HAS-IEEE-BIT1-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])643; HAS-IEEE-BIT1-NEXT: ret float [[MED3]]644;645; IEEE0-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_x_y_snan1_f32(646; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2]] {647; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])648; IEEE0-NEXT: ret float [[MED3]]649;650; NO-IEEE-BIT-LABEL: define amdgpu_ps float @amdgpu_ps_default_fmed3_x_y_snan1_f32(651; NO-IEEE-BIT-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR2]] {652; NO-IEEE-BIT-NEXT: ret float 0x7FFC000000000000653;654 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF4000000000000)655 ret float %med3656}657; --------------------------------------------------------------------658; llvm.amdgcn.fmed3 with default mode shader cc and amdgpu-ieee659; --------------------------------------------------------------------660 661define amdgpu_ps float @amdgpu_ps_attr_fmed3_snan1_x_y_f32(float %x, float %y) #1 {662; IEEE1-LABEL: define amdgpu_ps float @amdgpu_ps_attr_fmed3_snan1_x_y_f32(663; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {664; IEEE1-NEXT: ret float [[Y]]665;666; IEEE0-LABEL: define amdgpu_ps float @amdgpu_ps_attr_fmed3_snan1_x_y_f32(667; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {668; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])669; IEEE0-NEXT: ret float [[MED3]]670;671 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float %x, float %y)672 ret float %med3673}674 675define amdgpu_ps float @amdgpu_ps_attr_fmed3_x_snan1_y_f32(float %x, float %y) #1 {676; IEEE1-LABEL: define amdgpu_ps float @amdgpu_ps_attr_fmed3_x_snan1_y_f32(677; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {678; IEEE1-NEXT: ret float [[Y]]679;680; IEEE0-LABEL: define amdgpu_ps float @amdgpu_ps_attr_fmed3_x_snan1_y_f32(681; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {682; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.minimumnum.f32(float [[X]], float [[Y]])683; IEEE0-NEXT: ret float [[MED3]]684;685 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF4000000000000, float %y)686 ret float %med3687}688 689define amdgpu_ps float @amdgpu_ps_attr_fmed3_x_y_snan1_f32(float %x, float %y) #1 {690; IEEE1-LABEL: define amdgpu_ps float @amdgpu_ps_attr_fmed3_x_y_snan1_f32(691; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {692; IEEE1-NEXT: ret float 0x7FFC000000000000693;694; IEEE0-LABEL: define amdgpu_ps float @amdgpu_ps_attr_fmed3_x_y_snan1_f32(695; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {696; IEEE0-NEXT: [[MED3:%.*]] = call float @llvm.maximumnum.f32(float [[X]], float [[Y]])697; IEEE0-NEXT: ret float [[MED3]]698;699 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF4000000000000)700 ret float %med3701}702 703; --------------------------------------------------------------------704; llvm.amdgcn.fmed3 with strictfp calls705; --------------------------------------------------------------------706 707define float @fmed3_qnan0_x_y_f32_strictfp(float %x, float %y) #2 {708; CHECK-LABEL: define float @fmed3_qnan0_x_y_f32_strictfp(709; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3:[0-9]+]] {710; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000000000000, float [[X]], float [[Y]]) #[[ATTR5:[0-9]+]]711; CHECK-NEXT: ret float [[MED3]]712;713 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000000000000, float %x, float %y) strictfp714 ret float %med3715}716 717define float @fmed3_x_qnan0_y_f32_strictfp(float %x, float %y) #2 {718; CHECK-LABEL: define float @fmed3_x_qnan0_y_f32_strictfp(719; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {720; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0x7FF8000000000000, float [[Y]]) #[[ATTR5]]721; CHECK-NEXT: ret float [[MED3]]722;723 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF8000000000000, float %y) strictfp724 ret float %med3725}726 727define float @fmed3_x_y_qnan0_f32_strictfp(float %x, float %y) #2 {728; CHECK-LABEL: define float @fmed3_x_y_qnan0_f32_strictfp(729; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {730; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 0x7FF8000000000000) #[[ATTR5]]731; CHECK-NEXT: ret float [[MED3]]732;733 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF8000000000000) strictfp734 ret float %med3735}736 737define float @fmed3_snan1_x_y_f32_strictfp(float %x, float %y) #2 {738; CHECK-LABEL: define float @fmed3_snan1_x_y_f32_strictfp(739; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {740; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float [[X]], float [[Y]]) #[[ATTR5]]741; CHECK-NEXT: ret float [[MED3]]742;743 %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float %x, float %y) strictfp744 ret float %med3745}746 747define float @fmed3_x_snan1_y_f32_strictfp(float %x, float %y) #2 {748; CHECK-LABEL: define float @fmed3_x_snan1_y_f32_strictfp(749; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {750; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0x7FF4000000000000, float [[Y]]) #[[ATTR5]]751; CHECK-NEXT: ret float [[MED3]]752;753 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF4000000000000, float %y) strictfp754 ret float %med3755}756 757define float @fmed3_x_y_snan1_f32_strictfp(float %x, float %y) #2 {758; CHECK-LABEL: define float @fmed3_x_y_snan1_f32_strictfp(759; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {760; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 0x7FF4000000000000) #[[ATTR5]]761; CHECK-NEXT: ret float [[MED3]]762;763 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF4000000000000) strictfp764 ret float %med3765}766 767define float @fmed3_poison_x_y_f32_strictfp(float %x, float %y) #2 {768; CHECK-LABEL: define float @fmed3_poison_x_y_f32_strictfp(769; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {770; CHECK-NEXT: ret float poison771;772 %med3 = call float @llvm.amdgcn.fmed3.f32(float poison, float %x, float %y) strictfp773 ret float %med3774}775 776define float @fmed3_x_poison_y_f32_strictfp(float %x, float %y) #2 {777; CHECK-LABEL: define float @fmed3_x_poison_y_f32_strictfp(778; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {779; CHECK-NEXT: ret float poison780;781 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float poison, float %y) strictfp782 ret float %med3783}784 785define float @fmed3_x_y_poison_f32_strictfp(float %x, float %y) #2 {786; CHECK-LABEL: define float @fmed3_x_y_poison_f32_strictfp(787; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {788; CHECK-NEXT: ret float poison789;790 %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float poison) strictfp791 ret float %med3792}793 794; --------------------------------------------------------------------795; llvm.amdgcn.fmed3 with flags796; --------------------------------------------------------------------797 798define float @fmed3_qnan0_x_y_f32_flags(float %x, float %y) #1 {799; IEEE1-LABEL: define float @fmed3_qnan0_x_y_f32_flags(800; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {801; IEEE1-NEXT: [[MED3:%.*]] = call ninf nsz float @llvm.minnum.f32(float [[X]], float [[Y]])802; IEEE1-NEXT: ret float [[MED3]]803;804; IEEE0-LABEL: define float @fmed3_qnan0_x_y_f32_flags(805; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {806; IEEE0-NEXT: [[MED3:%.*]] = call ninf nsz float @llvm.minimumnum.f32(float [[X]], float [[Y]])807; IEEE0-NEXT: ret float [[MED3]]808;809 %med3 = call nsz ninf float @llvm.amdgcn.fmed3.f32(float 0x7FF8000000000000, float %x, float %y)810 ret float %med3811}812 813define float @fmed3_x_qnan0_y_f32_flags(float %x, float %y) #1 {814; IEEE1-LABEL: define float @fmed3_x_qnan0_y_f32_flags(815; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {816; IEEE1-NEXT: [[MED3:%.*]] = call ninf nsz float @llvm.minnum.f32(float [[X]], float [[Y]])817; IEEE1-NEXT: ret float [[MED3]]818;819; IEEE0-LABEL: define float @fmed3_x_qnan0_y_f32_flags(820; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {821; IEEE0-NEXT: [[MED3:%.*]] = call ninf nsz float @llvm.minimumnum.f32(float [[X]], float [[Y]])822; IEEE0-NEXT: ret float [[MED3]]823;824 %med3 = call nsz ninf float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF8000000000000, float %y)825 ret float %med3826}827 828define float @fmed3_x_y_qnan0_f32_flags(float %x, float %y) #1 {829; IEEE1-LABEL: define float @fmed3_x_y_qnan0_f32_flags(830; IEEE1-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {831; IEEE1-NEXT: [[MED3:%.*]] = call ninf nsz float @llvm.minnum.f32(float [[X]], float [[Y]])832; IEEE1-NEXT: ret float [[MED3]]833;834; IEEE0-LABEL: define float @fmed3_x_y_qnan0_f32_flags(835; IEEE0-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR1]] {836; IEEE0-NEXT: [[MED3:%.*]] = call ninf nsz float @llvm.maximumnum.f32(float [[X]], float [[Y]])837; IEEE0-NEXT: ret float [[MED3]]838;839 %med3 = call nsz ninf float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF8000000000000)840 ret float %med3841}842 843attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }844attributes #1 = { nounwind "amdgpu-ieee"="true" }845attributes #2 = { nounwind strictfp "amdgpu-ieee"="true" }846