1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fabs.f64(double) nounwind readnone 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i1 @test1(float %x, float %y) nounwind { 6*9880d681SAndroid Build Coastguard Worker %ext1 = fpext float %x to double 7*9880d681SAndroid Build Coastguard Worker %ext2 = fpext float %y to double 8*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt double %ext1, %ext2 9*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ogt float %x, %y 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i1 @test2(float %a) nounwind { 15*9880d681SAndroid Build Coastguard Worker %ext = fpext float %a to double 16*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt double %ext, 1.000000e+00 17*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ogt float %a, 1.0 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i1 @test3(float %a) nounwind { 23*9880d681SAndroid Build Coastguard Worker %ext = fpext float %a to double 24*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt double %ext, 0x3FF0000000000001 ; more precision than float. 25*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %a to double 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(float %a) nounwind { 31*9880d681SAndroid Build Coastguard Worker %ext = fpext float %a to double 32*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt double %ext, 0x36A0000000000000 ; denormal in float. 33*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %a to double 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i1 @test5(float %a) nounwind { 39*9880d681SAndroid Build Coastguard Worker %neg = fsub float -0.000000e+00, %a 40*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt float %neg, 1.000000e+00 41*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp olt float %a, -1.0 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i1 @test6(float %x, float %y) nounwind { 47*9880d681SAndroid Build Coastguard Worker %neg1 = fsub float -0.000000e+00, %x 48*9880d681SAndroid Build Coastguard Worker %neg2 = fsub float -0.000000e+00, %y 49*9880d681SAndroid Build Coastguard Worker %cmp = fcmp olt float %neg1, %neg2 50*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ogt float %x, %y 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine i1 @test7(float %x) nounwind readnone ssp noredzone { 56*9880d681SAndroid Build Coastguard Worker %ext = fpext float %x to ppc_fp128 57*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt ppc_fp128 %ext, 0xM00000000000000000000000000000000 58*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ogt float %x, 0.000000e+00 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine float @test8(float %x) nounwind readnone optsize ssp { 64*9880d681SAndroid Build Coastguard Worker %conv = fpext float %x to double 65*9880d681SAndroid Build Coastguard Worker %cmp = fcmp olt double %conv, 0.000000e+00 66*9880d681SAndroid Build Coastguard Worker %conv1 = zext i1 %cmp to i32 67*9880d681SAndroid Build Coastguard Worker %conv2 = sitofp i32 %conv1 to float 68*9880d681SAndroid Build Coastguard Worker ret float %conv2 69*9880d681SAndroid Build Coastguard Worker; Float comparison to zero shouldn't cast to double. 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp olt float %x, 0.000000e+00 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdeclare double @fabs(double) nounwind readnone 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(double %a) nounwind { 77*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %a) nounwind 78*9880d681SAndroid Build Coastguard Worker %cmp = fcmp olt double %call, 0.000000e+00 79*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 80*9880d681SAndroid Build Coastguard Worker ret i32 %conv 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 82*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 83*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdefine i32 @test9_intrinsic(double %a) nounwind { 87*9880d681SAndroid Build Coastguard Worker %call = tail call double @llvm.fabs.f64(double %a) nounwind 88*9880d681SAndroid Build Coastguard Worker %cmp = fcmp olt double %call, 0.000000e+00 89*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 90*9880d681SAndroid Build Coastguard Worker ret i32 %conv 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9_intrinsic( 92*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 93*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(double %a) nounwind { 97*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %a) nounwind 98*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ole double %call, 0.000000e+00 99*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 100*9880d681SAndroid Build Coastguard Worker ret i32 %conv 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 102*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 103*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq double %a, 0.000000e+00 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine i32 @test10_intrinsic(double %a) nounwind { 107*9880d681SAndroid Build Coastguard Worker %call = tail call double @llvm.fabs.f64(double %a) nounwind 108*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ole double %call, 0.000000e+00 109*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 110*9880d681SAndroid Build Coastguard Worker ret i32 %conv 111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10_intrinsic( 112*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 113*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq double %a, 0.000000e+00 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(double %a) nounwind { 117*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %a) nounwind 118*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt double %call, 0.000000e+00 119*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 120*9880d681SAndroid Build Coastguard Worker ret i32 %conv 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 122*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 123*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp one double %a, 0.000000e+00 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine i32 @test11_intrinsic(double %a) nounwind { 127*9880d681SAndroid Build Coastguard Worker %call = tail call double @llvm.fabs.f64(double %a) nounwind 128*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ogt double %call, 0.000000e+00 129*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 130*9880d681SAndroid Build Coastguard Worker ret i32 %conv 131*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11_intrinsic( 132*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 133*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp one double %a, 0.000000e+00 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(double %a) nounwind { 137*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %a) nounwind 138*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oge double %call, 0.000000e+00 139*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 140*9880d681SAndroid Build Coastguard Worker ret i32 %conv 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 142*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 143*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp ord double %a, 0.000000e+00 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine i32 @test12_intrinsic(double %a) nounwind { 147*9880d681SAndroid Build Coastguard Worker %call = tail call double @llvm.fabs.f64(double %a) nounwind 148*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oge double %call, 0.000000e+00 149*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 150*9880d681SAndroid Build Coastguard Worker ret i32 %conv 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12_intrinsic( 152*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 153*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp ord double %a, 0.000000e+00 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(double %a) nounwind { 157*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %a) nounwind 158*9880d681SAndroid Build Coastguard Worker %cmp = fcmp une double %call, 0.000000e+00 159*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 160*9880d681SAndroid Build Coastguard Worker ret i32 %conv 161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 162*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 163*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp une double %a, 0.000000e+00 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdefine i32 @test13_intrinsic(double %a) nounwind { 167*9880d681SAndroid Build Coastguard Worker %call = tail call double @llvm.fabs.f64(double %a) nounwind 168*9880d681SAndroid Build Coastguard Worker %cmp = fcmp une double %call, 0.000000e+00 169*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 170*9880d681SAndroid Build Coastguard Worker ret i32 %conv 171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13_intrinsic( 172*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 173*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp une double %a, 0.000000e+00 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(double %a) nounwind { 177*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %a) nounwind 178*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq double %call, 0.000000e+00 179*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 180*9880d681SAndroid Build Coastguard Worker ret i32 %conv 181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 182*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 183*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq double %a, 0.000000e+00 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine i32 @test14_intrinsic(double %a) nounwind { 187*9880d681SAndroid Build Coastguard Worker %call = tail call double @llvm.fabs.f64(double %a) nounwind 188*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq double %call, 0.000000e+00 189*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 190*9880d681SAndroid Build Coastguard Worker ret i32 %conv 191*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14_intrinsic( 192*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 193*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp oeq double %a, 0.000000e+00 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(double %a) nounwind { 197*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %a) nounwind 198*9880d681SAndroid Build Coastguard Worker %cmp = fcmp one double %call, 0.000000e+00 199*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 200*9880d681SAndroid Build Coastguard Worker ret i32 %conv 201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 202*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 203*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp one double %a, 0.000000e+00 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerdefine i32 @test15_intrinsic(double %a) nounwind { 207*9880d681SAndroid Build Coastguard Worker %call = tail call double @llvm.fabs.f64(double %a) nounwind 208*9880d681SAndroid Build Coastguard Worker %cmp = fcmp one double %call, 0.000000e+00 209*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 210*9880d681SAndroid Build Coastguard Worker ret i32 %conv 211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15_intrinsic( 212*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 213*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp one double %a, 0.000000e+00 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(double %a) nounwind { 217*9880d681SAndroid Build Coastguard Worker %call = tail call double @fabs(double %a) nounwind 218*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ueq double %call, 0.000000e+00 219*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 220*9880d681SAndroid Build Coastguard Worker ret i32 %conv 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 222*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 223*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp ueq double %a, 0.000000e+00 224*9880d681SAndroid Build Coastguard Worker} 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Workerdefine i32 @test16_intrinsic(double %a) nounwind { 227*9880d681SAndroid Build Coastguard Worker %call = tail call double @llvm.fabs.f64(double %a) nounwind 228*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ueq double %call, 0.000000e+00 229*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 230*9880d681SAndroid Build Coastguard Worker ret i32 %conv 231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16_intrinsic( 232*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fabs 233*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp ueq double %a, 0.000000e+00 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; Don't crash. 237*9880d681SAndroid Build Coastguard Workerdefine i32 @test17(double %a, double (double)* %p) nounwind { 238*9880d681SAndroid Build Coastguard Worker %call = tail call double %p(double %a) nounwind 239*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ueq double %call, 0.000000e+00 240*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 241*9880d681SAndroid Build Coastguard Worker ret i32 %conv 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker; Can fold fcmp with undef on one side by choosing NaN for the undef 245*9880d681SAndroid Build Coastguard Workerdefine i32 @test18_undef_unordered(float %a) nounwind { 246*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18_undef_unordered 247*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 1 248*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ueq float %a, undef 249*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 250*9880d681SAndroid Build Coastguard Worker ret i32 %conv 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker; Can fold fcmp with undef on one side by choosing NaN for the undef 253*9880d681SAndroid Build Coastguard Workerdefine i32 @test18_undef_ordered(float %a) nounwind { 254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18_undef_ordered 255*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 256*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq float %a, undef 257*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %cmp to i32 258*9880d681SAndroid Build Coastguard Worker ret i32 %conv 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker; Can fold fcmp with undef on both side 262*9880d681SAndroid Build Coastguard Worker; fcmp u_pred undef, undef -> true 263*9880d681SAndroid Build Coastguard Worker; fcmp o_pred undef, undef -> false 264*9880d681SAndroid Build Coastguard Worker; because whatever you choose for the first undef 265*9880d681SAndroid Build Coastguard Worker; you can choose NaN for the other undef 266*9880d681SAndroid Build Coastguard Workerdefine i1 @test19_undef_unordered() nounwind { 267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19_undef 268*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 269*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ueq float undef, undef 270*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 271*9880d681SAndroid Build Coastguard Worker} 272*9880d681SAndroid Build Coastguard Workerdefine i1 @test19_undef_ordered() nounwind { 273*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19_undef 274*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 275*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq float undef, undef 276*9880d681SAndroid Build Coastguard Worker ret i1 %cmp 277*9880d681SAndroid Build Coastguard Worker} 278