30#include "llvm/IR/IntrinsicsAArch64.h"
31#include "llvm/IR/IntrinsicsARM.h"
32#include "llvm/IR/IntrinsicsNVPTX.h"
33#include "llvm/IR/IntrinsicsRISCV.h"
34#include "llvm/IR/IntrinsicsWebAssembly.h"
35#include "llvm/IR/IntrinsicsX86.h"
50 cl::desc(
"Disable autoupgrade of debug info"));
60 Type *Arg0Type =
F->getFunctionType()->getParamType(0);
75 Type *LastArgType =
F->getFunctionType()->getParamType(
76 F->getFunctionType()->getNumParams() - 1);
91 if (
F->getReturnType()->isVectorTy())
101 if (
F->getReturnType()->getScalarType()->isBFloatTy())
111 if (
F->getFunctionType()->getParamType(1)->getScalarType()->isBFloatTy())
125 if (
Name.consume_front(
"avx."))
126 return (
Name.starts_with(
"blend.p") ||
127 Name ==
"cvt.ps2.pd.256" ||
128 Name ==
"cvtdq2.pd.256" ||
129 Name ==
"cvtdq2.ps.256" ||
130 Name.starts_with(
"movnt.") ||
131 Name.starts_with(
"sqrt.p") ||
132 Name.starts_with(
"storeu.") ||
133 Name.starts_with(
"vbroadcast.s") ||
134 Name.starts_with(
"vbroadcastf128") ||
135 Name.starts_with(
"vextractf128.") ||
136 Name.starts_with(
"vinsertf128.") ||
137 Name.starts_with(
"vperm2f128.") ||
138 Name.starts_with(
"vpermil."));
140 if (
Name.consume_front(
"avx2."))
141 return (
Name ==
"movntdqa" ||
142 Name.starts_with(
"pabs.") ||
143 Name.starts_with(
"padds.") ||
144 Name.starts_with(
"paddus.") ||
145 Name.starts_with(
"pblendd.") ||
147 Name.starts_with(
"pbroadcast") ||
148 Name.starts_with(
"pcmpeq.") ||
149 Name.starts_with(
"pcmpgt.") ||
150 Name.starts_with(
"pmax") ||
151 Name.starts_with(
"pmin") ||
152 Name.starts_with(
"pmovsx") ||
153 Name.starts_with(
"pmovzx") ||
155 Name ==
"pmulu.dq" ||
156 Name.starts_with(
"psll.dq") ||
157 Name.starts_with(
"psrl.dq") ||
158 Name.starts_with(
"psubs.") ||
159 Name.starts_with(
"psubus.") ||
160 Name.starts_with(
"vbroadcast") ||
161 Name ==
"vbroadcasti128" ||
162 Name ==
"vextracti128" ||
163 Name ==
"vinserti128" ||
164 Name ==
"vperm2i128");
166 if (
Name.consume_front(
"avx512.")) {
167 if (
Name.consume_front(
"mask."))
169 return (
Name.starts_with(
"add.p") ||
170 Name.starts_with(
"and.") ||
171 Name.starts_with(
"andn.") ||
172 Name.starts_with(
"broadcast.s") ||
173 Name.starts_with(
"broadcastf32x4.") ||
174 Name.starts_with(
"broadcastf32x8.") ||
175 Name.starts_with(
"broadcastf64x2.") ||
176 Name.starts_with(
"broadcastf64x4.") ||
177 Name.starts_with(
"broadcasti32x4.") ||
178 Name.starts_with(
"broadcasti32x8.") ||
179 Name.starts_with(
"broadcasti64x2.") ||
180 Name.starts_with(
"broadcasti64x4.") ||
181 Name.starts_with(
"cmp.b") ||
182 Name.starts_with(
"cmp.d") ||
183 Name.starts_with(
"cmp.q") ||
184 Name.starts_with(
"cmp.w") ||
185 Name.starts_with(
"compress.b") ||
186 Name.starts_with(
"compress.d") ||
187 Name.starts_with(
"compress.p") ||
188 Name.starts_with(
"compress.q") ||
189 Name.starts_with(
"compress.store.") ||
190 Name.starts_with(
"compress.w") ||
191 Name.starts_with(
"conflict.") ||
192 Name.starts_with(
"cvtdq2pd.") ||
193 Name.starts_with(
"cvtdq2ps.") ||
194 Name ==
"cvtpd2dq.256" ||
195 Name ==
"cvtpd2ps.256" ||
196 Name ==
"cvtps2pd.128" ||
197 Name ==
"cvtps2pd.256" ||
198 Name.starts_with(
"cvtqq2pd.") ||
199 Name ==
"cvtqq2ps.256" ||
200 Name ==
"cvtqq2ps.512" ||
201 Name ==
"cvttpd2dq.256" ||
202 Name ==
"cvttps2dq.128" ||
203 Name ==
"cvttps2dq.256" ||
204 Name.starts_with(
"cvtudq2pd.") ||
205 Name.starts_with(
"cvtudq2ps.") ||
206 Name.starts_with(
"cvtuqq2pd.") ||
207 Name ==
"cvtuqq2ps.256" ||
208 Name ==
"cvtuqq2ps.512" ||
209 Name.starts_with(
"dbpsadbw.") ||
210 Name.starts_with(
"div.p") ||
211 Name.starts_with(
"expand.b") ||
212 Name.starts_with(
"expand.d") ||
213 Name.starts_with(
"expand.load.") ||
214 Name.starts_with(
"expand.p") ||
215 Name.starts_with(
"expand.q") ||
216 Name.starts_with(
"expand.w") ||
217 Name.starts_with(
"fpclass.p") ||
218 Name.starts_with(
"insert") ||
219 Name.starts_with(
"load.") ||
220 Name.starts_with(
"loadu.") ||
221 Name.starts_with(
"lzcnt.") ||
222 Name.starts_with(
"max.p") ||
223 Name.starts_with(
"min.p") ||
224 Name.starts_with(
"movddup") ||
225 Name.starts_with(
"move.s") ||
226 Name.starts_with(
"movshdup") ||
227 Name.starts_with(
"movsldup") ||
228 Name.starts_with(
"mul.p") ||
229 Name.starts_with(
"or.") ||
230 Name.starts_with(
"pabs.") ||
231 Name.starts_with(
"packssdw.") ||
232 Name.starts_with(
"packsswb.") ||
233 Name.starts_with(
"packusdw.") ||
234 Name.starts_with(
"packuswb.") ||
235 Name.starts_with(
"padd.") ||
236 Name.starts_with(
"padds.") ||
237 Name.starts_with(
"paddus.") ||
238 Name.starts_with(
"palignr.") ||
239 Name.starts_with(
"pand.") ||
240 Name.starts_with(
"pandn.") ||
241 Name.starts_with(
"pavg") ||
242 Name.starts_with(
"pbroadcast") ||
243 Name.starts_with(
"pcmpeq.") ||
244 Name.starts_with(
"pcmpgt.") ||
245 Name.starts_with(
"perm.df.") ||
246 Name.starts_with(
"perm.di.") ||
247 Name.starts_with(
"permvar.") ||
248 Name.starts_with(
"pmaddubs.w.") ||
249 Name.starts_with(
"pmaddw.d.") ||
250 Name.starts_with(
"pmax") ||
251 Name.starts_with(
"pmin") ||
252 Name ==
"pmov.qd.256" ||
253 Name ==
"pmov.qd.512" ||
254 Name ==
"pmov.wb.256" ||
255 Name ==
"pmov.wb.512" ||
256 Name.starts_with(
"pmovsx") ||
257 Name.starts_with(
"pmovzx") ||
258 Name.starts_with(
"pmul.dq.") ||
259 Name.starts_with(
"pmul.hr.sw.") ||
260 Name.starts_with(
"pmulh.w.") ||
261 Name.starts_with(
"pmulhu.w.") ||
262 Name.starts_with(
"pmull.") ||
263 Name.starts_with(
"pmultishift.qb.") ||
264 Name.starts_with(
"pmulu.dq.") ||
265 Name.starts_with(
"por.") ||
266 Name.starts_with(
"prol.") ||
267 Name.starts_with(
"prolv.") ||
268 Name.starts_with(
"pror.") ||
269 Name.starts_with(
"prorv.") ||
270 Name.starts_with(
"pshuf.b.") ||
271 Name.starts_with(
"pshuf.d.") ||
272 Name.starts_with(
"pshufh.w.") ||
273 Name.starts_with(
"pshufl.w.") ||
274 Name.starts_with(
"psll.d") ||
275 Name.starts_with(
"psll.q") ||
276 Name.starts_with(
"psll.w") ||
277 Name.starts_with(
"pslli") ||
278 Name.starts_with(
"psllv") ||
279 Name.starts_with(
"psra.d") ||
280 Name.starts_with(
"psra.q") ||
281 Name.starts_with(
"psra.w") ||
282 Name.starts_with(
"psrai") ||
283 Name.starts_with(
"psrav") ||
284 Name.starts_with(
"psrl.d") ||
285 Name.starts_with(
"psrl.q") ||
286 Name.starts_with(
"psrl.w") ||
287 Name.starts_with(
"psrli") ||
288 Name.starts_with(
"psrlv") ||
289 Name.starts_with(
"psub.") ||
290 Name.starts_with(
"psubs.") ||
291 Name.starts_with(
"psubus.") ||
292 Name.starts_with(
"pternlog.") ||
293 Name.starts_with(
"punpckh") ||
294 Name.starts_with(
"punpckl") ||
295 Name.starts_with(
"pxor.") ||
296 Name.starts_with(
"shuf.f") ||
297 Name.starts_with(
"shuf.i") ||
298 Name.starts_with(
"shuf.p") ||
299 Name.starts_with(
"sqrt.p") ||
300 Name.starts_with(
"store.b.") ||
301 Name.starts_with(
"store.d.") ||
302 Name.starts_with(
"store.p") ||
303 Name.starts_with(
"store.q.") ||
304 Name.starts_with(
"store.w.") ||
305 Name ==
"store.ss" ||
306 Name.starts_with(
"storeu.") ||
307 Name.starts_with(
"sub.p") ||
308 Name.starts_with(
"ucmp.") ||
309 Name.starts_with(
"unpckh.") ||
310 Name.starts_with(
"unpckl.") ||
311 Name.starts_with(
"valign.") ||
312 Name ==
"vcvtph2ps.128" ||
313 Name ==
"vcvtph2ps.256" ||
314 Name.starts_with(
"vextract") ||
315 Name.starts_with(
"vfmadd.") ||
316 Name.starts_with(
"vfmaddsub.") ||
317 Name.starts_with(
"vfnmadd.") ||
318 Name.starts_with(
"vfnmsub.") ||
319 Name.starts_with(
"vpdpbusd.") ||
320 Name.starts_with(
"vpdpbusds.") ||
321 Name.starts_with(
"vpdpwssd.") ||
322 Name.starts_with(
"vpdpwssds.") ||
323 Name.starts_with(
"vpermi2var.") ||
324 Name.starts_with(
"vpermil.p") ||
325 Name.starts_with(
"vpermilvar.") ||
326 Name.starts_with(
"vpermt2var.") ||
327 Name.starts_with(
"vpmadd52") ||
328 Name.starts_with(
"vpshld.") ||
329 Name.starts_with(
"vpshldv.") ||
330 Name.starts_with(
"vpshrd.") ||
331 Name.starts_with(
"vpshrdv.") ||
332 Name.starts_with(
"vpshufbitqmb.") ||
333 Name.starts_with(
"xor."));
335 if (
Name.consume_front(
"mask3."))
337 return (
Name.starts_with(
"vfmadd.") ||
338 Name.starts_with(
"vfmaddsub.") ||
339 Name.starts_with(
"vfmsub.") ||
340 Name.starts_with(
"vfmsubadd.") ||
341 Name.starts_with(
"vfnmsub."));
343 if (
Name.consume_front(
"maskz."))
345 return (
Name.starts_with(
"pternlog.") ||
346 Name.starts_with(
"vfmadd.") ||
347 Name.starts_with(
"vfmaddsub.") ||
348 Name.starts_with(
"vpdpbusd.") ||
349 Name.starts_with(
"vpdpbusds.") ||
350 Name.starts_with(
"vpdpwssd.") ||
351 Name.starts_with(
"vpdpwssds.") ||
352 Name.starts_with(
"vpermt2var.") ||
353 Name.starts_with(
"vpmadd52") ||
354 Name.starts_with(
"vpshldv.") ||
355 Name.starts_with(
"vpshrdv."));
358 return (
Name ==
"movntdqa" ||
359 Name ==
"pmul.dq.512" ||
360 Name ==
"pmulu.dq.512" ||
361 Name.starts_with(
"broadcastm") ||
362 Name.starts_with(
"cmp.p") ||
363 Name.starts_with(
"cvtb2mask.") ||
364 Name.starts_with(
"cvtd2mask.") ||
365 Name.starts_with(
"cvtmask2") ||
366 Name.starts_with(
"cvtq2mask.") ||
367 Name ==
"cvtusi2sd" ||
368 Name.starts_with(
"cvtw2mask.") ||
373 Name ==
"kortestc.w" ||
374 Name ==
"kortestz.w" ||
375 Name.starts_with(
"kunpck") ||
378 Name.starts_with(
"padds.") ||
379 Name.starts_with(
"pbroadcast") ||
380 Name.starts_with(
"prol") ||
381 Name.starts_with(
"pror") ||
382 Name.starts_with(
"psll.dq") ||
383 Name.starts_with(
"psrl.dq") ||
384 Name.starts_with(
"psubs.") ||
385 Name.starts_with(
"ptestm") ||
386 Name.starts_with(
"ptestnm") ||
387 Name.starts_with(
"storent.") ||
388 Name.starts_with(
"vbroadcast.s") ||
389 Name.starts_with(
"vpshld.") ||
390 Name.starts_with(
"vpshrd."));
393 if (
Name.consume_front(
"fma."))
394 return (
Name.starts_with(
"vfmadd.") ||
395 Name.starts_with(
"vfmsub.") ||
396 Name.starts_with(
"vfmsubadd.") ||
397 Name.starts_with(
"vfnmadd.") ||
398 Name.starts_with(
"vfnmsub."));
400 if (
Name.consume_front(
"fma4."))
401 return Name.starts_with(
"vfmadd.s");
403 if (
Name.consume_front(
"sse."))
404 return (
Name ==
"add.ss" ||
405 Name ==
"cvtsi2ss" ||
406 Name ==
"cvtsi642ss" ||
409 Name.starts_with(
"sqrt.p") ||
411 Name.starts_with(
"storeu.") ||
414 if (
Name.consume_front(
"sse2."))
415 return (
Name ==
"add.sd" ||
416 Name ==
"cvtdq2pd" ||
417 Name ==
"cvtdq2ps" ||
418 Name ==
"cvtps2pd" ||
419 Name ==
"cvtsi2sd" ||
420 Name ==
"cvtsi642sd" ||
421 Name ==
"cvtss2sd" ||
424 Name.starts_with(
"padds.") ||
425 Name.starts_with(
"paddus.") ||
426 Name.starts_with(
"pcmpeq.") ||
427 Name.starts_with(
"pcmpgt.") ||
432 Name ==
"pmulu.dq" ||
433 Name.starts_with(
"pshuf") ||
434 Name.starts_with(
"psll.dq") ||
435 Name.starts_with(
"psrl.dq") ||
436 Name.starts_with(
"psubs.") ||
437 Name.starts_with(
"psubus.") ||
438 Name.starts_with(
"sqrt.p") ||
440 Name ==
"storel.dq" ||
441 Name.starts_with(
"storeu.") ||
444 if (
Name.consume_front(
"sse41."))
445 return (
Name.starts_with(
"blendp") ||
446 Name ==
"movntdqa" ||
456 Name.starts_with(
"pmovsx") ||
457 Name.starts_with(
"pmovzx") ||
460 if (
Name.consume_front(
"sse42."))
461 return Name ==
"crc32.64.8";
463 if (
Name.consume_front(
"sse4a."))
464 return Name.starts_with(
"movnt.");
466 if (
Name.consume_front(
"ssse3."))
467 return (
Name ==
"pabs.b.128" ||
468 Name ==
"pabs.d.128" ||
469 Name ==
"pabs.w.128");
471 if (
Name.consume_front(
"xop."))
472 return (
Name ==
"vpcmov" ||
473 Name ==
"vpcmov.256" ||
474 Name.starts_with(
"vpcom") ||
475 Name.starts_with(
"vprot"));
477 return (
Name ==
"addcarry.u32" ||
478 Name ==
"addcarry.u64" ||
479 Name ==
"addcarryx.u32" ||
480 Name ==
"addcarryx.u64" ||
481 Name ==
"subborrow.u32" ||
482 Name ==
"subborrow.u64" ||
483 Name.starts_with(
"vcvtph2ps."));
489 if (!
Name.consume_front(
"x86."))
497 if (
Name ==
"rdtscp") {
499 if (
F->getFunctionType()->getNumParams() == 0)
504 Intrinsic::x86_rdtscp);
511 if (
Name.consume_front(
"sse41.ptest")) {
513 .
Case(
"c", Intrinsic::x86_sse41_ptestc)
514 .
Case(
"z", Intrinsic::x86_sse41_ptestz)
515 .
Case(
"nzc", Intrinsic::x86_sse41_ptestnzc)
528 .
Case(
"sse41.insertps", Intrinsic::x86_sse41_insertps)
529 .
Case(
"sse41.dppd", Intrinsic::x86_sse41_dppd)
530 .
Case(
"sse41.dpps", Intrinsic::x86_sse41_dpps)
531 .
Case(
"sse41.mpsadbw", Intrinsic::x86_sse41_mpsadbw)
532 .
Case(
"avx.dp.ps.256", Intrinsic::x86_avx_dp_ps_256)
533 .
Case(
"avx2.mpsadbw", Intrinsic::x86_avx2_mpsadbw)
538 if (
Name.consume_front(
"avx512.mask.cmp.")) {
541 .
Case(
"pd.128", Intrinsic::x86_avx512_mask_cmp_pd_128)
542 .
Case(
"pd.256", Intrinsic::x86_avx512_mask_cmp_pd_256)
543 .
Case(
"pd.512", Intrinsic::x86_avx512_mask_cmp_pd_512)
544 .
Case(
"ps.128", Intrinsic::x86_avx512_mask_cmp_ps_128)
545 .
Case(
"ps.256", Intrinsic::x86_avx512_mask_cmp_ps_256)
546 .
Case(
"ps.512", Intrinsic::x86_avx512_mask_cmp_ps_512)
553 if (
Name.consume_front(
"avx512bf16.")) {
556 .
Case(
"cvtne2ps2bf16.128",
557 Intrinsic::x86_avx512bf16_cvtne2ps2bf16_128)
558 .
Case(
"cvtne2ps2bf16.256",
559 Intrinsic::x86_avx512bf16_cvtne2ps2bf16_256)
560 .
Case(
"cvtne2ps2bf16.512",
561 Intrinsic::x86_avx512bf16_cvtne2ps2bf16_512)
562 .
Case(
"mask.cvtneps2bf16.128",
563 Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128)
564 .
Case(
"cvtneps2bf16.256",
565 Intrinsic::x86_avx512bf16_cvtneps2bf16_256)
566 .
Case(
"cvtneps2bf16.512",
567 Intrinsic::x86_avx512bf16_cvtneps2bf16_512)
574 .
Case(
"dpbf16ps.128", Intrinsic::x86_avx512bf16_dpbf16ps_128)
575 .
Case(
"dpbf16ps.256", Intrinsic::x86_avx512bf16_dpbf16ps_256)
576 .
Case(
"dpbf16ps.512", Intrinsic::x86_avx512bf16_dpbf16ps_512)
583 if (
Name.consume_front(
"xop.")) {
585 if (
Name.starts_with(
"vpermil2")) {
588 auto Idx =
F->getFunctionType()->getParamType(2);
589 if (
Idx->isFPOrFPVectorTy()) {
590 unsigned IdxSize =
Idx->getPrimitiveSizeInBits();
591 unsigned EltSize =
Idx->getScalarSizeInBits();
592 if (EltSize == 64 && IdxSize == 128)
593 ID = Intrinsic::x86_xop_vpermil2pd;
594 else if (EltSize == 32 && IdxSize == 128)
595 ID = Intrinsic::x86_xop_vpermil2ps;
596 else if (EltSize == 64 && IdxSize == 256)
597 ID = Intrinsic::x86_xop_vpermil2pd_256;
599 ID = Intrinsic::x86_xop_vpermil2ps_256;
601 }
else if (
F->arg_size() == 2)
604 .
Case(
"vfrcz.ss", Intrinsic::x86_xop_vfrcz_ss)
605 .
Case(
"vfrcz.sd", Intrinsic::x86_xop_vfrcz_sd)
616 if (
Name ==
"seh.recoverfp") {
629 if (
Name.starts_with(
"rbit")) {
632 F->arg_begin()->getType());
636 if (
Name ==
"thread.pointer") {
643 bool Neon =
Name.consume_front(
"neon.");
648 if (
Name.consume_front(
"bfdot.")) {
652 .
Cases(
"v2f32.v8i8",
"v4f32.v16i8",
657 size_t OperandWidth =
F->getReturnType()->getPrimitiveSizeInBits();
658 assert((OperandWidth == 64 || OperandWidth == 128) &&
659 "Unexpected operand width");
661 std::array<Type *, 2> Tys{
672 if (
Name.consume_front(
"bfm")) {
674 if (
Name.consume_back(
".v4f32.v16i8")) {
714 F->arg_begin()->getType());
718 if (
Name.consume_front(
"vst")) {
720 static const Regex vstRegex(
"^([1234]|[234]lane)\\.v[a-z0-9]*$");
724 Intrinsic::arm_neon_vst1, Intrinsic::arm_neon_vst2,
725 Intrinsic::arm_neon_vst3, Intrinsic::arm_neon_vst4};
728 Intrinsic::arm_neon_vst2lane, Intrinsic::arm_neon_vst3lane,
729 Intrinsic::arm_neon_vst4lane};
731 auto fArgs =
F->getFunctionType()->params();
732 Type *Tys[] = {fArgs[0], fArgs[1]};
735 StoreInts[fArgs.size() - 3], Tys);
738 F->getParent(), StoreLaneInts[fArgs.size() - 5], Tys);
747 if (
Name.consume_front(
"mve.")) {
749 if (
Name ==
"vctp64") {
750 if (cast<FixedVectorType>(
F->getReturnType())->getNumElements() == 4) {
760 if (
Name.consume_back(
".v4i1")) {
762 if (
Name.consume_back(
".predicated.v2i64.v4i32"))
764 return Name ==
"mull.int" ||
Name ==
"vqdmull";
766 if (
Name.consume_back(
".v2i64")) {
768 bool IsGather =
Name.consume_front(
"vldr.gather.");
769 if (IsGather ||
Name.consume_front(
"vstr.scatter.")) {
770 if (
Name.consume_front(
"base.")) {
772 Name.consume_front(
"wb.");
775 return Name ==
"predicated.v2i64";
778 if (
Name.consume_front(
"offset.predicated."))
779 return Name == (IsGather ?
"v2i64.p0i64" :
"p0i64.v2i64") ||
780 Name == (IsGather ?
"v2i64.p0" :
"p0.v2i64");
793 if (
Name.consume_front(
"cde.vcx")) {
795 if (
Name.consume_back(
".predicated.v2i64.v4i1"))
812 F->arg_begin()->getType());
816 if (
Name.starts_with(
"addp")) {
818 if (
F->arg_size() != 2)
820 VectorType *Ty = dyn_cast<VectorType>(
F->getReturnType());
821 if (Ty && Ty->getElementType()->isFloatingPointTy()) {
823 Intrinsic::aarch64_neon_faddp, Ty);
829 if (
Name.consume_front(
"sve.")) {
831 if (
Name.consume_front(
"bf")) {
832 if (
Name.consume_back(
".lane")) {
836 .
Case(
"dot", Intrinsic::aarch64_sve_bfdot_lane_v2)
837 .
Case(
"mlalb", Intrinsic::aarch64_sve_bfmlalb_lane_v2)
838 .
Case(
"mlalt", Intrinsic::aarch64_sve_bfmlalt_lane_v2)
849 if (
Name.consume_front(
"ld")) {
851 static const Regex LdRegex(
"^[234](.nxv[a-z0-9]+|$)");
854 dyn_cast<VectorType>(
F->getReturnType())->getElementType();
855 ElementCount EC = dyn_cast<VectorType>(
F->arg_begin()->getType())
857 Type *Ty = VectorType::get(ScalarTy, EC);
859 Intrinsic::aarch64_sve_ld2_sret,
860 Intrinsic::aarch64_sve_ld3_sret,
861 Intrinsic::aarch64_sve_ld4_sret,
864 LoadIDs[
Name[0] -
'2'], Ty);
870 if (
Name.consume_front(
"tuple.")) {
872 if (
Name.starts_with(
"get")) {
874 Type *Tys[] = {
F->getReturnType(),
F->arg_begin()->getType()};
876 Intrinsic::vector_extract, Tys);
880 if (
Name.starts_with(
"set")) {
882 auto Args =
F->getFunctionType()->params();
883 Type *Tys[] = {Args[0], Args[2], Args[1]};
885 Intrinsic::vector_insert, Tys);
889 static const Regex CreateTupleRegex(
"^create[234](.nxv[a-z0-9]+|$)");
892 auto Args =
F->getFunctionType()->params();
893 Type *Tys[] = {
F->getReturnType(), Args[1]};
895 Intrinsic::vector_insert, Tys);
907 if (
Name.consume_front(
"abs."))
909 .
Case(
"bf16", Intrinsic::nvvm_abs_bf16)
910 .
Case(
"bf16x2", Intrinsic::nvvm_abs_bf16x2)
913 if (
Name.consume_front(
"fma.rn."))
915 .
Case(
"bf16", Intrinsic::nvvm_fma_rn_bf16)
916 .
Case(
"bf16x2", Intrinsic::nvvm_fma_rn_bf16x2)
917 .
Case(
"ftz.bf16", Intrinsic::nvvm_fma_rn_ftz_bf16)
918 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fma_rn_ftz_bf16x2)
919 .
Case(
"ftz.relu.bf16", Intrinsic::nvvm_fma_rn_ftz_relu_bf16)
920 .
Case(
"ftz.relu.bf16x2", Intrinsic::nvvm_fma_rn_ftz_relu_bf16x2)
921 .
Case(
"ftz.sat.bf16", Intrinsic::nvvm_fma_rn_ftz_sat_bf16)
922 .
Case(
"ftz.sat.bf16x2", Intrinsic::nvvm_fma_rn_ftz_sat_bf16x2)
923 .
Case(
"relu.bf16", Intrinsic::nvvm_fma_rn_relu_bf16)
924 .
Case(
"relu.bf16x2", Intrinsic::nvvm_fma_rn_relu_bf16x2)
925 .
Case(
"sat.bf16", Intrinsic::nvvm_fma_rn_sat_bf16)
926 .
Case(
"sat.bf16x2", Intrinsic::nvvm_fma_rn_sat_bf16x2)
929 if (
Name.consume_front(
"fmax."))
931 .
Case(
"bf16", Intrinsic::nvvm_fmax_bf16)
932 .
Case(
"bf16x2", Intrinsic::nvvm_fmax_bf16x2)
933 .
Case(
"ftz.bf16", Intrinsic::nvvm_fmax_ftz_bf16)
934 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fmax_ftz_bf16x2)
935 .
Case(
"ftz.nan.bf16", Intrinsic::nvvm_fmax_ftz_nan_bf16)
936 .
Case(
"ftz.nan.bf16x2", Intrinsic::nvvm_fmax_ftz_nan_bf16x2)
937 .
Case(
"ftz.nan.xorsign.abs.bf16",
938 Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_bf16)
939 .
Case(
"ftz.nan.xorsign.abs.bf16x2",
940 Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_bf16x2)
941 .
Case(
"ftz.xorsign.abs.bf16", Intrinsic::nvvm_fmax_ftz_xorsign_abs_bf16)
942 .
Case(
"ftz.xorsign.abs.bf16x2",
943 Intrinsic::nvvm_fmax_ftz_xorsign_abs_bf16x2)
944 .
Case(
"nan.bf16", Intrinsic::nvvm_fmax_nan_bf16)
945 .
Case(
"nan.bf16x2", Intrinsic::nvvm_fmax_nan_bf16x2)
946 .
Case(
"nan.xorsign.abs.bf16", Intrinsic::nvvm_fmax_nan_xorsign_abs_bf16)
947 .
Case(
"nan.xorsign.abs.bf16x2",
948 Intrinsic::nvvm_fmax_nan_xorsign_abs_bf16x2)
949 .
Case(
"xorsign.abs.bf16", Intrinsic::nvvm_fmax_xorsign_abs_bf16)
950 .
Case(
"xorsign.abs.bf16x2", Intrinsic::nvvm_fmax_xorsign_abs_bf16x2)
953 if (
Name.consume_front(
"fmin."))
955 .
Case(
"bf16", Intrinsic::nvvm_fmin_bf16)
956 .
Case(
"bf16x2", Intrinsic::nvvm_fmin_bf16x2)
957 .
Case(
"ftz.bf16", Intrinsic::nvvm_fmin_ftz_bf16)
958 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fmin_ftz_bf16x2)
959 .
Case(
"ftz.nan.bf16", Intrinsic::nvvm_fmin_ftz_nan_bf16)
960 .
Case(
"ftz.nan.bf16x2", Intrinsic::nvvm_fmin_ftz_nan_bf16x2)
961 .
Case(
"ftz.nan.xorsign.abs.bf16",
962 Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_bf16)
963 .
Case(
"ftz.nan.xorsign.abs.bf16x2",
964 Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_bf16x2)
965 .
Case(
"ftz.xorsign.abs.bf16", Intrinsic::nvvm_fmin_ftz_xorsign_abs_bf16)
966 .
Case(
"ftz.xorsign.abs.bf16x2",
967 Intrinsic::nvvm_fmin_ftz_xorsign_abs_bf16x2)
968 .
Case(
"nan.bf16", Intrinsic::nvvm_fmin_nan_bf16)
969 .
Case(
"nan.bf16x2", Intrinsic::nvvm_fmin_nan_bf16x2)
970 .
Case(
"nan.xorsign.abs.bf16", Intrinsic::nvvm_fmin_nan_xorsign_abs_bf16)
971 .
Case(
"nan.xorsign.abs.bf16x2",
972 Intrinsic::nvvm_fmin_nan_xorsign_abs_bf16x2)
973 .
Case(
"xorsign.abs.bf16", Intrinsic::nvvm_fmin_xorsign_abs_bf16)
974 .
Case(
"xorsign.abs.bf16x2", Intrinsic::nvvm_fmin_xorsign_abs_bf16x2)
977 if (
Name.consume_front(
"neg."))
979 .
Case(
"bf16", Intrinsic::nvvm_neg_bf16)
980 .
Case(
"bf16x2", Intrinsic::nvvm_neg_bf16x2)
987 bool CanUpgradeDebugIntrinsicsToRecords) {
988 assert(
F &&
"Illegal to upgrade a non-existent Function.");
993 if (!
Name.consume_front(
"llvm.") ||
Name.empty())
999 bool IsArm =
Name.consume_front(
"arm.");
1000 if (IsArm ||
Name.consume_front(
"aarch64.")) {
1006 if (
Name.consume_front(
"amdgcn.")) {
1007 if (
Name ==
"alignbit") {
1010 {F->getReturnType()});
1014 if (
Name.consume_front(
"atomic.")) {
1015 if (
Name.starts_with(
"inc") ||
Name.starts_with(
"dec")) {
1024 if (
Name.starts_with(
"ldexp.")) {
1027 F->getParent(), Intrinsic::ldexp,
1028 {F->getReturnType(), F->getArg(1)->getType()});
1037 if (
F->arg_size() == 1) {
1045 F->arg_begin()->getType());
1050 if (
F->arg_size() == 2 &&
Name.equals(
"coro.end")) {
1059 if (
Name.consume_front(
"dbg.")) {
1061 if (CanUpgradeDebugIntrinsicsToRecords &&
1062 F->getParent()->IsNewDbgInfoFormat) {
1063 if (
Name ==
"addr" ||
Name ==
"value" ||
Name ==
"assign" ||
1064 Name ==
"declare" ||
Name ==
"label") {
1073 if (
Name ==
"addr" || (
Name ==
"value" &&
F->arg_size() == 4)) {
1082 if (
Name.consume_front(
"experimental.vector.")) {
1084 .
StartsWith(
"extract.", Intrinsic::vector_extract)
1085 .
StartsWith(
"insert.", Intrinsic::vector_insert)
1088 const auto *FT =
F->getFunctionType();
1090 if (
ID == Intrinsic::vector_extract)
1094 if (
ID == Intrinsic::vector_insert)
1102 if (
Name.consume_front(
"reduce.")) {
1104 static const Regex R(
"^([a-z]+)\\.[a-z][0-9]+");
1107 .
Case(
"add", Intrinsic::vector_reduce_add)
1108 .
Case(
"mul", Intrinsic::vector_reduce_mul)
1109 .
Case(
"and", Intrinsic::vector_reduce_and)
1110 .
Case(
"or", Intrinsic::vector_reduce_or)
1111 .
Case(
"xor", Intrinsic::vector_reduce_xor)
1112 .
Case(
"smax", Intrinsic::vector_reduce_smax)
1113 .
Case(
"smin", Intrinsic::vector_reduce_smin)
1114 .
Case(
"umax", Intrinsic::vector_reduce_umax)
1115 .
Case(
"umin", Intrinsic::vector_reduce_umin)
1116 .
Case(
"fmax", Intrinsic::vector_reduce_fmax)
1117 .
Case(
"fmin", Intrinsic::vector_reduce_fmin)
1122 static const Regex R2(
"^v2\\.([a-z]+)\\.[fi][0-9]+");
1127 .
Case(
"fadd", Intrinsic::vector_reduce_fadd)
1128 .
Case(
"fmul", Intrinsic::vector_reduce_fmul)
1133 auto Args =
F->getFunctionType()->params();
1144 if (
Name.starts_with(
"flt.rounds")) {
1151 if (
Name.starts_with(
"invariant.group.barrier")) {
1153 auto Args =
F->getFunctionType()->params();
1154 Type* ObjectPtr[1] = {Args[0]};
1157 Intrinsic::launder_invariant_group, ObjectPtr);
1166 .StartsWith(
"memcpy.", Intrinsic::memcpy)
1167 .StartsWith(
"memmove.", Intrinsic::memmove)
1169 if (
F->arg_size() == 5) {
1173 F->getFunctionType()->params().slice(0, 3);
1178 if (
Name.starts_with(
"memset.") &&
F->arg_size() == 5) {
1181 const auto *FT =
F->getFunctionType();
1182 Type *ParamTypes[2] = {
1183 FT->getParamType(0),
1193 if (
Name.consume_front(
"nvvm.")) {
1195 if (
F->arg_size() == 1) {
1198 .
Cases(
"brev32",
"brev64", Intrinsic::bitreverse)
1199 .
Case(
"clz.i", Intrinsic::ctlz)
1200 .
Case(
"popc.i", Intrinsic::ctpop)
1204 {F->getReturnType()});
1210 if (!
F->getReturnType()->getScalarType()->isBFloatTy()) {
1222 bool Expand =
false;
1223 if (
Name.consume_front(
"abs."))
1225 Expand =
Name ==
"i" ||
Name ==
"ll";
1226 else if (
Name ==
"clz.ll" ||
Name ==
"popc.ll" ||
Name ==
"h2f")
1228 else if (
Name.consume_front(
"max.") ||
Name.consume_front(
"min."))
1232 else if (
Name.consume_front(
"atomic.load.add."))
1234 Expand =
Name.starts_with(
"f32.p") ||
Name.starts_with(
"f64.p");
1249 if (
Name.starts_with(
"objectsize.")) {
1250 Type *Tys[2] = {
F->getReturnType(),
F->arg_begin()->getType() };
1251 if (
F->arg_size() == 2 ||
F->arg_size() == 3 ||
1263 if (
Name.starts_with(
"ptr.annotation.") &&
F->arg_size() == 4) {
1266 F->getParent(), Intrinsic::ptr_annotation,
1267 {F->arg_begin()->getType(), F->getArg(1)->getType()});
1273 if (
Name.consume_front(
"riscv.")) {
1276 .
Case(
"aes32dsi", Intrinsic::riscv_aes32dsi)
1277 .
Case(
"aes32dsmi", Intrinsic::riscv_aes32dsmi)
1278 .
Case(
"aes32esi", Intrinsic::riscv_aes32esi)
1279 .
Case(
"aes32esmi", Intrinsic::riscv_aes32esmi)
1282 if (!
F->getFunctionType()->getParamType(2)->isIntegerTy(32)) {
1295 if (!
F->getFunctionType()->getParamType(2)->isIntegerTy(32) ||
1296 F->getFunctionType()->getReturnType()->isIntegerTy(64)) {
1305 .
StartsWith(
"sha256sig0", Intrinsic::riscv_sha256sig0)
1306 .
StartsWith(
"sha256sig1", Intrinsic::riscv_sha256sig1)
1307 .
StartsWith(
"sha256sum0", Intrinsic::riscv_sha256sum0)
1308 .
StartsWith(
"sha256sum1", Intrinsic::riscv_sha256sum1)
1313 if (
F->getFunctionType()->getReturnType()->isIntegerTy(64)) {
1325 if (
Name ==
"stackprotectorcheck") {
1332 if (
Name ==
"var.annotation" &&
F->arg_size() == 4) {
1335 F->getParent(), Intrinsic::var_annotation,
1336 {{F->arg_begin()->getType(), F->getArg(1)->getType()}});
1343 if (
Name.consume_front(
"wasm.")) {
1346 .
StartsWith(
"fma.", Intrinsic::wasm_relaxed_madd)
1347 .
StartsWith(
"fms.", Intrinsic::wasm_relaxed_nmadd)
1348 .
StartsWith(
"laneselect.", Intrinsic::wasm_relaxed_laneselect)
1357 if (
Name.consume_front(
"dot.i8x16.i7x16.")) {
1359 .
Case(
"signed", Intrinsic::wasm_relaxed_dot_i8x16_i7x16_signed)
1361 Intrinsic::wasm_relaxed_dot_i8x16_i7x16_add_signed)
1379 auto *
ST = dyn_cast<StructType>(
F->getReturnType());
1380 if (ST && (!
ST->isLiteral() ||
ST->isPacked()) &&
1389 auto *FT =
F->getFunctionType();
1391 auto *NewFT = FunctionType::get(NewST, FT->params(), FT->isVarArg());
1392 std::string
Name =
F->getName().str();
1395 Name,
F->getParent());
1406 if (Result != std::nullopt) {
1419 bool CanUpgradeDebugIntrinsicsToRecords) {
1423 assert(
F != NewFn &&
"Intrinsic function upgraded to the same function");
1435 GV->
getName() ==
"llvm.global_dtors")) ||
1450 unsigned N =
Init->getNumOperands();
1451 std::vector<Constant *> NewCtors(
N);
1452 for (
unsigned i = 0; i !=
N; ++i) {
1453 auto Ctor = cast<Constant>(
Init->getOperand(i));
1455 Ctor->getAggregateElement(1),
1468 auto *ResultTy = cast<FixedVectorType>(
Op->getType());
1469 unsigned NumElts = ResultTy->getNumElements() * 8;
1483 for (
unsigned l = 0; l != NumElts; l += 16)
1484 for (
unsigned i = 0; i != 16; ++i) {
1485 unsigned Idx = NumElts + i - Shift;
1487 Idx -= NumElts - 16;
1488 Idxs[l + i] =
Idx + l;
1502 auto *ResultTy = cast<FixedVectorType>(
Op->getType());
1503 unsigned NumElts = ResultTy->getNumElements() * 8;
1517 for (
unsigned l = 0; l != NumElts; l += 16)
1518 for (
unsigned i = 0; i != 16; ++i) {
1519 unsigned Idx = i + Shift;
1521 Idx += NumElts - 16;
1522 Idxs[l + i] =
Idx + l;
1543 for (
unsigned i = 0; i != NumElts; ++i)
1555 if (
const auto *
C = dyn_cast<Constant>(Mask))
1556 if (
C->isAllOnesValue())
1560 cast<FixedVectorType>(Op0->
getType())->getNumElements());
1567 if (
const auto *
C = dyn_cast<Constant>(Mask))
1568 if (
C->isAllOnesValue())
1572 Mask->getType()->getIntegerBitWidth());
1585 unsigned ShiftVal = cast<llvm::ConstantInt>(Shift)->getZExtValue();
1587 unsigned NumElts = cast<FixedVectorType>(Op0->
getType())->getNumElements();
1588 assert((IsVALIGN || NumElts % 16 == 0) &&
"Illegal NumElts for PALIGNR!");
1589 assert((!IsVALIGN || NumElts <= 16) &&
"NumElts too large for VALIGN!");
1594 ShiftVal &= (NumElts - 1);
1603 if (ShiftVal > 16) {
1611 for (
unsigned l = 0; l < NumElts; l += 16) {
1612 for (
unsigned i = 0; i != 16; ++i) {
1613 unsigned Idx = ShiftVal + i;
1614 if (!IsVALIGN &&
Idx >= 16)
1615 Idx += NumElts - 16;
1616 Indices[l + i] =
Idx + l;
1621 Op1, Op0,
ArrayRef(Indices, NumElts),
"palignr");
1627 bool ZeroMask,
bool IndexForm) {
1633 if (VecWidth == 128 && EltWidth == 32 && IsFloat)
1634 IID = Intrinsic::x86_avx512_vpermi2var_ps_128;
1635 else if (VecWidth == 128 && EltWidth == 32 && !IsFloat)
1636 IID = Intrinsic::x86_avx512_vpermi2var_d_128;
1637 else if (VecWidth == 128 && EltWidth == 64 && IsFloat)
1638 IID = Intrinsic::x86_avx512_vpermi2var_pd_128;
1639 else if (VecWidth == 128 && EltWidth == 64 && !IsFloat)
1640 IID = Intrinsic::x86_avx512_vpermi2var_q_128;
1641 else if (VecWidth == 256 && EltWidth == 32 && IsFloat)
1642 IID = Intrinsic::x86_avx512_vpermi2var_ps_256;
1643 else if (VecWidth == 256 && EltWidth == 32 && !IsFloat)
1644 IID = Intrinsic::x86_avx512_vpermi2var_d_256;
1645 else if (VecWidth == 256 && EltWidth == 64 && IsFloat)
1646 IID = Intrinsic::x86_avx512_vpermi2var_pd_256;
1647 else if (VecWidth == 256 && EltWidth == 64 && !IsFloat)
1648 IID = Intrinsic::x86_avx512_vpermi2var_q_256;
1649 else if (VecWidth == 512 && EltWidth == 32 && IsFloat)
1650 IID = Intrinsic::x86_avx512_vpermi2var_ps_512;
1651 else if (VecWidth == 512 && EltWidth == 32 && !IsFloat)
1652 IID = Intrinsic::x86_avx512_vpermi2var_d_512;
1653 else if (VecWidth == 512 && EltWidth == 64 && IsFloat)
1654 IID = Intrinsic::x86_avx512_vpermi2var_pd_512;
1655 else if (VecWidth == 512 && EltWidth == 64 && !IsFloat)
1656 IID = Intrinsic::x86_avx512_vpermi2var_q_512;
1657 else if (VecWidth == 128 && EltWidth == 16)
1658 IID = Intrinsic::x86_avx512_vpermi2var_hi_128;
1659 else if (VecWidth == 256 && EltWidth == 16)
1660 IID = Intrinsic::x86_avx512_vpermi2var_hi_256;
1661 else if (VecWidth == 512 && EltWidth == 16)
1662 IID = Intrinsic::x86_avx512_vpermi2var_hi_512;
1663 else if (VecWidth == 128 && EltWidth == 8)
1664 IID = Intrinsic::x86_avx512_vpermi2var_qi_128;
1665 else if (VecWidth == 256 && EltWidth == 8)
1666 IID = Intrinsic::x86_avx512_vpermi2var_qi_256;
1667 else if (VecWidth == 512 && EltWidth == 8)
1668 IID = Intrinsic::x86_avx512_vpermi2var_qi_512;
1704 bool IsRotateRight) {
1713 unsigned NumElts = cast<FixedVectorType>(Ty)->getNumElements();
1718 Intrinsic::ID IID = IsRotateRight ? Intrinsic::fshr : Intrinsic::fshl;
1739 Pred = IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
1742 Pred = IsSigned ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
1745 Pred = IsSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
1748 Pred = IsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
1751 Pred = ICmpInst::ICMP_EQ;
1754 Pred = ICmpInst::ICMP_NE;
1770 bool IsShiftRight,
bool ZeroMask) {
1783 unsigned NumElts = cast<FixedVectorType>(Ty)->getNumElements();
1788 Intrinsic::ID IID = IsShiftRight ? Intrinsic::fshr : Intrinsic::fshl;
1808 const Align Alignment =
1810 ?
Align(Data->getType()->getPrimitiveSizeInBits().getFixedValue() / 8)
1814 if (
const auto *
C = dyn_cast<Constant>(Mask))
1815 if (
C->isAllOnesValue())
1819 unsigned NumElts = cast<FixedVectorType>(Data->getType())->getNumElements();
1829 const Align Alignment =
1837 if (
const auto *
C = dyn_cast<Constant>(Mask))
1838 if (
C->isAllOnesValue())
1842 unsigned NumElts = cast<FixedVectorType>(ValTy)->getNumElements();
1866 Constant *ShiftAmt = ConstantInt::get(Ty, 32);
1873 Constant *Mask = ConstantInt::get(Ty, 0xffffffff);
1889 unsigned NumElts = cast<FixedVectorType>(Vec->
getType())->getNumElements();
1891 const auto *
C = dyn_cast<Constant>(Mask);
1892 if (!
C || !
C->isAllOnesValue())
1898 for (
unsigned i = 0; i != NumElts; ++i)
1900 for (
unsigned i = NumElts; i != 8; ++i)
1901 Indices[i] = NumElts + i % NumElts;
1912 unsigned NumElts = cast<FixedVectorType>(Op0->
getType())->getNumElements();
1918 }
else if (
CC == 7) {
1925 case 0: Pred = ICmpInst::ICMP_EQ;
break;
1926 case 1: Pred =
Signed ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
break;
1927 case 2: Pred =
Signed ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
break;
1928 case 4: Pred = ICmpInst::ICMP_NE;
break;
1929 case 5: Pred =
Signed ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
break;
1930 case 6: Pred =
Signed ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
break;
1966 unsigned NumElts = cast<FixedVectorType>(CI.
getType())->getNumElements();
1968 return Builder.
CreateSExt(Mask, ReturnOp,
"vpmovm2");
1979 if (
Name.starts_with(
"max.p")) {
1980 if (VecWidth == 128 && EltWidth == 32)
1981 IID = Intrinsic::x86_sse_max_ps;
1982 else if (VecWidth == 128 && EltWidth == 64)
1983 IID = Intrinsic::x86_sse2_max_pd;
1984 else if (VecWidth == 256 && EltWidth == 32)
1985 IID = Intrinsic::x86_avx_max_ps_256;
1986 else if (VecWidth == 256 && EltWidth == 64)
1987 IID = Intrinsic::x86_avx_max_pd_256;
1990 }
else if (
Name.starts_with(
"min.p")) {
1991 if (VecWidth == 128 && EltWidth == 32)
1992 IID = Intrinsic::x86_sse_min_ps;
1993 else if (VecWidth == 128 && EltWidth == 64)
1994 IID = Intrinsic::x86_sse2_min_pd;
1995 else if (VecWidth == 256 && EltWidth == 32)
1996 IID = Intrinsic::x86_avx_min_ps_256;
1997 else if (VecWidth == 256 && EltWidth == 64)
1998 IID = Intrinsic::x86_avx_min_pd_256;
2001 }
else if (
Name.starts_with(
"pshuf.b.")) {
2002 if (VecWidth == 128)
2003 IID = Intrinsic::x86_ssse3_pshuf_b_128;
2004 else if (VecWidth == 256)
2005 IID = Intrinsic::x86_avx2_pshuf_b;
2006 else if (VecWidth == 512)
2007 IID = Intrinsic::x86_avx512_pshuf_b_512;
2010 }
else if (
Name.starts_with(
"pmul.hr.sw.")) {
2011 if (VecWidth == 128)
2012 IID = Intrinsic::x86_ssse3_pmul_hr_sw_128;
2013 else if (VecWidth == 256)
2014 IID = Intrinsic::x86_avx2_pmul_hr_sw;
2015 else if (VecWidth == 512)
2016 IID = Intrinsic::x86_avx512_pmul_hr_sw_512;
2019 }
else if (
Name.starts_with(
"pmulh.w.")) {
2020 if (VecWidth == 128)
2021 IID = Intrinsic::x86_sse2_pmulh_w;
2022 else if (VecWidth == 256)
2023 IID = Intrinsic::x86_avx2_pmulh_w;
2024 else if (VecWidth == 512)
2025 IID = Intrinsic::x86_avx512_pmulh_w_512;
2028 }
else if (
Name.starts_with(
"pmulhu.w.")) {
2029 if (VecWidth == 128)
2030 IID = Intrinsic::x86_sse2_pmulhu_w;
2031 else if (VecWidth == 256)
2032 IID = Intrinsic::x86_avx2_pmulhu_w;
2033 else if (VecWidth == 512)
2034 IID = Intrinsic::x86_avx512_pmulhu_w_512;
2037 }
else if (
Name.starts_with(
"pmaddw.d.")) {
2038 if (VecWidth == 128)
2039 IID = Intrinsic::x86_sse2_pmadd_wd;
2040 else if (VecWidth == 256)
2041 IID = Intrinsic::x86_avx2_pmadd_wd;
2042 else if (VecWidth == 512)
2043 IID = Intrinsic::x86_avx512_pmaddw_d_512;
2046 }
else if (
Name.starts_with(
"pmaddubs.w.")) {
2047 if (VecWidth == 128)
2048 IID = Intrinsic::x86_ssse3_pmadd_ub_sw_128;
2049 else if (VecWidth == 256)
2050 IID = Intrinsic::x86_avx2_pmadd_ub_sw;
2051 else if (VecWidth == 512)
2052 IID = Intrinsic::x86_avx512_pmaddubs_w_512;
2055 }
else if (
Name.starts_with(
"packsswb.")) {
2056 if (VecWidth == 128)
2057 IID = Intrinsic::x86_sse2_packsswb_128;
2058 else if (VecWidth == 256)
2059 IID = Intrinsic::x86_avx2_packsswb;
2060 else if (VecWidth == 512)
2061 IID = Intrinsic::x86_avx512_packsswb_512;
2064 }
else if (
Name.starts_with(
"packssdw.")) {
2065 if (VecWidth == 128)
2066 IID = Intrinsic::x86_sse2_packssdw_128;
2067 else if (VecWidth == 256)
2068 IID = Intrinsic::x86_avx2_packssdw;
2069 else if (VecWidth == 512)
2070 IID = Intrinsic::x86_avx512_packssdw_512;
2073 }
else if (
Name.starts_with(
"packuswb.")) {
2074 if (VecWidth == 128)
2075 IID = Intrinsic::x86_sse2_packuswb_128;
2076 else if (VecWidth == 256)
2077 IID = Intrinsic::x86_avx2_packuswb;
2078 else if (VecWidth == 512)
2079 IID = Intrinsic::x86_avx512_packuswb_512;
2082 }
else if (
Name.starts_with(
"packusdw.")) {
2083 if (VecWidth == 128)
2084 IID = Intrinsic::x86_sse41_packusdw;
2085 else if (VecWidth == 256)
2086 IID = Intrinsic::x86_avx2_packusdw;
2087 else if (VecWidth == 512)
2088 IID = Intrinsic::x86_avx512_packusdw_512;
2091 }
else if (
Name.starts_with(
"vpermilvar.")) {
2092 if (VecWidth == 128 && EltWidth == 32)
2093 IID = Intrinsic::x86_avx_vpermilvar_ps;
2094 else if (VecWidth == 128 && EltWidth == 64)
2095 IID = Intrinsic::x86_avx_vpermilvar_pd;
2096 else if (VecWidth == 256 && EltWidth == 32)
2097 IID = Intrinsic::x86_avx_vpermilvar_ps_256;
2098 else if (VecWidth == 256 && EltWidth == 64)
2099 IID = Intrinsic::x86_avx_vpermilvar_pd_256;
2100 else if (VecWidth == 512 && EltWidth == 32)
2101 IID = Intrinsic::x86_avx512_vpermilvar_ps_512;
2102 else if (VecWidth == 512 && EltWidth == 64)
2103 IID = Intrinsic::x86_avx512_vpermilvar_pd_512;
2106 }
else if (
Name ==
"cvtpd2dq.256") {
2107 IID = Intrinsic::x86_avx_cvt_pd2dq_256;
2108 }
else if (
Name ==
"cvtpd2ps.256") {
2109 IID = Intrinsic::x86_avx_cvt_pd2_ps_256;
2110 }
else if (
Name ==
"cvttpd2dq.256") {
2111 IID = Intrinsic::x86_avx_cvtt_pd2dq_256;
2112 }
else if (
Name ==
"cvttps2dq.128") {
2113 IID = Intrinsic::x86_sse2_cvttps2dq;
2114 }
else if (
Name ==
"cvttps2dq.256") {
2115 IID = Intrinsic::x86_avx_cvtt_ps2dq_256;
2116 }
else if (
Name.starts_with(
"permvar.")) {
2118 if (VecWidth == 256 && EltWidth == 32 && IsFloat)
2119 IID = Intrinsic::x86_avx2_permps;
2120 else if (VecWidth == 256 && EltWidth == 32 && !IsFloat)
2121 IID = Intrinsic::x86_avx2_permd;
2122 else if (VecWidth == 256 && EltWidth == 64 && IsFloat)
2123 IID = Intrinsic::x86_avx512_permvar_df_256;
2124 else if (VecWidth == 256 && EltWidth == 64 && !IsFloat)
2125 IID = Intrinsic::x86_avx512_permvar_di_256;
2126 else if (VecWidth == 512 && EltWidth == 32 && IsFloat)
2127 IID = Intrinsic::x86_avx512_permvar_sf_512;
2128 else if (VecWidth == 512 && EltWidth == 32 && !IsFloat)
2129 IID = Intrinsic::x86_avx512_permvar_si_512;
2130 else if (VecWidth == 512 && EltWidth == 64 && IsFloat)
2131 IID = Intrinsic::x86_avx512_permvar_df_512;
2132 else if (VecWidth == 512 && EltWidth == 64 && !IsFloat)
2133 IID = Intrinsic::x86_avx512_permvar_di_512;
2134 else if (VecWidth == 128 && EltWidth == 16)
2135 IID = Intrinsic::x86_avx512_permvar_hi_128;
2136 else if (VecWidth == 256 && EltWidth == 16)
2137 IID = Intrinsic::x86_avx512_permvar_hi_256;
2138 else if (VecWidth == 512 && EltWidth == 16)
2139 IID = Intrinsic::x86_avx512_permvar_hi_512;
2140 else if (VecWidth == 128 && EltWidth == 8)
2141 IID = Intrinsic::x86_avx512_permvar_qi_128;
2142 else if (VecWidth == 256 && EltWidth == 8)
2143 IID = Intrinsic::x86_avx512_permvar_qi_256;
2144 else if (VecWidth == 512 && EltWidth == 8)
2145 IID = Intrinsic::x86_avx512_permvar_qi_512;
2148 }
else if (
Name.starts_with(
"dbpsadbw.")) {
2149 if (VecWidth == 128)
2150 IID = Intrinsic::x86_avx512_dbpsadbw_128;
2151 else if (VecWidth == 256)
2152 IID = Intrinsic::x86_avx512_dbpsadbw_256;
2153 else if (VecWidth == 512)
2154 IID = Intrinsic::x86_avx512_dbpsadbw_512;
2157 }
else if (
Name.starts_with(
"pmultishift.qb.")) {
2158 if (VecWidth == 128)
2159 IID = Intrinsic::x86_avx512_pmultishift_qb_128;
2160 else if (VecWidth == 256)
2161 IID = Intrinsic::x86_avx512_pmultishift_qb_256;
2162 else if (VecWidth == 512)
2163 IID = Intrinsic::x86_avx512_pmultishift_qb_512;
2166 }
else if (
Name.starts_with(
"conflict.")) {
2167 if (
Name[9] ==
'd' && VecWidth == 128)
2168 IID = Intrinsic::x86_avx512_conflict_d_128;
2169 else if (
Name[9] ==
'd' && VecWidth == 256)
2170 IID = Intrinsic::x86_avx512_conflict_d_256;
2171 else if (
Name[9] ==
'd' && VecWidth == 512)
2172 IID = Intrinsic::x86_avx512_conflict_d_512;
2173 else if (
Name[9] ==
'q' && VecWidth == 128)
2174 IID = Intrinsic::x86_avx512_conflict_q_128;
2175 else if (
Name[9] ==
'q' && VecWidth == 256)
2176 IID = Intrinsic::x86_avx512_conflict_q_256;
2177 else if (
Name[9] ==
'q' && VecWidth == 512)
2178 IID = Intrinsic::x86_avx512_conflict_q_512;
2181 }
else if (
Name.starts_with(
"pavg.")) {
2182 if (
Name[5] ==
'b' && VecWidth == 128)
2183 IID = Intrinsic::x86_sse2_pavg_b;
2184 else if (
Name[5] ==
'b' && VecWidth == 256)
2185 IID = Intrinsic::x86_avx2_pavg_b;
2186 else if (
Name[5] ==
'b' && VecWidth == 512)
2187 IID = Intrinsic::x86_avx512_pavg_b_512;
2188 else if (
Name[5] ==
'w' && VecWidth == 128)
2189 IID = Intrinsic::x86_sse2_pavg_w;
2190 else if (
Name[5] ==
'w' && VecWidth == 256)
2191 IID = Intrinsic::x86_avx2_pavg_w;
2192 else if (
Name[5] ==
'w' && VecWidth == 512)
2193 IID = Intrinsic::x86_avx512_pavg_w_512;
2214 if (AsmStr->find(
"mov\tfp") == 0 &&
2215 AsmStr->find(
"objc_retainAutoreleaseReturnValue") != std::string::npos &&
2216 (Pos = AsmStr->find(
"# marker")) != std::string::npos) {
2217 AsmStr->replace(Pos, 1,
";");
2223 if (
Name ==
"mve.vctp64.old") {
2231 F->getParent(), Intrinsic::arm_mve_pred_v2i,
2232 {VectorType::get(Builder.getInt1Ty(), 2, false)}),
2236 F->getParent(), Intrinsic::arm_mve_pred_i2v,
2237 {VectorType::get(Builder.getInt1Ty(), 4, false)}),
2239 }
else if (
Name ==
"mve.mull.int.predicated.v2i64.v4i32.v4i1" ||
2240 Name ==
"mve.vqdmull.predicated.v2i64.v4i32.v4i1" ||
2241 Name ==
"mve.vldr.gather.base.predicated.v2i64.v2i64.v4i1" ||
2242 Name ==
"mve.vldr.gather.base.wb.predicated.v2i64.v2i64.v4i1" ||
2244 "mve.vldr.gather.offset.predicated.v2i64.p0i64.v2i64.v4i1" ||
2245 Name ==
"mve.vldr.gather.offset.predicated.v2i64.p0.v2i64.v4i1" ||
2246 Name ==
"mve.vstr.scatter.base.predicated.v2i64.v2i64.v4i1" ||
2247 Name ==
"mve.vstr.scatter.base.wb.predicated.v2i64.v2i64.v4i1" ||
2249 "mve.vstr.scatter.offset.predicated.p0i64.v2i64.v2i64.v4i1" ||
2250 Name ==
"mve.vstr.scatter.offset.predicated.p0.v2i64.v2i64.v4i1" ||
2251 Name ==
"cde.vcx1q.predicated.v2i64.v4i1" ||
2252 Name ==
"cde.vcx1qa.predicated.v2i64.v4i1" ||
2253 Name ==
"cde.vcx2q.predicated.v2i64.v4i1" ||
2254 Name ==
"cde.vcx2qa.predicated.v2i64.v4i1" ||
2255 Name ==
"cde.vcx3q.predicated.v2i64.v4i1" ||
2256 Name ==
"cde.vcx3qa.predicated.v2i64.v4i1") {
2257 std::vector<Type *> Tys;
2261 case Intrinsic::arm_mve_mull_int_predicated:
2262 case Intrinsic::arm_mve_vqdmull_predicated:
2263 case Intrinsic::arm_mve_vldr_gather_base_predicated:
2266 case Intrinsic::arm_mve_vldr_gather_base_wb_predicated:
2267 case Intrinsic::arm_mve_vstr_scatter_base_predicated:
2268 case Intrinsic::arm_mve_vstr_scatter_base_wb_predicated:
2272 case Intrinsic::arm_mve_vldr_gather_offset_predicated:
2276 case Intrinsic::arm_mve_vstr_scatter_offset_predicated:
2280 case Intrinsic::arm_cde_vcx1q_predicated:
2281 case Intrinsic::arm_cde_vcx1qa_predicated:
2282 case Intrinsic::arm_cde_vcx2q_predicated:
2283 case Intrinsic::arm_cde_vcx2qa_predicated:
2284 case Intrinsic::arm_cde_vcx3q_predicated:
2285 case Intrinsic::arm_cde_vcx3qa_predicated:
2292 std::vector<Value *> Ops;
2294 Type *Ty =
Op->getType();
2298 F->getParent(), Intrinsic::arm_mve_pred_v2i,
2299 {VectorType::get(Builder.getInt1Ty(), 4, false)}),
2303 Intrinsic::arm_mve_pred_i2v, {V2I1Ty}),
2317 const bool IsInc =
Name.starts_with(
"atomic.inc.");
2318 if (IsInc ||
Name.starts_with(
"atomic.dec.")) {
2333 if (Order == AtomicOrdering::NotAtomic ||
2334 Order == AtomicOrdering::Unordered)
2335 Order = AtomicOrdering::SequentiallyConsistent;
2339 SyncScope::ID SSID =
F->getContext().getOrInsertSyncScopeID(
"agent");
2343 if (!VolatileArg || !VolatileArg->
isZero())
2352template <
typename MDType>
2355 return dyn_cast<MDType>(MAV->getMetadata());
2364 if (
Name ==
"label") {
2366 }
else if (
Name ==
"assign") {
2368 unwrapMAVOp<Metadata>(CI, 0), unwrapMAVOp<DILocalVariable>(CI, 1),
2369 unwrapMAVOp<DIExpression>(CI, 2), unwrapMAVOp<DIAssignID>(CI, 3),
2370 unwrapMAVOp<Metadata>(CI, 4), unwrapMAVOp<DIExpression>(CI, 5),
2372 }
else if (
Name ==
"declare") {
2374 unwrapMAVOp<Metadata>(CI, 0), unwrapMAVOp<DILocalVariable>(CI, 1),
2375 unwrapMAVOp<DIExpression>(CI, 2), CI->
getDebugLoc(),
2376 DbgVariableRecord::LocationType::Declare);
2377 }
else if (
Name ==
"addr") {
2382 unwrapMAVOp<DILocalVariable>(CI, 1), Expr,
2384 }
else if (
Name ==
"value") {
2387 unsigned ExprOp = 2;
2397 unwrapMAVOp<Metadata>(CI, 0), unwrapMAVOp<DILocalVariable>(CI, VarOp),
2398 unwrapMAVOp<DIExpression>(CI, ExprOp), CI->
getDebugLoc());
2400 assert(DR &&
"Unhandled intrinsic kind in upgrade to DbgRecord");
2419 bool FallthroughToDefaultUpgrade =
false;
2423 assert(
Name.starts_with(
"llvm.") &&
"Intrinsic doesn't start with 'llvm.'");
2426 bool IsX86 =
Name.consume_front(
"x86.");
2427 bool IsNVVM =
Name.consume_front(
"nvvm.");
2428 bool IsARM =
Name.consume_front(
"arm.");
2429 bool IsAMDGCN =
Name.consume_front(
"amdgcn.");
2430 bool IsDbg =
Name.consume_front(
"dbg.");
2432 if (IsX86 &&
Name.starts_with(
"sse4a.movnt.")) {
2443 Type *SrcEltTy = cast<VectorType>(Arg1->
getType())->getElementType();
2444 PointerType *EltPtrTy = PointerType::getUnqual(SrcEltTy);
2450 SI->setMetadata(LLVMContext::MD_nontemporal, Node);
2457 if (IsX86 && (
Name.starts_with(
"avx.movnt.") ||
2458 Name.starts_with(
"avx512.storent."))) {
2469 PointerType::getUnqual(Arg1->
getType()),
2474 SI->setMetadata(LLVMContext::MD_nontemporal, Node);
2481 if (IsX86 &&
Name ==
"sse2.storel.dq") {
2489 PointerType::getUnqual(Elt->
getType()),
2498 if (IsX86 && (
Name.starts_with(
"sse.storeu.") ||
2499 Name.starts_with(
"sse2.storeu.") ||
2500 Name.starts_with(
"avx.storeu."))) {
2505 PointerType::getUnqual(Arg1->
getType()),
2514 if (IsX86 &&
Name ==
"avx512.mask.store.ss") {
2524 if (IsX86 &&
Name.starts_with(
"avx512.mask.store")) {
2535 Value *Rep =
nullptr;
2537 if (IsX86 && (
Name.starts_with(
"sse2.pcmp") ||
2538 Name.starts_with(
"avx2.pcmp"))) {
2540 bool CmpEq =
Name[9] ==
'e';
2541 Rep = Builder.
CreateICmp(CmpEq ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_SGT,
2544 }
else if (IsX86 && (
Name.starts_with(
"avx512.broadcastm"))) {
2552 }
else if (IsX86 && (
Name ==
"sse.sqrt.ss" ||
2553 Name ==
"sse2.sqrt.sd")) {
2557 Intrinsic::sqrt, Elt0->
getType());
2560 }
else if (IsX86 && (
Name.starts_with(
"avx.sqrt.p") ||
2561 Name.starts_with(
"sse2.sqrt.p") ||
2562 Name.starts_with(
"sse.sqrt.p"))) {
2566 {CI->getArgOperand(0)});
2567 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.sqrt.p"))) {
2570 cast<ConstantInt>(CI->
getArgOperand(3))->getZExtValue() != 4)) {
2572 : Intrinsic::x86_avx512_sqrt_pd_512;
2581 {CI->getArgOperand(0)});
2585 }
else if (IsX86 && (
Name.starts_with(
"avx512.ptestm") ||
2586 Name.starts_with(
"avx512.ptestnm"))) {
2594 Name.starts_with(
"avx512.ptestm") ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ;
2597 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.pbroadcast"))){
2603 }
else if (IsX86 && (
Name.starts_with(
"avx512.kunpck"))) {
2608 for (
unsigned i = 0; i != NumElts; ++i)
2621 }
else if (IsX86 &&
Name ==
"avx512.kand.w") {
2626 }
else if (IsX86 &&
Name ==
"avx512.kandn.w") {
2632 }
else if (IsX86 &&
Name ==
"avx512.kor.w") {
2637 }
else if (IsX86 &&
Name ==
"avx512.kxor.w") {
2642 }
else if (IsX86 &&
Name ==
"avx512.kxnor.w") {
2648 }
else if (IsX86 &&
Name ==
"avx512.knot.w") {
2653 (
Name ==
"avx512.kortestz.w" ||
Name ==
"avx512.kortestc.w")) {
2659 if (
Name[14] ==
'c')
2660 C = ConstantInt::getAllOnesValue(Builder.
getInt16Ty());
2662 C = ConstantInt::getNullValue(Builder.
getInt16Ty());
2665 }
else if (IsX86 && (
Name ==
"sse.add.ss" ||
Name ==
"sse2.add.sd" ||
2666 Name ==
"sse.sub.ss" ||
Name ==
"sse2.sub.sd" ||
2667 Name ==
"sse.mul.ss" ||
Name ==
"sse2.mul.sd" ||
2668 Name ==
"sse.div.ss" ||
Name ==
"sse2.div.sd")) {
2671 ConstantInt::get(I32Ty, 0));
2673 ConstantInt::get(I32Ty, 0));
2675 if (
Name.contains(
".add."))
2677 else if (
Name.contains(
".sub."))
2679 else if (
Name.contains(
".mul."))
2684 ConstantInt::get(I32Ty, 0));
2685 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.pcmp")) {
2687 bool CmpEq =
Name[16] ==
'e';
2689 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.vpshufbitqmb.")) {
2695 case 128: IID = Intrinsic::x86_avx512_vpshufbitqmb_128;
break;
2696 case 256: IID = Intrinsic::x86_avx512_vpshufbitqmb_256;
break;
2697 case 512: IID = Intrinsic::x86_avx512_vpshufbitqmb_512;
break;
2701 { CI->getOperand(0), CI->getArgOperand(1) });
2703 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.fpclass.p")) {
2708 if (VecWidth == 128 && EltWidth == 32)
2709 IID = Intrinsic::x86_avx512_fpclass_ps_128;
2710 else if (VecWidth == 256 && EltWidth == 32)
2711 IID = Intrinsic::x86_avx512_fpclass_ps_256;
2712 else if (VecWidth == 512 && EltWidth == 32)
2713 IID = Intrinsic::x86_avx512_fpclass_ps_512;
2714 else if (VecWidth == 128 && EltWidth == 64)
2715 IID = Intrinsic::x86_avx512_fpclass_pd_128;
2716 else if (VecWidth == 256 && EltWidth == 64)
2717 IID = Intrinsic::x86_avx512_fpclass_pd_256;
2718 else if (VecWidth == 512 && EltWidth == 64)
2719 IID = Intrinsic::x86_avx512_fpclass_pd_512;
2724 { CI->getOperand(0), CI->getArgOperand(1) });
2726 }
else if (IsX86 &&
Name.starts_with(
"avx512.cmp.p")) {
2728 Type *OpTy = Args[0]->getType();
2732 if (VecWidth == 128 && EltWidth == 32)
2733 IID = Intrinsic::x86_avx512_mask_cmp_ps_128;
2734 else if (VecWidth == 256 && EltWidth == 32)
2735 IID = Intrinsic::x86_avx512_mask_cmp_ps_256;
2736 else if (VecWidth == 512 && EltWidth == 32)
2737 IID = Intrinsic::x86_avx512_mask_cmp_ps_512;
2738 else if (VecWidth == 128 && EltWidth == 64)
2739 IID = Intrinsic::x86_avx512_mask_cmp_pd_128;
2740 else if (VecWidth == 256 && EltWidth == 64)
2741 IID = Intrinsic::x86_avx512_mask_cmp_pd_256;
2742 else if (VecWidth == 512 && EltWidth == 64)
2743 IID = Intrinsic::x86_avx512_mask_cmp_pd_512;
2748 if (VecWidth == 512)
2750 Args.push_back(Mask);
2754 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.cmp.")) {
2756 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
2758 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.ucmp.")) {
2759 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
2761 }
else if (IsX86 && (
Name.starts_with(
"avx512.cvtb2mask.") ||
2762 Name.starts_with(
"avx512.cvtw2mask.") ||
2763 Name.starts_with(
"avx512.cvtd2mask.") ||
2764 Name.starts_with(
"avx512.cvtq2mask."))) {
2767 Rep = Builder.
CreateICmp(ICmpInst::ICMP_SLT,
Op, Zero);
2769 }
else if(IsX86 && (
Name ==
"ssse3.pabs.b.128" ||
2770 Name ==
"ssse3.pabs.w.128" ||
2771 Name ==
"ssse3.pabs.d.128" ||
2772 Name.starts_with(
"avx2.pabs") ||
2773 Name.starts_with(
"avx512.mask.pabs"))) {
2775 }
else if (IsX86 && (
Name ==
"sse41.pmaxsb" ||
2776 Name ==
"sse2.pmaxs.w" ||
2777 Name ==
"sse41.pmaxsd" ||
2778 Name.starts_with(
"avx2.pmaxs") ||
2779 Name.starts_with(
"avx512.mask.pmaxs"))) {
2781 }
else if (IsX86 && (
Name ==
"sse2.pmaxu.b" ||
2782 Name ==
"sse41.pmaxuw" ||
2783 Name ==
"sse41.pmaxud" ||
2784 Name.starts_with(
"avx2.pmaxu") ||
2785 Name.starts_with(
"avx512.mask.pmaxu"))) {
2787 }
else if (IsX86 && (
Name ==
"sse41.pminsb" ||
2788 Name ==
"sse2.pmins.w" ||
2789 Name ==
"sse41.pminsd" ||
2790 Name.starts_with(
"avx2.pmins") ||
2791 Name.starts_with(
"avx512.mask.pmins"))) {
2793 }
else if (IsX86 && (
Name ==
"sse2.pminu.b" ||
2794 Name ==
"sse41.pminuw" ||
2795 Name ==
"sse41.pminud" ||
2796 Name.starts_with(
"avx2.pminu") ||
2797 Name.starts_with(
"avx512.mask.pminu"))) {
2799 }
else if (IsX86 && (
Name ==
"sse2.pmulu.dq" ||
2800 Name ==
"avx2.pmulu.dq" ||
2801 Name ==
"avx512.pmulu.dq.512" ||
2802 Name.starts_with(
"avx512.mask.pmulu.dq."))) {
2804 }
else if (IsX86 && (
Name ==
"sse41.pmuldq" ||
2805 Name ==
"avx2.pmul.dq" ||
2806 Name ==
"avx512.pmul.dq.512" ||
2807 Name.starts_with(
"avx512.mask.pmul.dq."))) {
2809 }
else if (IsX86 && (
Name ==
"sse.cvtsi2ss" ||
2810 Name ==
"sse2.cvtsi2sd" ||
2811 Name ==
"sse.cvtsi642ss" ||
2812 Name ==
"sse2.cvtsi642sd")) {
2815 cast<VectorType>(CI->
getType())->getElementType());
2817 }
else if (IsX86 &&
Name ==
"avx512.cvtusi2sd") {
2820 cast<VectorType>(CI->
getType())->getElementType());
2822 }
else if (IsX86 &&
Name ==
"sse2.cvtss2sd") {
2825 Rep, cast<VectorType>(CI->
getType())->getElementType());
2827 }
else if (IsX86 && (
Name ==
"sse2.cvtdq2pd" ||
2828 Name ==
"sse2.cvtdq2ps" ||
2829 Name ==
"avx.cvtdq2.pd.256" ||
2830 Name ==
"avx.cvtdq2.ps.256" ||
2831 Name.starts_with(
"avx512.mask.cvtdq2pd.") ||
2832 Name.starts_with(
"avx512.mask.cvtudq2pd.") ||
2833 Name.starts_with(
"avx512.mask.cvtdq2ps.") ||
2834 Name.starts_with(
"avx512.mask.cvtudq2ps.") ||
2835 Name.starts_with(
"avx512.mask.cvtqq2pd.") ||
2836 Name.starts_with(
"avx512.mask.cvtuqq2pd.") ||
2837 Name ==
"avx512.mask.cvtqq2ps.256" ||
2838 Name ==
"avx512.mask.cvtqq2ps.512" ||
2839 Name ==
"avx512.mask.cvtuqq2ps.256" ||
2840 Name ==
"avx512.mask.cvtuqq2ps.512" ||
2841 Name ==
"sse2.cvtps2pd" ||
2842 Name ==
"avx.cvt.ps2.pd.256" ||
2843 Name ==
"avx512.mask.cvtps2pd.128" ||
2844 Name ==
"avx512.mask.cvtps2pd.256")) {
2845 auto *DstTy = cast<FixedVectorType>(CI->
getType());
2847 auto *SrcTy = cast<FixedVectorType>(Rep->
getType());
2849 unsigned NumDstElts = DstTy->getNumElements();
2850 if (NumDstElts < SrcTy->getNumElements()) {
2851 assert(NumDstElts == 2 &&
"Unexpected vector size");
2855 bool IsPS2PD = SrcTy->getElementType()->isFloatTy();
2856 bool IsUnsigned =
Name.contains(
"cvtu");
2858 Rep = Builder.
CreateFPExt(Rep, DstTy,
"cvtps2pd");
2861 cast<ConstantInt>(CI->
getArgOperand(3))->getZExtValue() != 4)) {
2862 Intrinsic::ID IID = IsUnsigned ? Intrinsic::x86_avx512_uitofp_round
2863 : Intrinsic::x86_avx512_sitofp_round;
2868 Rep = IsUnsigned ? Builder.
CreateUIToFP(Rep, DstTy,
"cvt")
2875 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vcvtph2ps.") ||
2876 Name.starts_with(
"vcvtph2ps."))) {
2877 auto *DstTy = cast<FixedVectorType>(CI->
getType());
2879 auto *SrcTy = cast<FixedVectorType>(Rep->
getType());
2880 unsigned NumDstElts = DstTy->getNumElements();
2881 if (NumDstElts != SrcTy->getNumElements()) {
2882 assert(NumDstElts == 4 &&
"Unexpected vector size");
2887 Rep = Builder.
CreateFPExt(Rep, DstTy,
"cvtph2ps");
2891 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.load")) {
2897 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.expand.load.")) {
2898 auto *ResultTy = cast<FixedVectorType>(CI->
getType());
2899 Type *PtrTy = ResultTy->getElementType();
2906 ResultTy->getNumElements());
2909 Intrinsic::masked_expandload,
2912 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.compress.store.")) {
2914 Type *PtrTy = ResultTy->getElementType();
2922 cast<FixedVectorType>(ResultTy)->getNumElements());
2925 Intrinsic::masked_compressstore,
2928 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.compress.") ||
2929 Name.starts_with(
"avx512.mask.expand."))) {
2930 auto *ResultTy = cast<FixedVectorType>(CI->
getType());
2933 ResultTy->getNumElements());
2935 bool IsCompress =
Name[12] ==
'c';
2936 Intrinsic::ID IID = IsCompress ? Intrinsic::x86_avx512_mask_compress
2937 : Intrinsic::x86_avx512_mask_expand;
2941 }
else if (IsX86 &&
Name.starts_with(
"xop.vpcom")) {
2943 if (
Name.ends_with(
"ub") ||
Name.ends_with(
"uw") ||
Name.ends_with(
"ud") ||
2944 Name.ends_with(
"uq"))
2946 else if (
Name.ends_with(
"b") ||
Name.ends_with(
"w") ||
Name.ends_with(
"d") ||
2947 Name.ends_with(
"q"))
2954 Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
2957 if (
Name.starts_with(
"lt"))
2959 else if (
Name.starts_with(
"le"))
2961 else if (
Name.starts_with(
"gt"))
2963 else if (
Name.starts_with(
"ge"))
2965 else if (
Name.starts_with(
"eq"))
2967 else if (
Name.starts_with(
"ne"))
2969 else if (
Name.starts_with(
"false"))
2971 else if (
Name.starts_with(
"true"))
2978 }
else if (IsX86 &&
Name.starts_with(
"xop.vpcmov")) {
2983 Rep = Builder.
CreateOr(Sel0, Sel1);
2984 }
else if (IsX86 && (
Name.starts_with(
"xop.vprot") ||
2985 Name.starts_with(
"avx512.prol") ||
2986 Name.starts_with(
"avx512.mask.prol"))) {
2988 }
else if (IsX86 && (
Name.starts_with(
"avx512.pror") ||
2989 Name.starts_with(
"avx512.mask.pror"))) {
2991 }
else if (IsX86 && (
Name.starts_with(
"avx512.vpshld.") ||
2992 Name.starts_with(
"avx512.mask.vpshld") ||
2993 Name.starts_with(
"avx512.maskz.vpshld"))) {
2994 bool ZeroMask =
Name[11] ==
'z';
2996 }
else if (IsX86 && (
Name.starts_with(
"avx512.vpshrd.") ||
2997 Name.starts_with(
"avx512.mask.vpshrd") ||
2998 Name.starts_with(
"avx512.maskz.vpshrd"))) {
2999 bool ZeroMask =
Name[11] ==
'z';
3001 }
else if (IsX86 &&
Name ==
"sse42.crc32.64.8") {
3003 Intrinsic::x86_sse42_crc32_32_8);
3007 }
else if (IsX86 && (
Name.starts_with(
"avx.vbroadcast.s") ||
3008 Name.starts_with(
"avx512.vbroadcast.s"))) {
3010 auto *VecTy = cast<FixedVectorType>(CI->
getType());
3011 Type *EltTy = VecTy->getElementType();
3012 unsigned EltNum = VecTy->getNumElements();
3016 for (
unsigned I = 0;
I < EltNum; ++
I)
3018 ConstantInt::get(I32Ty,
I));
3019 }
else if (IsX86 && (
Name.starts_with(
"sse41.pmovsx") ||
3020 Name.starts_with(
"sse41.pmovzx") ||
3021 Name.starts_with(
"avx2.pmovsx") ||
3022 Name.starts_with(
"avx2.pmovzx") ||
3023 Name.starts_with(
"avx512.mask.pmovsx") ||
3024 Name.starts_with(
"avx512.mask.pmovzx"))) {
3025 auto *DstTy = cast<FixedVectorType>(CI->
getType());
3026 unsigned NumDstElts = DstTy->getNumElements();
3030 for (
unsigned i = 0; i != NumDstElts; ++i)
3036 bool DoSext =
Name.contains(
"pmovsx");
3043 }
else if (
Name ==
"avx512.mask.pmov.qd.256" ||
3044 Name ==
"avx512.mask.pmov.qd.512" ||
3045 Name ==
"avx512.mask.pmov.wb.256" ||
3046 Name ==
"avx512.mask.pmov.wb.512") {
3051 }
else if (IsX86 && (
Name.starts_with(
"avx.vbroadcastf128") ||
3052 Name ==
"avx2.vbroadcasti128")) {
3054 Type *EltTy = cast<VectorType>(CI->
getType())->getElementType();
3058 PointerType::getUnqual(VT));
3060 if (NumSrcElts == 2)
3065 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.shuf.i") ||
3066 Name.starts_with(
"avx512.mask.shuf.f"))) {
3067 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3071 unsigned ControlBitsMask = NumLanes - 1;
3072 unsigned NumControlBits = NumLanes / 2;
3075 for (
unsigned l = 0; l != NumLanes; ++l) {
3076 unsigned LaneMask = (Imm >> (l * NumControlBits)) & ControlBitsMask;
3078 if (l >= NumLanes / 2)
3079 LaneMask += NumLanes;
3080 for (
unsigned i = 0; i != NumElementsInLane; ++i)
3081 ShuffleMask.
push_back(LaneMask * NumElementsInLane + i);
3087 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.broadcastf") ||
3088 Name.starts_with(
"avx512.mask.broadcasti"))) {
3089 unsigned NumSrcElts =
3092 unsigned NumDstElts =
3093 cast<FixedVectorType>(CI->
getType())->getNumElements();
3096 for (
unsigned i = 0; i != NumDstElts; ++i)
3097 ShuffleMask[i] = i % NumSrcElts;
3104 }
else if (IsX86 && (
Name.starts_with(
"avx2.pbroadcast") ||
3105 Name.starts_with(
"avx2.vbroadcast") ||
3106 Name.starts_with(
"avx512.pbroadcast") ||
3107 Name.starts_with(
"avx512.mask.broadcast.s"))) {
3119 }
else if (IsX86 && (
Name.starts_with(
"sse2.padds.") ||
3120 Name.starts_with(
"avx2.padds.") ||
3121 Name.starts_with(
"avx512.padds.") ||
3122 Name.starts_with(
"avx512.mask.padds."))) {
3124 }
else if (IsX86 && (
Name.starts_with(
"sse2.psubs.") ||
3125 Name.starts_with(
"avx2.psubs.") ||
3126 Name.starts_with(
"avx512.psubs.") ||
3127 Name.starts_with(
"avx512.mask.psubs."))) {
3129 }
else if (IsX86 && (
Name.starts_with(
"sse2.paddus.") ||
3130 Name.starts_with(
"avx2.paddus.") ||
3131 Name.starts_with(
"avx512.mask.paddus."))) {
3133 }
else if (IsX86 && (
Name.starts_with(
"sse2.psubus.") ||
3134 Name.starts_with(
"avx2.psubus.") ||
3135 Name.starts_with(
"avx512.mask.psubus."))) {
3137 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.palignr.")) {
3142 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.valign.")) {
3147 }
else if (IsX86 && (
Name ==
"sse2.psll.dq" ||
3148 Name ==
"avx2.psll.dq")) {
3150 unsigned Shift = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3153 }
else if (IsX86 && (
Name ==
"sse2.psrl.dq" ||
3154 Name ==
"avx2.psrl.dq")) {
3156 unsigned Shift = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3159 }
else if (IsX86 && (
Name ==
"sse2.psll.dq.bs" ||
3160 Name ==
"avx2.psll.dq.bs" ||
3161 Name ==
"avx512.psll.dq.512")) {
3163 unsigned Shift = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3165 }
else if (IsX86 && (
Name ==
"sse2.psrl.dq.bs" ||
3166 Name ==
"avx2.psrl.dq.bs" ||
3167 Name ==
"avx512.psrl.dq.512")) {
3169 unsigned Shift = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3171 }
else if (IsX86 && (
Name ==
"sse41.pblendw" ||
3172 Name.starts_with(
"sse41.blendp") ||
3173 Name.starts_with(
"avx.blend.p") ||
3174 Name ==
"avx2.pblendw" ||
3175 Name.starts_with(
"avx2.pblendd."))) {
3178 unsigned Imm = cast <ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3179 auto *VecTy = cast<FixedVectorType>(CI->
getType());
3180 unsigned NumElts = VecTy->getNumElements();
3183 for (
unsigned i = 0; i != NumElts; ++i)
3184 Idxs[i] = ((Imm >> (i%8)) & 1) ? i + NumElts : i;
3187 }
else if (IsX86 && (
Name.starts_with(
"avx.vinsertf128.") ||
3188 Name ==
"avx2.vinserti128" ||
3189 Name.starts_with(
"avx512.mask.insert"))) {
3192 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3193 unsigned DstNumElts =
3194 cast<FixedVectorType>(CI->
getType())->getNumElements();
3195 unsigned SrcNumElts =
3196 cast<FixedVectorType>(Op1->
getType())->getNumElements();
3197 unsigned Scale = DstNumElts / SrcNumElts;
3204 for (
unsigned i = 0; i != SrcNumElts; ++i)
3206 for (
unsigned i = SrcNumElts; i != DstNumElts; ++i)
3207 Idxs[i] = SrcNumElts;
3222 for (
unsigned i = 0; i != DstNumElts; ++i)
3225 for (
unsigned i = 0; i != SrcNumElts; ++i)
3226 Idxs[i + Imm * SrcNumElts] = i + DstNumElts;
3233 }
else if (IsX86 && (
Name.starts_with(
"avx.vextractf128.") ||
3234 Name ==
"avx2.vextracti128" ||
3235 Name.starts_with(
"avx512.mask.vextract"))) {
3237 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3238 unsigned DstNumElts =
3239 cast<FixedVectorType>(CI->
getType())->getNumElements();
3240 unsigned SrcNumElts =
3241 cast<FixedVectorType>(Op0->
getType())->getNumElements();
3242 unsigned Scale = SrcNumElts / DstNumElts;
3249 for (
unsigned i = 0; i != DstNumElts; ++i) {
3250 Idxs[i] = i + (Imm * DstNumElts);
3258 }
else if (!IsX86 &&
Name ==
"stackprotectorcheck") {
3260 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.perm.df.") ||
3261 Name.starts_with(
"avx512.mask.perm.di."))) {
3263 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3264 auto *VecTy = cast<FixedVectorType>(CI->
getType());
3265 unsigned NumElts = VecTy->getNumElements();
3268 for (
unsigned i = 0; i != NumElts; ++i)
3269 Idxs[i] = (i & ~0x3) + ((Imm >> (2 * (i & 0x3))) & 3);
3276 }
else if (IsX86 && (
Name.starts_with(
"avx.vperm2f128.") ||
3277 Name ==
"avx2.vperm2i128")) {
3286 uint8_t Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3288 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3289 unsigned HalfSize = NumElts / 2;
3301 unsigned StartIndex = (Imm & 0x01) ? HalfSize : 0;
3302 for (
unsigned i = 0; i < HalfSize; ++i)
3303 ShuffleMask[i] = StartIndex + i;
3306 StartIndex = (Imm & 0x10) ? HalfSize : 0;
3307 for (
unsigned i = 0; i < HalfSize; ++i)
3308 ShuffleMask[i + HalfSize] = NumElts + StartIndex + i;
3312 }
else if (IsX86 && (
Name.starts_with(
"avx.vpermil.") ||
3313 Name ==
"sse2.pshuf.d" ||
3314 Name.starts_with(
"avx512.mask.vpermil.p") ||
3315 Name.starts_with(
"avx512.mask.pshuf.d."))) {
3317 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3318 auto *VecTy = cast<FixedVectorType>(CI->
getType());
3319 unsigned NumElts = VecTy->getNumElements();
3321 unsigned IdxSize = 64 / VecTy->getScalarSizeInBits();
3322 unsigned IdxMask = ((1 << IdxSize) - 1);
3328 for (
unsigned i = 0; i != NumElts; ++i)
3329 Idxs[i] = ((Imm >> ((i * IdxSize) % 8)) & IdxMask) | (i & ~IdxMask);
3336 }
else if (IsX86 && (
Name ==
"sse2.pshufl.w" ||
3337 Name.starts_with(
"avx512.mask.pshufl.w."))) {
3339 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3340 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3343 for (
unsigned l = 0; l != NumElts; l += 8) {
3344 for (
unsigned i = 0; i != 4; ++i)
3345 Idxs[i + l] = ((Imm >> (2 * i)) & 0x3) + l;
3346 for (
unsigned i = 4; i != 8; ++i)
3347 Idxs[i + l] = i + l;
3355 }
else if (IsX86 && (
Name ==
"sse2.pshufh.w" ||
3356 Name.starts_with(
"avx512.mask.pshufh.w."))) {
3358 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3359 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3362 for (
unsigned l = 0; l != NumElts; l += 8) {
3363 for (
unsigned i = 0; i != 4; ++i)
3364 Idxs[i + l] = i + l;
3365 for (
unsigned i = 0; i != 4; ++i)
3366 Idxs[i + l + 4] = ((Imm >> (2 * i)) & 0x3) + 4 + l;
3374 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.shuf.p")) {
3377 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3378 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3381 unsigned HalfLaneElts = NumLaneElts / 2;
3384 for (
unsigned i = 0; i != NumElts; ++i) {
3386 Idxs[i] = i - (i % NumLaneElts);
3388 if ((i % NumLaneElts) >= HalfLaneElts)
3392 Idxs[i] += (Imm >> ((i * HalfLaneElts) % 8)) & ((1 << HalfLaneElts) - 1);
3399 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.movddup") ||
3400 Name.starts_with(
"avx512.mask.movshdup") ||
3401 Name.starts_with(
"avx512.mask.movsldup"))) {
3403 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3407 if (
Name.starts_with(
"avx512.mask.movshdup."))
3411 for (
unsigned l = 0; l != NumElts; l += NumLaneElts)
3412 for (
unsigned i = 0; i != NumLaneElts; i += 2) {
3413 Idxs[i + l + 0] = i + l +
Offset;
3414 Idxs[i + l + 1] = i + l +
Offset;
3421 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.punpckl") ||
3422 Name.starts_with(
"avx512.mask.unpckl."))) {
3425 int NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3429 for (
int l = 0; l != NumElts; l += NumLaneElts)
3430 for (
int i = 0; i != NumLaneElts; ++i)
3431 Idxs[i + l] = l + (i / 2) + NumElts * (i % 2);
3437 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.punpckh") ||
3438 Name.starts_with(
"avx512.mask.unpckh."))) {
3441 int NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3445 for (
int l = 0; l != NumElts; l += NumLaneElts)
3446 for (
int i = 0; i != NumLaneElts; ++i)
3447 Idxs[i + l] = (NumLaneElts / 2) + l + (i / 2) + NumElts * (i % 2);
3453 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.and.") ||
3454 Name.starts_with(
"avx512.mask.pand."))) {
3456 VectorType *ITy = VectorType::getInteger(FTy);
3462 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.andn.") ||
3463 Name.starts_with(
"avx512.mask.pandn."))) {
3465 VectorType *ITy = VectorType::getInteger(FTy);
3472 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.or.") ||
3473 Name.starts_with(
"avx512.mask.por."))) {
3475 VectorType *ITy = VectorType::getInteger(FTy);
3481 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.xor.") ||
3482 Name.starts_with(
"avx512.mask.pxor."))) {
3484 VectorType *ITy = VectorType::getInteger(FTy);
3490 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.padd.")) {
3494 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.psub.")) {
3498 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.pmull.")) {
3502 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.add.p")) {
3503 if (
Name.ends_with(
".512")) {
3505 if (
Name[17] ==
's')
3506 IID = Intrinsic::x86_avx512_add_ps_512;
3508 IID = Intrinsic::x86_avx512_add_pd_512;
3511 { CI->getArgOperand(0), CI->getArgOperand(1),
3512 CI->getArgOperand(4) });
3518 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.div.p")) {
3519 if (
Name.ends_with(
".512")) {
3521 if (
Name[17] ==
's')
3522 IID = Intrinsic::x86_avx512_div_ps_512;
3524 IID = Intrinsic::x86_avx512_div_pd_512;
3527 { CI->getArgOperand(0), CI->getArgOperand(1),
3528 CI->getArgOperand(4) });
3534 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.mul.p")) {
3535 if (
Name.ends_with(
".512")) {
3537 if (
Name[17] ==
's')
3538 IID = Intrinsic::x86_avx512_mul_ps_512;
3540 IID = Intrinsic::x86_avx512_mul_pd_512;
3543 { CI->getArgOperand(0), CI->getArgOperand(1),
3544 CI->getArgOperand(4) });
3550 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.sub.p")) {
3551 if (
Name.ends_with(
".512")) {
3553 if (
Name[17] ==
's')
3554 IID = Intrinsic::x86_avx512_sub_ps_512;
3556 IID = Intrinsic::x86_avx512_sub_pd_512;
3559 { CI->getArgOperand(0), CI->getArgOperand(1),
3560 CI->getArgOperand(4) });
3566 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.max.p") ||
3567 Name.starts_with(
"avx512.mask.min.p")) &&
3568 Name.drop_front(18) ==
".512") {
3569 bool IsDouble =
Name[17] ==
'd';
3570 bool IsMin =
Name[13] ==
'i';
3572 { Intrinsic::x86_avx512_max_ps_512, Intrinsic::x86_avx512_max_pd_512 },
3573 { Intrinsic::x86_avx512_min_ps_512, Intrinsic::x86_avx512_min_pd_512 }
3578 { CI->getArgOperand(0), CI->getArgOperand(1),
3579 CI->getArgOperand(4) });
3582 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.lzcnt.")) {
3586 { CI->getArgOperand(0), Builder.getInt1(false) });
3589 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.psll")) {
3590 bool IsImmediate =
Name[16] ==
'i' ||
3591 (
Name.size() > 18 &&
Name[18] ==
'i');
3592 bool IsVariable =
Name[16] ==
'v';
3599 if (IsVariable &&
Name[17] !=
'.') {
3600 if (
Size ==
'd' &&
Name[17] ==
'2')
3601 IID = Intrinsic::x86_avx2_psllv_q;
3602 else if (
Size ==
'd' &&
Name[17] ==
'4')
3603 IID = Intrinsic::x86_avx2_psllv_q_256;
3604 else if (
Size ==
's' &&
Name[17] ==
'4')
3605 IID = Intrinsic::x86_avx2_psllv_d;
3606 else if (
Size ==
's' &&
Name[17] ==
'8')
3607 IID = Intrinsic::x86_avx2_psllv_d_256;
3608 else if (
Size ==
'h' &&
Name[17] ==
'8')
3609 IID = Intrinsic::x86_avx512_psllv_w_128;
3610 else if (
Size ==
'h' &&
Name[17] ==
'1')
3611 IID = Intrinsic::x86_avx512_psllv_w_256;
3612 else if (
Name[17] ==
'3' &&
Name[18] ==
'2')
3613 IID = Intrinsic::x86_avx512_psllv_w_512;
3616 }
else if (
Name.ends_with(
".128")) {
3618 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_d
3619 : Intrinsic::x86_sse2_psll_d;
3620 else if (
Size ==
'q')
3621 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_q
3622 : Intrinsic::x86_sse2_psll_q;
3623 else if (
Size ==
'w')
3624 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_w
3625 : Intrinsic::x86_sse2_psll_w;
3628 }
else if (
Name.ends_with(
".256")) {
3630 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_d
3631 : Intrinsic::x86_avx2_psll_d;
3632 else if (
Size ==
'q')
3633 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_q
3634 : Intrinsic::x86_avx2_psll_q;
3635 else if (
Size ==
'w')
3636 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_w
3637 : Intrinsic::x86_avx2_psll_w;
3642 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_d_512 :
3643 IsVariable ? Intrinsic::x86_avx512_psllv_d_512 :
3644 Intrinsic::x86_avx512_psll_d_512;
3645 else if (
Size ==
'q')
3646 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_q_512 :
3647 IsVariable ? Intrinsic::x86_avx512_psllv_q_512 :
3648 Intrinsic::x86_avx512_psll_q_512;
3649 else if (
Size ==
'w')
3650 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_w_512
3651 : Intrinsic::x86_avx512_psll_w_512;
3657 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.psrl")) {
3658 bool IsImmediate =
Name[16] ==
'i' ||
3659 (
Name.size() > 18 &&
Name[18] ==
'i');
3660 bool IsVariable =
Name[16] ==
'v';
3667 if (IsVariable &&
Name[17] !=
'.') {
3668 if (
Size ==
'd' &&
Name[17] ==
'2')
3669 IID = Intrinsic::x86_avx2_psrlv_q;
3670 else if (
Size ==
'd' &&
Name[17] ==
'4')
3671 IID = Intrinsic::x86_avx2_psrlv_q_256;
3672 else if (
Size ==
's' &&
Name[17] ==
'4')
3673 IID = Intrinsic::x86_avx2_psrlv_d;
3674 else if (
Size ==
's' &&
Name[17] ==
'8')
3675 IID = Intrinsic::x86_avx2_psrlv_d_256;
3676 else if (
Size ==
'h' &&
Name[17] ==
'8')
3677 IID = Intrinsic::x86_avx512_psrlv_w_128;
3678 else if (
Size ==
'h' &&
Name[17] ==
'1')
3679 IID = Intrinsic::x86_avx512_psrlv_w_256;
3680 else if (
Name[17] ==
'3' &&
Name[18] ==
'2')
3681 IID = Intrinsic::x86_avx512_psrlv_w_512;
3684 }
else if (
Name.ends_with(
".128")) {
3686 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_d
3687 : Intrinsic::x86_sse2_psrl_d;
3688 else if (
Size ==
'q')
3689 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_q
3690 : Intrinsic::x86_sse2_psrl_q;
3691 else if (
Size ==
'w')
3692 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_w
3693 : Intrinsic::x86_sse2_psrl_w;
3696 }
else if (
Name.ends_with(
".256")) {
3698 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_d
3699 : Intrinsic::x86_avx2_psrl_d;
3700 else if (
Size ==
'q')
3701 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_q
3702 : Intrinsic::x86_avx2_psrl_q;
3703 else if (
Size ==
'w')
3704 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_w
3705 : Intrinsic::x86_avx2_psrl_w;
3710 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_d_512 :
3711 IsVariable ? Intrinsic::x86_avx512_psrlv_d_512 :
3712 Intrinsic::x86_avx512_psrl_d_512;
3713 else if (
Size ==
'q')
3714 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_q_512 :
3715 IsVariable ? Intrinsic::x86_avx512_psrlv_q_512 :
3716 Intrinsic::x86_avx512_psrl_q_512;
3717 else if (
Size ==
'w')
3718 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_w_512
3719 : Intrinsic::x86_avx512_psrl_w_512;
3725 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.psra")) {
3726 bool IsImmediate =
Name[16] ==
'i' ||
3727 (
Name.size() > 18 &&
Name[18] ==
'i');
3728 bool IsVariable =
Name[16] ==
'v';
3735 if (IsVariable &&
Name[17] !=
'.') {
3736 if (
Size ==
's' &&
Name[17] ==
'4')
3737 IID = Intrinsic::x86_avx2_psrav_d;
3738 else if (
Size ==
's' &&
Name[17] ==
'8')
3739 IID = Intrinsic::x86_avx2_psrav_d_256;
3740 else if (
Size ==
'h' &&
Name[17] ==
'8')
3741 IID = Intrinsic::x86_avx512_psrav_w_128;
3742 else if (
Size ==
'h' &&
Name[17] ==
'1')
3743 IID = Intrinsic::x86_avx512_psrav_w_256;
3744 else if (
Name[17] ==
'3' &&
Name[18] ==
'2')
3745 IID = Intrinsic::x86_avx512_psrav_w_512;
3748 }
else if (
Name.ends_with(
".128")) {
3750 IID = IsImmediate ? Intrinsic::x86_sse2_psrai_d
3751 : Intrinsic::x86_sse2_psra_d;
3752 else if (
Size ==
'q')
3753 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_128 :
3754 IsVariable ? Intrinsic::x86_avx512_psrav_q_128 :
3755 Intrinsic::x86_avx512_psra_q_128;
3756 else if (
Size ==
'w')
3757 IID = IsImmediate ? Intrinsic::x86_sse2_psrai_w
3758 : Intrinsic::x86_sse2_psra_w;
3761 }
else if (
Name.ends_with(
".256")) {
3763 IID = IsImmediate ? Intrinsic::x86_avx2_psrai_d
3764 : Intrinsic::x86_avx2_psra_d;
3765 else if (
Size ==
'q')
3766 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_256 :
3767 IsVariable ? Intrinsic::x86_avx512_psrav_q_256 :
3768 Intrinsic::x86_avx512_psra_q_256;
3769 else if (
Size ==
'w')
3770 IID = IsImmediate ? Intrinsic::x86_avx2_psrai_w
3771 : Intrinsic::x86_avx2_psra_w;
3776 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_d_512 :
3777 IsVariable ? Intrinsic::x86_avx512_psrav_d_512 :
3778 Intrinsic::x86_avx512_psra_d_512;
3779 else if (
Size ==
'q')
3780 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_512 :
3781 IsVariable ? Intrinsic::x86_avx512_psrav_q_512 :
3782 Intrinsic::x86_avx512_psra_q_512;
3783 else if (
Size ==
'w')
3784 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_w_512
3785 : Intrinsic::x86_avx512_psra_w_512;
3791 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.move.s")) {
3793 }
else if (IsX86 &&
Name.starts_with(
"avx512.cvtmask2")) {
3795 }
else if (IsX86 &&
Name.ends_with(
".movntdqa")) {
3803 Ptr, PointerType::getUnqual(CI->
getType()),
"cast");
3807 LI->
setMetadata(LLVMContext::MD_nontemporal, Node);
3809 }
else if (IsX86 && (
Name.starts_with(
"fma.vfmadd.") ||
3810 Name.starts_with(
"fma.vfmsub.") ||
3811 Name.starts_with(
"fma.vfnmadd.") ||
3812 Name.starts_with(
"fma.vfnmsub."))) {
3813 bool NegMul =
Name[6] ==
'n';
3814 bool NegAcc = NegMul ?
Name[8] ==
's' :
Name[7] ==
's';
3815 bool IsScalar = NegMul ?
Name[12] ==
's' :
Name[11] ==
's';
3826 if (NegMul && !IsScalar)
3828 if (NegMul && IsScalar)
3841 }
else if (IsX86 &&
Name.starts_with(
"fma4.vfmadd.s")) {
3856 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vfmadd.s") ||
3857 Name.starts_with(
"avx512.maskz.vfmadd.s") ||
3858 Name.starts_with(
"avx512.mask3.vfmadd.s") ||
3859 Name.starts_with(
"avx512.mask3.vfmsub.s") ||
3860 Name.starts_with(
"avx512.mask3.vfnmsub.s"))) {
3861 bool IsMask3 =
Name[11] ==
'3';
3862 bool IsMaskZ =
Name[11] ==
'z';
3864 Name =
Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
3865 bool NegMul =
Name[2] ==
'n';
3866 bool NegAcc = NegMul ?
Name[4] ==
's' :
Name[3] ==
's';
3872 if (NegMul && (IsMask3 || IsMaskZ))
3874 if (NegMul && !(IsMask3 || IsMaskZ))
3884 cast<ConstantInt>(CI->
getArgOperand(4))->getZExtValue() != 4) {
3888 if (
Name.back() ==
'd')
3889 IID = Intrinsic::x86_avx512_vfmadd_f64;
3891 IID = Intrinsic::x86_avx512_vfmadd_f32;
3906 if (NegAcc && IsMask3)
3913 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vfmadd.p") ||
3914 Name.starts_with(
"avx512.mask.vfnmadd.p") ||
3915 Name.starts_with(
"avx512.mask.vfnmsub.p") ||
3916 Name.starts_with(
"avx512.mask3.vfmadd.p") ||
3917 Name.starts_with(
"avx512.mask3.vfmsub.p") ||
3918 Name.starts_with(
"avx512.mask3.vfnmsub.p") ||
3919 Name.starts_with(
"avx512.maskz.vfmadd.p"))) {
3920 bool IsMask3 =
Name[11] ==
'3';
3921 bool IsMaskZ =
Name[11] ==
'z';
3923 Name =
Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
3924 bool NegMul =
Name[2] ==
'n';
3925 bool NegAcc = NegMul ?
Name[4] ==
's' :
Name[3] ==
's';
3931 if (NegMul && (IsMask3 || IsMaskZ))
3933 if (NegMul && !(IsMask3 || IsMaskZ))
3940 cast<ConstantInt>(CI->
getArgOperand(4))->getZExtValue() != 4)) {
3944 IID = Intrinsic::x86_avx512_vfmadd_ps_512;
3946 IID = Intrinsic::x86_avx512_vfmadd_pd_512;
3949 { A, B, C, CI->getArgOperand(4) });
3962 }
else if (IsX86 &&
Name.starts_with(
"fma.vfmsubadd.p")) {
3966 if (VecWidth == 128 && EltWidth == 32)
3967 IID = Intrinsic::x86_fma_vfmaddsub_ps;
3968 else if (VecWidth == 256 && EltWidth == 32)
3969 IID = Intrinsic::x86_fma_vfmaddsub_ps_256;
3970 else if (VecWidth == 128 && EltWidth == 64)
3971 IID = Intrinsic::x86_fma_vfmaddsub_pd;
3972 else if (VecWidth == 256 && EltWidth == 64)
3973 IID = Intrinsic::x86_fma_vfmaddsub_pd_256;
3982 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vfmaddsub.p") ||
3983 Name.starts_with(
"avx512.mask3.vfmaddsub.p") ||
3984 Name.starts_with(
"avx512.maskz.vfmaddsub.p") ||
3985 Name.starts_with(
"avx512.mask3.vfmsubadd.p"))) {
3986 bool IsMask3 =
Name[11] ==
'3';
3987 bool IsMaskZ =
Name[11] ==
'z';
3989 Name =
Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
3990 bool IsSubAdd =
Name[3] ==
's';
3995 IID = Intrinsic::x86_avx512_vfmaddsub_ps_512;
3997 IID = Intrinsic::x86_avx512_vfmaddsub_pd_512;
4007 int NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
4022 for (
int i = 0; i != NumElts; ++i)
4023 Idxs[i] = i + (i % 2) * NumElts;
4033 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.pternlog.") ||
4034 Name.starts_with(
"avx512.maskz.pternlog."))) {
4035 bool ZeroMask =
Name[11] ==
'z';
4039 if (VecWidth == 128 && EltWidth == 32)
4040 IID = Intrinsic::x86_avx512_pternlog_d_128;
4041 else if (VecWidth == 256 && EltWidth == 32)
4042 IID = Intrinsic::x86_avx512_pternlog_d_256;
4043 else if (VecWidth == 512 && EltWidth == 32)
4044 IID = Intrinsic::x86_avx512_pternlog_d_512;
4045 else if (VecWidth == 128 && EltWidth == 64)
4046 IID = Intrinsic::x86_avx512_pternlog_q_128;
4047 else if (VecWidth == 256 && EltWidth == 64)
4048 IID = Intrinsic::x86_avx512_pternlog_q_256;
4049 else if (VecWidth == 512 && EltWidth == 64)
4050 IID = Intrinsic::x86_avx512_pternlog_q_512;
4061 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vpmadd52") ||
4062 Name.starts_with(
"avx512.maskz.vpmadd52"))) {
4063 bool ZeroMask =
Name[11] ==
'z';
4067 if (VecWidth == 128 && !
High)
4068 IID = Intrinsic::x86_avx512_vpmadd52l_uq_128;
4069 else if (VecWidth == 256 && !
High)
4070 IID = Intrinsic::x86_avx512_vpmadd52l_uq_256;
4071 else if (VecWidth == 512 && !
High)
4072 IID = Intrinsic::x86_avx512_vpmadd52l_uq_512;
4073 else if (VecWidth == 128 &&
High)
4074 IID = Intrinsic::x86_avx512_vpmadd52h_uq_128;
4075 else if (VecWidth == 256 &&
High)
4076 IID = Intrinsic::x86_avx512_vpmadd52h_uq_256;
4077 else if (VecWidth == 512 &&
High)
4078 IID = Intrinsic::x86_avx512_vpmadd52h_uq_512;
4089 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vpermi2var.") ||
4090 Name.starts_with(
"avx512.mask.vpermt2var.") ||
4091 Name.starts_with(
"avx512.maskz.vpermt2var."))) {
4092 bool ZeroMask =
Name[11] ==
'z';
4093 bool IndexForm =
Name[17] ==
'i';
4095 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vpdpbusd.") ||
4096 Name.starts_with(
"avx512.maskz.vpdpbusd.") ||
4097 Name.starts_with(
"avx512.mask.vpdpbusds.") ||
4098 Name.starts_with(
"avx512.maskz.vpdpbusds."))) {
4099 bool ZeroMask =
Name[11] ==
'z';
4100 bool IsSaturating =
Name[ZeroMask ? 21 : 20] ==
's';
4103 if (VecWidth == 128 && !IsSaturating)
4104 IID = Intrinsic::x86_avx512_vpdpbusd_128;
4105 else if (VecWidth == 256 && !IsSaturating)
4106 IID = Intrinsic::x86_avx512_vpdpbusd_256;
4107 else if (VecWidth == 512 && !IsSaturating)
4108 IID = Intrinsic::x86_avx512_vpdpbusd_512;
4109 else if (VecWidth == 128 && IsSaturating)
4110 IID = Intrinsic::x86_avx512_vpdpbusds_128;
4111 else if (VecWidth == 256 && IsSaturating)
4112 IID = Intrinsic::x86_avx512_vpdpbusds_256;
4113 else if (VecWidth == 512 && IsSaturating)
4114 IID = Intrinsic::x86_avx512_vpdpbusds_512;
4125 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vpdpwssd.") ||
4126 Name.starts_with(
"avx512.maskz.vpdpwssd.") ||
4127 Name.starts_with(
"avx512.mask.vpdpwssds.") ||
4128 Name.starts_with(
"avx512.maskz.vpdpwssds."))) {
4129 bool ZeroMask =
Name[11] ==
'z';
4130 bool IsSaturating =
Name[ZeroMask ? 21 : 20] ==
's';
4133 if (VecWidth == 128 && !IsSaturating)
4134 IID = Intrinsic::x86_avx512_vpdpwssd_128;
4135 else if (VecWidth == 256 && !IsSaturating)
4136 IID = Intrinsic::x86_avx512_vpdpwssd_256;
4137 else if (VecWidth == 512 && !IsSaturating)
4138 IID = Intrinsic::x86_avx512_vpdpwssd_512;
4139 else if (VecWidth == 128 && IsSaturating)
4140 IID = Intrinsic::x86_avx512_vpdpwssds_128;
4141 else if (VecWidth == 256 && IsSaturating)
4142 IID = Intrinsic::x86_avx512_vpdpwssds_256;
4143 else if (VecWidth == 512 && IsSaturating)
4144 IID = Intrinsic::x86_avx512_vpdpwssds_512;
4155 }
else if (IsX86 && (
Name ==
"addcarryx.u32" ||
Name ==
"addcarryx.u64" ||
4156 Name ==
"addcarry.u32" ||
Name ==
"addcarry.u64" ||
4157 Name ==
"subborrow.u32" ||
Name ==
"subborrow.u64")) {
4159 if (
Name[0] ==
'a' &&
Name.back() ==
'2')
4160 IID = Intrinsic::x86_addcarry_32;
4161 else if (
Name[0] ==
'a' &&
Name.back() ==
'4')
4162 IID = Intrinsic::x86_addcarry_64;
4163 else if (
Name[0] ==
's' &&
Name.back() ==
'2')
4164 IID = Intrinsic::x86_subborrow_32;
4165 else if (
Name[0] ==
's' &&
Name.back() ==
'4')
4166 IID = Intrinsic::x86_subborrow_64;
4188 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.") &&
4191 }
else if (IsNVVM && (
Name ==
"abs.i" ||
Name ==
"abs.ll")) {
4197 }
else if (IsNVVM && (
Name.starts_with(
"atomic.load.add.f32.p") ||
4198 Name.starts_with(
"atomic.load.add.f64.p"))) {
4202 AtomicOrdering::SequentiallyConsistent);
4203 }
else if (IsNVVM &&
Name.consume_front(
"max.") &&
4212 }
else if (IsNVVM &&
Name.consume_front(
"min.") &&
4221 }
else if (IsNVVM &&
Name ==
"clz.ll") {
4227 {Arg, Builder.getFalse()},
"ctlz");
4229 }
else if (IsNVVM &&
Name ==
"popc.ll") {
4238 }
else if (IsNVVM) {
4239 if (
Name ==
"h2f") {
4242 F->getParent(), Intrinsic::convert_from_fp16,
4243 {Builder.getFloatTy()}),
4248 !
F->getReturnType()->getScalarType()->isBFloatTy()) {
4262 if (
F->getReturnType()->isIntegerTy())
4268 }
else if (IsAMDGCN) {
4280 FallthroughToDefaultUpgrade =
true;
4288 if (!FallthroughToDefaultUpgrade) {
4296 const auto &DefaultCase = [&]() ->
void {
4301 "Unknown function for CallBase upgrade and isn't just a name change");
4307 if (
auto *OldST = dyn_cast<StructType>(CI->
getType())) {
4309 "Return type must have changed");
4310 assert(OldST->getNumElements() ==
4311 cast<StructType>(NewFn->
getReturnType())->getNumElements() &&
4312 "Must have same number of elements");
4317 for (
unsigned Idx = 0;
Idx < OldST->getNumElements(); ++
Idx) {
4338 case Intrinsic::arm_neon_vst1:
4339 case Intrinsic::arm_neon_vst2:
4340 case Intrinsic::arm_neon_vst3:
4341 case Intrinsic::arm_neon_vst4:
4342 case Intrinsic::arm_neon_vst2lane:
4343 case Intrinsic::arm_neon_vst3lane:
4344 case Intrinsic::arm_neon_vst4lane: {
4349 case Intrinsic::aarch64_sve_bfmlalb_lane_v2:
4350 case Intrinsic::aarch64_sve_bfmlalt_lane_v2:
4351 case Intrinsic::aarch64_sve_bfdot_lane_v2: {
4355 cast<ConstantInt>(Args[3])->getZExtValue());
4359 case Intrinsic::aarch64_sve_ld3_sret:
4360 case Intrinsic::aarch64_sve_ld4_sret:
4361 case Intrinsic::aarch64_sve_ld2_sret: {
4370 dyn_cast<ScalableVectorType>(
F->getReturnType());
4371 unsigned MinElts =
RetTy->getMinNumElements() /
N;
4375 for (
unsigned I = 0;
I <
N;
I++) {
4380 NewCall = dyn_cast<CallInst>(Ret);
4384 case Intrinsic::coro_end: {
4391 case Intrinsic::vector_extract: {
4394 if (!
Name.starts_with(
"aarch64.sve.tuple.get")) {
4399 dyn_cast<ScalableVectorType>(
F->getReturnType());
4400 unsigned MinElts =
RetTy->getMinNumElements();
4401 unsigned I = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
4407 case Intrinsic::vector_insert: {
4410 if (!
Name.starts_with(
"aarch64.sve.tuple")) {
4414 if (
Name.starts_with(
"aarch64.sve.tuple.set")) {
4415 unsigned I = dyn_cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
4424 if (
Name.starts_with(
"aarch64.sve.tuple.create")) {
4430 assert(
N > 1 &&
"Create is expected to be between 2-4");
4432 dyn_cast<ScalableVectorType>(
F->getReturnType());
4434 unsigned MinElts =
RetTy->getMinNumElements() /
N;
4435 for (
unsigned I = 0;
I <
N;
I++) {
4440 NewCall = dyn_cast<CallInst>(Ret);
4445 case Intrinsic::arm_neon_bfdot:
4446 case Intrinsic::arm_neon_bfmmla:
4447 case Intrinsic::arm_neon_bfmlalb:
4448 case Intrinsic::arm_neon_bfmlalt:
4449 case Intrinsic::aarch64_neon_bfdot:
4450 case Intrinsic::aarch64_neon_bfmmla:
4451 case Intrinsic::aarch64_neon_bfmlalb:
4452 case Intrinsic::aarch64_neon_bfmlalt: {
4455 "Mismatch between function args and call args");
4456 size_t OperandWidth =
4458 assert((OperandWidth == 64 || OperandWidth == 128) &&
4459 "Unexpected operand width");
4461 auto Iter = CI->
args().begin();
4462 Args.push_back(*Iter++);
4469 case Intrinsic::bitreverse:
4473 case Intrinsic::ctlz:
4474 case Intrinsic::cttz:
4476 "Mismatch between function args and call args");
4481 case Intrinsic::objectsize: {
4482 Value *NullIsUnknownSize =
4491 case Intrinsic::ctpop:
4495 case Intrinsic::convert_from_fp16:
4499 case Intrinsic::dbg_value: {
4503 if (
Name.starts_with(
"dbg.addr")) {
4505 cast<MetadataAsValue>(CI->
getArgOperand(2))->getMetadata());
4517 if (
Offset->isZeroValue()) {
4527 case Intrinsic::ptr_annotation:
4544 case Intrinsic::var_annotation:
4560 case Intrinsic::riscv_aes32dsi:
4561 case Intrinsic::riscv_aes32dsmi:
4562 case Intrinsic::riscv_aes32esi:
4563 case Intrinsic::riscv_aes32esmi:
4564 case Intrinsic::riscv_sm4ks:
4565 case Intrinsic::riscv_sm4ed: {
4580 cast<ConstantInt>(Arg2)->getZExtValue());
4582 NewCall = Builder.
CreateCall(NewFn, {Arg0, Arg1, Arg2});
4583 Value *Res = NewCall;
4591 case Intrinsic::riscv_sha256sig0:
4592 case Intrinsic::riscv_sha256sig1:
4593 case Intrinsic::riscv_sha256sum0:
4594 case Intrinsic::riscv_sha256sum1:
4595 case Intrinsic::riscv_sm3p0:
4596 case Intrinsic::riscv_sm3p1: {
4614 case Intrinsic::x86_xop_vfrcz_ss:
4615 case Intrinsic::x86_xop_vfrcz_sd:
4619 case Intrinsic::x86_xop_vpermil2pd:
4620 case Intrinsic::x86_xop_vpermil2ps:
4621 case Intrinsic::x86_xop_vpermil2pd_256:
4622 case Intrinsic::x86_xop_vpermil2ps_256: {
4625 VectorType *IntIdxTy = VectorType::getInteger(FltIdxTy);
4631 case Intrinsic::x86_sse41_ptestc:
4632 case Intrinsic::x86_sse41_ptestz:
4633 case Intrinsic::x86_sse41_ptestnzc: {
4650 NewCall = Builder.
CreateCall(NewFn, {BC0, BC1});
4654 case Intrinsic::x86_rdtscp: {
4676 case Intrinsic::x86_sse41_insertps:
4677 case Intrinsic::x86_sse41_dppd:
4678 case Intrinsic::x86_sse41_dpps:
4679 case Intrinsic::x86_sse41_mpsadbw:
4680 case Intrinsic::x86_avx_dp_ps_256:
4681 case Intrinsic::x86_avx2_mpsadbw: {
4692 case Intrinsic::x86_avx512_mask_cmp_pd_128:
4693 case Intrinsic::x86_avx512_mask_cmp_pd_256:
4694 case Intrinsic::x86_avx512_mask_cmp_pd_512:
4695 case Intrinsic::x86_avx512_mask_cmp_ps_128:
4696 case Intrinsic::x86_avx512_mask_cmp_ps_256:
4697 case Intrinsic::x86_avx512_mask_cmp_ps_512: {
4700 cast<FixedVectorType>(Args[0]->
getType())->getNumElements();
4712 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_128:
4713 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_256:
4714 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_512:
4715 case Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128:
4716 case Intrinsic::x86_avx512bf16_cvtneps2bf16_256:
4717 case Intrinsic::x86_avx512bf16_cvtneps2bf16_512: {
4719 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
4721 Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128)
4734 case Intrinsic::x86_avx512bf16_dpbf16ps_128:
4735 case Intrinsic::x86_avx512bf16_dpbf16ps_256:
4736 case Intrinsic::x86_avx512bf16_dpbf16ps_512:{
4739 cast<FixedVectorType>(CI->
getType())->getNumElements() * 2;
4749 case Intrinsic::thread_pointer: {
4754 case Intrinsic::memcpy:
4755 case Intrinsic::memmove:
4756 case Intrinsic::memset: {
4776 {OldAttrs.getParamAttrs(0), OldAttrs.getParamAttrs(1),
4777 OldAttrs.getParamAttrs(2), OldAttrs.getParamAttrs(4)});
4779 auto *MemCI = cast<MemIntrinsic>(NewCall);
4782 MemCI->setDestAlignment(
Align->getMaybeAlignValue());
4784 if (
auto *MTI = dyn_cast<MemTransferInst>(MemCI))
4785 MTI->setSourceAlignment(
Align->getMaybeAlignValue());
4789 assert(NewCall &&
"Should have either set this variable or returned through "
4790 "the default case");
4797 assert(
F &&
"Illegal attempt to upgrade a non-existent intrinsic.");
4806 if (
CallBase *CB = dyn_cast<CallBase>(U))
4810 F->eraseFromParent();
4816 if (NumOperands == 0)
4820 if (isa<MDNode>(MD.
getOperand(0)) && NumOperands >= 3)
4824 if (NumOperands == 3) {
4828 Metadata *Elts2[] = {ScalarType, ScalarType,
4842 if (Opc != Instruction::BitCast)
4846 Type *SrcTy = V->getType();
4863 if (Opc != Instruction::BitCast)
4866 Type *SrcTy =
C->getType();
4890 bool BrokenDebugInfo =
false;
4893 if (!BrokenDebugInfo)
4899 M.getContext().diagnose(Diag);
4906 M.getContext().diagnose(DiagVersion);
4914 bool Changed =
false;
4915 const char *MarkerKey =
"clang.arc.retainAutoreleasedReturnValueMarker";
4916 NamedMDNode *ModRetainReleaseMarker = M.getNamedMetadata(MarkerKey);
4917 if (ModRetainReleaseMarker) {
4920 MDString *
ID = dyn_cast_or_null<MDString>(
Op->getOperand(0));
4923 ID->getString().split(ValueComp,
"#");
4924 if (ValueComp.
size() == 2) {
4925 std::string NewValue = ValueComp[0].str() +
";" + ValueComp[1].str();
4929 M.eraseNamedMetadata(ModRetainReleaseMarker);
4940 auto UpgradeToIntrinsic = [&](
const char *OldFunc,
4942 Function *Fn = M.getFunction(OldFunc);
4950 CallInst *CI = dyn_cast<CallInst>(U);
4965 bool InvalidCast =
false;
4967 for (
unsigned I = 0, E = CI->
arg_size();
I != E; ++
I) {
4972 if (I < NewFuncTy->getNumParams()) {
4982 Args.push_back(Arg);
5007 UpgradeToIntrinsic(
"clang.arc.use", llvm::Intrinsic::objc_clang_arc_use);
5015 std::pair<const char *, llvm::Intrinsic::ID> RuntimeFuncs[] = {
5016 {
"objc_autorelease", llvm::Intrinsic::objc_autorelease},
5017 {
"objc_autoreleasePoolPop", llvm::Intrinsic::objc_autoreleasePoolPop},
5018 {
"objc_autoreleasePoolPush", llvm::Intrinsic::objc_autoreleasePoolPush},
5019 {
"objc_autoreleaseReturnValue",
5020 llvm::Intrinsic::objc_autoreleaseReturnValue},
5021 {
"objc_copyWeak", llvm::Intrinsic::objc_copyWeak},
5022 {
"objc_destroyWeak", llvm::Intrinsic::objc_destroyWeak},
5023 {
"objc_initWeak", llvm::Intrinsic::objc_initWeak},
5024 {
"objc_loadWeak", llvm::Intrinsic::objc_loadWeak},
5025 {
"objc_loadWeakRetained", llvm::Intrinsic::objc_loadWeakRetained},
5026 {
"objc_moveWeak", llvm::Intrinsic::objc_moveWeak},
5027 {
"objc_release", llvm::Intrinsic::objc_release},
5028 {
"objc_retain", llvm::Intrinsic::objc_retain},
5029 {
"objc_retainAutorelease", llvm::Intrinsic::objc_retainAutorelease},
5030 {
"objc_retainAutoreleaseReturnValue",
5031 llvm::Intrinsic::objc_retainAutoreleaseReturnValue},
5032 {
"objc_retainAutoreleasedReturnValue",
5033 llvm::Intrinsic::objc_retainAutoreleasedReturnValue},
5034 {
"objc_retainBlock", llvm::Intrinsic::objc_retainBlock},
5035 {
"objc_storeStrong", llvm::Intrinsic::objc_storeStrong},
5036 {
"objc_storeWeak", llvm::Intrinsic::objc_storeWeak},
5037 {
"objc_unsafeClaimAutoreleasedReturnValue",
5038 llvm::Intrinsic::objc_unsafeClaimAutoreleasedReturnValue},
5039 {
"objc_retainedObject", llvm::Intrinsic::objc_retainedObject},
5040 {
"objc_unretainedObject", llvm::Intrinsic::objc_unretainedObject},
5041 {
"objc_unretainedPointer", llvm::Intrinsic::objc_unretainedPointer},
5042 {
"objc_retain_autorelease", llvm::Intrinsic::objc_retain_autorelease},
5043 {
"objc_sync_enter", llvm::Intrinsic::objc_sync_enter},
5044 {
"objc_sync_exit", llvm::Intrinsic::objc_sync_exit},
5045 {
"objc_arc_annotation_topdown_bbstart",
5046 llvm::Intrinsic::objc_arc_annotation_topdown_bbstart},
5047 {
"objc_arc_annotation_topdown_bbend",
5048 llvm::Intrinsic::objc_arc_annotation_topdown_bbend},
5049 {
"objc_arc_annotation_bottomup_bbstart",
5050 llvm::Intrinsic::objc_arc_annotation_bottomup_bbstart},
5051 {
"objc_arc_annotation_bottomup_bbend",
5052 llvm::Intrinsic::objc_arc_annotation_bottomup_bbend}};
5054 for (
auto &
I : RuntimeFuncs)
5055 UpgradeToIntrinsic(
I.first,
I.second);
5059 NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
5063 bool HasObjCFlag =
false, HasClassProperties =
false, Changed =
false;
5064 bool HasSwiftVersionFlag =
false;
5065 uint8_t SwiftMajorVersion, SwiftMinorVersion;
5074 MDString *
ID = dyn_cast_or_null<MDString>(
Op->getOperand(1));
5086 if (
ID->getString() ==
"Objective-C Image Info Version")
5088 if (
ID->getString() ==
"Objective-C Class Properties")
5089 HasClassProperties =
true;
5091 if (
ID->getString() ==
"PIC Level") {
5092 if (
auto *Behavior =
5093 mdconst::dyn_extract_or_null<ConstantInt>(
Op->getOperand(0))) {
5094 uint64_t V = Behavior->getLimitedValue();
5100 if (
ID->getString() ==
"PIE Level")
5101 if (
auto *Behavior =
5102 mdconst::dyn_extract_or_null<ConstantInt>(
Op->getOperand(0)))
5108 if (
ID->getString() ==
"branch-target-enforcement" ||
5109 ID->getString().starts_with(
"sign-return-address")) {
5110 if (
auto *Behavior =
5111 mdconst::dyn_extract_or_null<ConstantInt>(
Op->getOperand(0))) {
5116 Op->getOperand(1),
Op->getOperand(2)};
5126 if (
ID->getString() ==
"Objective-C Image Info Section") {
5127 if (
auto *
Value = dyn_cast_or_null<MDString>(
Op->getOperand(2))) {
5129 Value->getString().split(ValueComp,
" ");
5130 if (ValueComp.
size() != 1) {
5131 std::string NewValue;
5132 for (
auto &S : ValueComp)
5133 NewValue += S.str();
5134 Metadata *Ops[3] = {
Op->getOperand(0),
Op->getOperand(1),
5144 if (
ID->getString() ==
"Objective-C Garbage Collection") {
5145 auto Md = dyn_cast<ConstantAsMetadata>(
Op->getOperand(2));
5147 assert(Md->getValue() &&
"Expected non-empty metadata");
5148 auto Type = Md->getValue()->getType();
5151 unsigned Val = Md->getValue()->getUniqueInteger().getZExtValue();
5152 if ((Val & 0xff) != Val) {
5153 HasSwiftVersionFlag =
true;
5154 SwiftABIVersion = (Val & 0xff00) >> 8;
5155 SwiftMajorVersion = (Val & 0xff000000) >> 24;
5156 SwiftMinorVersion = (Val & 0xff0000) >> 16;
5167 if (
ID->getString() ==
"amdgpu_code_object_version") {
5170 MDString::get(M.getContext(),
"amdhsa_code_object_version"),
5182 if (HasObjCFlag && !HasClassProperties) {
5188 if (HasSwiftVersionFlag) {
5192 ConstantInt::get(Int8Ty, SwiftMajorVersion));
5194 ConstantInt::get(Int8Ty, SwiftMinorVersion));
5202 auto TrimSpaces = [](
StringRef Section) -> std::string {
5204 Section.split(Components,
',');
5209 for (
auto Component : Components)
5210 OS <<
',' << Component.trim();
5212 return std::string(
OS.str().substr(1));
5215 for (
auto &GV : M.globals()) {
5216 if (!GV.hasSection())
5221 if (!Section.starts_with(
"__DATA, __objc_catlist"))
5226 GV.setSection(TrimSpaces(Section));
5242struct StrictFPUpgradeVisitor :
public InstVisitor<StrictFPUpgradeVisitor> {
5243 StrictFPUpgradeVisitor() =
default;
5246 if (!Call.isStrictFP())
5248 if (isa<ConstrainedFPIntrinsic>(&Call))
5252 Call.removeFnAttr(Attribute::StrictFP);
5253 Call.addFnAttr(Attribute::NoBuiltin);
5261 if (!
F.isDeclaration() && !
F.hasFnAttribute(Attribute::StrictFP)) {
5262 StrictFPUpgradeVisitor SFPV;
5268 for (
auto &Arg :
F.args())
5273 if (
Attribute A =
F.getFnAttribute(
"implicit-section-name");
5274 A.isValid() &&
A.isStringAttribute()) {
5275 F.setSection(
A.getValueAsString());
5276 F.removeFnAttr(
"implicit-section-name");
5281 auto *
T = dyn_cast_or_null<MDTuple>(MD);
5284 if (
T->getNumOperands() < 1)
5286 auto *S = dyn_cast_or_null<MDString>(
T->getOperand(0));
5289 return S->getString().starts_with(
"llvm.vectorizer.");
5293 StringRef OldPrefix =
"llvm.vectorizer.";
5296 if (OldTag ==
"llvm.vectorizer.unroll")
5305 auto *
T = dyn_cast_or_null<MDTuple>(MD);
5308 if (
T->getNumOperands() < 1)
5310 auto *OldTag = dyn_cast_or_null<MDString>(
T->getOperand(0));
5313 if (!OldTag->getString().starts_with(
"llvm.vectorizer."))
5320 for (
unsigned I = 1, E =
T->getNumOperands();
I != E; ++
I)
5327 auto *
T = dyn_cast<MDTuple>(&
N);
5346 if (((
T.isAMDGPU() && !
T.isAMDGCN()) ||
5347 (
T.isSPIR() || (
T.isSPIRV() && !
T.isSPIRVLogical()))) &&
5348 !
DL.contains(
"-G") && !
DL.starts_with(
"G")) {
5349 return DL.
empty() ? std::string(
"G1") : (
DL +
"-G1").str();
5352 if (
T.isRISCV64()) {
5354 auto I =
DL.find(
"-n64-");
5356 return (
DL.take_front(
I) +
"-n32:64-" +
DL.drop_front(
I + 5)).str();
5360 std::string Res =
DL.str();
5364 if (!
DL.contains(
"-G") && !
DL.starts_with(
"G"))
5365 Res.append(Res.empty() ?
"G1" :
"-G1");
5370 if (!
DL.contains(
"-ni") && !
DL.starts_with(
"ni"))
5371 Res.append(
"-ni:7:8:9");
5373 if (
DL.ends_with(
"ni:7"))
5375 if (
DL.ends_with(
"ni:7:8"))
5380 if (!
DL.contains(
"-p7") && !
DL.starts_with(
"p7"))
5381 Res.append(
"-p7:160:256:256:32");
5382 if (!
DL.contains(
"-p8") && !
DL.starts_with(
"p8"))
5383 Res.append(
"-p8:128:128");
5384 if (!
DL.contains(
"-p9") && !
DL.starts_with(
"p9"))
5385 Res.append(
"-p9:192:256:256:32");
5395 std::string AddrSpaces =
"-p270:32:32-p271:32:32-p272:64:64";
5398 Regex R(
"(e-m:[a-z](-p:32:32)?)(-[if]64:.*$)");
5399 if (R.match(Res, &
Groups))
5409 if (!
T.isOSIAMCU()) {
5410 std::string I128 =
"-i128:128";
5413 Regex R(
"^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
5414 if (R.match(Res, &
Groups))
5422 if (
T.isWindowsMSVCEnvironment() && !
T.isArch64Bit()) {
5424 auto I =
Ref.find(
"-f80:32-");
5426 Res = (
Ref.take_front(
I) +
"-f80:128-" +
Ref.drop_front(
I + 8)).str();
5434 Attribute A =
B.getAttribute(
"no-frame-pointer-elim");
5437 FramePointer =
A.getValueAsString() ==
"true" ?
"all" :
"none";
5438 B.removeAttribute(
"no-frame-pointer-elim");
5440 if (
B.contains(
"no-frame-pointer-elim-non-leaf")) {
5442 if (FramePointer !=
"all")
5443 FramePointer =
"non-leaf";
5444 B.removeAttribute(
"no-frame-pointer-elim-non-leaf");
5446 if (!FramePointer.
empty())
5447 B.addAttribute(
"frame-pointer", FramePointer);
5449 A =
B.getAttribute(
"null-pointer-is-valid");
5452 bool NullPointerIsValid =
A.getValueAsString() ==
"true";
5453 B.removeAttribute(
"null-pointer-is-valid");
5454 if (NullPointerIsValid)
5455 B.addAttribute(Attribute::NullPointerIsValid);
5465 return OBD.
getTag() ==
"clang.arc.attachedcall" &&
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
amdgpu AMDGPU Register Bank Select
static Value * upgradeX86VPERMT2Intrinsics(IRBuilder<> &Builder, CallBase &CI, bool ZeroMask, bool IndexForm)
static Metadata * upgradeLoopArgument(Metadata *MD)
static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords)
static Value * upgradeX86PSLLDQIntrinsics(IRBuilder<> &Builder, Value *Op, unsigned Shift)
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 Intrinsic::ID shouldUpgradeNVPTXBF16Intrinsic(StringRef Name)
static MDString * upgradeLoopTag(LLVMContext &C, StringRef OldTag)
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 * 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 shouldUpgradeX86Intrinsic(Function *F, StringRef Name)
static Value * upgradeX86PSRLDQIntrinsics(IRBuilder<> &Builder, Value *Op, unsigned Shift)
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 bool upgradeX86BF16Intrinsic(Function *F, Intrinsic::ID IID, Function *&NewFn)
static MDType * unwrapMAVOp(CallBase *CI, unsigned Op)
Helper to unwrap intrinsic call MetadataAsValue operands.
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 * upgradeX86MaskedShift(IRBuilder<> &Builder, CallBase &CI, Intrinsic::ID IID)
static bool upgradeAVX512MaskToSelect(StringRef Name, IRBuilder<> &Builder, CallBase &CI, Value *&Rep)
static void upgradeDbgIntrinsicToDbgRecord(StringRef Name, CallBase *CI)
Convert debug intrinsic calls to non-instruction debug records.
static Value * upgradePMULDQ(IRBuilder<> &Builder, CallBase &CI, bool IsSigned)
static Value * upgradeMaskedStore(IRBuilder<> &Builder, Value *Ptr, Value *Data, Value *Mask, bool Aligned)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file contains constants used for implementing Dwarf debug support.
Module.h This file contains the declarations for the Module class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
static SymbolRef::Type getType(const Symbol *Sym)
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.
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.
@ UDecWrap
Decrement one until a minimum value or zero.
AttributeSet getFnAttrs() const
The function attributes are returned.
static AttributeList get(LLVMContext &C, ArrayRef< std::pair< unsigned, Attribute > > Attrs)
Create an AttributeList with the specified parameters in it.
AttributeSet getRetAttrs() const
The attributes for the ret value are returned.
void insertDbgRecordBefore(DbgRecord *DR, InstListType::iterator Here)
Insert a DbgRecord into a block at the position given by Here.
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 parameter attributes for this call.
Value * getArgOperand(unsigned i) const
FunctionType * getFunctionType() const
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 parameter 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 CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name, BasicBlock::iterator InsertBefore)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static 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.
static ConstantAggregateZero * get(Type *Ty)
static Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getPointerCast(Constant *C, Type *Ty)
Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant expression.
static 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 Constant * get(StructType *T, ArrayRef< Constant * > V)
static ConstantTokenNone * get(LLVMContext &Context)
Return the ConstantTokenNone.
This is an important base class in LLVM.
static Constant * getAllOnesValue(Type *Ty)
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
This class represents an Operation in the Expression.
uint64_t getNumOperands() const
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
static FixedVectorType * get(Type *ElementType, unsigned NumElts)
Class to represent function types.
Type * getParamType(unsigned i) const
Parameter type accessors.
Type * getReturnType() const
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...
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.
ConstantInt * getInt1(bool V)
Get a constant value representing either true or false.
Value * CreateFSub(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Value * CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, const Twine &Name="")
IntegerType * getInt1Ty()
Fetch the type representing a single bit.
Value * CreateInsertValue(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &Name="")
Value * CreateFDiv(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
CallInst * CreateInsertVector(Type *DstType, Value *SrcVec, Value *SubVec, Value *Idx, const Twine &Name="")
Create a call to the vector.insert intrinsic.
Value * CreateSIToFP(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
IntegerType * getIntNTy(unsigned N)
Fetch the type representing an N-bit integer.
LoadInst * CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, const char *Name)
Value * CreateFAdd(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Value * CreatePointerCast(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
Value * CreateExtractValue(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &Name="")
CallInst * CreateMaskedLoad(Type *Ty, Value *Ptr, Align Alignment, Value *Mask, Value *PassThru=nullptr, const Twine &Name="")
Create a call to Masked Load intrinsic.
Value * CreateICmpSGE(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateSelect(Value *C, Value *True, Value *False, const Twine &Name="", Instruction *MDFrom=nullptr)
Value * CreateSExt(Value *V, Type *DestTy, const Twine &Name="")
IntegerType * getInt32Ty()
Fetch the type representing a 32-bit integer.
ConstantInt * getInt8(uint8_t C)
Get a constant 8-bit value.
Value * CreateUIToFP(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
IntegerType * getInt16Ty()
Fetch the type representing a 16-bit integer.
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
Value * CreateICmpSLE(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateNot(Value *V, const Twine &Name="")
Value * CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
LoadInst * CreateLoad(Type *Ty, Value *Ptr, const char *Name)
Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of converting the string to 'bool...
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Value * CreateShuffleVector(Value *V1, Value *V2, Value *Mask, const Twine &Name="")
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
CallInst * CreateMaskedStore(Value *Val, Value *Ptr, Align Alignment, Value *Mask)
Create a call to Masked Store intrinsic.
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
ConstantInt * getFalse()
Get the constant value for i1 false.
Value * CreateIsNotNull(Value *Arg, const Twine &Name="")
Return a boolean value testing if Arg != 0.
AtomicRMWInst * CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr, Value *Val, MaybeAlign Align, AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
PointerType * getPtrTy(unsigned AddrSpace=0)
Fetch the type representing a pointer.
Value * CreateICmpUGE(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
StoreInst * CreateAlignedStore(Value *Val, Value *Ptr, MaybeAlign Align, bool isVolatile=false)
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args=std::nullopt, const Twine &Name="", MDNode *FPMathTag=nullptr)
Value * CreateAShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Value * CreateFPExt(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateICmpULE(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateFMul(Value *L, Value *R, const Twine &Name="", MDNode *FPMD=nullptr)
Value * CreateFNeg(Value *V, const Twine &Name="", MDNode *FPMathTag=nullptr)
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
Type * getBFloatTy()
Fetch the type representing a 16-bit brain floating point value.
Value * CreateMul(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Base class for instruction visitors.
RetTy visitCallBase(CallBase &I)
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
const BasicBlock * getParent() const
InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
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
static 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.
bool IsNewDbgInfoFormat
Is this Module using intrinsics to record the position of debugging information, or non-intrinsic rec...
void setOperand(unsigned I, MDNode *New)
MDNode * getOperand(unsigned i) const
unsigned getNumOperands() const
A container for an operand bundle being viewed as a set of values rather than a set of uses.
ArrayRef< InputTy > inputs() const
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
Class to represent scalable SIMD vectors.
uint64_t getMinNumElements() const
Get the minimum number of elements in this vector.
ArrayRef< int > getShuffleMask() const
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void reserve(size_type N)
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.
StringRef - Represent a constant reference to a string, i.e.
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.
static constexpr size_t npos
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
StringSwitch & StartsWith(StringLiteral S, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, T Value)
Class to represent struct types.
static 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
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 Type * getHalfTy(LLVMContext &C)
static Type * getBFloatTy(LLVMContext &C)
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static IntegerType * getInt8Ty(LLVMContext &C)
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
static Type * getFloatTy(LLVMContext &C)
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.
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
void setName(const Twine &Name)
Change the name of the value.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< user_iterator > users()
LLVMContext & getContext() const
All values hold a context through their type.
StringRef getName() const
Return a constant reference to the value's name.
void takeName(Value *V)
Transfer the name from V to this value.
Base class of all SIMD vector types.
constexpr ScalarTy getFixedValue() const
self_iterator getIterator()
A raw_ostream that writes to an SmallVector or SmallString.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
AttributeMask typeIncompatible(Type *Ty, AttributeSafetyKind ASK=ASK_ALL)
Which attributes cannot be applied to a type.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)
Return the IIT table descriptor for the specified intrinsic into an array of IITDescriptors.
std::optional< Function * > remangleIntrinsicFunction(Function *F)
StringRef getName(ID id)
Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
AttributeList getAttributes(LLVMContext &C, ID id)
Return the attributes for an intrinsic.
Function * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
This is an optimization pass for GlobalISel generic memory operations.
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...
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.
void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
bool isValidAtomicOrdering(Int I)
bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
MDNode * upgradeInstructionLoopAttachment(MDNode &N)
Upgrade the loop attachment metadata node.
void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
void UpgradeCallsToIntrinsic(Function *F)
This is an auto-upgrade hook for any old intrinsic function syntaxes which need to have both the func...
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...
bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
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.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
unsigned getDebugMetadataVersionFromModule(const Module &M)
Return Debug Info Metadata Version by checking module flags.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
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.
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...
@ Dynamic
Denotes mode unknown at compile time.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
MDNode * UpgradeTBAANode(MDNode &TBAANode)
If the given TBAA tag uses the scalar TBAA format, create a new node corresponding to the upgrade to ...
void UpgradeARCRuntime(Module &M)
Convert calls to ARC runtime functions to intrinsic calls and upgrade the old retain release marker t...
bool verifyModule(const Module &M, raw_ostream *OS=nullptr, bool *BrokenDebugInfo=nullptr)
Check a module for errors.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Description of the encoding of one expression Op.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.