1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 3*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.8.0" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(float %x, float %y) nounwind uwtable { 6*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 7*9880d681SAndroid Build Coastguard Worker %2 = call double @ceil(double %1) nounwind readnone 8*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 9*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %2, %3 10*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 11*9880d681SAndroid Build Coastguard Worker ret i32 %5 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %ceilf = call float @ceilf(float %x) 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %ceilf, %y 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(float %x, float %y) nounwind uwtable { 18*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 19*9880d681SAndroid Build Coastguard Worker %2 = call double @fabs(double %1) nounwind readnone 20*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 21*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %2, %3 22*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 23*9880d681SAndroid Build Coastguard Worker ret i32 %5 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %fabsf = call float @fabsf(float %x) 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %fabsf, %y 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(float %x, float %y) nounwind uwtable { 30*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 31*9880d681SAndroid Build Coastguard Worker %2 = call double @floor(double %1) nounwind readnone 32*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 33*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %2, %3 34*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 35*9880d681SAndroid Build Coastguard Worker ret i32 %5 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %floorf = call float @floorf(float %x) 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %floorf, %y 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(float %x, float %y) nounwind uwtable { 42*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 43*9880d681SAndroid Build Coastguard Worker %2 = call double @nearbyint(double %1) nounwind 44*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 45*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %2, %3 46*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 47*9880d681SAndroid Build Coastguard Worker ret i32 %5 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %nearbyintf = call float @nearbyintf(float %x) 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %nearbyintf, %y 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(float %x, float %y) nounwind uwtable { 54*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 55*9880d681SAndroid Build Coastguard Worker %2 = call double @rint(double %1) nounwind 56*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 57*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %2, %3 58*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 59*9880d681SAndroid Build Coastguard Worker ret i32 %5 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %rintf = call float @rintf(float %x) 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %rintf, %y 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(float %x, float %y) nounwind uwtable { 66*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 67*9880d681SAndroid Build Coastguard Worker %2 = call double @round(double %1) nounwind readnone 68*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 69*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %2, %3 70*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 71*9880d681SAndroid Build Coastguard Worker ret i32 %5 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %roundf = call float @roundf(float %x) 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %roundf, %y 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(float %x, float %y) nounwind uwtable { 78*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 79*9880d681SAndroid Build Coastguard Worker %2 = call double @trunc(double %1) nounwind 80*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 81*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %2, %3 82*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 83*9880d681SAndroid Build Coastguard Worker ret i32 %5 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %truncf = call float @truncf(float %x) 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %truncf, %y 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(float %x, float %y) nounwind uwtable { 90*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 91*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 92*9880d681SAndroid Build Coastguard Worker %3 = call double @ceil(double %2) nounwind readnone 93*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 94*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 95*9880d681SAndroid Build Coastguard Worker ret i32 %5 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %ceilf = call float @ceilf(float %x) 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %ceilf, %y 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(float %x, float %y) nounwind uwtable { 102*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 103*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 104*9880d681SAndroid Build Coastguard Worker %3 = call double @fabs(double %2) nounwind readnone 105*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 106*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 107*9880d681SAndroid Build Coastguard Worker ret i32 %5 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %fabsf = call float @fabsf(float %x) 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %fabsf, %y 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(float %x, float %y) nounwind uwtable { 114*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 115*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 116*9880d681SAndroid Build Coastguard Worker %3 = call double @floor(double %2) nounwind readnone 117*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 118*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 119*9880d681SAndroid Build Coastguard Worker ret i32 %5 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %floorf = call float @floorf(float %x) 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %floorf, %y 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(float %x, float %y) nounwind uwtable { 126*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 127*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 128*9880d681SAndroid Build Coastguard Worker %3 = call double @nearbyint(double %2) nounwind 129*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 130*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 131*9880d681SAndroid Build Coastguard Worker ret i32 %5 132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11( 133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %nearbyintf = call float @nearbyintf(float %x) 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %nearbyintf, %y 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(float %x, float %y) nounwind uwtable { 138*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 139*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 140*9880d681SAndroid Build Coastguard Worker %3 = call double @rint(double %2) nounwind 141*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 142*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 143*9880d681SAndroid Build Coastguard Worker ret i32 %5 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12( 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %rintf = call float @rintf(float %x) 146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %rintf, %y 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(float %x, float %y) nounwind uwtable { 150*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 151*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 152*9880d681SAndroid Build Coastguard Worker %3 = call double @round(double %2) nounwind readnone 153*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 154*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 155*9880d681SAndroid Build Coastguard Worker ret i32 %5 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13( 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %roundf = call float @roundf(float %x) 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %roundf, %y 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(float %x, float %y) nounwind uwtable { 162*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 163*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 164*9880d681SAndroid Build Coastguard Worker %3 = call double @trunc(double %2) nounwind 165*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 166*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 167*9880d681SAndroid Build Coastguard Worker ret i32 %5 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14( 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %truncf = call float @truncf(float %x) 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %truncf, %y 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(float %x, float %y, float %z) nounwind uwtable { 174*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 175*9880d681SAndroid Build Coastguard Worker %2 = fpext float %y to double 176*9880d681SAndroid Build Coastguard Worker %3 = call double @fmin(double %1, double %2) nounwind 177*9880d681SAndroid Build Coastguard Worker %4 = fpext float %z to double 178*9880d681SAndroid Build Coastguard Worker %5 = fcmp oeq double %3, %4 179*9880d681SAndroid Build Coastguard Worker %6 = zext i1 %5 to i32 180*9880d681SAndroid Build Coastguard Worker ret i32 %6 181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15( 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %fminf = call float @fminf(float %x, float %y) 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %fminf, %z 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(float %x, float %y, float %z) nounwind uwtable { 187*9880d681SAndroid Build Coastguard Worker %1 = fpext float %z to double 188*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 189*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 190*9880d681SAndroid Build Coastguard Worker %4 = call double @fmin(double %2, double %3) nounwind 191*9880d681SAndroid Build Coastguard Worker %5 = fcmp oeq double %1, %4 192*9880d681SAndroid Build Coastguard Worker %6 = zext i1 %5 to i32 193*9880d681SAndroid Build Coastguard Worker ret i32 %6 194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16( 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %fminf = call float @fminf(float %x, float %y) 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %fminf, %z 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdefine i32 @test17(float %x, float %y, float %z) nounwind uwtable { 200*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 201*9880d681SAndroid Build Coastguard Worker %2 = fpext float %y to double 202*9880d681SAndroid Build Coastguard Worker %3 = call double @fmax(double %1, double %2) nounwind 203*9880d681SAndroid Build Coastguard Worker %4 = fpext float %z to double 204*9880d681SAndroid Build Coastguard Worker %5 = fcmp oeq double %3, %4 205*9880d681SAndroid Build Coastguard Worker %6 = zext i1 %5 to i32 206*9880d681SAndroid Build Coastguard Worker ret i32 %6 207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17( 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %fmaxf = call float @fmaxf(float %x, float %y) 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %fmaxf, %z 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerdefine i32 @test18(float %x, float %y, float %z) nounwind uwtable { 213*9880d681SAndroid Build Coastguard Worker %1 = fpext float %z to double 214*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 215*9880d681SAndroid Build Coastguard Worker %3 = fpext float %y to double 216*9880d681SAndroid Build Coastguard Worker %4 = call double @fmax(double %2, double %3) nounwind 217*9880d681SAndroid Build Coastguard Worker %5 = fcmp oeq double %1, %4 218*9880d681SAndroid Build Coastguard Worker %6 = zext i1 %5 to i32 219*9880d681SAndroid Build Coastguard Worker ret i32 %6 220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18( 221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %fmaxf = call float @fmaxf(float %x, float %y) 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %fmaxf, %z 223*9880d681SAndroid Build Coastguard Worker} 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Workerdefine i32 @test19(float %x, float %y, float %z) nounwind uwtable { 226*9880d681SAndroid Build Coastguard Worker %1 = fpext float %x to double 227*9880d681SAndroid Build Coastguard Worker %2 = fpext float %y to double 228*9880d681SAndroid Build Coastguard Worker %3 = call double @copysign(double %1, double %2) nounwind 229*9880d681SAndroid Build Coastguard Worker %4 = fpext float %z to double 230*9880d681SAndroid Build Coastguard Worker %5 = fcmp oeq double %3, %4 231*9880d681SAndroid Build Coastguard Worker %6 = zext i1 %5 to i32 232*9880d681SAndroid Build Coastguard Worker ret i32 %6 233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19( 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %copysignf = call float @copysignf(float %x, float %y) 235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %copysignf, %z 236*9880d681SAndroid Build Coastguard Worker} 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerdefine i32 @test20(float %x, float %y) nounwind uwtable { 239*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 240*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 241*9880d681SAndroid Build Coastguard Worker %3 = call double @fmin(double 1.000000e+00, double %2) nounwind 242*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 243*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 244*9880d681SAndroid Build Coastguard Worker ret i32 %5 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20( 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %fminf = call float @fminf(float 1.000000e+00, float %x) 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oeq float %fminf, %y 248*9880d681SAndroid Build Coastguard Worker} 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerdefine i32 @test21(float %x, float %y) nounwind uwtable { 251*9880d681SAndroid Build Coastguard Worker %1 = fpext float %y to double 252*9880d681SAndroid Build Coastguard Worker %2 = fpext float %x to double 253*9880d681SAndroid Build Coastguard Worker %3 = call double @fmin(double 1.300000e+00, double %2) nounwind 254*9880d681SAndroid Build Coastguard Worker %4 = fcmp oeq double %1, %3 255*9880d681SAndroid Build Coastguard Worker %5 = zext i1 %4 to i32 256*9880d681SAndroid Build Coastguard Worker ret i32 %5 257*9880d681SAndroid Build Coastguard Worker; should not be changed to fminf as the constant would loose precision 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21( 259*9880d681SAndroid Build Coastguard Worker; CHECK: %3 = call double @fmin(double 1.300000e+00, double %2) 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerdeclare double @fabs(double) nounwind readnone 263*9880d681SAndroid Build Coastguard Workerdeclare double @ceil(double) nounwind readnone 264*9880d681SAndroid Build Coastguard Workerdeclare double @copysign(double, double) nounwind readnone 265*9880d681SAndroid Build Coastguard Workerdeclare double @floor(double) nounwind readnone 266*9880d681SAndroid Build Coastguard Workerdeclare double @nearbyint(double) nounwind readnone 267*9880d681SAndroid Build Coastguard Workerdeclare double @rint(double) nounwind readnone 268*9880d681SAndroid Build Coastguard Workerdeclare double @round(double) nounwind readnone 269*9880d681SAndroid Build Coastguard Workerdeclare double @trunc(double) nounwind readnone 270*9880d681SAndroid Build Coastguard Workerdeclare double @fmin(double, double) nounwind readnone 271*9880d681SAndroid Build Coastguard Workerdeclare double @fmax(double, double) nounwind readnone 272