1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -O3 -S | FileCheck %s
3
4; Compile time conversions of NaNs.
5
6target 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"
7target triple = "i686-apple-darwin8"
8
9%struct..0anon = type { float }
10%struct..1anon = type { double }
11
12@fnan = constant [3 x i32] [ i32 2143831397, i32 2143831396, i32 2143831398 ]
13@dnan = constant [3 x i64] [ i64 9223235251041752696, i64 9223235251041752697, i64 9223235250773317239 ], align 8
14@fsnan = constant [3 x i32] [ i32 2139637093, i32 2139637092, i32 2139637094 ]
15@dsnan = constant [3 x i64] [ i64 9220983451228067448, i64 9220983451228067449, i64 9220983450959631991 ], align 8
16@.str = internal constant [10 x i8] c"%08x%08x\0A\00"
17@.str1 = internal constant [6 x i8] c"%08x\0A\00"
18
19@var = external global i32
20
21; SNAN becomes QNAN on fptrunc:
22; 2147228864 = 0x7ffc1cc0 : QNAN
23
24define i32 @main() {
25; CHECK-LABEL: @main(
26; CHECK-NEXT:  entry:
27; CHECK-NEXT:    store volatile i32 2147027116, i32* @var, align 4
28; CHECK-NEXT:    store volatile i32 -1610612736, i32* @var, align 4
29; CHECK-NEXT:    store volatile i32 2147027116, i32* @var, align 4
30; CHECK-NEXT:    store volatile i32 -2147483648, i32* @var, align 4
31; CHECK-NEXT:    store volatile i32 2147027116, i32* @var, align 4
32; CHECK-NEXT:    store volatile i32 -1073741824, i32* @var, align 4
33; CHECK-NEXT:    store volatile i32 2147228864, i32* @var, align 4
34; CHECK-NEXT:    store volatile i32 2147228864, i32* @var, align 4
35; CHECK-NEXT:    store volatile i32 2147228864, i32* @var, align 4
36; CHECK-NEXT:    store volatile i32 2147027116, i32* @var, align 4
37; CHECK-NEXT:    store volatile i32 -1610612736, i32* @var, align 4
38; CHECK-NEXT:    store volatile i32 2147027116, i32* @var, align 4
39; CHECK-NEXT:    store volatile i32 -2147483648, i32* @var, align 4
40; CHECK-NEXT:    store volatile i32 2147027116, i32* @var, align 4
41; CHECK-NEXT:    store volatile i32 -1073741824, i32* @var, align 4
42; CHECK-NEXT:    store volatile i32 2147228864, i32* @var, align 4
43; CHECK-NEXT:    store volatile i32 2147228864, i32* @var, align 4
44; CHECK-NEXT:    store volatile i32 2147228864, i32* @var, align 4
45; CHECK-NEXT:    ret i32 undef
46;
47entry:
48  %retval = alloca i32, align 4
49  %i = alloca i32, align 4
50  %uf = alloca %struct..0anon, align 4
51  %ud = alloca %struct..1anon, align 8
52  %"alloca point" = bitcast i32 0 to i32
53  store i32 0, i32* %i, align 4
54  br label %bb23
55
56bb:		; preds = %bb23
57  %t = load i32, i32* %i, align 4
58  %t1 = getelementptr [3 x i32], [3 x i32]* @fnan, i32 0, i32 %t
59  %t2 = load i32, i32* %t1, align 4
60  %t3 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0
61  %t34 = bitcast float* %t3 to i32*
62  store i32 %t2, i32* %t34, align 4
63  %t5 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0
64  %t6 = load float, float* %t5, align 4
65  %t67 = fpext float %t6 to double
66  %t8 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
67  store double %t67, double* %t8, align 8
68  %t9 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
69  %t910 = bitcast double* %t9 to i64*
70  %t11 = load i64, i64* %t910, align 8
71  %t1112 = trunc i64 %t11 to i32
72  %t13 = and i32 %t1112, -1
73  %t14 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
74  %t1415 = bitcast double* %t14 to i64*
75  %t16 = load i64, i64* %t1415, align 8
76  %.cast = zext i32 32 to i64
77  %t17 = ashr i64 %t16, %.cast
78  %t1718 = trunc i64 %t17 to i32
79  %t19 = getelementptr [10 x i8], [10 x i8]* @.str, i32 0, i32 0
80  store volatile i32 %t1718, i32* @var
81  store volatile i32 %t13, i32* @var
82  %t21 = load i32, i32* %i, align 4
83  %t22 = add i32 %t21, 1
84  store i32 %t22, i32* %i, align 4
85  br label %bb23
86
87bb23:		; preds = %bb, %entry
88  %t24 = load i32, i32* %i, align 4
89  %t25 = icmp sle i32 %t24, 2
90  %t2526 = zext i1 %t25 to i8
91  %toBool = icmp ne i8 %t2526, 0
92  br i1 %toBool, label %bb, label %bb27
93
94bb27:		; preds = %bb23
95  store i32 0, i32* %i, align 4
96  br label %bb46
97
98bb28:		; preds = %bb46
99  %t29 = load i32, i32* %i, align 4
100  %t30 = getelementptr [3 x i64], [3 x i64]* @dnan, i32 0, i32 %t29
101  %t31 = load i64, i64* %t30, align 8
102  %t32 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
103  %t3233 = bitcast double* %t32 to i64*
104  store i64 %t31, i64* %t3233, align 8
105  %t35 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
106  %t36 = load double, double* %t35, align 8
107  %t3637 = fptrunc double %t36 to float
108  %t38 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0
109  store float %t3637, float* %t38, align 4
110  %t39 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0
111  %t3940 = bitcast float* %t39 to i32*
112  %t41 = load i32, i32* %t3940, align 4
113  %t42 = getelementptr [6 x i8], [6 x i8]* @.str1, i32 0, i32 0
114  store volatile i32 %t41, i32* @var
115  %t44 = load i32, i32* %i, align 4
116  %t45 = add i32 %t44, 1
117  store i32 %t45, i32* %i, align 4
118  br label %bb46
119
120bb46:		; preds = %bb28, %bb27
121  %t47 = load i32, i32* %i, align 4
122  %t48 = icmp sle i32 %t47, 2
123  %t4849 = zext i1 %t48 to i8
124  %toBool50 = icmp ne i8 %t4849, 0
125  br i1 %toBool50, label %bb28, label %bb51
126
127bb51:		; preds = %bb46
128  store i32 0, i32* %i, align 4
129  br label %bb78
130
131bb52:		; preds = %bb78
132  %t53 = load i32, i32* %i, align 4
133  %t54 = getelementptr [3 x i32], [3 x i32]* @fsnan, i32 0, i32 %t53
134  %t55 = load i32, i32* %t54, align 4
135  %t56 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0
136  %t5657 = bitcast float* %t56 to i32*
137  store i32 %t55, i32* %t5657, align 4
138  %t58 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0
139  %t59 = load float, float* %t58, align 4
140  %t5960 = fpext float %t59 to double
141  %t61 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
142  store double %t5960, double* %t61, align 8
143  %t62 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
144  %t6263 = bitcast double* %t62 to i64*
145  %t64 = load i64, i64* %t6263, align 8
146  %t6465 = trunc i64 %t64 to i32
147  %t66 = and i32 %t6465, -1
148  %t68 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
149  %t6869 = bitcast double* %t68 to i64*
150  %t70 = load i64, i64* %t6869, align 8
151  %.cast71 = zext i32 32 to i64
152  %t72 = ashr i64 %t70, %.cast71
153  %t7273 = trunc i64 %t72 to i32
154  %t74 = getelementptr [10 x i8], [10 x i8]* @.str, i32 0, i32 0
155  store volatile i32 %t7273, i32* @var
156  store volatile i32 %t66, i32* @var
157  %t76 = load i32, i32* %i, align 4
158  %t77 = add i32 %t76, 1
159  store i32 %t77, i32* %i, align 4
160  br label %bb78
161
162bb78:		; preds = %bb52, %bb51
163  %t79 = load i32, i32* %i, align 4
164  %t80 = icmp sle i32 %t79, 2
165  %t8081 = zext i1 %t80 to i8
166  %toBool82 = icmp ne i8 %t8081, 0
167  br i1 %toBool82, label %bb52, label %bb83
168
169bb83:		; preds = %bb78
170  store i32 0, i32* %i, align 4
171  br label %bb101
172
173bb84:		; preds = %bb101
174  %t85 = load i32, i32* %i, align 4
175  %t86 = getelementptr [3 x i64], [3 x i64]* @dsnan, i32 0, i32 %t85
176  %t87 = load i64, i64* %t86, align 8
177  %t88 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
178  %t8889 = bitcast double* %t88 to i64*
179  store i64 %t87, i64* %t8889, align 8
180  %t90 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0
181  %t91 = load double, double* %t90, align 8
182  %t9192 = fptrunc double %t91 to float
183  %t93 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0
184  store float %t9192, float* %t93, align 4
185  %t94 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0
186  %t9495 = bitcast float* %t94 to i32*
187  %t96 = load i32, i32* %t9495, align 4
188  %t97 = getelementptr [6 x i8], [6 x i8]* @.str1, i32 0, i32 0
189  store volatile i32 %t96, i32* @var
190  %t99 = load i32, i32* %i, align 4
191  %t100 = add i32 %t99, 1
192  store i32 %t100, i32* %i, align 4
193  br label %bb101
194
195bb101:		; preds = %bb84, %bb83
196  %t102 = load i32, i32* %i, align 4
197  %t103 = icmp sle i32 %t102, 2
198  %t103104 = zext i1 %t103 to i8
199  %toBool105 = icmp ne i8 %t103104, 0
200  br i1 %toBool105, label %bb84, label %bb106
201
202bb106:		; preds = %bb101
203  br label %return
204
205return:		; preds = %bb106
206  %retval107 = load i32, i32* %retval
207  ret i32 %retval107
208}
209