Revert "[InstCombine] Support gep nuw in icmp folds" (#118698)
[llvm-project.git] / llvm / test / Transforms / ExpandLargeFpConvert / X86 / expand-large-fp-convert-ui129tofp.ll
blobee54d53e9ba03a1dc1ff7e1fb5a4261994d559bc
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -mtriple=x86_64-- -expand-large-fp-convert < %s | FileCheck %s
3 ; RUN: opt -S -mtriple=x86_64-- -passes=expand-large-fp-convert < %s | FileCheck %s
5 define half @ui129tohalf(i129 %a) {
6 ; CHECK-LABEL: @ui129tohalf(
7 ; CHECK-NEXT:  itofp-entry:
8 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
9 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
10 ; CHECK:       itofp-if-end:
11 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
12 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
13 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
14 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
15 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
16 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
17 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
18 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
19 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
20 ; CHECK:       itofp-if-then4:
21 ; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
22 ; CHECK-NEXT:      i32 25, label [[ITOFP_SW_BB:%.*]]
23 ; CHECK-NEXT:      i32 26, label [[ITOFP_SW_EPILOG:%.*]]
24 ; CHECK-NEXT:    ]
25 ; CHECK:       itofp-sw-bb:
26 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
27 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
28 ; CHECK:       itofp-sw-default:
29 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 103, [[TMP5]]
30 ; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
31 ; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
32 ; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 26
33 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
34 ; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
35 ; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
36 ; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
37 ; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
38 ; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
39 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
40 ; CHECK:       itofp-sw-epilog:
41 ; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
42 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
43 ; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
44 ; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
45 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
46 ; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
47 ; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
48 ; CHECK-NEXT:    [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
49 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 67108864
50 ; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
51 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i32
52 ; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
53 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
54 ; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
55 ; CHECK:       itofp-if-then20:
56 ; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
57 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i32
58 ; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
59 ; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
60 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
61 ; CHECK:       itofp-if-else:
62 ; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -105
63 ; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
64 ; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
65 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i32
66 ; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
67 ; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
68 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
69 ; CHECK:       itofp-if-end26:
70 ; CHECK-NEXT:    [[TMP42:%.*]] = phi i32 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
71 ; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
72 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[TMP1]] to i32
73 ; CHECK-NEXT:    [[TMP45:%.*]] = and i32 [[TMP44]], -2147483648
74 ; CHECK-NEXT:    [[TMP46:%.*]] = shl i32 [[TMP43]], 23
75 ; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP46]], 1065353216
76 ; CHECK-NEXT:    [[TMP48:%.*]] = and i32 [[TMP42]], 8388607
77 ; CHECK-NEXT:    [[TMP49:%.*]] = or i32 [[TMP48]], [[TMP45]]
78 ; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP48]], [[TMP47]]
79 ; CHECK-NEXT:    [[TMP51:%.*]] = bitcast i32 [[TMP50]] to float
80 ; CHECK-NEXT:    [[TMP52:%.*]] = fptrunc float [[TMP51]] to half
81 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
82 ; CHECK:       itofp-return:
83 ; CHECK-NEXT:    [[TMP53:%.*]] = phi half [ [[TMP52]], [[ITOFP_IF_END26]] ], [ 0xH0000, [[ITOFP_ENTRY:%.*]] ]
84 ; CHECK-NEXT:    ret half [[TMP53]]
86   %conv = uitofp i129 %a to half
87   ret half %conv
90 define float @ui129tofloat(i129 %a) {
91 ; CHECK-LABEL: @ui129tofloat(
92 ; CHECK-NEXT:  itofp-entry:
93 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
94 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
95 ; CHECK:       itofp-if-end:
96 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
97 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
98 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
99 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
100 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
101 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
102 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
103 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
104 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
105 ; CHECK:       itofp-if-then4:
106 ; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
107 ; CHECK-NEXT:      i32 25, label [[ITOFP_SW_BB:%.*]]
108 ; CHECK-NEXT:      i32 26, label [[ITOFP_SW_EPILOG:%.*]]
109 ; CHECK-NEXT:    ]
110 ; CHECK:       itofp-sw-bb:
111 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
112 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
113 ; CHECK:       itofp-sw-default:
114 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 103, [[TMP5]]
115 ; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
116 ; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
117 ; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 26
118 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
119 ; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
120 ; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
121 ; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
122 ; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
123 ; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
124 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
125 ; CHECK:       itofp-sw-epilog:
126 ; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
127 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
128 ; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
129 ; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
130 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
131 ; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
132 ; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
133 ; CHECK-NEXT:    [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
134 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 67108864
135 ; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
136 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i32
137 ; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
138 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
139 ; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
140 ; CHECK:       itofp-if-then20:
141 ; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
142 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i32
143 ; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
144 ; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
145 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
146 ; CHECK:       itofp-if-else:
147 ; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -105
148 ; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
149 ; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
150 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i32
151 ; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
152 ; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
153 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
154 ; CHECK:       itofp-if-end26:
155 ; CHECK-NEXT:    [[TMP42:%.*]] = phi i32 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
156 ; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
157 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[TMP1]] to i32
158 ; CHECK-NEXT:    [[TMP45:%.*]] = and i32 [[TMP44]], -2147483648
159 ; CHECK-NEXT:    [[TMP46:%.*]] = shl i32 [[TMP43]], 23
160 ; CHECK-NEXT:    [[TMP47:%.*]] = add i32 [[TMP46]], 1065353216
161 ; CHECK-NEXT:    [[TMP48:%.*]] = and i32 [[TMP42]], 8388607
162 ; CHECK-NEXT:    [[TMP49:%.*]] = or i32 [[TMP48]], [[TMP45]]
163 ; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP48]], [[TMP47]]
164 ; CHECK-NEXT:    [[TMP51:%.*]] = bitcast i32 [[TMP50]] to float
165 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
166 ; CHECK:       itofp-return:
167 ; CHECK-NEXT:    [[TMP52:%.*]] = phi float [ [[TMP51]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
168 ; CHECK-NEXT:    ret float [[TMP52]]
170   %conv = uitofp i129 %a to float
171   ret float %conv
174 define double @ui129todouble(i129 %a) {
175 ; CHECK-LABEL: @ui129todouble(
176 ; CHECK-NEXT:  itofp-entry:
177 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
178 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
179 ; CHECK:       itofp-if-end:
180 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
181 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
182 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
183 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
184 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
185 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 129, [[TMP5]]
186 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 128, [[TMP5]]
187 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 53
188 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
189 ; CHECK:       itofp-if-then4:
190 ; CHECK-NEXT:    switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
191 ; CHECK-NEXT:      i32 54, label [[ITOFP_SW_BB:%.*]]
192 ; CHECK-NEXT:      i32 55, label [[ITOFP_SW_EPILOG:%.*]]
193 ; CHECK-NEXT:    ]
194 ; CHECK:       itofp-sw-bb:
195 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
196 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
197 ; CHECK:       itofp-sw-default:
198 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 74, [[TMP5]]
199 ; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
200 ; CHECK-NEXT:    [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
201 ; CHECK-NEXT:    [[TMP13:%.*]] = add i32 [[TMP5]], 55
202 ; CHECK-NEXT:    [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
203 ; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
204 ; CHECK-NEXT:    [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
205 ; CHECK-NEXT:    [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
206 ; CHECK-NEXT:    [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
207 ; CHECK-NEXT:    [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
208 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
209 ; CHECK:       itofp-sw-epilog:
210 ; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
211 ; CHECK-NEXT:    [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
212 ; CHECK-NEXT:    [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
213 ; CHECK-NEXT:    [[TMP23:%.*]] = and i32 [[TMP22]], 1
214 ; CHECK-NEXT:    [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
215 ; CHECK-NEXT:    [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
216 ; CHECK-NEXT:    [[TMP26:%.*]] = add i129 [[TMP25]], 1
217 ; CHECK-NEXT:    [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
218 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP26]], 36028797018963968
219 ; CHECK-NEXT:    [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
220 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP27]] to i64
221 ; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
222 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
223 ; CHECK-NEXT:    br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
224 ; CHECK:       itofp-if-then20:
225 ; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
226 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP32]] to i64
227 ; CHECK-NEXT:    [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
228 ; CHECK-NEXT:    [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
229 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
230 ; CHECK:       itofp-if-else:
231 ; CHECK-NEXT:    [[TMP36:%.*]] = add i32 [[TMP5]], -76
232 ; CHECK-NEXT:    [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
233 ; CHECK-NEXT:    [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
234 ; CHECK-NEXT:    [[TMP39:%.*]] = trunc i129 [[TMP38]] to i64
235 ; CHECK-NEXT:    [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
236 ; CHECK-NEXT:    [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
237 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
238 ; CHECK:       itofp-if-end26:
239 ; CHECK-NEXT:    [[TMP42:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
240 ; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP35]], [[ITOFP_IF_THEN20]] ], [ [[TMP31]], [[ITOFP_SW_EPILOG]] ], [ [[TMP41]], [[ITOFP_IF_ELSE]] ]
241 ; CHECK-NEXT:    [[TMP44:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
242 ; CHECK-NEXT:    [[TMP45:%.*]] = trunc i129 [[TMP1]] to i32
243 ; CHECK-NEXT:    [[TMP46:%.*]] = and i32 [[TMP45]], -2147483648
244 ; CHECK-NEXT:    [[TMP47:%.*]] = shl i32 [[TMP44]], 20
245 ; CHECK-NEXT:    [[TMP48:%.*]] = add i32 [[TMP47]], 1072693248
246 ; CHECK-NEXT:    [[TMP49:%.*]] = and i32 [[TMP43]], 1048575
247 ; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP46]]
248 ; CHECK-NEXT:    [[TMP51:%.*]] = or i32 [[TMP49]], [[TMP48]]
249 ; CHECK-NEXT:    [[TMP52:%.*]] = zext i32 [[TMP51]] to i64
250 ; CHECK-NEXT:    [[TMP53:%.*]] = shl i64 [[TMP52]], 32
251 ; CHECK-NEXT:    [[TMP54:%.*]] = and i64 [[TMP42]], 4294967295
252 ; CHECK-NEXT:    [[TMP55:%.*]] = or i64 [[TMP53]], [[TMP54]]
253 ; CHECK-NEXT:    [[TMP56:%.*]] = bitcast i64 [[TMP55]] to double
254 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
255 ; CHECK:       itofp-return:
256 ; CHECK-NEXT:    [[TMP57:%.*]] = phi double [ [[TMP56]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
257 ; CHECK-NEXT:    ret double [[TMP57]]
259   %conv = uitofp i129 %a to double
260   ret double %conv
263 define x86_fp80 @ui129tox86_fp80(i129 %a) {
264 ; CHECK-LABEL: @ui129tox86_fp80(
265 ; CHECK-NEXT:  itofp-entry:
266 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
267 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
268 ; CHECK:       itofp-if-end:
269 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
270 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
271 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
272 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
273 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
274 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i129 129, [[TMP4]]
275 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i129 128, [[TMP4]]
276 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
277 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
278 ; CHECK:       itofp-if-then4:
279 ; CHECK-NEXT:    switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
280 ; CHECK-NEXT:      i129 114, label [[ITOFP_SW_BB:%.*]]
281 ; CHECK-NEXT:      i129 115, label [[ITOFP_SW_EPILOG:%.*]]
282 ; CHECK-NEXT:    ]
283 ; CHECK:       itofp-sw-bb:
284 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
285 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
286 ; CHECK:       itofp-sw-default:
287 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i129 14, [[TMP4]]
288 ; CHECK-NEXT:    [[TMP11:%.*]] = lshr i129 [[A]], [[TMP10]]
289 ; CHECK-NEXT:    [[TMP12:%.*]] = add i129 [[TMP4]], 115
290 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i129 -1, [[TMP12]]
291 ; CHECK-NEXT:    [[TMP14:%.*]] = and i129 [[TMP13]], [[A]]
292 ; CHECK-NEXT:    [[TMP15:%.*]] = icmp ne i129 [[TMP14]], 0
293 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i1 [[TMP15]] to i129
294 ; CHECK-NEXT:    [[TMP17:%.*]] = or i129 [[TMP11]], [[TMP16]]
295 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
296 ; CHECK:       itofp-sw-epilog:
297 ; CHECK-NEXT:    [[TMP18:%.*]] = phi i129 [ [[TMP17]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
298 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i129 [[TMP18]] to i32
299 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i32 [[TMP19]], 2
300 ; CHECK-NEXT:    [[TMP21:%.*]] = and i32 [[TMP20]], 1
301 ; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i129
302 ; CHECK-NEXT:    [[TMP23:%.*]] = or i129 [[TMP18]], [[TMP22]]
303 ; CHECK-NEXT:    [[TMP24:%.*]] = add i129 [[TMP23]], 1
304 ; CHECK-NEXT:    [[TMP25:%.*]] = lshr i129 [[TMP24]], 2
305 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP24]], 41538374868278621028243970633760768
306 ; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i129 [[A3]], 0
307 ; CHECK-NEXT:    [[TMP27:%.*]] = trunc i129 [[TMP25]] to i128
308 ; CHECK-NEXT:    [[TMP28:%.*]] = lshr i129 [[TMP25]], 32
309 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP7]] to i64
310 ; CHECK-NEXT:    br i1 [[TMP26]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
311 ; CHECK:       itofp-if-then20:
312 ; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP24]], 3
313 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i128
314 ; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP30]], 32
315 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
316 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
317 ; CHECK:       itofp-if-else:
318 ; CHECK-NEXT:    [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
319 ; CHECK-NEXT:    [[TMP35:%.*]] = shl i129 [[A]], [[TMP34]]
320 ; CHECK-NEXT:    [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
321 ; CHECK-NEXT:    [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
322 ; CHECK-NEXT:    [[TMP38:%.*]] = trunc i129 [[TMP7]] to i64
323 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
324 ; CHECK:       itofp-if-end26:
325 ; CHECK-NEXT:    [[TMP39:%.*]] = phi i128 [ [[TMP31]], [[ITOFP_IF_THEN20]] ], [ [[TMP27]], [[ITOFP_SW_EPILOG]] ], [ [[TMP36]], [[ITOFP_IF_ELSE]] ]
326 ; CHECK-NEXT:    [[TMP40:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP38]], [[ITOFP_IF_ELSE]] ]
327 ; CHECK-NEXT:    [[AND29:%.*]] = and i129 [[TMP1]], 9223372036854775808
328 ; CHECK-NEXT:    [[TMP41:%.*]] = shl i64 [[TMP40]], 48
329 ; CHECK-NEXT:    [[TMP42:%.*]] = add i64 [[TMP41]], 4611404543450677248
330 ; CHECK-NEXT:    [[TMP43:%.*]] = zext i64 [[TMP42]] to i128
331 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[AND29]] to i128
332 ; CHECK-NEXT:    [[TMP45:%.*]] = or i128 [[TMP44]], [[TMP43]]
333 ; CHECK-NEXT:    [[TMP46:%.*]] = shl i128 [[TMP45]], 64
334 ; CHECK-NEXT:    [[TMP47:%.*]] = and i128 [[TMP39]], 5192296858534827628530496329220095
335 ; CHECK-NEXT:    [[TMP48:%.*]] = or i128 [[TMP46]], [[TMP47]]
336 ; CHECK-NEXT:    [[TMP49:%.*]] = bitcast i128 [[TMP48]] to fp128
337 ; CHECK-NEXT:    [[TMP50:%.*]] = fptrunc fp128 [[TMP49]] to x86_fp80
338 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
339 ; CHECK:       itofp-return:
340 ; CHECK-NEXT:    [[TMP51:%.*]] = phi x86_fp80 [ [[TMP50]], [[ITOFP_IF_END26]] ], [ 0xK00000000000000000000, [[ITOFP_ENTRY:%.*]] ]
341 ; CHECK-NEXT:    ret x86_fp80 [[TMP51]]
343   %conv = uitofp i129 %a to x86_fp80
344   ret x86_fp80 %conv
347 define fp128 @ui129tofp128(i129 %a) {
348 ; CHECK-LABEL: @ui129tofp128(
349 ; CHECK-NEXT:  itofp-entry:
350 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i129 [[A:%.*]], 0
351 ; CHECK-NEXT:    br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
352 ; CHECK:       itofp-if-end:
353 ; CHECK-NEXT:    [[TMP1:%.*]] = ashr i129 [[A]], 128
354 ; CHECK-NEXT:    [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
355 ; CHECK-NEXT:    [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
356 ; CHECK-NEXT:    [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
357 ; CHECK-NEXT:    [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
358 ; CHECK-NEXT:    [[TMP6:%.*]] = sub i129 129, [[TMP4]]
359 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i129 128, [[TMP4]]
360 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
361 ; CHECK-NEXT:    br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
362 ; CHECK:       itofp-if-then4:
363 ; CHECK-NEXT:    switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
364 ; CHECK-NEXT:      i129 114, label [[ITOFP_SW_BB:%.*]]
365 ; CHECK-NEXT:      i129 115, label [[ITOFP_SW_EPILOG:%.*]]
366 ; CHECK-NEXT:    ]
367 ; CHECK:       itofp-sw-bb:
368 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i129 [[A]], 1
369 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
370 ; CHECK:       itofp-sw-default:
371 ; CHECK-NEXT:    [[TMP10:%.*]] = sub i129 14, [[TMP4]]
372 ; CHECK-NEXT:    [[TMP11:%.*]] = lshr i129 [[A]], [[TMP10]]
373 ; CHECK-NEXT:    [[TMP12:%.*]] = add i129 [[TMP4]], 115
374 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i129 -1, [[TMP12]]
375 ; CHECK-NEXT:    [[TMP14:%.*]] = and i129 [[TMP13]], [[A]]
376 ; CHECK-NEXT:    [[TMP15:%.*]] = icmp ne i129 [[TMP14]], 0
377 ; CHECK-NEXT:    [[TMP16:%.*]] = zext i1 [[TMP15]] to i129
378 ; CHECK-NEXT:    [[TMP17:%.*]] = or i129 [[TMP11]], [[TMP16]]
379 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
380 ; CHECK:       itofp-sw-epilog:
381 ; CHECK-NEXT:    [[TMP18:%.*]] = phi i129 [ [[TMP17]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
382 ; CHECK-NEXT:    [[TMP19:%.*]] = trunc i129 [[TMP18]] to i32
383 ; CHECK-NEXT:    [[TMP20:%.*]] = lshr i32 [[TMP19]], 2
384 ; CHECK-NEXT:    [[TMP21:%.*]] = and i32 [[TMP20]], 1
385 ; CHECK-NEXT:    [[TMP22:%.*]] = zext i32 [[TMP21]] to i129
386 ; CHECK-NEXT:    [[TMP23:%.*]] = or i129 [[TMP18]], [[TMP22]]
387 ; CHECK-NEXT:    [[TMP24:%.*]] = add i129 [[TMP23]], 1
388 ; CHECK-NEXT:    [[TMP25:%.*]] = lshr i129 [[TMP24]], 2
389 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP24]], 41538374868278621028243970633760768
390 ; CHECK-NEXT:    [[TMP26:%.*]] = icmp eq i129 [[A3]], 0
391 ; CHECK-NEXT:    [[TMP27:%.*]] = trunc i129 [[TMP25]] to i128
392 ; CHECK-NEXT:    [[TMP28:%.*]] = lshr i129 [[TMP25]], 32
393 ; CHECK-NEXT:    [[TMP29:%.*]] = trunc i129 [[TMP7]] to i64
394 ; CHECK-NEXT:    br i1 [[TMP26]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
395 ; CHECK:       itofp-if-then20:
396 ; CHECK-NEXT:    [[TMP30:%.*]] = lshr i129 [[TMP24]], 3
397 ; CHECK-NEXT:    [[TMP31:%.*]] = trunc i129 [[TMP30]] to i128
398 ; CHECK-NEXT:    [[TMP32:%.*]] = lshr i129 [[TMP30]], 32
399 ; CHECK-NEXT:    [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
400 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
401 ; CHECK:       itofp-if-else:
402 ; CHECK-NEXT:    [[TMP34:%.*]] = add i129 [[TMP4]], 4294967280
403 ; CHECK-NEXT:    [[TMP35:%.*]] = shl i129 [[A]], [[TMP34]]
404 ; CHECK-NEXT:    [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
405 ; CHECK-NEXT:    [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
406 ; CHECK-NEXT:    [[TMP38:%.*]] = trunc i129 [[TMP7]] to i64
407 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
408 ; CHECK:       itofp-if-end26:
409 ; CHECK-NEXT:    [[TMP39:%.*]] = phi i128 [ [[TMP31]], [[ITOFP_IF_THEN20]] ], [ [[TMP27]], [[ITOFP_SW_EPILOG]] ], [ [[TMP36]], [[ITOFP_IF_ELSE]] ]
410 ; CHECK-NEXT:    [[TMP40:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP38]], [[ITOFP_IF_ELSE]] ]
411 ; CHECK-NEXT:    [[AND29:%.*]] = and i129 [[TMP1]], 9223372036854775808
412 ; CHECK-NEXT:    [[TMP41:%.*]] = shl i64 [[TMP40]], 48
413 ; CHECK-NEXT:    [[TMP42:%.*]] = add i64 [[TMP41]], 4611404543450677248
414 ; CHECK-NEXT:    [[TMP43:%.*]] = zext i64 [[TMP42]] to i128
415 ; CHECK-NEXT:    [[TMP44:%.*]] = trunc i129 [[AND29]] to i128
416 ; CHECK-NEXT:    [[TMP45:%.*]] = or i128 [[TMP44]], [[TMP43]]
417 ; CHECK-NEXT:    [[TMP46:%.*]] = shl i128 [[TMP45]], 64
418 ; CHECK-NEXT:    [[TMP47:%.*]] = and i128 [[TMP39]], 5192296858534827628530496329220095
419 ; CHECK-NEXT:    [[TMP48:%.*]] = or i128 [[TMP46]], [[TMP47]]
420 ; CHECK-NEXT:    [[TMP49:%.*]] = bitcast i128 [[TMP48]] to fp128
421 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
422 ; CHECK:       itofp-return:
423 ; CHECK-NEXT:    [[TMP50:%.*]] = phi fp128 [ [[TMP49]], [[ITOFP_IF_END26]] ], [ 0xL00000000000000000000000000000000, [[ITOFP_ENTRY:%.*]] ]
424 ; CHECK-NEXT:    ret fp128 [[TMP50]]
426   %conv = uitofp i129 %a to fp128
427   ret fp128 %conv
430 define <2 x float> @ui129tofloatv2(<2 x i129> %a) {
431 ; CHECK-LABEL: @ui129tofloatv2(
432 ; CHECK-NEXT:  itofp-entryitofp-entry:
433 ; CHECK-NEXT:    [[TMP0:%.*]] = extractelement <2 x i129> [[A:%.*]], i64 0
434 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i129 [[TMP0]], 0
435 ; CHECK-NEXT:    br i1 [[TMP1]], label [[ITOFP_RETURN1:%.*]], label [[ITOFP_IF_END2:%.*]]
436 ; CHECK:       itofp-if-end2:
437 ; CHECK-NEXT:    [[TMP2:%.*]] = ashr i129 [[TMP0]], 128
438 ; CHECK-NEXT:    [[TMP3:%.*]] = xor i129 [[TMP2]], [[TMP0]]
439 ; CHECK-NEXT:    [[TMP4:%.*]] = sub i129 [[TMP3]], [[TMP2]]
440 ; CHECK-NEXT:    [[TMP5:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP0]], i1 true)
441 ; CHECK-NEXT:    [[TMP6:%.*]] = trunc i129 [[TMP5]] to i32
442 ; CHECK-NEXT:    [[TMP7:%.*]] = sub i32 129, [[TMP6]]
443 ; CHECK-NEXT:    [[TMP8:%.*]] = sub i32 128, [[TMP6]]
444 ; CHECK-NEXT:    [[TMP9:%.*]] = icmp sgt i32 [[TMP7]], 24
445 ; CHECK-NEXT:    br i1 [[TMP9]], label [[ITOFP_IF_THEN43:%.*]], label [[ITOFP_IF_ELSE8:%.*]]
446 ; CHECK:       itofp-if-then43:
447 ; CHECK-NEXT:    switch i32 [[TMP7]], label [[ITOFP_SW_DEFAULT5:%.*]] [
448 ; CHECK-NEXT:      i32 25, label [[ITOFP_SW_BB4:%.*]]
449 ; CHECK-NEXT:      i32 26, label [[ITOFP_SW_EPILOG6:%.*]]
450 ; CHECK-NEXT:    ]
451 ; CHECK:       itofp-sw-bb4:
452 ; CHECK-NEXT:    [[TMP10:%.*]] = shl i129 [[TMP0]], 1
453 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG6]]
454 ; CHECK:       itofp-sw-default5:
455 ; CHECK-NEXT:    [[TMP11:%.*]] = sub i32 103, [[TMP6]]
456 ; CHECK-NEXT:    [[TMP12:%.*]] = zext i32 [[TMP11]] to i129
457 ; CHECK-NEXT:    [[TMP13:%.*]] = lshr i129 [[TMP0]], [[TMP12]]
458 ; CHECK-NEXT:    [[TMP14:%.*]] = add i32 [[TMP6]], 26
459 ; CHECK-NEXT:    [[TMP15:%.*]] = zext i32 [[TMP14]] to i129
460 ; CHECK-NEXT:    [[TMP16:%.*]] = lshr i129 -1, [[TMP15]]
461 ; CHECK-NEXT:    [[TMP17:%.*]] = and i129 [[TMP16]], [[TMP0]]
462 ; CHECK-NEXT:    [[TMP18:%.*]] = icmp ne i129 [[TMP17]], 0
463 ; CHECK-NEXT:    [[TMP19:%.*]] = zext i1 [[TMP18]] to i129
464 ; CHECK-NEXT:    [[TMP20:%.*]] = or i129 [[TMP13]], [[TMP19]]
465 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG6]]
466 ; CHECK:       itofp-sw-epilog6:
467 ; CHECK-NEXT:    [[TMP21:%.*]] = phi i129 [ [[TMP20]], [[ITOFP_SW_DEFAULT5]] ], [ [[TMP0]], [[ITOFP_IF_THEN43]] ], [ [[TMP10]], [[ITOFP_SW_BB4]] ]
468 ; CHECK-NEXT:    [[TMP22:%.*]] = trunc i129 [[TMP21]] to i32
469 ; CHECK-NEXT:    [[TMP23:%.*]] = lshr i32 [[TMP22]], 2
470 ; CHECK-NEXT:    [[TMP24:%.*]] = and i32 [[TMP23]], 1
471 ; CHECK-NEXT:    [[TMP25:%.*]] = zext i32 [[TMP24]] to i129
472 ; CHECK-NEXT:    [[TMP26:%.*]] = or i129 [[TMP21]], [[TMP25]]
473 ; CHECK-NEXT:    [[TMP27:%.*]] = add i129 [[TMP26]], 1
474 ; CHECK-NEXT:    [[TMP28:%.*]] = lshr i129 [[TMP27]], 2
475 ; CHECK-NEXT:    [[A310:%.*]] = and i129 [[TMP27]], 67108864
476 ; CHECK-NEXT:    [[TMP29:%.*]] = icmp eq i129 [[A310]], 0
477 ; CHECK-NEXT:    [[TMP30:%.*]] = trunc i129 [[TMP28]] to i32
478 ; CHECK-NEXT:    [[TMP31:%.*]] = lshr i129 [[TMP28]], 32
479 ; CHECK-NEXT:    [[TMP32:%.*]] = trunc i129 [[TMP31]] to i32
480 ; CHECK-NEXT:    br i1 [[TMP29]], label [[ITOFP_IF_END269:%.*]], label [[ITOFP_IF_THEN207:%.*]]
481 ; CHECK:       itofp-if-then207:
482 ; CHECK-NEXT:    [[TMP33:%.*]] = lshr i129 [[TMP27]], 3
483 ; CHECK-NEXT:    [[TMP34:%.*]] = trunc i129 [[TMP33]] to i32
484 ; CHECK-NEXT:    [[TMP35:%.*]] = lshr i129 [[TMP33]], 32
485 ; CHECK-NEXT:    [[TMP36:%.*]] = trunc i129 [[TMP35]] to i32
486 ; CHECK-NEXT:    br label [[ITOFP_IF_END269]]
487 ; CHECK:       itofp-if-else8:
488 ; CHECK-NEXT:    [[TMP37:%.*]] = add i32 [[TMP6]], -105
489 ; CHECK-NEXT:    [[TMP38:%.*]] = zext i32 [[TMP37]] to i129
490 ; CHECK-NEXT:    [[TMP39:%.*]] = shl i129 [[TMP0]], [[TMP38]]
491 ; CHECK-NEXT:    [[TMP40:%.*]] = trunc i129 [[TMP39]] to i32
492 ; CHECK-NEXT:    [[TMP41:%.*]] = lshr i129 [[TMP39]], 32
493 ; CHECK-NEXT:    [[TMP42:%.*]] = trunc i129 [[TMP41]] to i32
494 ; CHECK-NEXT:    br label [[ITOFP_IF_END269]]
495 ; CHECK:       itofp-if-end269:
496 ; CHECK-NEXT:    [[TMP43:%.*]] = phi i32 [ [[TMP34]], [[ITOFP_IF_THEN207]] ], [ [[TMP30]], [[ITOFP_SW_EPILOG6]] ], [ [[TMP40]], [[ITOFP_IF_ELSE8]] ]
497 ; CHECK-NEXT:    [[TMP44:%.*]] = phi i32 [ [[TMP7]], [[ITOFP_IF_THEN207]] ], [ [[TMP8]], [[ITOFP_SW_EPILOG6]] ], [ [[TMP8]], [[ITOFP_IF_ELSE8]] ]
498 ; CHECK-NEXT:    [[TMP45:%.*]] = trunc i129 [[TMP2]] to i32
499 ; CHECK-NEXT:    [[TMP46:%.*]] = and i32 [[TMP45]], -2147483648
500 ; CHECK-NEXT:    [[TMP47:%.*]] = shl i32 [[TMP44]], 23
501 ; CHECK-NEXT:    [[TMP48:%.*]] = add i32 [[TMP47]], 1065353216
502 ; CHECK-NEXT:    [[TMP49:%.*]] = and i32 [[TMP43]], 8388607
503 ; CHECK-NEXT:    [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP46]]
504 ; CHECK-NEXT:    [[TMP51:%.*]] = or i32 [[TMP49]], [[TMP48]]
505 ; CHECK-NEXT:    [[TMP52:%.*]] = bitcast i32 [[TMP51]] to float
506 ; CHECK-NEXT:    br label [[ITOFP_RETURN1]]
507 ; CHECK:       itofp-return1:
508 ; CHECK-NEXT:    [[TMP53:%.*]] = phi float [ [[TMP52]], [[ITOFP_IF_END269]] ], [ 0.000000e+00, [[ITOFP_ENTRYITOFP_ENTRY:%.*]] ]
509 ; CHECK-NEXT:    [[TMP54:%.*]] = insertelement <2 x float> poison, float [[TMP53]], i64 0
510 ; CHECK-NEXT:    [[TMP55:%.*]] = extractelement <2 x i129> [[A]], i64 1
511 ; CHECK-NEXT:    [[TMP56:%.*]] = icmp eq i129 [[TMP55]], 0
512 ; CHECK-NEXT:    br i1 [[TMP56]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]]
513 ; CHECK:       itofp-if-end:
514 ; CHECK-NEXT:    [[TMP57:%.*]] = ashr i129 [[TMP55]], 128
515 ; CHECK-NEXT:    [[TMP58:%.*]] = xor i129 [[TMP57]], [[TMP55]]
516 ; CHECK-NEXT:    [[TMP59:%.*]] = sub i129 [[TMP58]], [[TMP57]]
517 ; CHECK-NEXT:    [[TMP60:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP55]], i1 true)
518 ; CHECK-NEXT:    [[TMP61:%.*]] = trunc i129 [[TMP60]] to i32
519 ; CHECK-NEXT:    [[TMP62:%.*]] = sub i32 129, [[TMP61]]
520 ; CHECK-NEXT:    [[TMP63:%.*]] = sub i32 128, [[TMP61]]
521 ; CHECK-NEXT:    [[TMP64:%.*]] = icmp sgt i32 [[TMP62]], 24
522 ; CHECK-NEXT:    br i1 [[TMP64]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]]
523 ; CHECK:       itofp-if-then4:
524 ; CHECK-NEXT:    switch i32 [[TMP62]], label [[ITOFP_SW_DEFAULT:%.*]] [
525 ; CHECK-NEXT:      i32 25, label [[ITOFP_SW_BB:%.*]]
526 ; CHECK-NEXT:      i32 26, label [[ITOFP_SW_EPILOG:%.*]]
527 ; CHECK-NEXT:    ]
528 ; CHECK:       itofp-sw-bb:
529 ; CHECK-NEXT:    [[TMP65:%.*]] = shl i129 [[TMP55]], 1
530 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
531 ; CHECK:       itofp-sw-default:
532 ; CHECK-NEXT:    [[TMP66:%.*]] = sub i32 103, [[TMP61]]
533 ; CHECK-NEXT:    [[TMP67:%.*]] = zext i32 [[TMP66]] to i129
534 ; CHECK-NEXT:    [[TMP68:%.*]] = lshr i129 [[TMP55]], [[TMP67]]
535 ; CHECK-NEXT:    [[TMP69:%.*]] = add i32 [[TMP61]], 26
536 ; CHECK-NEXT:    [[TMP70:%.*]] = zext i32 [[TMP69]] to i129
537 ; CHECK-NEXT:    [[TMP71:%.*]] = lshr i129 -1, [[TMP70]]
538 ; CHECK-NEXT:    [[TMP72:%.*]] = and i129 [[TMP71]], [[TMP55]]
539 ; CHECK-NEXT:    [[TMP73:%.*]] = icmp ne i129 [[TMP72]], 0
540 ; CHECK-NEXT:    [[TMP74:%.*]] = zext i1 [[TMP73]] to i129
541 ; CHECK-NEXT:    [[TMP75:%.*]] = or i129 [[TMP68]], [[TMP74]]
542 ; CHECK-NEXT:    br label [[ITOFP_SW_EPILOG]]
543 ; CHECK:       itofp-sw-epilog:
544 ; CHECK-NEXT:    [[TMP76:%.*]] = phi i129 [ [[TMP75]], [[ITOFP_SW_DEFAULT]] ], [ [[TMP55]], [[ITOFP_IF_THEN4]] ], [ [[TMP65]], [[ITOFP_SW_BB]] ]
545 ; CHECK-NEXT:    [[TMP77:%.*]] = trunc i129 [[TMP76]] to i32
546 ; CHECK-NEXT:    [[TMP78:%.*]] = lshr i32 [[TMP77]], 2
547 ; CHECK-NEXT:    [[TMP79:%.*]] = and i32 [[TMP78]], 1
548 ; CHECK-NEXT:    [[TMP80:%.*]] = zext i32 [[TMP79]] to i129
549 ; CHECK-NEXT:    [[TMP81:%.*]] = or i129 [[TMP76]], [[TMP80]]
550 ; CHECK-NEXT:    [[TMP82:%.*]] = add i129 [[TMP81]], 1
551 ; CHECK-NEXT:    [[TMP83:%.*]] = lshr i129 [[TMP82]], 2
552 ; CHECK-NEXT:    [[A3:%.*]] = and i129 [[TMP82]], 67108864
553 ; CHECK-NEXT:    [[TMP84:%.*]] = icmp eq i129 [[A3]], 0
554 ; CHECK-NEXT:    [[TMP85:%.*]] = trunc i129 [[TMP83]] to i32
555 ; CHECK-NEXT:    [[TMP86:%.*]] = lshr i129 [[TMP83]], 32
556 ; CHECK-NEXT:    [[TMP87:%.*]] = trunc i129 [[TMP86]] to i32
557 ; CHECK-NEXT:    br i1 [[TMP84]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]]
558 ; CHECK:       itofp-if-then20:
559 ; CHECK-NEXT:    [[TMP88:%.*]] = lshr i129 [[TMP82]], 3
560 ; CHECK-NEXT:    [[TMP89:%.*]] = trunc i129 [[TMP88]] to i32
561 ; CHECK-NEXT:    [[TMP90:%.*]] = lshr i129 [[TMP88]], 32
562 ; CHECK-NEXT:    [[TMP91:%.*]] = trunc i129 [[TMP90]] to i32
563 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
564 ; CHECK:       itofp-if-else:
565 ; CHECK-NEXT:    [[TMP92:%.*]] = add i32 [[TMP61]], -105
566 ; CHECK-NEXT:    [[TMP93:%.*]] = zext i32 [[TMP92]] to i129
567 ; CHECK-NEXT:    [[TMP94:%.*]] = shl i129 [[TMP55]], [[TMP93]]
568 ; CHECK-NEXT:    [[TMP95:%.*]] = trunc i129 [[TMP94]] to i32
569 ; CHECK-NEXT:    [[TMP96:%.*]] = lshr i129 [[TMP94]], 32
570 ; CHECK-NEXT:    [[TMP97:%.*]] = trunc i129 [[TMP96]] to i32
571 ; CHECK-NEXT:    br label [[ITOFP_IF_END26]]
572 ; CHECK:       itofp-if-end26:
573 ; CHECK-NEXT:    [[TMP98:%.*]] = phi i32 [ [[TMP89]], [[ITOFP_IF_THEN20]] ], [ [[TMP85]], [[ITOFP_SW_EPILOG]] ], [ [[TMP95]], [[ITOFP_IF_ELSE]] ]
574 ; CHECK-NEXT:    [[TMP99:%.*]] = phi i32 [ [[TMP62]], [[ITOFP_IF_THEN20]] ], [ [[TMP63]], [[ITOFP_SW_EPILOG]] ], [ [[TMP63]], [[ITOFP_IF_ELSE]] ]
575 ; CHECK-NEXT:    [[TMP100:%.*]] = trunc i129 [[TMP57]] to i32
576 ; CHECK-NEXT:    [[TMP101:%.*]] = and i32 [[TMP100]], -2147483648
577 ; CHECK-NEXT:    [[TMP102:%.*]] = shl i32 [[TMP99]], 23
578 ; CHECK-NEXT:    [[TMP103:%.*]] = add i32 [[TMP102]], 1065353216
579 ; CHECK-NEXT:    [[TMP104:%.*]] = and i32 [[TMP98]], 8388607
580 ; CHECK-NEXT:    [[TMP105:%.*]] = or i32 [[TMP104]], [[TMP101]]
581 ; CHECK-NEXT:    [[TMP106:%.*]] = or i32 [[TMP104]], [[TMP103]]
582 ; CHECK-NEXT:    [[TMP107:%.*]] = bitcast i32 [[TMP106]] to float
583 ; CHECK-NEXT:    br label [[ITOFP_RETURN]]
584 ; CHECK:       itofp-return:
585 ; CHECK-NEXT:    [[TMP108:%.*]] = phi float [ [[TMP107]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_RETURN1]] ]
586 ; CHECK-NEXT:    [[TMP109:%.*]] = insertelement <2 x float> [[TMP54]], float [[TMP108]], i64 1
587 ; CHECK-NEXT:    ret <2 x float> [[TMP109]]
589   %conv = uitofp <2 x i129> %a to <2 x float>
590   ret <2 x float> %conv