[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Transforms / InstCombine / 2009-01-19-fmod-constant-float-specials.ll
blobb9aa0a25497228a8aa1ce766ac841d617ad2999f
1 ; RUN: opt < %s -simplifycfg -instcombine -S | grep 0x7FF8000000000000 | count 12
2 ; RUN: opt < %s -simplifycfg -instcombine -S | grep "0\.0" | count 3
3 ; RUN: opt < %s -simplifycfg -instcombine -S | grep "3\.5" | count 1
6 ; ModuleID = 'apf.c'
7 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
8 target triple = "i386-apple-darwin9.6"
9 @"\01LC" = internal constant [4 x i8] c"%f\0A\00"               ; <[4 x i8]*> [#uses=1]
11 define void @foo1() nounwind {
12 entry:
13         %y = alloca float               ; <float*> [#uses=2]
14         %x = alloca float               ; <float*> [#uses=2]
15         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
16         store float 0x7FF0000000000000, float* %x, align 4
17         store float 0x7FF8000000000000, float* %y, align 4
18         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
19         %1 = fpext float %0 to double           ; <double> [#uses=1]
20         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
21         %3 = fpext float %2 to double           ; <double> [#uses=1]
22         %4 = frem double %3, %1         ; <double> [#uses=1]
23         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
24         br label %return
26 return:         ; preds = %entry
27         ret void
30 declare i32 @printf(i8*, ...) nounwind
32 define void @foo2() nounwind {
33 entry:
34         %y = alloca float               ; <float*> [#uses=2]
35         %x = alloca float               ; <float*> [#uses=2]
36         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
37         store float 0x7FF0000000000000, float* %x, align 4
38         store float 0.000000e+00, float* %y, align 4
39         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
40         %1 = fpext float %0 to double           ; <double> [#uses=1]
41         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
42         %3 = fpext float %2 to double           ; <double> [#uses=1]
43         %4 = frem double %3, %1         ; <double> [#uses=1]
44         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
45         br label %return
47 return:         ; preds = %entry
48         ret void
51 define void @foo3() nounwind {
52 entry:
53         %y = alloca float               ; <float*> [#uses=2]
54         %x = alloca float               ; <float*> [#uses=2]
55         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
56         store float 0x7FF0000000000000, float* %x, align 4
57         store float 3.500000e+00, float* %y, align 4
58         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
59         %1 = fpext float %0 to double           ; <double> [#uses=1]
60         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
61         %3 = fpext float %2 to double           ; <double> [#uses=1]
62         %4 = frem double %3, %1         ; <double> [#uses=1]
63         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
64         br label %return
66 return:         ; preds = %entry
67         ret void
70 define void @foo4() nounwind {
71 entry:
72         %y = alloca float               ; <float*> [#uses=2]
73         %x = alloca float               ; <float*> [#uses=2]
74         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
75         store float 0x7FF0000000000000, float* %x, align 4
76         store float 0x7FF0000000000000, float* %y, align 4
77         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
78         %1 = fpext float %0 to double           ; <double> [#uses=1]
79         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
80         %3 = fpext float %2 to double           ; <double> [#uses=1]
81         %4 = frem double %3, %1         ; <double> [#uses=1]
82         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
83         br label %return
85 return:         ; preds = %entry
86         ret void
89 define void @foo5() nounwind {
90 entry:
91         %y = alloca float               ; <float*> [#uses=2]
92         %x = alloca float               ; <float*> [#uses=2]
93         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
94         store float 0x7FF8000000000000, float* %x, align 4
95         store float 0x7FF0000000000000, float* %y, align 4
96         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
97         %1 = fpext float %0 to double           ; <double> [#uses=1]
98         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
99         %3 = fpext float %2 to double           ; <double> [#uses=1]
100         %4 = frem double %3, %1         ; <double> [#uses=1]
101         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
102         br label %return
104 return:         ; preds = %entry
105         ret void
108 define void @foo6() nounwind {
109 entry:
110         %y = alloca float               ; <float*> [#uses=2]
111         %x = alloca float               ; <float*> [#uses=2]
112         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
113         store float 0x7FF8000000000000, float* %x, align 4
114         store float 0.000000e+00, float* %y, align 4
115         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
116         %1 = fpext float %0 to double           ; <double> [#uses=1]
117         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
118         %3 = fpext float %2 to double           ; <double> [#uses=1]
119         %4 = frem double %3, %1         ; <double> [#uses=1]
120         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
121         br label %return
123 return:         ; preds = %entry
124         ret void
127 define void @foo7() nounwind {
128 entry:
129         %y = alloca float               ; <float*> [#uses=2]
130         %x = alloca float               ; <float*> [#uses=2]
131         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
132         store float 0x7FF8000000000000, float* %x, align 4
133         store float 3.500000e+00, float* %y, align 4
134         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
135         %1 = fpext float %0 to double           ; <double> [#uses=1]
136         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
137         %3 = fpext float %2 to double           ; <double> [#uses=1]
138         %4 = frem double %3, %1         ; <double> [#uses=1]
139         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
140         br label %return
142 return:         ; preds = %entry
143         ret void
146 define void @foo8() nounwind {
147 entry:
148         %y = alloca float               ; <float*> [#uses=2]
149         %x = alloca float               ; <float*> [#uses=2]
150         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
151         store float 0x7FF8000000000000, float* %x, align 4
152         store float 0x7FF8000000000000, float* %y, align 4
153         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
154         %1 = fpext float %0 to double           ; <double> [#uses=1]
155         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
156         %3 = fpext float %2 to double           ; <double> [#uses=1]
157         %4 = frem double %3, %1         ; <double> [#uses=1]
158         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
159         br label %return
161 return:         ; preds = %entry
162         ret void
165 define void @foo9() nounwind {
166 entry:
167         %y = alloca float               ; <float*> [#uses=2]
168         %x = alloca float               ; <float*> [#uses=2]
169         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
170         store float 0.000000e+00, float* %x, align 4
171         store float 0x7FF8000000000000, float* %y, align 4
172         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
173         %1 = fpext float %0 to double           ; <double> [#uses=1]
174         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
175         %3 = fpext float %2 to double           ; <double> [#uses=1]
176         %4 = frem double %3, %1         ; <double> [#uses=1]
177         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
178         br label %return
180 return:         ; preds = %entry
181         ret void
184 define void @foo10() nounwind {
185 entry:
186         %y = alloca float               ; <float*> [#uses=2]
187         %x = alloca float               ; <float*> [#uses=2]
188         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
189         store float 0.000000e+00, float* %x, align 4
190         store float 0x7FF0000000000000, float* %y, align 4
191         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
192         %1 = fpext float %0 to double           ; <double> [#uses=1]
193         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
194         %3 = fpext float %2 to double           ; <double> [#uses=1]
195         %4 = frem double %3, %1         ; <double> [#uses=1]
196         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
197         br label %return
199 return:         ; preds = %entry
200         ret void
203 define void @foo11() nounwind {
204 entry:
205         %y = alloca float               ; <float*> [#uses=2]
206         %x = alloca float               ; <float*> [#uses=2]
207         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
208         store float 0.000000e+00, float* %x, align 4
209         store float 0.000000e+00, float* %y, align 4
210         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
211         %1 = fpext float %0 to double           ; <double> [#uses=1]
212         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
213         %3 = fpext float %2 to double           ; <double> [#uses=1]
214         %4 = frem double %3, %1         ; <double> [#uses=1]
215         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
216         br label %return
218 return:         ; preds = %entry
219         ret void
222 define void @foo12() nounwind {
223 entry:
224         %y = alloca float               ; <float*> [#uses=2]
225         %x = alloca float               ; <float*> [#uses=2]
226         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
227         store float 0.000000e+00, float* %x, align 4
228         store float 3.500000e+00, float* %y, align 4
229         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
230         %1 = fpext float %0 to double           ; <double> [#uses=1]
231         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
232         %3 = fpext float %2 to double           ; <double> [#uses=1]
233         %4 = frem double %3, %1         ; <double> [#uses=1]
234         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
235         br label %return
237 return:         ; preds = %entry
238         ret void
241 define void @foo13() nounwind {
242 entry:
243         %y = alloca float               ; <float*> [#uses=2]
244         %x = alloca float               ; <float*> [#uses=2]
245         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
246         store float 3.500000e+00, float* %x, align 4
247         store float 0x7FF8000000000000, float* %y, align 4
248         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
249         %1 = fpext float %0 to double           ; <double> [#uses=1]
250         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
251         %3 = fpext float %2 to double           ; <double> [#uses=1]
252         %4 = frem double %3, %1         ; <double> [#uses=1]
253         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
254         br label %return
256 return:         ; preds = %entry
257         ret void
260 define void @foo14() nounwind {
261 entry:
262         %y = alloca float               ; <float*> [#uses=2]
263         %x = alloca float               ; <float*> [#uses=2]
264         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
265         store float 3.500000e+00, float* %x, align 4
266         store float 0x7FF0000000000000, float* %y, align 4
267         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
268         %1 = fpext float %0 to double           ; <double> [#uses=1]
269         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
270         %3 = fpext float %2 to double           ; <double> [#uses=1]
271         %4 = frem double %3, %1         ; <double> [#uses=1]
272         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
273         br label %return
275 return:         ; preds = %entry
276         ret void
279 define void @foo15() nounwind {
280 entry:
281         %y = alloca float               ; <float*> [#uses=2]
282         %x = alloca float               ; <float*> [#uses=2]
283         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
284         store float 3.500000e+00, float* %x, align 4
285         store float 0.000000e+00, float* %y, align 4
286         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
287         %1 = fpext float %0 to double           ; <double> [#uses=1]
288         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
289         %3 = fpext float %2 to double           ; <double> [#uses=1]
290         %4 = frem double %3, %1         ; <double> [#uses=1]
291         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
292         br label %return
294 return:         ; preds = %entry
295         ret void
298 define void @foo16() nounwind {
299 entry:
300         %y = alloca float               ; <float*> [#uses=2]
301         %x = alloca float               ; <float*> [#uses=2]
302         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
303         store float 3.500000e+00, float* %x, align 4
304         store float 3.500000e+00, float* %y, align 4
305         %0 = load float, float* %y, align 4             ; <float> [#uses=1]
306         %1 = fpext float %0 to double           ; <double> [#uses=1]
307         %2 = load float, float* %x, align 4             ; <float> [#uses=1]
308         %3 = fpext float %2 to double           ; <double> [#uses=1]
309         %4 = frem double %3, %1         ; <double> [#uses=1]
310         %5 = call i32 (i8*, ...) @printf(i8* getelementptr ([4 x i8], [4 x i8]* @"\01LC", i32 0, i32 0), double %4) nounwind            ; <i32> [#uses=0]
311         br label %return
313 return:         ; preds = %entry
314         ret void