Merging r259236:
[oota-llvm.git] / test / Transforms / SimplifyCFG / speculate-math.ll
1 ; RUN: opt -S -simplifycfg < %s | FileCheck %s --check-prefix=EXPENSIVE --check-prefix=ALL
2 ; RUN: opt -S -simplifycfg -speculate-one-expensive-inst=false < %s | FileCheck %s --check-prefix=CHEAP --check-prefix=ALL
3
4 declare float @llvm.sqrt.f32(float) nounwind readonly
5 declare float @llvm.fma.f32(float, float, float) nounwind readonly
6 declare float @llvm.fmuladd.f32(float, float, float) nounwind readonly
7 declare float @llvm.fabs.f32(float) nounwind readonly
8 declare float @llvm.minnum.f32(float, float) nounwind readonly
9 declare float @llvm.maxnum.f32(float, float) nounwind readonly
10
11 ; ALL-LABEL: @fdiv_test(
12 ; EXPENSIVE: select i1 %cmp, double %div, double 0.0
13 ; CHEAP-NOT: select
14
15 define double @fdiv_test(double %a, double %b) {
16 entry:
17   %cmp = fcmp ogt double %a, 0.0
18   br i1 %cmp, label %cond.true, label %cond.end
19
20 cond.true:
21   %div = fdiv double %b, %a
22   br label %cond.end
23
24 cond.end:
25   %cond = phi double [ %div, %cond.true ], [ 0.0, %entry ]
26   ret double %cond
27 }
28
29 ; ALL-LABEL: @sqrt_test(
30 ; ALL: select
31 define void @sqrt_test(float addrspace(1)* noalias nocapture %out, float %a) nounwind {
32 entry:
33   %cmp.i = fcmp olt float %a, 0.000000e+00
34   br i1 %cmp.i, label %test_sqrt.exit, label %cond.else.i
35
36 cond.else.i:                                      ; preds = %entry
37   %0 = tail call float @llvm.sqrt.f32(float %a) nounwind readnone
38   br label %test_sqrt.exit
39
40 test_sqrt.exit:                                   ; preds = %cond.else.i, %entry
41   %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ]
42   store float %cond.i, float addrspace(1)* %out, align 4
43   ret void
44 }
45
46 ; ALL-LABEL: @fabs_test(
47 ; ALL: select
48 define void @fabs_test(float addrspace(1)* noalias nocapture %out, float %a) nounwind {
49 entry:
50   %cmp.i = fcmp olt float %a, 0.000000e+00
51   br i1 %cmp.i, label %test_fabs.exit, label %cond.else.i
52
53 cond.else.i:                                      ; preds = %entry
54   %0 = tail call float @llvm.fabs.f32(float %a) nounwind readnone
55   br label %test_fabs.exit
56
57 test_fabs.exit:                                   ; preds = %cond.else.i, %entry
58   %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ]
59   store float %cond.i, float addrspace(1)* %out, align 4
60   ret void
61 }
62
63 ; ALL-LABEL: @fma_test(
64 ; ALL: select
65 define void @fma_test(float addrspace(1)* noalias nocapture %out, float %a, float %b, float %c) nounwind {
66 entry:
67   %cmp.i = fcmp olt float %a, 0.000000e+00
68   br i1 %cmp.i, label %test_fma.exit, label %cond.else.i
69
70 cond.else.i:                                      ; preds = %entry
71   %0 = tail call float @llvm.fma.f32(float %a, float %b, float %c) nounwind readnone
72   br label %test_fma.exit
73
74 test_fma.exit:                                   ; preds = %cond.else.i, %entry
75   %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ]
76   store float %cond.i, float addrspace(1)* %out, align 4
77   ret void
78 }
79
80 ; ALL-LABEL: @fmuladd_test(
81 ; ALL: select
82 define void @fmuladd_test(float addrspace(1)* noalias nocapture %out, float %a, float %b, float %c) nounwind {
83 entry:
84   %cmp.i = fcmp olt float %a, 0.000000e+00
85   br i1 %cmp.i, label %test_fmuladd.exit, label %cond.else.i
86
87 cond.else.i:                                      ; preds = %entry
88   %0 = tail call float @llvm.fmuladd.f32(float %a, float %b, float %c) nounwind readnone
89   br label %test_fmuladd.exit
90
91 test_fmuladd.exit:                                   ; preds = %cond.else.i, %entry
92   %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ]
93   store float %cond.i, float addrspace(1)* %out, align 4
94   ret void
95 }
96
97 ; ALL-LABEL: @minnum_test(
98 ; ALL: select
99 define void @minnum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind {
100 entry:
101   %cmp.i = fcmp olt float %a, 0.000000e+00
102   br i1 %cmp.i, label %test_minnum.exit, label %cond.else.i
103
104 cond.else.i:                                      ; preds = %entry
105   %0 = tail call float @llvm.minnum.f32(float %a, float %b) nounwind readnone
106   br label %test_minnum.exit
107
108 test_minnum.exit:                                   ; preds = %cond.else.i, %entry
109   %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ]
110   store float %cond.i, float addrspace(1)* %out, align 4
111   ret void
112 }
113
114 ; ALL-LABEL: @maxnum_test(
115 ; ALL: select
116 define void @maxnum_test(float addrspace(1)* noalias nocapture %out, float %a, float %b) nounwind {
117 entry:
118   %cmp.i = fcmp olt float %a, 0.000000e+00
119   br i1 %cmp.i, label %test_maxnum.exit, label %cond.else.i
120
121 cond.else.i:                                      ; preds = %entry
122   %0 = tail call float @llvm.maxnum.f32(float %a, float %b) nounwind readnone
123   br label %test_maxnum.exit
124
125 test_maxnum.exit:                                   ; preds = %cond.else.i, %entry
126   %cond.i = phi float [ %0, %cond.else.i ], [ 0x7FF8000000000000, %entry ]
127   store float %cond.i, float addrspace(1)* %out, align 4
128   ret void
129 }