1ef2d6dafSRajat Bajpai; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2ef2d6dafSRajat Bajpai; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3ef2d6dafSRajat Bajpai 4ef2d6dafSRajat Bajpai; fcmp OGT + fadd + sel => fcmp OGT + sel => fmaxnum 5ef2d6dafSRajat Bajpai 6ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_constant(float %in) { 7ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_constant( 8ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 9de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 10ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 11ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 12ef2d6dafSRajat Bajpai; 13ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, 0.000000e+00 14ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 15ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 16ef2d6dafSRajat Bajpai ret float %sel 17ef2d6dafSRajat Bajpai} 18ef2d6dafSRajat Bajpai 19ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_constant_swapped(float %in) { 20ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_constant_swapped( 21ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 22*76a4c459SRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00) 23ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 24ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 25ef2d6dafSRajat Bajpai; 26ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, 0.000000e+00 27ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 28ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add 29ef2d6dafSRajat Bajpai ret float %sel 30ef2d6dafSRajat Bajpai} 31ef2d6dafSRajat Bajpai 32ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_neg_constant(float %in) { 33ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_neg_constant( 34ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 35de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 36ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 37ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 38ef2d6dafSRajat Bajpai; 39ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, -0.000000e+00 40ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 41ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 42ef2d6dafSRajat Bajpai ret float %sel 43ef2d6dafSRajat Bajpai} 44ef2d6dafSRajat Bajpai 45ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_fastmath_preserve(float %in) { 46ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_fastmath_preserve( 47ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 48de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 49ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 50ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 51ef2d6dafSRajat Bajpai; 52ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, 0.000000e+00 53ef2d6dafSRajat Bajpai %add = fadd nnan float %in, 1.000000e+00 54ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 55ef2d6dafSRajat Bajpai ret float %sel 56ef2d6dafSRajat Bajpai} 57ef2d6dafSRajat Bajpai 58ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ogt_fadd_select_constant_vectors(<2 x float> %in) { 59ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ogt_fadd_select_constant_vectors( 60ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) { 61de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.maxnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer) 62bf1c86ceSMatt Arsenault; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00) 63ef2d6dafSRajat Bajpai; CHECK-NEXT: ret <2 x float> [[ADD_NEW]] 64ef2d6dafSRajat Bajpai; 65ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00> 66ef2d6dafSRajat Bajpai %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00> 67ef2d6dafSRajat Bajpai %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00> 68ef2d6dafSRajat Bajpai ret <2 x float> %sel 69ef2d6dafSRajat Bajpai} 70ef2d6dafSRajat Bajpai 71ef2d6dafSRajat Bajpai 72ef2d6dafSRajat Bajpai; fcmp OLT + fadd + sel => fcmp OLT + sel => fminnum 73ef2d6dafSRajat Bajpai 74ef2d6dafSRajat Bajpaidefine float @test_fcmp_olt_fadd_select_constant(float %in) { 75ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_constant( 76ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 77de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00) 78ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 79ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 80ef2d6dafSRajat Bajpai; 81ef2d6dafSRajat Bajpai %cmp1 = fcmp olt float %in, 0.000000e+00 82ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 83ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 84ef2d6dafSRajat Bajpai ret float %sel 85ef2d6dafSRajat Bajpai} 86ef2d6dafSRajat Bajpai 87ef2d6dafSRajat Bajpaidefine float @test_fcmp_olt_fadd_select_constant_swapped(float %in) { 88ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_constant_swapped( 89ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 90*76a4c459SRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 91ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 92ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 93ef2d6dafSRajat Bajpai; 94ef2d6dafSRajat Bajpai %cmp1 = fcmp olt float %in, 0.000000e+00 95ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 96ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add 97ef2d6dafSRajat Bajpai ret float %sel 98ef2d6dafSRajat Bajpai} 99ef2d6dafSRajat Bajpai 100ef2d6dafSRajat Bajpaidefine float @test_fcmp_olt_fadd_select_neg_constant(float %in) { 101ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_neg_constant( 102ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 103de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00) 104ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 105ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 106ef2d6dafSRajat Bajpai; 107ef2d6dafSRajat Bajpai %cmp1 = fcmp olt float %in, -0.000000e+00 108ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 109ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 110ef2d6dafSRajat Bajpai ret float %sel 111ef2d6dafSRajat Bajpai} 112ef2d6dafSRajat Bajpai 113ef2d6dafSRajat Bajpaidefine float @test_fcmp_olt_fadd_select_fastmath_preserve(float %in) { 114ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_olt_fadd_select_fastmath_preserve( 115ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 116de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00) 117ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 118ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 119ef2d6dafSRajat Bajpai; 120ef2d6dafSRajat Bajpai %cmp1 = fcmp olt float %in, 0.000000e+00 121ef2d6dafSRajat Bajpai %add = fadd nnan float %in, 1.000000e+00 122ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 123ef2d6dafSRajat Bajpai ret float %sel 124ef2d6dafSRajat Bajpai} 125ef2d6dafSRajat Bajpai 126ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_olt_fadd_select_constant_vectors(<2 x float> %in) { 127ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_olt_fadd_select_constant_vectors( 128ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) { 129de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.minnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer) 130bf1c86ceSMatt Arsenault; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00) 131ef2d6dafSRajat Bajpai; CHECK-NEXT: ret <2 x float> [[ADD_NEW]] 132ef2d6dafSRajat Bajpai; 133ef2d6dafSRajat Bajpai %cmp1 = fcmp olt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00> 134ef2d6dafSRajat Bajpai %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00> 135ef2d6dafSRajat Bajpai %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00> 136ef2d6dafSRajat Bajpai ret <2 x float> %sel 137ef2d6dafSRajat Bajpai} 138ef2d6dafSRajat Bajpai 139ef2d6dafSRajat Bajpai 140ef2d6dafSRajat Bajpai; fcmp OGE + fadd + sel => fcmp OGE + sel => fmaxnum 141ef2d6dafSRajat Bajpai 142ef2d6dafSRajat Bajpaidefine float @test_fcmp_oge_fadd_select_constant(float %in) { 143ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_constant( 144ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 145de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 146ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 147ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 148ef2d6dafSRajat Bajpai; 149ef2d6dafSRajat Bajpai %cmp1 = fcmp oge float %in, 0.000000e+00 150ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 151ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 152ef2d6dafSRajat Bajpai ret float %sel 153ef2d6dafSRajat Bajpai} 154ef2d6dafSRajat Bajpai 155ef2d6dafSRajat Bajpaidefine float @test_fcmp_oge_fadd_select_constant_swapped(float %in) { 156ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_constant_swapped( 157ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 158*76a4c459SRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00) 159ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 160ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 161ef2d6dafSRajat Bajpai; 162ef2d6dafSRajat Bajpai %cmp1 = fcmp oge float %in, 0.000000e+00 163ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 164ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add 165ef2d6dafSRajat Bajpai ret float %sel 166ef2d6dafSRajat Bajpai} 167ef2d6dafSRajat Bajpai 168ef2d6dafSRajat Bajpaidefine float @test_fcmp_oge_fadd_select_neg_constant(float %in) { 169ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_neg_constant( 170ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 171de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 172ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 173ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 174ef2d6dafSRajat Bajpai; 175ef2d6dafSRajat Bajpai %cmp1 = fcmp oge float %in, -0.000000e+00 176ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 177ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 178ef2d6dafSRajat Bajpai ret float %sel 179ef2d6dafSRajat Bajpai} 180ef2d6dafSRajat Bajpai 181ef2d6dafSRajat Bajpaidefine float @test_fcmp_oge_fadd_select_fastmath_preserve(float %in) { 182ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_oge_fadd_select_fastmath_preserve( 183ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 184de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 185ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 186ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 187ef2d6dafSRajat Bajpai; 188ef2d6dafSRajat Bajpai %cmp1 = fcmp oge float %in, 0.000000e+00 189ef2d6dafSRajat Bajpai %add = fadd nnan float %in, 1.000000e+00 190ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 191ef2d6dafSRajat Bajpai ret float %sel 192ef2d6dafSRajat Bajpai} 193ef2d6dafSRajat Bajpai 194ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_oge_fadd_select_constant_vectors(<2 x float> %in) { 195ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_oge_fadd_select_constant_vectors( 196ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) { 197de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.maxnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer) 198bf1c86ceSMatt Arsenault; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00) 199ef2d6dafSRajat Bajpai; CHECK-NEXT: ret <2 x float> [[ADD_NEW]] 200ef2d6dafSRajat Bajpai; 201ef2d6dafSRajat Bajpai %cmp1 = fcmp oge <2 x float> %in, <float 0.000000e+00, float 0.000000e+00> 202ef2d6dafSRajat Bajpai %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00> 203ef2d6dafSRajat Bajpai %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00> 204ef2d6dafSRajat Bajpai ret <2 x float> %sel 205ef2d6dafSRajat Bajpai} 206ef2d6dafSRajat Bajpai 207ef2d6dafSRajat Bajpai 208ef2d6dafSRajat Bajpai; fcmp OLE + fadd + sel => fcmp OLE + sel => fminnum 209ef2d6dafSRajat Bajpai 210ef2d6dafSRajat Bajpaidefine float @test_fcmp_ole_fadd_select_constant(float %in) { 211ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_constant( 212ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 213de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00) 214ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 215ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 216ef2d6dafSRajat Bajpai; 217ef2d6dafSRajat Bajpai %cmp1 = fcmp ole float %in, 0.000000e+00 218ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 219ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 220ef2d6dafSRajat Bajpai ret float %sel 221ef2d6dafSRajat Bajpai} 222ef2d6dafSRajat Bajpai 223ef2d6dafSRajat Bajpaidefine float @test_fcmp_ole_fadd_select_constant_swapped(float %in) { 224ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_constant_swapped( 225ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 226*76a4c459SRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 227ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 228ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 229ef2d6dafSRajat Bajpai; 230ef2d6dafSRajat Bajpai %cmp1 = fcmp ole float %in, 0.000000e+00 231ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 232ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add 233ef2d6dafSRajat Bajpai ret float %sel 234ef2d6dafSRajat Bajpai} 235ef2d6dafSRajat Bajpai 236ef2d6dafSRajat Bajpaidefine float @test_fcmp_ole_fadd_select_neg_constant(float %in) { 237ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_neg_constant( 238ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 239de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00) 240ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 241ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 242ef2d6dafSRajat Bajpai; 243ef2d6dafSRajat Bajpai %cmp1 = fcmp ole float %in, -0.000000e+00 244ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 245ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 246ef2d6dafSRajat Bajpai ret float %sel 247ef2d6dafSRajat Bajpai} 248ef2d6dafSRajat Bajpai 249ef2d6dafSRajat Bajpaidefine float @test_fcmp_ole_fadd_select_fastmath_preserve(float %in) { 250ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ole_fadd_select_fastmath_preserve( 251ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 252de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.minnum.f32(float [[IN]], float 0.000000e+00) 253ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 254ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 255ef2d6dafSRajat Bajpai; 256ef2d6dafSRajat Bajpai %cmp1 = fcmp ole float %in, 0.000000e+00 257ef2d6dafSRajat Bajpai %add = fadd nnan float %in, 1.000000e+00 258ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 259ef2d6dafSRajat Bajpai ret float %sel 260ef2d6dafSRajat Bajpai} 261ef2d6dafSRajat Bajpai 262ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ole_fadd_select_constant_vectors(<2 x float> %in) { 263ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ole_fadd_select_constant_vectors( 264ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) { 265de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz <2 x float> @llvm.minnum.v2f32(<2 x float> [[IN]], <2 x float> zeroinitializer) 266bf1c86ceSMatt Arsenault; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00) 267ef2d6dafSRajat Bajpai; CHECK-NEXT: ret <2 x float> [[ADD_NEW]] 268ef2d6dafSRajat Bajpai; 269ef2d6dafSRajat Bajpai %cmp1 = fcmp ole <2 x float> %in, <float 0.000000e+00, float 0.000000e+00> 270ef2d6dafSRajat Bajpai %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00> 271ef2d6dafSRajat Bajpai %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00> 272ef2d6dafSRajat Bajpai ret <2 x float> %sel 273ef2d6dafSRajat Bajpai} 274ef2d6dafSRajat Bajpai 275ef2d6dafSRajat Bajpai 276ef2d6dafSRajat Bajpai; fcmp UGT + fadd + sel => fcmp UGT + sel => fcmp OLE + sel 277ef2d6dafSRajat Bajpai 278ef2d6dafSRajat Bajpaidefine float @test_fcmp_ugt_fadd_select_constant(float %in) { 279ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_constant( 280ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 281ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ole float [[IN]], 0.000000e+00 282ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 283ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 284ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 285ef2d6dafSRajat Bajpai; 286ef2d6dafSRajat Bajpai %cmp1 = fcmp ugt float %in, 0.000000e+00 287ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 288ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 289ef2d6dafSRajat Bajpai ret float %sel 290ef2d6dafSRajat Bajpai} 291ef2d6dafSRajat Bajpai 292ef2d6dafSRajat Bajpaidefine float @test_fcmp_ugt_fadd_select_constant_swapped(float %in) { 293ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_constant_swapped( 294ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 295ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ole float [[IN]], 0.000000e+00 296*76a4c459SRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float [[IN]], float 0.000000e+00 297ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 298ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 299ef2d6dafSRajat Bajpai; 300ef2d6dafSRajat Bajpai %cmp1 = fcmp ugt float %in, 0.000000e+00 301ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 302ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add 303ef2d6dafSRajat Bajpai ret float %sel 304ef2d6dafSRajat Bajpai} 305ef2d6dafSRajat Bajpai 306ef2d6dafSRajat Bajpaidefine float @test_fcmp_ugt_fadd_select_neg_constant(float %in) { 307ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_neg_constant( 308ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 309ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ole float [[IN]], 0.000000e+00 310ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 311ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 312ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 313ef2d6dafSRajat Bajpai; 314ef2d6dafSRajat Bajpai %cmp1 = fcmp ugt float %in, -0.000000e+00 315ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 316ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 317ef2d6dafSRajat Bajpai ret float %sel 318ef2d6dafSRajat Bajpai} 319ef2d6dafSRajat Bajpai 320ef2d6dafSRajat Bajpaidefine float @test_fcmp_ugt_fadd_select_fastmath_preserve(float %in) { 321ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ugt_fadd_select_fastmath_preserve( 322ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 323ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ole float [[IN]], 0.000000e+00 324ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 325ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 326ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 327ef2d6dafSRajat Bajpai; 328ef2d6dafSRajat Bajpai %cmp1 = fcmp ugt float %in, 0.000000e+00 329ef2d6dafSRajat Bajpai %add = fadd nnan float %in, 1.000000e+00 330ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 331ef2d6dafSRajat Bajpai ret float %sel 332ef2d6dafSRajat Bajpai} 333ef2d6dafSRajat Bajpai 334ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ugt_fadd_select_constant_vectors(<2 x float> %in) { 335ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ugt_fadd_select_constant_vectors( 336ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) { 337ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ole <2 x float> [[IN]], zeroinitializer 338ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select <2 x i1> [[CMP1_INV]], <2 x float> zeroinitializer, <2 x float> [[IN]] 339bf1c86ceSMatt Arsenault; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00) 340ef2d6dafSRajat Bajpai; CHECK-NEXT: ret <2 x float> [[ADD_NEW]] 341ef2d6dafSRajat Bajpai; 342ef2d6dafSRajat Bajpai %cmp1 = fcmp ugt <2 x float> %in, <float 0.000000e+00, float 0.000000e+00> 343ef2d6dafSRajat Bajpai %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00> 344ef2d6dafSRajat Bajpai %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00> 345ef2d6dafSRajat Bajpai ret <2 x float> %sel 346ef2d6dafSRajat Bajpai} 347ef2d6dafSRajat Bajpai 348ef2d6dafSRajat Bajpai 349ef2d6dafSRajat Bajpai; fcmp UGE + fadd + sel => fcmp UGE + sel => fcmp olt + sel 350ef2d6dafSRajat Bajpai 351ef2d6dafSRajat Bajpaidefine float @test_fcmp_uge_fadd_select_constant(float %in) { 352ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_constant( 353ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 354ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp olt float [[IN]], 0.000000e+00 355ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 356ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 357ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 358ef2d6dafSRajat Bajpai; 359ef2d6dafSRajat Bajpai %cmp1 = fcmp uge float %in, 0.000000e+00 360ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 361ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 362ef2d6dafSRajat Bajpai ret float %sel 363ef2d6dafSRajat Bajpai} 364ef2d6dafSRajat Bajpai 365ef2d6dafSRajat Bajpaidefine float @test_fcmp_uge_fadd_select_constant_swapped(float %in) { 366ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_constant_swapped( 367ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 368ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp olt float [[IN]], 0.000000e+00 369*76a4c459SRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float [[IN]], float 0.000000e+00 370ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 371ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 372ef2d6dafSRajat Bajpai; 373ef2d6dafSRajat Bajpai %cmp1 = fcmp uge float %in, 0.000000e+00 374ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 375ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add 376ef2d6dafSRajat Bajpai ret float %sel 377ef2d6dafSRajat Bajpai} 378ef2d6dafSRajat Bajpai 379ef2d6dafSRajat Bajpaidefine float @test_fcmp_uge_fadd_select_neg_constant(float %in) { 380ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_neg_constant( 381ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 382ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp olt float [[IN]], 0.000000e+00 383ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 384ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 385ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 386ef2d6dafSRajat Bajpai; 387ef2d6dafSRajat Bajpai %cmp1 = fcmp uge float %in, -0.000000e+00 388ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 389ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 390ef2d6dafSRajat Bajpai ret float %sel 391ef2d6dafSRajat Bajpai} 392ef2d6dafSRajat Bajpai 393ef2d6dafSRajat Bajpaidefine float @test_fcmp_uge_fadd_select_fastmath_preserve(float %in) { 394ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_uge_fadd_select_fastmath_preserve( 395ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 396ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp olt float [[IN]], 0.000000e+00 397ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 398ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 399ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 400ef2d6dafSRajat Bajpai; 401ef2d6dafSRajat Bajpai %cmp1 = fcmp uge float %in, 0.000000e+00 402ef2d6dafSRajat Bajpai %add = fadd nnan float %in, 1.000000e+00 403ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 404ef2d6dafSRajat Bajpai ret float %sel 405ef2d6dafSRajat Bajpai} 406ef2d6dafSRajat Bajpai 407ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_uge_fadd_select_constant_vectors(<2 x float> %in) { 408ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_uge_fadd_select_constant_vectors( 409ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) { 410ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp olt <2 x float> [[IN]], zeroinitializer 411ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select <2 x i1> [[CMP1_INV]], <2 x float> zeroinitializer, <2 x float> [[IN]] 412bf1c86ceSMatt Arsenault; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00) 413ef2d6dafSRajat Bajpai; CHECK-NEXT: ret <2 x float> [[ADD_NEW]] 414ef2d6dafSRajat Bajpai; 415ef2d6dafSRajat Bajpai %cmp1 = fcmp uge <2 x float> %in, <float 0.000000e+00, float 0.000000e+00> 416ef2d6dafSRajat Bajpai %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00> 417ef2d6dafSRajat Bajpai %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00> 418ef2d6dafSRajat Bajpai ret <2 x float> %sel 419ef2d6dafSRajat Bajpai} 420ef2d6dafSRajat Bajpai 421ef2d6dafSRajat Bajpai 422ef2d6dafSRajat Bajpai; fcmp ULT + fadd + sel => fcmp ULT + sel => fcmp OGE + sel 423ef2d6dafSRajat Bajpai 424ef2d6dafSRajat Bajpaidefine float @test_fcmp_ult_fadd_select_constant(float %in) { 425ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_constant( 426ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 427ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp oge float [[IN]], 0.000000e+00 428ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 429ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 430ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 431ef2d6dafSRajat Bajpai; 432ef2d6dafSRajat Bajpai %cmp1 = fcmp ult float %in, 0.000000e+00 433ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 434ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 435ef2d6dafSRajat Bajpai ret float %sel 436ef2d6dafSRajat Bajpai} 437ef2d6dafSRajat Bajpai 438ef2d6dafSRajat Bajpaidefine float @test_fcmp_ult_fadd_select_constant_swapped(float %in) { 439ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_constant_swapped( 440ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 441ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp oge float [[IN]], 0.000000e+00 442*76a4c459SRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float [[IN]], float 0.000000e+00 443ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 444ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 445ef2d6dafSRajat Bajpai; 446ef2d6dafSRajat Bajpai %cmp1 = fcmp ult float %in, 0.000000e+00 447ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 448ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add 449ef2d6dafSRajat Bajpai ret float %sel 450ef2d6dafSRajat Bajpai} 451ef2d6dafSRajat Bajpai 452ef2d6dafSRajat Bajpaidefine float @test_fcmp_ult_fadd_select_neg_constant(float %in) { 453ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_neg_constant( 454ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 455ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp oge float [[IN]], 0.000000e+00 456ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 457ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 458ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 459ef2d6dafSRajat Bajpai; 460ef2d6dafSRajat Bajpai %cmp1 = fcmp ult float %in, -0.000000e+00 461ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 462ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 463ef2d6dafSRajat Bajpai ret float %sel 464ef2d6dafSRajat Bajpai} 465ef2d6dafSRajat Bajpai 466ef2d6dafSRajat Bajpaidefine float @test_fcmp_ult_fadd_select_fastmath_preserve(float %in) { 467ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ult_fadd_select_fastmath_preserve( 468ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 469ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp oge float [[IN]], 0.000000e+00 470ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 471ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 472ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 473ef2d6dafSRajat Bajpai; 474ef2d6dafSRajat Bajpai %cmp1 = fcmp ult float %in, 0.000000e+00 475ef2d6dafSRajat Bajpai %add = fadd nnan float %in, 1.000000e+00 476ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 477ef2d6dafSRajat Bajpai ret float %sel 478ef2d6dafSRajat Bajpai} 479ef2d6dafSRajat Bajpai 480ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ult_fadd_select_constant_vectors(<2 x float> %in) { 481ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ult_fadd_select_constant_vectors( 482ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) { 483ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp oge <2 x float> [[IN]], zeroinitializer 484ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select <2 x i1> [[CMP1_INV]], <2 x float> zeroinitializer, <2 x float> [[IN]] 485bf1c86ceSMatt Arsenault; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00) 486ef2d6dafSRajat Bajpai; CHECK-NEXT: ret <2 x float> [[ADD_NEW]] 487ef2d6dafSRajat Bajpai; 488ef2d6dafSRajat Bajpai %cmp1 = fcmp ult <2 x float> %in, <float 0.000000e+00, float 0.000000e+00> 489ef2d6dafSRajat Bajpai %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00> 490ef2d6dafSRajat Bajpai %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00> 491ef2d6dafSRajat Bajpai ret <2 x float> %sel 492ef2d6dafSRajat Bajpai} 493ef2d6dafSRajat Bajpai 494ef2d6dafSRajat Bajpai 495ef2d6dafSRajat Bajpai; fcmp ULE + fadd + sel => fcmp ULE + sel => fcmp OGT + sel 496ef2d6dafSRajat Bajpai 497ef2d6dafSRajat Bajpaidefine float @test_fcmp_ule_fadd_select_constant(float %in) { 498ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_constant( 499ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 500ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ogt float [[IN]], 0.000000e+00 501ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 502ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 503ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 504ef2d6dafSRajat Bajpai; 505ef2d6dafSRajat Bajpai %cmp1 = fcmp ule float %in, 0.000000e+00 506ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 507ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 508ef2d6dafSRajat Bajpai ret float %sel 509ef2d6dafSRajat Bajpai} 510ef2d6dafSRajat Bajpai 511ef2d6dafSRajat Bajpaidefine float @test_fcmp_ule_fadd_select_constant_swapped(float %in) { 512ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_constant_swapped( 513ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 514ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ogt float [[IN]], 0.000000e+00 515*76a4c459SRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float [[IN]], float 0.000000e+00 516ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 517ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 518ef2d6dafSRajat Bajpai; 519ef2d6dafSRajat Bajpai %cmp1 = fcmp ule float %in, 0.000000e+00 520ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 521ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float 1.000000e+00, float %add 522ef2d6dafSRajat Bajpai ret float %sel 523ef2d6dafSRajat Bajpai} 524ef2d6dafSRajat Bajpai 525ef2d6dafSRajat Bajpaidefine float @test_fcmp_ule_fadd_select_neg_constant(float %in) { 526ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_neg_constant( 527ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 528ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ogt float [[IN]], 0.000000e+00 529ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 530ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 531ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 532ef2d6dafSRajat Bajpai; 533ef2d6dafSRajat Bajpai %cmp1 = fcmp ule float %in, -0.000000e+00 534ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 535ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 536ef2d6dafSRajat Bajpai ret float %sel 537ef2d6dafSRajat Bajpai} 538ef2d6dafSRajat Bajpai 539ef2d6dafSRajat Bajpaidefine float @test_fcmp_ule_fadd_select_fastmath_preserve(float %in) { 540ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ule_fadd_select_fastmath_preserve( 541ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 542ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ogt float [[IN]], 0.000000e+00 543ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select i1 [[CMP1_INV]], float 0.000000e+00, float [[IN]] 544ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 545ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 546ef2d6dafSRajat Bajpai; 547ef2d6dafSRajat Bajpai %cmp1 = fcmp ule float %in, 0.000000e+00 548ef2d6dafSRajat Bajpai %add = fadd nnan float %in, 1.000000e+00 549ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 550ef2d6dafSRajat Bajpai ret float %sel 551ef2d6dafSRajat Bajpai} 552ef2d6dafSRajat Bajpai 553ef2d6dafSRajat Bajpaidefine <2 x float> @test_fcmp_ule_fadd_select_constant_vectors(<2 x float> %in) { 554ef2d6dafSRajat Bajpai; CHECK-LABEL: define <2 x float> @test_fcmp_ule_fadd_select_constant_vectors( 555ef2d6dafSRajat Bajpai; CHECK-SAME: <2 x float> [[IN:%.*]]) { 556ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1_INV:%.*]] = fcmp ogt <2 x float> [[IN]], zeroinitializer 557ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = select <2 x i1> [[CMP1_INV]], <2 x float> zeroinitializer, <2 x float> [[IN]] 558bf1c86ceSMatt Arsenault; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz <2 x float> [[SEL_NEW]], splat (float 1.000000e+00) 559ef2d6dafSRajat Bajpai; CHECK-NEXT: ret <2 x float> [[ADD_NEW]] 560ef2d6dafSRajat Bajpai; 561ef2d6dafSRajat Bajpai %cmp1 = fcmp ule <2 x float> %in, <float 0.000000e+00, float 0.000000e+00> 562ef2d6dafSRajat Bajpai %add = fadd <2 x float> %in, <float 1.000000e+00, float 1.000000e+00> 563ef2d6dafSRajat Bajpai %sel = select nnan nsz <2 x i1> %cmp1, <2 x float> %add, <2 x float> <float 1.000000e+00, float 1.000000e+00> 564ef2d6dafSRajat Bajpai ret <2 x float> %sel 565ef2d6dafSRajat Bajpai} 566ef2d6dafSRajat Bajpai 567ef2d6dafSRajat Bajpai 568ef2d6dafSRajat Bajpai; Negative scenarios 569ef2d6dafSRajat Bajpai 570ef2d6dafSRajat Bajpai; select instruction doesn't give nnan and nsz guarantees. 571ef2d6dafSRajat Bajpaidefine float @test_select_without_nnan_nsz(float %in) { 572ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_select_without_nnan_nsz( 573ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 574ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt float [[IN]], 0.000000e+00 575ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00 576ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], float [[ADD]], float 1.000000e+00 577ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[SEL]] 578ef2d6dafSRajat Bajpai; 579ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, 0.000000e+00 580ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 581ef2d6dafSRajat Bajpai %sel = select i1 %cmp1, float %add, float 1.000000e+00 582ef2d6dafSRajat Bajpai ret float %sel 583ef2d6dafSRajat Bajpai} 584ef2d6dafSRajat Bajpai 585ef2d6dafSRajat Bajpai; fcmp arg doesn't match with fadd's. This won't be converted to maxnum/minnum. 586ef2d6dafSRajat Bajpaidefine float @test_fcmp_fadd_arg_mismatch(float %in, float %in2) { 587ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_fadd_arg_mismatch( 588ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]], float [[IN2:%.*]]) { 589ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt float [[IN2]], 0.000000e+00 590ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00 591ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00 592ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[SEL]] 593ef2d6dafSRajat Bajpai; 594ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in2, 0.000000e+00 595ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 596ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 597ef2d6dafSRajat Bajpai ret float %sel 598ef2d6dafSRajat Bajpai} 599ef2d6dafSRajat Bajpai 600ef2d6dafSRajat Bajpai; It won't be converted to maxnum/minnum because constant arg in fcmp isn't zero. 601ef2d6dafSRajat Bajpaidefine float @test_fcmp_arg_non_zero(float %in) { 602ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_arg_non_zero( 603ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 604ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt float [[IN]], 1.000000e+00 605ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00 606ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00 607ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[SEL]] 608ef2d6dafSRajat Bajpai; 609ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, 1.000000e+00 610ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 611ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 612ef2d6dafSRajat Bajpai ret float %sel 613ef2d6dafSRajat Bajpai} 614ef2d6dafSRajat Bajpai 615ef2d6dafSRajat Bajpai; fcmp has more than one use. 616ef2d6dafSRajat Bajpaidefine float @test_fcmp_multiple_uses(float %in) { 617ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_multiple_uses( 618ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 619ef2d6dafSRajat Bajpai; CHECK-NEXT: [[CMP1:%.*]] = fcmp ogt float [[IN]], 0.000000e+00 620ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD:%.*]] = fadd float [[IN]], 1.000000e+00 621ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_2:%.*]] = fadd float [[IN]], 1.000000e+00 622ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_1:%.*]] = select nnan nsz i1 [[CMP1]], float [[ADD]], float 1.000000e+00 623ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_2:%.*]] = select nnan nsz i1 [[CMP1]], float 2.000000e+00, float [[ADD_2]] 624ef2d6dafSRajat Bajpai; CHECK-NEXT: [[RES:%.*]] = fadd float [[SEL_1]], [[SEL_2]] 625ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[RES]] 626ef2d6dafSRajat Bajpai; 627ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, 0.000000e+00 628ef2d6dafSRajat Bajpai %add = fadd float %in, 1.000000e+00 629ef2d6dafSRajat Bajpai %add.2 = fadd float %in, 1.000000e+00 630ef2d6dafSRajat Bajpai %sel.1 = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 631ef2d6dafSRajat Bajpai %sel.2 = select nnan nsz i1 %cmp1, float 2.000000e+00, float %add.2 632ef2d6dafSRajat Bajpai %res = fadd float %sel.1, %sel.2 633ef2d6dafSRajat Bajpai ret float %res 634ef2d6dafSRajat Bajpai} 635ef2d6dafSRajat Bajpai 636ef2d6dafSRajat Bajpai; Rewrite-based flags propagation 637ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_rewrite_flags1(float %in) { 638ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_flags1( 639ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 640de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call reassoc nsz arcp contract afn float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 641ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd reassoc nnan nsz arcp contract afn float [[SEL_NEW]], 1.000000e+00 642ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 643ef2d6dafSRajat Bajpai; 644ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, 0.000000e+00 645ef2d6dafSRajat Bajpai %add = fadd reassoc afn arcp contract float %in, 1.000000e+00 646ef2d6dafSRajat Bajpai %sel = select nnan nsz reassoc afn arcp contract i1 %cmp1, float %add, float 1.000000e+00 647ef2d6dafSRajat Bajpai ret float %sel 648ef2d6dafSRajat Bajpai} 649ef2d6dafSRajat Bajpai 650ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_rewrite_flags2(float %in) { 651ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_flags2( 652ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 653de415fbbSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call nsz float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 654ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd nnan nsz float [[SEL_NEW]], 1.000000e+00 655ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 656ef2d6dafSRajat Bajpai; 657ef2d6dafSRajat Bajpai %cmp1 = fcmp ogt float %in, 0.000000e+00 658ef2d6dafSRajat Bajpai %add = fadd reassoc float %in, 1.000000e+00 659ef2d6dafSRajat Bajpai %sel = select nnan nsz i1 %cmp1, float %add, float 1.000000e+00 660ef2d6dafSRajat Bajpai ret float %sel 661ef2d6dafSRajat Bajpai} 662ef2d6dafSRajat Bajpai 663ef2d6dafSRajat Bajpaidefine float @test_fcmp_ogt_fadd_select_rewrite_and_fastmath(float %in) { 664ef2d6dafSRajat Bajpai; CHECK-LABEL: define float @test_fcmp_ogt_fadd_select_rewrite_and_fastmath( 665ef2d6dafSRajat Bajpai; CHECK-SAME: float [[IN:%.*]]) { 666ef2d6dafSRajat Bajpai; CHECK-NEXT: [[SEL_NEW:%.*]] = call fast float @llvm.maxnum.f32(float [[IN]], float 0.000000e+00) 667ef2d6dafSRajat Bajpai; CHECK-NEXT: [[ADD_NEW:%.*]] = fadd fast float [[SEL_NEW]], 1.000000e+00 668ef2d6dafSRajat Bajpai; CHECK-NEXT: ret float [[ADD_NEW]] 669ef2d6dafSRajat Bajpai; 670de415fbbSRajat Bajpai %cmp1 = fcmp nnan ogt float %in, 0.000000e+00 671ef2d6dafSRajat Bajpai %add = fadd fast reassoc float %in, 1.000000e+00 672ef2d6dafSRajat Bajpai %sel = select fast i1 %cmp1, float %add, float 1.000000e+00 673ef2d6dafSRajat Bajpai ret float %sel 674ef2d6dafSRajat Bajpai} 675