1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine float @test1(float %x) nounwind readnone ssp { 4*9880d681SAndroid Build Coastguard Workerentry: 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1( 6*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fpext 7*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sqrt( 8*9880d681SAndroid Build Coastguard Worker; CHECK: sqrtf( 9*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fptrunc 10*9880d681SAndroid Build Coastguard Worker %conv = fpext float %x to double ; <double> [#uses=1] 11*9880d681SAndroid Build Coastguard Worker %call = tail call double @sqrt(double %conv) readnone nounwind ; <double> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker %conv1 = fptrunc double %call to float ; <float> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 14*9880d681SAndroid Build Coastguard Worker ret float %conv1 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; PR8096 18*9880d681SAndroid Build Coastguard Workerdefine float @test2(float %x) nounwind readnone ssp { 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fpext 22*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sqrt( 23*9880d681SAndroid Build Coastguard Worker; CHECK: sqrtf( 24*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fptrunc 25*9880d681SAndroid Build Coastguard Worker %conv = fpext float %x to double ; <double> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %call = tail call double @sqrt(double %conv) nounwind ; <double> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker %conv1 = fptrunc double %call to float ; <float> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 29*9880d681SAndroid Build Coastguard Worker ret float %conv1 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; rdar://9763193 33*9880d681SAndroid Build Coastguard Worker; Can't fold (fptrunc (sqrt (fpext x))) -> (sqrtf x) since there is another 34*9880d681SAndroid Build Coastguard Worker; use of sqrt result. 35*9880d681SAndroid Build Coastguard Workerdefine float @test3(float* %v) nounwind uwtable ssp { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 38*9880d681SAndroid Build Coastguard Worker; CHECK: sqrt( 39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sqrtf( 40*9880d681SAndroid Build Coastguard Worker; CHECK: fptrunc 41*9880d681SAndroid Build Coastguard Worker %arrayidx13 = getelementptr inbounds float, float* %v, i64 2 42*9880d681SAndroid Build Coastguard Worker %tmp14 = load float, float* %arrayidx13 43*9880d681SAndroid Build Coastguard Worker %mul18 = fmul float %tmp14, %tmp14 44*9880d681SAndroid Build Coastguard Worker %add19 = fadd float undef, %mul18 45*9880d681SAndroid Build Coastguard Worker %conv = fpext float %add19 to double 46*9880d681SAndroid Build Coastguard Worker %call34 = call double @sqrt(double %conv) readnone 47*9880d681SAndroid Build Coastguard Worker %call36 = call i32 (double) @foo(double %call34) nounwind 48*9880d681SAndroid Build Coastguard Worker %conv38 = fptrunc double %call34 to float 49*9880d681SAndroid Build Coastguard Worker ret float %conv38 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo(double) 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdeclare double @sqrt(double) readnone 55