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 .
StartsWith(
"masked.load", Intrinsic::masked_load)
1433 .
StartsWith(
"masked.gather", Intrinsic::masked_gather)
1434 .
StartsWith(
"masked.store", Intrinsic::masked_store)
1435 .
StartsWith(
"masked.scatter", Intrinsic::masked_scatter)
1437 if (MaskedID &&
F->arg_size() == 4) {
1439 if (MaskedID == Intrinsic::masked_load ||
1440 MaskedID == Intrinsic::masked_gather) {
1442 F->getParent(), MaskedID,
1443 {F->getReturnType(), F->getArg(0)->getType()});
1447 F->getParent(), MaskedID,
1448 {F->getArg(0)->getType(), F->getArg(1)->getType()});
1454 if (Name.consume_front(
"nvvm.")) {
1456 if (
F->arg_size() == 1) {
1459 .
Cases(
"brev32",
"brev64", Intrinsic::bitreverse)
1460 .
Case(
"clz.i", Intrinsic::ctlz)
1461 .
Case(
"popc.i", Intrinsic::ctpop)
1465 {F->getReturnType()});
1471 if (!
F->getReturnType()->getScalarType()->isBFloatTy()) {
1499 bool Expand =
false;
1500 if (Name.consume_front(
"abs."))
1503 Name ==
"i" || Name ==
"ll" || Name ==
"bf16" || Name ==
"bf16x2";
1504 else if (Name.consume_front(
"fabs."))
1506 Expand = Name ==
"f" || Name ==
"ftz.f" || Name ==
"d";
1507 else if (Name.consume_front(
"max.") || Name.consume_front(
"min."))
1509 Expand = Name ==
"s" || Name ==
"i" || Name ==
"ll" || Name ==
"us" ||
1510 Name ==
"ui" || Name ==
"ull";
1511 else if (Name.consume_front(
"atomic.load."))
1520 else if (Name.consume_front(
"bitcast."))
1523 Name ==
"f2i" || Name ==
"i2f" || Name ==
"ll2d" || Name ==
"d2ll";
1524 else if (Name.consume_front(
"rotate."))
1526 Expand = Name ==
"b32" || Name ==
"b64" || Name ==
"right.b64";
1527 else if (Name.consume_front(
"ptr.gen.to."))
1530 else if (Name.consume_front(
"ptr."))
1533 else if (Name.consume_front(
"ldg.global."))
1535 Expand = (Name.starts_with(
"i.") || Name.starts_with(
"f.") ||
1536 Name.starts_with(
"p."));
1539 .
Case(
"barrier0",
true)
1540 .
Case(
"barrier.n",
true)
1541 .
Case(
"barrier.sync.cnt",
true)
1542 .
Case(
"barrier.sync",
true)
1543 .
Case(
"barrier",
true)
1544 .
Case(
"bar.sync",
true)
1545 .
Case(
"clz.ll",
true)
1546 .
Case(
"popc.ll",
true)
1548 .
Case(
"swap.lo.hi.b64",
true)
1549 .
Case(
"tanh.approx.f32",
true)
1561 if (Name.starts_with(
"objectsize.")) {
1562 Type *Tys[2] = {
F->getReturnType(),
F->arg_begin()->getType() };
1563 if (
F->arg_size() == 2 ||
F->arg_size() == 3) {
1566 Intrinsic::objectsize, Tys);
1573 if (Name.starts_with(
"ptr.annotation.") &&
F->arg_size() == 4) {
1576 F->getParent(), Intrinsic::ptr_annotation,
1577 {F->arg_begin()->getType(), F->getArg(1)->getType()});
1583 if (Name.consume_front(
"riscv.")) {
1586 .
Case(
"aes32dsi", Intrinsic::riscv_aes32dsi)
1587 .
Case(
"aes32dsmi", Intrinsic::riscv_aes32dsmi)
1588 .
Case(
"aes32esi", Intrinsic::riscv_aes32esi)
1589 .
Case(
"aes32esmi", Intrinsic::riscv_aes32esmi)
1592 if (!
F->getFunctionType()->getParamType(2)->isIntegerTy(32)) {
1605 if (!
F->getFunctionType()->getParamType(2)->isIntegerTy(32) ||
1606 F->getFunctionType()->getReturnType()->isIntegerTy(64)) {
1615 .
StartsWith(
"sha256sig0", Intrinsic::riscv_sha256sig0)
1616 .
StartsWith(
"sha256sig1", Intrinsic::riscv_sha256sig1)
1617 .
StartsWith(
"sha256sum0", Intrinsic::riscv_sha256sum0)
1618 .
StartsWith(
"sha256sum1", Intrinsic::riscv_sha256sum1)
1623 if (
F->getFunctionType()->getReturnType()->isIntegerTy(64)) {
1635 if (Name ==
"stackprotectorcheck") {
1642 if (Name ==
"thread.pointer") {
1644 F->getParent(), Intrinsic::thread_pointer,
F->getReturnType());
1650 if (Name ==
"var.annotation" &&
F->arg_size() == 4) {
1653 F->getParent(), Intrinsic::var_annotation,
1654 {{F->arg_begin()->getType(), F->getArg(1)->getType()}});
1661 if (Name.consume_front(
"wasm.")) {
1664 .
StartsWith(
"fma.", Intrinsic::wasm_relaxed_madd)
1665 .
StartsWith(
"fms.", Intrinsic::wasm_relaxed_nmadd)
1666 .
StartsWith(
"laneselect.", Intrinsic::wasm_relaxed_laneselect)
1671 F->getReturnType());
1675 if (Name.consume_front(
"dot.i8x16.i7x16.")) {
1677 .
Case(
"signed", Intrinsic::wasm_relaxed_dot_i8x16_i7x16_signed)
1679 Intrinsic::wasm_relaxed_dot_i8x16_i7x16_add_signed)
1698 if (ST && (!
ST->isLiteral() ||
ST->isPacked()) &&
1707 auto *FT =
F->getFunctionType();
1710 std::string
Name =
F->getName().str();
1713 Name,
F->getParent());
1724 if (Result != std::nullopt) {
1737 bool CanUpgradeDebugIntrinsicsToRecords) {
1757 GV->
getName() ==
"llvm.global_dtors")) ||
1772 unsigned N =
Init->getNumOperands();
1773 std::vector<Constant *> NewCtors(
N);
1774 for (
unsigned i = 0; i !=
N; ++i) {
1777 Ctor->getAggregateElement(1),
1791 unsigned NumElts = ResultTy->getNumElements() * 8;
1795 Op = Builder.CreateBitCast(
Op, VecTy,
"cast");
1805 for (
unsigned l = 0; l != NumElts; l += 16)
1806 for (
unsigned i = 0; i != 16; ++i) {
1807 unsigned Idx = NumElts + i - Shift;
1809 Idx -= NumElts - 16;
1810 Idxs[l + i] = Idx + l;
1813 Res = Builder.CreateShuffleVector(Res,
Op,
ArrayRef(Idxs, NumElts));
1817 return Builder.CreateBitCast(Res, ResultTy,
"cast");
1825 unsigned NumElts = ResultTy->getNumElements() * 8;
1829 Op = Builder.CreateBitCast(
Op, VecTy,
"cast");
1839 for (
unsigned l = 0; l != NumElts; l += 16)
1840 for (
unsigned i = 0; i != 16; ++i) {
1841 unsigned Idx = i + Shift;
1843 Idx += NumElts - 16;
1844 Idxs[l + i] = Idx + l;
1847 Res = Builder.CreateShuffleVector(
Op, Res,
ArrayRef(Idxs, NumElts));
1851 return Builder.CreateBitCast(Res, ResultTy,
"cast");
1859 Mask = Builder.CreateBitCast(Mask, MaskTy);
1865 for (
unsigned i = 0; i != NumElts; ++i)
1867 Mask = Builder.CreateShuffleVector(Mask, Mask,
ArrayRef(Indices, NumElts),
1878 if (
C->isAllOnesValue())
1883 return Builder.CreateSelect(Mask, Op0, Op1);
1890 if (
C->isAllOnesValue())
1894 Mask->getType()->getIntegerBitWidth());
1895 Mask = Builder.CreateBitCast(Mask, MaskTy);
1896 Mask = Builder.CreateExtractElement(Mask, (
uint64_t)0);
1897 return Builder.CreateSelect(Mask, Op0, Op1);
1910 assert((IsVALIGN || NumElts % 16 == 0) &&
"Illegal NumElts for PALIGNR!");
1911 assert((!IsVALIGN || NumElts <= 16) &&
"NumElts too large for VALIGN!");
1916 ShiftVal &= (NumElts - 1);
1925 if (ShiftVal > 16) {
1933 for (
unsigned l = 0; l < NumElts; l += 16) {
1934 for (
unsigned i = 0; i != 16; ++i) {
1935 unsigned Idx = ShiftVal + i;
1936 if (!IsVALIGN && Idx >= 16)
1937 Idx += NumElts - 16;
1938 Indices[l + i] = Idx + l;
1943 Op1, Op0,
ArrayRef(Indices, NumElts),
"palignr");
1949 bool ZeroMask,
bool IndexForm) {
1952 unsigned EltWidth = Ty->getScalarSizeInBits();
1953 bool IsFloat = Ty->isFPOrFPVectorTy();
1955 if (VecWidth == 128 && EltWidth == 32 && IsFloat)
1956 IID = Intrinsic::x86_avx512_vpermi2var_ps_128;
1957 else if (VecWidth == 128 && EltWidth == 32 && !IsFloat)
1958 IID = Intrinsic::x86_avx512_vpermi2var_d_128;
1959 else if (VecWidth == 128 && EltWidth == 64 && IsFloat)
1960 IID = Intrinsic::x86_avx512_vpermi2var_pd_128;
1961 else if (VecWidth == 128 && EltWidth == 64 && !IsFloat)
1962 IID = Intrinsic::x86_avx512_vpermi2var_q_128;
1963 else if (VecWidth == 256 && EltWidth == 32 && IsFloat)
1964 IID = Intrinsic::x86_avx512_vpermi2var_ps_256;
1965 else if (VecWidth == 256 && EltWidth == 32 && !IsFloat)
1966 IID = Intrinsic::x86_avx512_vpermi2var_d_256;
1967 else if (VecWidth == 256 && EltWidth == 64 && IsFloat)
1968 IID = Intrinsic::x86_avx512_vpermi2var_pd_256;
1969 else if (VecWidth == 256 && EltWidth == 64 && !IsFloat)
1970 IID = Intrinsic::x86_avx512_vpermi2var_q_256;
1971 else if (VecWidth == 512 && EltWidth == 32 && IsFloat)
1972 IID = Intrinsic::x86_avx512_vpermi2var_ps_512;
1973 else if (VecWidth == 512 && EltWidth == 32 && !IsFloat)
1974 IID = Intrinsic::x86_avx512_vpermi2var_d_512;
1975 else if (VecWidth == 512 && EltWidth == 64 && IsFloat)
1976 IID = Intrinsic::x86_avx512_vpermi2var_pd_512;
1977 else if (VecWidth == 512 && EltWidth == 64 && !IsFloat)
1978 IID = Intrinsic::x86_avx512_vpermi2var_q_512;
1979 else if (VecWidth == 128 && EltWidth == 16)
1980 IID = Intrinsic::x86_avx512_vpermi2var_hi_128;
1981 else if (VecWidth == 256 && EltWidth == 16)
1982 IID = Intrinsic::x86_avx512_vpermi2var_hi_256;
1983 else if (VecWidth == 512 && EltWidth == 16)
1984 IID = Intrinsic::x86_avx512_vpermi2var_hi_512;
1985 else if (VecWidth == 128 && EltWidth == 8)
1986 IID = Intrinsic::x86_avx512_vpermi2var_qi_128;
1987 else if (VecWidth == 256 && EltWidth == 8)
1988 IID = Intrinsic::x86_avx512_vpermi2var_qi_256;
1989 else if (VecWidth == 512 && EltWidth == 8)
1990 IID = Intrinsic::x86_avx512_vpermi2var_qi_512;
2001 Value *V = Builder.CreateIntrinsic(IID, Args);
2013 Value *Res = Builder.CreateIntrinsic(IID, Ty, {Op0, Op1});
2024 bool IsRotateRight) {
2034 Amt = Builder.CreateIntCast(Amt, Ty->getScalarType(),
false);
2035 Amt = Builder.CreateVectorSplat(NumElts, Amt);
2038 Intrinsic::ID IID = IsRotateRight ? Intrinsic::fshr : Intrinsic::fshl;
2039 Value *Res = Builder.CreateIntrinsic(IID, Ty, {Src, Src, Amt});
2084 Value *Ext = Builder.CreateSExt(Cmp, Ty);
2089 bool IsShiftRight,
bool ZeroMask) {
2103 Amt = Builder.CreateIntCast(Amt, Ty->getScalarType(),
false);
2104 Amt = Builder.CreateVectorSplat(NumElts, Amt);
2107 Intrinsic::ID IID = IsShiftRight ? Intrinsic::fshr : Intrinsic::fshl;
2108 Value *Res = Builder.CreateIntrinsic(IID, Ty, {Op0, Op1, Amt});
2123 const Align Alignment =
2125 ?
Align(
Data->getType()->getPrimitiveSizeInBits().getFixedValue() / 8)
2130 if (
C->isAllOnesValue())
2131 return Builder.CreateAlignedStore(
Data,
Ptr, Alignment);
2136 return Builder.CreateMaskedStore(
Data,
Ptr, Alignment, Mask);
2142 const Align Alignment =
2151 if (
C->isAllOnesValue())
2152 return Builder.CreateAlignedLoad(ValTy,
Ptr, Alignment);
2157 return Builder.CreateMaskedLoad(ValTy,
Ptr, Alignment, Mask, Passthru);
2163 Value *Res = Builder.CreateIntrinsic(Intrinsic::abs, Ty,
2164 {Op0, Builder.getInt1(
false)});
2179 Constant *ShiftAmt = ConstantInt::get(Ty, 32);
2180 LHS = Builder.CreateShl(
LHS, ShiftAmt);
2181 LHS = Builder.CreateAShr(
LHS, ShiftAmt);
2182 RHS = Builder.CreateShl(
RHS, ShiftAmt);
2183 RHS = Builder.CreateAShr(
RHS, ShiftAmt);
2186 Constant *Mask = ConstantInt::get(Ty, 0xffffffff);
2187 LHS = Builder.CreateAnd(
LHS, Mask);
2188 RHS = Builder.CreateAnd(
RHS, Mask);
2205 if (!
C || !
C->isAllOnesValue())
2206 Vec = Builder.CreateAnd(Vec,
getX86MaskVec(Builder, Mask, NumElts));
2211 for (
unsigned i = 0; i != NumElts; ++i)
2213 for (
unsigned i = NumElts; i != 8; ++i)
2214 Indices[i] = NumElts + i % NumElts;
2215 Vec = Builder.CreateShuffleVector(Vec,
2219 return Builder.CreateBitCast(Vec, Builder.getIntNTy(std::max(NumElts, 8U)));
2223 unsigned CC,
bool Signed) {
2231 }
else if (CC == 7) {
2267 Value* AndNode = Builder.CreateAnd(Mask,
APInt(8, 1));
2268 Value* Cmp = Builder.CreateIsNotNull(AndNode);
2270 Value* Extract2 = Builder.CreateExtractElement(Src, (
uint64_t)0);
2271 Value*
Select = Builder.CreateSelect(Cmp, Extract1, Extract2);
2280 return Builder.CreateSExt(Mask, ReturnOp,
"vpmovm2");
2286 Name = Name.substr(12);
2291 if (Name.starts_with(
"max.p")) {
2292 if (VecWidth == 128 && EltWidth == 32)
2293 IID = Intrinsic::x86_sse_max_ps;
2294 else if (VecWidth == 128 && EltWidth == 64)
2295 IID = Intrinsic::x86_sse2_max_pd;
2296 else if (VecWidth == 256 && EltWidth == 32)
2297 IID = Intrinsic::x86_avx_max_ps_256;
2298 else if (VecWidth == 256 && EltWidth == 64)
2299 IID = Intrinsic::x86_avx_max_pd_256;
2302 }
else if (Name.starts_with(
"min.p")) {
2303 if (VecWidth == 128 && EltWidth == 32)
2304 IID = Intrinsic::x86_sse_min_ps;
2305 else if (VecWidth == 128 && EltWidth == 64)
2306 IID = Intrinsic::x86_sse2_min_pd;
2307 else if (VecWidth == 256 && EltWidth == 32)
2308 IID = Intrinsic::x86_avx_min_ps_256;
2309 else if (VecWidth == 256 && EltWidth == 64)
2310 IID = Intrinsic::x86_avx_min_pd_256;
2313 }
else if (Name.starts_with(
"pshuf.b.")) {
2314 if (VecWidth == 128)
2315 IID = Intrinsic::x86_ssse3_pshuf_b_128;
2316 else if (VecWidth == 256)
2317 IID = Intrinsic::x86_avx2_pshuf_b;
2318 else if (VecWidth == 512)
2319 IID = Intrinsic::x86_avx512_pshuf_b_512;
2322 }
else if (Name.starts_with(
"pmul.hr.sw.")) {
2323 if (VecWidth == 128)
2324 IID = Intrinsic::x86_ssse3_pmul_hr_sw_128;
2325 else if (VecWidth == 256)
2326 IID = Intrinsic::x86_avx2_pmul_hr_sw;
2327 else if (VecWidth == 512)
2328 IID = Intrinsic::x86_avx512_pmul_hr_sw_512;
2331 }
else if (Name.starts_with(
"pmulh.w.")) {
2332 if (VecWidth == 128)
2333 IID = Intrinsic::x86_sse2_pmulh_w;
2334 else if (VecWidth == 256)
2335 IID = Intrinsic::x86_avx2_pmulh_w;
2336 else if (VecWidth == 512)
2337 IID = Intrinsic::x86_avx512_pmulh_w_512;
2340 }
else if (Name.starts_with(
"pmulhu.w.")) {
2341 if (VecWidth == 128)
2342 IID = Intrinsic::x86_sse2_pmulhu_w;
2343 else if (VecWidth == 256)
2344 IID = Intrinsic::x86_avx2_pmulhu_w;
2345 else if (VecWidth == 512)
2346 IID = Intrinsic::x86_avx512_pmulhu_w_512;
2349 }
else if (Name.starts_with(
"pmaddw.d.")) {
2350 if (VecWidth == 128)
2351 IID = Intrinsic::x86_sse2_pmadd_wd;
2352 else if (VecWidth == 256)
2353 IID = Intrinsic::x86_avx2_pmadd_wd;
2354 else if (VecWidth == 512)
2355 IID = Intrinsic::x86_avx512_pmaddw_d_512;
2358 }
else if (Name.starts_with(
"pmaddubs.w.")) {
2359 if (VecWidth == 128)
2360 IID = Intrinsic::x86_ssse3_pmadd_ub_sw_128;
2361 else if (VecWidth == 256)
2362 IID = Intrinsic::x86_avx2_pmadd_ub_sw;
2363 else if (VecWidth == 512)
2364 IID = Intrinsic::x86_avx512_pmaddubs_w_512;
2367 }
else if (Name.starts_with(
"packsswb.")) {
2368 if (VecWidth == 128)
2369 IID = Intrinsic::x86_sse2_packsswb_128;
2370 else if (VecWidth == 256)
2371 IID = Intrinsic::x86_avx2_packsswb;
2372 else if (VecWidth == 512)
2373 IID = Intrinsic::x86_avx512_packsswb_512;
2376 }
else if (Name.starts_with(
"packssdw.")) {
2377 if (VecWidth == 128)
2378 IID = Intrinsic::x86_sse2_packssdw_128;
2379 else if (VecWidth == 256)
2380 IID = Intrinsic::x86_avx2_packssdw;
2381 else if (VecWidth == 512)
2382 IID = Intrinsic::x86_avx512_packssdw_512;
2385 }
else if (Name.starts_with(
"packuswb.")) {
2386 if (VecWidth == 128)
2387 IID = Intrinsic::x86_sse2_packuswb_128;
2388 else if (VecWidth == 256)
2389 IID = Intrinsic::x86_avx2_packuswb;
2390 else if (VecWidth == 512)
2391 IID = Intrinsic::x86_avx512_packuswb_512;
2394 }
else if (Name.starts_with(
"packusdw.")) {
2395 if (VecWidth == 128)
2396 IID = Intrinsic::x86_sse41_packusdw;
2397 else if (VecWidth == 256)
2398 IID = Intrinsic::x86_avx2_packusdw;
2399 else if (VecWidth == 512)
2400 IID = Intrinsic::x86_avx512_packusdw_512;
2403 }
else if (Name.starts_with(
"vpermilvar.")) {
2404 if (VecWidth == 128 && EltWidth == 32)
2405 IID = Intrinsic::x86_avx_vpermilvar_ps;
2406 else if (VecWidth == 128 && EltWidth == 64)
2407 IID = Intrinsic::x86_avx_vpermilvar_pd;
2408 else if (VecWidth == 256 && EltWidth == 32)
2409 IID = Intrinsic::x86_avx_vpermilvar_ps_256;
2410 else if (VecWidth == 256 && EltWidth == 64)
2411 IID = Intrinsic::x86_avx_vpermilvar_pd_256;
2412 else if (VecWidth == 512 && EltWidth == 32)
2413 IID = Intrinsic::x86_avx512_vpermilvar_ps_512;
2414 else if (VecWidth == 512 && EltWidth == 64)
2415 IID = Intrinsic::x86_avx512_vpermilvar_pd_512;
2418 }
else if (Name ==
"cvtpd2dq.256") {
2419 IID = Intrinsic::x86_avx_cvt_pd2dq_256;
2420 }
else if (Name ==
"cvtpd2ps.256") {
2421 IID = Intrinsic::x86_avx_cvt_pd2_ps_256;
2422 }
else if (Name ==
"cvttpd2dq.256") {
2423 IID = Intrinsic::x86_avx_cvtt_pd2dq_256;
2424 }
else if (Name ==
"cvttps2dq.128") {
2425 IID = Intrinsic::x86_sse2_cvttps2dq;
2426 }
else if (Name ==
"cvttps2dq.256") {
2427 IID = Intrinsic::x86_avx_cvtt_ps2dq_256;
2428 }
else if (Name.starts_with(
"permvar.")) {
2430 if (VecWidth == 256 && EltWidth == 32 && IsFloat)
2431 IID = Intrinsic::x86_avx2_permps;
2432 else if (VecWidth == 256 && EltWidth == 32 && !IsFloat)
2433 IID = Intrinsic::x86_avx2_permd;
2434 else if (VecWidth == 256 && EltWidth == 64 && IsFloat)
2435 IID = Intrinsic::x86_avx512_permvar_df_256;
2436 else if (VecWidth == 256 && EltWidth == 64 && !IsFloat)
2437 IID = Intrinsic::x86_avx512_permvar_di_256;
2438 else if (VecWidth == 512 && EltWidth == 32 && IsFloat)
2439 IID = Intrinsic::x86_avx512_permvar_sf_512;
2440 else if (VecWidth == 512 && EltWidth == 32 && !IsFloat)
2441 IID = Intrinsic::x86_avx512_permvar_si_512;
2442 else if (VecWidth == 512 && EltWidth == 64 && IsFloat)
2443 IID = Intrinsic::x86_avx512_permvar_df_512;
2444 else if (VecWidth == 512 && EltWidth == 64 && !IsFloat)
2445 IID = Intrinsic::x86_avx512_permvar_di_512;
2446 else if (VecWidth == 128 && EltWidth == 16)
2447 IID = Intrinsic::x86_avx512_permvar_hi_128;
2448 else if (VecWidth == 256 && EltWidth == 16)
2449 IID = Intrinsic::x86_avx512_permvar_hi_256;
2450 else if (VecWidth == 512 && EltWidth == 16)
2451 IID = Intrinsic::x86_avx512_permvar_hi_512;
2452 else if (VecWidth == 128 && EltWidth == 8)
2453 IID = Intrinsic::x86_avx512_permvar_qi_128;
2454 else if (VecWidth == 256 && EltWidth == 8)
2455 IID = Intrinsic::x86_avx512_permvar_qi_256;
2456 else if (VecWidth == 512 && EltWidth == 8)
2457 IID = Intrinsic::x86_avx512_permvar_qi_512;
2460 }
else if (Name.starts_with(
"dbpsadbw.")) {
2461 if (VecWidth == 128)
2462 IID = Intrinsic::x86_avx512_dbpsadbw_128;
2463 else if (VecWidth == 256)
2464 IID = Intrinsic::x86_avx512_dbpsadbw_256;
2465 else if (VecWidth == 512)
2466 IID = Intrinsic::x86_avx512_dbpsadbw_512;
2469 }
else if (Name.starts_with(
"pmultishift.qb.")) {
2470 if (VecWidth == 128)
2471 IID = Intrinsic::x86_avx512_pmultishift_qb_128;
2472 else if (VecWidth == 256)
2473 IID = Intrinsic::x86_avx512_pmultishift_qb_256;
2474 else if (VecWidth == 512)
2475 IID = Intrinsic::x86_avx512_pmultishift_qb_512;
2478 }
else if (Name.starts_with(
"conflict.")) {
2479 if (Name[9] ==
'd' && VecWidth == 128)
2480 IID = Intrinsic::x86_avx512_conflict_d_128;
2481 else if (Name[9] ==
'd' && VecWidth == 256)
2482 IID = Intrinsic::x86_avx512_conflict_d_256;
2483 else if (Name[9] ==
'd' && VecWidth == 512)
2484 IID = Intrinsic::x86_avx512_conflict_d_512;
2485 else if (Name[9] ==
'q' && VecWidth == 128)
2486 IID = Intrinsic::x86_avx512_conflict_q_128;
2487 else if (Name[9] ==
'q' && VecWidth == 256)
2488 IID = Intrinsic::x86_avx512_conflict_q_256;
2489 else if (Name[9] ==
'q' && VecWidth == 512)
2490 IID = Intrinsic::x86_avx512_conflict_q_512;
2493 }
else if (Name.starts_with(
"pavg.")) {
2494 if (Name[5] ==
'b' && VecWidth == 128)
2495 IID = Intrinsic::x86_sse2_pavg_b;
2496 else if (Name[5] ==
'b' && VecWidth == 256)
2497 IID = Intrinsic::x86_avx2_pavg_b;
2498 else if (Name[5] ==
'b' && VecWidth == 512)
2499 IID = Intrinsic::x86_avx512_pavg_b_512;
2500 else if (Name[5] ==
'w' && VecWidth == 128)
2501 IID = Intrinsic::x86_sse2_pavg_w;
2502 else if (Name[5] ==
'w' && VecWidth == 256)
2503 IID = Intrinsic::x86_avx2_pavg_w;
2504 else if (Name[5] ==
'w' && VecWidth == 512)
2505 IID = Intrinsic::x86_avx512_pavg_w_512;
2514 Rep = Builder.CreateIntrinsic(IID, Args);
2525 if (AsmStr->find(
"mov\tfp") == 0 &&
2526 AsmStr->find(
"objc_retainAutoreleaseReturnValue") != std::string::npos &&
2527 (Pos = AsmStr->find(
"# marker")) != std::string::npos) {
2528 AsmStr->replace(Pos, 1,
";");
2534 Value *Rep =
nullptr;
2536 if (Name ==
"abs.i" || Name ==
"abs.ll") {
2538 Value *Neg = Builder.CreateNeg(Arg,
"neg");
2539 Value *Cmp = Builder.CreateICmpSGE(
2541 Rep = Builder.CreateSelect(Cmp, Arg, Neg,
"abs");
2542 }
else if (Name ==
"abs.bf16" || Name ==
"abs.bf16x2") {
2543 Type *Ty = (Name ==
"abs.bf16")
2547 Value *Abs = Builder.CreateUnaryIntrinsic(Intrinsic::nvvm_fabs, Arg);
2548 Rep = Builder.CreateBitCast(Abs, CI->
getType());
2549 }
else if (Name ==
"fabs.f" || Name ==
"fabs.ftz.f" || Name ==
"fabs.d") {
2550 Intrinsic::ID IID = (Name ==
"fabs.ftz.f") ? Intrinsic::nvvm_fabs_ftz
2551 : Intrinsic::nvvm_fabs;
2552 Rep = Builder.CreateUnaryIntrinsic(IID, CI->
getArgOperand(0));
2553 }
else if (Name.starts_with(
"atomic.load.add.f32.p") ||
2554 Name.starts_with(
"atomic.load.add.f64.p")) {
2559 }
else if (Name.starts_with(
"atomic.load.inc.32.p") ||
2560 Name.starts_with(
"atomic.load.dec.32.p")) {
2567 }
else if (Name.consume_front(
"max.") &&
2568 (Name ==
"s" || Name ==
"i" || Name ==
"ll" || Name ==
"us" ||
2569 Name ==
"ui" || Name ==
"ull")) {
2572 Value *Cmp = Name.starts_with(
"u")
2573 ? Builder.CreateICmpUGE(Arg0, Arg1,
"max.cond")
2574 : Builder.CreateICmpSGE(Arg0, Arg1,
"max.cond");
2575 Rep = Builder.CreateSelect(Cmp, Arg0, Arg1,
"max");
2576 }
else if (Name.consume_front(
"min.") &&
2577 (Name ==
"s" || Name ==
"i" || Name ==
"ll" || Name ==
"us" ||
2578 Name ==
"ui" || Name ==
"ull")) {
2581 Value *Cmp = Name.starts_with(
"u")
2582 ? Builder.CreateICmpULE(Arg0, Arg1,
"min.cond")
2583 : Builder.CreateICmpSLE(Arg0, Arg1,
"min.cond");
2584 Rep = Builder.CreateSelect(Cmp, Arg0, Arg1,
"min");
2585 }
else if (Name ==
"clz.ll") {
2588 Value *Ctlz = Builder.CreateIntrinsic(Intrinsic::ctlz, {Arg->
getType()},
2589 {Arg, Builder.getFalse()},
2591 Rep = Builder.CreateTrunc(Ctlz, Builder.getInt32Ty(),
"ctlz.trunc");
2592 }
else if (Name ==
"popc.ll") {
2596 Value *Popc = Builder.CreateIntrinsic(Intrinsic::ctpop, {Arg->
getType()},
2597 Arg,
nullptr,
"ctpop");
2598 Rep = Builder.CreateTrunc(Popc, Builder.getInt32Ty(),
"ctpop.trunc");
2599 }
else if (Name ==
"h2f") {
2600 Rep = Builder.CreateIntrinsic(Intrinsic::convert_from_fp16,
2603 }
else if (Name.consume_front(
"bitcast.") &&
2604 (Name ==
"f2i" || Name ==
"i2f" || Name ==
"ll2d" ||
2607 }
else if (Name ==
"rotate.b32") {
2610 Rep = Builder.CreateIntrinsic(Builder.getInt32Ty(), Intrinsic::fshl,
2611 {Arg, Arg, ShiftAmt});
2612 }
else if (Name ==
"rotate.b64") {
2616 Rep = Builder.CreateIntrinsic(Int64Ty, Intrinsic::fshl,
2617 {Arg, Arg, ZExtShiftAmt});
2618 }
else if (Name ==
"rotate.right.b64") {
2622 Rep = Builder.CreateIntrinsic(Int64Ty, Intrinsic::fshr,
2623 {Arg, Arg, ZExtShiftAmt});
2624 }
else if (Name ==
"swap.lo.hi.b64") {
2627 Rep = Builder.CreateIntrinsic(Int64Ty, Intrinsic::fshl,
2628 {Arg, Arg, Builder.getInt64(32)});
2629 }
else if ((Name.consume_front(
"ptr.gen.to.") &&
2632 Name.starts_with(
".to.gen"))) {
2634 }
else if (Name.consume_front(
"ldg.global")) {
2638 Value *ASC = Builder.CreateAddrSpaceCast(
Ptr, Builder.getPtrTy(1));
2641 LD->setMetadata(LLVMContext::MD_invariant_load, MD);
2643 }
else if (Name ==
"tanh.approx.f32") {
2647 Rep = Builder.CreateUnaryIntrinsic(Intrinsic::tanh, CI->
getArgOperand(0),
2649 }
else if (Name ==
"barrier0" || Name ==
"barrier.n" || Name ==
"bar.sync") {
2651 Name.ends_with(
'0') ? Builder.getInt32(0) : CI->
getArgOperand(0);
2652 Rep = Builder.CreateIntrinsic(Intrinsic::nvvm_barrier_cta_sync_aligned_all,
2654 }
else if (Name ==
"barrier") {
2655 Rep = Builder.CreateIntrinsic(
2656 Intrinsic::nvvm_barrier_cta_sync_aligned_count, {},
2658 }
else if (Name ==
"barrier.sync") {
2659 Rep = Builder.CreateIntrinsic(Intrinsic::nvvm_barrier_cta_sync_all, {},
2661 }
else if (Name ==
"barrier.sync.cnt") {
2662 Rep = Builder.CreateIntrinsic(Intrinsic::nvvm_barrier_cta_sync_count, {},
2667 !
F->getReturnType()->getScalarType()->isBFloatTy()) {
2677 ? Builder.CreateBitCast(Arg, NewType)
2680 Rep = Builder.CreateCall(NewFn, Args);
2681 if (
F->getReturnType()->isIntegerTy())
2682 Rep = Builder.CreateBitCast(Rep,
F->getReturnType());
2692 Value *Rep =
nullptr;
2694 if (Name.starts_with(
"sse4a.movnt.")) {
2706 Builder.CreateExtractElement(Arg1, (
uint64_t)0,
"extractelement");
2709 SI->setMetadata(LLVMContext::MD_nontemporal,
Node);
2710 }
else if (Name.starts_with(
"avx.movnt.") ||
2711 Name.starts_with(
"avx512.storent.")) {
2723 SI->setMetadata(LLVMContext::MD_nontemporal,
Node);
2724 }
else if (Name ==
"sse2.storel.dq") {
2729 Value *BC0 = Builder.CreateBitCast(Arg1, NewVecTy,
"cast");
2730 Value *Elt = Builder.CreateExtractElement(BC0, (
uint64_t)0);
2731 Builder.CreateAlignedStore(Elt, Arg0,
Align(1));
2732 }
else if (Name.starts_with(
"sse.storeu.") ||
2733 Name.starts_with(
"sse2.storeu.") ||
2734 Name.starts_with(
"avx.storeu.")) {
2737 Builder.CreateAlignedStore(Arg1, Arg0,
Align(1));
2738 }
else if (Name ==
"avx512.mask.store.ss") {
2742 }
else if (Name.starts_with(
"avx512.mask.store")) {
2744 bool Aligned = Name[17] !=
'u';
2747 }
else if (Name.starts_with(
"sse2.pcmp") || Name.starts_with(
"avx2.pcmp")) {
2750 bool CmpEq = Name[9] ==
'e';
2753 Rep = Builder.CreateSExt(Rep, CI->
getType(),
"");
2754 }
else if (Name.starts_with(
"avx512.broadcastm")) {
2761 Rep = Builder.CreateVectorSplat(NumElts, Rep);
2762 }
else if (Name ==
"sse.sqrt.ss" || Name ==
"sse2.sqrt.sd") {
2764 Value *Elt0 = Builder.CreateExtractElement(Vec, (
uint64_t)0);
2765 Elt0 = Builder.CreateIntrinsic(Intrinsic::sqrt, Elt0->
getType(), Elt0);
2766 Rep = Builder.CreateInsertElement(Vec, Elt0, (
uint64_t)0);
2767 }
else if (Name.starts_with(
"avx.sqrt.p") ||
2768 Name.starts_with(
"sse2.sqrt.p") ||
2769 Name.starts_with(
"sse.sqrt.p")) {
2770 Rep = Builder.CreateIntrinsic(Intrinsic::sqrt, CI->
getType(),
2771 {CI->getArgOperand(0)});
2772 }
else if (Name.starts_with(
"avx512.mask.sqrt.p")) {
2776 Intrinsic::ID IID = Name[18] ==
's' ? Intrinsic::x86_avx512_sqrt_ps_512
2777 : Intrinsic::x86_avx512_sqrt_pd_512;
2780 Rep = Builder.CreateIntrinsic(IID, Args);
2782 Rep = Builder.CreateIntrinsic(Intrinsic::sqrt, CI->
getType(),
2783 {CI->getArgOperand(0)});
2787 }
else if (Name.starts_with(
"avx512.ptestm") ||
2788 Name.starts_with(
"avx512.ptestnm")) {
2792 Rep = Builder.CreateAnd(Op0, Op1);
2798 Rep = Builder.CreateICmp(Pred, Rep, Zero);
2800 }
else if (Name.starts_with(
"avx512.mask.pbroadcast")) {
2803 Rep = Builder.CreateVectorSplat(NumElts, CI->
getArgOperand(0));
2806 }
else if (Name.starts_with(
"avx512.kunpck")) {
2811 for (
unsigned i = 0; i != NumElts; ++i)
2820 Rep = Builder.CreateShuffleVector(
RHS,
LHS,
ArrayRef(Indices, NumElts));
2821 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2822 }
else if (Name ==
"avx512.kand.w") {
2825 Rep = Builder.CreateAnd(
LHS,
RHS);
2826 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2827 }
else if (Name ==
"avx512.kandn.w") {
2830 LHS = Builder.CreateNot(
LHS);
2831 Rep = Builder.CreateAnd(
LHS,
RHS);
2832 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2833 }
else if (Name ==
"avx512.kor.w") {
2836 Rep = Builder.CreateOr(
LHS,
RHS);
2837 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2838 }
else if (Name ==
"avx512.kxor.w") {
2841 Rep = Builder.CreateXor(
LHS,
RHS);
2842 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2843 }
else if (Name ==
"avx512.kxnor.w") {
2846 LHS = Builder.CreateNot(
LHS);
2847 Rep = Builder.CreateXor(
LHS,
RHS);
2848 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2849 }
else if (Name ==
"avx512.knot.w") {
2851 Rep = Builder.CreateNot(Rep);
2852 Rep = Builder.CreateBitCast(Rep, CI->
getType());
2853 }
else if (Name ==
"avx512.kortestz.w" || Name ==
"avx512.kortestc.w") {
2856 Rep = Builder.CreateOr(
LHS,
RHS);
2857 Rep = Builder.CreateBitCast(Rep, Builder.getInt16Ty());
2859 if (Name[14] ==
'c')
2863 Rep = Builder.CreateICmpEQ(Rep,
C);
2864 Rep = Builder.CreateZExt(Rep, Builder.getInt32Ty());
2865 }
else if (Name ==
"sse.add.ss" || Name ==
"sse2.add.sd" ||
2866 Name ==
"sse.sub.ss" || Name ==
"sse2.sub.sd" ||
2867 Name ==
"sse.mul.ss" || Name ==
"sse2.mul.sd" ||
2868 Name ==
"sse.div.ss" || Name ==
"sse2.div.sd") {
2871 ConstantInt::get(I32Ty, 0));
2873 ConstantInt::get(I32Ty, 0));
2875 if (Name.contains(
".add."))
2876 EltOp = Builder.CreateFAdd(Elt0, Elt1);
2877 else if (Name.contains(
".sub."))
2878 EltOp = Builder.CreateFSub(Elt0, Elt1);
2879 else if (Name.contains(
".mul."))
2880 EltOp = Builder.CreateFMul(Elt0, Elt1);
2882 EltOp = Builder.CreateFDiv(Elt0, Elt1);
2883 Rep = Builder.CreateInsertElement(CI->
getArgOperand(0), EltOp,
2884 ConstantInt::get(I32Ty, 0));
2885 }
else if (Name.starts_with(
"avx512.mask.pcmp")) {
2887 bool CmpEq = Name[16] ==
'e';
2889 }
else if (Name.starts_with(
"avx512.mask.vpshufbitqmb.")) {
2897 IID = Intrinsic::x86_avx512_vpshufbitqmb_128;
2900 IID = Intrinsic::x86_avx512_vpshufbitqmb_256;
2903 IID = Intrinsic::x86_avx512_vpshufbitqmb_512;
2910 }
else if (Name.starts_with(
"avx512.mask.fpclass.p")) {
2915 if (VecWidth == 128 && EltWidth == 32)
2916 IID = Intrinsic::x86_avx512_fpclass_ps_128;
2917 else if (VecWidth == 256 && EltWidth == 32)
2918 IID = Intrinsic::x86_avx512_fpclass_ps_256;
2919 else if (VecWidth == 512 && EltWidth == 32)
2920 IID = Intrinsic::x86_avx512_fpclass_ps_512;
2921 else if (VecWidth == 128 && EltWidth == 64)
2922 IID = Intrinsic::x86_avx512_fpclass_pd_128;
2923 else if (VecWidth == 256 && EltWidth == 64)
2924 IID = Intrinsic::x86_avx512_fpclass_pd_256;
2925 else if (VecWidth == 512 && EltWidth == 64)
2926 IID = Intrinsic::x86_avx512_fpclass_pd_512;
2933 }
else if (Name.starts_with(
"avx512.cmp.p")) {
2935 Type *OpTy = Args[0]->getType();
2939 if (VecWidth == 128 && EltWidth == 32)
2940 IID = Intrinsic::x86_avx512_mask_cmp_ps_128;
2941 else if (VecWidth == 256 && EltWidth == 32)
2942 IID = Intrinsic::x86_avx512_mask_cmp_ps_256;
2943 else if (VecWidth == 512 && EltWidth == 32)
2944 IID = Intrinsic::x86_avx512_mask_cmp_ps_512;
2945 else if (VecWidth == 128 && EltWidth == 64)
2946 IID = Intrinsic::x86_avx512_mask_cmp_pd_128;
2947 else if (VecWidth == 256 && EltWidth == 64)
2948 IID = Intrinsic::x86_avx512_mask_cmp_pd_256;
2949 else if (VecWidth == 512 && EltWidth == 64)
2950 IID = Intrinsic::x86_avx512_mask_cmp_pd_512;
2955 if (VecWidth == 512)
2957 Args.push_back(Mask);
2959 Rep = Builder.CreateIntrinsic(IID, Args);
2960 }
else if (Name.starts_with(
"avx512.mask.cmp.")) {
2964 }
else if (Name.starts_with(
"avx512.mask.ucmp.")) {
2967 }
else if (Name.starts_with(
"avx512.cvtb2mask.") ||
2968 Name.starts_with(
"avx512.cvtw2mask.") ||
2969 Name.starts_with(
"avx512.cvtd2mask.") ||
2970 Name.starts_with(
"avx512.cvtq2mask.")) {
2975 }
else if (Name ==
"ssse3.pabs.b.128" || Name ==
"ssse3.pabs.w.128" ||
2976 Name ==
"ssse3.pabs.d.128" || Name.starts_with(
"avx2.pabs") ||
2977 Name.starts_with(
"avx512.mask.pabs")) {
2979 }
else if (Name ==
"sse41.pmaxsb" || Name ==
"sse2.pmaxs.w" ||
2980 Name ==
"sse41.pmaxsd" || Name.starts_with(
"avx2.pmaxs") ||
2981 Name.starts_with(
"avx512.mask.pmaxs")) {
2983 }
else if (Name ==
"sse2.pmaxu.b" || Name ==
"sse41.pmaxuw" ||
2984 Name ==
"sse41.pmaxud" || Name.starts_with(
"avx2.pmaxu") ||
2985 Name.starts_with(
"avx512.mask.pmaxu")) {
2987 }
else if (Name ==
"sse41.pminsb" || Name ==
"sse2.pmins.w" ||
2988 Name ==
"sse41.pminsd" || Name.starts_with(
"avx2.pmins") ||
2989 Name.starts_with(
"avx512.mask.pmins")) {
2991 }
else if (Name ==
"sse2.pminu.b" || Name ==
"sse41.pminuw" ||
2992 Name ==
"sse41.pminud" || Name.starts_with(
"avx2.pminu") ||
2993 Name.starts_with(
"avx512.mask.pminu")) {
2995 }
else if (Name ==
"sse2.pmulu.dq" || Name ==
"avx2.pmulu.dq" ||
2996 Name ==
"avx512.pmulu.dq.512" ||
2997 Name.starts_with(
"avx512.mask.pmulu.dq.")) {
2999 }
else if (Name ==
"sse41.pmuldq" || Name ==
"avx2.pmul.dq" ||
3000 Name ==
"avx512.pmul.dq.512" ||
3001 Name.starts_with(
"avx512.mask.pmul.dq.")) {
3003 }
else if (Name ==
"sse.cvtsi2ss" || Name ==
"sse2.cvtsi2sd" ||
3004 Name ==
"sse.cvtsi642ss" || Name ==
"sse2.cvtsi642sd") {
3009 }
else if (Name ==
"avx512.cvtusi2sd") {
3014 }
else if (Name ==
"sse2.cvtss2sd") {
3016 Rep = Builder.CreateFPExt(
3019 }
else if (Name ==
"sse2.cvtdq2pd" || Name ==
"sse2.cvtdq2ps" ||
3020 Name ==
"avx.cvtdq2.pd.256" || Name ==
"avx.cvtdq2.ps.256" ||
3021 Name.starts_with(
"avx512.mask.cvtdq2pd.") ||
3022 Name.starts_with(
"avx512.mask.cvtudq2pd.") ||
3023 Name.starts_with(
"avx512.mask.cvtdq2ps.") ||
3024 Name.starts_with(
"avx512.mask.cvtudq2ps.") ||
3025 Name.starts_with(
"avx512.mask.cvtqq2pd.") ||
3026 Name.starts_with(
"avx512.mask.cvtuqq2pd.") ||
3027 Name ==
"avx512.mask.cvtqq2ps.256" ||
3028 Name ==
"avx512.mask.cvtqq2ps.512" ||
3029 Name ==
"avx512.mask.cvtuqq2ps.256" ||
3030 Name ==
"avx512.mask.cvtuqq2ps.512" || Name ==
"sse2.cvtps2pd" ||
3031 Name ==
"avx.cvt.ps2.pd.256" ||
3032 Name ==
"avx512.mask.cvtps2pd.128" ||
3033 Name ==
"avx512.mask.cvtps2pd.256") {
3038 unsigned NumDstElts = DstTy->getNumElements();
3040 assert(NumDstElts == 2 &&
"Unexpected vector size");
3041 Rep = Builder.CreateShuffleVector(Rep, Rep,
ArrayRef<int>{0, 1});
3044 bool IsPS2PD = SrcTy->getElementType()->isFloatTy();
3045 bool IsUnsigned = Name.contains(
"cvtu");
3047 Rep = Builder.CreateFPExt(Rep, DstTy,
"cvtps2pd");
3051 Intrinsic::ID IID = IsUnsigned ? Intrinsic::x86_avx512_uitofp_round
3052 : Intrinsic::x86_avx512_sitofp_round;
3053 Rep = Builder.CreateIntrinsic(IID, {DstTy, SrcTy},
3056 Rep = IsUnsigned ? Builder.CreateUIToFP(Rep, DstTy,
"cvt")
3057 : Builder.CreateSIToFP(Rep, DstTy,
"cvt");
3063 }
else if (Name.starts_with(
"avx512.mask.vcvtph2ps.") ||
3064 Name.starts_with(
"vcvtph2ps.")) {
3068 unsigned NumDstElts = DstTy->getNumElements();
3069 if (NumDstElts != SrcTy->getNumElements()) {
3070 assert(NumDstElts == 4 &&
"Unexpected vector size");
3071 Rep = Builder.CreateShuffleVector(Rep, Rep,
ArrayRef<int>{0, 1, 2, 3});
3073 Rep = Builder.CreateBitCast(
3075 Rep = Builder.CreateFPExt(Rep, DstTy,
"cvtph2ps");
3079 }
else if (Name.starts_with(
"avx512.mask.load")) {
3081 bool Aligned = Name[16] !=
'u';
3084 }
else if (Name.starts_with(
"avx512.mask.expand.load.")) {
3087 ResultTy->getNumElements());
3089 Rep = Builder.CreateIntrinsic(
3090 Intrinsic::masked_expandload, ResultTy,
3092 }
else if (Name.starts_with(
"avx512.mask.compress.store.")) {
3098 Rep = Builder.CreateIntrinsic(
3099 Intrinsic::masked_compressstore, ResultTy,
3101 }
else if (Name.starts_with(
"avx512.mask.compress.") ||
3102 Name.starts_with(
"avx512.mask.expand.")) {
3106 ResultTy->getNumElements());
3108 bool IsCompress = Name[12] ==
'c';
3109 Intrinsic::ID IID = IsCompress ? Intrinsic::x86_avx512_mask_compress
3110 : Intrinsic::x86_avx512_mask_expand;
3111 Rep = Builder.CreateIntrinsic(
3113 }
else if (Name.starts_with(
"xop.vpcom")) {
3115 if (Name.ends_with(
"ub") || Name.ends_with(
"uw") || Name.ends_with(
"ud") ||
3116 Name.ends_with(
"uq"))
3118 else if (Name.ends_with(
"b") || Name.ends_with(
"w") ||
3119 Name.ends_with(
"d") || Name.ends_with(
"q"))
3128 Name = Name.substr(9);
3129 if (Name.starts_with(
"lt"))
3131 else if (Name.starts_with(
"le"))
3133 else if (Name.starts_with(
"gt"))
3135 else if (Name.starts_with(
"ge"))
3137 else if (Name.starts_with(
"eq"))
3139 else if (Name.starts_with(
"ne"))
3141 else if (Name.starts_with(
"false"))
3143 else if (Name.starts_with(
"true"))
3150 }
else if (Name.starts_with(
"xop.vpcmov")) {
3152 Value *NotSel = Builder.CreateNot(Sel);
3155 Rep = Builder.CreateOr(Sel0, Sel1);
3156 }
else if (Name.starts_with(
"xop.vprot") || Name.starts_with(
"avx512.prol") ||
3157 Name.starts_with(
"avx512.mask.prol")) {
3159 }
else if (Name.starts_with(
"avx512.pror") ||
3160 Name.starts_with(
"avx512.mask.pror")) {
3162 }
else if (Name.starts_with(
"avx512.vpshld.") ||
3163 Name.starts_with(
"avx512.mask.vpshld") ||
3164 Name.starts_with(
"avx512.maskz.vpshld")) {
3165 bool ZeroMask = Name[11] ==
'z';
3167 }
else if (Name.starts_with(
"avx512.vpshrd.") ||
3168 Name.starts_with(
"avx512.mask.vpshrd") ||
3169 Name.starts_with(
"avx512.maskz.vpshrd")) {
3170 bool ZeroMask = Name[11] ==
'z';
3172 }
else if (Name ==
"sse42.crc32.64.8") {
3175 Rep = Builder.CreateIntrinsic(Intrinsic::x86_sse42_crc32_32_8,
3177 Rep = Builder.CreateZExt(Rep, CI->
getType(),
"");
3178 }
else if (Name.starts_with(
"avx.vbroadcast.s") ||
3179 Name.starts_with(
"avx512.vbroadcast.s")) {
3182 Type *EltTy = VecTy->getElementType();
3183 unsigned EltNum = VecTy->getNumElements();
3187 for (
unsigned I = 0;
I < EltNum; ++
I)
3188 Rep = Builder.CreateInsertElement(Rep, Load, ConstantInt::get(I32Ty,
I));
3189 }
else if (Name.starts_with(
"sse41.pmovsx") ||
3190 Name.starts_with(
"sse41.pmovzx") ||
3191 Name.starts_with(
"avx2.pmovsx") ||
3192 Name.starts_with(
"avx2.pmovzx") ||
3193 Name.starts_with(
"avx512.mask.pmovsx") ||
3194 Name.starts_with(
"avx512.mask.pmovzx")) {
3196 unsigned NumDstElts = DstTy->getNumElements();
3200 for (
unsigned i = 0; i != NumDstElts; ++i)
3205 bool DoSext = Name.contains(
"pmovsx");
3207 DoSext ? Builder.CreateSExt(SV, DstTy) : Builder.CreateZExt(SV, DstTy);
3212 }
else if (Name ==
"avx512.mask.pmov.qd.256" ||
3213 Name ==
"avx512.mask.pmov.qd.512" ||
3214 Name ==
"avx512.mask.pmov.wb.256" ||
3215 Name ==
"avx512.mask.pmov.wb.512") {
3220 }
else if (Name.starts_with(
"avx.vbroadcastf128") ||
3221 Name ==
"avx2.vbroadcasti128") {
3227 if (NumSrcElts == 2)
3228 Rep = Builder.CreateShuffleVector(Load,
ArrayRef<int>{0, 1, 0, 1});
3230 Rep = Builder.CreateShuffleVector(Load,
3232 }
else if (Name.starts_with(
"avx512.mask.shuf.i") ||
3233 Name.starts_with(
"avx512.mask.shuf.f")) {
3238 unsigned ControlBitsMask = NumLanes - 1;
3239 unsigned NumControlBits = NumLanes / 2;
3242 for (
unsigned l = 0; l != NumLanes; ++l) {
3243 unsigned LaneMask = (Imm >> (l * NumControlBits)) & ControlBitsMask;
3245 if (l >= NumLanes / 2)
3246 LaneMask += NumLanes;
3247 for (
unsigned i = 0; i != NumElementsInLane; ++i)
3248 ShuffleMask.push_back(LaneMask * NumElementsInLane + i);
3254 }
else if (Name.starts_with(
"avx512.mask.broadcastf") ||
3255 Name.starts_with(
"avx512.mask.broadcasti")) {
3258 unsigned NumDstElts =
3262 for (
unsigned i = 0; i != NumDstElts; ++i)
3263 ShuffleMask[i] = i % NumSrcElts;
3269 }
else if (Name.starts_with(
"avx2.pbroadcast") ||
3270 Name.starts_with(
"avx2.vbroadcast") ||
3271 Name.starts_with(
"avx512.pbroadcast") ||
3272 Name.starts_with(
"avx512.mask.broadcast.s")) {
3279 Rep = Builder.CreateShuffleVector(
Op, M);
3284 }
else if (Name.starts_with(
"sse2.padds.") ||
3285 Name.starts_with(
"avx2.padds.") ||
3286 Name.starts_with(
"avx512.padds.") ||
3287 Name.starts_with(
"avx512.mask.padds.")) {
3289 }
else if (Name.starts_with(
"sse2.psubs.") ||
3290 Name.starts_with(
"avx2.psubs.") ||
3291 Name.starts_with(
"avx512.psubs.") ||
3292 Name.starts_with(
"avx512.mask.psubs.")) {
3294 }
else if (Name.starts_with(
"sse2.paddus.") ||
3295 Name.starts_with(
"avx2.paddus.") ||
3296 Name.starts_with(
"avx512.mask.paddus.")) {
3298 }
else if (Name.starts_with(
"sse2.psubus.") ||
3299 Name.starts_with(
"avx2.psubus.") ||
3300 Name.starts_with(
"avx512.mask.psubus.")) {
3302 }
else if (Name.starts_with(
"avx512.mask.palignr.")) {
3307 }
else if (Name.starts_with(
"avx512.mask.valign.")) {
3311 }
else if (Name ==
"sse2.psll.dq" || Name ==
"avx2.psll.dq") {
3316 }
else if (Name ==
"sse2.psrl.dq" || Name ==
"avx2.psrl.dq") {
3321 }
else if (Name ==
"sse2.psll.dq.bs" || Name ==
"avx2.psll.dq.bs" ||
3322 Name ==
"avx512.psll.dq.512") {
3326 }
else if (Name ==
"sse2.psrl.dq.bs" || Name ==
"avx2.psrl.dq.bs" ||
3327 Name ==
"avx512.psrl.dq.512") {
3331 }
else if (Name ==
"sse41.pblendw" || Name.starts_with(
"sse41.blendp") ||
3332 Name.starts_with(
"avx.blend.p") || Name ==
"avx2.pblendw" ||
3333 Name.starts_with(
"avx2.pblendd.")) {
3338 unsigned NumElts = VecTy->getNumElements();
3341 for (
unsigned i = 0; i != NumElts; ++i)
3342 Idxs[i] = ((Imm >> (i % 8)) & 1) ? i + NumElts : i;
3344 Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs);
3345 }
else if (Name.starts_with(
"avx.vinsertf128.") ||
3346 Name ==
"avx2.vinserti128" ||
3347 Name.starts_with(
"avx512.mask.insert")) {
3351 unsigned DstNumElts =
3353 unsigned SrcNumElts =
3355 unsigned Scale = DstNumElts / SrcNumElts;
3362 for (
unsigned i = 0; i != SrcNumElts; ++i)
3364 for (
unsigned i = SrcNumElts; i != DstNumElts; ++i)
3365 Idxs[i] = SrcNumElts;
3366 Rep = Builder.CreateShuffleVector(Op1, Idxs);
3380 for (
unsigned i = 0; i != DstNumElts; ++i)
3383 for (
unsigned i = 0; i != SrcNumElts; ++i)
3384 Idxs[i + Imm * SrcNumElts] = i + DstNumElts;
3385 Rep = Builder.CreateShuffleVector(Op0, Rep, Idxs);
3391 }
else if (Name.starts_with(
"avx.vextractf128.") ||
3392 Name ==
"avx2.vextracti128" ||
3393 Name.starts_with(
"avx512.mask.vextract")) {
3396 unsigned DstNumElts =
3398 unsigned SrcNumElts =
3400 unsigned Scale = SrcNumElts / DstNumElts;
3407 for (
unsigned i = 0; i != DstNumElts; ++i) {
3408 Idxs[i] = i + (Imm * DstNumElts);
3410 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3416 }
else if (Name.starts_with(
"avx512.mask.perm.df.") ||
3417 Name.starts_with(
"avx512.mask.perm.di.")) {
3421 unsigned NumElts = VecTy->getNumElements();
3424 for (
unsigned i = 0; i != NumElts; ++i)
3425 Idxs[i] = (i & ~0x3) + ((Imm >> (2 * (i & 0x3))) & 3);
3427 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3432 }
else if (Name.starts_with(
"avx.vperm2f128.") || Name ==
"avx2.vperm2i128") {
3444 unsigned HalfSize = NumElts / 2;
3456 unsigned StartIndex = (Imm & 0x01) ? HalfSize : 0;
3457 for (
unsigned i = 0; i < HalfSize; ++i)
3458 ShuffleMask[i] = StartIndex + i;
3461 StartIndex = (Imm & 0x10) ? HalfSize : 0;
3462 for (
unsigned i = 0; i < HalfSize; ++i)
3463 ShuffleMask[i + HalfSize] = NumElts + StartIndex + i;
3465 Rep = Builder.CreateShuffleVector(V0, V1, ShuffleMask);
3467 }
else if (Name.starts_with(
"avx.vpermil.") || Name ==
"sse2.pshuf.d" ||
3468 Name.starts_with(
"avx512.mask.vpermil.p") ||
3469 Name.starts_with(
"avx512.mask.pshuf.d.")) {
3473 unsigned NumElts = VecTy->getNumElements();
3475 unsigned IdxSize = 64 / VecTy->getScalarSizeInBits();
3476 unsigned IdxMask = ((1 << IdxSize) - 1);
3482 for (
unsigned i = 0; i != NumElts; ++i)
3483 Idxs[i] = ((Imm >> ((i * IdxSize) % 8)) & IdxMask) | (i & ~IdxMask);
3485 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3490 }
else if (Name ==
"sse2.pshufl.w" ||
3491 Name.starts_with(
"avx512.mask.pshufl.w.")) {
3497 for (
unsigned l = 0; l != NumElts; l += 8) {
3498 for (
unsigned i = 0; i != 4; ++i)
3499 Idxs[i + l] = ((Imm >> (2 * i)) & 0x3) + l;
3500 for (
unsigned i = 4; i != 8; ++i)
3501 Idxs[i + l] = i + l;
3504 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3509 }
else if (Name ==
"sse2.pshufh.w" ||
3510 Name.starts_with(
"avx512.mask.pshufh.w.")) {
3516 for (
unsigned l = 0; l != NumElts; l += 8) {
3517 for (
unsigned i = 0; i != 4; ++i)
3518 Idxs[i + l] = i + l;
3519 for (
unsigned i = 0; i != 4; ++i)
3520 Idxs[i + l + 4] = ((Imm >> (2 * i)) & 0x3) + 4 + l;
3523 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3528 }
else if (Name.starts_with(
"avx512.mask.shuf.p")) {
3535 unsigned HalfLaneElts = NumLaneElts / 2;
3538 for (
unsigned i = 0; i != NumElts; ++i) {
3540 Idxs[i] = i - (i % NumLaneElts);
3542 if ((i % NumLaneElts) >= HalfLaneElts)
3546 Idxs[i] += (Imm >> ((i * HalfLaneElts) % 8)) & ((1 << HalfLaneElts) - 1);
3549 Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs);
3553 }
else if (Name.starts_with(
"avx512.mask.movddup") ||
3554 Name.starts_with(
"avx512.mask.movshdup") ||
3555 Name.starts_with(
"avx512.mask.movsldup")) {
3561 if (Name.starts_with(
"avx512.mask.movshdup."))
3565 for (
unsigned l = 0; l != NumElts; l += NumLaneElts)
3566 for (
unsigned i = 0; i != NumLaneElts; i += 2) {
3567 Idxs[i + l + 0] = i + l +
Offset;
3568 Idxs[i + l + 1] = i + l +
Offset;
3571 Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs);
3575 }
else if (Name.starts_with(
"avx512.mask.punpckl") ||
3576 Name.starts_with(
"avx512.mask.unpckl.")) {
3583 for (
int l = 0; l != NumElts; l += NumLaneElts)
3584 for (
int i = 0; i != NumLaneElts; ++i)
3585 Idxs[i + l] = l + (i / 2) + NumElts * (i % 2);
3587 Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs);
3591 }
else if (Name.starts_with(
"avx512.mask.punpckh") ||
3592 Name.starts_with(
"avx512.mask.unpckh.")) {
3599 for (
int l = 0; l != NumElts; l += NumLaneElts)
3600 for (
int i = 0; i != NumLaneElts; ++i)
3601 Idxs[i + l] = (NumLaneElts / 2) + l + (i / 2) + NumElts * (i % 2);
3603 Rep = Builder.CreateShuffleVector(Op0, Op1, Idxs);
3607 }
else if (Name.starts_with(
"avx512.mask.and.") ||
3608 Name.starts_with(
"avx512.mask.pand.")) {
3611 Rep = Builder.CreateAnd(Builder.CreateBitCast(CI->
getArgOperand(0), ITy),
3613 Rep = Builder.CreateBitCast(Rep, FTy);
3616 }
else if (Name.starts_with(
"avx512.mask.andn.") ||
3617 Name.starts_with(
"avx512.mask.pandn.")) {
3620 Rep = Builder.CreateNot(Builder.CreateBitCast(CI->
getArgOperand(0), ITy));
3621 Rep = Builder.CreateAnd(Rep,
3623 Rep = Builder.CreateBitCast(Rep, FTy);
3626 }
else if (Name.starts_with(
"avx512.mask.or.") ||
3627 Name.starts_with(
"avx512.mask.por.")) {
3630 Rep = Builder.CreateOr(Builder.CreateBitCast(CI->
getArgOperand(0), ITy),
3632 Rep = Builder.CreateBitCast(Rep, FTy);
3635 }
else if (Name.starts_with(
"avx512.mask.xor.") ||
3636 Name.starts_with(
"avx512.mask.pxor.")) {
3639 Rep = Builder.CreateXor(Builder.CreateBitCast(CI->
getArgOperand(0), ITy),
3641 Rep = Builder.CreateBitCast(Rep, FTy);
3644 }
else if (Name.starts_with(
"avx512.mask.padd.")) {
3648 }
else if (Name.starts_with(
"avx512.mask.psub.")) {
3652 }
else if (Name.starts_with(
"avx512.mask.pmull.")) {
3656 }
else if (Name.starts_with(
"avx512.mask.add.p")) {
3657 if (Name.ends_with(
".512")) {
3659 if (Name[17] ==
's')
3660 IID = Intrinsic::x86_avx512_add_ps_512;
3662 IID = Intrinsic::x86_avx512_add_pd_512;
3664 Rep = Builder.CreateIntrinsic(
3672 }
else if (Name.starts_with(
"avx512.mask.div.p")) {
3673 if (Name.ends_with(
".512")) {
3675 if (Name[17] ==
's')
3676 IID = Intrinsic::x86_avx512_div_ps_512;
3678 IID = Intrinsic::x86_avx512_div_pd_512;
3680 Rep = Builder.CreateIntrinsic(
3688 }
else if (Name.starts_with(
"avx512.mask.mul.p")) {
3689 if (Name.ends_with(
".512")) {
3691 if (Name[17] ==
's')
3692 IID = Intrinsic::x86_avx512_mul_ps_512;
3694 IID = Intrinsic::x86_avx512_mul_pd_512;
3696 Rep = Builder.CreateIntrinsic(
3704 }
else if (Name.starts_with(
"avx512.mask.sub.p")) {
3705 if (Name.ends_with(
".512")) {
3707 if (Name[17] ==
's')
3708 IID = Intrinsic::x86_avx512_sub_ps_512;
3710 IID = Intrinsic::x86_avx512_sub_pd_512;
3712 Rep = Builder.CreateIntrinsic(
3720 }
else if ((Name.starts_with(
"avx512.mask.max.p") ||
3721 Name.starts_with(
"avx512.mask.min.p")) &&
3722 Name.drop_front(18) ==
".512") {
3723 bool IsDouble = Name[17] ==
'd';
3724 bool IsMin = Name[13] ==
'i';
3726 {Intrinsic::x86_avx512_max_ps_512, Intrinsic::x86_avx512_max_pd_512},
3727 {Intrinsic::x86_avx512_min_ps_512, Intrinsic::x86_avx512_min_pd_512}};
3730 Rep = Builder.CreateIntrinsic(
3735 }
else if (Name.starts_with(
"avx512.mask.lzcnt.")) {
3737 Builder.CreateIntrinsic(Intrinsic::ctlz, CI->
getType(),
3738 {CI->getArgOperand(0), Builder.getInt1(false)});
3741 }
else if (Name.starts_with(
"avx512.mask.psll")) {
3742 bool IsImmediate = Name[16] ==
'i' || (Name.size() > 18 && Name[18] ==
'i');
3743 bool IsVariable = Name[16] ==
'v';
3744 char Size = Name[16] ==
'.' ? Name[17]
3745 : Name[17] ==
'.' ? Name[18]
3746 : Name[18] ==
'.' ? Name[19]
3750 if (IsVariable && Name[17] !=
'.') {
3751 if (
Size ==
'd' && Name[17] ==
'2')
3752 IID = Intrinsic::x86_avx2_psllv_q;
3753 else if (
Size ==
'd' && Name[17] ==
'4')
3754 IID = Intrinsic::x86_avx2_psllv_q_256;
3755 else if (
Size ==
's' && Name[17] ==
'4')
3756 IID = Intrinsic::x86_avx2_psllv_d;
3757 else if (
Size ==
's' && Name[17] ==
'8')
3758 IID = Intrinsic::x86_avx2_psllv_d_256;
3759 else if (
Size ==
'h' && Name[17] ==
'8')
3760 IID = Intrinsic::x86_avx512_psllv_w_128;
3761 else if (
Size ==
'h' && Name[17] ==
'1')
3762 IID = Intrinsic::x86_avx512_psllv_w_256;
3763 else if (Name[17] ==
'3' && Name[18] ==
'2')
3764 IID = Intrinsic::x86_avx512_psllv_w_512;
3767 }
else if (Name.ends_with(
".128")) {
3769 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_d
3770 : Intrinsic::x86_sse2_psll_d;
3771 else if (
Size ==
'q')
3772 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_q
3773 : Intrinsic::x86_sse2_psll_q;
3774 else if (
Size ==
'w')
3775 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_w
3776 : Intrinsic::x86_sse2_psll_w;
3779 }
else if (Name.ends_with(
".256")) {
3781 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_d
3782 : Intrinsic::x86_avx2_psll_d;
3783 else if (
Size ==
'q')
3784 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_q
3785 : Intrinsic::x86_avx2_psll_q;
3786 else if (
Size ==
'w')
3787 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_w
3788 : Intrinsic::x86_avx2_psll_w;
3793 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_d_512
3794 : IsVariable ? Intrinsic::x86_avx512_psllv_d_512
3795 : Intrinsic::x86_avx512_psll_d_512;
3796 else if (
Size ==
'q')
3797 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_q_512
3798 : IsVariable ? Intrinsic::x86_avx512_psllv_q_512
3799 : Intrinsic::x86_avx512_psll_q_512;
3800 else if (
Size ==
'w')
3801 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_w_512
3802 : Intrinsic::x86_avx512_psll_w_512;
3808 }
else if (Name.starts_with(
"avx512.mask.psrl")) {
3809 bool IsImmediate = Name[16] ==
'i' || (Name.size() > 18 && Name[18] ==
'i');
3810 bool IsVariable = Name[16] ==
'v';
3811 char Size = Name[16] ==
'.' ? Name[17]
3812 : Name[17] ==
'.' ? Name[18]
3813 : Name[18] ==
'.' ? Name[19]
3817 if (IsVariable && Name[17] !=
'.') {
3818 if (
Size ==
'd' && Name[17] ==
'2')
3819 IID = Intrinsic::x86_avx2_psrlv_q;
3820 else if (
Size ==
'd' && Name[17] ==
'4')
3821 IID = Intrinsic::x86_avx2_psrlv_q_256;
3822 else if (
Size ==
's' && Name[17] ==
'4')
3823 IID = Intrinsic::x86_avx2_psrlv_d;
3824 else if (
Size ==
's' && Name[17] ==
'8')
3825 IID = Intrinsic::x86_avx2_psrlv_d_256;
3826 else if (
Size ==
'h' && Name[17] ==
'8')
3827 IID = Intrinsic::x86_avx512_psrlv_w_128;
3828 else if (
Size ==
'h' && Name[17] ==
'1')
3829 IID = Intrinsic::x86_avx512_psrlv_w_256;
3830 else if (Name[17] ==
'3' && Name[18] ==
'2')
3831 IID = Intrinsic::x86_avx512_psrlv_w_512;
3834 }
else if (Name.ends_with(
".128")) {
3836 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_d
3837 : Intrinsic::x86_sse2_psrl_d;
3838 else if (
Size ==
'q')
3839 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_q
3840 : Intrinsic::x86_sse2_psrl_q;
3841 else if (
Size ==
'w')
3842 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_w
3843 : Intrinsic::x86_sse2_psrl_w;
3846 }
else if (Name.ends_with(
".256")) {
3848 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_d
3849 : Intrinsic::x86_avx2_psrl_d;
3850 else if (
Size ==
'q')
3851 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_q
3852 : Intrinsic::x86_avx2_psrl_q;
3853 else if (
Size ==
'w')
3854 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_w
3855 : Intrinsic::x86_avx2_psrl_w;
3860 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_d_512
3861 : IsVariable ? Intrinsic::x86_avx512_psrlv_d_512
3862 : Intrinsic::x86_avx512_psrl_d_512;
3863 else if (
Size ==
'q')
3864 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_q_512
3865 : IsVariable ? Intrinsic::x86_avx512_psrlv_q_512
3866 : Intrinsic::x86_avx512_psrl_q_512;
3867 else if (
Size ==
'w')
3868 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_w_512
3869 : Intrinsic::x86_avx512_psrl_w_512;
3875 }
else if (Name.starts_with(
"avx512.mask.psra")) {
3876 bool IsImmediate = Name[16] ==
'i' || (Name.size() > 18 && Name[18] ==
'i');
3877 bool IsVariable = Name[16] ==
'v';
3878 char Size = Name[16] ==
'.' ? Name[17]
3879 : Name[17] ==
'.' ? Name[18]
3880 : Name[18] ==
'.' ? Name[19]
3884 if (IsVariable && Name[17] !=
'.') {
3885 if (
Size ==
's' && Name[17] ==
'4')
3886 IID = Intrinsic::x86_avx2_psrav_d;
3887 else if (
Size ==
's' && Name[17] ==
'8')
3888 IID = Intrinsic::x86_avx2_psrav_d_256;
3889 else if (
Size ==
'h' && Name[17] ==
'8')
3890 IID = Intrinsic::x86_avx512_psrav_w_128;
3891 else if (
Size ==
'h' && Name[17] ==
'1')
3892 IID = Intrinsic::x86_avx512_psrav_w_256;
3893 else if (Name[17] ==
'3' && Name[18] ==
'2')
3894 IID = Intrinsic::x86_avx512_psrav_w_512;
3897 }
else if (Name.ends_with(
".128")) {
3899 IID = IsImmediate ? Intrinsic::x86_sse2_psrai_d
3900 : Intrinsic::x86_sse2_psra_d;
3901 else if (
Size ==
'q')
3902 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_128
3903 : IsVariable ? Intrinsic::x86_avx512_psrav_q_128
3904 : Intrinsic::x86_avx512_psra_q_128;
3905 else if (
Size ==
'w')
3906 IID = IsImmediate ? Intrinsic::x86_sse2_psrai_w
3907 : Intrinsic::x86_sse2_psra_w;
3910 }
else if (Name.ends_with(
".256")) {
3912 IID = IsImmediate ? Intrinsic::x86_avx2_psrai_d
3913 : Intrinsic::x86_avx2_psra_d;
3914 else if (
Size ==
'q')
3915 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_256
3916 : IsVariable ? Intrinsic::x86_avx512_psrav_q_256
3917 : Intrinsic::x86_avx512_psra_q_256;
3918 else if (
Size ==
'w')
3919 IID = IsImmediate ? Intrinsic::x86_avx2_psrai_w
3920 : Intrinsic::x86_avx2_psra_w;
3925 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_d_512
3926 : IsVariable ? Intrinsic::x86_avx512_psrav_d_512
3927 : Intrinsic::x86_avx512_psra_d_512;
3928 else if (
Size ==
'q')
3929 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_512
3930 : IsVariable ? Intrinsic::x86_avx512_psrav_q_512
3931 : Intrinsic::x86_avx512_psra_q_512;
3932 else if (
Size ==
'w')
3933 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_w_512
3934 : Intrinsic::x86_avx512_psra_w_512;
3940 }
else if (Name.starts_with(
"avx512.mask.move.s")) {
3942 }
else if (Name.starts_with(
"avx512.cvtmask2")) {
3944 }
else if (Name.ends_with(
".movntdqa")) {
3948 LoadInst *LI = Builder.CreateAlignedLoad(
3953 }
else if (Name.starts_with(
"fma.vfmadd.") ||
3954 Name.starts_with(
"fma.vfmsub.") ||
3955 Name.starts_with(
"fma.vfnmadd.") ||
3956 Name.starts_with(
"fma.vfnmsub.")) {
3957 bool NegMul = Name[6] ==
'n';
3958 bool NegAcc = NegMul ? Name[8] ==
's' : Name[7] ==
's';
3959 bool IsScalar = NegMul ? Name[12] ==
's' : Name[11] ==
's';
3970 if (NegMul && !IsScalar)
3971 Ops[0] = Builder.CreateFNeg(
Ops[0]);
3972 if (NegMul && IsScalar)
3973 Ops[1] = Builder.CreateFNeg(
Ops[1]);
3975 Ops[2] = Builder.CreateFNeg(
Ops[2]);
3977 Rep = Builder.CreateIntrinsic(Intrinsic::fma,
Ops[0]->
getType(),
Ops);
3981 }
else if (Name.starts_with(
"fma4.vfmadd.s")) {
3989 Rep = Builder.CreateIntrinsic(Intrinsic::fma,
Ops[0]->
getType(),
Ops);
3993 }
else if (Name.starts_with(
"avx512.mask.vfmadd.s") ||
3994 Name.starts_with(
"avx512.maskz.vfmadd.s") ||
3995 Name.starts_with(
"avx512.mask3.vfmadd.s") ||
3996 Name.starts_with(
"avx512.mask3.vfmsub.s") ||
3997 Name.starts_with(
"avx512.mask3.vfnmsub.s")) {
3998 bool IsMask3 = Name[11] ==
'3';
3999 bool IsMaskZ = Name[11] ==
'z';
4001 Name = Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
4002 bool NegMul = Name[2] ==
'n';
4003 bool NegAcc = NegMul ? Name[4] ==
's' : Name[3] ==
's';
4009 if (NegMul && (IsMask3 || IsMaskZ))
4010 A = Builder.CreateFNeg(
A);
4011 if (NegMul && !(IsMask3 || IsMaskZ))
4012 B = Builder.CreateFNeg(
B);
4014 C = Builder.CreateFNeg(
C);
4016 A = Builder.CreateExtractElement(
A, (
uint64_t)0);
4017 B = Builder.CreateExtractElement(
B, (
uint64_t)0);
4018 C = Builder.CreateExtractElement(
C, (
uint64_t)0);
4025 if (Name.back() ==
'd')
4026 IID = Intrinsic::x86_avx512_vfmadd_f64;
4028 IID = Intrinsic::x86_avx512_vfmadd_f32;
4029 Rep = Builder.CreateIntrinsic(IID,
Ops);
4031 Rep = Builder.CreateFMA(
A,
B,
C);
4040 if (NegAcc && IsMask3)
4045 Rep = Builder.CreateInsertElement(CI->
getArgOperand(IsMask3 ? 2 : 0), Rep,
4047 }
else if (Name.starts_with(
"avx512.mask.vfmadd.p") ||
4048 Name.starts_with(
"avx512.mask.vfnmadd.p") ||
4049 Name.starts_with(
"avx512.mask.vfnmsub.p") ||
4050 Name.starts_with(
"avx512.mask3.vfmadd.p") ||
4051 Name.starts_with(
"avx512.mask3.vfmsub.p") ||
4052 Name.starts_with(
"avx512.mask3.vfnmsub.p") ||
4053 Name.starts_with(
"avx512.maskz.vfmadd.p")) {
4054 bool IsMask3 = Name[11] ==
'3';
4055 bool IsMaskZ = Name[11] ==
'z';
4057 Name = Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
4058 bool NegMul = Name[2] ==
'n';
4059 bool NegAcc = NegMul ? Name[4] ==
's' : Name[3] ==
's';
4065 if (NegMul && (IsMask3 || IsMaskZ))
4066 A = Builder.CreateFNeg(
A);
4067 if (NegMul && !(IsMask3 || IsMaskZ))
4068 B = Builder.CreateFNeg(
B);
4070 C = Builder.CreateFNeg(
C);
4077 if (Name[Name.size() - 5] ==
's')
4078 IID = Intrinsic::x86_avx512_vfmadd_ps_512;
4080 IID = Intrinsic::x86_avx512_vfmadd_pd_512;
4084 Rep = Builder.CreateFMA(
A,
B,
C);
4092 }
else if (Name.starts_with(
"fma.vfmsubadd.p")) {
4096 if (VecWidth == 128 && EltWidth == 32)
4097 IID = Intrinsic::x86_fma_vfmaddsub_ps;
4098 else if (VecWidth == 256 && EltWidth == 32)
4099 IID = Intrinsic::x86_fma_vfmaddsub_ps_256;
4100 else if (VecWidth == 128 && EltWidth == 64)
4101 IID = Intrinsic::x86_fma_vfmaddsub_pd;
4102 else if (VecWidth == 256 && EltWidth == 64)
4103 IID = Intrinsic::x86_fma_vfmaddsub_pd_256;
4109 Ops[2] = Builder.CreateFNeg(
Ops[2]);
4110 Rep = Builder.CreateIntrinsic(IID,
Ops);
4111 }
else if (Name.starts_with(
"avx512.mask.vfmaddsub.p") ||
4112 Name.starts_with(
"avx512.mask3.vfmaddsub.p") ||
4113 Name.starts_with(
"avx512.maskz.vfmaddsub.p") ||
4114 Name.starts_with(
"avx512.mask3.vfmsubadd.p")) {
4115 bool IsMask3 = Name[11] ==
'3';
4116 bool IsMaskZ = Name[11] ==
'z';
4118 Name = Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
4119 bool IsSubAdd = Name[3] ==
's';
4123 if (Name[Name.size() - 5] ==
's')
4124 IID = Intrinsic::x86_avx512_vfmaddsub_ps_512;
4126 IID = Intrinsic::x86_avx512_vfmaddsub_pd_512;
4131 Ops[2] = Builder.CreateFNeg(
Ops[2]);
4133 Rep = Builder.CreateIntrinsic(IID,
Ops);
4142 Value *Odd = Builder.CreateCall(FMA,
Ops);
4143 Ops[2] = Builder.CreateFNeg(
Ops[2]);
4144 Value *Even = Builder.CreateCall(FMA,
Ops);
4150 for (
int i = 0; i != NumElts; ++i)
4151 Idxs[i] = i + (i % 2) * NumElts;
4153 Rep = Builder.CreateShuffleVector(Even, Odd, Idxs);
4161 }
else if (Name.starts_with(
"avx512.mask.pternlog.") ||
4162 Name.starts_with(
"avx512.maskz.pternlog.")) {
4163 bool ZeroMask = Name[11] ==
'z';
4167 if (VecWidth == 128 && EltWidth == 32)
4168 IID = Intrinsic::x86_avx512_pternlog_d_128;
4169 else if (VecWidth == 256 && EltWidth == 32)
4170 IID = Intrinsic::x86_avx512_pternlog_d_256;
4171 else if (VecWidth == 512 && EltWidth == 32)
4172 IID = Intrinsic::x86_avx512_pternlog_d_512;
4173 else if (VecWidth == 128 && EltWidth == 64)
4174 IID = Intrinsic::x86_avx512_pternlog_q_128;
4175 else if (VecWidth == 256 && EltWidth == 64)
4176 IID = Intrinsic::x86_avx512_pternlog_q_256;
4177 else if (VecWidth == 512 && EltWidth == 64)
4178 IID = Intrinsic::x86_avx512_pternlog_q_512;
4184 Rep = Builder.CreateIntrinsic(IID, Args);
4188 }
else if (Name.starts_with(
"avx512.mask.vpmadd52") ||
4189 Name.starts_with(
"avx512.maskz.vpmadd52")) {
4190 bool ZeroMask = Name[11] ==
'z';
4191 bool High = Name[20] ==
'h' || Name[21] ==
'h';
4194 if (VecWidth == 128 && !
High)
4195 IID = Intrinsic::x86_avx512_vpmadd52l_uq_128;
4196 else if (VecWidth == 256 && !
High)
4197 IID = Intrinsic::x86_avx512_vpmadd52l_uq_256;
4198 else if (VecWidth == 512 && !
High)
4199 IID = Intrinsic::x86_avx512_vpmadd52l_uq_512;
4200 else if (VecWidth == 128 &&
High)
4201 IID = Intrinsic::x86_avx512_vpmadd52h_uq_128;
4202 else if (VecWidth == 256 &&
High)
4203 IID = Intrinsic::x86_avx512_vpmadd52h_uq_256;
4204 else if (VecWidth == 512 &&
High)
4205 IID = Intrinsic::x86_avx512_vpmadd52h_uq_512;
4211 Rep = Builder.CreateIntrinsic(IID, Args);
4215 }
else if (Name.starts_with(
"avx512.mask.vpermi2var.") ||
4216 Name.starts_with(
"avx512.mask.vpermt2var.") ||
4217 Name.starts_with(
"avx512.maskz.vpermt2var.")) {
4218 bool ZeroMask = Name[11] ==
'z';
4219 bool IndexForm = Name[17] ==
'i';
4221 }
else if (Name.starts_with(
"avx512.mask.vpdpbusd.") ||
4222 Name.starts_with(
"avx512.maskz.vpdpbusd.") ||
4223 Name.starts_with(
"avx512.mask.vpdpbusds.") ||
4224 Name.starts_with(
"avx512.maskz.vpdpbusds.")) {
4225 bool ZeroMask = Name[11] ==
'z';
4226 bool IsSaturating = Name[ZeroMask ? 21 : 20] ==
's';
4229 if (VecWidth == 128 && !IsSaturating)
4230 IID = Intrinsic::x86_avx512_vpdpbusd_128;
4231 else if (VecWidth == 256 && !IsSaturating)
4232 IID = Intrinsic::x86_avx512_vpdpbusd_256;
4233 else if (VecWidth == 512 && !IsSaturating)
4234 IID = Intrinsic::x86_avx512_vpdpbusd_512;
4235 else if (VecWidth == 128 && IsSaturating)
4236 IID = Intrinsic::x86_avx512_vpdpbusds_128;
4237 else if (VecWidth == 256 && IsSaturating)
4238 IID = Intrinsic::x86_avx512_vpdpbusds_256;
4239 else if (VecWidth == 512 && IsSaturating)
4240 IID = Intrinsic::x86_avx512_vpdpbusds_512;
4250 if (Args[1]->
getType()->isVectorTy() &&
4253 ->isIntegerTy(32) &&
4254 Args[2]->
getType()->isVectorTy() &&
4257 ->isIntegerTy(32)) {
4258 Type *NewArgType =
nullptr;
4259 if (VecWidth == 128)
4261 else if (VecWidth == 256)
4263 else if (VecWidth == 512)
4268 Args[1] = Builder.CreateBitCast(Args[1], NewArgType);
4269 Args[2] = Builder.CreateBitCast(Args[2], NewArgType);
4272 Rep = Builder.CreateIntrinsic(IID, Args);
4276 }
else if (Name.starts_with(
"avx512.mask.vpdpwssd.") ||
4277 Name.starts_with(
"avx512.maskz.vpdpwssd.") ||
4278 Name.starts_with(
"avx512.mask.vpdpwssds.") ||
4279 Name.starts_with(
"avx512.maskz.vpdpwssds.")) {
4280 bool ZeroMask = Name[11] ==
'z';
4281 bool IsSaturating = Name[ZeroMask ? 21 : 20] ==
's';
4284 if (VecWidth == 128 && !IsSaturating)
4285 IID = Intrinsic::x86_avx512_vpdpwssd_128;
4286 else if (VecWidth == 256 && !IsSaturating)
4287 IID = Intrinsic::x86_avx512_vpdpwssd_256;
4288 else if (VecWidth == 512 && !IsSaturating)
4289 IID = Intrinsic::x86_avx512_vpdpwssd_512;
4290 else if (VecWidth == 128 && IsSaturating)
4291 IID = Intrinsic::x86_avx512_vpdpwssds_128;
4292 else if (VecWidth == 256 && IsSaturating)
4293 IID = Intrinsic::x86_avx512_vpdpwssds_256;
4294 else if (VecWidth == 512 && IsSaturating)
4295 IID = Intrinsic::x86_avx512_vpdpwssds_512;
4301 Rep = Builder.CreateIntrinsic(IID, Args);
4305 }
else if (Name ==
"addcarryx.u32" || Name ==
"addcarryx.u64" ||
4306 Name ==
"addcarry.u32" || Name ==
"addcarry.u64" ||
4307 Name ==
"subborrow.u32" || Name ==
"subborrow.u64") {
4309 if (Name[0] ==
'a' && Name.back() ==
'2')
4310 IID = Intrinsic::x86_addcarry_32;
4311 else if (Name[0] ==
'a' && Name.back() ==
'4')
4312 IID = Intrinsic::x86_addcarry_64;
4313 else if (Name[0] ==
's' && Name.back() ==
'2')
4314 IID = Intrinsic::x86_subborrow_32;
4315 else if (Name[0] ==
's' && Name.back() ==
'4')
4316 IID = Intrinsic::x86_subborrow_64;
4323 Value *NewCall = Builder.CreateIntrinsic(IID, Args);
4326 Value *
Data = Builder.CreateExtractValue(NewCall, 1);
4329 Value *CF = Builder.CreateExtractValue(NewCall, 0);
4333 }
else if (Name.starts_with(
"avx512.mask.") &&
4343 if (Name.starts_with(
"neon.bfcvt")) {
4344 if (Name.starts_with(
"neon.bfcvtn2")) {
4346 std::iota(LoMask.
begin(), LoMask.
end(), 0);
4348 std::iota(ConcatMask.
begin(), ConcatMask.
end(), 0);
4349 Value *Inactive = Builder.CreateShuffleVector(CI->
getOperand(0), LoMask);
4352 return Builder.CreateShuffleVector(Inactive, Trunc, ConcatMask);
4353 }
else if (Name.starts_with(
"neon.bfcvtn")) {
4355 std::iota(ConcatMask.
begin(), ConcatMask.
end(), 0);
4359 dbgs() <<
"Trunc: " << *Trunc <<
"\n";
4360 return Builder.CreateShuffleVector(
4363 return Builder.CreateFPTrunc(CI->
getOperand(0),
4366 }
else if (Name.starts_with(
"sve.fcvt")) {
4369 .
Case(
"sve.fcvt.bf16f32", Intrinsic::aarch64_sve_fcvt_bf16f32_v2)
4370 .
Case(
"sve.fcvtnt.bf16f32",
4371 Intrinsic::aarch64_sve_fcvtnt_bf16f32_v2)
4383 if (Args[1]->
getType() != BadPredTy)
4386 Args[1] = Builder.CreateIntrinsic(Intrinsic::aarch64_sve_convert_to_svbool,
4387 BadPredTy, Args[1]);
4388 Args[1] = Builder.CreateIntrinsic(
4389 Intrinsic::aarch64_sve_convert_from_svbool, GoodPredTy, Args[1]);
4391 return Builder.CreateIntrinsic(NewID, Args,
nullptr,
4400 if (Name ==
"mve.vctp64.old") {
4403 Value *VCTP = Builder.CreateIntrinsic(Intrinsic::arm_mve_vctp64, {},
4406 Value *C1 = Builder.CreateIntrinsic(
4407 Intrinsic::arm_mve_pred_v2i,
4409 return Builder.CreateIntrinsic(
4410 Intrinsic::arm_mve_pred_i2v,
4412 }
else if (Name ==
"mve.mull.int.predicated.v2i64.v4i32.v4i1" ||
4413 Name ==
"mve.vqdmull.predicated.v2i64.v4i32.v4i1" ||
4414 Name ==
"mve.vldr.gather.base.predicated.v2i64.v2i64.v4i1" ||
4415 Name ==
"mve.vldr.gather.base.wb.predicated.v2i64.v2i64.v4i1" ||
4417 "mve.vldr.gather.offset.predicated.v2i64.p0i64.v2i64.v4i1" ||
4418 Name ==
"mve.vldr.gather.offset.predicated.v2i64.p0.v2i64.v4i1" ||
4419 Name ==
"mve.vstr.scatter.base.predicated.v2i64.v2i64.v4i1" ||
4420 Name ==
"mve.vstr.scatter.base.wb.predicated.v2i64.v2i64.v4i1" ||
4422 "mve.vstr.scatter.offset.predicated.p0i64.v2i64.v2i64.v4i1" ||
4423 Name ==
"mve.vstr.scatter.offset.predicated.p0.v2i64.v2i64.v4i1" ||
4424 Name ==
"cde.vcx1q.predicated.v2i64.v4i1" ||
4425 Name ==
"cde.vcx1qa.predicated.v2i64.v4i1" ||
4426 Name ==
"cde.vcx2q.predicated.v2i64.v4i1" ||
4427 Name ==
"cde.vcx2qa.predicated.v2i64.v4i1" ||
4428 Name ==
"cde.vcx3q.predicated.v2i64.v4i1" ||
4429 Name ==
"cde.vcx3qa.predicated.v2i64.v4i1") {
4430 std::vector<Type *> Tys;
4434 case Intrinsic::arm_mve_mull_int_predicated:
4435 case Intrinsic::arm_mve_vqdmull_predicated:
4436 case Intrinsic::arm_mve_vldr_gather_base_predicated:
4439 case Intrinsic::arm_mve_vldr_gather_base_wb_predicated:
4440 case Intrinsic::arm_mve_vstr_scatter_base_predicated:
4441 case Intrinsic::arm_mve_vstr_scatter_base_wb_predicated:
4445 case Intrinsic::arm_mve_vldr_gather_offset_predicated:
4449 case Intrinsic::arm_mve_vstr_scatter_offset_predicated:
4453 case Intrinsic::arm_cde_vcx1q_predicated:
4454 case Intrinsic::arm_cde_vcx1qa_predicated:
4455 case Intrinsic::arm_cde_vcx2q_predicated:
4456 case Intrinsic::arm_cde_vcx2qa_predicated:
4457 case Intrinsic::arm_cde_vcx3q_predicated:
4458 case Intrinsic::arm_cde_vcx3qa_predicated:
4465 std::vector<Value *>
Ops;
4467 Type *Ty =
Op->getType();
4468 if (Ty->getScalarSizeInBits() == 1) {
4469 Value *C1 = Builder.CreateIntrinsic(
4470 Intrinsic::arm_mve_pred_v2i,
4472 Op = Builder.CreateIntrinsic(Intrinsic::arm_mve_pred_i2v, {V2I1Ty}, C1);
4477 return Builder.CreateIntrinsic(
ID, Tys,
Ops,
nullptr,
4505 if (NumOperands < 3)
4518 bool IsVolatile =
false;
4522 if (NumOperands > 3)
4527 if (NumOperands > 5) {
4529 IsVolatile = !VolatileArg || !VolatileArg->
isZero();
4543 if (VT->getElementType()->isIntegerTy(16)) {
4546 Val = Builder.CreateBitCast(Val, AsBF16);
4554 Builder.CreateAtomicRMW(RMWOp,
Ptr, Val, std::nullopt, Order, SSID);
4556 unsigned AddrSpace = PtrTy->getAddressSpace();
4559 RMW->
setMetadata(
"amdgpu.no.fine.grained.memory", EmptyMD);
4561 RMW->
setMetadata(
"amdgpu.ignore.denormal.mode", EmptyMD);
4566 MDNode *RangeNotPrivate =
4569 RMW->
setMetadata(LLVMContext::MD_noalias_addrspace, RangeNotPrivate);
4575 return Builder.CreateBitCast(RMW, RetTy);
4596 return MAV->getMetadata();
4603 return I->getDebugLoc().getAsMDNode();
4611 if (Name ==
"label") {
4614 }
else if (Name ==
"assign") {
4621 }
else if (Name ==
"declare") {
4626 }
else if (Name ==
"addr") {
4636 unwrapMAVOp(CI, 1), ExprNode,
nullptr,
nullptr,
nullptr,
4638 }
else if (Name ==
"value") {
4641 unsigned ExprOp = 2;
4655 assert(DR &&
"Unhandled intrinsic kind in upgrade to DbgRecord");
4677 assert(Name.starts_with(
"llvm.") &&
"Intrinsic doesn't start with 'llvm.'");
4678 Name = Name.substr(5);
4680 bool IsX86 = Name.consume_front(
"x86.");
4681 bool IsNVVM = Name.consume_front(
"nvvm.");
4682 bool IsAArch64 = Name.consume_front(
"aarch64.");
4683 bool IsARM = Name.consume_front(
"arm.");
4684 bool IsAMDGCN = Name.consume_front(
"amdgcn.");
4685 bool IsDbg = Name.consume_front(
"dbg.");
4686 Value *Rep =
nullptr;
4688 if (!IsX86 && Name ==
"stackprotectorcheck") {
4690 }
else if (IsNVVM) {
4694 }
else if (IsAArch64) {
4698 }
else if (IsAMDGCN) {
4712 const auto &DefaultCase = [&]() ->
void {
4720 "Unknown function for CallBase upgrade and isn't just a name change");
4728 "Return type must have changed");
4729 assert(OldST->getNumElements() ==
4731 "Must have same number of elements");
4734 CallInst *NewCI = Builder.CreateCall(NewFn, Args);
4737 for (
unsigned Idx = 0; Idx < OldST->getNumElements(); ++Idx) {
4738 Value *Elem = Builder.CreateExtractValue(NewCI, Idx);
4739 Res = Builder.CreateInsertValue(Res, Elem, Idx);
4758 case Intrinsic::arm_neon_vst1:
4759 case Intrinsic::arm_neon_vst2:
4760 case Intrinsic::arm_neon_vst3:
4761 case Intrinsic::arm_neon_vst4:
4762 case Intrinsic::arm_neon_vst2lane:
4763 case Intrinsic::arm_neon_vst3lane:
4764 case Intrinsic::arm_neon_vst4lane: {
4766 NewCall = Builder.CreateCall(NewFn, Args);
4769 case Intrinsic::aarch64_sve_bfmlalb_lane_v2:
4770 case Intrinsic::aarch64_sve_bfmlalt_lane_v2:
4771 case Intrinsic::aarch64_sve_bfdot_lane_v2: {
4776 NewCall = Builder.CreateCall(NewFn, Args);
4779 case Intrinsic::aarch64_sve_ld3_sret:
4780 case Intrinsic::aarch64_sve_ld4_sret:
4781 case Intrinsic::aarch64_sve_ld2_sret: {
4783 Name = Name.substr(5);
4790 unsigned MinElts = RetTy->getMinNumElements() /
N;
4792 Value *NewLdCall = Builder.CreateCall(NewFn, Args);
4794 for (
unsigned I = 0;
I <
N;
I++) {
4795 Value *SRet = Builder.CreateExtractValue(NewLdCall,
I);
4796 Ret = Builder.CreateInsertVector(RetTy, Ret, SRet,
I * MinElts);
4802 case Intrinsic::coro_end: {
4805 NewCall = Builder.CreateCall(NewFn, Args);
4809 case Intrinsic::vector_extract: {
4811 Name = Name.substr(5);
4812 if (!Name.starts_with(
"aarch64.sve.tuple.get")) {
4817 unsigned MinElts = RetTy->getMinNumElements();
4820 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(0), NewIdx});
4824 case Intrinsic::vector_insert: {
4826 Name = Name.substr(5);
4827 if (!Name.starts_with(
"aarch64.sve.tuple")) {
4831 if (Name.starts_with(
"aarch64.sve.tuple.set")) {
4836 NewCall = Builder.CreateCall(
4840 if (Name.starts_with(
"aarch64.sve.tuple.create")) {
4846 assert(
N > 1 &&
"Create is expected to be between 2-4");
4849 unsigned MinElts = RetTy->getMinNumElements() /
N;
4850 for (
unsigned I = 0;
I <
N;
I++) {
4852 Ret = Builder.CreateInsertVector(RetTy, Ret, V,
I * MinElts);
4859 case Intrinsic::arm_neon_bfdot:
4860 case Intrinsic::arm_neon_bfmmla:
4861 case Intrinsic::arm_neon_bfmlalb:
4862 case Intrinsic::arm_neon_bfmlalt:
4863 case Intrinsic::aarch64_neon_bfdot:
4864 case Intrinsic::aarch64_neon_bfmmla:
4865 case Intrinsic::aarch64_neon_bfmlalb:
4866 case Intrinsic::aarch64_neon_bfmlalt: {
4869 "Mismatch between function args and call args");
4870 size_t OperandWidth =
4872 assert((OperandWidth == 64 || OperandWidth == 128) &&
4873 "Unexpected operand width");
4875 auto Iter = CI->
args().begin();
4876 Args.push_back(*Iter++);
4877 Args.push_back(Builder.CreateBitCast(*Iter++, NewTy));
4878 Args.push_back(Builder.CreateBitCast(*Iter++, NewTy));
4879 NewCall = Builder.CreateCall(NewFn, Args);
4883 case Intrinsic::bitreverse:
4884 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(0)});
4887 case Intrinsic::ctlz:
4888 case Intrinsic::cttz:
4890 "Mismatch between function args and call args");
4892 Builder.CreateCall(NewFn, {CI->
getArgOperand(0), Builder.getFalse()});
4895 case Intrinsic::objectsize: {
4896 Value *NullIsUnknownSize =
4900 NewCall = Builder.CreateCall(
4905 case Intrinsic::ctpop:
4906 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(0)});
4909 case Intrinsic::convert_from_fp16:
4910 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(0)});
4913 case Intrinsic::dbg_value: {
4915 Name = Name.substr(5);
4917 if (Name.starts_with(
"dbg.addr")) {
4931 if (
Offset->isZeroValue()) {
4932 NewCall = Builder.CreateCall(
4941 case Intrinsic::ptr_annotation:
4949 NewCall = Builder.CreateCall(
4958 case Intrinsic::var_annotation:
4965 NewCall = Builder.CreateCall(
4974 case Intrinsic::riscv_aes32dsi:
4975 case Intrinsic::riscv_aes32dsmi:
4976 case Intrinsic::riscv_aes32esi:
4977 case Intrinsic::riscv_aes32esmi:
4978 case Intrinsic::riscv_sm4ks:
4979 case Intrinsic::riscv_sm4ed: {
4989 Arg0 = Builder.CreateTrunc(Arg0, Builder.getInt32Ty());
4990 Arg1 = Builder.CreateTrunc(Arg1, Builder.getInt32Ty());
4996 NewCall = Builder.CreateCall(NewFn, {Arg0, Arg1, Arg2});
4997 Value *Res = NewCall;
4999 Res = Builder.CreateIntCast(NewCall, CI->
getType(),
true);
5005 case Intrinsic::nvvm_mapa_shared_cluster: {
5009 Value *Res = NewCall;
5010 Res = Builder.CreateAddrSpaceCast(
5017 case Intrinsic::nvvm_cp_async_bulk_global_to_shared_cluster:
5018 case Intrinsic::nvvm_cp_async_bulk_shared_cta_to_cluster: {
5021 Args[0] = Builder.CreateAddrSpaceCast(
5024 NewCall = Builder.CreateCall(NewFn, Args);
5030 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_3d:
5031 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_4d:
5032 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_im2col_5d:
5033 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_1d:
5034 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_2d:
5035 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_3d:
5036 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_4d:
5037 case Intrinsic::nvvm_cp_async_bulk_tensor_g2s_tile_5d: {
5044 Args[0] = Builder.CreateAddrSpaceCast(
5053 Args.push_back(ConstantInt::get(Builder.getInt32Ty(), 0));
5055 NewCall = Builder.CreateCall(NewFn, Args);
5061 case Intrinsic::riscv_sha256sig0:
5062 case Intrinsic::riscv_sha256sig1:
5063 case Intrinsic::riscv_sha256sum0:
5064 case Intrinsic::riscv_sha256sum1:
5065 case Intrinsic::riscv_sm3p0:
5066 case Intrinsic::riscv_sm3p1: {
5073 Builder.CreateTrunc(CI->
getArgOperand(0), Builder.getInt32Ty());
5075 NewCall = Builder.CreateCall(NewFn, Arg);
5077 Builder.CreateIntCast(NewCall, CI->
getType(),
true);
5084 case Intrinsic::x86_xop_vfrcz_ss:
5085 case Intrinsic::x86_xop_vfrcz_sd:
5086 NewCall = Builder.CreateCall(NewFn, {CI->
getArgOperand(1)});
5089 case Intrinsic::x86_xop_vpermil2pd:
5090 case Intrinsic::x86_xop_vpermil2ps:
5091 case Intrinsic::x86_xop_vpermil2pd_256:
5092 case Intrinsic::x86_xop_vpermil2ps_256: {
5096 Args[2] = Builder.CreateBitCast(Args[2], IntIdxTy);
5097 NewCall = Builder.CreateCall(NewFn, Args);
5101 case Intrinsic::x86_sse41_ptestc:
5102 case Intrinsic::x86_sse41_ptestz:
5103 case Intrinsic::x86_sse41_ptestnzc: {
5117 Value *BC0 = Builder.CreateBitCast(Arg0, NewVecTy,
"cast");
5118 Value *BC1 = Builder.CreateBitCast(Arg1, NewVecTy,
"cast");
5120 NewCall = Builder.CreateCall(NewFn, {BC0, BC1});
5124 case Intrinsic::x86_rdtscp: {
5130 NewCall = Builder.CreateCall(NewFn);
5132 Value *
Data = Builder.CreateExtractValue(NewCall, 1);
5135 Value *TSC = Builder.CreateExtractValue(NewCall, 0);
5143 case Intrinsic::x86_sse41_insertps:
5144 case Intrinsic::x86_sse41_dppd:
5145 case Intrinsic::x86_sse41_dpps:
5146 case Intrinsic::x86_sse41_mpsadbw:
5147 case Intrinsic::x86_avx_dp_ps_256:
5148 case Intrinsic::x86_avx2_mpsadbw: {
5154 Args.back() = Builder.CreateTrunc(Args.back(),
Type::getInt8Ty(
C),
"trunc");
5155 NewCall = Builder.CreateCall(NewFn, Args);
5159 case Intrinsic::x86_avx512_mask_cmp_pd_128:
5160 case Intrinsic::x86_avx512_mask_cmp_pd_256:
5161 case Intrinsic::x86_avx512_mask_cmp_pd_512:
5162 case Intrinsic::x86_avx512_mask_cmp_ps_128:
5163 case Intrinsic::x86_avx512_mask_cmp_ps_256:
5164 case Intrinsic::x86_avx512_mask_cmp_ps_512: {
5170 NewCall = Builder.CreateCall(NewFn, Args);
5179 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_128:
5180 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_256:
5181 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_512:
5182 case Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128:
5183 case Intrinsic::x86_avx512bf16_cvtneps2bf16_256:
5184 case Intrinsic::x86_avx512bf16_cvtneps2bf16_512: {
5188 Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128)
5189 Args[1] = Builder.CreateBitCast(
5192 NewCall = Builder.CreateCall(NewFn, Args);
5193 Value *Res = Builder.CreateBitCast(
5201 case Intrinsic::x86_avx512bf16_dpbf16ps_128:
5202 case Intrinsic::x86_avx512bf16_dpbf16ps_256:
5203 case Intrinsic::x86_avx512bf16_dpbf16ps_512:{
5207 Args[1] = Builder.CreateBitCast(
5209 Args[2] = Builder.CreateBitCast(
5212 NewCall = Builder.CreateCall(NewFn, Args);
5216 case Intrinsic::thread_pointer: {
5217 NewCall = Builder.CreateCall(NewFn, {});
5221 case Intrinsic::memcpy:
5222 case Intrinsic::memmove:
5223 case Intrinsic::memset: {
5239 NewCall = Builder.CreateCall(NewFn, Args);
5241 AttributeList NewAttrs = AttributeList::get(
5242 C, OldAttrs.getFnAttrs(), OldAttrs.getRetAttrs(),
5243 {OldAttrs.getParamAttrs(0), OldAttrs.getParamAttrs(1),
5244 OldAttrs.getParamAttrs(2), OldAttrs.getParamAttrs(4)});
5249 MemCI->setDestAlignment(
Align->getMaybeAlignValue());
5252 MTI->setSourceAlignment(
Align->getMaybeAlignValue());
5256 case Intrinsic::masked_load:
5257 case Intrinsic::masked_gather:
5258 case Intrinsic::masked_store:
5259 case Intrinsic::masked_scatter: {
5265 auto GetMaybeAlign = [](
Value *
Op) {
5275 auto GetAlign = [&](
Value *
Op) {
5284 case Intrinsic::masked_load:
5285 NewCall = Builder.CreateMaskedLoad(
5289 case Intrinsic::masked_gather:
5290 NewCall = Builder.CreateMaskedGather(
5296 case Intrinsic::masked_store:
5297 NewCall = Builder.CreateMaskedStore(
5301 case Intrinsic::masked_scatter:
5302 NewCall = Builder.CreateMaskedScatter(
5304 DL.getValueOrABITypeAlignment(
5318 case Intrinsic::lifetime_start:
5319 case Intrinsic::lifetime_end: {
5327 Ptr =
Ptr->stripPointerCasts();
5331 NewCall = Builder.CreateLifetimeStart(
Ptr);
5333 NewCall = Builder.CreateLifetimeEnd(
Ptr);
5342 case Intrinsic::x86_avx512_vpdpbusd_128:
5343 case Intrinsic::x86_avx512_vpdpbusd_256:
5344 case Intrinsic::x86_avx512_vpdpbusd_512:
5345 case Intrinsic::x86_avx512_vpdpbusds_128:
5346 case Intrinsic::x86_avx512_vpdpbusds_256:
5347 case Intrinsic::x86_avx512_vpdpbusds_512:
5348 case Intrinsic::x86_avx2_vpdpbssd_128:
5349 case Intrinsic::x86_avx2_vpdpbssd_256:
5350 case Intrinsic::x86_avx10_vpdpbssd_512:
5351 case Intrinsic::x86_avx2_vpdpbssds_128:
5352 case Intrinsic::x86_avx2_vpdpbssds_256:
5353 case Intrinsic::x86_avx10_vpdpbssds_512:
5354 case Intrinsic::x86_avx2_vpdpbsud_128:
5355 case Intrinsic::x86_avx2_vpdpbsud_256:
5356 case Intrinsic::x86_avx10_vpdpbsud_512:
5357 case Intrinsic::x86_avx2_vpdpbsuds_128:
5358 case Intrinsic::x86_avx2_vpdpbsuds_256:
5359 case Intrinsic::x86_avx10_vpdpbsuds_512:
5360 case Intrinsic::x86_avx2_vpdpbuud_128:
5361 case Intrinsic::x86_avx2_vpdpbuud_256:
5362 case Intrinsic::x86_avx10_vpdpbuud_512:
5363 case Intrinsic::x86_avx2_vpdpbuuds_128:
5364 case Intrinsic::x86_avx2_vpdpbuuds_256:
5365 case Intrinsic::x86_avx10_vpdpbuuds_512: {
5370 Args[1] = Builder.CreateBitCast(Args[1], NewArgType);
5371 Args[2] = Builder.CreateBitCast(Args[2], NewArgType);
5373 NewCall = Builder.CreateCall(NewFn, Args);
5377 assert(NewCall &&
"Should have either set this variable or returned through "
5378 "the default case");
5385 assert(
F &&
"Illegal attempt to upgrade a non-existent intrinsic.");
5399 F->eraseFromParent();
5405 if (NumOperands == 0)
5413 if (NumOperands == 3) {
5417 Metadata *Elts2[] = {ScalarType, ScalarType,
5431 if (
Opc != Instruction::BitCast)
5435 Type *SrcTy = V->getType();
5452 if (
Opc != Instruction::BitCast)
5455 Type *SrcTy =
C->getType();
5482 if (
NamedMDNode *ModFlags = M.getModuleFlagsMetadata()) {
5483 auto OpIt =
find_if(ModFlags->operands(), [](
const MDNode *Flag) {
5484 if (Flag->getNumOperands() < 3)
5486 if (MDString *K = dyn_cast_or_null<MDString>(Flag->getOperand(1)))
5487 return K->getString() ==
"Debug Info Version";
5490 if (OpIt != ModFlags->op_end()) {
5491 const MDOperand &ValOp = (*OpIt)->getOperand(2);
5498 bool BrokenDebugInfo =
false;
5501 if (!BrokenDebugInfo)
5507 M.getContext().diagnose(Diag);
5514 M.getContext().diagnose(DiagVersion);
5524 StringRef Vect3[3] = {DefaultValue, DefaultValue, DefaultValue};
5527 if (
F->hasFnAttribute(Attr)) {
5530 StringRef S =
F->getFnAttribute(Attr).getValueAsString();
5532 auto [Part, Rest] = S.
split(
',');
5538 const unsigned Dim = DimC -
'x';
5539 assert(Dim < 3 &&
"Unexpected dim char");
5549 F->addFnAttr(Attr, NewAttr);
5553 return S ==
"x" || S ==
"y" || S ==
"z";
5558 if (K ==
"kernel") {
5570 const unsigned Idx = (AlignIdxValuePair >> 16);
5571 const Align StackAlign =
Align(AlignIdxValuePair & 0xFFFF);
5576 if (K ==
"maxclusterrank" || K ==
"cluster_max_blocks") {
5581 if (K ==
"minctasm") {
5586 if (K ==
"maxnreg") {
5591 if (K.consume_front(
"maxntid") &&
isXYZ(K)) {
5595 if (K.consume_front(
"reqntid") &&
isXYZ(K)) {
5599 if (K.consume_front(
"cluster_dim_") &&
isXYZ(K)) {
5603 if (K ==
"grid_constant") {
5618 NamedMDNode *NamedMD = M.getNamedMetadata(
"nvvm.annotations");
5625 if (!SeenNodes.
insert(MD).second)
5632 assert((MD->getNumOperands() % 2) == 1 &&
"Invalid number of operands");
5639 for (
unsigned j = 1, je = MD->getNumOperands(); j < je; j += 2) {
5641 const MDOperand &V = MD->getOperand(j + 1);
5644 NewOperands.
append({K, V});
5647 if (NewOperands.
size() > 1)
5660 const char *MarkerKey =
"clang.arc.retainAutoreleasedReturnValueMarker";
5661 NamedMDNode *ModRetainReleaseMarker = M.getNamedMetadata(MarkerKey);
5662 if (ModRetainReleaseMarker) {
5668 ID->getString().split(ValueComp,
"#");
5669 if (ValueComp.
size() == 2) {
5670 std::string NewValue = ValueComp[0].str() +
";" + ValueComp[1].str();
5674 M.eraseNamedMetadata(ModRetainReleaseMarker);
5685 auto UpgradeToIntrinsic = [&](
const char *OldFunc,
5711 bool InvalidCast =
false;
5713 for (
unsigned I = 0, E = CI->
arg_size();
I != E; ++
I) {
5726 Arg = Builder.CreateBitCast(Arg, NewFuncTy->
getParamType(
I));
5728 Args.push_back(Arg);
5735 CallInst *NewCall = Builder.CreateCall(NewFuncTy, NewFn, Args);
5740 Value *NewRetVal = Builder.CreateBitCast(NewCall, CI->
getType());
5753 UpgradeToIntrinsic(
"clang.arc.use", llvm::Intrinsic::objc_clang_arc_use);
5761 std::pair<const char *, llvm::Intrinsic::ID> RuntimeFuncs[] = {
5762 {
"objc_autorelease", llvm::Intrinsic::objc_autorelease},
5763 {
"objc_autoreleasePoolPop", llvm::Intrinsic::objc_autoreleasePoolPop},
5764 {
"objc_autoreleasePoolPush", llvm::Intrinsic::objc_autoreleasePoolPush},
5765 {
"objc_autoreleaseReturnValue",
5766 llvm::Intrinsic::objc_autoreleaseReturnValue},
5767 {
"objc_copyWeak", llvm::Intrinsic::objc_copyWeak},
5768 {
"objc_destroyWeak", llvm::Intrinsic::objc_destroyWeak},
5769 {
"objc_initWeak", llvm::Intrinsic::objc_initWeak},
5770 {
"objc_loadWeak", llvm::Intrinsic::objc_loadWeak},
5771 {
"objc_loadWeakRetained", llvm::Intrinsic::objc_loadWeakRetained},
5772 {
"objc_moveWeak", llvm::Intrinsic::objc_moveWeak},
5773 {
"objc_release", llvm::Intrinsic::objc_release},
5774 {
"objc_retain", llvm::Intrinsic::objc_retain},
5775 {
"objc_retainAutorelease", llvm::Intrinsic::objc_retainAutorelease},
5776 {
"objc_retainAutoreleaseReturnValue",
5777 llvm::Intrinsic::objc_retainAutoreleaseReturnValue},
5778 {
"objc_retainAutoreleasedReturnValue",
5779 llvm::Intrinsic::objc_retainAutoreleasedReturnValue},
5780 {
"objc_retainBlock", llvm::Intrinsic::objc_retainBlock},
5781 {
"objc_storeStrong", llvm::Intrinsic::objc_storeStrong},
5782 {
"objc_storeWeak", llvm::Intrinsic::objc_storeWeak},
5783 {
"objc_unsafeClaimAutoreleasedReturnValue",
5784 llvm::Intrinsic::objc_unsafeClaimAutoreleasedReturnValue},
5785 {
"objc_retainedObject", llvm::Intrinsic::objc_retainedObject},
5786 {
"objc_unretainedObject", llvm::Intrinsic::objc_unretainedObject},
5787 {
"objc_unretainedPointer", llvm::Intrinsic::objc_unretainedPointer},
5788 {
"objc_retain_autorelease", llvm::Intrinsic::objc_retain_autorelease},
5789 {
"objc_sync_enter", llvm::Intrinsic::objc_sync_enter},
5790 {
"objc_sync_exit", llvm::Intrinsic::objc_sync_exit},
5791 {
"objc_arc_annotation_topdown_bbstart",
5792 llvm::Intrinsic::objc_arc_annotation_topdown_bbstart},
5793 {
"objc_arc_annotation_topdown_bbend",
5794 llvm::Intrinsic::objc_arc_annotation_topdown_bbend},
5795 {
"objc_arc_annotation_bottomup_bbstart",
5796 llvm::Intrinsic::objc_arc_annotation_bottomup_bbstart},
5797 {
"objc_arc_annotation_bottomup_bbend",
5798 llvm::Intrinsic::objc_arc_annotation_bottomup_bbend}};
5800 for (
auto &
I : RuntimeFuncs)
5801 UpgradeToIntrinsic(
I.first,
I.second);
5805 NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
5809 bool HasObjCFlag =
false, HasClassProperties =
false,
Changed =
false;
5810 bool HasSwiftVersionFlag =
false;
5811 uint8_t SwiftMajorVersion, SwiftMinorVersion;
5818 if (
Op->getNumOperands() != 3)
5832 if (
ID->getString() ==
"Objective-C Image Info Version")
5834 if (
ID->getString() ==
"Objective-C Class Properties")
5835 HasClassProperties =
true;
5837 if (
ID->getString() ==
"PIC Level") {
5838 if (
auto *Behavior =
5840 uint64_t V = Behavior->getLimitedValue();
5846 if (
ID->getString() ==
"PIE Level")
5847 if (
auto *Behavior =
5854 if (
ID->getString() ==
"branch-target-enforcement" ||
5855 ID->getString().starts_with(
"sign-return-address")) {
5856 if (
auto *Behavior =
5862 Op->getOperand(1),
Op->getOperand(2)};
5872 if (
ID->getString() ==
"Objective-C Image Info Section") {
5875 Value->getString().split(ValueComp,
" ");
5876 if (ValueComp.
size() != 1) {
5877 std::string NewValue;
5878 for (
auto &S : ValueComp)
5879 NewValue += S.str();
5890 if (
ID->getString() ==
"Objective-C Garbage Collection") {
5893 assert(Md->getValue() &&
"Expected non-empty metadata");
5894 auto Type = Md->getValue()->getType();
5897 unsigned Val = Md->getValue()->getUniqueInteger().getZExtValue();
5898 if ((Val & 0xff) != Val) {
5899 HasSwiftVersionFlag =
true;
5900 SwiftABIVersion = (Val & 0xff00) >> 8;
5901 SwiftMajorVersion = (Val & 0xff000000) >> 24;
5902 SwiftMinorVersion = (Val & 0xff0000) >> 16;
5913 if (
ID->getString() ==
"amdgpu_code_object_version") {
5916 MDString::get(M.getContext(),
"amdhsa_code_object_version"),
5928 if (HasObjCFlag && !HasClassProperties) {
5934 if (HasSwiftVersionFlag) {
5938 ConstantInt::get(Int8Ty, SwiftMajorVersion));
5940 ConstantInt::get(Int8Ty, SwiftMinorVersion));
5948 auto TrimSpaces = [](
StringRef Section) -> std::string {
5950 Section.split(Components,
',');
5955 for (
auto Component : Components)
5956 OS <<
',' << Component.trim();
5961 for (
auto &GV : M.globals()) {
5962 if (!GV.hasSection())
5967 if (!Section.starts_with(
"__DATA, __objc_catlist"))
5972 GV.setSection(TrimSpaces(Section));
5988struct StrictFPUpgradeVisitor :
public InstVisitor<StrictFPUpgradeVisitor> {
5989 StrictFPUpgradeVisitor() =
default;
5992 if (!
Call.isStrictFP())
5998 Call.removeFnAttr(Attribute::StrictFP);
5999 Call.addFnAttr(Attribute::NoBuiltin);
6004struct AMDGPUUnsafeFPAtomicsUpgradeVisitor
6005 :
public InstVisitor<AMDGPUUnsafeFPAtomicsUpgradeVisitor> {
6006 AMDGPUUnsafeFPAtomicsUpgradeVisitor() =
default;
6008 void visitAtomicRMWInst(AtomicRMWInst &RMW) {
6023 if (!
F.isDeclaration() && !
F.hasFnAttribute(Attribute::StrictFP)) {
6024 StrictFPUpgradeVisitor SFPV;
6029 F.removeRetAttrs(AttributeFuncs::typeIncompatible(
6030 F.getReturnType(),
F.getAttributes().getRetAttrs()));
6031 for (
auto &Arg :
F.args())
6033 AttributeFuncs::typeIncompatible(Arg.getType(), Arg.getAttributes()));
6037 if (
Attribute A =
F.getFnAttribute(
"implicit-section-name");
6038 A.isValid() &&
A.isStringAttribute()) {
6039 F.setSection(
A.getValueAsString());
6040 F.removeFnAttr(
"implicit-section-name");
6047 if (
Attribute A =
F.getFnAttribute(
"amdgpu-unsafe-fp-atomics");
6050 if (
A.getValueAsBool()) {
6051 AMDGPUUnsafeFPAtomicsUpgradeVisitor Visitor;
6057 F.removeFnAttr(
"amdgpu-unsafe-fp-atomics");
6065 if (!
F.hasFnAttribute(FnAttrName))
6066 F.addFnAttr(FnAttrName,
Value);
6073 if (!
F.hasFnAttribute(FnAttrName)) {
6075 F.addFnAttr(FnAttrName);
6077 auto A =
F.getFnAttribute(FnAttrName);
6078 if (
"false" ==
A.getValueAsString())
6079 F.removeFnAttr(FnAttrName);
6080 else if (
"true" ==
A.getValueAsString()) {
6081 F.removeFnAttr(FnAttrName);
6082 F.addFnAttr(FnAttrName);
6088 Triple T(M.getTargetTriple());
6089 if (!
T.isThumb() && !
T.isARM() && !
T.isAArch64())
6099 NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
6103 if (
Op->getNumOperands() != 3)
6112 uint64_t *ValPtr = IDStr ==
"branch-target-enforcement" ? &BTEValue
6113 : IDStr ==
"branch-protection-pauth-lr" ? &BPPLRValue
6114 : IDStr ==
"guarded-control-stack" ? &GCSValue
6115 : IDStr ==
"sign-return-address" ? &SRAValue
6116 : IDStr ==
"sign-return-address-all" ? &SRAALLValue
6117 : IDStr ==
"sign-return-address-with-bkey"
6123 *ValPtr = CI->getZExtValue();
6129 bool BTE = BTEValue == 1;
6130 bool BPPLR = BPPLRValue == 1;
6131 bool GCS = GCSValue == 1;
6132 bool SRA = SRAValue == 1;
6135 if (SRA && SRAALLValue == 1)
6136 SignTypeValue =
"all";
6139 if (SRA && SRABKeyValue == 1)
6140 SignKeyValue =
"b_key";
6142 for (
Function &
F : M.getFunctionList()) {
6143 if (
F.isDeclaration())
6150 if (
auto A =
F.getFnAttribute(
"sign-return-address");
6151 A.isValid() &&
"none" ==
A.getValueAsString()) {
6152 F.removeFnAttr(
"sign-return-address");
6153 F.removeFnAttr(
"sign-return-address-key");
6169 if (SRAALLValue == 1)
6171 if (SRABKeyValue == 1)
6180 if (
T->getNumOperands() < 1)
6185 return S->getString().starts_with(
"llvm.vectorizer.");
6189 StringRef OldPrefix =
"llvm.vectorizer.";
6192 if (OldTag ==
"llvm.vectorizer.unroll")
6204 if (
T->getNumOperands() < 1)
6209 if (!OldTag->getString().starts_with(
"llvm.vectorizer."))
6214 Ops.reserve(
T->getNumOperands());
6216 for (
unsigned I = 1,
E =
T->getNumOperands();
I !=
E; ++
I)
6217 Ops.push_back(
T->getOperand(
I));
6231 Ops.reserve(
T->getNumOperands());
6242 if ((
T.isSPIR() || (
T.isSPIRV() && !
T.isSPIRVLogical())) &&
6243 !
DL.contains(
"-G") && !
DL.starts_with(
"G")) {
6244 return DL.empty() ? std::string(
"G1") : (
DL +
"-G1").str();
6247 if (
T.isLoongArch64() ||
T.isRISCV64()) {
6249 auto I =
DL.find(
"-n64-");
6251 return (
DL.take_front(
I) +
"-n32:64-" +
DL.drop_front(
I + 5)).str();
6256 std::string Res =
DL.str();
6259 if (!
DL.contains(
"-G") && !
DL.starts_with(
"G"))
6260 Res.append(Res.empty() ?
"G1" :
"-G1");
6268 if (!
DL.contains(
"-ni") && !
DL.starts_with(
"ni"))
6269 Res.append(
"-ni:7:8:9");
6271 if (
DL.ends_with(
"ni:7"))
6273 if (
DL.ends_with(
"ni:7:8"))
6278 if (!
DL.contains(
"-p7") && !
DL.starts_with(
"p7"))
6279 Res.append(
"-p7:160:256:256:32");
6280 if (!
DL.contains(
"-p8") && !
DL.starts_with(
"p8"))
6281 Res.append(
"-p8:128:128:128:48");
6282 constexpr StringRef OldP8(
"-p8:128:128-");
6283 if (
DL.contains(OldP8))
6284 Res.replace(Res.find(OldP8), OldP8.
size(),
"-p8:128:128:128:48-");
6285 if (!
DL.contains(
"-p9") && !
DL.starts_with(
"p9"))
6286 Res.append(
"-p9:192:256:256:32");
6290 if (!
DL.contains(
"m:e"))
6291 Res = Res.empty() ?
"m:e" :
"m:e-" + Res;
6296 auto AddPtr32Ptr64AddrSpaces = [&
DL, &Res]() {
6299 StringRef AddrSpaces{
"-p270:32:32-p271:32:32-p272:64:64"};
6300 if (!
DL.contains(AddrSpaces)) {
6302 Regex R(
"^([Ee]-m:[a-z](-p:32:32)?)(-.*)$");
6303 if (R.match(Res, &
Groups))
6309 if (
T.isAArch64()) {
6311 if (!
DL.empty() && !
DL.contains(
"-Fn32"))
6312 Res.append(
"-Fn32");
6313 AddPtr32Ptr64AddrSpaces();
6317 if (
T.isSPARC() || (
T.isMIPS64() && !
DL.contains(
"m:m")) ||
T.isPPC64() ||
6321 std::string I64 =
"-i64:64";
6322 std::string I128 =
"-i128:128";
6324 size_t Pos = Res.find(I64);
6325 if (Pos !=
size_t(-1))
6326 Res.insert(Pos + I64.size(), I128);
6334 AddPtr32Ptr64AddrSpaces();
6342 if (!
T.isOSIAMCU()) {
6343 std::string I128 =
"-i128:128";
6346 Regex R(
"^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
6347 if (R.match(Res, &
Groups))
6355 if (
T.isWindowsMSVCEnvironment() && !
T.isArch64Bit()) {
6357 auto I =
Ref.find(
"-f80:32-");
6359 Res = (
Ref.take_front(
I) +
"-f80:128-" +
Ref.drop_front(
I + 8)).str();
6367 Attribute A =
B.getAttribute(
"no-frame-pointer-elim");
6370 FramePointer =
A.getValueAsString() ==
"true" ?
"all" :
"none";
6371 B.removeAttribute(
"no-frame-pointer-elim");
6373 if (
B.contains(
"no-frame-pointer-elim-non-leaf")) {
6375 if (FramePointer !=
"all")
6376 FramePointer =
"non-leaf";
6377 B.removeAttribute(
"no-frame-pointer-elim-non-leaf");
6379 if (!FramePointer.
empty())
6380 B.addAttribute(
"frame-pointer", FramePointer);
6382 A =
B.getAttribute(
"null-pointer-is-valid");
6385 bool NullPointerIsValid =
A.getValueAsString() ==
"true";
6386 B.removeAttribute(
"null-pointer-is-valid");
6387 if (NullPointerIsValid)
6388 B.addAttribute(Attribute::NullPointerIsValid);
6398 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 void setFunctionAttrIfNotSet(Function &F, StringRef FnAttrName, StringRef Value)
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 void ConvertFunctionAttr(Function &F, bool Set, StringRef FnAttrName)
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.
A parsed version of the target data layout string in and methods for querying it.
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.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
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(std::initializer_list< StringLiteral > CaseStrings, 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 * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
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)
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
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.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
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.