1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -constprop -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -constprop -disable-simplify-libcalls -S | FileCheck %s --check-prefix=FNOBUILTIN 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare double @acos(double) 5*9880d681SAndroid Build Coastguard Workerdeclare double @asin(double) 6*9880d681SAndroid Build Coastguard Workerdeclare double @atan(double) 7*9880d681SAndroid Build Coastguard Workerdeclare double @atan2(double, double) 8*9880d681SAndroid Build Coastguard Workerdeclare double @ceil(double) 9*9880d681SAndroid Build Coastguard Workerdeclare double @cos(double) 10*9880d681SAndroid Build Coastguard Workerdeclare double @cosh(double) 11*9880d681SAndroid Build Coastguard Workerdeclare double @exp(double) 12*9880d681SAndroid Build Coastguard Workerdeclare double @exp2(double) 13*9880d681SAndroid Build Coastguard Workerdeclare double @fabs(double) 14*9880d681SAndroid Build Coastguard Workerdeclare double @floor(double) 15*9880d681SAndroid Build Coastguard Workerdeclare double @fmod(double, double) 16*9880d681SAndroid Build Coastguard Workerdeclare double @log(double) 17*9880d681SAndroid Build Coastguard Workerdeclare double @log10(double) 18*9880d681SAndroid Build Coastguard Workerdeclare double @pow(double, double) 19*9880d681SAndroid Build Coastguard Workerdeclare double @sin(double) 20*9880d681SAndroid Build Coastguard Workerdeclare double @sinh(double) 21*9880d681SAndroid Build Coastguard Workerdeclare double @sqrt(double) 22*9880d681SAndroid Build Coastguard Workerdeclare double @tan(double) 23*9880d681SAndroid Build Coastguard Workerdeclare double @tanh(double) 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdeclare float @acosf(float) 26*9880d681SAndroid Build Coastguard Workerdeclare float @asinf(float) 27*9880d681SAndroid Build Coastguard Workerdeclare float @atanf(float) 28*9880d681SAndroid Build Coastguard Workerdeclare float @atan2f(float, float) 29*9880d681SAndroid Build Coastguard Workerdeclare float @ceilf(float) 30*9880d681SAndroid Build Coastguard Workerdeclare float @cosf(float) 31*9880d681SAndroid Build Coastguard Workerdeclare float @coshf(float) 32*9880d681SAndroid Build Coastguard Workerdeclare float @expf(float) 33*9880d681SAndroid Build Coastguard Workerdeclare float @exp2f(float) 34*9880d681SAndroid Build Coastguard Workerdeclare float @fabsf(float) 35*9880d681SAndroid Build Coastguard Workerdeclare float @floorf(float) 36*9880d681SAndroid Build Coastguard Workerdeclare float @fmodf(float, float) 37*9880d681SAndroid Build Coastguard Workerdeclare float @logf(float) 38*9880d681SAndroid Build Coastguard Workerdeclare float @log10f(float) 39*9880d681SAndroid Build Coastguard Workerdeclare float @powf(float, float) 40*9880d681SAndroid Build Coastguard Workerdeclare float @sinf(float) 41*9880d681SAndroid Build Coastguard Workerdeclare float @sinhf(float) 42*9880d681SAndroid Build Coastguard Workerdeclare float @sqrtf(float) 43*9880d681SAndroid Build Coastguard Workerdeclare float @tanf(float) 44*9880d681SAndroid Build Coastguard Workerdeclare float @tanhf(float) 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine double @T() { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @T( 48*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN-LABEL: @T( 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call 51*9880d681SAndroid Build Coastguard Worker; CHECK: ret 52*9880d681SAndroid Build Coastguard Worker %A = call double @cos(double 0.000000e+00) 53*9880d681SAndroid Build Coastguard Worker %B = call double @sin(double 0.000000e+00) 54*9880d681SAndroid Build Coastguard Worker %a = fadd double %A, %B 55*9880d681SAndroid Build Coastguard Worker %C = call double @tan(double 0.000000e+00) 56*9880d681SAndroid Build Coastguard Worker %b = fadd double %a, %C 57*9880d681SAndroid Build Coastguard Worker %D = call double @sqrt(double 4.000000e+00) 58*9880d681SAndroid Build Coastguard Worker %c = fadd double %b, %D 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker %slot = alloca double 61*9880d681SAndroid Build Coastguard Worker %slotf = alloca float 62*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 63*9880d681SAndroid Build Coastguard Worker %1 = call double @acos(double 1.000000e+00) 64*9880d681SAndroid Build Coastguard Worker store double %1, double* %slot 65*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 66*9880d681SAndroid Build Coastguard Worker %2 = call double @asin(double 1.000000e+00) 67*9880d681SAndroid Build Coastguard Worker store double %2, double* %slot 68*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 69*9880d681SAndroid Build Coastguard Worker %3 = call double @atan(double 3.000000e+00) 70*9880d681SAndroid Build Coastguard Worker store double %3, double* %slot 71*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 72*9880d681SAndroid Build Coastguard Worker %4 = call double @atan2(double 3.000000e+00, double 4.000000e+00) 73*9880d681SAndroid Build Coastguard Worker store double %4, double* %slot 74*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 75*9880d681SAndroid Build Coastguard Worker %5 = call double @ceil(double 3.000000e+00) 76*9880d681SAndroid Build Coastguard Worker store double %5, double* %slot 77*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 78*9880d681SAndroid Build Coastguard Worker %6 = call double @cosh(double 3.000000e+00) 79*9880d681SAndroid Build Coastguard Worker store double %6, double* %slot 80*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 81*9880d681SAndroid Build Coastguard Worker %7 = call double @exp(double 3.000000e+00) 82*9880d681SAndroid Build Coastguard Worker store double %7, double* %slot 83*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 84*9880d681SAndroid Build Coastguard Worker %8 = call double @exp2(double 3.000000e+00) 85*9880d681SAndroid Build Coastguard Worker store double %8, double* %slot 86*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 87*9880d681SAndroid Build Coastguard Worker %9 = call double @fabs(double 3.000000e+00) 88*9880d681SAndroid Build Coastguard Worker store double %9, double* %slot 89*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 90*9880d681SAndroid Build Coastguard Worker %10 = call double @floor(double 3.000000e+00) 91*9880d681SAndroid Build Coastguard Worker store double %10, double* %slot 92*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 93*9880d681SAndroid Build Coastguard Worker %11 = call double @fmod(double 3.000000e+00, double 4.000000e+00) 94*9880d681SAndroid Build Coastguard Worker store double %11, double* %slot 95*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 96*9880d681SAndroid Build Coastguard Worker %12 = call double @log(double 3.000000e+00) 97*9880d681SAndroid Build Coastguard Worker store double %12, double* %slot 98*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 99*9880d681SAndroid Build Coastguard Worker %13 = call double @log10(double 3.000000e+00) 100*9880d681SAndroid Build Coastguard Worker store double %13, double* %slot 101*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 102*9880d681SAndroid Build Coastguard Worker %14 = call double @pow(double 3.000000e+00, double 4.000000e+00) 103*9880d681SAndroid Build Coastguard Worker store double %14, double* %slot 104*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 105*9880d681SAndroid Build Coastguard Worker %15 = call double @sinh(double 3.000000e+00) 106*9880d681SAndroid Build Coastguard Worker store double %15, double* %slot 107*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 108*9880d681SAndroid Build Coastguard Worker %16 = call double @tanh(double 3.000000e+00) 109*9880d681SAndroid Build Coastguard Worker store double %16, double* %slot 110*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 111*9880d681SAndroid Build Coastguard Worker %17 = call float @acosf(float 1.000000e+00) 112*9880d681SAndroid Build Coastguard Worker store float %17, float* %slotf 113*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 114*9880d681SAndroid Build Coastguard Worker %18 = call float @asinf(float 1.000000e+00) 115*9880d681SAndroid Build Coastguard Worker store float %18, float* %slotf 116*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 117*9880d681SAndroid Build Coastguard Worker %19 = call float @atanf(float 3.000000e+00) 118*9880d681SAndroid Build Coastguard Worker store float %19, float* %slotf 119*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 120*9880d681SAndroid Build Coastguard Worker %20 = call float @atan2f(float 3.000000e+00, float 4.000000e+00) 121*9880d681SAndroid Build Coastguard Worker store float %20, float* %slotf 122*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 123*9880d681SAndroid Build Coastguard Worker %21 = call float @ceilf(float 3.000000e+00) 124*9880d681SAndroid Build Coastguard Worker store float %21, float* %slotf 125*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 126*9880d681SAndroid Build Coastguard Worker %22 = call float @cosf(float 3.000000e+00) 127*9880d681SAndroid Build Coastguard Worker store float %22, float* %slotf 128*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 129*9880d681SAndroid Build Coastguard Worker %23 = call float @coshf(float 3.000000e+00) 130*9880d681SAndroid Build Coastguard Worker store float %23, float* %slotf 131*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 132*9880d681SAndroid Build Coastguard Worker %24 = call float @expf(float 3.000000e+00) 133*9880d681SAndroid Build Coastguard Worker store float %24, float* %slotf 134*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 135*9880d681SAndroid Build Coastguard Worker %25 = call float @exp2f(float 3.000000e+00) 136*9880d681SAndroid Build Coastguard Worker store float %25, float* %slotf 137*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 138*9880d681SAndroid Build Coastguard Worker %26 = call float @fabsf(float 3.000000e+00) 139*9880d681SAndroid Build Coastguard Worker store float %26, float* %slotf 140*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 141*9880d681SAndroid Build Coastguard Worker %27 = call float @floorf(float 3.000000e+00) 142*9880d681SAndroid Build Coastguard Worker store float %27, float* %slotf 143*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 144*9880d681SAndroid Build Coastguard Worker %28 = call float @fmodf(float 3.000000e+00, float 4.000000e+00) 145*9880d681SAndroid Build Coastguard Worker store float %28, float* %slotf 146*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 147*9880d681SAndroid Build Coastguard Worker %29 = call float @logf(float 3.000000e+00) 148*9880d681SAndroid Build Coastguard Worker store float %29, float* %slotf 149*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 150*9880d681SAndroid Build Coastguard Worker %30 = call float @log10f(float 3.000000e+00) 151*9880d681SAndroid Build Coastguard Worker store float %30, float* %slotf 152*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 153*9880d681SAndroid Build Coastguard Worker %31 = call float @powf(float 3.000000e+00, float 4.000000e+00) 154*9880d681SAndroid Build Coastguard Worker store float %31, float* %slotf 155*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 156*9880d681SAndroid Build Coastguard Worker %32 = call float @sinf(float 3.000000e+00) 157*9880d681SAndroid Build Coastguard Worker store float %32, float* %slotf 158*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 159*9880d681SAndroid Build Coastguard Worker %33 = call float @sinhf(float 3.000000e+00) 160*9880d681SAndroid Build Coastguard Worker store float %33, float* %slotf 161*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 162*9880d681SAndroid Build Coastguard Worker %34 = call float @sqrtf(float 3.000000e+00) 163*9880d681SAndroid Build Coastguard Worker store float %34, float* %slotf 164*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 165*9880d681SAndroid Build Coastguard Worker %35 = call float @tanf(float 3.000000e+00) 166*9880d681SAndroid Build Coastguard Worker store float %35, float* %slotf 167*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: call 168*9880d681SAndroid Build Coastguard Worker %36 = call float @tanhf(float 3.000000e+00) 169*9880d681SAndroid Build Coastguard Worker store float %36, float* %slotf 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; FNOBUILTIN: ret 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker ; PR9315 174*9880d681SAndroid Build Coastguard Worker %E = call double @exp2(double 4.0) 175*9880d681SAndroid Build Coastguard Worker %d = fadd double %c, %E 176*9880d681SAndroid Build Coastguard Worker ret double %d 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvts_exact() nounwind readnone { 180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvts_exact( 181*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call 182*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 183*9880d681SAndroid Build Coastguard Workerentry: 184*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind 185*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind 186*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 7.0, double undef>) nounwind 187*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 7.0, double undef>) nounwind 188*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 189*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 190*9880d681SAndroid Build Coastguard Worker %cmp02 = icmp eq i32 %sum02, 10 191*9880d681SAndroid Build Coastguard Worker %cmp13 = icmp eq i64 %sum13, 10 192*9880d681SAndroid Build Coastguard Worker %b = and i1 %cmp02, %cmp13 193*9880d681SAndroid Build Coastguard Worker ret i1 %b 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker; TODO: Inexact values should not fold as they are dependent on rounding mode 197*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvts_inexact() nounwind readnone { 198*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvts_inexact( 199*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call 200*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 201*9880d681SAndroid Build Coastguard Workerentry: 202*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind 203*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind 204*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 1.75, double undef>) nounwind 205*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 1.75, double undef>) nounwind 206*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 207*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 208*9880d681SAndroid Build Coastguard Worker %cmp02 = icmp eq i32 %sum02, 4 209*9880d681SAndroid Build Coastguard Worker %cmp13 = icmp eq i64 %sum13, 4 210*9880d681SAndroid Build Coastguard Worker %b = and i1 %cmp02, %cmp13 211*9880d681SAndroid Build Coastguard Worker ret i1 %b 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker; FLT_MAX/DBL_MAX should not fold 215*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvts_max() nounwind readnone { 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvts_max( 217*9880d681SAndroid Build Coastguard Worker; CHECK: call 218*9880d681SAndroid Build Coastguard Worker; CHECK: call 219*9880d681SAndroid Build Coastguard Worker; CHECK: call 220*9880d681SAndroid Build Coastguard Worker; CHECK: call 221*9880d681SAndroid Build Coastguard Workerentry: 222*9880d681SAndroid Build Coastguard Worker %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float> 223*9880d681SAndroid Build Coastguard Worker %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double> 224*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind 225*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind 226*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind 227*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind 228*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 229*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 230*9880d681SAndroid Build Coastguard Worker %sum02.sext = sext i32 %sum02 to i64 231*9880d681SAndroid Build Coastguard Worker %b = icmp eq i64 %sum02.sext, %sum13 232*9880d681SAndroid Build Coastguard Worker ret i1 %b 233*9880d681SAndroid Build Coastguard Worker} 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker; INF should not fold 236*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvts_inf() nounwind readnone { 237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvts_inf( 238*9880d681SAndroid Build Coastguard Worker; CHECK: call 239*9880d681SAndroid Build Coastguard Worker; CHECK: call 240*9880d681SAndroid Build Coastguard Worker; CHECK: call 241*9880d681SAndroid Build Coastguard Worker; CHECK: call 242*9880d681SAndroid Build Coastguard Workerentry: 243*9880d681SAndroid Build Coastguard Worker %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float> 244*9880d681SAndroid Build Coastguard Worker %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double> 245*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind 246*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind 247*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind 248*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind 249*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 250*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 251*9880d681SAndroid Build Coastguard Worker %sum02.sext = sext i32 %sum02 to i64 252*9880d681SAndroid Build Coastguard Worker %b = icmp eq i64 %sum02.sext, %sum13 253*9880d681SAndroid Build Coastguard Worker ret i1 %b 254*9880d681SAndroid Build Coastguard Worker} 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker; NAN should not fold 257*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvts_nan() nounwind readnone { 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvts_nan( 259*9880d681SAndroid Build Coastguard Worker; CHECK: call 260*9880d681SAndroid Build Coastguard Worker; CHECK: call 261*9880d681SAndroid Build Coastguard Worker; CHECK: call 262*9880d681SAndroid Build Coastguard Worker; CHECK: call 263*9880d681SAndroid Build Coastguard Workerentry: 264*9880d681SAndroid Build Coastguard Worker %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float> 265*9880d681SAndroid Build Coastguard Worker %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double> 266*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind 267*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind 268*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind 269*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind 270*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 271*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 272*9880d681SAndroid Build Coastguard Worker %sum02.sext = sext i32 %sum02 to i64 273*9880d681SAndroid Build Coastguard Worker %b = icmp eq i64 %sum02.sext, %sum13 274*9880d681SAndroid Build Coastguard Worker ret i1 %b 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvtts_exact() nounwind readnone { 278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvtts_exact( 279*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call 280*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 281*9880d681SAndroid Build Coastguard Workerentry: 282*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind 283*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind 284*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 7.0, double undef>) nounwind 285*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 7.0, double undef>) nounwind 286*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 287*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 288*9880d681SAndroid Build Coastguard Worker %cmp02 = icmp eq i32 %sum02, 10 289*9880d681SAndroid Build Coastguard Worker %cmp13 = icmp eq i64 %sum13, 10 290*9880d681SAndroid Build Coastguard Worker %b = and i1 %cmp02, %cmp13 291*9880d681SAndroid Build Coastguard Worker ret i1 %b 292*9880d681SAndroid Build Coastguard Worker} 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvtts_inexact() nounwind readnone { 295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvtts_inexact( 296*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call 297*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 true 298*9880d681SAndroid Build Coastguard Workerentry: 299*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind 300*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind 301*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 1.75, double undef>) nounwind 302*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 1.75, double undef>) nounwind 303*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 304*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 305*9880d681SAndroid Build Coastguard Worker %cmp02 = icmp eq i32 %sum02, 2 306*9880d681SAndroid Build Coastguard Worker %cmp13 = icmp eq i64 %sum13, 2 307*9880d681SAndroid Build Coastguard Worker %b = and i1 %cmp02, %cmp13 308*9880d681SAndroid Build Coastguard Worker ret i1 %b 309*9880d681SAndroid Build Coastguard Worker} 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker; FLT_MAX/DBL_MAX should not fold 312*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvtts_max() nounwind readnone { 313*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvtts_max( 314*9880d681SAndroid Build Coastguard Worker; CHECK: call 315*9880d681SAndroid Build Coastguard Worker; CHECK: call 316*9880d681SAndroid Build Coastguard Worker; CHECK: call 317*9880d681SAndroid Build Coastguard Worker; CHECK: call 318*9880d681SAndroid Build Coastguard Workerentry: 319*9880d681SAndroid Build Coastguard Worker %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float> 320*9880d681SAndroid Build Coastguard Worker %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double> 321*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind 322*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind 323*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind 324*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind 325*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 326*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 327*9880d681SAndroid Build Coastguard Worker %sum02.sext = sext i32 %sum02 to i64 328*9880d681SAndroid Build Coastguard Worker %b = icmp eq i64 %sum02.sext, %sum13 329*9880d681SAndroid Build Coastguard Worker ret i1 %b 330*9880d681SAndroid Build Coastguard Worker} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Worker; INF should not fold 333*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvtts_inf() nounwind readnone { 334*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvtts_inf( 335*9880d681SAndroid Build Coastguard Worker; CHECK: call 336*9880d681SAndroid Build Coastguard Worker; CHECK: call 337*9880d681SAndroid Build Coastguard Worker; CHECK: call 338*9880d681SAndroid Build Coastguard Worker; CHECK: call 339*9880d681SAndroid Build Coastguard Workerentry: 340*9880d681SAndroid Build Coastguard Worker %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float> 341*9880d681SAndroid Build Coastguard Worker %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double> 342*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind 343*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind 344*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind 345*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind 346*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 347*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 348*9880d681SAndroid Build Coastguard Worker %sum02.sext = sext i32 %sum02 to i64 349*9880d681SAndroid Build Coastguard Worker %b = icmp eq i64 %sum02.sext, %sum13 350*9880d681SAndroid Build Coastguard Worker ret i1 %b 351*9880d681SAndroid Build Coastguard Worker} 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker; NAN should not fold 354*9880d681SAndroid Build Coastguard Workerdefine i1 @test_sse_cvtts_nan() nounwind readnone { 355*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_sse_cvtts_nan( 356*9880d681SAndroid Build Coastguard Worker; CHECK: call 357*9880d681SAndroid Build Coastguard Worker; CHECK: call 358*9880d681SAndroid Build Coastguard Worker; CHECK: call 359*9880d681SAndroid Build Coastguard Worker; CHECK: call 360*9880d681SAndroid Build Coastguard Workerentry: 361*9880d681SAndroid Build Coastguard Worker %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float> 362*9880d681SAndroid Build Coastguard Worker %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double> 363*9880d681SAndroid Build Coastguard Worker %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind 364*9880d681SAndroid Build Coastguard Worker %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind 365*9880d681SAndroid Build Coastguard Worker %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind 366*9880d681SAndroid Build Coastguard Worker %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind 367*9880d681SAndroid Build Coastguard Worker %sum02 = add i32 %i0, %i2 368*9880d681SAndroid Build Coastguard Worker %sum13 = add i64 %i1, %i3 369*9880d681SAndroid Build Coastguard Worker %sum02.sext = sext i32 %sum02 to i64 370*9880d681SAndroid Build Coastguard Worker %b = icmp eq i64 %sum02.sext, %sum13 371*9880d681SAndroid Build Coastguard Worker ret i1 %b 372*9880d681SAndroid Build Coastguard Worker} 373*9880d681SAndroid Build Coastguard Worker 374*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.sse.cvtss2si(<4 x float>) nounwind readnone 375*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.sse.cvttss2si(<4 x float>) nounwind readnone 376*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone 377*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone 378*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone 379*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>) nounwind readnone 380*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone 381*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Workerdefine double @test_intrinsic_pow() nounwind uwtable ssp { 384*9880d681SAndroid Build Coastguard Workerentry: 385*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_intrinsic_pow( 386*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call 387*9880d681SAndroid Build Coastguard Worker; CHECK: ret 388*9880d681SAndroid Build Coastguard Worker %0 = call double @llvm.pow.f64(double 1.500000e+00, double 3.000000e+00) 389*9880d681SAndroid Build Coastguard Worker ret double %0 390*9880d681SAndroid Build Coastguard Worker} 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.pow.f64(double, double) nounwind readonly 393