xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/sqrt.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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