655 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; fcmp OGT + fadd + sel => fcmp OGT + sel => fmaxnum5 6define float @test_fcmp_ogt_fadd_select_constant(float %in) {7; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_constant(8; CHECK-SAME: float [[IN:%.*]]) {9; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)10; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+0011; CHECK-NEXT: ret float [[ADD_NEW]]12;13 %cmp1 = fcmp ogt float %in, 0.000000e+0014 %add = fadd float %in, 1.000000e+0015 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+0016 ret float %sel17}18 19define float @test_fcmp_ogt_fadd_select_constant_swapped(float %in) {20; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_constant_swapped(21; CHECK-SAME: float [[IN:%.*]]) {22; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)23; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+0024; CHECK-NEXT: ret float [[ADD_NEW]]25;26 %cmp1 = fcmp ogt float %in, 0.000000e+0027 %add = fadd float %in, 1.000000e+0028 %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add29 ret float %sel30}31 32define float @test_fcmp_ogt_fadd_select_neg_constant(float %in) {33; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_neg_constant(34; CHECK-SAME: float [[IN:%.*]]) {35; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)36; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+0037; CHECK-NEXT: ret float [[ADD_NEW]]38;39 %cmp1 = fcmp ogt float %in, -0.000000e+0040 %add = fadd float %in, 1.000000e+0041 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+0042 ret float %sel43}44 45define float @test_fcmp_ogt_fadd_select_fastmath_preserve(float %in) {46; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_fastmath_preserve(47; CHECK-SAME: float [[IN:%.*]]) {48; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)49; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+0050; CHECK-NEXT: ret float [[ADD_NEW]]51;52 %cmp1 = fcmp ogt float %in, 0.000000e+0053 %add = fadd nnan float %in, 1.000000e+0054 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+0055 ret float %sel56}57 58define <2 x float> @test_fcmp_ogt_fadd_select_constant_vectors(<2 x float> %in) {59; CHECK-LABEL: define <2 x float> @test_fcmp_ogt_fadd_select_constant_vectors(60; CHECK-SAME: <2 x float> [[IN:%.*]]) {61; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.maxnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)62; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)63; CHECK-NEXT: ret <2 x float> [[ADD_NEW]]64;65 %cmp1 = fcmp ogt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>66 %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>67 %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>68 ret <2 x float> %sel69}70 71 72; fcmp OLT + fadd + sel => fcmp OLT + sel => fminnum73 74define float @test_fcmp_olt_fadd_select_constant(float %in) {75; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_constant(76; CHECK-SAME: float [[IN:%.*]]) {77; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)78; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+0079; CHECK-NEXT: ret float [[ADD_NEW]]80;81 %cmp1 = fcmp olt float %in, 0.000000e+0082 %add = fadd float %in, 1.000000e+0083 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+0084 ret float %sel85}86 87define float @test_fcmp_olt_fadd_select_constant_swapped(float %in) {88; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_constant_swapped(89; CHECK-SAME: float [[IN:%.*]]) {90; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)91; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+0092; CHECK-NEXT: ret float [[ADD_NEW]]93;94 %cmp1 = fcmp olt float %in, 0.000000e+0095 %add = fadd float %in, 1.000000e+0096 %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add97 ret float %sel98}99 100define float @test_fcmp_olt_fadd_select_neg_constant(float %in) {101; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_neg_constant(102; CHECK-SAME: float [[IN:%.*]]) {103; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)104; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00105; CHECK-NEXT: ret float [[ADD_NEW]]106;107 %cmp1 = fcmp olt float %in, -0.000000e+00108 %add = fadd float %in, 1.000000e+00109 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00110 ret float %sel111}112 113define float @test_fcmp_olt_fadd_select_fastmath_preserve(float %in) {114; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_fastmath_preserve(115; CHECK-SAME: float [[IN:%.*]]) {116; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)117; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00118; CHECK-NEXT: ret float [[ADD_NEW]]119;120 %cmp1 = fcmp olt float %in, 0.000000e+00121 %add = fadd nnan float %in, 1.000000e+00122 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00123 ret float %sel124}125 126define <2 x float> @test_fcmp_olt_fadd_select_constant_vectors(<2 x float> %in) {127; CHECK-LABEL: define <2 x float> @test_fcmp_olt_fadd_select_constant_vectors(128; CHECK-SAME: <2 x float> [[IN:%.*]]) {129; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.minnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)130; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)131; CHECK-NEXT: ret <2 x float> [[ADD_NEW]]132;133 %cmp1 = fcmp olt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>134 %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>135 %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>136 ret <2 x float> %sel137}138 139 140; fcmp OGE + fadd + sel => fcmp OGE + sel => fmaxnum141 142define float @test_fcmp_oge_fadd_select_constant(float %in) {143; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_constant(144; CHECK-SAME: float [[IN:%.*]]) {145; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)146; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00147; CHECK-NEXT: ret float [[ADD_NEW]]148;149 %cmp1 = fcmp oge float %in, 0.000000e+00150 %add = fadd float %in, 1.000000e+00151 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00152 ret float %sel153}154 155define float @test_fcmp_oge_fadd_select_constant_swapped(float %in) {156; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_constant_swapped(157; CHECK-SAME: float [[IN:%.*]]) {158; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)159; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00160; CHECK-NEXT: ret float [[ADD_NEW]]161;162 %cmp1 = fcmp oge float %in, 0.000000e+00163 %add = fadd float %in, 1.000000e+00164 %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add165 ret float %sel166}167 168define float @test_fcmp_oge_fadd_select_neg_constant(float %in) {169; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_neg_constant(170; CHECK-SAME: float [[IN:%.*]]) {171; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)172; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00173; CHECK-NEXT: ret float [[ADD_NEW]]174;175 %cmp1 = fcmp oge float %in, -0.000000e+00176 %add = fadd float %in, 1.000000e+00177 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00178 ret float %sel179}180 181define float @test_fcmp_oge_fadd_select_fastmath_preserve(float %in) {182; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_fastmath_preserve(183; CHECK-SAME: float [[IN:%.*]]) {184; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)185; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00186; CHECK-NEXT: ret float [[ADD_NEW]]187;188 %cmp1 = fcmp oge float %in, 0.000000e+00189 %add = fadd nnan float %in, 1.000000e+00190 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00191 ret float %sel192}193 194define <2 x float> @test_fcmp_oge_fadd_select_constant_vectors(<2 x float> %in) {195; CHECK-LABEL: define <2 x float> @test_fcmp_oge_fadd_select_constant_vectors(196; CHECK-SAME: <2 x float> [[IN:%.*]]) {197; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.maxnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)198; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)199; CHECK-NEXT: ret <2 x float> [[ADD_NEW]]200;201 %cmp1 = fcmp oge <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>202 %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>203 %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>204 ret <2 x float> %sel205}206 207 208; fcmp OLE + fadd + sel => fcmp OLE + sel => fminnum209 210define float @test_fcmp_ole_fadd_select_constant(float %in) {211; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_constant(212; CHECK-SAME: float [[IN:%.*]]) {213; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)214; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00215; CHECK-NEXT: ret float [[ADD_NEW]]216;217 %cmp1 = fcmp ole float %in, 0.000000e+00218 %add = fadd float %in, 1.000000e+00219 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00220 ret float %sel221}222 223define float @test_fcmp_ole_fadd_select_constant_swapped(float %in) {224; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_constant_swapped(225; CHECK-SAME: float [[IN:%.*]]) {226; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)227; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00228; CHECK-NEXT: ret float [[ADD_NEW]]229;230 %cmp1 = fcmp ole float %in, 0.000000e+00231 %add = fadd float %in, 1.000000e+00232 %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add233 ret float %sel234}235 236define float @test_fcmp_ole_fadd_select_neg_constant(float %in) {237; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_neg_constant(238; CHECK-SAME: float [[IN:%.*]]) {239; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)240; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00241; CHECK-NEXT: ret float [[ADD_NEW]]242;243 %cmp1 = fcmp ole float %in, -0.000000e+00244 %add = fadd float %in, 1.000000e+00245 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00246 ret float %sel247}248 249define float @test_fcmp_ole_fadd_select_fastmath_preserve(float %in) {250; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_fastmath_preserve(251; CHECK-SAME: float [[IN:%.*]]) {252; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)253; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00254; CHECK-NEXT: ret float [[ADD_NEW]]255;256 %cmp1 = fcmp ole float %in, 0.000000e+00257 %add = fadd nnan float %in, 1.000000e+00258 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00259 ret float %sel260}261 262define <2 x float> @test_fcmp_ole_fadd_select_constant_vectors(<2 x float> %in) {263; CHECK-LABEL: define <2 x float> @test_fcmp_ole_fadd_select_constant_vectors(264; CHECK-SAME: <2 x float> [[IN:%.*]]) {265; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.minnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)266; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)267; CHECK-NEXT: ret <2 x float> [[ADD_NEW]]268;269 %cmp1 = fcmp ole <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>270 %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>271 %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>272 ret <2 x float> %sel273}274 275 276; fcmp UGT + fadd + sel => fcmp UGT + sel => fcmp OLE + sel277 278define float @test_fcmp_ugt_fadd_select_constant(float %in) {279; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_constant(280; CHECK-SAME: float [[IN:%.*]]) {281; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)282; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00283; CHECK-NEXT: ret float [[ADD_NEW]]284;285 %cmp1 = fcmp ugt float %in, 0.000000e+00286 %add = fadd float %in, 1.000000e+00287 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00288 ret float %sel289}290 291define float @test_fcmp_ugt_fadd_select_constant_swapped(float %in) {292; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_constant_swapped(293; CHECK-SAME: float [[IN:%.*]]) {294; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)295; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00296; CHECK-NEXT: ret float [[ADD_NEW]]297;298 %cmp1 = fcmp ugt float %in, 0.000000e+00299 %add = fadd float %in, 1.000000e+00300 %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add301 ret float %sel302}303 304define float @test_fcmp_ugt_fadd_select_neg_constant(float %in) {305; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_neg_constant(306; CHECK-SAME: float [[IN:%.*]]) {307; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)308; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00309; CHECK-NEXT: ret float [[ADD_NEW]]310;311 %cmp1 = fcmp ugt float %in, -0.000000e+00312 %add = fadd float %in, 1.000000e+00313 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00314 ret float %sel315}316 317define float @test_fcmp_ugt_fadd_select_fastmath_preserve(float %in) {318; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_fastmath_preserve(319; CHECK-SAME: float [[IN:%.*]]) {320; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)321; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00322; CHECK-NEXT: ret float [[ADD_NEW]]323;324 %cmp1 = fcmp ugt float %in, 0.000000e+00325 %add = fadd nnan float %in, 1.000000e+00326 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00327 ret float %sel328}329 330define <2 x float> @test_fcmp_ugt_fadd_select_constant_vectors(<2 x float> %in) {331; CHECK-LABEL: define <2 x float> @test_fcmp_ugt_fadd_select_constant_vectors(332; CHECK-SAME: <2 x float> [[IN:%.*]]) {333; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.maxnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)334; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)335; CHECK-NEXT: ret <2 x float> [[ADD_NEW]]336;337 %cmp1 = fcmp ugt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>338 %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>339 %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>340 ret <2 x float> %sel341}342 343 344; fcmp UGE + fadd + sel => fcmp UGE + sel => fcmp olt + sel345 346define float @test_fcmp_uge_fadd_select_constant(float %in) {347; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_constant(348; CHECK-SAME: float [[IN:%.*]]) {349; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)350; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00351; CHECK-NEXT: ret float [[ADD_NEW]]352;353 %cmp1 = fcmp uge float %in, 0.000000e+00354 %add = fadd float %in, 1.000000e+00355 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00356 ret float %sel357}358 359define float @test_fcmp_uge_fadd_select_constant_swapped(float %in) {360; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_constant_swapped(361; CHECK-SAME: float [[IN:%.*]]) {362; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)363; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00364; CHECK-NEXT: ret float [[ADD_NEW]]365;366 %cmp1 = fcmp uge float %in, 0.000000e+00367 %add = fadd float %in, 1.000000e+00368 %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add369 ret float %sel370}371 372define float @test_fcmp_uge_fadd_select_neg_constant(float %in) {373; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_neg_constant(374; CHECK-SAME: float [[IN:%.*]]) {375; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)376; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00377; CHECK-NEXT: ret float [[ADD_NEW]]378;379 %cmp1 = fcmp uge float %in, -0.000000e+00380 %add = fadd float %in, 1.000000e+00381 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00382 ret float %sel383}384 385define float @test_fcmp_uge_fadd_select_fastmath_preserve(float %in) {386; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_fastmath_preserve(387; CHECK-SAME: float [[IN:%.*]]) {388; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)389; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00390; CHECK-NEXT: ret float [[ADD_NEW]]391;392 %cmp1 = fcmp uge float %in, 0.000000e+00393 %add = fadd nnan float %in, 1.000000e+00394 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00395 ret float %sel396}397 398define <2 x float> @test_fcmp_uge_fadd_select_constant_vectors(<2 x float> %in) {399; CHECK-LABEL: define <2 x float> @test_fcmp_uge_fadd_select_constant_vectors(400; CHECK-SAME: <2 x float> [[IN:%.*]]) {401; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.maxnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)402; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)403; CHECK-NEXT: ret <2 x float> [[ADD_NEW]]404;405 %cmp1 = fcmp uge <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>406 %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>407 %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>408 ret <2 x float> %sel409}410 411 412; fcmp ULT + fadd + sel => fcmp ULT + sel => fcmp OGE + sel413 414define float @test_fcmp_ult_fadd_select_constant(float %in) {415; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_constant(416; CHECK-SAME: float [[IN:%.*]]) {417; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)418; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00419; CHECK-NEXT: ret float [[ADD_NEW]]420;421 %cmp1 = fcmp ult float %in, 0.000000e+00422 %add = fadd float %in, 1.000000e+00423 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00424 ret float %sel425}426 427define float @test_fcmp_ult_fadd_select_constant_swapped(float %in) {428; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_constant_swapped(429; CHECK-SAME: float [[IN:%.*]]) {430; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)431; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00432; CHECK-NEXT: ret float [[ADD_NEW]]433;434 %cmp1 = fcmp ult float %in, 0.000000e+00435 %add = fadd float %in, 1.000000e+00436 %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add437 ret float %sel438}439 440define float @test_fcmp_ult_fadd_select_neg_constant(float %in) {441; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_neg_constant(442; CHECK-SAME: float [[IN:%.*]]) {443; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)444; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00445; CHECK-NEXT: ret float [[ADD_NEW]]446;447 %cmp1 = fcmp ult float %in, -0.000000e+00448 %add = fadd float %in, 1.000000e+00449 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00450 ret float %sel451}452 453define float @test_fcmp_ult_fadd_select_fastmath_preserve(float %in) {454; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_fastmath_preserve(455; CHECK-SAME: float [[IN:%.*]]) {456; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)457; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00458; CHECK-NEXT: ret float [[ADD_NEW]]459;460 %cmp1 = fcmp ult float %in, 0.000000e+00461 %add = fadd nnan float %in, 1.000000e+00462 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00463 ret float %sel464}465 466define <2 x float> @test_fcmp_ult_fadd_select_constant_vectors(<2 x float> %in) {467; CHECK-LABEL: define <2 x float> @test_fcmp_ult_fadd_select_constant_vectors(468; CHECK-SAME: <2 x float> [[IN:%.*]]) {469; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.minnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)470; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)471; CHECK-NEXT: ret <2 x float> [[ADD_NEW]]472;473 %cmp1 = fcmp ult <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>474 %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>475 %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>476 ret <2 x float> %sel477}478 479 480; fcmp ULE + fadd + sel => fcmp ULE + sel => fcmp OGT + sel481 482define float @test_fcmp_ule_fadd_select_constant(float %in) {483; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_constant(484; CHECK-SAME: float [[IN:%.*]]) {485; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)486; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00487; CHECK-NEXT: ret float [[ADD_NEW]]488;489 %cmp1 = fcmp ule float %in, 0.000000e+00490 %add = fadd float %in, 1.000000e+00491 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00492 ret float %sel493}494 495define float @test_fcmp_ule_fadd_select_constant_swapped(float %in) {496; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_constant_swapped(497; CHECK-SAME: float [[IN:%.*]]) {498; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)499; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00500; CHECK-NEXT: ret float [[ADD_NEW]]501;502 %cmp1 = fcmp ule float %in, 0.000000e+00503 %add = fadd float %in, 1.000000e+00504 %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add505 ret float %sel506}507 508define float @test_fcmp_ule_fadd_select_neg_constant(float %in) {509; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_neg_constant(510; CHECK-SAME: float [[IN:%.*]]) {511; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)512; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00513; CHECK-NEXT: ret float [[ADD_NEW]]514;515 %cmp1 = fcmp ule float %in, -0.000000e+00516 %add = fadd float %in, 1.000000e+00517 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00518 ret float %sel519}520 521define float @test_fcmp_ule_fadd_select_fastmath_preserve(float %in) {522; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_fastmath_preserve(523; CHECK-SAME: float [[IN:%.*]]) {524; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00)525; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00526; CHECK-NEXT: ret float [[ADD_NEW]]527;528 %cmp1 = fcmp ule float %in, 0.000000e+00529 %add = fadd nnan float %in, 1.000000e+00530 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00531 ret float %sel532}533 534define <2 x float> @test_fcmp_ule_fadd_select_constant_vectors(<2 x float> %in) {535; CHECK-LABEL: define <2 x float> @test_fcmp_ule_fadd_select_constant_vectors(536; CHECK-SAME: <2 x float> [[IN:%.*]]) {537; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.minnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer)538; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00)539; CHECK-NEXT: ret <2 x float> [[ADD_NEW]]540;541 %cmp1 = fcmp ule <2 x float> %in, <float 0.000000e+00, float 0.000000e+00>542 %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00>543 %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00>544 ret <2 x float> %sel545}546 547 548; Negative scenarios549 550; select instruction doesn't give nnan and nsz guarantees.551define float @test_select_without_nnan_nsz(float %in) {552; CHECK-LABEL: define float @test_select_without_nnan_nsz(553; CHECK-SAME: float [[IN:%.*]]) {554; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt float [[IN]], 0.000000e+00555; CHECK-NEXT: [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00556; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], float [[ADD]], float 1.000000e+00557; CHECK-NEXT: ret float [[SEL]]558;559 %cmp1 = fcmp ogt float %in, 0.000000e+00560 %add = fadd float %in, 1.000000e+00561 %sel = select i1 %cmp1, float %add, float 1.000000e+00562 ret float %sel563}564 565; fcmp arg doesn't match with fadd's. This won't be converted to maxnum/minnum.566define float @test_fcmp_fadd_arg_mismatch(float %in, float %in2) {567; CHECK-LABEL: define float @test_fcmp_fadd_arg_mismatch(568; CHECK-SAME: float [[IN:%.*]], float [[IN2:%.*]]) {569; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt float [[IN2]], 0.000000e+00570; CHECK-NEXT: [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00571; CHECK-NEXT: [[SEL:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00572; CHECK-NEXT: ret float [[SEL]]573;574 %cmp1 = fcmp ogt float %in2, 0.000000e+00575 %add = fadd float %in, 1.000000e+00576 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00577 ret float %sel578}579 580; It won't be converted to maxnum/minnum because constant arg in fcmp isn't zero.581define float @test_fcmp_arg_non_zero(float %in) {582; CHECK-LABEL: define float @test_fcmp_arg_non_zero(583; CHECK-SAME: float [[IN:%.*]]) {584; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt float [[IN]], 1.000000e+00585; CHECK-NEXT: [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00586; CHECK-NEXT: [[SEL:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00587; CHECK-NEXT: ret float [[SEL]]588;589 %cmp1 = fcmp ogt float %in, 1.000000e+00590 %add = fadd float %in, 1.000000e+00591 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00592 ret float %sel593}594 595; fcmp has more than one use.596define float @test_fcmp_multiple_uses(float %in) {597; CHECK-LABEL: define float @test_fcmp_multiple_uses(598; CHECK-SAME: float [[IN:%.*]]) {599; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt float [[IN]], 0.000000e+00600; CHECK-NEXT: [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00601; CHECK-NEXT: [[ADD_2:%.*]] = fadd float [[IN]], 1.000000e+00602; CHECK-NEXT: [[SEL_1:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00603; CHECK-NEXT: [[SEL_2:%.*]] = select nnan nsz i1 [[CMP1]], float 2.000000e+00, float [[ADD_2]]604; CHECK-NEXT: [[RES:%.*]] = fadd float [[SEL_1]], [[SEL_2]]605; CHECK-NEXT: ret float [[RES]]606;607 %cmp1 = fcmp ogt float %in, 0.000000e+00608 %add = fadd float %in, 1.000000e+00609 %add.2 = fadd float %in, 1.000000e+00610 %sel.1 = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00611 %sel.2 = select nnan nsz i1 %cmp1, float 2.000000e+00, float %add.2612 %res = fadd float %sel.1, %sel.2613 ret float %res614}615 616; Rewrite-based flags propagation617define float @test_fcmp_ogt_fadd_select_rewrite_flags1(float %in) {618; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_flags1(619; CHECK-SAME: float [[IN:%.*]]) {620; CHECK-NEXT: [[SEL_NEW:%.*]] = call reassoc nsz arcp contract afn float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)621; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd reassoc nnan nsz arcp contract afn float [[SEL_NEW]], 1.000000e+00622; CHECK-NEXT: ret float [[ADD_NEW]]623;624 %cmp1 = fcmp ogt float %in, 0.000000e+00625 %add = fadd reassoc afn arcp contract float %in, 1.000000e+00626 %sel = select nnan nsz reassoc afn arcp contract i1 %cmp1, float %add, float 1.000000e+00627 ret float %sel628}629 630define float @test_fcmp_ogt_fadd_select_rewrite_flags2(float %in) {631; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_flags2(632; CHECK-SAME: float [[IN:%.*]]) {633; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)634; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00635; CHECK-NEXT: ret float [[ADD_NEW]]636;637 %cmp1 = fcmp ogt float %in, 0.000000e+00638 %add = fadd reassoc float %in, 1.000000e+00639 %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00640 ret float %sel641}642 643define float @test_fcmp_ogt_fadd_select_rewrite_and_fastmath(float %in) {644; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_and_fastmath(645; CHECK-SAME: float [[IN:%.*]]) {646; CHECK-NEXT: [[SEL_NEW:%.*]] = call reassoc nnan nsz arcp contract afn float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00)647; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd fast float [[SEL_NEW]], 1.000000e+00648; CHECK-NEXT: ret float [[ADD_NEW]]649;650 %cmp1 = fcmp nnan ogt float %in, 0.000000e+00651 %add = fadd fast reassoc float %in, 1.000000e+00652 %sel = select fast i1 %cmp1, float %add, float 1.000000e+00653 ret float %sel654}655