brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.9 KiB · ffc8183 Raw
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