34#include "llvm/IR/IntrinsicsAArch64.h"
35#include "llvm/IR/IntrinsicsARM.h"
36#include "llvm/IR/IntrinsicsNVPTX.h"
37#include "llvm/IR/IntrinsicsRISCV.h"
38#include "llvm/IR/IntrinsicsWebAssembly.h"
39#include "llvm/IR/IntrinsicsX86.h"
61 cl::desc(
"Disable autoupgrade of debug info"));
71 Type *Arg0Type =
F->getFunctionType()->getParamType(0);
86 Type *LastArgType =
F->getFunctionType()->getParamType(
87 F->getFunctionType()->getNumParams() - 1);
102 if (
F->getReturnType()->isVectorTy())
115 Type *Arg1Type =
F->getFunctionType()->getParamType(1);
116 Type *Arg2Type =
F->getFunctionType()->getParamType(2);
130 if (
F->getReturnType()->getScalarType()->isBFloatTy())
140 if (
F->getFunctionType()->getParamType(1)->getScalarType()->isBFloatTy())
154 if (Name.consume_front(
"avx."))
155 return (Name.starts_with(
"blend.p") ||
156 Name ==
"cvt.ps2.pd.256" ||
157 Name ==
"cvtdq2.pd.256" ||
158 Name ==
"cvtdq2.ps.256" ||
159 Name.starts_with(
"movnt.") ||
160 Name.starts_with(
"sqrt.p") ||
161 Name.starts_with(
"storeu.") ||
162 Name.starts_with(
"vbroadcast.s") ||
163 Name.starts_with(
"vbroadcastf128") ||
164 Name.starts_with(
"vextractf128.") ||
165 Name.starts_with(
"vinsertf128.") ||
166 Name.starts_with(
"vperm2f128.") ||
167 Name.starts_with(
"vpermil."));
169 if (Name.consume_front(
"avx2."))
170 return (Name ==
"movntdqa" ||
171 Name.starts_with(
"pabs.") ||
172 Name.starts_with(
"padds.") ||
173 Name.starts_with(
"paddus.") ||
174 Name.starts_with(
"pblendd.") ||
176 Name.starts_with(
"pbroadcast") ||
177 Name.starts_with(
"pcmpeq.") ||
178 Name.starts_with(
"pcmpgt.") ||
179 Name.starts_with(
"pmax") ||
180 Name.starts_with(
"pmin") ||
181 Name.starts_with(
"pmovsx") ||
182 Name.starts_with(
"pmovzx") ||
184 Name ==
"pmulu.dq" ||
185 Name.starts_with(
"psll.dq") ||
186 Name.starts_with(
"psrl.dq") ||
187 Name.starts_with(
"psubs.") ||
188 Name.starts_with(
"psubus.") ||
189 Name.starts_with(
"vbroadcast") ||
190 Name ==
"vbroadcasti128" ||
191 Name ==
"vextracti128" ||
192 Name ==
"vinserti128" ||
193 Name ==
"vperm2i128");
195 if (Name.consume_front(
"avx512.")) {
196 if (Name.consume_front(
"mask."))
198 return (Name.starts_with(
"add.p") ||
199 Name.starts_with(
"and.") ||
200 Name.starts_with(
"andn.") ||
201 Name.starts_with(
"broadcast.s") ||
202 Name.starts_with(
"broadcastf32x4.") ||
203 Name.starts_with(
"broadcastf32x8.") ||
204 Name.starts_with(
"broadcastf64x2.") ||
205 Name.starts_with(
"broadcastf64x4.") ||
206 Name.starts_with(
"broadcasti32x4.") ||
207 Name.starts_with(
"broadcasti32x8.") ||
208 Name.starts_with(
"broadcasti64x2.") ||
209 Name.starts_with(
"broadcasti64x4.") ||
210 Name.starts_with(
"cmp.b") ||
211 Name.starts_with(
"cmp.d") ||
212 Name.starts_with(
"cmp.q") ||
213 Name.starts_with(
"cmp.w") ||
214 Name.starts_with(
"compress.b") ||
215 Name.starts_with(
"compress.d") ||
216 Name.starts_with(
"compress.p") ||
217 Name.starts_with(
"compress.q") ||
218 Name.starts_with(
"compress.store.") ||
219 Name.starts_with(
"compress.w") ||
220 Name.starts_with(
"conflict.") ||
221 Name.starts_with(
"cvtdq2pd.") ||
222 Name.starts_with(
"cvtdq2ps.") ||
223 Name ==
"cvtpd2dq.256" ||
224 Name ==
"cvtpd2ps.256" ||
225 Name ==
"cvtps2pd.128" ||
226 Name ==
"cvtps2pd.256" ||
227 Name.starts_with(
"cvtqq2pd.") ||
228 Name ==
"cvtqq2ps.256" ||
229 Name ==
"cvtqq2ps.512" ||
230 Name ==
"cvttpd2dq.256" ||
231 Name ==
"cvttps2dq.128" ||
232 Name ==
"cvttps2dq.256" ||
233 Name.starts_with(
"cvtudq2pd.") ||
234 Name.starts_with(
"cvtudq2ps.") ||
235 Name.starts_with(
"cvtuqq2pd.") ||
236 Name ==
"cvtuqq2ps.256" ||
237 Name ==
"cvtuqq2ps.512" ||
238 Name.starts_with(
"dbpsadbw.") ||
239 Name.starts_with(
"div.p") ||
240 Name.starts_with(
"expand.b") ||
241 Name.starts_with(
"expand.d") ||
242 Name.starts_with(
"expand.load.") ||
243 Name.starts_with(
"expand.p") ||
244 Name.starts_with(
"expand.q") ||
245 Name.starts_with(
"expand.w") ||
246 Name.starts_with(
"fpclass.p") ||
247 Name.starts_with(
"insert") ||
248 Name.starts_with(
"load.") ||
249 Name.starts_with(
"loadu.") ||
250 Name.starts_with(
"lzcnt.") ||
251 Name.starts_with(
"max.p") ||
252 Name.starts_with(
"min.p") ||
253 Name.starts_with(
"movddup") ||
254 Name.starts_with(
"move.s") ||
255 Name.starts_with(
"movshdup") ||
256 Name.starts_with(
"movsldup") ||
257 Name.starts_with(
"mul.p") ||
258 Name.starts_with(
"or.") ||
259 Name.starts_with(
"pabs.") ||
260 Name.starts_with(
"packssdw.") ||
261 Name.starts_with(
"packsswb.") ||
262 Name.starts_with(
"packusdw.") ||
263 Name.starts_with(
"packuswb.") ||
264 Name.starts_with(
"padd.") ||
265 Name.starts_with(
"padds.") ||
266 Name.starts_with(
"paddus.") ||
267 Name.starts_with(
"palignr.") ||
268 Name.starts_with(
"pand.") ||
269 Name.starts_with(
"pandn.") ||
270 Name.starts_with(
"pavg") ||
271 Name.starts_with(
"pbroadcast") ||
272 Name.starts_with(
"pcmpeq.") ||
273 Name.starts_with(
"pcmpgt.") ||
274 Name.starts_with(
"perm.df.") ||
275 Name.starts_with(
"perm.di.") ||
276 Name.starts_with(
"permvar.") ||
277 Name.starts_with(
"pmaddubs.w.") ||
278 Name.starts_with(
"pmaddw.d.") ||
279 Name.starts_with(
"pmax") ||
280 Name.starts_with(
"pmin") ||
281 Name ==
"pmov.qd.256" ||
282 Name ==
"pmov.qd.512" ||
283 Name ==
"pmov.wb.256" ||
284 Name ==
"pmov.wb.512" ||
285 Name.starts_with(
"pmovsx") ||
286 Name.starts_with(
"pmovzx") ||
287 Name.starts_with(
"pmul.dq.") ||
288 Name.starts_with(
"pmul.hr.sw.") ||
289 Name.starts_with(
"pmulh.w.") ||
290 Name.starts_with(
"pmulhu.w.") ||
291 Name.starts_with(
"pmull.") ||
292 Name.starts_with(
"pmultishift.qb.") ||
293 Name.starts_with(
"pmulu.dq.") ||
294 Name.starts_with(
"por.") ||
295 Name.starts_with(
"prol.") ||
296 Name.starts_with(
"prolv.") ||
297 Name.starts_with(
"pror.") ||
298 Name.starts_with(
"prorv.") ||
299 Name.starts_with(
"pshuf.b.") ||
300 Name.starts_with(
"pshuf.d.") ||
301 Name.starts_with(
"pshufh.w.") ||
302 Name.starts_with(
"pshufl.w.") ||
303 Name.starts_with(
"psll.d") ||
304 Name.starts_with(
"psll.q") ||
305 Name.starts_with(
"psll.w") ||
306 Name.starts_with(
"pslli") ||
307 Name.starts_with(
"psllv") ||
308 Name.starts_with(
"psra.d") ||
309 Name.starts_with(
"psra.q") ||
310 Name.starts_with(
"psra.w") ||
311 Name.starts_with(
"psrai") ||
312 Name.starts_with(
"psrav") ||
313 Name.starts_with(
"psrl.d") ||
314 Name.starts_with(
"psrl.q") ||
315 Name.starts_with(
"psrl.w") ||
316 Name.starts_with(
"psrli") ||
317 Name.starts_with(
"psrlv") ||
318 Name.starts_with(
"psub.") ||
319 Name.starts_with(
"psubs.") ||
320 Name.starts_with(
"psubus.") ||
321 Name.starts_with(
"pternlog.") ||
322 Name.starts_with(
"punpckh") ||
323 Name.starts_with(
"punpckl") ||
324 Name.starts_with(
"pxor.") ||
325 Name.starts_with(
"shuf.f") ||
326 Name.starts_with(
"shuf.i") ||
327 Name.starts_with(
"shuf.p") ||
328 Name.starts_with(
"sqrt.p") ||
329 Name.starts_with(
"store.b.") ||
330 Name.starts_with(
"store.d.") ||
331 Name.starts_with(
"store.p") ||
332 Name.starts_with(
"store.q.") ||
333 Name.starts_with(
"store.w.") ||
334 Name ==
"store.ss" ||
335 Name.starts_with(
"storeu.") ||
336 Name.starts_with(
"sub.p") ||
337 Name.starts_with(
"ucmp.") ||
338 Name.starts_with(
"unpckh.") ||
339 Name.starts_with(
"unpckl.") ||
340 Name.starts_with(
"valign.") ||
341 Name ==
"vcvtph2ps.128" ||
342 Name ==
"vcvtph2ps.256" ||
343 Name.starts_with(
"vextract") ||
344 Name.starts_with(
"vfmadd.") ||
345 Name.starts_with(
"vfmaddsub.") ||
346 Name.starts_with(
"vfnmadd.") ||
347 Name.starts_with(
"vfnmsub.") ||
348 Name.starts_with(
"vpdpbusd.") ||
349 Name.starts_with(
"vpdpbusds.") ||
350 Name.starts_with(
"vpdpwssd.") ||
351 Name.starts_with(
"vpdpwssds.") ||
352 Name.starts_with(
"vpermi2var.") ||
353 Name.starts_with(
"vpermil.p") ||
354 Name.starts_with(
"vpermilvar.") ||
355 Name.starts_with(
"vpermt2var.") ||
356 Name.starts_with(
"vpmadd52") ||
357 Name.starts_with(
"vpshld.") ||
358 Name.starts_with(
"vpshldv.") ||
359 Name.starts_with(
"vpshrd.") ||
360 Name.starts_with(
"vpshrdv.") ||
361 Name.starts_with(
"vpshufbitqmb.") ||
362 Name.starts_with(
"xor."));
364 if (Name.consume_front(
"mask3."))
366 return (Name.starts_with(
"vfmadd.") ||
367 Name.starts_with(
"vfmaddsub.") ||
368 Name.starts_with(
"vfmsub.") ||
369 Name.starts_with(
"vfmsubadd.") ||
370 Name.starts_with(
"vfnmsub."));
372 if (Name.consume_front(
"maskz."))
374 return (Name.starts_with(
"pternlog.") ||
375 Name.starts_with(
"vfmadd.") ||
376 Name.starts_with(
"vfmaddsub.") ||
377 Name.starts_with(
"vpdpbusd.") ||
378 Name.starts_with(
"vpdpbusds.") ||
379 Name.starts_with(
"vpdpwssd.") ||
380 Name.starts_with(
"vpdpwssds.") ||
381 Name.starts_with(
"vpermt2var.") ||
382 Name.starts_with(
"vpmadd52") ||
383 Name.starts_with(
"vpshldv.") ||
384 Name.starts_with(
"vpshrdv."));
387 return (Name ==
"movntdqa" ||
388 Name ==
"pmul.dq.512" ||
389 Name ==
"pmulu.dq.512" ||
390 Name.starts_with(
"broadcastm") ||
391 Name.starts_with(
"cmp.p") ||
392 Name.starts_with(
"cvtb2mask.") ||
393 Name.starts_with(
"cvtd2mask.") ||
394 Name.starts_with(
"cvtmask2") ||
395 Name.starts_with(
"cvtq2mask.") ||
396 Name ==
"cvtusi2sd" ||
397 Name.starts_with(
"cvtw2mask.") ||
402 Name ==
"kortestc.w" ||
403 Name ==
"kortestz.w" ||
404 Name.starts_with(
"kunpck") ||
407 Name.starts_with(
"padds.") ||
408 Name.starts_with(
"pbroadcast") ||
409 Name.starts_with(
"prol") ||
410 Name.starts_with(
"pror") ||
411 Name.starts_with(
"psll.dq") ||
412 Name.starts_with(
"psrl.dq") ||
413 Name.starts_with(
"psubs.") ||
414 Name.starts_with(
"ptestm") ||
415 Name.starts_with(
"ptestnm") ||
416 Name.starts_with(
"storent.") ||
417 Name.starts_with(
"vbroadcast.s") ||
418 Name.starts_with(
"vpshld.") ||
419 Name.starts_with(
"vpshrd."));
422 if (Name.consume_front(
"fma."))
423 return (Name.starts_with(
"vfmadd.") ||
424 Name.starts_with(
"vfmsub.") ||
425 Name.starts_with(
"vfmsubadd.") ||
426 Name.starts_with(
"vfnmadd.") ||
427 Name.starts_with(
"vfnmsub."));
429 if (Name.consume_front(
"fma4."))
430 return Name.starts_with(
"vfmadd.s");
432 if (Name.consume_front(
"sse."))
433 return (Name ==
"add.ss" ||
434 Name ==
"cvtsi2ss" ||
435 Name ==
"cvtsi642ss" ||
438 Name.starts_with(
"sqrt.p") ||
440 Name.starts_with(
"storeu.") ||
443 if (Name.consume_front(
"sse2."))
444 return (Name ==
"add.sd" ||
445 Name ==
"cvtdq2pd" ||
446 Name ==
"cvtdq2ps" ||
447 Name ==
"cvtps2pd" ||
448 Name ==
"cvtsi2sd" ||
449 Name ==
"cvtsi642sd" ||
450 Name ==
"cvtss2sd" ||
453 Name.starts_with(
"padds.") ||
454 Name.starts_with(
"paddus.") ||
455 Name.starts_with(
"pcmpeq.") ||
456 Name.starts_with(
"pcmpgt.") ||
461 Name ==
"pmulu.dq" ||
462 Name.starts_with(
"pshuf") ||
463 Name.starts_with(
"psll.dq") ||
464 Name.starts_with(
"psrl.dq") ||
465 Name.starts_with(
"psubs.") ||
466 Name.starts_with(
"psubus.") ||
467 Name.starts_with(
"sqrt.p") ||
469 Name ==
"storel.dq" ||
470 Name.starts_with(
"storeu.") ||
473 if (Name.consume_front(
"sse41."))
474 return (Name.starts_with(
"blendp") ||
475 Name ==
"movntdqa" ||
485 Name.starts_with(
"pmovsx") ||
486 Name.starts_with(
"pmovzx") ||
489 if (Name.consume_front(
"sse42."))
490 return Name ==
"crc32.64.8";
492 if (Name.consume_front(
"sse4a."))
493 return Name.starts_with(
"movnt.");
495 if (Name.consume_front(
"ssse3."))
496 return (Name ==
"pabs.b.128" ||
497 Name ==
"pabs.d.128" ||
498 Name ==
"pabs.w.128");
500 if (Name.consume_front(
"xop."))
501 return (Name ==
"vpcmov" ||
502 Name ==
"vpcmov.256" ||
503 Name.starts_with(
"vpcom") ||
504 Name.starts_with(
"vprot"));
506 return (Name ==
"addcarry.u32" ||
507 Name ==
"addcarry.u64" ||
508 Name ==
"addcarryx.u32" ||
509 Name ==
"addcarryx.u64" ||
510 Name ==
"subborrow.u32" ||
511 Name ==
"subborrow.u64" ||
512 Name.starts_with(
"vcvtph2ps."));
518 if (!Name.consume_front(
"x86."))
526 if (Name ==
"rdtscp") {
528 if (
F->getFunctionType()->getNumParams() == 0)
533 Intrinsic::x86_rdtscp);
540 if (Name.consume_front(
"sse41.ptest")) {
542 .
Case(
"c", Intrinsic::x86_sse41_ptestc)
543 .
Case(
"z", Intrinsic::x86_sse41_ptestz)
544 .
Case(
"nzc", Intrinsic::x86_sse41_ptestnzc)
557 .
Case(
"sse41.insertps", Intrinsic::x86_sse41_insertps)
558 .
Case(
"sse41.dppd", Intrinsic::x86_sse41_dppd)
559 .
Case(
"sse41.dpps", Intrinsic::x86_sse41_dpps)
560 .
Case(
"sse41.mpsadbw", Intrinsic::x86_sse41_mpsadbw)
561 .
Case(
"avx.dp.ps.256", Intrinsic::x86_avx_dp_ps_256)
562 .
Case(
"avx2.mpsadbw", Intrinsic::x86_avx2_mpsadbw)
567 if (Name.consume_front(
"avx512.")) {
568 if (Name.consume_front(
"mask.cmp.")) {
571 .
Case(
"pd.128", Intrinsic::x86_avx512_mask_cmp_pd_128)
572 .
Case(
"pd.256", Intrinsic::x86_avx512_mask_cmp_pd_256)
573 .
Case(
"pd.512", Intrinsic::x86_avx512_mask_cmp_pd_512)
574 .
Case(
"ps.128", Intrinsic::x86_avx512_mask_cmp_ps_128)
575 .
Case(
"ps.256", Intrinsic::x86_avx512_mask_cmp_ps_256)
576 .
Case(
"ps.512", Intrinsic::x86_avx512_mask_cmp_ps_512)
580 }
else if (Name.starts_with(
"vpdpbusd.") ||
581 Name.starts_with(
"vpdpbusds.")) {
584 .
Case(
"vpdpbusd.128", Intrinsic::x86_avx512_vpdpbusd_128)
585 .
Case(
"vpdpbusd.256", Intrinsic::x86_avx512_vpdpbusd_256)
586 .
Case(
"vpdpbusd.512", Intrinsic::x86_avx512_vpdpbusd_512)
587 .
Case(
"vpdpbusds.128", Intrinsic::x86_avx512_vpdpbusds_128)
588 .
Case(
"vpdpbusds.256", Intrinsic::x86_avx512_vpdpbusds_256)
589 .
Case(
"vpdpbusds.512", Intrinsic::x86_avx512_vpdpbusds_512)
597 if (Name.consume_front(
"avx2.vpdpb")) {
600 .
Case(
"ssd.128", Intrinsic::x86_avx2_vpdpbssd_128)
601 .
Case(
"ssd.256", Intrinsic::x86_avx2_vpdpbssd_256)
602 .
Case(
"ssds.128", Intrinsic::x86_avx2_vpdpbssds_128)
603 .
Case(
"ssds.256", Intrinsic::x86_avx2_vpdpbssds_256)
604 .
Case(
"sud.128", Intrinsic::x86_avx2_vpdpbsud_128)
605 .
Case(
"sud.256", Intrinsic::x86_avx2_vpdpbsud_256)
606 .
Case(
"suds.128", Intrinsic::x86_avx2_vpdpbsuds_128)
607 .
Case(
"suds.256", Intrinsic::x86_avx2_vpdpbsuds_256)
608 .
Case(
"uud.128", Intrinsic::x86_avx2_vpdpbuud_128)
609 .
Case(
"uud.256", Intrinsic::x86_avx2_vpdpbuud_256)
610 .
Case(
"uuds.128", Intrinsic::x86_avx2_vpdpbuuds_128)
611 .
Case(
"uuds.256", Intrinsic::x86_avx2_vpdpbuuds_256)
618 if (Name.consume_front(
"avx10.vpdpb")) {
621 .
Case(
"ssd.512", Intrinsic::x86_avx10_vpdpbssd_512)
622 .
Case(
"ssds.512", Intrinsic::x86_avx10_vpdpbssds_512)
623 .
Case(
"sud.512", Intrinsic::x86_avx10_vpdpbsud_512)
624 .
Case(
"suds.512", Intrinsic::x86_avx10_vpdpbsuds_512)
625 .
Case(
"uud.512", Intrinsic::x86_avx10_vpdpbuud_512)
626 .
Case(
"uuds.512", Intrinsic::x86_avx10_vpdpbuuds_512)
633 if (Name.consume_front(
"avx512bf16.")) {
636 .
Case(
"cvtne2ps2bf16.128",
637 Intrinsic::x86_avx512bf16_cvtne2ps2bf16_128)
638 .
Case(
"cvtne2ps2bf16.256",
639 Intrinsic::x86_avx512bf16_cvtne2ps2bf16_256)
640 .
Case(
"cvtne2ps2bf16.512",
641 Intrinsic::x86_avx512bf16_cvtne2ps2bf16_512)
642 .
Case(
"mask.cvtneps2bf16.128",
643 Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128)
644 .
Case(
"cvtneps2bf16.256",
645 Intrinsic::x86_avx512bf16_cvtneps2bf16_256)
646 .
Case(
"cvtneps2bf16.512",
647 Intrinsic::x86_avx512bf16_cvtneps2bf16_512)
654 .
Case(
"dpbf16ps.128", Intrinsic::x86_avx512bf16_dpbf16ps_128)
655 .
Case(
"dpbf16ps.256", Intrinsic::x86_avx512bf16_dpbf16ps_256)
656 .
Case(
"dpbf16ps.512", Intrinsic::x86_avx512bf16_dpbf16ps_512)
663 if (Name.consume_front(
"xop.")) {
665 if (Name.starts_with(
"vpermil2")) {
668 auto Idx =
F->getFunctionType()->getParamType(2);
669 if (Idx->isFPOrFPVectorTy()) {
670 unsigned IdxSize = Idx->getPrimitiveSizeInBits();
671 unsigned EltSize = Idx->getScalarSizeInBits();
672 if (EltSize == 64 && IdxSize == 128)
673 ID = Intrinsic::x86_xop_vpermil2pd;
674 else if (EltSize == 32 && IdxSize == 128)
675 ID = Intrinsic::x86_xop_vpermil2ps;
676 else if (EltSize == 64 && IdxSize == 256)
677 ID = Intrinsic::x86_xop_vpermil2pd_256;
679 ID = Intrinsic::x86_xop_vpermil2ps_256;
681 }
else if (
F->arg_size() == 2)
684 .
Case(
"vfrcz.ss", Intrinsic::x86_xop_vfrcz_ss)
685 .
Case(
"vfrcz.sd", Intrinsic::x86_xop_vfrcz_sd)
696 if (Name ==
"seh.recoverfp") {
698 Intrinsic::eh_recoverfp);
710 if (Name.starts_with(
"rbit")) {
713 F->getParent(), Intrinsic::bitreverse,
F->arg_begin()->getType());
717 if (Name ==
"thread.pointer") {
720 F->getParent(), Intrinsic::thread_pointer,
F->getReturnType());
724 bool Neon = Name.consume_front(
"neon.");
729 if (Name.consume_front(
"bfdot.")) {
733 .
Cases(
"v2f32.v8i8",
"v4f32.v16i8",
738 size_t OperandWidth =
F->getReturnType()->getPrimitiveSizeInBits();
739 assert((OperandWidth == 64 || OperandWidth == 128) &&
740 "Unexpected operand width");
742 std::array<Type *, 2> Tys{
753 if (Name.consume_front(
"bfm")) {
755 if (Name.consume_back(
".v4f32.v16i8")) {
801 F->arg_begin()->getType());
805 if (Name.consume_front(
"vst")) {
807 static const Regex vstRegex(
"^([1234]|[234]lane)\\.v[a-z0-9]*$");
811 Intrinsic::arm_neon_vst1, Intrinsic::arm_neon_vst2,
812 Intrinsic::arm_neon_vst3, Intrinsic::arm_neon_vst4};
815 Intrinsic::arm_neon_vst2lane, Intrinsic::arm_neon_vst3lane,
816 Intrinsic::arm_neon_vst4lane};
818 auto fArgs =
F->getFunctionType()->params();
819 Type *Tys[] = {fArgs[0], fArgs[1]};
822 F->getParent(), StoreInts[fArgs.size() - 3], Tys);
825 F->getParent(), StoreLaneInts[fArgs.size() - 5], Tys);
834 if (Name.consume_front(
"mve.")) {
836 if (Name ==
"vctp64") {
846 if (Name.starts_with(
"vrintn.v")) {
848 F->getParent(), Intrinsic::roundeven,
F->arg_begin()->getType());
853 if (Name.consume_back(
".v4i1")) {
855 if (Name.consume_back(
".predicated.v2i64.v4i32"))
857 return Name ==
"mull.int" || Name ==
"vqdmull";
859 if (Name.consume_back(
".v2i64")) {
861 bool IsGather = Name.consume_front(
"vldr.gather.");
862 if (IsGather || Name.consume_front(
"vstr.scatter.")) {
863 if (Name.consume_front(
"base.")) {
865 Name.consume_front(
"wb.");
868 return Name ==
"predicated.v2i64";
871 if (Name.consume_front(
"offset.predicated."))
872 return Name == (IsGather ?
"v2i64.p0i64" :
"p0i64.v2i64") ||
873 Name == (IsGather ?
"v2i64.p0" :
"p0.v2i64");
886 if (Name.consume_front(
"cde.vcx")) {
888 if (Name.consume_back(
".predicated.v2i64.v4i1"))
890 return Name ==
"1q" || Name ==
"1qa" || Name ==
"2q" || Name ==
"2qa" ||
891 Name ==
"3q" || Name ==
"3qa";
905 F->arg_begin()->getType());
909 if (Name.starts_with(
"addp")) {
911 if (
F->arg_size() != 2)
914 if (Ty && Ty->getElementType()->isFloatingPointTy()) {
916 F->getParent(), Intrinsic::aarch64_neon_faddp, Ty);
922 if (Name.starts_with(
"bfcvt")) {
929 if (Name.consume_front(
"sve.")) {
931 if (Name.consume_front(
"bf")) {
932 if (Name.consume_back(
".lane")) {
936 .
Case(
"dot", Intrinsic::aarch64_sve_bfdot_lane_v2)
937 .
Case(
"mlalb", Intrinsic::aarch64_sve_bfmlalb_lane_v2)
938 .
Case(
"mlalt", Intrinsic::aarch64_sve_bfmlalt_lane_v2)
950 if (Name ==
"fcvt.bf16f32" || Name ==
"fcvtnt.bf16f32") {
955 if (Name.consume_front(
"addqv")) {
957 if (!
F->getReturnType()->isFPOrFPVectorTy())
960 auto Args =
F->getFunctionType()->params();
961 Type *Tys[] = {
F->getReturnType(), Args[1]};
963 F->getParent(), Intrinsic::aarch64_sve_faddqv, Tys);
967 if (Name.consume_front(
"ld")) {
969 static const Regex LdRegex(
"^[234](.nxv[a-z0-9]+|$)");
970 if (LdRegex.
match(Name)) {
977 Intrinsic::aarch64_sve_ld2_sret,
978 Intrinsic::aarch64_sve_ld3_sret,
979 Intrinsic::aarch64_sve_ld4_sret,
982 LoadIDs[Name[0] -
'2'], Ty);
988 if (Name.consume_front(
"tuple.")) {
990 if (Name.starts_with(
"get")) {
992 Type *Tys[] = {
F->getReturnType(),
F->arg_begin()->getType()};
994 F->getParent(), Intrinsic::vector_extract, Tys);
998 if (Name.starts_with(
"set")) {
1000 auto Args =
F->getFunctionType()->params();
1001 Type *Tys[] = {Args[0], Args[2], Args[1]};
1003 F->getParent(), Intrinsic::vector_insert, Tys);
1007 static const Regex CreateTupleRegex(
"^create[234](.nxv[a-z0-9]+|$)");
1008 if (CreateTupleRegex.
match(Name)) {
1010 auto Args =
F->getFunctionType()->params();
1011 Type *Tys[] = {
F->getReturnType(), Args[1]};
1013 F->getParent(), Intrinsic::vector_insert, Tys);
1026 if (Name.consume_front(
"cp.async.bulk.tensor.g2s.")) {
1030 Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_3d)
1032 Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_4d)
1034 Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_5d)
1035 .
Case(
"tile.1d", Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_1d)
1036 .
Case(
"tile.2d", Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_2d)
1037 .
Case(
"tile.3d", Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_3d)
1038 .
Case(
"tile.4d", Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_4d)
1039 .
Case(
"tile.5d", Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_5d)
1048 if (
F->getArg(0)->getType()->getPointerAddressSpace() ==
1062 size_t FlagStartIndex =
F->getFunctionType()->getNumParams() - 3;
1063 Type *ArgType =
F->getFunctionType()->getParamType(FlagStartIndex);
1073 if (Name.consume_front(
"mapa.shared.cluster"))
1074 if (
F->getReturnType()->getPointerAddressSpace() ==
1076 return Intrinsic::nvvm_mapa_shared_cluster;
1078 if (Name.consume_front(
"cp.async.bulk.")) {
1081 .
Case(
"global.to.shared.cluster",
1082 Intrinsic::nvvm_cp_async_bulk_global_to_shared_cluster)
1083 .
Case(
"shared.cta.to.cluster",
1084 Intrinsic::nvvm_cp_async_bulk_shared_cta_to_cluster)
1088 if (
F->getArg(0)->getType()->getPointerAddressSpace() ==
1097 if (Name.consume_front(
"fma.rn."))
1099 .
Case(
"bf16", Intrinsic::nvvm_fma_rn_bf16)
1100 .
Case(
"bf16x2", Intrinsic::nvvm_fma_rn_bf16x2)
1101 .
Case(
"ftz.bf16", Intrinsic::nvvm_fma_rn_ftz_bf16)
1102 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fma_rn_ftz_bf16x2)
1103 .
Case(
"ftz.relu.bf16", Intrinsic::nvvm_fma_rn_ftz_relu_bf16)
1104 .
Case(
"ftz.relu.bf16x2", Intrinsic::nvvm_fma_rn_ftz_relu_bf16x2)
1105 .
Case(
"ftz.sat.bf16", Intrinsic::nvvm_fma_rn_ftz_sat_bf16)
1106 .
Case(
"ftz.sat.bf16x2", Intrinsic::nvvm_fma_rn_ftz_sat_bf16x2)
1107 .
Case(
"relu.bf16", Intrinsic::nvvm_fma_rn_relu_bf16)
1108 .
Case(
"relu.bf16x2", Intrinsic::nvvm_fma_rn_relu_bf16x2)
1109 .
Case(
"sat.bf16", Intrinsic::nvvm_fma_rn_sat_bf16)
1110 .
Case(
"sat.bf16x2", Intrinsic::nvvm_fma_rn_sat_bf16x2)
1113 if (Name.consume_front(
"fmax."))
1115 .
Case(
"bf16", Intrinsic::nvvm_fmax_bf16)
1116 .
Case(
"bf16x2", Intrinsic::nvvm_fmax_bf16x2)
1117 .
Case(
"ftz.bf16", Intrinsic::nvvm_fmax_ftz_bf16)
1118 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fmax_ftz_bf16x2)
1119 .
Case(
"ftz.nan.bf16", Intrinsic::nvvm_fmax_ftz_nan_bf16)
1120 .
Case(
"ftz.nan.bf16x2", Intrinsic::nvvm_fmax_ftz_nan_bf16x2)
1121 .
Case(
"ftz.nan.xorsign.abs.bf16",
1122 Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_bf16)
1123 .
Case(
"ftz.nan.xorsign.abs.bf16x2",
1124 Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_bf16x2)
1125 .
Case(
"ftz.xorsign.abs.bf16", Intrinsic::nvvm_fmax_ftz_xorsign_abs_bf16)
1126 .
Case(
"ftz.xorsign.abs.bf16x2",
1127 Intrinsic::nvvm_fmax_ftz_xorsign_abs_bf16x2)
1128 .
Case(
"nan.bf16", Intrinsic::nvvm_fmax_nan_bf16)
1129 .
Case(
"nan.bf16x2", Intrinsic::nvvm_fmax_nan_bf16x2)
1130 .
Case(
"nan.xorsign.abs.bf16", Intrinsic::nvvm_fmax_nan_xorsign_abs_bf16)
1131 .
Case(
"nan.xorsign.abs.bf16x2",
1132 Intrinsic::nvvm_fmax_nan_xorsign_abs_bf16x2)
1133 .
Case(
"xorsign.abs.bf16", Intrinsic::nvvm_fmax_xorsign_abs_bf16)
1134 .
Case(
"xorsign.abs.bf16x2", Intrinsic::nvvm_fmax_xorsign_abs_bf16x2)
1137 if (Name.consume_front(
"fmin."))
1139 .
Case(
"bf16", Intrinsic::nvvm_fmin_bf16)
1140 .
Case(
"bf16x2", Intrinsic::nvvm_fmin_bf16x2)
1141 .
Case(
"ftz.bf16", Intrinsic::nvvm_fmin_ftz_bf16)
1142 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fmin_ftz_bf16x2)
1143 .
Case(
"ftz.nan.bf16", Intrinsic::nvvm_fmin_ftz_nan_bf16)
1144 .
Case(
"ftz.nan.bf16x2", Intrinsic::nvvm_fmin_ftz_nan_bf16x2)
1145 .
Case(
"ftz.nan.xorsign.abs.bf16",
1146 Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_bf16)
1147 .
Case(
"ftz.nan.xorsign.abs.bf16x2",
1148 Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_bf16x2)
1149 .
Case(
"ftz.xorsign.abs.bf16", Intrinsic::nvvm_fmin_ftz_xorsign_abs_bf16)
1150 .
Case(
"ftz.xorsign.abs.bf16x2",
1151 Intrinsic::nvvm_fmin_ftz_xorsign_abs_bf16x2)
1152 .
Case(
"nan.bf16", Intrinsic::nvvm_fmin_nan_bf16)
1153 .
Case(
"nan.bf16x2", Intrinsic::nvvm_fmin_nan_bf16x2)
1154 .
Case(
"nan.xorsign.abs.bf16", Intrinsic::nvvm_fmin_nan_xorsign_abs_bf16)
1155 .
Case(
"nan.xorsign.abs.bf16x2",
1156 Intrinsic::nvvm_fmin_nan_xorsign_abs_bf16x2)
1157 .
Case(
"xorsign.abs.bf16", Intrinsic::nvvm_fmin_xorsign_abs_bf16)
1158 .
Case(
"xorsign.abs.bf16x2", Intrinsic::nvvm_fmin_xorsign_abs_bf16x2)
1161 if (Name.consume_front(
"neg."))
1163 .
Case(
"bf16", Intrinsic::nvvm_neg_bf16)
1164 .
Case(
"bf16x2", Intrinsic::nvvm_neg_bf16x2)
1171 return Name.consume_front(
"local") || Name.consume_front(
"shared") ||
1172 Name.consume_front(
"global") || Name.consume_front(
"constant") ||
1173 Name.consume_front(
"param");
1177 bool CanUpgradeDebugIntrinsicsToRecords) {
1178 assert(
F &&
"Illegal to upgrade a non-existent Function.");
1183 if (!Name.consume_front(
"llvm.") || Name.empty())
1189 bool IsArm = Name.consume_front(
"arm.");
1190 if (IsArm || Name.consume_front(
"aarch64.")) {
1196 if (Name.consume_front(
"amdgcn.")) {
1197 if (Name ==
"alignbit") {
1200 F->getParent(), Intrinsic::fshr, {F->getReturnType()});
1204 if (Name.consume_front(
"atomic.")) {
1205 if (Name.starts_with(
"inc") || Name.starts_with(
"dec")) {
1214 if (Name.consume_front(
"ds.") || Name.consume_front(
"global.atomic.") ||
1215 Name.consume_front(
"flat.atomic.")) {
1216 if (Name.starts_with(
"fadd") ||
1218 (Name.starts_with(
"fmin") && !Name.starts_with(
"fmin.num")) ||
1219 (Name.starts_with(
"fmax") && !Name.starts_with(
"fmax.num"))) {
1227 if (Name.starts_with(
"ldexp.")) {
1230 F->getParent(), Intrinsic::ldexp,
1231 {F->getReturnType(), F->getArg(1)->getType()});
1240 if (
F->arg_size() == 1) {
1248 F->arg_begin()->getType());
1253 if (
F->arg_size() == 2 && Name ==
"coro.end") {
1256 Intrinsic::coro_end);
1263 if (Name.consume_front(
"dbg.")) {
1265 if (CanUpgradeDebugIntrinsicsToRecords) {
1266 if (Name ==
"addr" || Name ==
"value" || Name ==
"assign" ||
1267 Name ==
"declare" || Name ==
"label") {
1276 if (Name ==
"addr" || (Name ==
"value" &&
F->arg_size() == 4)) {
1279 Intrinsic::dbg_value);
1286 if (Name.consume_front(
"experimental.vector.")) {
1292 .
StartsWith(
"extract.", Intrinsic::vector_extract)
1293 .
StartsWith(
"insert.", Intrinsic::vector_insert)
1294 .
StartsWith(
"splice.", Intrinsic::vector_splice)
1295 .
StartsWith(
"reverse.", Intrinsic::vector_reverse)
1296 .
StartsWith(
"interleave2.", Intrinsic::vector_interleave2)
1297 .
StartsWith(
"deinterleave2.", Intrinsic::vector_deinterleave2)
1299 Intrinsic::vector_partial_reduce_add)
1302 const auto *FT =
F->getFunctionType();
1304 if (
ID == Intrinsic::vector_extract ||
1305 ID == Intrinsic::vector_interleave2)
1308 if (
ID != Intrinsic::vector_interleave2)
1310 if (
ID == Intrinsic::vector_insert ||
1311 ID == Intrinsic::vector_partial_reduce_add)
1319 if (Name.consume_front(
"reduce.")) {
1321 static const Regex R(
"^([a-z]+)\\.[a-z][0-9]+");
1322 if (R.match(Name, &
Groups))
1324 .
Case(
"add", Intrinsic::vector_reduce_add)
1325 .
Case(
"mul", Intrinsic::vector_reduce_mul)
1326 .
Case(
"and", Intrinsic::vector_reduce_and)
1327 .
Case(
"or", Intrinsic::vector_reduce_or)
1328 .
Case(
"xor", Intrinsic::vector_reduce_xor)
1329 .
Case(
"smax", Intrinsic::vector_reduce_smax)
1330 .
Case(
"smin", Intrinsic::vector_reduce_smin)
1331 .
Case(
"umax", Intrinsic::vector_reduce_umax)
1332 .
Case(
"umin", Intrinsic::vector_reduce_umin)
1333 .
Case(
"fmax", Intrinsic::vector_reduce_fmax)
1334 .
Case(
"fmin", Intrinsic::vector_reduce_fmin)
1339 static const Regex R2(
"^v2\\.([a-z]+)\\.[fi][0-9]+");
1344 .
Case(
"fadd", Intrinsic::vector_reduce_fadd)
1345 .
Case(
"fmul", Intrinsic::vector_reduce_fmul)
1350 auto Args =
F->getFunctionType()->params();
1352 {Args[V2 ? 1 : 0]});
1359 if (Name.consume_front(
"experimental.stepvector.")) {
1363 F->getParent(),
ID,
F->getFunctionType()->getReturnType());
1368 if (Name.starts_with(
"flt.rounds")) {
1371 Intrinsic::get_rounding);
1376 if (Name.starts_with(
"invariant.group.barrier")) {
1378 auto Args =
F->getFunctionType()->params();
1379 Type* ObjectPtr[1] = {Args[0]};
1382 F->getParent(), Intrinsic::launder_invariant_group, ObjectPtr);
1387 if ((Name.starts_with(
"lifetime.start") ||
1388 Name.starts_with(
"lifetime.end")) &&
1389 F->arg_size() == 2) {
1391 ? Intrinsic::lifetime_start
1392 : Intrinsic::lifetime_end;
1395 F->getArg(0)->getType());
1404 .StartsWith(
"memcpy.", Intrinsic::memcpy)
1405 .StartsWith(
"memmove.", Intrinsic::memmove)
1407 if (
F->arg_size() == 5) {
1411 F->getFunctionType()->params().slice(0, 3);
1417 if (Name.starts_with(
"memset.") &&
F->arg_size() == 5) {
1420 const auto *FT =
F->getFunctionType();
1421 Type *ParamTypes[2] = {
1422 FT->getParamType(0),
1426 Intrinsic::memset, ParamTypes);
1432 if (Name.consume_front(
"nvvm.")) {
1434 if (
F->arg_size() == 1) {
1437 .
Cases(
"brev32",
"brev64", Intrinsic::bitreverse)
1438 .
Case(
"clz.i", Intrinsic::ctlz)
1439 .
Case(
"popc.i", Intrinsic::ctpop)
1443 {F->getReturnType()});
1449 if (!
F->getReturnType()->getScalarType()->isBFloatTy()) {
1477 bool Expand =
false;
1478 if (Name.consume_front(
"abs."))
1481 Name ==
"i" || Name ==
"ll" || Name ==
"bf16" || Name ==
"bf16x2";
1482 else if (Name.consume_front(
"fabs."))
1484 Expand = Name ==
"f" || Name ==
"ftz.f" || Name ==
"d";
1485 else if (Name.consume_front(
"max.") || Name.consume_front(
"min."))
1487 Expand = Name ==
"s" || Name ==
"i" || Name ==
"ll" || Name ==
"us" ||
1488 Name ==
"ui" || Name ==
"ull";
1489 else if (Name.consume_front(
"atomic.load."))
1498 else if (Name.consume_front(
"bitcast."))
1501 Name ==
"f2i" || Name ==
"i2f" || Name ==
"ll2d" || Name ==
"d2ll";
1502 else if (Name.consume_front(
"rotate."))
1504 Expand = Name ==
"b32" || Name ==
"b64" || Name ==
"right.b64";
1505 else if (Name.consume_front(
"ptr.gen.to."))
1508 else if (Name.consume_front(
"ptr."))
1511 else if (Name.consume_front(
"ldg.global."))
1513 Expand = (Name.starts_with(
"i.") || Name.starts_with(
"f.") ||
1514 Name.starts_with(
"p."));
1517 .
Case(
"barrier0",
true)
1518 .
Case(
"barrier.n",
true)
1519 .
Case(
"barrier.sync.cnt",
true)
1520 .
Case(
"barrier.sync",
true)
1521 .
Case(
"barrier",
true)
1522 .
Case(
"bar.sync",
true)
1523 .
Case(
"clz.ll",
true)
1524 .
Case(
"popc.ll",
true)
1526 .
Case(
"swap.lo.hi.b64",
true)
1527 .
Case(
"tanh.approx.f32",
true)
1539 if (Name.starts_with(
"objectsize.")) {
1540 Type *Tys[2] = {
F->getReturnType(),
F->arg_begin()->getType() };
1541 if (
F->arg_size() == 2 ||
F->arg_size() == 3) {
1544 Intrinsic::objectsize, Tys);
1551 if (Name.starts_with(
"ptr.annotation.") &&
F->arg_size() == 4) {
1554 F->getParent(), Intrinsic::ptr_annotation,
1555 {F->arg_begin()->getType(), F->getArg(1)->getType()});
1561 if (Name.consume_front(
"riscv.")) {
1564 .
Case(
"aes32dsi", Intrinsic::riscv_aes32dsi)
1565 .
Case(
"aes32dsmi", Intrinsic::riscv_aes32dsmi)
1566 .
Case(
"aes32esi", Intrinsic::riscv_aes32esi)
1567 .
Case(
"aes32esmi", Intrinsic::riscv_aes32esmi)
1570 if (!
F->getFunctionType()->getParamType(2)->isIntegerTy(32)) {
1583 if (!
F->getFunctionType()->getParamType(2)->isIntegerTy(32) ||
1584 F->getFunctionType()->getReturnType()->isIntegerTy(64)) {
1593 .
StartsWith(
"sha256sig0", Intrinsic::riscv_sha256sig0)
1594 .
StartsWith(
"sha256sig1", Intrinsic::riscv_sha256sig1)
1595 .
StartsWith(
"sha256sum0", Intrinsic::riscv_sha256sum0)
1596 .
StartsWith(
"sha256sum1", Intrinsic::riscv_sha256sum1)
1601 if (
F->getFunctionType()->getReturnType()->isIntegerTy(64)) {
1613 if (Name ==
"stackprotectorcheck") {
1620 if (Name ==
"thread.pointer") {
1622 F->getParent(), Intrinsic::thread_pointer,
F->getReturnType());
1628 if (Name ==
"var.annotation" &&
F->arg_size() == 4) {
1631 F->getParent(), Intrinsic::var_annotation,
1632 {{F->arg_begin()->getType(), F->getArg(1)->getType()}});
1639 if (Name.consume_front(
"wasm.")) {
1642 .
StartsWith(
"fma.", Intrinsic::wasm_relaxed_madd)
1643 .
StartsWith(
"fms.", Intrinsic::wasm_relaxed_nmadd)
1644 .
StartsWith(
"laneselect.", Intrinsic::wasm_relaxed_laneselect)
1649 F->getReturnType());
1653 if (Name.consume_front(
"dot.i8x16.i7x16.")) {
1655 .
Case(
"signed", Intrinsic::wasm_relaxed_dot_i8x16_i7x16_signed)
1657 Intrinsic::wasm_relaxed_dot_i8x16_i7x16_add_signed)
1676 if (ST && (!
ST->isLiteral() ||
ST->isPacked()) &&
1685 auto *FT =
F->getFunctionType();
1688 std::string
Name =
F->getName().str();
1691 Name,
F->getParent());
1702 if (Result != std::nullopt) {
1715 bool CanUpgradeDebugIntrinsicsToRecords) {
1735 GV->
getName() ==
"llvm.global_dtors")) ||
1750 unsigned N =
Init->getNumOperands();
1751 std::vector<Constant *> NewCtors(
N);
1752 for (
unsigned i = 0; i !=
N; ++i) {
1755 Ctor->getAggregateElement(1),
1769 unsigned NumElts = ResultTy->getNumElements() * 8;
1773 Op = Builder.CreateBitCast(
Op, VecTy,
"cast");
1783 for (
unsigned l = 0; l != NumElts; l += 16)
1784 for (
unsigned i = 0; i != 16; ++i) {
1785 unsigned Idx = NumElts + i - Shift;
1787 Idx -= NumElts - 16;
1788 Idxs[l + i] = Idx + l;
1791 Res = Builder.CreateShuffleVector(Res,
Op,
ArrayRef(Idxs, NumElts));
1795 return Builder.CreateBitCast(Res, ResultTy,
"cast");
1803 unsigned NumElts = ResultTy->getNumElements() * 8;
1807 Op = Builder.CreateBitCast(
Op, VecTy,
"cast");
1817 for (
unsigned l = 0; l != NumElts; l += 16)
1818 for (
unsigned i = 0; i != 16; ++i) {
1819 unsigned Idx = i + Shift;
1821 Idx += NumElts - 16;
1822 Idxs[l + i] = Idx + l;
1825 Res = Builder.CreateShuffleVector(
Op, Res,
ArrayRef(Idxs, NumElts));
1829 return Builder.CreateBitCast(Res, ResultTy,
"cast");
1837 Mask = Builder.CreateBitCast(Mask, MaskTy);
1843 for (
unsigned i = 0; i != NumElts; ++i)
1845 Mask = Builder.CreateShuffleVector(Mask, Mask,
ArrayRef(Indices, NumElts),
1856 if (
C->isAllOnesValue())
1861 return Builder.CreateSelect(Mask, Op0, Op1);
1868 if (
C->isAllOnesValue())
1872 Mask->getType()->getIntegerBitWidth());
1873 Mask = Builder.CreateBitCast(Mask, MaskTy);
1874 Mask = Builder.CreateExtractElement(Mask, (
uint64_t)0);
1875 return Builder.CreateSelect(Mask, Op0, Op1);
1888 assert((IsVALIGN || NumElts % 16 == 0) &&
"Illegal NumElts for PALIGNR!");
1889 assert((!IsVALIGN || NumElts <= 16) &&
"NumElts too large for VALIGN!");
1894 ShiftVal &= (NumElts - 1);
1903 if (ShiftVal > 16) {
1911 for (
unsigned l = 0; l < NumElts; l += 16) {
1912 for (
unsigned i = 0; i != 16; ++i) {
1913 unsigned Idx = ShiftVal + i;
1914 if (!IsVALIGN && Idx >= 16)
1915 Idx += NumElts - 16;
1916 Indices[l + i] = Idx + l;
1921 Op1, Op0,
ArrayRef(Indices, NumElts),
"palignr");
1927 bool ZeroMask,
bool IndexForm) {
1930 unsigned EltWidth = Ty->getScalarSizeInBits();
1931 bool IsFloat = Ty->isFPOrFPVectorTy();
1933 if (VecWidth == 128 && EltWidth == 32 && IsFloat)
1934 IID = Intrinsic::x86_avx512_vpermi2var_ps_128;
1935 else if (VecWidth == 128 && EltWidth == 32 && !IsFloat)
1936 IID = Intrinsic::x86_avx512_vpermi2var_d_128;
1937 else if (VecWidth == 128 && EltWidth == 64 && IsFloat)
1938 IID = Intrinsic::x86_avx512_vpermi2var_pd_128;
1939 else if (VecWidth == 128 && EltWidth == 64 && !IsFloat)
1940 IID = Intrinsic::x86_avx512_vpermi2var_q_128;
1941 else if (VecWidth == 256 && EltWidth == 32 && IsFloat)
1942 IID = Intrinsic::x86_avx512_vpermi2var_ps_256;
1943 else if (VecWidth == 256 && EltWidth == 32 && !IsFloat)
1944 IID = Intrinsic::x86_avx512_vpermi2var_d_256;
1945 else if (VecWidth == 256 && EltWidth == 64 && IsFloat)
1946 IID = Intrinsic::x86_avx512_vpermi2var_pd_256;
1947 else if (VecWidth == 256 && EltWidth == 64 && !IsFloat)
1948 IID = Intrinsic::x86_avx512_vpermi2var_q_256;
1949 else if (VecWidth == 512 && EltWidth == 32 && IsFloat)
1950 IID = Intrinsic::x86_avx512_vpermi2var_ps_512;
1951 else if (VecWidth == 512 && EltWidth == 32 && !IsFloat)
1952 IID = Intrinsic::x86_avx512_vpermi2var_d_512;
1953 else if (VecWidth == 512 && EltWidth == 64 && IsFloat)
1954 IID = Intrinsic::x86_avx512_vpermi2var_pd_512;
1955 else if (VecWidth == 512 && EltWidth == 64 && !IsFloat)
1956 IID = Intrinsic::x86_avx512_vpermi2var_q_512;
1957 else if (VecWidth == 128 && EltWidth == 16)
1958 IID = Intrinsic::x86_avx512_vpermi2var_hi_128;
1959 else if (VecWidth == 256 && EltWidth == 16)
1960 IID = Intrinsic::x86_avx512_vpermi2var_hi_256;
1961 else if (VecWidth == 512 && EltWidth == 16)
1962 IID = Intrinsic::x86_avx512_vpermi2var_hi_512;
1963 else if (VecWidth == 128 && EltWidth == 8)
1964 IID = Intrinsic::x86_avx512_vpermi2var_qi_128;
1965 else if (VecWidth == 256 && EltWidth == 8)
1966 IID = Intrinsic::x86_avx512_vpermi2var_qi_256;
1967 else if (VecWidth == 512 && EltWidth == 8)
1968 IID = Intrinsic::x86_avx512_vpermi2var_qi_512;
1979 Value *V = Builder.CreateIntrinsic(IID, Args);
1991 Value *Res = Builder.CreateIntrinsic(IID, Ty, {Op0, Op1});
2002 bool IsRotateRight) {
2012 Amt = Builder.CreateIntCast(Amt, Ty->getScalarType(),
false);
2013 Amt = Builder.CreateVectorSplat(NumElts, Amt);
2016 Intrinsic::ID IID = IsRotateRight ? Intrinsic::fshr : Intrinsic::fshl;
2017 Value *Res = Builder.CreateIntrinsic(IID, Ty, {Src, Src, Amt});
2062 Value *Ext = Builder.CreateSExt(Cmp, Ty);
2067 bool IsShiftRight,
bool ZeroMask) {
2081 Amt = Builder.CreateIntCast(Amt, Ty->getScalarType(),
false);
2082 Amt = Builder.CreateVectorSplat(NumElts, Amt);
2085 Intrinsic::ID IID = IsShiftRight ? Intrinsic::fshr : Intrinsic::fshl;
2086 Value *Res = Builder.CreateIntrinsic(IID, Ty, {Op0, Op1, Amt});
2101 const Align Alignment =
2103 ?
Align(
Data->getType()->getPrimitiveSizeInBits().getFixedValue() / 8)
2108 if (
C->isAllOnesValue())
2109 return Builder.CreateAlignedStore(
Data,
Ptr, Alignment);
2114 return Builder.CreateMaskedStore(
Data,
Ptr, Alignment, Mask);
2120 const Align Alignment =
2129 if (
C->isAllOnesValue())
2130 return Builder.CreateAlignedLoad(ValTy,
Ptr, Alignment);
2135 return Builder.CreateMaskedLoad(ValTy,
Ptr, Alignment, Mask, Passthru);
2141 Value *Res = Builder.CreateIntrinsic(Intrinsic::abs, Ty,
2142 {Op0, Builder.getInt1(
false)});
2157 Constant *ShiftAmt = ConstantInt::get(Ty, 32);
2158 LHS = Builder.CreateShl(
LHS, ShiftAmt);
2159 LHS = Builder.CreateAShr(
LHS, ShiftAmt);
2160 RHS = Builder.CreateShl(
RHS, ShiftAmt);
2161 RHS = Builder.CreateAShr(
RHS, ShiftAmt);
2164 Constant *Mask = ConstantInt::get(Ty, 0xffffffff);
2165 LHS = Builder.CreateAnd(
LHS, Mask);
2166 RHS = Builder.CreateAnd(
RHS, Mask);
2183 if (!
C || !
C->isAllOnesValue())
2184 Vec = Builder.CreateAnd(Vec,
getX86MaskVec(Builder, Mask, NumElts));
2189 for (
unsigned i = 0; i != NumElts; ++i)
2191 for (
unsigned i = NumElts; i != 8; ++i)
2192 Indices[i] = NumElts + i % NumElts;
2193 Vec = Builder.CreateShuffleVector(Vec,
2197 return Builder.CreateBitCast(Vec, Builder.getIntNTy(std::max(NumElts, 8U)));
2201 unsigned CC,
bool Signed) {
2209 }
else if (CC == 7) {
2245 Value* AndNode = Builder.CreateAnd(Mask,
APInt(8, 1));
2246 Value* Cmp = Builder.CreateIsNotNull(AndNode);
2248 Value* Extract2 = Builder.CreateExtractElement(Src, (
uint64_t)0);
2249 Value*
Select = Builder.CreateSelect(Cmp, Extract1, Extract2);
2258 return Builder.CreateSExt(Mask, ReturnOp,
"vpmovm2");
2264 Name = Name.substr(12);
2269 if (Name.starts_with(
"max.p")) {
2270 if (VecWidth == 128 && EltWidth == 32)
2271 IID = Intrinsic::x86_sse_max_ps;
2272 else if (VecWidth == 128 && EltWidth == 64)
2273 IID = Intrinsic::x86_sse2_max_pd;
2274 else if (VecWidth == 256 && EltWidth == 32)
2275 IID = Intrinsic::x86_avx_max_ps_256;
2276 else if (VecWidth == 256 && EltWidth == 64)
2277 IID = Intrinsic::x86_avx_max_pd_256;
2280 }
else if (Name.starts_with(
"min.p")) {
2281 if (VecWidth == 128 && EltWidth == 32)
2282 IID = Intrinsic::x86_sse_min_ps;
2283 else if (VecWidth == 128 && EltWidth == 64)
2284 IID = Intrinsic::x86_sse2_min_pd;
2285 else if (VecWidth == 256 && EltWidth == 32)
2286 IID = Intrinsic::x86_avx_min_ps_256;
2287 else if (VecWidth == 256 && EltWidth == 64)
2288 IID = Intrinsic::x86_avx_min_pd_256;
2291 }
else if (Name.starts_with(
"pshuf.b.")) {
2292 if (VecWidth == 128)
2293 IID = Intrinsic::x86_ssse3_pshuf_b_128;
2294 else if (VecWidth == 256)
2295 IID = Intrinsic::x86_avx2_pshuf_b;
2296 else if (VecWidth == 512)
2297 IID = Intrinsic::x86_avx512_pshuf_b_512;
2300 }
else if (Name.starts_with(
"pmul.hr.sw.")) {
2301 if (VecWidth == 128)
2302 IID = Intrinsic::x86_ssse3_pmul_hr_sw_128;
2303 else if (VecWidth == 256)
2304 IID = Intrinsic::x86_avx2_pmul_hr_sw;
2305 else if (VecWidth == 512)
2306 IID = Intrinsic::x86_avx512_pmul_hr_sw_512;
2309 }
else if (Name.starts_with(
"pmulh.w.")) {
2310 if (VecWidth == 128)
2311 IID = Intrinsic::x86_sse2_pmulh_w;
2312 else if (VecWidth == 256)
2313 IID = Intrinsic::x86_avx2_pmulh_w;
2314 else if (VecWidth == 512)
2315 IID = Intrinsic::x86_avx512_pmulh_w_512;
2318 }
else if (Name.starts_with(
"pmulhu.w.")) {
2319 if (VecWidth == 128)
2320 IID = Intrinsic::x86_sse2_pmulhu_w;
2321 else if (VecWidth == 256)
2322 IID = Intrinsic::x86_avx2_pmulhu_w;
2323 else if (VecWidth == 512)
2324 IID = Intrinsic::x86_avx512_pmulhu_w_512;
2327 }
else if (Name.starts_with(
"pmaddw.d.")) {
2328 if (VecWidth == 128)
2329 IID = Intrinsic::x86_sse2_pmadd_wd;
2330 else if (VecWidth == 256)
2331 IID = Intrinsic::x86_avx2_pmadd_wd;
2332 else if (VecWidth == 512)
2333 IID = Intrinsic::x86_avx512_pmaddw_d_512;
2336 }
else if (Name.starts_with(
"pmaddubs.w.")) {
2337 if (VecWidth == 128)
2338 IID = Intrinsic::x86_ssse3_pmadd_ub_sw_128;
2339 else if (VecWidth == 256)
2340 IID = Intrinsic::x86_avx2_pmadd_ub_sw;
2341 else if (VecWidth == 512)
2342 IID = Intrinsic::x86_avx512_pmaddubs_w_512;
2345 }
else if (Name.starts_with(
"packsswb.")) {
2346 if (VecWidth == 128)
2347 IID = Intrinsic::x86_sse2_packsswb_128;
2348 else if (VecWidth == 256)
2349 IID = Intrinsic::x86_avx2_packsswb;
2350 else if (VecWidth == 512)
2351 IID = Intrinsic::x86_avx512_packsswb_512;
2354 }
else if (Name.starts_with(
"packssdw.")) {
2355 if (VecWidth == 128)
2356 IID = Intrinsic::x86_sse2_packssdw_128;
2357 else if (VecWidth == 256)
2358 IID = Intrinsic::x86_avx2_packssdw;
2359 else if (VecWidth == 512)
2360 IID = Intrinsic::x86_avx512_packssdw_512;
2363 }
else if (Name.starts_with(
"packuswb.")) {
2364 if (VecWidth == 128)
2365 IID = Intrinsic::x86_sse2_packuswb_128;
2366 else if (VecWidth == 256)
2367 IID = Intrinsic::x86_avx2_packuswb;
2368 else if (VecWidth == 512)
2369 IID = Intrinsic::x86_avx512_packuswb_512;
2372 }
else if (Name.starts_with(
"packusdw.")) {
2373 if (VecWidth == 128)
2374 IID = Intrinsic::x86_sse41_packusdw;
2375 else if (VecWidth == 256)
2376 IID = Intrinsic::x86_avx2_packusdw;
2377 else if (VecWidth == 512)
2378 IID = Intrinsic::x86_avx512_packusdw_512;
2381 }
else if (Name.starts_with(
"vpermilvar.")) {
2382 if (VecWidth == 128 && EltWidth == 32)
2383 IID = Intrinsic::x86_avx_vpermilvar_ps;
2384 else if (VecWidth == 128 && EltWidth == 64)
2385 IID = Intrinsic::x86_avx_vpermilvar_pd;
2386 else if (VecWidth == 256 && EltWidth == 32)
2387 IID = Intrinsic::x86_avx_vpermilvar_ps_256;
2388 else if (VecWidth == 256 && EltWidth == 64)
2389 IID = Intrinsic::x86_avx_vpermilvar_pd_256;
2390 else if (VecWidth == 512 && EltWidth == 32)
2391 IID = Intrinsic::x86_avx512_vpermilvar_ps_512;
2392 else if (VecWidth == 512 && EltWidth == 64)
2393 IID = Intrinsic::x86_avx512_vpermilvar_pd_512;
2396 }
else if (Name ==
"cvtpd2dq.256") {
2397 IID = Intrinsic::x86_avx_cvt_pd2dq_256;
2398 }
else if (Name ==
"cvtpd2ps.256") {
2399 IID = Intrinsic::x86_avx_cvt_pd2_ps_256;
2400 }
else if (Name ==
"cvttpd2dq.256") {
2401 IID = Intrinsic::x86_avx_cvtt_pd2dq_256;
2402 }
else if (Name ==
"cvttps2dq.128") {
2403 IID = Intrinsic::x86_sse2_cvttps2dq;
2404 }
else if (Name ==
"cvttps2dq.256") {
2405 IID = Intrinsic::x86_avx_cvtt_ps2dq_256;
2406 }
else if (Name.starts_with(
"permvar.")) {
2408 if (VecWidth == 256 && EltWidth == 32 && IsFloat)
2409 IID = Intrinsic::x86_avx2_permps;
2410 else if (VecWidth == 256 && EltWidth == 32 && !IsFloat)
2411 IID = Intrinsic::x86_avx2_permd;
2412 else if (VecWidth == 256 && EltWidth == 64 && IsFloat)
2413 IID = Intrinsic::x86_avx512_permvar_df_256;
2414 else if (VecWidth == 256 && EltWidth == 64 && !IsFloat)
2415 IID = Intrinsic::x86_avx512_permvar_di_256;
2416 else if (VecWidth == 512 && EltWidth == 32 && IsFloat)
2417 IID = Intrinsic::x86_avx512_permvar_sf_512;
2418 else if (VecWidth == 512 && EltWidth == 32 && !IsFloat)
2419 IID = Intrinsic::x86_avx512_permvar_si_512;
2420 else if (VecWidth == 512 && EltWidth == 64 && IsFloat)
2421 IID = Intrinsic::x86_avx512_permvar_df_512;
2422 else if (VecWidth == 512 && EltWidth == 64 && !IsFloat)
2423 IID = Intrinsic::x86_avx512_permvar_di_512;
2424 else if (VecWidth == 128 && EltWidth == 16)
2425 IID = Intrinsic::x86_avx512_permvar_hi_128;
2426 else if (VecWidth == 256 && EltWidth == 16)
2427 IID = Intrinsic::x86_avx512_permvar_hi_256;
2428 else if (VecWidth == 512 && EltWidth == 16)
2429 IID = Intrinsic::x86_avx512_permvar_hi_512;
2430 else if (VecWidth == 128 && EltWidth == 8)
2431 IID = Intrinsic::x86_avx512_permvar_qi_128;
2432 else if (VecWidth == 256 && EltWidth == 8)
2433 IID = Intrinsic::x86_avx512_permvar_qi_256;
2434 else if (VecWidth == 512 && EltWidth == 8)
2435 IID = Intrinsic::x86_avx512_permvar_qi_512;
2438 }
else if (Name.starts_with(
"dbpsadbw.")) {
2439 if (VecWidth == 128)
2440 IID = Intrinsic::x86_avx512_dbpsadbw_128;
2441 else if (VecWidth == 256)
2442 IID = Intrinsic::x86_avx512_dbpsadbw_256;
2443 else if (VecWidth == 512)
2444 IID = Intrinsic::x86_avx512_dbpsadbw_512;
2447 }
else if (Name.starts_with(
"pmultishift.qb.")) {
2448 if (VecWidth == 128)
2449 IID = Intrinsic::x86_avx512_pmultishift_qb_128;
2450 else if (VecWidth == 256)
2451 IID = Intrinsic::x86_avx512_pmultishift_qb_256;
2452 else if (VecWidth == 512)
2453 IID = Intrinsic::x86_avx512_pmultishift_qb_512;
2456 }
else if (Name.starts_with(
"conflict.")) {
2457 if (Name[9] ==
'd' && VecWidth == 128)
2458 IID = Intrinsic::x86_avx512_conflict_d_128;
2459 else if (Name[9] ==
'd' && VecWidth == 256)
2460 IID = Intrinsic::x86_avx512_conflict_d_256;
2461 else if (Name[9] ==
'd' && VecWidth == 512)
2462 IID = Intrinsic::x86_avx512_conflict_d_512;
2463 else if (Name[9] ==
'q' && VecWidth == 128)
2464 IID = Intrinsic::x86_avx512_conflict_q_128;
2465 else if (Name[9] ==
'q' && VecWidth == 256)
2466 IID = Intrinsic::x86_avx512_conflict_q_256;
2467 else if (Name[9] ==
'q' && VecWidth == 512)
2468 IID = Intrinsic::x86_avx512_conflict_q_512;
2471 }
else if (Name.starts_with(
"pavg.")) {
2472 if (Name[5] ==
'b' && VecWidth == 128)
2473 IID = Intrinsic::x86_sse2_pavg_b;
2474 else if (Name[5] ==
'b' && VecWidth == 256)
2475 IID = Intrinsic::x86_avx2_pavg_b;
2476 else if (Name[5] ==
'b' && VecWidth == 512)
2477 IID = Intrinsic::x86_avx512_pavg_b_512;
2478 else if (Name[5] ==
'w' && VecWidth == 128)
2479 IID = Intrinsic::x86_sse2_pavg_w;
2480 else if (Name[5] ==
'w' && VecWidth == 256)
2481 IID = Intrinsic::x86_avx2_pavg_w;
2482 else if (Name[5] ==
'w' && VecWidth == 512)
2483 IID = Intrinsic::x86_avx512_pavg_w_512;
2492 Rep = Builder.CreateIntrinsic(IID, Args);
2503 if (AsmStr->find(
"mov\tfp") == 0 &&
2504 AsmStr->find(
"objc_retainAutoreleaseReturnValue") != std::string::npos &&
2505 (Pos = AsmStr->find(
"# marker")) != std::string::npos) {
2506 AsmStr->replace(Pos, 1,
";");
2512 Value *Rep =
nullptr;
2514 if (Name ==
"abs.i" || Name ==
"abs.ll") {
2516 Value *Neg = Builder.CreateNeg(Arg,
"neg");
2517 Value *Cmp = Builder.CreateICmpSGE(
2519 Rep = Builder.CreateSelect(Cmp, Arg, Neg,
"abs");
2520 }
else if (Name ==
"abs.bf16" || Name ==
"abs.bf16x2") {
2521 Type *Ty = (Name ==
"abs.bf16")
2525 Value *Abs = Builder.CreateUnaryIntrinsic(Intrinsic::nvvm_fabs, Arg);
2526 Rep = Builder.CreateBitCast(Abs, CI->
getType());
2527 }
else if (Name ==
"fabs.f" || Name ==
"fabs.ftz.f" || Name ==
"fabs.d") {
2528 Intrinsic::ID IID = (Name ==
"fabs.ftz.f") ? Intrinsic::nvvm_fabs_ftz
2529 : Intrinsic::nvvm_fabs;
2530 Rep = Builder.CreateUnaryIntrinsic(IID, CI->
getArgOperand(0));
2531 }
else if (Name.starts_with(
"atomic.load.add.f32.p") ||
2532 Name.starts_with(
"atomic.load.add.f64.p")) {
2537 }
else if (Name.starts_with(
"atomic.load.inc.32.p") ||
2538 Name.starts_with(
"atomic.load.dec.32.p")) {
2545 }
else if (Name.consume_front(
"max.") &&
2546 (Name ==
"s" || Name ==
"i" || Name ==
"ll" || Name ==
"us" ||
2547 Name ==
"ui" || Name ==
"ull")) {
2550 Value *Cmp = Name.starts_with(
"u")
2551 ? Builder.CreateICmpUGE(Arg0, Arg1,
"max.cond")
2552 : Builder.CreateICmpSGE(Arg0, Arg1,
"max.cond");
2553 Rep = Builder.CreateSelect(Cmp, Arg0, Arg1,
"max");
2554 }
else if (Name.consume_front(
"min.") &&
2555 (Name ==
"s" || Name ==
"i" || Name ==
"ll" || Name ==
"us" ||
2556 Name ==
"ui" || Name ==
"ull")) {
2559 Value *Cmp = Name.starts_with(
"u")
2560 ? Builder.CreateICmpULE(Arg0, Arg1,
"min.cond")
2561 : Builder.CreateICmpSLE(Arg0, Arg1,
"min.cond");
2562 Rep = Builder.CreateSelect(Cmp, Arg0, Arg1,
"min");
2563 }
else if (Name ==
"clz.ll") {
2566 Value *Ctlz = Builder.CreateIntrinsic(Intrinsic::ctlz, {Arg->
getType()},
2567 {Arg, Builder.getFalse()},
2569 Rep = Builder.CreateTrunc(Ctlz, Builder.getInt32Ty(),
"ctlz.trunc");
2570 }
else if (Name ==
"popc.ll") {
2574 Value *Popc = Builder.CreateIntrinsic(Intrinsic::ctpop, {Arg->
getType()},
2575 Arg,
nullptr,
"ctpop");
2576 Rep = Builder.CreateTrunc(Popc, Builder.getInt32Ty(),
"ctpop.trunc");
2577 }
else if (Name ==
"h2f") {
2578 Rep = Builder.CreateIntrinsic(Intrinsic::convert_from_fp16,
2581 }
else if (Name.consume_front(
"bitcast.") &&
2582 (Name ==
"f2i" || Name ==
"i2f" || Name ==
"ll2d" ||
2585 }
else if (Name ==
"rotate.b32") {
2588 Rep = Builder.CreateIntrinsic(Builder.getInt32Ty(), Intrinsic::fshl,
2589 {Arg, Arg, ShiftAmt});
2590 }
else if (Name ==
"rotate.b64") {
2594 Rep = Builder.CreateIntrinsic(Int64Ty, Intrinsic::fshl,
2595 {Arg, Arg, ZExtShiftAmt});
2596 }
else if (Name ==
"rotate.right.b64") {
2600 Rep = Builder.CreateIntrinsic(Int64Ty, Intrinsic::fshr,
2601 {Arg, Arg, ZExtShiftAmt});
2602 }
else if (Name ==
"swap.lo.hi.b64") {
2605 Rep = Builder.CreateIntrinsic(Int64Ty, Intrinsic::fshl,
2606 {Arg, Arg, Builder.getInt64(32)});
2607 }
else if ((Name.consume_front(
"ptr.gen.to.") &&
2610 Name.starts_with(
".to.gen"))) {
2612 }
else if (Name.consume_front(
"ldg.global")) {
2616 Value *ASC = Builder.CreateAddrSpaceCast(
Ptr, Builder.getPtrTy(1));
2619 LD->setMetadata(LLVMContext::MD_invariant_load, MD);
2621 }
else if (Name ==
"tanh.approx.f32") {
2625 Rep = Builder.CreateUnaryIntrinsic(Intrinsic::tanh, CI->
getArgOperand(0),
2627 }
else if (Name ==
"barrier0" || Name ==
"barrier.n" || Name ==
"bar.sync") {
2629 Name.ends_with(
'0') ? Builder.getInt32(0) : CI->
getArgOperand(0);
2630 Rep = Builder.CreateIntrinsic(Intrinsic::nvvm_barrier_cta_sync_aligned_all,
2632 }
else if (Name ==
"barrier") {
2633 Rep = Builder.CreateIntrinsic(
2634 Intrinsic::nvvm_barrier_cta_sync_aligned_count, {},
2636 }
else if (Name ==
"barrier.sync") {
2637 Rep = Builder.CreateIntrinsic(Intrinsic::nvvm_barrier_cta_sync_all, {},
2639 }
else if (Name ==
"barrier.sync.cnt") {
2640 Rep = Builder.CreateIntrinsic(Intrinsic::nvvm_barrier_cta_sync_count, {},
2645 !
F->getReturnType()->getScalarType()->isBFloatTy()) {
2655 ? Builder.CreateBitCast(Arg, NewType)
2658 Rep = Builder.CreateCall(NewFn, Args);
2659 if (
F->getReturnType()->isIntegerTy())
2660 Rep = Builder.CreateBitCast(Rep,
F->getReturnType());
2670 Value *Rep =
nullptr;
2672 if (Name.starts_with(
"sse4a.movnt.")) {
2684 Builder.CreateExtractElement(Arg1, (
uint64_t)0,
"extractelement");
2687 SI->setMetadata(LLVMContext::MD_nontemporal,
Node);
2688 }
else if (Name.starts_with(
"avx.movnt.") ||
2689 Name.starts_with(
"avx512.storent.")) {
2701 SI->setMetadata(LLVMContext::MD_nontemporal,
Node);
2702 }
else if (Name ==
"sse2.storel.dq") {
2707 Value *BC0 = Builder.CreateBitCast(Arg1, NewVecTy,
"cast");
2708 Value *Elt = Builder.CreateExtractElement(BC0, (
uint64_t)0);
2709 Builder.CreateAlignedStore(Elt, Arg0,
Align(1));
2710 }
else if (Name.starts_with(
"sse.storeu.") ||
2711 Name.starts_with(
"sse2.storeu.") ||
2712 Name.starts_with(
"avx.storeu.")) {
2715 Builder.CreateAlignedStore(Arg1, Arg0,
Align(1));
2716 }
else if (Name ==
"avx512.mask.store.ss") {
2720 }
else if (Name.starts_with(
"avx512.mask.store")) {
2722 bool Aligned = Name[17] !=
'u';
2725 }
else if (Name.starts_with(
"sse2.pcmp") || Name.starts_with(
"avx2.pcmp")) {
2728 bool CmpEq = Name[9] ==
'e';
2731 Rep = Builder.CreateSExt(Rep, CI->
getType(),
"");
2732 }
else if (Name.starts_with(
"avx512.broadcastm")) {
2739 Rep = Builder.CreateVectorSplat(NumElts, Rep);
2740 }
else if (Name ==
"sse.sqrt.ss" || Name ==
"sse2.sqrt.sd") {
2742 Value *Elt0 = Builder.CreateExtractElement(Vec, (
uint64_t)0);
2743 Elt0 = Builder.CreateIntrinsic(Intrinsic::sqrt, Elt0->
getType(), Elt0);
2744 Rep = Builder.CreateInsertElement(Vec, Elt0, (
uint64_t)0);
2745 }
else if (Name.starts_with(
"avx.sqrt.p") ||
2746 Name.starts_with(
"sse2.sqrt.p") ||
2747 Name.starts_with(
"sse.sqrt.p")) {
2748 Rep = Builder.CreateIntrinsic(Intrinsic::sqrt, CI->
getType(),
2749 {CI->getArgOperand(0)});
2750 }
else if (Name.starts_with(
"avx512.mask.sqrt.p")) {
2754 Intrinsic::ID IID = Name[18] ==
's' ? Intrinsic::x86_avx512_sqrt_ps_512
2755 : Intrinsic::x86_avx512_sqrt_pd_512;
2758 Rep = Builder.CreateIntrinsic(IID, Args);
2760 Rep = Builder.CreateIntrinsic(Intrinsic::sqrt, CI->
getType(),
2761 {CI->getArgOperand(0)});
2765 }
else if (Name.starts_with(
"avx512.ptestm") ||
2766 Name.starts_with(
"avx512.ptestnm")) {
2770 Rep = Builder.CreateAnd(Op0, Op1);
2776 Rep = Builder.CreateICmp(Pred, Rep, Zero);
2778 }
else if (Name.starts_with(
"avx512.mask.pbroadcast")) {
2781 Rep = Builder.CreateVectorSplat(NumElts, CI->
getArgOperand(0));
2784 }
else if (Name.starts_with(
"avx512.kunpck")) {
2789 for (
unsigned i = 0; i != NumElts; ++i)
2798 Rep = Builder.CreateShuffleVector(
RHS,
LHS,
ArrayRef(Indices, NumElts));
2799 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2800 }
else if (Name ==
"avx512.kand.w") {
2803 Rep = Builder.CreateAnd(
LHS,
RHS);
2804 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2805 }
else if (Name ==
"avx512.kandn.w") {
2808 LHS = Builder.CreateNot(
LHS);
2809 Rep = Builder.CreateAnd(
LHS,
RHS);
2810 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2811 }
else if (Name ==
"avx512.kor.w") {
2814 Rep = Builder.CreateOr(
LHS,
RHS);
2815 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2816 }
else if (Name ==
"avx512.kxor.w") {
2819 Rep = Builder.CreateXor(
LHS,
RHS);
2820 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2821 }
else if (Name ==
"avx512.kxnor.w") {
2824 LHS = Builder.CreateNot(
LHS);
2825 Rep = Builder.CreateXor(
LHS,
RHS);
2826 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2827 }
else if (Name ==
"avx512.knot.w") {
2829 Rep = Builder.CreateNot(Rep);
2830 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2831 }
else if (Name ==
"avx512.kortestz.w" || Name ==
"avx512.kortestc.w") {
2834 Rep = Builder.CreateOr(
LHS,
RHS);
2835 Rep = Builder.CreateBitCast(Rep, Builder.getInt16Ty());
2837 if (Name[14] ==
'c')
2841 Rep = Builder.CreateICmpEQ(Rep,
C);
2842 Rep = Builder.CreateZExt(Rep, Builder.getInt32Ty());
2843 }
else if (Name ==
"sse.add.ss" || Name ==
"sse2.add.sd" ||
2844 Name ==
"sse.sub.ss" || Name ==
"sse2.sub.sd" ||
2845 Name ==
"sse.mul.ss" || Name ==
"sse2.mul.sd" ||
2846 Name ==
"sse.div.ss" || Name ==
"sse2.div.sd") {
2849 ConstantInt::get(I32Ty, 0));
2851 ConstantInt::get(I32Ty, 0));
2853 if (Name.contains(
".add."))
2854 EltOp = Builder.CreateFAdd(Elt0, Elt1);
2855 else if (Name.contains(
".sub."))
2856 EltOp = Builder.CreateFSub(Elt0, Elt1);
2857 else if (Name.contains(
".mul."))
2858 EltOp = Builder.CreateFMul(Elt0, Elt1);
2860 EltOp = Builder.CreateFDiv(Elt0, Elt1);
2861 Rep = Builder.CreateInsertElement(CI->
getArgOperand(0), EltOp,
2862 ConstantInt::get(I32Ty, 0));
2863 }
else if (Name.starts_with(
"avx512.mask.pcmp")) {
2865 bool CmpEq = Name[16] ==
'e';
2867 }
else if (Name.starts_with(
"avx512.mask.vpshufbitqmb.")) {
2875 IID = Intrinsic::x86_avx512_vpshufbitqmb_128;
2878 IID = Intrinsic::x86_avx512_vpshufbitqmb_256;
2881 IID = Intrinsic::x86_avx512_vpshufbitqmb_512;
2888 }
else if (Name.starts_with(
"avx512.mask.fpclass.p")) {
2893 if (VecWidth == 128 && EltWidth == 32)
2894 IID = Intrinsic::x86_avx512_fpclass_ps_128;
2895 else if (VecWidth == 256 && EltWidth == 32)
2896 IID = Intrinsic::x86_avx512_fpclass_ps_256;
2897 else if (VecWidth == 512 && EltWidth == 32)
2898 IID = Intrinsic::x86_avx512_fpclass_ps_512;
2899 else if (VecWidth == 128 && EltWidth == 64)
2900 IID = Intrinsic::x86_avx512_fpclass_pd_128;
2901 else if (VecWidth == 256 && EltWidth == 64)
2902 IID = Intrinsic::x86_avx512_fpclass_pd_256;
2903 else if (VecWidth == 512 && EltWidth == 64)
2904 IID = Intrinsic::x86_avx512_fpclass_pd_512;
2911 }
else if (Name.starts_with(
"avx512.cmp.p")) {
2913 Type *OpTy = Args[0]->getType();
2917 if (VecWidth == 128 && EltWidth == 32)
2918 IID = Intrinsic::x86_avx512_mask_cmp_ps_128;
2919 else if (VecWidth == 256 && EltWidth == 32)
2920 IID = Intrinsic::x86_avx512_mask_cmp_ps_256;
2921 else if (VecWidth == 512 && EltWidth == 32)
2922 IID = Intrinsic::x86_avx512_mask_cmp_ps_512;
2923 else if (VecWidth == 128 && EltWidth == 64)
2924 IID = Intrinsic::x86_avx512_mask_cmp_pd_128;
2925 else if (VecWidth == 256 && EltWidth == 64)
2926 IID = Intrinsic::x86_avx512_mask_cmp_pd_256;
2927 else if (VecWidth == 512 && EltWidth == 64)
2928 IID = Intrinsic::x86_avx512_mask_cmp_pd_512;
2933 if (VecWidth == 512)
2935 Args.push_back(Mask);
2937 Rep = Builder.CreateIntrinsic(IID, Args);
2938 }
else if (Name.starts_with(
"avx512.mask.cmp.")) {
2942 }
else if (Name.starts_with(
"avx512.mask.ucmp.")) {
2945 }
else if (Name.starts_with(
"avx512.cvtb2mask.") ||
2946 Name.starts_with(
"avx512.cvtw2mask.") ||
2947 Name.starts_with(
"avx512.cvtd2mask.") ||
2948 Name.starts_with(
"avx512.cvtq2mask.")) {
2953 }
else if (Name ==
"ssse3.pabs.b.128" || Name ==
"ssse3.pabs.w.128" ||
2954 Name ==
"ssse3.pabs.d.128" || Name.starts_with(
"avx2.pabs") ||
2955 Name.starts_with(
"avx512.mask.pabs")) {
2957 }
else if (Name ==
"sse41.pmaxsb" || Name ==
"sse2.pmaxs.w" ||
2958 Name ==
"sse41.pmaxsd" || Name.starts_with(
"avx2.pmaxs") ||
2959 Name.starts_with(
"avx512.mask.pmaxs")) {
2961 }
else if (Name ==
"sse2.pmaxu.b" || Name ==
"sse41.pmaxuw" ||
2962 Name ==
"sse41.pmaxud" || Name.starts_with(
"avx2.pmaxu") ||
2963 Name.starts_with(
"avx512.mask.pmaxu")) {
2965 }
else if (Name ==
"sse41.pminsb" || Name ==
"sse2.pmins.w" ||
2966 Name ==
"sse41.pminsd" || Name.starts_with(
"avx2.pmins") ||
2967 Name.starts_with(
"avx512.mask.pmins")) {
2969 }
else if (Name ==
"sse2.pminu.b" || Name ==
"sse41.pminuw" ||
2970 Name ==
"sse41.pminud" || Name.starts_with(
"avx2.pminu") ||
2971 Name.starts_with(
"avx512.mask.pminu")) {
2973 }
else if (Name ==
"sse2.pmulu.dq" || Name ==
"avx2.pmulu.dq" ||
2974 Name ==
"avx512.pmulu.dq.512" ||
2975 Name.starts_with(
"avx512.mask.pmulu.dq.")) {
2977 }
else if (Name ==
"sse41.pmuldq" || Name ==
"avx2.pmul.dq" ||
2978 Name ==
"avx512.pmul.dq.512" ||
2979 Name.starts_with(
"avx512.mask.pmul.dq.")) {
2981 }
else if (Name ==
"sse.cvtsi2ss" || Name ==
"sse2.cvtsi2sd" ||
2982 Name ==
"sse.cvtsi642ss" || Name ==
"sse2.cvtsi642sd") {
2987 }
else if (Name ==
"avx512.cvtusi2sd") {
2992 }
else if (Name ==
"sse2.cvtss2sd") {
2994 Rep = Builder.CreateFPExt(
2997 }
else if (Name ==
"sse2.cvtdq2pd" || Name ==
"sse2.cvtdq2ps" ||
2998 Name ==
"avx.cvtdq2.pd.256" || Name ==
"avx.cvtdq2.ps.256" ||
2999 Name.starts_with(
"avx512.mask.cvtdq2pd.") ||
3000 Name.starts_with(
"avx512.mask.cvtudq2pd.") ||
3001 Name.starts_with(
"avx512.mask.cvtdq2ps.") ||
3002 Name.starts_with(
"avx512.mask.cvtudq2ps.") ||
3003 Name.starts_with(
"avx512.mask.cvtqq2pd.") ||
3004 Name.starts_with(
"avx512.mask.cvtuqq2pd.") ||
3005 Name ==
"avx512.mask.cvtqq2ps.256" ||
3006 Name ==
"avx512.mask.cvtqq2ps.512" ||
3007 Name ==
"avx512.mask.cvtuqq2ps.256" ||
3008 Name ==
"avx512.mask.cvtuqq2ps.512" || Name ==
"sse2.cvtps2pd" ||
3009 Name ==
"avx.cvt.ps2.pd.256" ||
3010 Name ==
"avx512.mask.cvtps2pd.128" ||
3011 Name ==
"avx512.mask.cvtps2pd.256") {
3016 unsigned NumDstElts = DstTy->getNumElements();
3018 assert(NumDstElts == 2 &&
"Unexpected vector size");
3019 Rep = Builder.CreateShuffleVector(Rep, Rep,
ArrayRef<int>{0, 1});
3022 bool IsPS2PD = SrcTy->getElementType()->isFloatTy();
3023 bool IsUnsigned = Name.contains(
"cvtu");
3025 Rep = Builder.CreateFPExt(Rep, DstTy,
"cvtps2pd");
3029 Intrinsic::ID IID = IsUnsigned ? Intrinsic::x86_avx512_uitofp_round
3030 : Intrinsic::x86_avx512_sitofp_round;
3031 Rep = Builder.CreateIntrinsic(IID, {DstTy, SrcTy},
3034 Rep = IsUnsigned ? Builder.CreateUIToFP(Rep, DstTy,
"cvt")
3035 : Builder.CreateSIToFP(Rep, DstTy,
"cvt");
3041 }
else if (Name.starts_with(
"avx512.mask.vcvtph2ps.") ||
3042 Name.starts_with(
"vcvtph2ps.")) {
3046 unsigned NumDstElts = DstTy->getNumElements();
3047 if (NumDstElts != SrcTy->getNumElements()) {
3048 assert(NumDstElts == 4 &&
"Unexpected vector size");
3049 Rep = Builder.CreateShuffleVector(Rep, Rep,
ArrayRef<int>{0, 1, 2, 3});
3051 Rep = Builder.CreateBitCast(
3053 Rep = Builder.CreateFPExt(Rep, DstTy,
"cvtph2ps");
3057 }
else if (Name.starts_with(
"avx512.mask.load")) {
3059 bool Aligned = Name[16] !=
'u';
3062 }
else if (Name.starts_with(
"avx512.mask.expand.load.")) {
3065 ResultTy->getNumElements());
3067 Rep = Builder.CreateIntrinsic(
3068 Intrinsic::masked_expandload, ResultTy,
3070 }
else if (Name.starts_with(
"avx512.mask.compress.store.")) {
3076 Rep = Builder.CreateIntrinsic(
3077 Intrinsic::masked_compressstore, ResultTy,
3079 }
else if (Name.starts_with(
"avx512.mask.compress.") ||
3080 Name.starts_with(
"avx512.mask.expand.")) {
3084 ResultTy->getNumElements());
3086 bool IsCompress = Name[12] ==
'c';
3087 Intrinsic::ID IID = IsCompress ? Intrinsic::x86_avx512_mask_compress
3088 : Intrinsic::x86_avx512_mask_expand;
3089 Rep = Builder.CreateIntrinsic(
3091 }
else if (Name.starts_with(
"xop.vpcom")) {
3093 if (Name.ends_with(
"ub") || Name.ends_with(
"uw") || Name.ends_with(
"ud") ||
3094 Name.ends_with(
"uq"))
3096 else if (Name.ends_with(
"b") || Name.ends_with(
"w") ||
3097 Name.ends_with(
"d") || Name.ends_with(
"q"))
3106 Name = Name.substr(9);
3107 if (Name.starts_with(
"lt"))
3109 else if (Name.starts_with(
"le"))
3111 else if (Name.starts_with(
"gt"))
3113 else if (Name.starts_with(
"ge"))
3115 else if (Name.starts_with(
"eq"))
3117 else if (Name.starts_with(
"ne"))
3119 else if (Name.starts_with(
"false"))
3121 else if (Name.starts_with(
"true"))
3128 }
else if (Name.starts_with(
"xop.vpcmov")) {
3130 Value *NotSel = Builder.CreateNot(Sel);
3133 Rep = Builder.CreateOr(Sel0, Sel1);
3134 }
else if (Name.starts_with(
"xop.vprot") || Name.starts_with(
"avx512.prol") ||
3135 Name.starts_with(
"avx512.mask.prol")) {
3137 }
else if (Name.starts_with(
"avx512.pror") ||
3138 Name.starts_with(
"avx512.mask.pror")) {
3140 }
else if (Name.starts_with(
"avx512.vpshld.") ||
3141 Name.starts_with(
"avx512.mask.vpshld") ||
3142 Name.starts_with(
"avx512.maskz.vpshld")) {
3143 bool ZeroMask = Name[11] ==
'z';
3145 }
else if (Name.starts_with(
"avx512.vpshrd.") ||
3146 Name.starts_with(
"avx512.mask.vpshrd") ||
3147 Name.starts_with(
"avx512.maskz.vpshrd")) {
3148 bool ZeroMask = Name[11] ==
'z';
3150 }
else if (Name ==
"sse42.crc32.64.8") {
3153 Rep = Builder.CreateIntrinsic(Intrinsic::x86_sse42_crc32_32_8,
3155 Rep = Builder.CreateZExt(Rep, CI->
getType(),
"");
3156 }
else if (Name.starts_with(
"avx.vbroadcast.s") ||
3157 Name.starts_with(
"avx512.vbroadcast.s")) {
3160 Type *EltTy = VecTy->getElementType();
3161 unsigned EltNum = VecTy->getNumElements();
3165 for (
unsigned I = 0;
I < EltNum; ++
I)
3166 Rep = Builder.CreateInsertElement(Rep, Load, ConstantInt::get(I32Ty,
I));
3167 }
else if (Name.starts_with(
"sse41.pmovsx") ||
3168 Name.starts_with(
"sse41.pmovzx") ||
3169 Name.starts_with(
"avx2.pmovsx") ||
3170 Name.starts_with(
"avx2.pmovzx") ||
3171 Name.starts_with(
"avx512.mask.pmovsx") ||
3172 Name.starts_with(
"avx512.mask.pmovzx")) {
3174 unsigned NumDstElts = DstTy->getNumElements();
3178 for (
unsigned i = 0; i != NumDstElts; ++i)
3183 bool DoSext = Name.contains(
"pmovsx");
3185 DoSext ? Builder.CreateSExt(SV, DstTy) : Builder.CreateZExt(SV, DstTy);
3190 }
else if (Name ==
"avx512.mask.pmov.qd.256" ||
3191 Name ==
"avx512.mask.pmov.qd.512" ||
3192 Name ==
"avx512.mask.pmov.wb.256" ||
3193 Name ==
"avx512.mask.pmov.wb.512") {
3198 }
else if (Name.starts_with(
"avx.vbroadcastf128") ||
3199 Name ==
"avx2.vbroadcasti128") {
3205 if (NumSrcElts == 2)
3206 Rep = Builder.CreateShuffleVector(Load,
ArrayRef<int>{0, 1, 0, 1});
3208 Rep = Builder.CreateShuffleVector(Load,
3210 }
else if (Name.starts_with(
"avx512.mask.shuf.i") ||
3211 Name.starts_with(
"avx512.mask.shuf.f")) {
3216 unsigned ControlBitsMask = NumLanes - 1;
3217 unsigned NumControlBits = NumLanes / 2;
3220 for (
unsigned l = 0; l != NumLanes; ++l) {
3221 unsigned LaneMask = (Imm >> (l * NumControlBits)) & ControlBitsMask;
3223 if (l >= NumLanes / 2)
3224 LaneMask += NumLanes;
3225 for (
unsigned i = 0; i != NumElementsInLane; ++i)
3226 ShuffleMask.push_back(LaneMask * NumElementsInLane + i);
3232 }
else if (Name.starts_with(
"avx512.mask.broadcastf") ||
3233 Name.starts_with(
"avx512.mask.broadcasti")) {
3236 unsigned NumDstElts =
3240 for (
unsigned i = 0; i != NumDstElts; ++i)
3241 ShuffleMask[i] = i % NumSrcElts;
3247 }
else if (Name.starts_with(
"avx2.pbroadcast") ||
3248 Name.starts_with(
"avx2.vbroadcast") ||
3249 Name.starts_with(
"avx512.pbroadcast") ||
3250 Name.starts_with(
"avx512.mask.broadcast.s")) {
3257 Rep = Builder.CreateShuffleVector(
Op, M);
3262 }
else if (Name.starts_with(
"sse2.padds.") ||
3263 Name.starts_with(
"avx2.padds.") ||
3264 Name.starts_with(
"avx512.padds.") ||
3265 Name.starts_with(
"avx512.mask.padds.")) {
3267 }
else if (Name.starts_with(
"sse2.psubs.") ||
3268 Name.starts_with(
"avx2.psubs.") ||
3269 Name.starts_with(
"avx512.psubs.") ||
3270 Name.starts_with(
"avx512.mask.psubs.")) {
3272 }
else if (Name.starts_with(
"sse2.paddus.") ||
3273 Name.starts_with(
"avx2.paddus.") ||
3274 Name.starts_with(
"avx512.mask.paddus.")) {
3276 }
else if (Name.starts_with(
"sse2.psubus.") ||
3277 Name.starts_with(
"avx2.psubus.") ||
3278 Name.starts_with(
"avx512.mask.psubus.")) {
3280 }
else if (Name.starts_with(
"avx512.mask.palignr.")) {
3285 }
else if (Name.starts_with(
"avx512.mask.valign.")) {
3289 }
else if (Name ==
"sse2.psll.dq" || Name ==
"avx2.psll.dq") {
3294 }
else if (Name ==
"sse2.psrl.dq" || Name ==
"avx2.psrl.dq") {
3299 }
else if (Name ==
"sse2.psll.dq.bs" || Name ==
"avx2.psll.dq.bs" ||
3300 Name ==
"avx512.psll.dq.512") {
3304 }
else if (Name ==
"sse2.psrl.dq.bs" || Name ==
"avx2.psrl.dq.bs" ||
3305 Name ==
"avx512.psrl.dq.512") {
3309 }
else if (Name ==
"sse41.pblendw" || Name.starts_with(
"sse41.blendp") ||
3310 Name.starts_with(
"avx.blend.p") || Name ==
"avx2.pblendw" ||
3311 Name.starts_with(
"avx2.pblendd.")) {
3316 unsigned NumElts = VecTy->getNumElements();
3319 for (
unsigned i = 0; i != NumElts; ++i)
3320 Idxs[i] = ((Imm >> (i % 8)) & 1) ? i + NumElts : i;
3322 Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs);
3323 }
else if (Name.starts_with(
"avx.vinsertf128.") ||
3324 Name ==
"avx2.vinserti128" ||
3325 Name.starts_with(
"avx512.mask.insert")) {
3329 unsigned DstNumElts =
3331 unsigned SrcNumElts =
3333 unsigned Scale = DstNumElts / SrcNumElts;
3340 for (
unsigned i = 0; i != SrcNumElts; ++i)
3342 for (
unsigned i = SrcNumElts; i != DstNumElts; ++i)
3343 Idxs[i] = SrcNumElts;
3344 Rep = Builder.CreateShuffleVector(Op1, Idxs);
3358 for (
unsigned i = 0; i != DstNumElts; ++i)
3361 for (
unsigned i = 0; i != SrcNumElts; ++i)
3362 Idxs[i + Imm * SrcNumElts] = i + DstNumElts;
3363 Rep = Builder.CreateShuffleVector(Op0, Rep, Idxs);
3369 }
else if (Name.starts_with(
"avx.vextractf128.") ||
3370 Name ==
"avx2.vextracti128" ||
3371 Name.starts_with(
"avx512.mask.vextract")) {
3374 unsigned DstNumElts =
3376 unsigned SrcNumElts =
3378 unsigned Scale = SrcNumElts / DstNumElts;
3385 for (
unsigned i = 0; i != DstNumElts; ++i) {
3386 Idxs[i] = i + (Imm * DstNumElts);
3388 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3394 }
else if (Name.starts_with(
"avx512.mask.perm.df.") ||
3395 Name.starts_with(
"avx512.mask.perm.di.")) {
3399 unsigned NumElts = VecTy->getNumElements();
3402 for (
unsigned i = 0; i != NumElts; ++i)
3403 Idxs[i] = (i & ~0x3) + ((Imm >> (2 * (i & 0x3))) & 3);
3405 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3410 }
else if (Name.starts_with(
"avx.vperm2f128.") || Name ==
"avx2.vperm2i128") {
3422 unsigned HalfSize = NumElts / 2;
3434 unsigned StartIndex = (Imm & 0x01) ? HalfSize : 0;
3435 for (
unsigned i = 0; i < HalfSize; ++i)
3436 ShuffleMask[i] = StartIndex + i;
3439 StartIndex = (Imm & 0x10) ? HalfSize : 0;
3440 for (
unsigned i = 0; i < HalfSize; ++i)
3441 ShuffleMask[i + HalfSize] = NumElts + StartIndex + i;
3443 Rep = Builder.CreateShuffleVector(V0, V1, ShuffleMask);
3445 }
else if (Name.starts_with(
"avx.vpermil.") || Name ==
"sse2.pshuf.d" ||
3446 Name.starts_with(
"avx512.mask.vpermil.p") ||
3447 Name.starts_with(
"avx512.mask.pshuf.d.")) {
3451 unsigned NumElts = VecTy->getNumElements();
3453 unsigned IdxSize = 64 / VecTy->getScalarSizeInBits();
3454 unsigned IdxMask = ((1 << IdxSize) - 1);
3460 for (
unsigned i = 0; i != NumElts; ++i)
3461 Idxs[i] = ((Imm >> ((i * IdxSize) % 8)) & IdxMask) | (i & ~IdxMask);
3463 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3468 }
else if (Name ==
"sse2.pshufl.w" ||
3469 Name.starts_with(
"avx512.mask.pshufl.w.")) {
3475 for (
unsigned l = 0; l != NumElts; l += 8) {
3476 for (
unsigned i = 0; i != 4; ++i)
3477 Idxs[i + l] = ((Imm >> (2 * i)) & 0x3) + l;
3478 for (
unsigned i = 4; i != 8; ++i)
3479 Idxs[i + l] = i + l;
3482 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3487 }
else if (Name ==
"sse2.pshufh.w" ||
3488 Name.starts_with(
"avx512.mask.pshufh.w.")) {
3494 for (
unsigned l = 0; l != NumElts; l += 8) {
3495 for (
unsigned i = 0; i != 4; ++i)
3496 Idxs[i + l] = i + l;
3497 for (
unsigned i = 0; i != 4; ++i)
3498 Idxs[i + l + 4] = ((Imm >> (2 * i)) & 0x3) + 4 + l;
3501 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3506 }
else if (Name.starts_with(
"avx512.mask.shuf.p")) {
3513 unsigned HalfLaneElts = NumLaneElts / 2;
3516 for (
unsigned i = 0; i != NumElts; ++i) {
3518 Idxs[i] = i - (i % NumLaneElts);
3520 if ((i % NumLaneElts) >= HalfLaneElts)
3524 Idxs[i] += (Imm >> ((i * HalfLaneElts) % 8)) & ((1 << HalfLaneElts) - 1);
3527 Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs);
3531 }
else if (Name.starts_with(
"avx512.mask.movddup") ||
3532 Name.starts_with(
"avx512.mask.movshdup") ||
3533 Name.starts_with(
"avx512.mask.movsldup")) {
3539 if (Name.starts_with(
"avx512.mask.movshdup."))
3543 for (
unsigned l = 0; l != NumElts; l += NumLaneElts)
3544 for (
unsigned i = 0; i != NumLaneElts; i += 2) {
3545 Idxs[i + l + 0] = i + l +
Offset;
3546 Idxs[i + l + 1] = i + l +
Offset;
3549 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3553 }
else if (Name.starts_with(
"avx512.mask.punpckl") ||
3554 Name.starts_with(
"avx512.mask.unpckl.")) {
3561 for (
int l = 0; l != NumElts; l += NumLaneElts)
3562 for (
int i = 0; i != NumLaneElts; ++i)
3563 Idxs[i + l] = l + (i / 2) + NumElts * (i % 2);
3565 Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs);
3569 }
else if (Name.starts_with(
"avx512.mask.punpckh") ||
3570 Name.starts_with(
"avx512.mask.unpckh.")) {
3577 for (
int l = 0; l != NumElts; l += NumLaneElts)
3578 for (
int i = 0; i != NumLaneElts; ++i)
3579 Idxs[i + l] = (NumLaneElts / 2) + l + (i / 2) + NumElts * (i % 2);
3581 Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs);
3585 }
else if (Name.starts_with(
"avx512.mask.and.") ||
3586 Name.starts_with(
"avx512.mask.pand.")) {
3589 Rep = Builder.CreateAnd(Builder.CreateBitCast(CI->
getArgOperand(0), ITy),
3591 Rep = Builder.CreateBitCast(Rep, FTy);
3594 }
else if (Name.starts_with(
"avx512.mask.andn.") ||
3595 Name.starts_with(
"avx512.mask.pandn.")) {
3598 Rep = Builder.CreateNot(Builder.CreateBitCast(CI->
getArgOperand(0), ITy));
3599 Rep = Builder.CreateAnd(Rep,
3601 Rep = Builder.CreateBitCast(Rep, FTy);
3604 }
else if (Name.starts_with(
"avx512.mask.or.") ||
3605 Name.starts_with(
"avx512.mask.por.")) {
3608 Rep = Builder.CreateOr(Builder.CreateBitCast(CI->
getArgOperand(0), ITy),
3610 Rep = Builder.CreateBitCast(Rep, FTy);
3613 }
else if (Name.starts_with(
"avx512.mask.xor.") ||
3614 Name.starts_with(
"avx512.mask.pxor.")) {
3617 Rep = Builder.CreateXor(Builder.CreateBitCast(CI->
getArgOperand(0), ITy),
3619 Rep = Builder.CreateBitCast(Rep, FTy);
3622 }
else if (Name.starts_with(
"avx512.mask.padd.")) {
3626 }
else if (Name.starts_with(
"avx512.mask.psub.")) {
3630 }
else if (Name.starts_with(
"avx512.mask.pmull.")) {
3634 }
else if (Name.starts_with(
"avx512.mask.add.p")) {
3635 if (Name.ends_with(
".512")) {
3637 if (Name[17] ==
's')
3638 IID = Intrinsic::x86_avx512_add_ps_512;
3640 IID = Intrinsic::x86_avx512_add_pd_512;
3642 Rep = Builder.CreateIntrinsic(
3650 }
else if (Name.starts_with(
"avx512.mask.div.p")) {
3651 if (Name.ends_with(
".512")) {
3653 if (Name[17] ==
's')
3654 IID = Intrinsic::x86_avx512_div_ps_512;
3656 IID = Intrinsic::x86_avx512_div_pd_512;
3658 Rep = Builder.CreateIntrinsic(
3666 }
else if (Name.starts_with(
"avx512.mask.mul.p")) {
3667 if (Name.ends_with(
".512")) {
3669 if (Name[17] ==
's')
3670 IID = Intrinsic::x86_avx512_mul_ps_512;
3672 IID = Intrinsic::x86_avx512_mul_pd_512;
3674 Rep = Builder.CreateIntrinsic(
3682 }
else if (Name.starts_with(
"avx512.mask.sub.p")) {
3683 if (Name.ends_with(
".512")) {
3685 if (Name[17] ==
's')
3686 IID = Intrinsic::x86_avx512_sub_ps_512;
3688 IID = Intrinsic::x86_avx512_sub_pd_512;
3690 Rep = Builder.CreateIntrinsic(
3698 }
else if ((Name.starts_with(
"avx512.mask.max.p") ||
3699 Name.starts_with(
"avx512.mask.min.p")) &&
3700 Name.drop_front(18) ==
".512") {
3701 bool IsDouble = Name[17] ==
'd';
3702 bool IsMin = Name[13] ==
'i';
3704 {Intrinsic::x86_avx512_max_ps_512, Intrinsic::x86_avx512_max_pd_512},
3705 {Intrinsic::x86_avx512_min_ps_512, Intrinsic::x86_avx512_min_pd_512}};
3708 Rep = Builder.CreateIntrinsic(
3713 }
else if (Name.starts_with(
"avx512.mask.lzcnt.")) {
3715 Builder.CreateIntrinsic(Intrinsic::ctlz, CI->
getType(),
3716 {CI->getArgOperand(0), Builder.getInt1(false)});
3719 }
else if (Name.starts_with(
"avx512.mask.psll")) {
3720 bool IsImmediate = Name[16] ==
'i' || (Name.size() > 18 && Name[18] ==
'i');
3721 bool IsVariable = Name[16] ==
'v';
3722 char Size = Name[16] ==
'.' ? Name[17]
3723 : Name[17] ==
'.' ? Name[18]
3724 : Name[18] ==
'.' ? Name[19]
3728 if (IsVariable && Name[17] !=
'.') {
3729 if (
Size ==
'd' && Name[17] ==
'2')
3730 IID = Intrinsic::x86_avx2_psllv_q;
3731 else if (
Size ==
'd' && Name[17] ==
'4')
3732 IID = Intrinsic::x86_avx2_psllv_q_256;
3733 else if (
Size ==
's' && Name[17] ==
'4')
3734 IID = Intrinsic::x86_avx2_psllv_d;
3735 else if (
Size ==
's' && Name[17] ==
'8')
3736 IID = Intrinsic::x86_avx2_psllv_d_256;
3737 else if (
Size ==
'h' && Name[17] ==
'8')
3738 IID = Intrinsic::x86_avx512_psllv_w_128;
3739 else if (
Size ==
'h' && Name[17] ==
'1')
3740 IID = Intrinsic::x86_avx512_psllv_w_256;
3741 else if (Name[17] ==
'3' && Name[18] ==
'2')
3742 IID = Intrinsic::x86_avx512_psllv_w_512;
3745 }
else if (Name.ends_with(
".128")) {
3747 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_d
3748 : Intrinsic::x86_sse2_psll_d;
3749 else if (
Size ==
'q')
3750 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_q
3751 : Intrinsic::x86_sse2_psll_q;
3752 else if (
Size ==
'w')
3753 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_w
3754 : Intrinsic::x86_sse2_psll_w;
3757 }
else if (Name.ends_with(
".256")) {
3759 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_d
3760 : Intrinsic::x86_avx2_psll_d;
3761 else if (
Size ==
'q')
3762 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_q
3763 : Intrinsic::x86_avx2_psll_q;
3764 else if (
Size ==
'w')
3765 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_w
3766 : Intrinsic::x86_avx2_psll_w;
3771 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_d_512
3772 : IsVariable ? Intrinsic::x86_avx512_psllv_d_512
3773 : Intrinsic::x86_avx512_psll_d_512;
3774 else if (
Size ==
'q')
3775 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_q_512
3776 : IsVariable ? Intrinsic::x86_avx512_psllv_q_512
3777 : Intrinsic::x86_avx512_psll_q_512;
3778 else if (
Size ==
'w')
3779 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_w_512
3780 : Intrinsic::x86_avx512_psll_w_512;
3786 }
else if (Name.starts_with(
"avx512.mask.psrl")) {
3787 bool IsImmediate = Name[16] ==
'i' || (Name.size() > 18 && Name[18] ==
'i');
3788 bool IsVariable = Name[16] ==
'v';
3789 char Size = Name[16] ==
'.' ? Name[17]
3790 : Name[17] ==
'.' ? Name[18]
3791 : Name[18] ==
'.' ? Name[19]
3795 if (IsVariable && Name[17] !=
'.') {
3796 if (
Size ==
'd' && Name[17] ==
'2')
3797 IID = Intrinsic::x86_avx2_psrlv_q;
3798 else if (
Size ==
'd' && Name[17] ==
'4')
3799 IID = Intrinsic::x86_avx2_psrlv_q_256;
3800 else if (
Size ==
's' && Name[17] ==
'4')
3801 IID = Intrinsic::x86_avx2_psrlv_d;
3802 else if (
Size ==
's' && Name[17] ==
'8')
3803 IID = Intrinsic::x86_avx2_psrlv_d_256;
3804 else if (
Size ==
'h' && Name[17] ==
'8')
3805 IID = Intrinsic::x86_avx512_psrlv_w_128;
3806 else if (
Size ==
'h' && Name[17] ==
'1')
3807 IID = Intrinsic::x86_avx512_psrlv_w_256;
3808 else if (Name[17] ==
'3' && Name[18] ==
'2')
3809 IID = Intrinsic::x86_avx512_psrlv_w_512;
3812 }
else if (Name.ends_with(
".128")) {
3814 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_d
3815 : Intrinsic::x86_sse2_psrl_d;
3816 else if (
Size ==
'q')
3817 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_q
3818 : Intrinsic::x86_sse2_psrl_q;
3819 else if (
Size ==
'w')
3820 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_w
3821 : Intrinsic::x86_sse2_psrl_w;
3824 }
else if (Name.ends_with(
".256")) {
3826 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_d
3827 : Intrinsic::x86_avx2_psrl_d;
3828 else if (
Size ==
'q')
3829 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_q
3830 : Intrinsic::x86_avx2_psrl_q;
3831 else if (
Size ==
'w')
3832 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_w
3833 : Intrinsic::x86_avx2_psrl_w;
3838 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_d_512
3839 : IsVariable ? Intrinsic::x86_avx512_psrlv_d_512
3840 : Intrinsic::x86_avx512_psrl_d_512;
3841 else if (
Size ==
'q')
3842 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_q_512
3843 : IsVariable ? Intrinsic::x86_avx512_psrlv_q_512
3844 : Intrinsic::x86_avx512_psrl_q_512;
3845 else if (
Size ==
'w')
3846 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_w_512
3847 : Intrinsic::x86_avx512_psrl_w_512;
3853 }
else if (Name.starts_with(
"avx512.mask.psra")) {
3854 bool IsImmediate = Name[16] ==
'i' || (Name.size() > 18 && Name[18] ==
'i');
3855 bool IsVariable = Name[16] ==
'v';
3856 char Size = Name[16] ==
'.' ? Name[17]
3857 : Name[17] ==
'.' ? Name[18]
3858 : Name[18] ==
'.' ? Name[19]
3862 if (IsVariable && Name[17] !=
'.') {
3863 if (
Size ==
's' && Name[17] ==
'4')
3864 IID = Intrinsic::x86_avx2_psrav_d;
3865 else if (
Size ==
's' && Name[17] ==
'8')
3866 IID = Intrinsic::x86_avx2_psrav_d_256;
3867 else if (
Size ==
'h' && Name[17] ==
'8')
3868 IID = Intrinsic::x86_avx512_psrav_w_128;
3869 else if (
Size ==
'h' && Name[17] ==
'1')
3870 IID = Intrinsic::x86_avx512_psrav_w_256;
3871 else if (Name[17] ==
'3' && Name[18] ==
'2')
3872 IID = Intrinsic::x86_avx512_psrav_w_512;
3875 }
else if (Name.ends_with(
".128")) {
3877 IID = IsImmediate ? Intrinsic::x86_sse2_psrai_d
3878 : Intrinsic::x86_sse2_psra_d;
3879 else if (
Size ==
'q')
3880 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_128
3881 : IsVariable ? Intrinsic::x86_avx512_psrav_q_128
3882 : Intrinsic::x86_avx512_psra_q_128;
3883 else if (
Size ==
'w')
3884 IID = IsImmediate ? Intrinsic::x86_sse2_psrai_w
3885 : Intrinsic::x86_sse2_psra_w;
3888 }
else if (Name.ends_with(
".256")) {
3890 IID = IsImmediate ? Intrinsic::x86_avx2_psrai_d
3891 : Intrinsic::x86_avx2_psra_d;
3892 else if (
Size ==
'q')
3893 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_256
3894 : IsVariable ? Intrinsic::x86_avx512_psrav_q_256
3895 : Intrinsic::x86_avx512_psra_q_256;
3896 else if (
Size ==
'w')
3897 IID = IsImmediate ? Intrinsic::x86_avx2_psrai_w
3898 : Intrinsic::x86_avx2_psra_w;
3903 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_d_512
3904 : IsVariable ? Intrinsic::x86_avx512_psrav_d_512
3905 : Intrinsic::x86_avx512_psra_d_512;
3906 else if (
Size ==
'q')
3907 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_512
3908 : IsVariable ? Intrinsic::x86_avx512_psrav_q_512
3909 : Intrinsic::x86_avx512_psra_q_512;
3910 else if (
Size ==
'w')
3911 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_w_512
3912 : Intrinsic::x86_avx512_psra_w_512;
3918 }
else if (Name.starts_with(
"avx512.mask.move.s")) {
3920 }
else if (Name.starts_with(
"avx512.cvtmask2")) {
3922 }
else if (Name.ends_with(
".movntdqa")) {
3926 LoadInst *LI = Builder.CreateAlignedLoad(
3931 }
else if (Name.starts_with(
"fma.vfmadd.") ||
3932 Name.starts_with(
"fma.vfmsub.") ||
3933 Name.starts_with(
"fma.vfnmadd.") ||
3934 Name.starts_with(
"fma.vfnmsub.")) {
3935 bool NegMul = Name[6] ==
'n';
3936 bool NegAcc = NegMul ? Name[8] ==
's' : Name[7] ==
's';
3937 bool IsScalar = NegMul ? Name[12] ==
's' : Name[11] ==
's';
3948 if (NegMul && !IsScalar)
3949 Ops[0] = Builder.CreateFNeg(
Ops[0]);
3950 if (NegMul && IsScalar)
3951 Ops[1] = Builder.CreateFNeg(
Ops[1]);
3953 Ops[2] = Builder.CreateFNeg(
Ops[2]);
3955 Rep = Builder.CreateIntrinsic(Intrinsic::fma,
Ops[0]->
getType(),
Ops);
3959 }
else if (Name.starts_with(
"fma4.vfmadd.s")) {
3967 Rep = Builder.CreateIntrinsic(Intrinsic::fma,
Ops[0]->
getType(),
Ops);
3971 }
else if (Name.starts_with(
"avx512.mask.vfmadd.s") ||
3972 Name.starts_with(
"avx512.maskz.vfmadd.s") ||
3973 Name.starts_with(
"avx512.mask3.vfmadd.s") ||
3974 Name.starts_with(
"avx512.mask3.vfmsub.s") ||
3975 Name.starts_with(
"avx512.mask3.vfnmsub.s")) {
3976 bool IsMask3 = Name[11] ==
'3';
3977 bool IsMaskZ = Name[11] ==
'z';
3979 Name = Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
3980 bool NegMul = Name[2] ==
'n';
3981 bool NegAcc = NegMul ? Name[4] ==
's' : Name[3] ==
's';
3987 if (NegMul && (IsMask3 || IsMaskZ))
3988 A = Builder.CreateFNeg(
A);
3989 if (NegMul && !(IsMask3 || IsMaskZ))
3990 B = Builder.CreateFNeg(
B);
3992 C = Builder.CreateFNeg(
C);
3994 A = Builder.CreateExtractElement(
A, (
uint64_t)0);
3995 B = Builder.CreateExtractElement(
B, (
uint64_t)0);
3996 C = Builder.CreateExtractElement(
C, (
uint64_t)0);
4003 if (Name.back() ==
'd')
4004 IID = Intrinsic::x86_avx512_vfmadd_f64;
4006 IID = Intrinsic::x86_avx512_vfmadd_f32;
4007 Rep = Builder.CreateIntrinsic(IID,
Ops);
4009 Rep = Builder.CreateFMA(
A,
B,
C);
4018 if (NegAcc && IsMask3)
4023 Rep = Builder.CreateInsertElement(CI->
getArgOperand(IsMask3 ? 2 : 0), Rep,
4025 }
else if (Name.starts_with(
"avx512.mask.vfmadd.p") ||
4026 Name.starts_with(
"avx512.mask.vfnmadd.p") ||
4027 Name.starts_with(
"avx512.mask.vfnmsub.p") ||
4028 Name.starts_with(
"avx512.mask3.vfmadd.p") ||
4029 Name.starts_with(
"avx512.mask3.vfmsub.p") ||
4030 Name.starts_with(
"avx512.mask3.vfnmsub.p") ||
4031 Name.starts_with(
"avx512.maskz.vfmadd.p")) {
4032 bool IsMask3 = Name[11] ==
'3';
4033 bool IsMaskZ = Name[11] ==
'z';
4035 Name = Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
4036 bool NegMul = Name[2] ==
'n';
4037 bool NegAcc = NegMul ? Name[4] ==
's' : Name[3] ==
's';
4043 if (NegMul && (IsMask3 || IsMaskZ))
4044 A = Builder.CreateFNeg(
A);
4045 if (NegMul && !(IsMask3 || IsMaskZ))
4046 B = Builder.CreateFNeg(
B);
4048 C = Builder.CreateFNeg(
C);
4055 if (Name[Name.size() - 5] ==
's')
4056 IID = Intrinsic::x86_avx512_vfmadd_ps_512;
4058 IID = Intrinsic::x86_avx512_vfmadd_pd_512;
4062 Rep = Builder.CreateFMA(
A,
B,
C);
4070 }
else if (Name.starts_with(
"fma.vfmsubadd.p")) {
4074 if (VecWidth == 128 && EltWidth == 32)
4075 IID = Intrinsic::x86_fma_vfmaddsub_ps;
4076 else if (VecWidth == 256 && EltWidth == 32)
4077 IID = Intrinsic::x86_fma_vfmaddsub_ps_256;
4078 else if (VecWidth == 128 && EltWidth == 64)
4079 IID = Intrinsic::x86_fma_vfmaddsub_pd;
4080 else if (VecWidth == 256 && EltWidth == 64)
4081 IID = Intrinsic::x86_fma_vfmaddsub_pd_256;
4087 Ops[2] = Builder.CreateFNeg(
Ops[2]);
4088 Rep = Builder.CreateIntrinsic(IID,
Ops);
4089 }
else if (Name.starts_with(
"avx512.mask.vfmaddsub.p") ||
4090 Name.starts_with(
"avx512.mask3.vfmaddsub.p") ||
4091 Name.starts_with(
"avx512.maskz.vfmaddsub.p") ||
4092 Name.starts_with(
"avx512.mask3.vfmsubadd.p")) {
4093 bool IsMask3 = Name[11] ==
'3';
4094 bool IsMaskZ = Name[11] ==
'z';
4096 Name = Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
4097 bool IsSubAdd = Name[3] ==
's';
4101 if (Name[Name.size() - 5] ==
's')
4102 IID = Intrinsic::x86_avx512_vfmaddsub_ps_512;
4104 IID = Intrinsic::x86_avx512_vfmaddsub_pd_512;
4109 Ops[2] = Builder.CreateFNeg(
Ops[2]);
4111 Rep = Builder.CreateIntrinsic(IID,
Ops);
4120 Value *Odd = Builder.CreateCall(FMA,
Ops);
4121 Ops[2] = Builder.CreateFNeg(
Ops[2]);
4122 Value *Even = Builder.CreateCall(FMA,
Ops);
4128 for (
int i = 0; i != NumElts; ++i)
4129 Idxs[i] = i + (i % 2) * NumElts;
4131 Rep = Builder.CreateShuffleVector(Even, Odd, Idxs);
4139 }
else if (Name.starts_with(
"avx512.mask.pternlog.") ||
4140 Name.starts_with(
"avx512.maskz.pternlog.")) {
4141 bool ZeroMask = Name[11] ==
'z';
4145 if (VecWidth == 128 && EltWidth == 32)
4146 IID = Intrinsic::x86_avx512_pternlog_d_128;
4147 else if (VecWidth == 256 && EltWidth == 32)
4148 IID = Intrinsic::x86_avx512_pternlog_d_256;
4149 else if (VecWidth == 512 && EltWidth == 32)
4150 IID = Intrinsic::x86_avx512_pternlog_d_512;
4151 else if (VecWidth == 128 && EltWidth == 64)
4152 IID = Intrinsic::x86_avx512_pternlog_q_128;
4153 else if (VecWidth == 256 && EltWidth == 64)
4154 IID = Intrinsic::x86_avx512_pternlog_q_256;
4155 else if (VecWidth == 512 && EltWidth == 64)
4156 IID = Intrinsic::x86_avx512_pternlog_q_512;
4162 Rep = Builder.CreateIntrinsic(IID, Args);
4166 }
else if (Name.starts_with(
"avx512.mask.vpmadd52") ||
4167 Name.starts_with(
"avx512.maskz.vpmadd52")) {
4168 bool ZeroMask = Name[11] ==
'z';
4169 bool High = Name[20] ==
'h' || Name[21] ==
'h';
4172 if (VecWidth == 128 && !
High)
4173 IID = Intrinsic::x86_avx512_vpmadd52l_uq_128;
4174 else if (VecWidth == 256 && !
High)
4175 IID = Intrinsic::x86_avx512_vpmadd52l_uq_256;
4176 else if (VecWidth == 512 && !
High)
4177 IID = Intrinsic::x86_avx512_vpmadd52l_uq_512;
4178 else if (VecWidth == 128 &&
High)
4179 IID = Intrinsic::x86_avx512_vpmadd52h_uq_128;
4180 else if (VecWidth == 256 &&
High)
4181 IID = Intrinsic::x86_avx512_vpmadd52h_uq_256;
4182 else if (VecWidth == 512 &&
High)
4183 IID = Intrinsic::x86_avx512_vpmadd52h_uq_512;
4189 Rep = Builder.CreateIntrinsic(IID, Args);
4193 }
else if (Name.starts_with(
"avx512.mask.vpermi2var.") ||
4194 Name.starts_with(
"avx512.mask.vpermt2var.") ||
4195 Name.starts_with(
"avx512.maskz.vpermt2var.")) {
4196 bool ZeroMask = Name[11] ==
'z';
4197 bool IndexForm = Name[17] ==
'i';
4199 }
else if (Name.starts_with(
"avx512.mask.vpdpbusd.") ||
4200 Name.starts_with(
"avx512.maskz.vpdpbusd.") ||
4201 Name.starts_with(
"avx512.mask.vpdpbusds.") ||
4202 Name.starts_with(
"avx512.maskz.vpdpbusds.")) {
4203 bool ZeroMask = Name[11] ==
'z';
4204 bool IsSaturating = Name[ZeroMask ? 21 : 20] ==
's';
4207 if (VecWidth == 128 && !IsSaturating)
4208 IID = Intrinsic::x86_avx512_vpdpbusd_128;
4209 else if (VecWidth == 256 && !IsSaturating)
4210 IID = Intrinsic::x86_avx512_vpdpbusd_256;
4211 else if (VecWidth == 512 && !IsSaturating)
4212 IID = Intrinsic::x86_avx512_vpdpbusd_512;
4213 else if (VecWidth == 128 && IsSaturating)
4214 IID = Intrinsic::x86_avx512_vpdpbusds_128;
4215 else if (VecWidth == 256 && IsSaturating)
4216 IID = Intrinsic::x86_avx512_vpdpbusds_256;
4217 else if (VecWidth == 512 && IsSaturating)
4218 IID = Intrinsic::x86_avx512_vpdpbusds_512;
4228 if (Args[1]->
getType()->isVectorTy() &&
4231 ->isIntegerTy(32) &&
4232 Args[2]->
getType()->isVectorTy() &&
4235 ->isIntegerTy(32)) {
4236 Type *NewArgType =
nullptr;
4237 if (VecWidth == 128)
4239 else if (VecWidth == 256)
4241 else if (VecWidth == 512)
4246 Args[1] = Builder.CreateBitCast(Args[1], NewArgType);
4247 Args[2] = Builder.CreateBitCast(Args[2], NewArgType);
4250 Rep = Builder.CreateIntrinsic(IID, Args);
4254 }
else if (Name.starts_with(
"avx512.mask.vpdpwssd.") ||
4255 Name.starts_with(
"avx512.maskz.vpdpwssd.") ||
4256 Name.starts_with(
"avx512.mask.vpdpwssds.") ||
4257 Name.starts_with(
"avx512.maskz.vpdpwssds.")) {
4258 bool ZeroMask = Name[11] ==
'z';
4259 bool IsSaturating = Name[ZeroMask ? 21 : 20] ==
's';
4262 if (VecWidth == 128 && !IsSaturating)
4263 IID = Intrinsic::x86_avx512_vpdpwssd_128;
4264 else if (VecWidth == 256 && !IsSaturating)
4265 IID = Intrinsic::x86_avx512_vpdpwssd_256;
4266 else if (VecWidth == 512 && !IsSaturating)
4267 IID = Intrinsic::x86_avx512_vpdpwssd_512;
4268 else if (VecWidth == 128 && IsSaturating)
4269 IID = Intrinsic::x86_avx512_vpdpwssds_128;
4270 else if (VecWidth == 256 && IsSaturating)
4271 IID = Intrinsic::x86_avx512_vpdpwssds_256;
4272 else if (VecWidth == 512 && IsSaturating)
4273 IID = Intrinsic::x86_avx512_vpdpwssds_512;
4279 Rep = Builder.CreateIntrinsic(IID, Args);
4283 }
else if (Name ==
"addcarryx.u32" || Name ==
"addcarryx.u64" ||
4284 Name ==
"addcarry.u32" || Name ==
"addcarry.u64" ||
4285 Name ==
"subborrow.u32" || Name ==
"subborrow.u64") {
4287 if (Name[0] ==
'a' && Name.back() ==
'2')
4288 IID = Intrinsic::x86_addcarry_32;
4289 else if (Name[0] ==
'a' && Name.back() ==
'4')
4290 IID = Intrinsic::x86_addcarry_64;
4291 else if (Name[0] ==
's' && Name.back() ==
'2')
4292 IID = Intrinsic::x86_subborrow_32;
4293 else if (Name[0] ==
's' && Name.back() ==
'4')
4294 IID = Intrinsic::x86_subborrow_64;
4301 Value *NewCall = Builder.CreateIntrinsic(IID, Args);
4304 Value *
Data = Builder.CreateExtractValue(NewCall, 1);
4307 Value *CF = Builder.CreateExtractValue(NewCall, 0);
4311 }
else if (Name.starts_with(
"avx512.mask.") &&
4321 if (Name.starts_with(
"neon.bfcvt")) {
4322 if (Name.starts_with(
"neon.bfcvtn2")) {
4324 std::iota(LoMask.
begin(), LoMask.
end(), 0);
4326 std::iota(ConcatMask.
begin(), ConcatMask.
end(), 0);
4327 Value *Inactive = Builder.CreateShuffleVector(CI->
getOperand(0), LoMask);
4330 return Builder.CreateShuffleVector(Inactive, Trunc, ConcatMask);
4331 }
else if (Name.starts_with(
"neon.bfcvtn")) {
4333 std::iota(ConcatMask.
begin(), ConcatMask.
end(), 0);
4337 dbgs() <<
"Trunc: " << *Trunc <<
"\n";
4338 return Builder.CreateShuffleVector(
4341 return Builder.CreateFPTrunc(CI->
getOperand(0),
4344 }
else if (Name.starts_with(
"sve.fcvt")) {
4347 .
Case(
"sve.fcvt.bf16f32", Intrinsic::aarch64_sve_fcvt_bf16f32_v2)
4348 .
Case(
"sve.fcvtnt.bf16f32",
4349 Intrinsic::aarch64_sve_fcvtnt_bf16f32_v2)
4361 if (Args[1]->
getType() != BadPredTy)
4364 Args[1] = Builder.CreateIntrinsic(Intrinsic::aarch64_sve_convert_to_svbool,
4365 BadPredTy, Args[1]);
4366 Args[1] = Builder.CreateIntrinsic(
4367 Intrinsic::aarch64_sve_convert_from_svbool, GoodPredTy, Args[1]);
4369 return Builder.CreateIntrinsic(NewID, Args,
nullptr,
4378 if (Name ==
"mve.vctp64.old") {
4381 Value *VCTP = Builder.CreateIntrinsic(Intrinsic::arm_mve_vctp64, {},
4384 Value *C1 = Builder.CreateIntrinsic(
4385 Intrinsic::arm_mve_pred_v2i,
4387 return Builder.CreateIntrinsic(
4388 Intrinsic::arm_mve_pred_i2v,
4390 }
else if (Name ==
"mve.mull.int.predicated.v2i64.v4i32.v4i1" ||
4391 Name ==
"mve.vqdmull.predicated.v2i64.v4i32.v4i1" ||
4392 Name ==
"mve.vldr.gather.base.predicated.v2i64.v2i64.v4i1" ||
4393 Name ==
"mve.vldr.gather.base.wb.predicated.v2i64.v2i64.v4i1" ||
4395 "mve.vldr.gather.offset.predicated.v2i64.p0i64.v2i64.v4i1" ||
4396 Name ==
"mve.vldr.gather.offset.predicated.v2i64.p0.v2i64.v4i1" ||
4397 Name ==
"mve.vstr.scatter.base.predicated.v2i64.v2i64.v4i1" ||
4398 Name ==
"mve.vstr.scatter.base.wb.predicated.v2i64.v2i64.v4i1" ||
4400 "mve.vstr.scatter.offset.predicated.p0i64.v2i64.v2i64.v4i1" ||
4401 Name ==
"mve.vstr.scatter.offset.predicated.p0.v2i64.v2i64.v4i1" ||
4402 Name ==
"cde.vcx1q.predicated.v2i64.v4i1" ||
4403 Name ==
"cde.vcx1qa.predicated.v2i64.v4i1" ||
4404 Name ==
"cde.vcx2q.predicated.v2i64.v4i1" ||
4405 Name ==
"cde.vcx2qa.predicated.v2i64.v4i1" ||
4406 Name ==
"cde.vcx3q.predicated.v2i64.v4i1" ||
4407 Name ==
"cde.vcx3qa.predicated.v2i64.v4i1") {
4408 std::vector<Type *> Tys;
4412 case Intrinsic::arm_mve_mull_int_predicated:
4413 case Intrinsic::arm_mve_vqdmull_predicated:
4414 case Intrinsic::arm_mve_vldr_gather_base_predicated:
4417 case Intrinsic::arm_mve_vldr_gather_base_wb_predicated:
4418 case Intrinsic::arm_mve_vstr_scatter_base_predicated:
4419 case Intrinsic::arm_mve_vstr_scatter_base_wb_predicated:
4423 case Intrinsic::arm_mve_vldr_gather_offset_predicated:
4427 case Intrinsic::arm_mve_vstr_scatter_offset_predicated:
4431 case Intrinsic::arm_cde_vcx1q_predicated:
4432 case Intrinsic::arm_cde_vcx1qa_predicated:
4433 case Intrinsic::arm_cde_vcx2q_predicated:
4434 case Intrinsic::arm_cde_vcx2qa_predicated:
4435 case Intrinsic::arm_cde_vcx3q_predicated:
4436 case Intrinsic::arm_cde_vcx3qa_predicated:
4443 std::vector<Value *>
Ops;
4445 Type *Ty =
Op->getType();
4446 if (Ty->getScalarSizeInBits() == 1) {
4447 Value *C1 = Builder.CreateIntrinsic(
4448 Intrinsic::arm_mve_pred_v2i,
4450 Op = Builder.CreateIntrinsic(Intrinsic::arm_mve_pred_i2v, {V2I1Ty}, C1);
4455 return Builder.CreateIntrinsic(
ID, Tys,
Ops,
nullptr,
4483 if (NumOperands < 3)
4496 bool IsVolatile =
false;
4500 if (NumOperands > 3)
4505 if (NumOperands > 5) {
4507 IsVolatile = !VolatileArg || !VolatileArg->
isZero();
4521 if (VT->getElementType()->isIntegerTy(16)) {
4524 Val = Builder.CreateBitCast(Val, AsBF16);
4532 Builder.CreateAtomicRMW(RMWOp,
Ptr, Val, std::nullopt, Order, SSID);
4534 unsigned AddrSpace = PtrTy->getAddressSpace();
4537 RMW->
setMetadata(
"amdgpu.no.fine.grained.memory", EmptyMD);
4539 RMW->
setMetadata(
"amdgpu.ignore.denormal.mode", EmptyMD);
4544 MDNode *RangeNotPrivate =
4547 RMW->
setMetadata(LLVMContext::MD_noalias_addrspace, RangeNotPrivate);
4553 return Builder.CreateBitCast(RMW, RetTy);
4574 return MAV->getMetadata();
4581 return I->getDebugLoc().getAsMDNode();
4589 if (Name ==
"label") {
4592 }
else if (Name ==
"assign") {
4599 }
else if (Name ==
"declare") {
4604 }
else if (Name ==
"addr") {
4614 unwrapMAVOp(CI, 1), ExprNode,
nullptr,
nullptr,
nullptr,
4616 }
else if (Name ==
"value") {
4619 unsigned ExprOp = 2;
4633 assert(DR &&
"Unhandled intrinsic kind in upgrade to DbgRecord");
4655 assert(Name.starts_with(
"llvm.") &&
"Intrinsic doesn't start with 'llvm.'");
4656 Name = Name.substr(5);
4658 bool IsX86 = Name.consume_front(
"x86.");
4659 bool IsNVVM = Name.consume_front(
"nvvm.");
4660 bool IsAArch64 = Name.consume_front(
"aarch64.");
4661 bool IsARM = Name.consume_front(
"arm.");
4662 bool IsAMDGCN = Name.consume_front(
"amdgcn.");
4663 bool IsDbg = Name.consume_front(
"dbg.");
4664 Value *Rep =
nullptr;
4666 if (!IsX86 && Name ==
"stackprotectorcheck") {
4668 }
else if (IsNVVM) {
4672 }
else if (IsAArch64) {
4676 }
else if (IsAMDGCN) {
4690 const auto &DefaultCase = [&]() ->
void {
4698 "Unknown function for CallBase upgrade and isn't just a name change");
4706 "Return type must have changed");
4707 assert(OldST->getNumElements() ==
4709 "Must have same number of elements");
4712 CallInst *NewCI = Builder.CreateCall(NewFn, Args);
4715 for (
unsigned Idx = 0; Idx < OldST->getNumElements(); ++Idx) {
4716 Value *Elem = Builder.CreateExtractValue(NewCI, Idx);
4717 Res = Builder.CreateInsertValue(Res, Elem, Idx);
4736 case Intrinsic::arm_neon_vst1:
4737 case Intrinsic::arm_neon_vst2:
4738 case Intrinsic::arm_neon_vst3:
4739 case Intrinsic::arm_neon_vst4:
4740 case Intrinsic::arm_neon_vst2lane:
4741 case Intrinsic::arm_neon_vst3lane:
4742 case Intrinsic::arm_neon_vst4lane: {
4744 NewCall = Builder.CreateCall(NewFn, Args);
4747 case Intrinsic::aarch64_sve_bfmlalb_lane_v2:
4748 case Intrinsic::aarch64_sve_bfmlalt_lane_v2:
4749 case Intrinsic::aarch64_sve_bfdot_lane_v2: {
4754 NewCall = Builder.CreateCall(NewFn, Args);
4757 case Intrinsic::aarch64_sve_ld3_sret:
4758 case Intrinsic::aarch64_sve_ld4_sret:
4759 case Intrinsic::aarch64_sve_ld2_sret: {
4761 Name = Name.substr(5);
4768 unsigned MinElts = RetTy->getMinNumElements() /
N;
4770 Value *NewLdCall = Builder.CreateCall(NewFn, Args);
4772 for (
unsigned I = 0;
I <
N;
I++) {
4773 Value *SRet = Builder.CreateExtractValue(NewLdCall,
I);
4774 Ret = Builder.CreateInsertVector(RetTy, Ret, SRet,
I * MinElts);
4780 case Intrinsic::coro_end: {
4783 NewCall = Builder.CreateCall(NewFn, Args);
4787 case Intrinsic::vector_extract: {
4789 Name = Name.substr(5);
4790 if (!Name.starts_with(
"aarch64.sve.tuple.get")) {
4795 unsigned MinElts = RetTy->getMinNumElements();
4798 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(0), NewIdx});
4802 case Intrinsic::vector_insert: {
4804 Name = Name.substr(5);
4805 if (!Name.starts_with(
"aarch64.sve.tuple")) {
4809 if (Name.starts_with(
"aarch64.sve.tuple.set")) {
4814 NewCall = Builder.CreateCall(
4818 if (Name.starts_with(
"aarch64.sve.tuple.create")) {
4824 assert(
N > 1 &&
"Create is expected to be between 2-4");
4827 unsigned MinElts = RetTy->getMinNumElements() /
N;
4828 for (
unsigned I = 0;
I <
N;
I++) {
4830 Ret = Builder.CreateInsertVector(RetTy, Ret, V,
I * MinElts);
4837 case Intrinsic::arm_neon_bfdot:
4838 case Intrinsic::arm_neon_bfmmla:
4839 case Intrinsic::arm_neon_bfmlalb:
4840 case Intrinsic::arm_neon_bfmlalt:
4841 case Intrinsic::aarch64_neon_bfdot:
4842 case Intrinsic::aarch64_neon_bfmmla:
4843 case Intrinsic::aarch64_neon_bfmlalb:
4844 case Intrinsic::aarch64_neon_bfmlalt: {
4847 "Mismatch between function args and call args");
4848 size_t OperandWidth =
4850 assert((OperandWidth == 64 || OperandWidth == 128) &&
4851 "Unexpected operand width");
4853 auto Iter = CI->
args().begin();
4854 Args.push_back(*Iter++);
4855 Args.push_back(Builder.CreateBitCast(*Iter++, NewTy));
4856 Args.push_back(Builder.CreateBitCast(*Iter++, NewTy));
4857 NewCall = Builder.CreateCall(NewFn, Args);
4861 case Intrinsic::bitreverse:
4862 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(0)});
4865 case Intrinsic::ctlz:
4866 case Intrinsic::cttz:
4868 "Mismatch between function args and call args");
4870 Builder.CreateCall(NewFn, {CI->
getArgOperand(0), Builder.getFalse()});
4873 case Intrinsic::objectsize: {
4874 Value *NullIsUnknownSize =
4878 NewCall = Builder.CreateCall(
4883 case Intrinsic::ctpop:
4884 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(0)});
4887 case Intrinsic::convert_from_fp16:
4888 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(0)});
4891 case Intrinsic::dbg_value: {
4893 Name = Name.substr(5);
4895 if (Name.starts_with(
"dbg.addr")) {
4909 if (
Offset->isZeroValue()) {
4910 NewCall = Builder.CreateCall(
4919 case Intrinsic::ptr_annotation:
4927 NewCall = Builder.CreateCall(
4936 case Intrinsic::var_annotation:
4943 NewCall = Builder.CreateCall(
4952 case Intrinsic::riscv_aes32dsi:
4953 case Intrinsic::riscv_aes32dsmi:
4954 case Intrinsic::riscv_aes32esi:
4955 case Intrinsic::riscv_aes32esmi:
4956 case Intrinsic::riscv_sm4ks:
4957 case Intrinsic::riscv_sm4ed: {
4967 Arg0 = Builder.CreateTrunc(Arg0, Builder.getInt32Ty());
4968 Arg1 = Builder.CreateTrunc(Arg1, Builder.getInt32Ty());
4974 NewCall = Builder.CreateCall(NewFn, {Arg0, Arg1, Arg2});
4975 Value *Res = NewCall;
4977 Res = Builder.CreateIntCast(NewCall, CI->
getType(),
true);
4983 case Intrinsic::nvvm_mapa_shared_cluster: {
4987 Value *Res = NewCall;
4988 Res = Builder.CreateAddrSpaceCast(
4995 case Intrinsic::nvvm_cp_async_bulk_global_to_shared_cluster:
4996 case Intrinsic::nvvm_cp_async_bulk_shared_cta_to_cluster: {
4999 Args[0] = Builder.CreateAddrSpaceCast(
5002 NewCall = Builder.CreateCall(NewFn, Args);
5008 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_3d:
5009 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_4d:
5010 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_5d:
5011 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_1d:
5012 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_2d:
5013 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_3d:
5014 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_4d:
5015 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_5d: {
5022 Args[0] = Builder.CreateAddrSpaceCast(
5031 Args.push_back(ConstantInt::get(Builder.getInt32Ty(), 0));
5033 NewCall = Builder.CreateCall(NewFn, Args);
5039 case Intrinsic::riscv_sha256sig0:
5040 case Intrinsic::riscv_sha256sig1:
5041 case Intrinsic::riscv_sha256sum0:
5042 case Intrinsic::riscv_sha256sum1:
5043 case Intrinsic::riscv_sm3p0:
5044 case Intrinsic::riscv_sm3p1: {
5051 Builder.CreateTrunc(CI->
getArgOperand(0), Builder.getInt32Ty());
5053 NewCall = Builder.CreateCall(NewFn, Arg);
5055 Builder.CreateIntCast(NewCall, CI->
getType(),
true);
5062 case Intrinsic::x86_xop_vfrcz_ss:
5063 case Intrinsic::x86_xop_vfrcz_sd:
5064 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(1)});
5067 case Intrinsic::x86_xop_vpermil2pd:
5068 case Intrinsic::x86_xop_vpermil2ps:
5069 case Intrinsic::x86_xop_vpermil2pd_256:
5070 case Intrinsic::x86_xop_vpermil2ps_256: {
5074 Args[2] = Builder.CreateBitCast(Args[2], IntIdxTy);
5075 NewCall = Builder.CreateCall(NewFn, Args);
5079 case Intrinsic::x86_sse41_ptestc:
5080 case Intrinsic::x86_sse41_ptestz:
5081 case Intrinsic::x86_sse41_ptestnzc: {
5095 Value *BC0 = Builder.CreateBitCast(Arg0, NewVecTy,
"cast");
5096 Value *BC1 = Builder.CreateBitCast(Arg1, NewVecTy,
"cast");
5098 NewCall = Builder.CreateCall(NewFn, {BC0, BC1});
5102 case Intrinsic::x86_rdtscp: {
5108 NewCall = Builder.CreateCall(NewFn);
5110 Value *
Data = Builder.CreateExtractValue(NewCall, 1);
5113 Value *TSC = Builder.CreateExtractValue(NewCall, 0);
5121 case Intrinsic::x86_sse41_insertps:
5122 case Intrinsic::x86_sse41_dppd:
5123 case Intrinsic::x86_sse41_dpps:
5124 case Intrinsic::x86_sse41_mpsadbw:
5125 case Intrinsic::x86_avx_dp_ps_256:
5126 case Intrinsic::x86_avx2_mpsadbw: {
5132 Args.back() = Builder.CreateTrunc(Args.back(),
Type::getInt8Ty(
C),
"trunc");
5133 NewCall = Builder.CreateCall(NewFn, Args);
5137 case Intrinsic::x86_avx512_mask_cmp_pd_128:
5138 case Intrinsic::x86_avx512_mask_cmp_pd_256:
5139 case Intrinsic::x86_avx512_mask_cmp_pd_512:
5140 case Intrinsic::x86_avx512_mask_cmp_ps_128:
5141 case Intrinsic::x86_avx512_mask_cmp_ps_256:
5142 case Intrinsic::x86_avx512_mask_cmp_ps_512: {
5148 NewCall = Builder.CreateCall(NewFn, Args);
5157 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_128:
5158 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_256:
5159 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_512:
5160 case Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128:
5161 case Intrinsic::x86_avx512bf16_cvtneps2bf16_256:
5162 case Intrinsic::x86_avx512bf16_cvtneps2bf16_512: {
5166 Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128)
5167 Args[1] = Builder.CreateBitCast(
5170 NewCall = Builder.CreateCall(NewFn, Args);
5171 Value *Res = Builder.CreateBitCast(
5179 case Intrinsic::x86_avx512bf16_dpbf16ps_128:
5180 case Intrinsic::x86_avx512bf16_dpbf16ps_256:
5181 case Intrinsic::x86_avx512bf16_dpbf16ps_512:{
5185 Args[1] = Builder.CreateBitCast(
5187 Args[2] = Builder.CreateBitCast(
5190 NewCall = Builder.CreateCall(NewFn, Args);
5194 case Intrinsic::thread_pointer: {
5195 NewCall = Builder.CreateCall(NewFn, {});
5199 case Intrinsic::memcpy:
5200 case Intrinsic::memmove:
5201 case Intrinsic::memset: {
5217 NewCall = Builder.CreateCall(NewFn, Args);
5219 AttributeList NewAttrs = AttributeList::get(
5220 C, OldAttrs.getFnAttrs(), OldAttrs.getRetAttrs(),
5221 {OldAttrs.getParamAttrs(0), OldAttrs.getParamAttrs(1),
5222 OldAttrs.getParamAttrs(2), OldAttrs.getParamAttrs(4)});
5227 MemCI->setDestAlignment(
Align->getMaybeAlignValue());
5230 MTI->setSourceAlignment(
Align->getMaybeAlignValue());
5234 case Intrinsic::lifetime_start:
5235 case Intrinsic::lifetime_end: {
5243 Ptr =
Ptr->stripPointerCasts();
5247 NewCall = Builder.CreateLifetimeStart(
Ptr);
5249 NewCall = Builder.CreateLifetimeEnd(
Ptr);
5258 case Intrinsic::x86_avx512_vpdpbusd_128:
5259 case Intrinsic::x86_avx512_vpdpbusd_256:
5260 case Intrinsic::x86_avx512_vpdpbusd_512:
5261 case Intrinsic::x86_avx512_vpdpbusds_128:
5262 case Intrinsic::x86_avx512_vpdpbusds_256:
5263 case Intrinsic::x86_avx512_vpdpbusds_512:
5264 case Intrinsic::x86_avx2_vpdpbssd_128:
5265 case Intrinsic::x86_avx2_vpdpbssd_256:
5266 case Intrinsic::x86_avx10_vpdpbssd_512:
5267 case Intrinsic::x86_avx2_vpdpbssds_128:
5268 case Intrinsic::x86_avx2_vpdpbssds_256:
5269 case Intrinsic::x86_avx10_vpdpbssds_512:
5270 case Intrinsic::x86_avx2_vpdpbsud_128:
5271 case Intrinsic::x86_avx2_vpdpbsud_256:
5272 case Intrinsic::x86_avx10_vpdpbsud_512:
5273 case Intrinsic::x86_avx2_vpdpbsuds_128:
5274 case Intrinsic::x86_avx2_vpdpbsuds_256:
5275 case Intrinsic::x86_avx10_vpdpbsuds_512:
5276 case Intrinsic::x86_avx2_vpdpbuud_128:
5277 case Intrinsic::x86_avx2_vpdpbuud_256:
5278 case Intrinsic::x86_avx10_vpdpbuud_512:
5279 case Intrinsic::x86_avx2_vpdpbuuds_128:
5280 case Intrinsic::x86_avx2_vpdpbuuds_256:
5281 case Intrinsic::x86_avx10_vpdpbuuds_512: {
5286 Args[1] = Builder.CreateBitCast(Args[1], NewArgType);
5287 Args[2] = Builder.CreateBitCast(Args[2], NewArgType);
5289 NewCall = Builder.CreateCall(NewFn, Args);
5293 assert(NewCall &&
"Should have either set this variable or returned through "
5294 "the default case");
5301 assert(
F &&
"Illegal attempt to upgrade a non-existent intrinsic.");
5315 F->eraseFromParent();
5321 if (NumOperands == 0)
5329 if (NumOperands == 3) {
5333 Metadata *Elts2[] = {ScalarType, ScalarType,
5347 if (
Opc != Instruction::BitCast)
5351 Type *SrcTy = V->getType();
5368 if (
Opc != Instruction::BitCast)
5371 Type *SrcTy =
C->getType();
5398 if (
NamedMDNode *ModFlags = M.getModuleFlagsMetadata()) {
5399 auto OpIt =
find_if(ModFlags->operands(), [](
const MDNode *Flag) {
5400 if (Flag->getNumOperands() < 3)
5402 if (MDString *K = dyn_cast_or_null<MDString>(Flag->getOperand(1)))
5403 return K->getString() ==
"Debug Info Version";
5406 if (OpIt != ModFlags->op_end()) {
5407 const MDOperand &ValOp = (*OpIt)->getOperand(2);
5414 bool BrokenDebugInfo =
false;
5417 if (!BrokenDebugInfo)
5423 M.getContext().diagnose(Diag);
5430 M.getContext().diagnose(DiagVersion);
5440 StringRef Vect3[3] = {DefaultValue, DefaultValue, DefaultValue};
5443 if (
F->hasFnAttribute(Attr)) {
5446 StringRef S =
F->getFnAttribute(Attr).getValueAsString();
5448 auto [Part, Rest] = S.
split(
',');
5454 const unsigned Dim = DimC -
'x';
5455 assert(Dim < 3 &&
"Unexpected dim char");
5465 F->addFnAttr(Attr, NewAttr);
5469 return S ==
"x" || S ==
"y" || S ==
"z";
5474 if (K ==
"kernel") {
5486 const unsigned Idx = (AlignIdxValuePair >> 16);
5487 const Align StackAlign =
Align(AlignIdxValuePair & 0xFFFF);
5492 if (K ==
"maxclusterrank" || K ==
"cluster_max_blocks") {
5497 if (K ==
"minctasm") {
5502 if (K ==
"maxnreg") {
5507 if (K.consume_front(
"maxntid") &&
isXYZ(K)) {
5511 if (K.consume_front(
"reqntid") &&
isXYZ(K)) {
5515 if (K.consume_front(
"cluster_dim_") &&
isXYZ(K)) {
5519 if (K ==
"grid_constant") {
5534 NamedMDNode *NamedMD = M.getNamedMetadata(
"nvvm.annotations");
5541 if (!SeenNodes.
insert(MD).second)
5548 assert((MD->getNumOperands() % 2) == 1 &&
"Invalid number of operands");
5555 for (
unsigned j = 1, je = MD->getNumOperands(); j < je; j += 2) {
5557 const MDOperand &V = MD->getOperand(j + 1);
5560 NewOperands.
append({K, V});
5563 if (NewOperands.
size() > 1)
5576 const char *MarkerKey =
"clang.arc.retainAutoreleasedReturnValueMarker";
5577 NamedMDNode *ModRetainReleaseMarker = M.getNamedMetadata(MarkerKey);
5578 if (ModRetainReleaseMarker) {
5584 ID->getString().split(ValueComp,
"#");
5585 if (ValueComp.
size() == 2) {
5586 std::string NewValue = ValueComp[0].str() +
";" + ValueComp[1].str();
5590 M.eraseNamedMetadata(ModRetainReleaseMarker);
5601 auto UpgradeToIntrinsic = [&](
const char *OldFunc,
5627 bool InvalidCast =
false;
5629 for (
unsigned I = 0, E = CI->
arg_size();
I != E; ++
I) {
5642 Arg = Builder.CreateBitCast(Arg, NewFuncTy->
getParamType(
I));
5644 Args.push_back(Arg);
5651 CallInst *NewCall = Builder.CreateCall(NewFuncTy, NewFn, Args);
5656 Value *NewRetVal = Builder.CreateBitCast(NewCall, CI->
getType());
5669 UpgradeToIntrinsic(
"clang.arc.use", llvm::Intrinsic::objc_clang_arc_use);
5677 std::pair<const char *, llvm::Intrinsic::ID> RuntimeFuncs[] = {
5678 {
"objc_autorelease", llvm::Intrinsic::objc_autorelease},
5679 {
"objc_autoreleasePoolPop", llvm::Intrinsic::objc_autoreleasePoolPop},
5680 {
"objc_autoreleasePoolPush", llvm::Intrinsic::objc_autoreleasePoolPush},
5681 {
"objc_autoreleaseReturnValue",
5682 llvm::Intrinsic::objc_autoreleaseReturnValue},
5683 {
"objc_copyWeak", llvm::Intrinsic::objc_copyWeak},
5684 {
"objc_destroyWeak", llvm::Intrinsic::objc_destroyWeak},
5685 {
"objc_initWeak", llvm::Intrinsic::objc_initWeak},
5686 {
"objc_loadWeak", llvm::Intrinsic::objc_loadWeak},
5687 {
"objc_loadWeakRetained", llvm::Intrinsic::objc_loadWeakRetained},
5688 {
"objc_moveWeak", llvm::Intrinsic::objc_moveWeak},
5689 {
"objc_release", llvm::Intrinsic::objc_release},
5690 {
"objc_retain", llvm::Intrinsic::objc_retain},
5691 {
"objc_retainAutorelease", llvm::Intrinsic::objc_retainAutorelease},
5692 {
"objc_retainAutoreleaseReturnValue",
5693 llvm::Intrinsic::objc_retainAutoreleaseReturnValue},
5694 {
"objc_retainAutoreleasedReturnValue",
5695 llvm::Intrinsic::objc_retainAutoreleasedReturnValue},
5696 {
"objc_retainBlock", llvm::Intrinsic::objc_retainBlock},
5697 {
"objc_storeStrong", llvm::Intrinsic::objc_storeStrong},
5698 {
"objc_storeWeak", llvm::Intrinsic::objc_storeWeak},
5699 {
"objc_unsafeClaimAutoreleasedReturnValue",
5700 llvm::Intrinsic::objc_unsafeClaimAutoreleasedReturnValue},
5701 {
"objc_retainedObject", llvm::Intrinsic::objc_retainedObject},
5702 {
"objc_unretainedObject", llvm::Intrinsic::objc_unretainedObject},
5703 {
"objc_unretainedPointer", llvm::Intrinsic::objc_unretainedPointer},
5704 {
"objc_retain_autorelease", llvm::Intrinsic::objc_retain_autorelease},
5705 {
"objc_sync_enter", llvm::Intrinsic::objc_sync_enter},
5706 {
"objc_sync_exit", llvm::Intrinsic::objc_sync_exit},
5707 {
"objc_arc_annotation_topdown_bbstart",
5708 llvm::Intrinsic::objc_arc_annotation_topdown_bbstart},
5709 {
"objc_arc_annotation_topdown_bbend",
5710 llvm::Intrinsic::objc_arc_annotation_topdown_bbend},
5711 {
"objc_arc_annotation_bottomup_bbstart",
5712 llvm::Intrinsic::objc_arc_annotation_bottomup_bbstart},
5713 {
"objc_arc_annotation_bottomup_bbend",
5714 llvm::Intrinsic::objc_arc_annotation_bottomup_bbend}};
5716 for (
auto &
I : RuntimeFuncs)
5717 UpgradeToIntrinsic(
I.first,
I.second);
5721 NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
5725 bool HasObjCFlag =
false, HasClassProperties =
false,
Changed =
false;
5726 bool HasSwiftVersionFlag =
false;
5727 uint8_t SwiftMajorVersion, SwiftMinorVersion;
5734 if (
Op->getNumOperands() != 3)
5748 if (
ID->getString() ==
"Objective-C Image Info Version")
5750 if (
ID->getString() ==
"Objective-C Class Properties")
5751 HasClassProperties =
true;
5753 if (
ID->getString() ==
"PIC Level") {
5754 if (
auto *Behavior =
5756 uint64_t V = Behavior->getLimitedValue();
5762 if (
ID->getString() ==
"PIE Level")
5763 if (
auto *Behavior =
5770 if (
ID->getString() ==
"branch-target-enforcement" ||
5771 ID->getString().starts_with(
"sign-return-address")) {
5772 if (
auto *Behavior =
5778 Op->getOperand(1),
Op->getOperand(2)};
5788 if (
ID->getString() ==
"Objective-C Image Info Section") {
5791 Value->getString().split(ValueComp,
" ");
5792 if (ValueComp.
size() != 1) {
5793 std::string NewValue;
5794 for (
auto &S : ValueComp)
5795 NewValue += S.str();
5806 if (
ID->getString() ==
"Objective-C Garbage Collection") {
5809 assert(Md->getValue() &&
"Expected non-empty metadata");
5810 auto Type = Md->getValue()->getType();
5813 unsigned Val = Md->getValue()->getUniqueInteger().getZExtValue();
5814 if ((Val & 0xff) != Val) {
5815 HasSwiftVersionFlag =
true;
5816 SwiftABIVersion = (Val & 0xff00) >> 8;
5817 SwiftMajorVersion = (Val & 0xff000000) >> 24;
5818 SwiftMinorVersion = (Val & 0xff0000) >> 16;
5829 if (
ID->getString() ==
"amdgpu_code_object_version") {
5832 MDString::get(M.getContext(),
"amdhsa_code_object_version"),
5844 if (HasObjCFlag && !HasClassProperties) {
5850 if (HasSwiftVersionFlag) {
5854 ConstantInt::get(Int8Ty, SwiftMajorVersion));
5856 ConstantInt::get(Int8Ty, SwiftMinorVersion));
5864 auto TrimSpaces = [](
StringRef Section) -> std::string {
5866 Section.split(Components,
',');
5871 for (
auto Component : Components)
5872 OS <<
',' << Component.trim();
5877 for (
auto &GV : M.globals()) {
5878 if (!GV.hasSection())
5883 if (!Section.starts_with(
"__DATA, __objc_catlist"))
5888 GV.setSection(TrimSpaces(Section));
5904struct StrictFPUpgradeVisitor :
public InstVisitor<StrictFPUpgradeVisitor> {
5905 StrictFPUpgradeVisitor() =
default;
5908 if (!
Call.isStrictFP())
5914 Call.removeFnAttr(Attribute::StrictFP);
5915 Call.addFnAttr(Attribute::NoBuiltin);
5920struct AMDGPUUnsafeFPAtomicsUpgradeVisitor
5921 :
public InstVisitor<AMDGPUUnsafeFPAtomicsUpgradeVisitor> {
5922 AMDGPUUnsafeFPAtomicsUpgradeVisitor() =
default;
5924 void visitAtomicRMWInst(AtomicRMWInst &RMW) {
5939 if (!
F.isDeclaration() && !
F.hasFnAttribute(Attribute::StrictFP)) {
5940 StrictFPUpgradeVisitor SFPV;
5945 F.removeRetAttrs(AttributeFuncs::typeIncompatible(
5946 F.getReturnType(),
F.getAttributes().getRetAttrs()));
5947 for (
auto &Arg :
F.args())
5949 AttributeFuncs::typeIncompatible(Arg.getType(), Arg.getAttributes()));
5953 if (
Attribute A =
F.getFnAttribute(
"implicit-section-name");
5954 A.isValid() &&
A.isStringAttribute()) {
5955 F.setSection(
A.getValueAsString());
5956 F.removeFnAttr(
"implicit-section-name");
5963 if (
Attribute A =
F.getFnAttribute(
"amdgpu-unsafe-fp-atomics");
5966 if (
A.getValueAsBool()) {
5967 AMDGPUUnsafeFPAtomicsUpgradeVisitor Visitor;
5973 F.removeFnAttr(
"amdgpu-unsafe-fp-atomics");
5982 if (
T->getNumOperands() < 1)
5987 return S->getString().starts_with(
"llvm.vectorizer.");
5991 StringRef OldPrefix =
"llvm.vectorizer.";
5994 if (OldTag ==
"llvm.vectorizer.unroll")
6006 if (
T->getNumOperands() < 1)
6011 if (!OldTag->getString().starts_with(
"llvm.vectorizer."))
6016 Ops.reserve(
T->getNumOperands());
6018 for (
unsigned I = 1,
E =
T->getNumOperands();
I !=
E; ++
I)
6019 Ops.push_back(
T->getOperand(
I));
6033 Ops.reserve(
T->getNumOperands());
6044 if (((
T.isAMDGPU() && !
T.isAMDGCN()) ||
6045 (
T.isSPIR() || (
T.isSPIRV() && !
T.isSPIRVLogical()))) &&
6046 !
DL.contains(
"-G") && !
DL.starts_with(
"G")) {
6047 return DL.empty() ? std::string(
"G1") : (
DL +
"-G1").str();
6050 if (
T.isLoongArch64() ||
T.isRISCV64()) {
6052 auto I =
DL.find(
"-n64-");
6054 return (
DL.take_front(
I) +
"-n32:64-" +
DL.drop_front(
I + 5)).str();
6058 std::string Res =
DL.str();
6062 if (!
DL.contains(
"-G") && !
DL.starts_with(
"G"))
6063 Res.append(Res.empty() ?
"G1" :
"-G1");
6068 if (!
DL.contains(
"-ni") && !
DL.starts_with(
"ni"))
6069 Res.append(
"-ni:7:8:9");
6071 if (
DL.ends_with(
"ni:7"))
6073 if (
DL.ends_with(
"ni:7:8"))
6078 if (!
DL.contains(
"-p7") && !
DL.starts_with(
"p7"))
6079 Res.append(
"-p7:160:256:256:32");
6080 if (!
DL.contains(
"-p8") && !
DL.starts_with(
"p8"))
6081 Res.append(
"-p8:128:128:128:48");
6082 constexpr StringRef OldP8(
"-p8:128:128-");
6083 if (
DL.contains(OldP8))
6084 Res.replace(Res.find(OldP8), OldP8.
size(),
"-p8:128:128:128:48-");
6085 if (!
DL.contains(
"-p9") && !
DL.starts_with(
"p9"))
6086 Res.append(
"-p9:192:256:256:32");
6091 auto AddPtr32Ptr64AddrSpaces = [&
DL, &Res]() {
6094 StringRef AddrSpaces{
"-p270:32:32-p271:32:32-p272:64:64"};
6095 if (!
DL.contains(AddrSpaces)) {
6097 Regex R(
"^([Ee]-m:[a-z](-p:32:32)?)(-.*)$");
6098 if (R.match(Res, &
Groups))
6104 if (
T.isAArch64()) {
6106 if (!
DL.empty() && !
DL.contains(
"-Fn32"))
6107 Res.append(
"-Fn32");
6108 AddPtr32Ptr64AddrSpaces();
6112 if (
T.isSPARC() || (
T.isMIPS64() && !
DL.contains(
"m:m")) ||
T.isPPC64() ||
6116 std::string I64 =
"-i64:64";
6117 std::string I128 =
"-i128:128";
6119 size_t Pos = Res.find(I64);
6120 if (Pos !=
size_t(-1))
6121 Res.insert(Pos + I64.size(), I128);
6129 AddPtr32Ptr64AddrSpaces();
6137 if (!
T.isOSIAMCU()) {
6138 std::string I128 =
"-i128:128";
6141 Regex R(
"^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
6142 if (R.match(Res, &
Groups))
6150 if (
T.isWindowsMSVCEnvironment() && !
T.isArch64Bit()) {
6152 auto I =
Ref.find(
"-f80:32-");
6154 Res = (
Ref.take_front(
I) +
"-f80:128-" +
Ref.drop_front(
I + 8)).str();
6162 Attribute A =
B.getAttribute(
"no-frame-pointer-elim");
6165 FramePointer =
A.getValueAsString() ==
"true" ?
"all" :
"none";
6166 B.removeAttribute(
"no-frame-pointer-elim");
6168 if (
B.contains(
"no-frame-pointer-elim-non-leaf")) {
6170 if (FramePointer !=
"all")
6171 FramePointer =
"non-leaf";
6172 B.removeAttribute(
"no-frame-pointer-elim-non-leaf");
6174 if (!FramePointer.
empty())
6175 B.addAttribute(
"frame-pointer", FramePointer);
6177 A =
B.getAttribute(
"null-pointer-is-valid");
6180 bool NullPointerIsValid =
A.getValueAsString() ==
"true";
6181 B.removeAttribute(
"null-pointer-is-valid");
6182 if (NullPointerIsValid)
6183 B.addAttribute(Attribute::NullPointerIsValid);
6193 return OBD.
getTag() ==
"clang.arc.attachedcall" &&
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU address space definition.
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
static Value * upgradeX86VPERMT2Intrinsics(IRBuilder<> &Builder, CallBase &CI, bool ZeroMask, bool IndexForm)
static Metadata * upgradeLoopArgument(Metadata *MD)
static bool isXYZ(StringRef S)
static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords)
static Value * upgradeX86PSLLDQIntrinsics(IRBuilder<> &Builder, Value *Op, unsigned Shift)
static Intrinsic::ID shouldUpgradeNVPTXSharedClusterIntrinsic(Function *F, StringRef Name)
static bool upgradeRetainReleaseMarker(Module &M)
This checks for objc retain release marker which should be upgraded.
static Value * upgradeX86vpcom(IRBuilder<> &Builder, CallBase &CI, unsigned Imm, bool IsSigned)
static Value * upgradeMaskToInt(IRBuilder<> &Builder, CallBase &CI)
static Value * upgradeX86Rotate(IRBuilder<> &Builder, CallBase &CI, bool IsRotateRight)
static bool upgradeX86MultiplyAddBytes(Function *F, Intrinsic::ID IID, Function *&NewFn)
static Intrinsic::ID shouldUpgradeNVPTXBF16Intrinsic(StringRef Name)
static bool upgradeSingleNVVMAnnotation(GlobalValue *GV, StringRef K, const Metadata *V)
static MDNode * unwrapMAVOp(CallBase *CI, unsigned Op)
Helper to unwrap intrinsic call MetadataAsValue operands.
static MDString * upgradeLoopTag(LLVMContext &C, StringRef OldTag)
static void upgradeNVVMFnVectorAttr(const StringRef Attr, const char DimC, GlobalValue *GV, const Metadata *V)
static bool upgradeX86MaskedFPCompare(Function *F, Intrinsic::ID IID, Function *&NewFn)
static Value * upgradeX86ALIGNIntrinsics(IRBuilder<> &Builder, Value *Op0, Value *Op1, Value *Shift, Value *Passthru, Value *Mask, bool IsVALIGN)
static Value * upgradeAbs(IRBuilder<> &Builder, CallBase &CI)
static Value * emitX86Select(IRBuilder<> &Builder, Value *Mask, Value *Op0, Value *Op1)
static Value * upgradeAArch64IntrinsicCall(StringRef Name, CallBase *CI, Function *F, IRBuilder<> &Builder)
static Value * upgradeMaskedMove(IRBuilder<> &Builder, CallBase &CI)
static bool upgradeX86IntrinsicFunction(Function *F, StringRef Name, Function *&NewFn)
static Value * applyX86MaskOn1BitsVec(IRBuilder<> &Builder, Value *Vec, Value *Mask)
static bool consumeNVVMPtrAddrSpace(StringRef &Name)
static bool shouldUpgradeX86Intrinsic(Function *F, StringRef Name)
static Value * upgradeX86PSRLDQIntrinsics(IRBuilder<> &Builder, Value *Op, unsigned Shift)
static Intrinsic::ID shouldUpgradeNVPTXTMAG2SIntrinsics(Function *F, StringRef Name)
static bool isOldLoopArgument(Metadata *MD)
static Value * upgradeARMIntrinsicCall(StringRef Name, CallBase *CI, Function *F, IRBuilder<> &Builder)
static bool upgradeX86IntrinsicsWith8BitMask(Function *F, Intrinsic::ID IID, Function *&NewFn)
static Value * upgradeAMDGCNIntrinsicCall(StringRef Name, CallBase *CI, Function *F, IRBuilder<> &Builder)
static Value * upgradeMaskedLoad(IRBuilder<> &Builder, Value *Ptr, Value *Passthru, Value *Mask, bool Aligned)
static Metadata * unwrapMAVMetadataOp(CallBase *CI, unsigned Op)
Helper to unwrap Metadata MetadataAsValue operands, such as the Value field.
static bool upgradeX86BF16Intrinsic(Function *F, Intrinsic::ID IID, Function *&NewFn)
static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, StringRef Name, Function *&NewFn)
static Value * getX86MaskVec(IRBuilder<> &Builder, Value *Mask, unsigned NumElts)
static Value * emitX86ScalarSelect(IRBuilder<> &Builder, Value *Mask, Value *Op0, Value *Op1)
static Value * upgradeX86ConcatShift(IRBuilder<> &Builder, CallBase &CI, bool IsShiftRight, bool ZeroMask)
static void rename(GlobalValue *GV)
static bool upgradePTESTIntrinsic(Function *F, Intrinsic::ID IID, Function *&NewFn)
static bool upgradeX86BF16DPIntrinsic(Function *F, Intrinsic::ID IID, Function *&NewFn)
static cl::opt< bool > DisableAutoUpgradeDebugInfo("disable-auto-upgrade-debug-info", cl::desc("Disable autoupgrade of debug info"))
static Value * upgradeMaskedCompare(IRBuilder<> &Builder, CallBase &CI, unsigned CC, bool Signed)
static Value * upgradeX86BinaryIntrinsics(IRBuilder<> &Builder, CallBase &CI, Intrinsic::ID IID)
static Value * upgradeNVVMIntrinsicCall(StringRef Name, CallBase *CI, Function *F, IRBuilder<> &Builder)
static Value * upgradeX86MaskedShift(IRBuilder<> &Builder, CallBase &CI, Intrinsic::ID IID)
static bool upgradeAVX512MaskToSelect(StringRef Name, IRBuilder<> &Builder, CallBase &CI, Value *&Rep)
static void upgradeDbgIntrinsicToDbgRecord(StringRef Name, CallBase *CI)
Convert debug intrinsic calls to non-instruction debug records.
static Value * upgradePMULDQ(IRBuilder<> &Builder, CallBase &CI, bool IsSigned)
static Value * upgradeMaskedStore(IRBuilder<> &Builder, Value *Ptr, Value *Data, Value *Mask, bool Aligned)
static MDNode * getDebugLocSafe(const Instruction *I)
static Value * upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, IRBuilder<> &Builder)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file contains constants used for implementing Dwarf debug support.
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
NVPTX address space definition.
static unsigned getNumElements(Type *Ty)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
static SymbolRef::Type getType(const Symbol *Sym)
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
static const X86InstrFMA3Group Groups[]
Class for arbitrary precision integers.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Class to represent array types.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
Type * getElementType() const
an instruction that atomically reads a memory location, combines it with another value,...
void setVolatile(bool V)
Specify whether this is a volatile RMW or not.
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ UIncWrap
Increment one up to a maximum value.
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
bool isFloatingPointOperation() const
Functions, function parameters, and return types can have attributes to indicate how they should be t...
static LLVM_ABI Attribute getWithStackAlignment(LLVMContext &Context, Align Alignment)
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
Value * getArgOperand(unsigned i) const
FunctionType * getFunctionType() const
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
void setCalledOperand(Value *V)
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
void setCalledFunction(Function *Fn)
Sets the function called, including updating the function type.
This class represents a function call, abstracting a target machine's calling convention.
void setTailCallKind(TailCallKind TCK)
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLT
signed less than
@ ICMP_SLE
signed less or equal
@ ICMP_UGE
unsigned greater or equal
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ ICMP_SGE
signed greater or equal
@ ICMP_ULE
unsigned less or equal
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPointerCast(Constant *C, Type *Ty)
Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant expression.
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
This is the shared class of boolean and integer constants.
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI ConstantTokenNone * get(LLVMContext &Context)
Return the ConstantTokenNone.
This is an important base class in LLVM.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
static LLVM_ABI DbgLabelRecord * createUnresolvedDbgLabelRecord(MDNode *Label, MDNode *DL)
For use during parsing; creates a DbgLabelRecord from as-of-yet unresolved MDNodes.
Base class for non-instruction debug metadata records that have positions within IR.
static LLVM_ABI DbgVariableRecord * createUnresolvedDbgVariableRecord(LocationType Type, Metadata *Val, MDNode *Variable, MDNode *Expression, MDNode *AssignID, Metadata *Address, MDNode *AddressExpression, MDNode *DI)
Used to create DbgVariableRecords during parsing, where some metadata references may still be unresol...
Convenience struct for specifying and reasoning about fast-math flags.
void setApproxFunc(bool B=true)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Class to represent function types.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
const Function & getFunction() const
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Type * getReturnType() const
Returns the type of the ret val.
Argument * getArg(unsigned i) const
LinkageTypes getLinkage() const
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
PointerType * getPtrTy(unsigned AddrSpace=0)
Fetch the type representing a pointer.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Base class for instruction visitors.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
LLVM_ABI MDNode * createRange(const APInt &Lo, const APInt &Hi)
Return metadata describing the range [Lo, Hi).
const MDOperand & getOperand(unsigned I) const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
LLVMContext & getContext() const
Tracking metadata reference owned by Metadata.
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
A Module instance is used to store all the information related to an LLVM module.
ModFlagBehavior
This enumeration defines the supported behaviors of module flags.
@ Override
Uses the specified value, regardless of the behavior or value of the other module.
@ Error
Emits an error if two values disagree, otherwise the resulting value is that of the operands.
@ Min
Takes the min of the two values, which are required to be integers.
@ Max
Takes the max of the two values, which are required to be integers.
LLVM_ABI void setOperand(unsigned I, MDNode *New)
LLVM_ABI MDNode * getOperand(unsigned i) const
LLVM_ABI unsigned getNumOperands() const
LLVM_ABI void clearOperands()
Drop all references to this node's operands.
iterator_range< op_iterator > operands()
LLVM_ABI void addOperand(MDNode *M)
ArrayRef< InputTy > inputs() const
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
LLVM_ABI bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
static LLVM_ABI ScalableVectorType * get(Type *ElementType, unsigned MinNumElts)
ArrayRef< int > getShuffleMask() const
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringRef - Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
constexpr size_t size() const
size - Get the string size.
StringRef trim(char Char) const
Return string with consecutive Char characters starting from the left and right removed.
static constexpr size_t npos
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
StringSwitch & StartsWith(StringLiteral S, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, T Value)
Class to represent struct types.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
unsigned getNumElements() const
Random access to the elements.
Type * getElementType(unsigned N) const
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
bool isVectorTy() const
True if this is an instance of VectorType.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
static LLVM_ABI Type * getBFloatTy(LLVMContext &C)
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< user_iterator > users()
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Base class of all SIMD vector types.
static VectorType * getInteger(VectorType *VTy)
This static method gets a VectorType with the same number of elements as the input type,...
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
constexpr ScalarTy getFixedValue() const
const ParentTy * getParent() const
self_iterator getIterator()
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ LOCAL_ADDRESS
Address space for local memory.
@ FLAT_ADDRESS
Address space for flat memory.
@ PRIVATE_ADDRESS
Address space for private memory.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ PTX_Kernel
Call to a PTX kernel. Passes all arguments in parameter space.
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)
Return the IIT table descriptor for the specified intrinsic into an array of IITDescriptors.
LLVM_ABI std::optional< Function * > remangleIntrinsicFunction(Function *F)
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
@ ADDRESS_SPACE_SHARED_CLUSTER
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract_or_null(Y &&MD)
Extract a Value from Metadata, if any, allowing null.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
LLVM_ABI void UpgradeSectionAttributes(Module &M)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
bool isValidAtomicOrdering(Int I)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI MDNode * upgradeInstructionLoopAttachment(MDNode &N)
Upgrade the loop attachment metadata node.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
LLVM_ABI void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
LLVM_ABI void UpgradeCallsToIntrinsic(Function *F)
This is an auto-upgrade hook for any old intrinsic function syntaxes which need to have both the func...
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
std::string utostr(uint64_t X, bool isNeg=false)
LLVM_ABI void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
LLVM_ABI Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
auto dyn_cast_or_null(const Y &Val)
FunctionAddr VTableAddr uintptr_t uintptr_t Version
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple)
Upgrade the datalayout string by adding a section for address space pointers.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Ref
The access may reference the value stored in memory.
std::string join(IteratorT Begin, IteratorT End, StringRef Separator)
Joins the strings in the range [Begin, End), adding Separator between the elements.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
OperandBundleDefT< Value * > OperandBundleDef
LLVM_ABI Instruction * UpgradeBitCastInst(unsigned Opc, Value *V, Type *DestTy, Instruction *&Temp)
This is an auto-upgrade for bitcast between pointers with different address spaces: the instruction i...
DWARFExpression::Operation Op
@ Dynamic
Denotes mode unknown at compile time.
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
@ Default
The result values are uniform if and only if all operands are uniform.
LLVM_ABI MDNode * UpgradeTBAANode(MDNode &TBAANode)
If the given TBAA tag uses the scalar TBAA format, create a new node corresponding to the upgrade to ...
LLVM_ABI void UpgradeARCRuntime(Module &M)
Convert calls to ARC runtime functions to intrinsic calls and upgrade the old retain release marker t...
LLVM_ABI bool verifyModule(const Module &M, raw_ostream *OS=nullptr, bool *BrokenDebugInfo=nullptr)
Check a module for errors.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
This struct is a compact representation of a valid (non-zero power of two) alignment.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.