xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/nancvt.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -O3 | llc > %t
2*9880d681SAndroid Build Coastguard Worker; RUN: grep 2147027116 %t | count 3
3*9880d681SAndroid Build Coastguard Worker; RUN: grep 2147228864 %t | count 3
4*9880d681SAndroid Build Coastguard Worker; RUN: grep 2146502828 %t | count 3
5*9880d681SAndroid Build Coastguard Worker; RUN: grep 2143034560 %t | count 3
6*9880d681SAndroid Build Coastguard Worker; Compile time conversions of NaNs.
7*9880d681SAndroid Build Coastguard Worker; ModuleID = 'nan2.c'
8*9880d681SAndroid Build Coastguard Workertarget 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"
9*9880d681SAndroid Build Coastguard Workertarget triple = "i686-apple-darwin8"
10*9880d681SAndroid Build Coastguard Worker	%struct..0anon = type { float }
11*9880d681SAndroid Build Coastguard Worker	%struct..1anon = type { double }
12*9880d681SAndroid Build Coastguard Worker@fnan = constant [3 x i32] [ i32 2143831397, i32 2143831396, i32 2143831398 ]		; <[3 x i32]*> [#uses=1]
13*9880d681SAndroid Build Coastguard Worker@dnan = constant [3 x i64] [ i64 9223235251041752696, i64 9223235251041752697, i64 9223235250773317239 ], align 8		; <[3 x i64]*> [#uses=1]
14*9880d681SAndroid Build Coastguard Worker@fsnan = constant [3 x i32] [ i32 2139637093, i32 2139637092, i32 2139637094 ]		; <[3 x i32]*> [#uses=1]
15*9880d681SAndroid Build Coastguard Worker@dsnan = constant [3 x i64] [ i64 9220983451228067448, i64 9220983451228067449, i64 9220983450959631991 ], align 8		; <[3 x i64]*> [#uses=1]
16*9880d681SAndroid Build Coastguard Worker@.str = internal constant [10 x i8] c"%08x%08x\0A\00"		; <[10 x i8]*> [#uses=2]
17*9880d681SAndroid Build Coastguard Worker@.str1 = internal constant [6 x i8] c"%08x\0A\00"		; <[6 x i8]*> [#uses=2]
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker@var = external global i32
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine i32 @main() {
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker	%retval = alloca i32, align 4		; <i32*> [#uses=1]
24*9880d681SAndroid Build Coastguard Worker	%i = alloca i32, align 4		; <i32*> [#uses=20]
25*9880d681SAndroid Build Coastguard Worker	%uf = alloca %struct..0anon, align 4		; <%struct..0anon*> [#uses=8]
26*9880d681SAndroid Build Coastguard Worker	%ud = alloca %struct..1anon, align 8		; <%struct..1anon*> [#uses=10]
27*9880d681SAndroid Build Coastguard Worker	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
28*9880d681SAndroid Build Coastguard Worker	store i32 0, i32* %i, align 4
29*9880d681SAndroid Build Coastguard Worker	br label %bb23
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerbb:		; preds = %bb23
32*9880d681SAndroid Build Coastguard Worker	%tmp = load i32, i32* %i, align 4		; <i32> [#uses=1]
33*9880d681SAndroid Build Coastguard Worker	%tmp1 = getelementptr [3 x i32], [3 x i32]* @fnan, i32 0, i32 %tmp		; <i32*> [#uses=1]
34*9880d681SAndroid Build Coastguard Worker	%tmp2 = load i32, i32* %tmp1, align 4		; <i32> [#uses=1]
35*9880d681SAndroid Build Coastguard Worker	%tmp3 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0		; <float*> [#uses=1]
36*9880d681SAndroid Build Coastguard Worker	%tmp34 = bitcast float* %tmp3 to i32*		; <i32*> [#uses=1]
37*9880d681SAndroid Build Coastguard Worker	store i32 %tmp2, i32* %tmp34, align 4
38*9880d681SAndroid Build Coastguard Worker	%tmp5 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0		; <float*> [#uses=1]
39*9880d681SAndroid Build Coastguard Worker	%tmp6 = load float, float* %tmp5, align 4		; <float> [#uses=1]
40*9880d681SAndroid Build Coastguard Worker	%tmp67 = fpext float %tmp6 to double		; <double> [#uses=1]
41*9880d681SAndroid Build Coastguard Worker	%tmp8 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
42*9880d681SAndroid Build Coastguard Worker	store double %tmp67, double* %tmp8, align 8
43*9880d681SAndroid Build Coastguard Worker	%tmp9 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
44*9880d681SAndroid Build Coastguard Worker	%tmp910 = bitcast double* %tmp9 to i64*		; <i64*> [#uses=1]
45*9880d681SAndroid Build Coastguard Worker	%tmp11 = load i64, i64* %tmp910, align 8		; <i64> [#uses=1]
46*9880d681SAndroid Build Coastguard Worker	%tmp1112 = trunc i64 %tmp11 to i32		; <i32> [#uses=1]
47*9880d681SAndroid Build Coastguard Worker	%tmp13 = and i32 %tmp1112, -1		; <i32> [#uses=1]
48*9880d681SAndroid Build Coastguard Worker	%tmp14 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
49*9880d681SAndroid Build Coastguard Worker	%tmp1415 = bitcast double* %tmp14 to i64*		; <i64*> [#uses=1]
50*9880d681SAndroid Build Coastguard Worker	%tmp16 = load i64, i64* %tmp1415, align 8		; <i64> [#uses=1]
51*9880d681SAndroid Build Coastguard Worker	%.cast = zext i32 32 to i64		; <i64> [#uses=1]
52*9880d681SAndroid Build Coastguard Worker	%tmp17 = ashr i64 %tmp16, %.cast		; <i64> [#uses=1]
53*9880d681SAndroid Build Coastguard Worker	%tmp1718 = trunc i64 %tmp17 to i32		; <i32> [#uses=1]
54*9880d681SAndroid Build Coastguard Worker	%tmp19 = getelementptr [10 x i8], [10 x i8]* @.str, i32 0, i32 0		; <i8*> [#uses=1]
55*9880d681SAndroid Build Coastguard Worker	store volatile i32 %tmp1718, i32* @var
56*9880d681SAndroid Build Coastguard Worker	store volatile i32 %tmp13, i32* @var
57*9880d681SAndroid Build Coastguard Worker	%tmp21 = load i32, i32* %i, align 4		; <i32> [#uses=1]
58*9880d681SAndroid Build Coastguard Worker	%tmp22 = add i32 %tmp21, 1		; <i32> [#uses=1]
59*9880d681SAndroid Build Coastguard Worker	store i32 %tmp22, i32* %i, align 4
60*9880d681SAndroid Build Coastguard Worker	br label %bb23
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerbb23:		; preds = %bb, %entry
63*9880d681SAndroid Build Coastguard Worker	%tmp24 = load i32, i32* %i, align 4		; <i32> [#uses=1]
64*9880d681SAndroid Build Coastguard Worker	%tmp25 = icmp sle i32 %tmp24, 2		; <i1> [#uses=1]
65*9880d681SAndroid Build Coastguard Worker	%tmp2526 = zext i1 %tmp25 to i8		; <i8> [#uses=1]
66*9880d681SAndroid Build Coastguard Worker	%toBool = icmp ne i8 %tmp2526, 0		; <i1> [#uses=1]
67*9880d681SAndroid Build Coastguard Worker	br i1 %toBool, label %bb, label %bb27
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerbb27:		; preds = %bb23
70*9880d681SAndroid Build Coastguard Worker	store i32 0, i32* %i, align 4
71*9880d681SAndroid Build Coastguard Worker	br label %bb46
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerbb28:		; preds = %bb46
74*9880d681SAndroid Build Coastguard Worker	%tmp29 = load i32, i32* %i, align 4		; <i32> [#uses=1]
75*9880d681SAndroid Build Coastguard Worker	%tmp30 = getelementptr [3 x i64], [3 x i64]* @dnan, i32 0, i32 %tmp29		; <i64*> [#uses=1]
76*9880d681SAndroid Build Coastguard Worker	%tmp31 = load i64, i64* %tmp30, align 8		; <i64> [#uses=1]
77*9880d681SAndroid Build Coastguard Worker	%tmp32 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
78*9880d681SAndroid Build Coastguard Worker	%tmp3233 = bitcast double* %tmp32 to i64*		; <i64*> [#uses=1]
79*9880d681SAndroid Build Coastguard Worker	store i64 %tmp31, i64* %tmp3233, align 8
80*9880d681SAndroid Build Coastguard Worker	%tmp35 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
81*9880d681SAndroid Build Coastguard Worker	%tmp36 = load double, double* %tmp35, align 8		; <double> [#uses=1]
82*9880d681SAndroid Build Coastguard Worker	%tmp3637 = fptrunc double %tmp36 to float		; <float> [#uses=1]
83*9880d681SAndroid Build Coastguard Worker	%tmp38 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0		; <float*> [#uses=1]
84*9880d681SAndroid Build Coastguard Worker	store float %tmp3637, float* %tmp38, align 4
85*9880d681SAndroid Build Coastguard Worker	%tmp39 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0		; <float*> [#uses=1]
86*9880d681SAndroid Build Coastguard Worker	%tmp3940 = bitcast float* %tmp39 to i32*		; <i32*> [#uses=1]
87*9880d681SAndroid Build Coastguard Worker	%tmp41 = load i32, i32* %tmp3940, align 4		; <i32> [#uses=1]
88*9880d681SAndroid Build Coastguard Worker	%tmp42 = getelementptr [6 x i8], [6 x i8]* @.str1, i32 0, i32 0		; <i8*> [#uses=1]
89*9880d681SAndroid Build Coastguard Worker	store volatile i32 %tmp41, i32* @var
90*9880d681SAndroid Build Coastguard Worker	%tmp44 = load i32, i32* %i, align 4		; <i32> [#uses=1]
91*9880d681SAndroid Build Coastguard Worker	%tmp45 = add i32 %tmp44, 1		; <i32> [#uses=1]
92*9880d681SAndroid Build Coastguard Worker	store i32 %tmp45, i32* %i, align 4
93*9880d681SAndroid Build Coastguard Worker	br label %bb46
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerbb46:		; preds = %bb28, %bb27
96*9880d681SAndroid Build Coastguard Worker	%tmp47 = load i32, i32* %i, align 4		; <i32> [#uses=1]
97*9880d681SAndroid Build Coastguard Worker	%tmp48 = icmp sle i32 %tmp47, 2		; <i1> [#uses=1]
98*9880d681SAndroid Build Coastguard Worker	%tmp4849 = zext i1 %tmp48 to i8		; <i8> [#uses=1]
99*9880d681SAndroid Build Coastguard Worker	%toBool50 = icmp ne i8 %tmp4849, 0		; <i1> [#uses=1]
100*9880d681SAndroid Build Coastguard Worker	br i1 %toBool50, label %bb28, label %bb51
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerbb51:		; preds = %bb46
103*9880d681SAndroid Build Coastguard Worker	store i32 0, i32* %i, align 4
104*9880d681SAndroid Build Coastguard Worker	br label %bb78
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerbb52:		; preds = %bb78
107*9880d681SAndroid Build Coastguard Worker	%tmp53 = load i32, i32* %i, align 4		; <i32> [#uses=1]
108*9880d681SAndroid Build Coastguard Worker	%tmp54 = getelementptr [3 x i32], [3 x i32]* @fsnan, i32 0, i32 %tmp53		; <i32*> [#uses=1]
109*9880d681SAndroid Build Coastguard Worker	%tmp55 = load i32, i32* %tmp54, align 4		; <i32> [#uses=1]
110*9880d681SAndroid Build Coastguard Worker	%tmp56 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0		; <float*> [#uses=1]
111*9880d681SAndroid Build Coastguard Worker	%tmp5657 = bitcast float* %tmp56 to i32*		; <i32*> [#uses=1]
112*9880d681SAndroid Build Coastguard Worker	store i32 %tmp55, i32* %tmp5657, align 4
113*9880d681SAndroid Build Coastguard Worker	%tmp58 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0		; <float*> [#uses=1]
114*9880d681SAndroid Build Coastguard Worker	%tmp59 = load float, float* %tmp58, align 4		; <float> [#uses=1]
115*9880d681SAndroid Build Coastguard Worker	%tmp5960 = fpext float %tmp59 to double		; <double> [#uses=1]
116*9880d681SAndroid Build Coastguard Worker	%tmp61 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
117*9880d681SAndroid Build Coastguard Worker	store double %tmp5960, double* %tmp61, align 8
118*9880d681SAndroid Build Coastguard Worker	%tmp62 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
119*9880d681SAndroid Build Coastguard Worker	%tmp6263 = bitcast double* %tmp62 to i64*		; <i64*> [#uses=1]
120*9880d681SAndroid Build Coastguard Worker	%tmp64 = load i64, i64* %tmp6263, align 8		; <i64> [#uses=1]
121*9880d681SAndroid Build Coastguard Worker	%tmp6465 = trunc i64 %tmp64 to i32		; <i32> [#uses=1]
122*9880d681SAndroid Build Coastguard Worker	%tmp66 = and i32 %tmp6465, -1		; <i32> [#uses=1]
123*9880d681SAndroid Build Coastguard Worker	%tmp68 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
124*9880d681SAndroid Build Coastguard Worker	%tmp6869 = bitcast double* %tmp68 to i64*		; <i64*> [#uses=1]
125*9880d681SAndroid Build Coastguard Worker	%tmp70 = load i64, i64* %tmp6869, align 8		; <i64> [#uses=1]
126*9880d681SAndroid Build Coastguard Worker	%.cast71 = zext i32 32 to i64		; <i64> [#uses=1]
127*9880d681SAndroid Build Coastguard Worker	%tmp72 = ashr i64 %tmp70, %.cast71		; <i64> [#uses=1]
128*9880d681SAndroid Build Coastguard Worker	%tmp7273 = trunc i64 %tmp72 to i32		; <i32> [#uses=1]
129*9880d681SAndroid Build Coastguard Worker	%tmp74 = getelementptr [10 x i8], [10 x i8]* @.str, i32 0, i32 0		; <i8*> [#uses=1]
130*9880d681SAndroid Build Coastguard Worker	store volatile i32 %tmp7273, i32* @var
131*9880d681SAndroid Build Coastguard Worker	store volatile i32 %tmp66, i32* @var
132*9880d681SAndroid Build Coastguard Worker	%tmp76 = load i32, i32* %i, align 4		; <i32> [#uses=1]
133*9880d681SAndroid Build Coastguard Worker	%tmp77 = add i32 %tmp76, 1		; <i32> [#uses=1]
134*9880d681SAndroid Build Coastguard Worker	store i32 %tmp77, i32* %i, align 4
135*9880d681SAndroid Build Coastguard Worker	br label %bb78
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerbb78:		; preds = %bb52, %bb51
138*9880d681SAndroid Build Coastguard Worker	%tmp79 = load i32, i32* %i, align 4		; <i32> [#uses=1]
139*9880d681SAndroid Build Coastguard Worker	%tmp80 = icmp sle i32 %tmp79, 2		; <i1> [#uses=1]
140*9880d681SAndroid Build Coastguard Worker	%tmp8081 = zext i1 %tmp80 to i8		; <i8> [#uses=1]
141*9880d681SAndroid Build Coastguard Worker	%toBool82 = icmp ne i8 %tmp8081, 0		; <i1> [#uses=1]
142*9880d681SAndroid Build Coastguard Worker	br i1 %toBool82, label %bb52, label %bb83
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerbb83:		; preds = %bb78
145*9880d681SAndroid Build Coastguard Worker	store i32 0, i32* %i, align 4
146*9880d681SAndroid Build Coastguard Worker	br label %bb101
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerbb84:		; preds = %bb101
149*9880d681SAndroid Build Coastguard Worker	%tmp85 = load i32, i32* %i, align 4		; <i32> [#uses=1]
150*9880d681SAndroid Build Coastguard Worker	%tmp86 = getelementptr [3 x i64], [3 x i64]* @dsnan, i32 0, i32 %tmp85		; <i64*> [#uses=1]
151*9880d681SAndroid Build Coastguard Worker	%tmp87 = load i64, i64* %tmp86, align 8		; <i64> [#uses=1]
152*9880d681SAndroid Build Coastguard Worker	%tmp88 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
153*9880d681SAndroid Build Coastguard Worker	%tmp8889 = bitcast double* %tmp88 to i64*		; <i64*> [#uses=1]
154*9880d681SAndroid Build Coastguard Worker	store i64 %tmp87, i64* %tmp8889, align 8
155*9880d681SAndroid Build Coastguard Worker	%tmp90 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0		; <double*> [#uses=1]
156*9880d681SAndroid Build Coastguard Worker	%tmp91 = load double, double* %tmp90, align 8		; <double> [#uses=1]
157*9880d681SAndroid Build Coastguard Worker	%tmp9192 = fptrunc double %tmp91 to float		; <float> [#uses=1]
158*9880d681SAndroid Build Coastguard Worker	%tmp93 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0		; <float*> [#uses=1]
159*9880d681SAndroid Build Coastguard Worker	store float %tmp9192, float* %tmp93, align 4
160*9880d681SAndroid Build Coastguard Worker	%tmp94 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0		; <float*> [#uses=1]
161*9880d681SAndroid Build Coastguard Worker	%tmp9495 = bitcast float* %tmp94 to i32*		; <i32*> [#uses=1]
162*9880d681SAndroid Build Coastguard Worker	%tmp96 = load i32, i32* %tmp9495, align 4		; <i32> [#uses=1]
163*9880d681SAndroid Build Coastguard Worker	%tmp97 = getelementptr [6 x i8], [6 x i8]* @.str1, i32 0, i32 0		; <i8*> [#uses=1]
164*9880d681SAndroid Build Coastguard Worker	store volatile i32 %tmp96, i32* @var
165*9880d681SAndroid Build Coastguard Worker	%tmp99 = load i32, i32* %i, align 4		; <i32> [#uses=1]
166*9880d681SAndroid Build Coastguard Worker	%tmp100 = add i32 %tmp99, 1		; <i32> [#uses=1]
167*9880d681SAndroid Build Coastguard Worker	store i32 %tmp100, i32* %i, align 4
168*9880d681SAndroid Build Coastguard Worker	br label %bb101
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerbb101:		; preds = %bb84, %bb83
171*9880d681SAndroid Build Coastguard Worker	%tmp102 = load i32, i32* %i, align 4		; <i32> [#uses=1]
172*9880d681SAndroid Build Coastguard Worker	%tmp103 = icmp sle i32 %tmp102, 2		; <i1> [#uses=1]
173*9880d681SAndroid Build Coastguard Worker	%tmp103104 = zext i1 %tmp103 to i8		; <i8> [#uses=1]
174*9880d681SAndroid Build Coastguard Worker	%toBool105 = icmp ne i8 %tmp103104, 0		; <i1> [#uses=1]
175*9880d681SAndroid Build Coastguard Worker	br i1 %toBool105, label %bb84, label %bb106
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerbb106:		; preds = %bb101
178*9880d681SAndroid Build Coastguard Worker	br label %return
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerreturn:		; preds = %bb106
181*9880d681SAndroid Build Coastguard Worker	%retval107 = load i32, i32* %retval		; <i32> [#uses=1]
182*9880d681SAndroid Build Coastguard Worker	ret i32 %retval107
183*9880d681SAndroid Build Coastguard Worker}
184