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(
"addqv")) {
851 if (!
F->getReturnType()->isFPOrFPVectorTy())
854 auto Args =
F->getFunctionType()->params();
855 Type *Tys[] = {
F->getReturnType(), Args[1]};
857 Intrinsic::aarch64_sve_faddqv, Tys);
861 if (
Name.consume_front(
"ld")) {
863 static const Regex LdRegex(
"^[234](.nxv[a-z0-9]+|$)");
866 dyn_cast<VectorType>(
F->getReturnType())->getElementType();
867 ElementCount EC = dyn_cast<VectorType>(
F->arg_begin()->getType())
869 Type *Ty = VectorType::get(ScalarTy, EC);
871 Intrinsic::aarch64_sve_ld2_sret,
872 Intrinsic::aarch64_sve_ld3_sret,
873 Intrinsic::aarch64_sve_ld4_sret,
876 LoadIDs[
Name[0] -
'2'], Ty);
882 if (
Name.consume_front(
"tuple.")) {
884 if (
Name.starts_with(
"get")) {
886 Type *Tys[] = {
F->getReturnType(),
F->arg_begin()->getType()};
888 Intrinsic::vector_extract, Tys);
892 if (
Name.starts_with(
"set")) {
894 auto Args =
F->getFunctionType()->params();
895 Type *Tys[] = {Args[0], Args[2], Args[1]};
897 Intrinsic::vector_insert, Tys);
901 static const Regex CreateTupleRegex(
"^create[234](.nxv[a-z0-9]+|$)");
904 auto Args =
F->getFunctionType()->params();
905 Type *Tys[] = {
F->getReturnType(), Args[1]};
907 Intrinsic::vector_insert, Tys);
919 if (
Name.consume_front(
"abs."))
921 .
Case(
"bf16", Intrinsic::nvvm_abs_bf16)
922 .
Case(
"bf16x2", Intrinsic::nvvm_abs_bf16x2)
925 if (
Name.consume_front(
"fma.rn."))
927 .
Case(
"bf16", Intrinsic::nvvm_fma_rn_bf16)
928 .
Case(
"bf16x2", Intrinsic::nvvm_fma_rn_bf16x2)
929 .
Case(
"ftz.bf16", Intrinsic::nvvm_fma_rn_ftz_bf16)
930 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fma_rn_ftz_bf16x2)
931 .
Case(
"ftz.relu.bf16", Intrinsic::nvvm_fma_rn_ftz_relu_bf16)
932 .
Case(
"ftz.relu.bf16x2", Intrinsic::nvvm_fma_rn_ftz_relu_bf16x2)
933 .
Case(
"ftz.sat.bf16", Intrinsic::nvvm_fma_rn_ftz_sat_bf16)
934 .
Case(
"ftz.sat.bf16x2", Intrinsic::nvvm_fma_rn_ftz_sat_bf16x2)
935 .
Case(
"relu.bf16", Intrinsic::nvvm_fma_rn_relu_bf16)
936 .
Case(
"relu.bf16x2", Intrinsic::nvvm_fma_rn_relu_bf16x2)
937 .
Case(
"sat.bf16", Intrinsic::nvvm_fma_rn_sat_bf16)
938 .
Case(
"sat.bf16x2", Intrinsic::nvvm_fma_rn_sat_bf16x2)
941 if (
Name.consume_front(
"fmax."))
943 .
Case(
"bf16", Intrinsic::nvvm_fmax_bf16)
944 .
Case(
"bf16x2", Intrinsic::nvvm_fmax_bf16x2)
945 .
Case(
"ftz.bf16", Intrinsic::nvvm_fmax_ftz_bf16)
946 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fmax_ftz_bf16x2)
947 .
Case(
"ftz.nan.bf16", Intrinsic::nvvm_fmax_ftz_nan_bf16)
948 .
Case(
"ftz.nan.bf16x2", Intrinsic::nvvm_fmax_ftz_nan_bf16x2)
949 .
Case(
"ftz.nan.xorsign.abs.bf16",
950 Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_bf16)
951 .
Case(
"ftz.nan.xorsign.abs.bf16x2",
952 Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_bf16x2)
953 .
Case(
"ftz.xorsign.abs.bf16", Intrinsic::nvvm_fmax_ftz_xorsign_abs_bf16)
954 .
Case(
"ftz.xorsign.abs.bf16x2",
955 Intrinsic::nvvm_fmax_ftz_xorsign_abs_bf16x2)
956 .
Case(
"nan.bf16", Intrinsic::nvvm_fmax_nan_bf16)
957 .
Case(
"nan.bf16x2", Intrinsic::nvvm_fmax_nan_bf16x2)
958 .
Case(
"nan.xorsign.abs.bf16", Intrinsic::nvvm_fmax_nan_xorsign_abs_bf16)
959 .
Case(
"nan.xorsign.abs.bf16x2",
960 Intrinsic::nvvm_fmax_nan_xorsign_abs_bf16x2)
961 .
Case(
"xorsign.abs.bf16", Intrinsic::nvvm_fmax_xorsign_abs_bf16)
962 .
Case(
"xorsign.abs.bf16x2", Intrinsic::nvvm_fmax_xorsign_abs_bf16x2)
965 if (
Name.consume_front(
"fmin."))
967 .
Case(
"bf16", Intrinsic::nvvm_fmin_bf16)
968 .
Case(
"bf16x2", Intrinsic::nvvm_fmin_bf16x2)
969 .
Case(
"ftz.bf16", Intrinsic::nvvm_fmin_ftz_bf16)
970 .
Case(
"ftz.bf16x2", Intrinsic::nvvm_fmin_ftz_bf16x2)
971 .
Case(
"ftz.nan.bf16", Intrinsic::nvvm_fmin_ftz_nan_bf16)
972 .
Case(
"ftz.nan.bf16x2", Intrinsic::nvvm_fmin_ftz_nan_bf16x2)
973 .
Case(
"ftz.nan.xorsign.abs.bf16",
974 Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_bf16)
975 .
Case(
"ftz.nan.xorsign.abs.bf16x2",
976 Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_bf16x2)
977 .
Case(
"ftz.xorsign.abs.bf16", Intrinsic::nvvm_fmin_ftz_xorsign_abs_bf16)
978 .
Case(
"ftz.xorsign.abs.bf16x2",
979 Intrinsic::nvvm_fmin_ftz_xorsign_abs_bf16x2)
980 .
Case(
"nan.bf16", Intrinsic::nvvm_fmin_nan_bf16)
981 .
Case(
"nan.bf16x2", Intrinsic::nvvm_fmin_nan_bf16x2)
982 .
Case(
"nan.xorsign.abs.bf16", Intrinsic::nvvm_fmin_nan_xorsign_abs_bf16)
983 .
Case(
"nan.xorsign.abs.bf16x2",
984 Intrinsic::nvvm_fmin_nan_xorsign_abs_bf16x2)
985 .
Case(
"xorsign.abs.bf16", Intrinsic::nvvm_fmin_xorsign_abs_bf16)
986 .
Case(
"xorsign.abs.bf16x2", Intrinsic::nvvm_fmin_xorsign_abs_bf16x2)
989 if (
Name.consume_front(
"neg."))
991 .
Case(
"bf16", Intrinsic::nvvm_neg_bf16)
992 .
Case(
"bf16x2", Intrinsic::nvvm_neg_bf16x2)
999 bool CanUpgradeDebugIntrinsicsToRecords) {
1000 assert(
F &&
"Illegal to upgrade a non-existent Function.");
1005 if (!
Name.consume_front(
"llvm.") ||
Name.empty())
1011 bool IsArm =
Name.consume_front(
"arm.");
1012 if (IsArm ||
Name.consume_front(
"aarch64.")) {
1018 if (
Name.consume_front(
"amdgcn.")) {
1019 if (
Name ==
"alignbit") {
1022 {F->getReturnType()});
1026 if (
Name.consume_front(
"atomic.")) {
1027 if (
Name.starts_with(
"inc") ||
Name.starts_with(
"dec")) {
1036 if (
Name.starts_with(
"ldexp.")) {
1039 F->getParent(), Intrinsic::ldexp,
1040 {F->getReturnType(), F->getArg(1)->getType()});
1049 if (
F->arg_size() == 1) {
1057 F->arg_begin()->getType());
1062 if (
F->arg_size() == 2 &&
Name.equals(
"coro.end")) {
1071 if (
Name.consume_front(
"dbg.")) {
1073 if (CanUpgradeDebugIntrinsicsToRecords &&
1074 F->getParent()->IsNewDbgInfoFormat) {
1075 if (
Name ==
"addr" ||
Name ==
"value" ||
Name ==
"assign" ||
1076 Name ==
"declare" ||
Name ==
"label") {
1085 if (
Name ==
"addr" || (
Name ==
"value" &&
F->arg_size() == 4)) {
1094 if (
Name.consume_front(
"experimental.vector.")) {
1096 .
StartsWith(
"extract.", Intrinsic::vector_extract)
1097 .
StartsWith(
"insert.", Intrinsic::vector_insert)
1100 const auto *FT =
F->getFunctionType();
1102 if (
ID == Intrinsic::vector_extract)
1106 if (
ID == Intrinsic::vector_insert)
1114 if (
Name.consume_front(
"reduce.")) {
1116 static const Regex R(
"^([a-z]+)\\.[a-z][0-9]+");
1119 .
Case(
"add", Intrinsic::vector_reduce_add)
1120 .
Case(
"mul", Intrinsic::vector_reduce_mul)
1121 .
Case(
"and", Intrinsic::vector_reduce_and)
1122 .
Case(
"or", Intrinsic::vector_reduce_or)
1123 .
Case(
"xor", Intrinsic::vector_reduce_xor)
1124 .
Case(
"smax", Intrinsic::vector_reduce_smax)
1125 .
Case(
"smin", Intrinsic::vector_reduce_smin)
1126 .
Case(
"umax", Intrinsic::vector_reduce_umax)
1127 .
Case(
"umin", Intrinsic::vector_reduce_umin)
1128 .
Case(
"fmax", Intrinsic::vector_reduce_fmax)
1129 .
Case(
"fmin", Intrinsic::vector_reduce_fmin)
1134 static const Regex R2(
"^v2\\.([a-z]+)\\.[fi][0-9]+");
1139 .
Case(
"fadd", Intrinsic::vector_reduce_fadd)
1140 .
Case(
"fmul", Intrinsic::vector_reduce_fmul)
1145 auto Args =
F->getFunctionType()->params();
1156 if (
Name.starts_with(
"flt.rounds")) {
1163 if (
Name.starts_with(
"invariant.group.barrier")) {
1165 auto Args =
F->getFunctionType()->params();
1166 Type* ObjectPtr[1] = {Args[0]};
1169 Intrinsic::launder_invariant_group, ObjectPtr);
1178 .StartsWith(
"memcpy.", Intrinsic::memcpy)
1179 .StartsWith(
"memmove.", Intrinsic::memmove)
1181 if (
F->arg_size() == 5) {
1185 F->getFunctionType()->params().slice(0, 3);
1190 if (
Name.starts_with(
"memset.") &&
F->arg_size() == 5) {
1193 const auto *FT =
F->getFunctionType();
1194 Type *ParamTypes[2] = {
1195 FT->getParamType(0),
1205 if (
Name.consume_front(
"nvvm.")) {
1207 if (
F->arg_size() == 1) {
1210 .
Cases(
"brev32",
"brev64", Intrinsic::bitreverse)
1211 .
Case(
"clz.i", Intrinsic::ctlz)
1212 .
Case(
"popc.i", Intrinsic::ctpop)
1216 {F->getReturnType()});
1222 if (!
F->getReturnType()->getScalarType()->isBFloatTy()) {
1234 bool Expand =
false;
1235 if (
Name.consume_front(
"abs."))
1237 Expand =
Name ==
"i" ||
Name ==
"ll";
1238 else if (
Name ==
"clz.ll" ||
Name ==
"popc.ll" ||
Name ==
"h2f")
1240 else if (
Name.consume_front(
"max.") ||
Name.consume_front(
"min."))
1244 else if (
Name.consume_front(
"atomic.load.add."))
1246 Expand =
Name.starts_with(
"f32.p") ||
Name.starts_with(
"f64.p");
1261 if (
Name.starts_with(
"objectsize.")) {
1262 Type *Tys[2] = {
F->getReturnType(),
F->arg_begin()->getType() };
1263 if (
F->arg_size() == 2 ||
F->arg_size() == 3 ||
1275 if (
Name.starts_with(
"ptr.annotation.") &&
F->arg_size() == 4) {
1278 F->getParent(), Intrinsic::ptr_annotation,
1279 {F->arg_begin()->getType(), F->getArg(1)->getType()});
1285 if (
Name.consume_front(
"riscv.")) {
1288 .
Case(
"aes32dsi", Intrinsic::riscv_aes32dsi)
1289 .
Case(
"aes32dsmi", Intrinsic::riscv_aes32dsmi)
1290 .
Case(
"aes32esi", Intrinsic::riscv_aes32esi)
1291 .
Case(
"aes32esmi", Intrinsic::riscv_aes32esmi)
1294 if (!
F->getFunctionType()->getParamType(2)->isIntegerTy(32)) {
1307 if (!
F->getFunctionType()->getParamType(2)->isIntegerTy(32) ||
1308 F->getFunctionType()->getReturnType()->isIntegerTy(64)) {
1317 .
StartsWith(
"sha256sig0", Intrinsic::riscv_sha256sig0)
1318 .
StartsWith(
"sha256sig1", Intrinsic::riscv_sha256sig1)
1319 .
StartsWith(
"sha256sum0", Intrinsic::riscv_sha256sum0)
1320 .
StartsWith(
"sha256sum1", Intrinsic::riscv_sha256sum1)
1325 if (
F->getFunctionType()->getReturnType()->isIntegerTy(64)) {
1337 if (
Name ==
"stackprotectorcheck") {
1344 if (
Name ==
"var.annotation" &&
F->arg_size() == 4) {
1347 F->getParent(), Intrinsic::var_annotation,
1348 {{F->arg_begin()->getType(), F->getArg(1)->getType()}});
1355 if (
Name.consume_front(
"wasm.")) {
1358 .
StartsWith(
"fma.", Intrinsic::wasm_relaxed_madd)
1359 .
StartsWith(
"fms.", Intrinsic::wasm_relaxed_nmadd)
1360 .
StartsWith(
"laneselect.", Intrinsic::wasm_relaxed_laneselect)
1369 if (
Name.consume_front(
"dot.i8x16.i7x16.")) {
1371 .
Case(
"signed", Intrinsic::wasm_relaxed_dot_i8x16_i7x16_signed)
1373 Intrinsic::wasm_relaxed_dot_i8x16_i7x16_add_signed)
1391 auto *
ST = dyn_cast<StructType>(
F->getReturnType());
1392 if (ST && (!
ST->isLiteral() ||
ST->isPacked()) &&
1401 auto *FT =
F->getFunctionType();
1403 auto *NewFT = FunctionType::get(NewST, FT->params(), FT->isVarArg());
1404 std::string
Name =
F->getName().str();
1407 Name,
F->getParent());
1418 if (Result != std::nullopt) {
1431 bool CanUpgradeDebugIntrinsicsToRecords) {
1435 assert(
F != NewFn &&
"Intrinsic function upgraded to the same function");
1447 GV->
getName() ==
"llvm.global_dtors")) ||
1462 unsigned N =
Init->getNumOperands();
1463 std::vector<Constant *> NewCtors(
N);
1464 for (
unsigned i = 0; i !=
N; ++i) {
1465 auto Ctor = cast<Constant>(
Init->getOperand(i));
1467 Ctor->getAggregateElement(1),
1480 auto *ResultTy = cast<FixedVectorType>(
Op->getType());
1481 unsigned NumElts = ResultTy->getNumElements() * 8;
1495 for (
unsigned l = 0; l != NumElts; l += 16)
1496 for (
unsigned i = 0; i != 16; ++i) {
1497 unsigned Idx = NumElts + i - Shift;
1499 Idx -= NumElts - 16;
1500 Idxs[l + i] =
Idx + l;
1514 auto *ResultTy = cast<FixedVectorType>(
Op->getType());
1515 unsigned NumElts = ResultTy->getNumElements() * 8;
1529 for (
unsigned l = 0; l != NumElts; l += 16)
1530 for (
unsigned i = 0; i != 16; ++i) {
1531 unsigned Idx = i + Shift;
1533 Idx += NumElts - 16;
1534 Idxs[l + i] =
Idx + l;
1555 for (
unsigned i = 0; i != NumElts; ++i)
1567 if (
const auto *
C = dyn_cast<Constant>(Mask))
1568 if (
C->isAllOnesValue())
1572 cast<FixedVectorType>(Op0->
getType())->getNumElements());
1579 if (
const auto *
C = dyn_cast<Constant>(Mask))
1580 if (
C->isAllOnesValue())
1584 Mask->getType()->getIntegerBitWidth());
1597 unsigned ShiftVal = cast<llvm::ConstantInt>(Shift)->getZExtValue();
1599 unsigned NumElts = cast<FixedVectorType>(Op0->
getType())->getNumElements();
1600 assert((IsVALIGN || NumElts % 16 == 0) &&
"Illegal NumElts for PALIGNR!");
1601 assert((!IsVALIGN || NumElts <= 16) &&
"NumElts too large for VALIGN!");
1606 ShiftVal &= (NumElts - 1);
1615 if (ShiftVal > 16) {
1623 for (
unsigned l = 0; l < NumElts; l += 16) {
1624 for (
unsigned i = 0; i != 16; ++i) {
1625 unsigned Idx = ShiftVal + i;
1626 if (!IsVALIGN &&
Idx >= 16)
1627 Idx += NumElts - 16;
1628 Indices[l + i] =
Idx + l;
1633 Op1, Op0,
ArrayRef(Indices, NumElts),
"palignr");
1639 bool ZeroMask,
bool IndexForm) {
1645 if (VecWidth == 128 && EltWidth == 32 && IsFloat)
1646 IID = Intrinsic::x86_avx512_vpermi2var_ps_128;
1647 else if (VecWidth == 128 && EltWidth == 32 && !IsFloat)
1648 IID = Intrinsic::x86_avx512_vpermi2var_d_128;
1649 else if (VecWidth == 128 && EltWidth == 64 && IsFloat)
1650 IID = Intrinsic::x86_avx512_vpermi2var_pd_128;
1651 else if (VecWidth == 128 && EltWidth == 64 && !IsFloat)
1652 IID = Intrinsic::x86_avx512_vpermi2var_q_128;
1653 else if (VecWidth == 256 && EltWidth == 32 && IsFloat)
1654 IID = Intrinsic::x86_avx512_vpermi2var_ps_256;
1655 else if (VecWidth == 256 && EltWidth == 32 && !IsFloat)
1656 IID = Intrinsic::x86_avx512_vpermi2var_d_256;
1657 else if (VecWidth == 256 && EltWidth == 64 && IsFloat)
1658 IID = Intrinsic::x86_avx512_vpermi2var_pd_256;
1659 else if (VecWidth == 256 && EltWidth == 64 && !IsFloat)
1660 IID = Intrinsic::x86_avx512_vpermi2var_q_256;
1661 else if (VecWidth == 512 && EltWidth == 32 && IsFloat)
1662 IID = Intrinsic::x86_avx512_vpermi2var_ps_512;
1663 else if (VecWidth == 512 && EltWidth == 32 && !IsFloat)
1664 IID = Intrinsic::x86_avx512_vpermi2var_d_512;
1665 else if (VecWidth == 512 && EltWidth == 64 && IsFloat)
1666 IID = Intrinsic::x86_avx512_vpermi2var_pd_512;
1667 else if (VecWidth == 512 && EltWidth == 64 && !IsFloat)
1668 IID = Intrinsic::x86_avx512_vpermi2var_q_512;
1669 else if (VecWidth == 128 && EltWidth == 16)
1670 IID = Intrinsic::x86_avx512_vpermi2var_hi_128;
1671 else if (VecWidth == 256 && EltWidth == 16)
1672 IID = Intrinsic::x86_avx512_vpermi2var_hi_256;
1673 else if (VecWidth == 512 && EltWidth == 16)
1674 IID = Intrinsic::x86_avx512_vpermi2var_hi_512;
1675 else if (VecWidth == 128 && EltWidth == 8)
1676 IID = Intrinsic::x86_avx512_vpermi2var_qi_128;
1677 else if (VecWidth == 256 && EltWidth == 8)
1678 IID = Intrinsic::x86_avx512_vpermi2var_qi_256;
1679 else if (VecWidth == 512 && EltWidth == 8)
1680 IID = Intrinsic::x86_avx512_vpermi2var_qi_512;
1716 bool IsRotateRight) {
1725 unsigned NumElts = cast<FixedVectorType>(Ty)->getNumElements();
1730 Intrinsic::ID IID = IsRotateRight ? Intrinsic::fshr : Intrinsic::fshl;
1751 Pred = IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
1754 Pred = IsSigned ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
1757 Pred = IsSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
1760 Pred = IsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
1763 Pred = ICmpInst::ICMP_EQ;
1766 Pred = ICmpInst::ICMP_NE;
1782 bool IsShiftRight,
bool ZeroMask) {
1795 unsigned NumElts = cast<FixedVectorType>(Ty)->getNumElements();
1800 Intrinsic::ID IID = IsShiftRight ? Intrinsic::fshr : Intrinsic::fshl;
1820 const Align Alignment =
1822 ?
Align(Data->getType()->getPrimitiveSizeInBits().getFixedValue() / 8)
1826 if (
const auto *
C = dyn_cast<Constant>(Mask))
1827 if (
C->isAllOnesValue())
1831 unsigned NumElts = cast<FixedVectorType>(Data->getType())->getNumElements();
1841 const Align Alignment =
1849 if (
const auto *
C = dyn_cast<Constant>(Mask))
1850 if (
C->isAllOnesValue())
1854 unsigned NumElts = cast<FixedVectorType>(ValTy)->getNumElements();
1878 Constant *ShiftAmt = ConstantInt::get(Ty, 32);
1885 Constant *Mask = ConstantInt::get(Ty, 0xffffffff);
1901 unsigned NumElts = cast<FixedVectorType>(Vec->
getType())->getNumElements();
1903 const auto *
C = dyn_cast<Constant>(Mask);
1904 if (!
C || !
C->isAllOnesValue())
1910 for (
unsigned i = 0; i != NumElts; ++i)
1912 for (
unsigned i = NumElts; i != 8; ++i)
1913 Indices[i] = NumElts + i % NumElts;
1924 unsigned NumElts = cast<FixedVectorType>(Op0->
getType())->getNumElements();
1930 }
else if (
CC == 7) {
1937 case 0: Pred = ICmpInst::ICMP_EQ;
break;
1938 case 1: Pred =
Signed ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
break;
1939 case 2: Pred =
Signed ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
break;
1940 case 4: Pred = ICmpInst::ICMP_NE;
break;
1941 case 5: Pred =
Signed ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
break;
1942 case 6: Pred =
Signed ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
break;
1978 unsigned NumElts = cast<FixedVectorType>(CI.
getType())->getNumElements();
1980 return Builder.
CreateSExt(Mask, ReturnOp,
"vpmovm2");
1991 if (
Name.starts_with(
"max.p")) {
1992 if (VecWidth == 128 && EltWidth == 32)
1993 IID = Intrinsic::x86_sse_max_ps;
1994 else if (VecWidth == 128 && EltWidth == 64)
1995 IID = Intrinsic::x86_sse2_max_pd;
1996 else if (VecWidth == 256 && EltWidth == 32)
1997 IID = Intrinsic::x86_avx_max_ps_256;
1998 else if (VecWidth == 256 && EltWidth == 64)
1999 IID = Intrinsic::x86_avx_max_pd_256;
2002 }
else if (
Name.starts_with(
"min.p")) {
2003 if (VecWidth == 128 && EltWidth == 32)
2004 IID = Intrinsic::x86_sse_min_ps;
2005 else if (VecWidth == 128 && EltWidth == 64)
2006 IID = Intrinsic::x86_sse2_min_pd;
2007 else if (VecWidth == 256 && EltWidth == 32)
2008 IID = Intrinsic::x86_avx_min_ps_256;
2009 else if (VecWidth == 256 && EltWidth == 64)
2010 IID = Intrinsic::x86_avx_min_pd_256;
2013 }
else if (
Name.starts_with(
"pshuf.b.")) {
2014 if (VecWidth == 128)
2015 IID = Intrinsic::x86_ssse3_pshuf_b_128;
2016 else if (VecWidth == 256)
2017 IID = Intrinsic::x86_avx2_pshuf_b;
2018 else if (VecWidth == 512)
2019 IID = Intrinsic::x86_avx512_pshuf_b_512;
2022 }
else if (
Name.starts_with(
"pmul.hr.sw.")) {
2023 if (VecWidth == 128)
2024 IID = Intrinsic::x86_ssse3_pmul_hr_sw_128;
2025 else if (VecWidth == 256)
2026 IID = Intrinsic::x86_avx2_pmul_hr_sw;
2027 else if (VecWidth == 512)
2028 IID = Intrinsic::x86_avx512_pmul_hr_sw_512;
2031 }
else if (
Name.starts_with(
"pmulh.w.")) {
2032 if (VecWidth == 128)
2033 IID = Intrinsic::x86_sse2_pmulh_w;
2034 else if (VecWidth == 256)
2035 IID = Intrinsic::x86_avx2_pmulh_w;
2036 else if (VecWidth == 512)
2037 IID = Intrinsic::x86_avx512_pmulh_w_512;
2040 }
else if (
Name.starts_with(
"pmulhu.w.")) {
2041 if (VecWidth == 128)
2042 IID = Intrinsic::x86_sse2_pmulhu_w;
2043 else if (VecWidth == 256)
2044 IID = Intrinsic::x86_avx2_pmulhu_w;
2045 else if (VecWidth == 512)
2046 IID = Intrinsic::x86_avx512_pmulhu_w_512;
2049 }
else if (
Name.starts_with(
"pmaddw.d.")) {
2050 if (VecWidth == 128)
2051 IID = Intrinsic::x86_sse2_pmadd_wd;
2052 else if (VecWidth == 256)
2053 IID = Intrinsic::x86_avx2_pmadd_wd;
2054 else if (VecWidth == 512)
2055 IID = Intrinsic::x86_avx512_pmaddw_d_512;
2058 }
else if (
Name.starts_with(
"pmaddubs.w.")) {
2059 if (VecWidth == 128)
2060 IID = Intrinsic::x86_ssse3_pmadd_ub_sw_128;
2061 else if (VecWidth == 256)
2062 IID = Intrinsic::x86_avx2_pmadd_ub_sw;
2063 else if (VecWidth == 512)
2064 IID = Intrinsic::x86_avx512_pmaddubs_w_512;
2067 }
else if (
Name.starts_with(
"packsswb.")) {
2068 if (VecWidth == 128)
2069 IID = Intrinsic::x86_sse2_packsswb_128;
2070 else if (VecWidth == 256)
2071 IID = Intrinsic::x86_avx2_packsswb;
2072 else if (VecWidth == 512)
2073 IID = Intrinsic::x86_avx512_packsswb_512;
2076 }
else if (
Name.starts_with(
"packssdw.")) {
2077 if (VecWidth == 128)
2078 IID = Intrinsic::x86_sse2_packssdw_128;
2079 else if (VecWidth == 256)
2080 IID = Intrinsic::x86_avx2_packssdw;
2081 else if (VecWidth == 512)
2082 IID = Intrinsic::x86_avx512_packssdw_512;
2085 }
else if (
Name.starts_with(
"packuswb.")) {
2086 if (VecWidth == 128)
2087 IID = Intrinsic::x86_sse2_packuswb_128;
2088 else if (VecWidth == 256)
2089 IID = Intrinsic::x86_avx2_packuswb;
2090 else if (VecWidth == 512)
2091 IID = Intrinsic::x86_avx512_packuswb_512;
2094 }
else if (
Name.starts_with(
"packusdw.")) {
2095 if (VecWidth == 128)
2096 IID = Intrinsic::x86_sse41_packusdw;
2097 else if (VecWidth == 256)
2098 IID = Intrinsic::x86_avx2_packusdw;
2099 else if (VecWidth == 512)
2100 IID = Intrinsic::x86_avx512_packusdw_512;
2103 }
else if (
Name.starts_with(
"vpermilvar.")) {
2104 if (VecWidth == 128 && EltWidth == 32)
2105 IID = Intrinsic::x86_avx_vpermilvar_ps;
2106 else if (VecWidth == 128 && EltWidth == 64)
2107 IID = Intrinsic::x86_avx_vpermilvar_pd;
2108 else if (VecWidth == 256 && EltWidth == 32)
2109 IID = Intrinsic::x86_avx_vpermilvar_ps_256;
2110 else if (VecWidth == 256 && EltWidth == 64)
2111 IID = Intrinsic::x86_avx_vpermilvar_pd_256;
2112 else if (VecWidth == 512 && EltWidth == 32)
2113 IID = Intrinsic::x86_avx512_vpermilvar_ps_512;
2114 else if (VecWidth == 512 && EltWidth == 64)
2115 IID = Intrinsic::x86_avx512_vpermilvar_pd_512;
2118 }
else if (
Name ==
"cvtpd2dq.256") {
2119 IID = Intrinsic::x86_avx_cvt_pd2dq_256;
2120 }
else if (
Name ==
"cvtpd2ps.256") {
2121 IID = Intrinsic::x86_avx_cvt_pd2_ps_256;
2122 }
else if (
Name ==
"cvttpd2dq.256") {
2123 IID = Intrinsic::x86_avx_cvtt_pd2dq_256;
2124 }
else if (
Name ==
"cvttps2dq.128") {
2125 IID = Intrinsic::x86_sse2_cvttps2dq;
2126 }
else if (
Name ==
"cvttps2dq.256") {
2127 IID = Intrinsic::x86_avx_cvtt_ps2dq_256;
2128 }
else if (
Name.starts_with(
"permvar.")) {
2130 if (VecWidth == 256 && EltWidth == 32 && IsFloat)
2131 IID = Intrinsic::x86_avx2_permps;
2132 else if (VecWidth == 256 && EltWidth == 32 && !IsFloat)
2133 IID = Intrinsic::x86_avx2_permd;
2134 else if (VecWidth == 256 && EltWidth == 64 && IsFloat)
2135 IID = Intrinsic::x86_avx512_permvar_df_256;
2136 else if (VecWidth == 256 && EltWidth == 64 && !IsFloat)
2137 IID = Intrinsic::x86_avx512_permvar_di_256;
2138 else if (VecWidth == 512 && EltWidth == 32 && IsFloat)
2139 IID = Intrinsic::x86_avx512_permvar_sf_512;
2140 else if (VecWidth == 512 && EltWidth == 32 && !IsFloat)
2141 IID = Intrinsic::x86_avx512_permvar_si_512;
2142 else if (VecWidth == 512 && EltWidth == 64 && IsFloat)
2143 IID = Intrinsic::x86_avx512_permvar_df_512;
2144 else if (VecWidth == 512 && EltWidth == 64 && !IsFloat)
2145 IID = Intrinsic::x86_avx512_permvar_di_512;
2146 else if (VecWidth == 128 && EltWidth == 16)
2147 IID = Intrinsic::x86_avx512_permvar_hi_128;
2148 else if (VecWidth == 256 && EltWidth == 16)
2149 IID = Intrinsic::x86_avx512_permvar_hi_256;
2150 else if (VecWidth == 512 && EltWidth == 16)
2151 IID = Intrinsic::x86_avx512_permvar_hi_512;
2152 else if (VecWidth == 128 && EltWidth == 8)
2153 IID = Intrinsic::x86_avx512_permvar_qi_128;
2154 else if (VecWidth == 256 && EltWidth == 8)
2155 IID = Intrinsic::x86_avx512_permvar_qi_256;
2156 else if (VecWidth == 512 && EltWidth == 8)
2157 IID = Intrinsic::x86_avx512_permvar_qi_512;
2160 }
else if (
Name.starts_with(
"dbpsadbw.")) {
2161 if (VecWidth == 128)
2162 IID = Intrinsic::x86_avx512_dbpsadbw_128;
2163 else if (VecWidth == 256)
2164 IID = Intrinsic::x86_avx512_dbpsadbw_256;
2165 else if (VecWidth == 512)
2166 IID = Intrinsic::x86_avx512_dbpsadbw_512;
2169 }
else if (
Name.starts_with(
"pmultishift.qb.")) {
2170 if (VecWidth == 128)
2171 IID = Intrinsic::x86_avx512_pmultishift_qb_128;
2172 else if (VecWidth == 256)
2173 IID = Intrinsic::x86_avx512_pmultishift_qb_256;
2174 else if (VecWidth == 512)
2175 IID = Intrinsic::x86_avx512_pmultishift_qb_512;
2178 }
else if (
Name.starts_with(
"conflict.")) {
2179 if (
Name[9] ==
'd' && VecWidth == 128)
2180 IID = Intrinsic::x86_avx512_conflict_d_128;
2181 else if (
Name[9] ==
'd' && VecWidth == 256)
2182 IID = Intrinsic::x86_avx512_conflict_d_256;
2183 else if (
Name[9] ==
'd' && VecWidth == 512)
2184 IID = Intrinsic::x86_avx512_conflict_d_512;
2185 else if (
Name[9] ==
'q' && VecWidth == 128)
2186 IID = Intrinsic::x86_avx512_conflict_q_128;
2187 else if (
Name[9] ==
'q' && VecWidth == 256)
2188 IID = Intrinsic::x86_avx512_conflict_q_256;
2189 else if (
Name[9] ==
'q' && VecWidth == 512)
2190 IID = Intrinsic::x86_avx512_conflict_q_512;
2193 }
else if (
Name.starts_with(
"pavg.")) {
2194 if (
Name[5] ==
'b' && VecWidth == 128)
2195 IID = Intrinsic::x86_sse2_pavg_b;
2196 else if (
Name[5] ==
'b' && VecWidth == 256)
2197 IID = Intrinsic::x86_avx2_pavg_b;
2198 else if (
Name[5] ==
'b' && VecWidth == 512)
2199 IID = Intrinsic::x86_avx512_pavg_b_512;
2200 else if (
Name[5] ==
'w' && VecWidth == 128)
2201 IID = Intrinsic::x86_sse2_pavg_w;
2202 else if (
Name[5] ==
'w' && VecWidth == 256)
2203 IID = Intrinsic::x86_avx2_pavg_w;
2204 else if (
Name[5] ==
'w' && VecWidth == 512)
2205 IID = Intrinsic::x86_avx512_pavg_w_512;
2226 if (AsmStr->find(
"mov\tfp") == 0 &&
2227 AsmStr->find(
"objc_retainAutoreleaseReturnValue") != std::string::npos &&
2228 (Pos = AsmStr->find(
"# marker")) != std::string::npos) {
2229 AsmStr->replace(Pos, 1,
";");
2235 if (
Name ==
"mve.vctp64.old") {
2243 F->getParent(), Intrinsic::arm_mve_pred_v2i,
2244 {VectorType::get(Builder.getInt1Ty(), 2, false)}),
2248 F->getParent(), Intrinsic::arm_mve_pred_i2v,
2249 {VectorType::get(Builder.getInt1Ty(), 4, false)}),
2251 }
else if (
Name ==
"mve.mull.int.predicated.v2i64.v4i32.v4i1" ||
2252 Name ==
"mve.vqdmull.predicated.v2i64.v4i32.v4i1" ||
2253 Name ==
"mve.vldr.gather.base.predicated.v2i64.v2i64.v4i1" ||
2254 Name ==
"mve.vldr.gather.base.wb.predicated.v2i64.v2i64.v4i1" ||
2256 "mve.vldr.gather.offset.predicated.v2i64.p0i64.v2i64.v4i1" ||
2257 Name ==
"mve.vldr.gather.offset.predicated.v2i64.p0.v2i64.v4i1" ||
2258 Name ==
"mve.vstr.scatter.base.predicated.v2i64.v2i64.v4i1" ||
2259 Name ==
"mve.vstr.scatter.base.wb.predicated.v2i64.v2i64.v4i1" ||
2261 "mve.vstr.scatter.offset.predicated.p0i64.v2i64.v2i64.v4i1" ||
2262 Name ==
"mve.vstr.scatter.offset.predicated.p0.v2i64.v2i64.v4i1" ||
2263 Name ==
"cde.vcx1q.predicated.v2i64.v4i1" ||
2264 Name ==
"cde.vcx1qa.predicated.v2i64.v4i1" ||
2265 Name ==
"cde.vcx2q.predicated.v2i64.v4i1" ||
2266 Name ==
"cde.vcx2qa.predicated.v2i64.v4i1" ||
2267 Name ==
"cde.vcx3q.predicated.v2i64.v4i1" ||
2268 Name ==
"cde.vcx3qa.predicated.v2i64.v4i1") {
2269 std::vector<Type *> Tys;
2273 case Intrinsic::arm_mve_mull_int_predicated:
2274 case Intrinsic::arm_mve_vqdmull_predicated:
2275 case Intrinsic::arm_mve_vldr_gather_base_predicated:
2278 case Intrinsic::arm_mve_vldr_gather_base_wb_predicated:
2279 case Intrinsic::arm_mve_vstr_scatter_base_predicated:
2280 case Intrinsic::arm_mve_vstr_scatter_base_wb_predicated:
2284 case Intrinsic::arm_mve_vldr_gather_offset_predicated:
2288 case Intrinsic::arm_mve_vstr_scatter_offset_predicated:
2292 case Intrinsic::arm_cde_vcx1q_predicated:
2293 case Intrinsic::arm_cde_vcx1qa_predicated:
2294 case Intrinsic::arm_cde_vcx2q_predicated:
2295 case Intrinsic::arm_cde_vcx2qa_predicated:
2296 case Intrinsic::arm_cde_vcx3q_predicated:
2297 case Intrinsic::arm_cde_vcx3qa_predicated:
2304 std::vector<Value *> Ops;
2306 Type *Ty =
Op->getType();
2310 F->getParent(), Intrinsic::arm_mve_pred_v2i,
2311 {VectorType::get(Builder.getInt1Ty(), 4, false)}),
2315 Intrinsic::arm_mve_pred_i2v, {V2I1Ty}),
2329 const bool IsInc =
Name.starts_with(
"atomic.inc.");
2330 if (IsInc ||
Name.starts_with(
"atomic.dec.")) {
2345 if (Order == AtomicOrdering::NotAtomic ||
2346 Order == AtomicOrdering::Unordered)
2347 Order = AtomicOrdering::SequentiallyConsistent;
2351 SyncScope::ID SSID =
F->getContext().getOrInsertSyncScopeID(
"agent");
2355 if (!VolatileArg || !VolatileArg->
isZero())
2364template <
typename MDType>
2367 return dyn_cast<MDType>(MAV->getMetadata());
2376 if (
Name ==
"label") {
2378 }
else if (
Name ==
"assign") {
2380 unwrapMAVOp<Metadata>(CI, 0), unwrapMAVOp<DILocalVariable>(CI, 1),
2381 unwrapMAVOp<DIExpression>(CI, 2), unwrapMAVOp<DIAssignID>(CI, 3),
2382 unwrapMAVOp<Metadata>(CI, 4), unwrapMAVOp<DIExpression>(CI, 5),
2384 }
else if (
Name ==
"declare") {
2386 unwrapMAVOp<Metadata>(CI, 0), unwrapMAVOp<DILocalVariable>(CI, 1),
2387 unwrapMAVOp<DIExpression>(CI, 2), CI->
getDebugLoc(),
2388 DbgVariableRecord::LocationType::Declare);
2389 }
else if (
Name ==
"addr") {
2394 unwrapMAVOp<DILocalVariable>(CI, 1), Expr,
2396 }
else if (
Name ==
"value") {
2399 unsigned ExprOp = 2;
2409 unwrapMAVOp<Metadata>(CI, 0), unwrapMAVOp<DILocalVariable>(CI, VarOp),
2410 unwrapMAVOp<DIExpression>(CI, ExprOp), CI->
getDebugLoc());
2412 assert(DR &&
"Unhandled intrinsic kind in upgrade to DbgRecord");
2431 bool FallthroughToDefaultUpgrade =
false;
2435 assert(
Name.starts_with(
"llvm.") &&
"Intrinsic doesn't start with 'llvm.'");
2438 bool IsX86 =
Name.consume_front(
"x86.");
2439 bool IsNVVM =
Name.consume_front(
"nvvm.");
2440 bool IsARM =
Name.consume_front(
"arm.");
2441 bool IsAMDGCN =
Name.consume_front(
"amdgcn.");
2442 bool IsDbg =
Name.consume_front(
"dbg.");
2444 if (IsX86 &&
Name.starts_with(
"sse4a.movnt.")) {
2455 Type *SrcEltTy = cast<VectorType>(Arg1->
getType())->getElementType();
2456 PointerType *EltPtrTy = PointerType::getUnqual(SrcEltTy);
2462 SI->setMetadata(LLVMContext::MD_nontemporal, Node);
2469 if (IsX86 && (
Name.starts_with(
"avx.movnt.") ||
2470 Name.starts_with(
"avx512.storent."))) {
2481 PointerType::getUnqual(Arg1->
getType()),
2486 SI->setMetadata(LLVMContext::MD_nontemporal, Node);
2493 if (IsX86 &&
Name ==
"sse2.storel.dq") {
2501 PointerType::getUnqual(Elt->
getType()),
2510 if (IsX86 && (
Name.starts_with(
"sse.storeu.") ||
2511 Name.starts_with(
"sse2.storeu.") ||
2512 Name.starts_with(
"avx.storeu."))) {
2517 PointerType::getUnqual(Arg1->
getType()),
2526 if (IsX86 &&
Name ==
"avx512.mask.store.ss") {
2536 if (IsX86 &&
Name.starts_with(
"avx512.mask.store")) {
2547 Value *Rep =
nullptr;
2549 if (IsX86 && (
Name.starts_with(
"sse2.pcmp") ||
2550 Name.starts_with(
"avx2.pcmp"))) {
2552 bool CmpEq =
Name[9] ==
'e';
2553 Rep = Builder.
CreateICmp(CmpEq ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_SGT,
2556 }
else if (IsX86 && (
Name.starts_with(
"avx512.broadcastm"))) {
2564 }
else if (IsX86 && (
Name ==
"sse.sqrt.ss" ||
2565 Name ==
"sse2.sqrt.sd")) {
2569 Intrinsic::sqrt, Elt0->
getType());
2572 }
else if (IsX86 && (
Name.starts_with(
"avx.sqrt.p") ||
2573 Name.starts_with(
"sse2.sqrt.p") ||
2574 Name.starts_with(
"sse.sqrt.p"))) {
2578 {CI->getArgOperand(0)});
2579 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.sqrt.p"))) {
2582 cast<ConstantInt>(CI->
getArgOperand(3))->getZExtValue() != 4)) {
2584 : Intrinsic::x86_avx512_sqrt_pd_512;
2593 {CI->getArgOperand(0)});
2597 }
else if (IsX86 && (
Name.starts_with(
"avx512.ptestm") ||
2598 Name.starts_with(
"avx512.ptestnm"))) {
2606 Name.starts_with(
"avx512.ptestm") ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ;
2609 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.pbroadcast"))){
2615 }
else if (IsX86 && (
Name.starts_with(
"avx512.kunpck"))) {
2620 for (
unsigned i = 0; i != NumElts; ++i)
2633 }
else if (IsX86 &&
Name ==
"avx512.kand.w") {
2638 }
else if (IsX86 &&
Name ==
"avx512.kandn.w") {
2644 }
else if (IsX86 &&
Name ==
"avx512.kor.w") {
2649 }
else if (IsX86 &&
Name ==
"avx512.kxor.w") {
2654 }
else if (IsX86 &&
Name ==
"avx512.kxnor.w") {
2660 }
else if (IsX86 &&
Name ==
"avx512.knot.w") {
2665 (
Name ==
"avx512.kortestz.w" ||
Name ==
"avx512.kortestc.w")) {
2671 if (
Name[14] ==
'c')
2672 C = ConstantInt::getAllOnesValue(Builder.
getInt16Ty());
2674 C = ConstantInt::getNullValue(Builder.
getInt16Ty());
2677 }
else if (IsX86 && (
Name ==
"sse.add.ss" ||
Name ==
"sse2.add.sd" ||
2678 Name ==
"sse.sub.ss" ||
Name ==
"sse2.sub.sd" ||
2679 Name ==
"sse.mul.ss" ||
Name ==
"sse2.mul.sd" ||
2680 Name ==
"sse.div.ss" ||
Name ==
"sse2.div.sd")) {
2683 ConstantInt::get(I32Ty, 0));
2685 ConstantInt::get(I32Ty, 0));
2687 if (
Name.contains(
".add."))
2689 else if (
Name.contains(
".sub."))
2691 else if (
Name.contains(
".mul."))
2696 ConstantInt::get(I32Ty, 0));
2697 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.pcmp")) {
2699 bool CmpEq =
Name[16] ==
'e';
2701 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.vpshufbitqmb.")) {
2707 case 128: IID = Intrinsic::x86_avx512_vpshufbitqmb_128;
break;
2708 case 256: IID = Intrinsic::x86_avx512_vpshufbitqmb_256;
break;
2709 case 512: IID = Intrinsic::x86_avx512_vpshufbitqmb_512;
break;
2713 { CI->getOperand(0), CI->getArgOperand(1) });
2715 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.fpclass.p")) {
2720 if (VecWidth == 128 && EltWidth == 32)
2721 IID = Intrinsic::x86_avx512_fpclass_ps_128;
2722 else if (VecWidth == 256 && EltWidth == 32)
2723 IID = Intrinsic::x86_avx512_fpclass_ps_256;
2724 else if (VecWidth == 512 && EltWidth == 32)
2725 IID = Intrinsic::x86_avx512_fpclass_ps_512;
2726 else if (VecWidth == 128 && EltWidth == 64)
2727 IID = Intrinsic::x86_avx512_fpclass_pd_128;
2728 else if (VecWidth == 256 && EltWidth == 64)
2729 IID = Intrinsic::x86_avx512_fpclass_pd_256;
2730 else if (VecWidth == 512 && EltWidth == 64)
2731 IID = Intrinsic::x86_avx512_fpclass_pd_512;
2736 { CI->getOperand(0), CI->getArgOperand(1) });
2738 }
else if (IsX86 &&
Name.starts_with(
"avx512.cmp.p")) {
2740 Type *OpTy = Args[0]->getType();
2744 if (VecWidth == 128 && EltWidth == 32)
2745 IID = Intrinsic::x86_avx512_mask_cmp_ps_128;
2746 else if (VecWidth == 256 && EltWidth == 32)
2747 IID = Intrinsic::x86_avx512_mask_cmp_ps_256;
2748 else if (VecWidth == 512 && EltWidth == 32)
2749 IID = Intrinsic::x86_avx512_mask_cmp_ps_512;
2750 else if (VecWidth == 128 && EltWidth == 64)
2751 IID = Intrinsic::x86_avx512_mask_cmp_pd_128;
2752 else if (VecWidth == 256 && EltWidth == 64)
2753 IID = Intrinsic::x86_avx512_mask_cmp_pd_256;
2754 else if (VecWidth == 512 && EltWidth == 64)
2755 IID = Intrinsic::x86_avx512_mask_cmp_pd_512;
2760 if (VecWidth == 512)
2762 Args.push_back(Mask);
2766 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.cmp.")) {
2768 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
2770 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.ucmp.")) {
2771 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
2773 }
else if (IsX86 && (
Name.starts_with(
"avx512.cvtb2mask.") ||
2774 Name.starts_with(
"avx512.cvtw2mask.") ||
2775 Name.starts_with(
"avx512.cvtd2mask.") ||
2776 Name.starts_with(
"avx512.cvtq2mask."))) {
2779 Rep = Builder.
CreateICmp(ICmpInst::ICMP_SLT,
Op, Zero);
2781 }
else if(IsX86 && (
Name ==
"ssse3.pabs.b.128" ||
2782 Name ==
"ssse3.pabs.w.128" ||
2783 Name ==
"ssse3.pabs.d.128" ||
2784 Name.starts_with(
"avx2.pabs") ||
2785 Name.starts_with(
"avx512.mask.pabs"))) {
2787 }
else if (IsX86 && (
Name ==
"sse41.pmaxsb" ||
2788 Name ==
"sse2.pmaxs.w" ||
2789 Name ==
"sse41.pmaxsd" ||
2790 Name.starts_with(
"avx2.pmaxs") ||
2791 Name.starts_with(
"avx512.mask.pmaxs"))) {
2793 }
else if (IsX86 && (
Name ==
"sse2.pmaxu.b" ||
2794 Name ==
"sse41.pmaxuw" ||
2795 Name ==
"sse41.pmaxud" ||
2796 Name.starts_with(
"avx2.pmaxu") ||
2797 Name.starts_with(
"avx512.mask.pmaxu"))) {
2799 }
else if (IsX86 && (
Name ==
"sse41.pminsb" ||
2800 Name ==
"sse2.pmins.w" ||
2801 Name ==
"sse41.pminsd" ||
2802 Name.starts_with(
"avx2.pmins") ||
2803 Name.starts_with(
"avx512.mask.pmins"))) {
2805 }
else if (IsX86 && (
Name ==
"sse2.pminu.b" ||
2806 Name ==
"sse41.pminuw" ||
2807 Name ==
"sse41.pminud" ||
2808 Name.starts_with(
"avx2.pminu") ||
2809 Name.starts_with(
"avx512.mask.pminu"))) {
2811 }
else if (IsX86 && (
Name ==
"sse2.pmulu.dq" ||
2812 Name ==
"avx2.pmulu.dq" ||
2813 Name ==
"avx512.pmulu.dq.512" ||
2814 Name.starts_with(
"avx512.mask.pmulu.dq."))) {
2816 }
else if (IsX86 && (
Name ==
"sse41.pmuldq" ||
2817 Name ==
"avx2.pmul.dq" ||
2818 Name ==
"avx512.pmul.dq.512" ||
2819 Name.starts_with(
"avx512.mask.pmul.dq."))) {
2821 }
else if (IsX86 && (
Name ==
"sse.cvtsi2ss" ||
2822 Name ==
"sse2.cvtsi2sd" ||
2823 Name ==
"sse.cvtsi642ss" ||
2824 Name ==
"sse2.cvtsi642sd")) {
2827 cast<VectorType>(CI->
getType())->getElementType());
2829 }
else if (IsX86 &&
Name ==
"avx512.cvtusi2sd") {
2832 cast<VectorType>(CI->
getType())->getElementType());
2834 }
else if (IsX86 &&
Name ==
"sse2.cvtss2sd") {
2837 Rep, cast<VectorType>(CI->
getType())->getElementType());
2839 }
else if (IsX86 && (
Name ==
"sse2.cvtdq2pd" ||
2840 Name ==
"sse2.cvtdq2ps" ||
2841 Name ==
"avx.cvtdq2.pd.256" ||
2842 Name ==
"avx.cvtdq2.ps.256" ||
2843 Name.starts_with(
"avx512.mask.cvtdq2pd.") ||
2844 Name.starts_with(
"avx512.mask.cvtudq2pd.") ||
2845 Name.starts_with(
"avx512.mask.cvtdq2ps.") ||
2846 Name.starts_with(
"avx512.mask.cvtudq2ps.") ||
2847 Name.starts_with(
"avx512.mask.cvtqq2pd.") ||
2848 Name.starts_with(
"avx512.mask.cvtuqq2pd.") ||
2849 Name ==
"avx512.mask.cvtqq2ps.256" ||
2850 Name ==
"avx512.mask.cvtqq2ps.512" ||
2851 Name ==
"avx512.mask.cvtuqq2ps.256" ||
2852 Name ==
"avx512.mask.cvtuqq2ps.512" ||
2853 Name ==
"sse2.cvtps2pd" ||
2854 Name ==
"avx.cvt.ps2.pd.256" ||
2855 Name ==
"avx512.mask.cvtps2pd.128" ||
2856 Name ==
"avx512.mask.cvtps2pd.256")) {
2857 auto *DstTy = cast<FixedVectorType>(CI->
getType());
2859 auto *SrcTy = cast<FixedVectorType>(Rep->
getType());
2861 unsigned NumDstElts = DstTy->getNumElements();
2862 if (NumDstElts < SrcTy->getNumElements()) {
2863 assert(NumDstElts == 2 &&
"Unexpected vector size");
2867 bool IsPS2PD = SrcTy->getElementType()->isFloatTy();
2868 bool IsUnsigned =
Name.contains(
"cvtu");
2870 Rep = Builder.
CreateFPExt(Rep, DstTy,
"cvtps2pd");
2873 cast<ConstantInt>(CI->
getArgOperand(3))->getZExtValue() != 4)) {
2874 Intrinsic::ID IID = IsUnsigned ? Intrinsic::x86_avx512_uitofp_round
2875 : Intrinsic::x86_avx512_sitofp_round;
2880 Rep = IsUnsigned ? Builder.
CreateUIToFP(Rep, DstTy,
"cvt")
2887 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vcvtph2ps.") ||
2888 Name.starts_with(
"vcvtph2ps."))) {
2889 auto *DstTy = cast<FixedVectorType>(CI->
getType());
2891 auto *SrcTy = cast<FixedVectorType>(Rep->
getType());
2892 unsigned NumDstElts = DstTy->getNumElements();
2893 if (NumDstElts != SrcTy->getNumElements()) {
2894 assert(NumDstElts == 4 &&
"Unexpected vector size");
2899 Rep = Builder.
CreateFPExt(Rep, DstTy,
"cvtph2ps");
2903 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.load")) {
2909 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.expand.load.")) {
2910 auto *ResultTy = cast<FixedVectorType>(CI->
getType());
2911 Type *PtrTy = ResultTy->getElementType();
2918 ResultTy->getNumElements());
2921 Intrinsic::masked_expandload,
2924 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.compress.store.")) {
2926 Type *PtrTy = ResultTy->getElementType();
2934 cast<FixedVectorType>(ResultTy)->getNumElements());
2937 Intrinsic::masked_compressstore,
2940 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.compress.") ||
2941 Name.starts_with(
"avx512.mask.expand."))) {
2942 auto *ResultTy = cast<FixedVectorType>(CI->
getType());
2945 ResultTy->getNumElements());
2947 bool IsCompress =
Name[12] ==
'c';
2948 Intrinsic::ID IID = IsCompress ? Intrinsic::x86_avx512_mask_compress
2949 : Intrinsic::x86_avx512_mask_expand;
2953 }
else if (IsX86 &&
Name.starts_with(
"xop.vpcom")) {
2955 if (
Name.ends_with(
"ub") ||
Name.ends_with(
"uw") ||
Name.ends_with(
"ud") ||
2956 Name.ends_with(
"uq"))
2958 else if (
Name.ends_with(
"b") ||
Name.ends_with(
"w") ||
Name.ends_with(
"d") ||
2959 Name.ends_with(
"q"))
2966 Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
2969 if (
Name.starts_with(
"lt"))
2971 else if (
Name.starts_with(
"le"))
2973 else if (
Name.starts_with(
"gt"))
2975 else if (
Name.starts_with(
"ge"))
2977 else if (
Name.starts_with(
"eq"))
2979 else if (
Name.starts_with(
"ne"))
2981 else if (
Name.starts_with(
"false"))
2983 else if (
Name.starts_with(
"true"))
2990 }
else if (IsX86 &&
Name.starts_with(
"xop.vpcmov")) {
2995 Rep = Builder.
CreateOr(Sel0, Sel1);
2996 }
else if (IsX86 && (
Name.starts_with(
"xop.vprot") ||
2997 Name.starts_with(
"avx512.prol") ||
2998 Name.starts_with(
"avx512.mask.prol"))) {
3000 }
else if (IsX86 && (
Name.starts_with(
"avx512.pror") ||
3001 Name.starts_with(
"avx512.mask.pror"))) {
3003 }
else if (IsX86 && (
Name.starts_with(
"avx512.vpshld.") ||
3004 Name.starts_with(
"avx512.mask.vpshld") ||
3005 Name.starts_with(
"avx512.maskz.vpshld"))) {
3006 bool ZeroMask =
Name[11] ==
'z';
3008 }
else if (IsX86 && (
Name.starts_with(
"avx512.vpshrd.") ||
3009 Name.starts_with(
"avx512.mask.vpshrd") ||
3010 Name.starts_with(
"avx512.maskz.vpshrd"))) {
3011 bool ZeroMask =
Name[11] ==
'z';
3013 }
else if (IsX86 &&
Name ==
"sse42.crc32.64.8") {
3015 Intrinsic::x86_sse42_crc32_32_8);
3019 }
else if (IsX86 && (
Name.starts_with(
"avx.vbroadcast.s") ||
3020 Name.starts_with(
"avx512.vbroadcast.s"))) {
3022 auto *VecTy = cast<FixedVectorType>(CI->
getType());
3023 Type *EltTy = VecTy->getElementType();
3024 unsigned EltNum = VecTy->getNumElements();
3028 for (
unsigned I = 0;
I < EltNum; ++
I)
3030 ConstantInt::get(I32Ty,
I));
3031 }
else if (IsX86 && (
Name.starts_with(
"sse41.pmovsx") ||
3032 Name.starts_with(
"sse41.pmovzx") ||
3033 Name.starts_with(
"avx2.pmovsx") ||
3034 Name.starts_with(
"avx2.pmovzx") ||
3035 Name.starts_with(
"avx512.mask.pmovsx") ||
3036 Name.starts_with(
"avx512.mask.pmovzx"))) {
3037 auto *DstTy = cast<FixedVectorType>(CI->
getType());
3038 unsigned NumDstElts = DstTy->getNumElements();
3042 for (
unsigned i = 0; i != NumDstElts; ++i)
3048 bool DoSext =
Name.contains(
"pmovsx");
3055 }
else if (
Name ==
"avx512.mask.pmov.qd.256" ||
3056 Name ==
"avx512.mask.pmov.qd.512" ||
3057 Name ==
"avx512.mask.pmov.wb.256" ||
3058 Name ==
"avx512.mask.pmov.wb.512") {
3063 }
else if (IsX86 && (
Name.starts_with(
"avx.vbroadcastf128") ||
3064 Name ==
"avx2.vbroadcasti128")) {
3066 Type *EltTy = cast<VectorType>(CI->
getType())->getElementType();
3070 PointerType::getUnqual(VT));
3072 if (NumSrcElts == 2)
3077 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.shuf.i") ||
3078 Name.starts_with(
"avx512.mask.shuf.f"))) {
3079 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3083 unsigned ControlBitsMask = NumLanes - 1;
3084 unsigned NumControlBits = NumLanes / 2;
3087 for (
unsigned l = 0; l != NumLanes; ++l) {
3088 unsigned LaneMask = (Imm >> (l * NumControlBits)) & ControlBitsMask;
3090 if (l >= NumLanes / 2)
3091 LaneMask += NumLanes;
3092 for (
unsigned i = 0; i != NumElementsInLane; ++i)
3093 ShuffleMask.
push_back(LaneMask * NumElementsInLane + i);
3099 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.broadcastf") ||
3100 Name.starts_with(
"avx512.mask.broadcasti"))) {
3101 unsigned NumSrcElts =
3104 unsigned NumDstElts =
3105 cast<FixedVectorType>(CI->
getType())->getNumElements();
3108 for (
unsigned i = 0; i != NumDstElts; ++i)
3109 ShuffleMask[i] = i % NumSrcElts;
3116 }
else if (IsX86 && (
Name.starts_with(
"avx2.pbroadcast") ||
3117 Name.starts_with(
"avx2.vbroadcast") ||
3118 Name.starts_with(
"avx512.pbroadcast") ||
3119 Name.starts_with(
"avx512.mask.broadcast.s"))) {
3131 }
else if (IsX86 && (
Name.starts_with(
"sse2.padds.") ||
3132 Name.starts_with(
"avx2.padds.") ||
3133 Name.starts_with(
"avx512.padds.") ||
3134 Name.starts_with(
"avx512.mask.padds."))) {
3136 }
else if (IsX86 && (
Name.starts_with(
"sse2.psubs.") ||
3137 Name.starts_with(
"avx2.psubs.") ||
3138 Name.starts_with(
"avx512.psubs.") ||
3139 Name.starts_with(
"avx512.mask.psubs."))) {
3141 }
else if (IsX86 && (
Name.starts_with(
"sse2.paddus.") ||
3142 Name.starts_with(
"avx2.paddus.") ||
3143 Name.starts_with(
"avx512.mask.paddus."))) {
3145 }
else if (IsX86 && (
Name.starts_with(
"sse2.psubus.") ||
3146 Name.starts_with(
"avx2.psubus.") ||
3147 Name.starts_with(
"avx512.mask.psubus."))) {
3149 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.palignr.")) {
3154 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.valign.")) {
3159 }
else if (IsX86 && (
Name ==
"sse2.psll.dq" ||
3160 Name ==
"avx2.psll.dq")) {
3162 unsigned Shift = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3165 }
else if (IsX86 && (
Name ==
"sse2.psrl.dq" ||
3166 Name ==
"avx2.psrl.dq")) {
3168 unsigned Shift = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3171 }
else if (IsX86 && (
Name ==
"sse2.psll.dq.bs" ||
3172 Name ==
"avx2.psll.dq.bs" ||
3173 Name ==
"avx512.psll.dq.512")) {
3175 unsigned Shift = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3177 }
else if (IsX86 && (
Name ==
"sse2.psrl.dq.bs" ||
3178 Name ==
"avx2.psrl.dq.bs" ||
3179 Name ==
"avx512.psrl.dq.512")) {
3181 unsigned Shift = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3183 }
else if (IsX86 && (
Name ==
"sse41.pblendw" ||
3184 Name.starts_with(
"sse41.blendp") ||
3185 Name.starts_with(
"avx.blend.p") ||
3186 Name ==
"avx2.pblendw" ||
3187 Name.starts_with(
"avx2.pblendd."))) {
3190 unsigned Imm = cast <ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3191 auto *VecTy = cast<FixedVectorType>(CI->
getType());
3192 unsigned NumElts = VecTy->getNumElements();
3195 for (
unsigned i = 0; i != NumElts; ++i)
3196 Idxs[i] = ((Imm >> (i%8)) & 1) ? i + NumElts : i;
3199 }
else if (IsX86 && (
Name.starts_with(
"avx.vinsertf128.") ||
3200 Name ==
"avx2.vinserti128" ||
3201 Name.starts_with(
"avx512.mask.insert"))) {
3204 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3205 unsigned DstNumElts =
3206 cast<FixedVectorType>(CI->
getType())->getNumElements();
3207 unsigned SrcNumElts =
3208 cast<FixedVectorType>(Op1->
getType())->getNumElements();
3209 unsigned Scale = DstNumElts / SrcNumElts;
3216 for (
unsigned i = 0; i != SrcNumElts; ++i)
3218 for (
unsigned i = SrcNumElts; i != DstNumElts; ++i)
3219 Idxs[i] = SrcNumElts;
3234 for (
unsigned i = 0; i != DstNumElts; ++i)
3237 for (
unsigned i = 0; i != SrcNumElts; ++i)
3238 Idxs[i + Imm * SrcNumElts] = i + DstNumElts;
3245 }
else if (IsX86 && (
Name.starts_with(
"avx.vextractf128.") ||
3246 Name ==
"avx2.vextracti128" ||
3247 Name.starts_with(
"avx512.mask.vextract"))) {
3249 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3250 unsigned DstNumElts =
3251 cast<FixedVectorType>(CI->
getType())->getNumElements();
3252 unsigned SrcNumElts =
3253 cast<FixedVectorType>(Op0->
getType())->getNumElements();
3254 unsigned Scale = SrcNumElts / DstNumElts;
3261 for (
unsigned i = 0; i != DstNumElts; ++i) {
3262 Idxs[i] = i + (Imm * DstNumElts);
3270 }
else if (!IsX86 &&
Name ==
"stackprotectorcheck") {
3272 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.perm.df.") ||
3273 Name.starts_with(
"avx512.mask.perm.di."))) {
3275 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3276 auto *VecTy = cast<FixedVectorType>(CI->
getType());
3277 unsigned NumElts = VecTy->getNumElements();
3280 for (
unsigned i = 0; i != NumElts; ++i)
3281 Idxs[i] = (i & ~0x3) + ((Imm >> (2 * (i & 0x3))) & 3);
3288 }
else if (IsX86 && (
Name.starts_with(
"avx.vperm2f128.") ||
3289 Name ==
"avx2.vperm2i128")) {
3298 uint8_t Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3300 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3301 unsigned HalfSize = NumElts / 2;
3313 unsigned StartIndex = (Imm & 0x01) ? HalfSize : 0;
3314 for (
unsigned i = 0; i < HalfSize; ++i)
3315 ShuffleMask[i] = StartIndex + i;
3318 StartIndex = (Imm & 0x10) ? HalfSize : 0;
3319 for (
unsigned i = 0; i < HalfSize; ++i)
3320 ShuffleMask[i + HalfSize] = NumElts + StartIndex + i;
3324 }
else if (IsX86 && (
Name.starts_with(
"avx.vpermil.") ||
3325 Name ==
"sse2.pshuf.d" ||
3326 Name.starts_with(
"avx512.mask.vpermil.p") ||
3327 Name.starts_with(
"avx512.mask.pshuf.d."))) {
3329 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3330 auto *VecTy = cast<FixedVectorType>(CI->
getType());
3331 unsigned NumElts = VecTy->getNumElements();
3333 unsigned IdxSize = 64 / VecTy->getScalarSizeInBits();
3334 unsigned IdxMask = ((1 << IdxSize) - 1);
3340 for (
unsigned i = 0; i != NumElts; ++i)
3341 Idxs[i] = ((Imm >> ((i * IdxSize) % 8)) & IdxMask) | (i & ~IdxMask);
3348 }
else if (IsX86 && (
Name ==
"sse2.pshufl.w" ||
3349 Name.starts_with(
"avx512.mask.pshufl.w."))) {
3351 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3352 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3355 for (
unsigned l = 0; l != NumElts; l += 8) {
3356 for (
unsigned i = 0; i != 4; ++i)
3357 Idxs[i + l] = ((Imm >> (2 * i)) & 0x3) + l;
3358 for (
unsigned i = 4; i != 8; ++i)
3359 Idxs[i + l] = i + l;
3367 }
else if (IsX86 && (
Name ==
"sse2.pshufh.w" ||
3368 Name.starts_with(
"avx512.mask.pshufh.w."))) {
3370 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
3371 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3374 for (
unsigned l = 0; l != NumElts; l += 8) {
3375 for (
unsigned i = 0; i != 4; ++i)
3376 Idxs[i + l] = i + l;
3377 for (
unsigned i = 0; i != 4; ++i)
3378 Idxs[i + l + 4] = ((Imm >> (2 * i)) & 0x3) + 4 + l;
3386 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.shuf.p")) {
3389 unsigned Imm = cast<ConstantInt>(CI->
getArgOperand(2))->getZExtValue();
3390 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3393 unsigned HalfLaneElts = NumLaneElts / 2;
3396 for (
unsigned i = 0; i != NumElts; ++i) {
3398 Idxs[i] = i - (i % NumLaneElts);
3400 if ((i % NumLaneElts) >= HalfLaneElts)
3404 Idxs[i] += (Imm >> ((i * HalfLaneElts) % 8)) & ((1 << HalfLaneElts) - 1);
3411 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.movddup") ||
3412 Name.starts_with(
"avx512.mask.movshdup") ||
3413 Name.starts_with(
"avx512.mask.movsldup"))) {
3415 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3419 if (
Name.starts_with(
"avx512.mask.movshdup."))
3423 for (
unsigned l = 0; l != NumElts; l += NumLaneElts)
3424 for (
unsigned i = 0; i != NumLaneElts; i += 2) {
3425 Idxs[i + l + 0] = i + l +
Offset;
3426 Idxs[i + l + 1] = i + l +
Offset;
3433 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.punpckl") ||
3434 Name.starts_with(
"avx512.mask.unpckl."))) {
3437 int NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3441 for (
int l = 0; l != NumElts; l += NumLaneElts)
3442 for (
int i = 0; i != NumLaneElts; ++i)
3443 Idxs[i + l] = l + (i / 2) + NumElts * (i % 2);
3449 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.punpckh") ||
3450 Name.starts_with(
"avx512.mask.unpckh."))) {
3453 int NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
3457 for (
int l = 0; l != NumElts; l += NumLaneElts)
3458 for (
int i = 0; i != NumLaneElts; ++i)
3459 Idxs[i + l] = (NumLaneElts / 2) + l + (i / 2) + NumElts * (i % 2);
3465 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.and.") ||
3466 Name.starts_with(
"avx512.mask.pand."))) {
3468 VectorType *ITy = VectorType::getInteger(FTy);
3474 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.andn.") ||
3475 Name.starts_with(
"avx512.mask.pandn."))) {
3477 VectorType *ITy = VectorType::getInteger(FTy);
3484 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.or.") ||
3485 Name.starts_with(
"avx512.mask.por."))) {
3487 VectorType *ITy = VectorType::getInteger(FTy);
3493 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.xor.") ||
3494 Name.starts_with(
"avx512.mask.pxor."))) {
3496 VectorType *ITy = VectorType::getInteger(FTy);
3502 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.padd.")) {
3506 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.psub.")) {
3510 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.pmull.")) {
3514 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.add.p")) {
3515 if (
Name.ends_with(
".512")) {
3517 if (
Name[17] ==
's')
3518 IID = Intrinsic::x86_avx512_add_ps_512;
3520 IID = Intrinsic::x86_avx512_add_pd_512;
3523 { CI->getArgOperand(0), CI->getArgOperand(1),
3524 CI->getArgOperand(4) });
3530 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.div.p")) {
3531 if (
Name.ends_with(
".512")) {
3533 if (
Name[17] ==
's')
3534 IID = Intrinsic::x86_avx512_div_ps_512;
3536 IID = Intrinsic::x86_avx512_div_pd_512;
3539 { CI->getArgOperand(0), CI->getArgOperand(1),
3540 CI->getArgOperand(4) });
3546 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.mul.p")) {
3547 if (
Name.ends_with(
".512")) {
3549 if (
Name[17] ==
's')
3550 IID = Intrinsic::x86_avx512_mul_ps_512;
3552 IID = Intrinsic::x86_avx512_mul_pd_512;
3555 { CI->getArgOperand(0), CI->getArgOperand(1),
3556 CI->getArgOperand(4) });
3562 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.sub.p")) {
3563 if (
Name.ends_with(
".512")) {
3565 if (
Name[17] ==
's')
3566 IID = Intrinsic::x86_avx512_sub_ps_512;
3568 IID = Intrinsic::x86_avx512_sub_pd_512;
3571 { CI->getArgOperand(0), CI->getArgOperand(1),
3572 CI->getArgOperand(4) });
3578 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.max.p") ||
3579 Name.starts_with(
"avx512.mask.min.p")) &&
3580 Name.drop_front(18) ==
".512") {
3581 bool IsDouble =
Name[17] ==
'd';
3582 bool IsMin =
Name[13] ==
'i';
3584 { Intrinsic::x86_avx512_max_ps_512, Intrinsic::x86_avx512_max_pd_512 },
3585 { Intrinsic::x86_avx512_min_ps_512, Intrinsic::x86_avx512_min_pd_512 }
3590 { CI->getArgOperand(0), CI->getArgOperand(1),
3591 CI->getArgOperand(4) });
3594 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.lzcnt.")) {
3598 { CI->getArgOperand(0), Builder.getInt1(false) });
3601 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.psll")) {
3602 bool IsImmediate =
Name[16] ==
'i' ||
3603 (
Name.size() > 18 &&
Name[18] ==
'i');
3604 bool IsVariable =
Name[16] ==
'v';
3611 if (IsVariable &&
Name[17] !=
'.') {
3612 if (
Size ==
'd' &&
Name[17] ==
'2')
3613 IID = Intrinsic::x86_avx2_psllv_q;
3614 else if (
Size ==
'd' &&
Name[17] ==
'4')
3615 IID = Intrinsic::x86_avx2_psllv_q_256;
3616 else if (
Size ==
's' &&
Name[17] ==
'4')
3617 IID = Intrinsic::x86_avx2_psllv_d;
3618 else if (
Size ==
's' &&
Name[17] ==
'8')
3619 IID = Intrinsic::x86_avx2_psllv_d_256;
3620 else if (
Size ==
'h' &&
Name[17] ==
'8')
3621 IID = Intrinsic::x86_avx512_psllv_w_128;
3622 else if (
Size ==
'h' &&
Name[17] ==
'1')
3623 IID = Intrinsic::x86_avx512_psllv_w_256;
3624 else if (
Name[17] ==
'3' &&
Name[18] ==
'2')
3625 IID = Intrinsic::x86_avx512_psllv_w_512;
3628 }
else if (
Name.ends_with(
".128")) {
3630 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_d
3631 : Intrinsic::x86_sse2_psll_d;
3632 else if (
Size ==
'q')
3633 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_q
3634 : Intrinsic::x86_sse2_psll_q;
3635 else if (
Size ==
'w')
3636 IID = IsImmediate ? Intrinsic::x86_sse2_pslli_w
3637 : Intrinsic::x86_sse2_psll_w;
3640 }
else if (
Name.ends_with(
".256")) {
3642 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_d
3643 : Intrinsic::x86_avx2_psll_d;
3644 else if (
Size ==
'q')
3645 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_q
3646 : Intrinsic::x86_avx2_psll_q;
3647 else if (
Size ==
'w')
3648 IID = IsImmediate ? Intrinsic::x86_avx2_pslli_w
3649 : Intrinsic::x86_avx2_psll_w;
3654 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_d_512 :
3655 IsVariable ? Intrinsic::x86_avx512_psllv_d_512 :
3656 Intrinsic::x86_avx512_psll_d_512;
3657 else if (
Size ==
'q')
3658 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_q_512 :
3659 IsVariable ? Intrinsic::x86_avx512_psllv_q_512 :
3660 Intrinsic::x86_avx512_psll_q_512;
3661 else if (
Size ==
'w')
3662 IID = IsImmediate ? Intrinsic::x86_avx512_pslli_w_512
3663 : Intrinsic::x86_avx512_psll_w_512;
3669 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.psrl")) {
3670 bool IsImmediate =
Name[16] ==
'i' ||
3671 (
Name.size() > 18 &&
Name[18] ==
'i');
3672 bool IsVariable =
Name[16] ==
'v';
3679 if (IsVariable &&
Name[17] !=
'.') {
3680 if (
Size ==
'd' &&
Name[17] ==
'2')
3681 IID = Intrinsic::x86_avx2_psrlv_q;
3682 else if (
Size ==
'd' &&
Name[17] ==
'4')
3683 IID = Intrinsic::x86_avx2_psrlv_q_256;
3684 else if (
Size ==
's' &&
Name[17] ==
'4')
3685 IID = Intrinsic::x86_avx2_psrlv_d;
3686 else if (
Size ==
's' &&
Name[17] ==
'8')
3687 IID = Intrinsic::x86_avx2_psrlv_d_256;
3688 else if (
Size ==
'h' &&
Name[17] ==
'8')
3689 IID = Intrinsic::x86_avx512_psrlv_w_128;
3690 else if (
Size ==
'h' &&
Name[17] ==
'1')
3691 IID = Intrinsic::x86_avx512_psrlv_w_256;
3692 else if (
Name[17] ==
'3' &&
Name[18] ==
'2')
3693 IID = Intrinsic::x86_avx512_psrlv_w_512;
3696 }
else if (
Name.ends_with(
".128")) {
3698 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_d
3699 : Intrinsic::x86_sse2_psrl_d;
3700 else if (
Size ==
'q')
3701 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_q
3702 : Intrinsic::x86_sse2_psrl_q;
3703 else if (
Size ==
'w')
3704 IID = IsImmediate ? Intrinsic::x86_sse2_psrli_w
3705 : Intrinsic::x86_sse2_psrl_w;
3708 }
else if (
Name.ends_with(
".256")) {
3710 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_d
3711 : Intrinsic::x86_avx2_psrl_d;
3712 else if (
Size ==
'q')
3713 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_q
3714 : Intrinsic::x86_avx2_psrl_q;
3715 else if (
Size ==
'w')
3716 IID = IsImmediate ? Intrinsic::x86_avx2_psrli_w
3717 : Intrinsic::x86_avx2_psrl_w;
3722 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_d_512 :
3723 IsVariable ? Intrinsic::x86_avx512_psrlv_d_512 :
3724 Intrinsic::x86_avx512_psrl_d_512;
3725 else if (
Size ==
'q')
3726 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_q_512 :
3727 IsVariable ? Intrinsic::x86_avx512_psrlv_q_512 :
3728 Intrinsic::x86_avx512_psrl_q_512;
3729 else if (
Size ==
'w')
3730 IID = IsImmediate ? Intrinsic::x86_avx512_psrli_w_512
3731 : Intrinsic::x86_avx512_psrl_w_512;
3737 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.psra")) {
3738 bool IsImmediate =
Name[16] ==
'i' ||
3739 (
Name.size() > 18 &&
Name[18] ==
'i');
3740 bool IsVariable =
Name[16] ==
'v';
3747 if (IsVariable &&
Name[17] !=
'.') {
3748 if (
Size ==
's' &&
Name[17] ==
'4')
3749 IID = Intrinsic::x86_avx2_psrav_d;
3750 else if (
Size ==
's' &&
Name[17] ==
'8')
3751 IID = Intrinsic::x86_avx2_psrav_d_256;
3752 else if (
Size ==
'h' &&
Name[17] ==
'8')
3753 IID = Intrinsic::x86_avx512_psrav_w_128;
3754 else if (
Size ==
'h' &&
Name[17] ==
'1')
3755 IID = Intrinsic::x86_avx512_psrav_w_256;
3756 else if (
Name[17] ==
'3' &&
Name[18] ==
'2')
3757 IID = Intrinsic::x86_avx512_psrav_w_512;
3760 }
else if (
Name.ends_with(
".128")) {
3762 IID = IsImmediate ? Intrinsic::x86_sse2_psrai_d
3763 : Intrinsic::x86_sse2_psra_d;
3764 else if (
Size ==
'q')
3765 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_128 :
3766 IsVariable ? Intrinsic::x86_avx512_psrav_q_128 :
3767 Intrinsic::x86_avx512_psra_q_128;
3768 else if (
Size ==
'w')
3769 IID = IsImmediate ? Intrinsic::x86_sse2_psrai_w
3770 : Intrinsic::x86_sse2_psra_w;
3773 }
else if (
Name.ends_with(
".256")) {
3775 IID = IsImmediate ? Intrinsic::x86_avx2_psrai_d
3776 : Intrinsic::x86_avx2_psra_d;
3777 else if (
Size ==
'q')
3778 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_256 :
3779 IsVariable ? Intrinsic::x86_avx512_psrav_q_256 :
3780 Intrinsic::x86_avx512_psra_q_256;
3781 else if (
Size ==
'w')
3782 IID = IsImmediate ? Intrinsic::x86_avx2_psrai_w
3783 : Intrinsic::x86_avx2_psra_w;
3788 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_d_512 :
3789 IsVariable ? Intrinsic::x86_avx512_psrav_d_512 :
3790 Intrinsic::x86_avx512_psra_d_512;
3791 else if (
Size ==
'q')
3792 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_q_512 :
3793 IsVariable ? Intrinsic::x86_avx512_psrav_q_512 :
3794 Intrinsic::x86_avx512_psra_q_512;
3795 else if (
Size ==
'w')
3796 IID = IsImmediate ? Intrinsic::x86_avx512_psrai_w_512
3797 : Intrinsic::x86_avx512_psra_w_512;
3803 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.move.s")) {
3805 }
else if (IsX86 &&
Name.starts_with(
"avx512.cvtmask2")) {
3807 }
else if (IsX86 &&
Name.ends_with(
".movntdqa")) {
3815 Ptr, PointerType::getUnqual(CI->
getType()),
"cast");
3819 LI->
setMetadata(LLVMContext::MD_nontemporal, Node);
3821 }
else if (IsX86 && (
Name.starts_with(
"fma.vfmadd.") ||
3822 Name.starts_with(
"fma.vfmsub.") ||
3823 Name.starts_with(
"fma.vfnmadd.") ||
3824 Name.starts_with(
"fma.vfnmsub."))) {
3825 bool NegMul =
Name[6] ==
'n';
3826 bool NegAcc = NegMul ?
Name[8] ==
's' :
Name[7] ==
's';
3827 bool IsScalar = NegMul ?
Name[12] ==
's' :
Name[11] ==
's';
3838 if (NegMul && !IsScalar)
3840 if (NegMul && IsScalar)
3853 }
else if (IsX86 &&
Name.starts_with(
"fma4.vfmadd.s")) {
3868 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vfmadd.s") ||
3869 Name.starts_with(
"avx512.maskz.vfmadd.s") ||
3870 Name.starts_with(
"avx512.mask3.vfmadd.s") ||
3871 Name.starts_with(
"avx512.mask3.vfmsub.s") ||
3872 Name.starts_with(
"avx512.mask3.vfnmsub.s"))) {
3873 bool IsMask3 =
Name[11] ==
'3';
3874 bool IsMaskZ =
Name[11] ==
'z';
3876 Name =
Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
3877 bool NegMul =
Name[2] ==
'n';
3878 bool NegAcc = NegMul ?
Name[4] ==
's' :
Name[3] ==
's';
3884 if (NegMul && (IsMask3 || IsMaskZ))
3886 if (NegMul && !(IsMask3 || IsMaskZ))
3896 cast<ConstantInt>(CI->
getArgOperand(4))->getZExtValue() != 4) {
3900 if (
Name.back() ==
'd')
3901 IID = Intrinsic::x86_avx512_vfmadd_f64;
3903 IID = Intrinsic::x86_avx512_vfmadd_f32;
3918 if (NegAcc && IsMask3)
3925 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vfmadd.p") ||
3926 Name.starts_with(
"avx512.mask.vfnmadd.p") ||
3927 Name.starts_with(
"avx512.mask.vfnmsub.p") ||
3928 Name.starts_with(
"avx512.mask3.vfmadd.p") ||
3929 Name.starts_with(
"avx512.mask3.vfmsub.p") ||
3930 Name.starts_with(
"avx512.mask3.vfnmsub.p") ||
3931 Name.starts_with(
"avx512.maskz.vfmadd.p"))) {
3932 bool IsMask3 =
Name[11] ==
'3';
3933 bool IsMaskZ =
Name[11] ==
'z';
3935 Name =
Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
3936 bool NegMul =
Name[2] ==
'n';
3937 bool NegAcc = NegMul ?
Name[4] ==
's' :
Name[3] ==
's';
3943 if (NegMul && (IsMask3 || IsMaskZ))
3945 if (NegMul && !(IsMask3 || IsMaskZ))
3952 cast<ConstantInt>(CI->
getArgOperand(4))->getZExtValue() != 4)) {
3956 IID = Intrinsic::x86_avx512_vfmadd_ps_512;
3958 IID = Intrinsic::x86_avx512_vfmadd_pd_512;
3961 { A, B, C, CI->getArgOperand(4) });
3974 }
else if (IsX86 &&
Name.starts_with(
"fma.vfmsubadd.p")) {
3978 if (VecWidth == 128 && EltWidth == 32)
3979 IID = Intrinsic::x86_fma_vfmaddsub_ps;
3980 else if (VecWidth == 256 && EltWidth == 32)
3981 IID = Intrinsic::x86_fma_vfmaddsub_ps_256;
3982 else if (VecWidth == 128 && EltWidth == 64)
3983 IID = Intrinsic::x86_fma_vfmaddsub_pd;
3984 else if (VecWidth == 256 && EltWidth == 64)
3985 IID = Intrinsic::x86_fma_vfmaddsub_pd_256;
3994 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vfmaddsub.p") ||
3995 Name.starts_with(
"avx512.mask3.vfmaddsub.p") ||
3996 Name.starts_with(
"avx512.maskz.vfmaddsub.p") ||
3997 Name.starts_with(
"avx512.mask3.vfmsubadd.p"))) {
3998 bool IsMask3 =
Name[11] ==
'3';
3999 bool IsMaskZ =
Name[11] ==
'z';
4001 Name =
Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12);
4002 bool IsSubAdd =
Name[3] ==
's';
4007 IID = Intrinsic::x86_avx512_vfmaddsub_ps_512;
4009 IID = Intrinsic::x86_avx512_vfmaddsub_pd_512;
4019 int NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
4034 for (
int i = 0; i != NumElts; ++i)
4035 Idxs[i] = i + (i % 2) * NumElts;
4045 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.pternlog.") ||
4046 Name.starts_with(
"avx512.maskz.pternlog."))) {
4047 bool ZeroMask =
Name[11] ==
'z';
4051 if (VecWidth == 128 && EltWidth == 32)
4052 IID = Intrinsic::x86_avx512_pternlog_d_128;
4053 else if (VecWidth == 256 && EltWidth == 32)
4054 IID = Intrinsic::x86_avx512_pternlog_d_256;
4055 else if (VecWidth == 512 && EltWidth == 32)
4056 IID = Intrinsic::x86_avx512_pternlog_d_512;
4057 else if (VecWidth == 128 && EltWidth == 64)
4058 IID = Intrinsic::x86_avx512_pternlog_q_128;
4059 else if (VecWidth == 256 && EltWidth == 64)
4060 IID = Intrinsic::x86_avx512_pternlog_q_256;
4061 else if (VecWidth == 512 && EltWidth == 64)
4062 IID = Intrinsic::x86_avx512_pternlog_q_512;
4073 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vpmadd52") ||
4074 Name.starts_with(
"avx512.maskz.vpmadd52"))) {
4075 bool ZeroMask =
Name[11] ==
'z';
4079 if (VecWidth == 128 && !
High)
4080 IID = Intrinsic::x86_avx512_vpmadd52l_uq_128;
4081 else if (VecWidth == 256 && !
High)
4082 IID = Intrinsic::x86_avx512_vpmadd52l_uq_256;
4083 else if (VecWidth == 512 && !
High)
4084 IID = Intrinsic::x86_avx512_vpmadd52l_uq_512;
4085 else if (VecWidth == 128 &&
High)
4086 IID = Intrinsic::x86_avx512_vpmadd52h_uq_128;
4087 else if (VecWidth == 256 &&
High)
4088 IID = Intrinsic::x86_avx512_vpmadd52h_uq_256;
4089 else if (VecWidth == 512 &&
High)
4090 IID = Intrinsic::x86_avx512_vpmadd52h_uq_512;
4101 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vpermi2var.") ||
4102 Name.starts_with(
"avx512.mask.vpermt2var.") ||
4103 Name.starts_with(
"avx512.maskz.vpermt2var."))) {
4104 bool ZeroMask =
Name[11] ==
'z';
4105 bool IndexForm =
Name[17] ==
'i';
4107 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vpdpbusd.") ||
4108 Name.starts_with(
"avx512.maskz.vpdpbusd.") ||
4109 Name.starts_with(
"avx512.mask.vpdpbusds.") ||
4110 Name.starts_with(
"avx512.maskz.vpdpbusds."))) {
4111 bool ZeroMask =
Name[11] ==
'z';
4112 bool IsSaturating =
Name[ZeroMask ? 21 : 20] ==
's';
4115 if (VecWidth == 128 && !IsSaturating)
4116 IID = Intrinsic::x86_avx512_vpdpbusd_128;
4117 else if (VecWidth == 256 && !IsSaturating)
4118 IID = Intrinsic::x86_avx512_vpdpbusd_256;
4119 else if (VecWidth == 512 && !IsSaturating)
4120 IID = Intrinsic::x86_avx512_vpdpbusd_512;
4121 else if (VecWidth == 128 && IsSaturating)
4122 IID = Intrinsic::x86_avx512_vpdpbusds_128;
4123 else if (VecWidth == 256 && IsSaturating)
4124 IID = Intrinsic::x86_avx512_vpdpbusds_256;
4125 else if (VecWidth == 512 && IsSaturating)
4126 IID = Intrinsic::x86_avx512_vpdpbusds_512;
4137 }
else if (IsX86 && (
Name.starts_with(
"avx512.mask.vpdpwssd.") ||
4138 Name.starts_with(
"avx512.maskz.vpdpwssd.") ||
4139 Name.starts_with(
"avx512.mask.vpdpwssds.") ||
4140 Name.starts_with(
"avx512.maskz.vpdpwssds."))) {
4141 bool ZeroMask =
Name[11] ==
'z';
4142 bool IsSaturating =
Name[ZeroMask ? 21 : 20] ==
's';
4145 if (VecWidth == 128 && !IsSaturating)
4146 IID = Intrinsic::x86_avx512_vpdpwssd_128;
4147 else if (VecWidth == 256 && !IsSaturating)
4148 IID = Intrinsic::x86_avx512_vpdpwssd_256;
4149 else if (VecWidth == 512 && !IsSaturating)
4150 IID = Intrinsic::x86_avx512_vpdpwssd_512;
4151 else if (VecWidth == 128 && IsSaturating)
4152 IID = Intrinsic::x86_avx512_vpdpwssds_128;
4153 else if (VecWidth == 256 && IsSaturating)
4154 IID = Intrinsic::x86_avx512_vpdpwssds_256;
4155 else if (VecWidth == 512 && IsSaturating)
4156 IID = Intrinsic::x86_avx512_vpdpwssds_512;
4167 }
else if (IsX86 && (
Name ==
"addcarryx.u32" ||
Name ==
"addcarryx.u64" ||
4168 Name ==
"addcarry.u32" ||
Name ==
"addcarry.u64" ||
4169 Name ==
"subborrow.u32" ||
Name ==
"subborrow.u64")) {
4171 if (
Name[0] ==
'a' &&
Name.back() ==
'2')
4172 IID = Intrinsic::x86_addcarry_32;
4173 else if (
Name[0] ==
'a' &&
Name.back() ==
'4')
4174 IID = Intrinsic::x86_addcarry_64;
4175 else if (
Name[0] ==
's' &&
Name.back() ==
'2')
4176 IID = Intrinsic::x86_subborrow_32;
4177 else if (
Name[0] ==
's' &&
Name.back() ==
'4')
4178 IID = Intrinsic::x86_subborrow_64;
4200 }
else if (IsX86 &&
Name.starts_with(
"avx512.mask.") &&
4203 }
else if (IsNVVM && (
Name ==
"abs.i" ||
Name ==
"abs.ll")) {
4209 }
else if (IsNVVM && (
Name.starts_with(
"atomic.load.add.f32.p") ||
4210 Name.starts_with(
"atomic.load.add.f64.p"))) {
4214 AtomicOrdering::SequentiallyConsistent);
4215 }
else if (IsNVVM &&
Name.consume_front(
"max.") &&
4224 }
else if (IsNVVM &&
Name.consume_front(
"min.") &&
4233 }
else if (IsNVVM &&
Name ==
"clz.ll") {
4239 {Arg, Builder.getFalse()},
"ctlz");
4241 }
else if (IsNVVM &&
Name ==
"popc.ll") {
4250 }
else if (IsNVVM) {
4251 if (
Name ==
"h2f") {
4254 F->getParent(), Intrinsic::convert_from_fp16,
4255 {Builder.getFloatTy()}),
4260 !
F->getReturnType()->getScalarType()->isBFloatTy()) {
4274 if (
F->getReturnType()->isIntegerTy())
4280 }
else if (IsAMDGCN) {
4292 FallthroughToDefaultUpgrade =
true;
4300 if (!FallthroughToDefaultUpgrade) {
4308 const auto &DefaultCase = [&]() ->
void {
4313 "Unknown function for CallBase upgrade and isn't just a name change");
4319 if (
auto *OldST = dyn_cast<StructType>(CI->
getType())) {
4321 "Return type must have changed");
4322 assert(OldST->getNumElements() ==
4323 cast<StructType>(NewFn->
getReturnType())->getNumElements() &&
4324 "Must have same number of elements");
4329 for (
unsigned Idx = 0;
Idx < OldST->getNumElements(); ++
Idx) {
4350 case Intrinsic::arm_neon_vst1:
4351 case Intrinsic::arm_neon_vst2:
4352 case Intrinsic::arm_neon_vst3:
4353 case Intrinsic::arm_neon_vst4:
4354 case Intrinsic::arm_neon_vst2lane:
4355 case Intrinsic::arm_neon_vst3lane:
4356 case Intrinsic::arm_neon_vst4lane: {
4361 case Intrinsic::aarch64_sve_bfmlalb_lane_v2:
4362 case Intrinsic::aarch64_sve_bfmlalt_lane_v2:
4363 case Intrinsic::aarch64_sve_bfdot_lane_v2: {
4367 cast<ConstantInt>(Args[3])->getZExtValue());
4371 case Intrinsic::aarch64_sve_ld3_sret:
4372 case Intrinsic::aarch64_sve_ld4_sret:
4373 case Intrinsic::aarch64_sve_ld2_sret: {
4382 dyn_cast<ScalableVectorType>(
F->getReturnType());
4383 unsigned MinElts =
RetTy->getMinNumElements() /
N;
4387 for (
unsigned I = 0;
I <
N;
I++) {
4392 NewCall = dyn_cast<CallInst>(Ret);
4396 case Intrinsic::coro_end: {
4403 case Intrinsic::vector_extract: {
4406 if (!
Name.starts_with(
"aarch64.sve.tuple.get")) {
4411 dyn_cast<ScalableVectorType>(
F->getReturnType());
4412 unsigned MinElts =
RetTy->getMinNumElements();
4413 unsigned I = cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
4419 case Intrinsic::vector_insert: {
4422 if (!
Name.starts_with(
"aarch64.sve.tuple")) {
4426 if (
Name.starts_with(
"aarch64.sve.tuple.set")) {
4427 unsigned I = dyn_cast<ConstantInt>(CI->
getArgOperand(1))->getZExtValue();
4436 if (
Name.starts_with(
"aarch64.sve.tuple.create")) {
4442 assert(
N > 1 &&
"Create is expected to be between 2-4");
4444 dyn_cast<ScalableVectorType>(
F->getReturnType());
4446 unsigned MinElts =
RetTy->getMinNumElements() /
N;
4447 for (
unsigned I = 0;
I <
N;
I++) {
4452 NewCall = dyn_cast<CallInst>(Ret);
4457 case Intrinsic::arm_neon_bfdot:
4458 case Intrinsic::arm_neon_bfmmla:
4459 case Intrinsic::arm_neon_bfmlalb:
4460 case Intrinsic::arm_neon_bfmlalt:
4461 case Intrinsic::aarch64_neon_bfdot:
4462 case Intrinsic::aarch64_neon_bfmmla:
4463 case Intrinsic::aarch64_neon_bfmlalb:
4464 case Intrinsic::aarch64_neon_bfmlalt: {
4467 "Mismatch between function args and call args");
4468 size_t OperandWidth =
4470 assert((OperandWidth == 64 || OperandWidth == 128) &&
4471 "Unexpected operand width");
4473 auto Iter = CI->
args().begin();
4474 Args.push_back(*Iter++);
4481 case Intrinsic::bitreverse:
4485 case Intrinsic::ctlz:
4486 case Intrinsic::cttz:
4488 "Mismatch between function args and call args");
4493 case Intrinsic::objectsize: {
4494 Value *NullIsUnknownSize =
4503 case Intrinsic::ctpop:
4507 case Intrinsic::convert_from_fp16:
4511 case Intrinsic::dbg_value: {
4515 if (
Name.starts_with(
"dbg.addr")) {
4517 cast<MetadataAsValue>(CI->
getArgOperand(2))->getMetadata());
4529 if (
Offset->isZeroValue()) {
4539 case Intrinsic::ptr_annotation:
4556 case Intrinsic::var_annotation:
4572 case Intrinsic::riscv_aes32dsi:
4573 case Intrinsic::riscv_aes32dsmi:
4574 case Intrinsic::riscv_aes32esi:
4575 case Intrinsic::riscv_aes32esmi:
4576 case Intrinsic::riscv_sm4ks:
4577 case Intrinsic::riscv_sm4ed: {
4592 cast<ConstantInt>(Arg2)->getZExtValue());
4594 NewCall = Builder.
CreateCall(NewFn, {Arg0, Arg1, Arg2});
4595 Value *Res = NewCall;
4603 case Intrinsic::riscv_sha256sig0:
4604 case Intrinsic::riscv_sha256sig1:
4605 case Intrinsic::riscv_sha256sum0:
4606 case Intrinsic::riscv_sha256sum1:
4607 case Intrinsic::riscv_sm3p0:
4608 case Intrinsic::riscv_sm3p1: {
4626 case Intrinsic::x86_xop_vfrcz_ss:
4627 case Intrinsic::x86_xop_vfrcz_sd:
4631 case Intrinsic::x86_xop_vpermil2pd:
4632 case Intrinsic::x86_xop_vpermil2ps:
4633 case Intrinsic::x86_xop_vpermil2pd_256:
4634 case Intrinsic::x86_xop_vpermil2ps_256: {
4637 VectorType *IntIdxTy = VectorType::getInteger(FltIdxTy);
4643 case Intrinsic::x86_sse41_ptestc:
4644 case Intrinsic::x86_sse41_ptestz:
4645 case Intrinsic::x86_sse41_ptestnzc: {
4662 NewCall = Builder.
CreateCall(NewFn, {BC0, BC1});
4666 case Intrinsic::x86_rdtscp: {
4688 case Intrinsic::x86_sse41_insertps:
4689 case Intrinsic::x86_sse41_dppd:
4690 case Intrinsic::x86_sse41_dpps:
4691 case Intrinsic::x86_sse41_mpsadbw:
4692 case Intrinsic::x86_avx_dp_ps_256:
4693 case Intrinsic::x86_avx2_mpsadbw: {
4704 case Intrinsic::x86_avx512_mask_cmp_pd_128:
4705 case Intrinsic::x86_avx512_mask_cmp_pd_256:
4706 case Intrinsic::x86_avx512_mask_cmp_pd_512:
4707 case Intrinsic::x86_avx512_mask_cmp_ps_128:
4708 case Intrinsic::x86_avx512_mask_cmp_ps_256:
4709 case Intrinsic::x86_avx512_mask_cmp_ps_512: {
4712 cast<FixedVectorType>(Args[0]->
getType())->getNumElements();
4724 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_128:
4725 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_256:
4726 case Intrinsic::x86_avx512bf16_cvtne2ps2bf16_512:
4727 case Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128:
4728 case Intrinsic::x86_avx512bf16_cvtneps2bf16_256:
4729 case Intrinsic::x86_avx512bf16_cvtneps2bf16_512: {
4731 unsigned NumElts = cast<FixedVectorType>(CI->
getType())->getNumElements();
4733 Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128)
4746 case Intrinsic::x86_avx512bf16_dpbf16ps_128:
4747 case Intrinsic::x86_avx512bf16_dpbf16ps_256:
4748 case Intrinsic::x86_avx512bf16_dpbf16ps_512:{
4751 cast<FixedVectorType>(CI->
getType())->getNumElements() * 2;
4761 case Intrinsic::thread_pointer: {
4766 case Intrinsic::memcpy:
4767 case Intrinsic::memmove:
4768 case Intrinsic::memset: {
4788 {OldAttrs.getParamAttrs(0), OldAttrs.getParamAttrs(1),
4789 OldAttrs.getParamAttrs(2), OldAttrs.getParamAttrs(4)});
4791 auto *MemCI = cast<MemIntrinsic>(NewCall);
4794 MemCI->setDestAlignment(
Align->getMaybeAlignValue());
4796 if (
auto *MTI = dyn_cast<MemTransferInst>(MemCI))
4797 MTI->setSourceAlignment(
Align->getMaybeAlignValue());
4801 assert(NewCall &&
"Should have either set this variable or returned through "
4802 "the default case");
4809 assert(
F &&
"Illegal attempt to upgrade a non-existent intrinsic.");
4818 if (
CallBase *CB = dyn_cast<CallBase>(U))
4822 F->eraseFromParent();
4828 if (NumOperands == 0)
4832 if (isa<MDNode>(MD.
getOperand(0)) && NumOperands >= 3)
4836 if (NumOperands == 3) {
4840 Metadata *Elts2[] = {ScalarType, ScalarType,
4854 if (Opc != Instruction::BitCast)
4858 Type *SrcTy = V->getType();
4875 if (Opc != Instruction::BitCast)
4878 Type *SrcTy =
C->getType();
4902 bool BrokenDebugInfo =
false;
4905 if (!BrokenDebugInfo)
4911 M.getContext().diagnose(Diag);
4918 M.getContext().diagnose(DiagVersion);
4926 bool Changed =
false;
4927 const char *MarkerKey =
"clang.arc.retainAutoreleasedReturnValueMarker";
4928 NamedMDNode *ModRetainReleaseMarker = M.getNamedMetadata(MarkerKey);
4929 if (ModRetainReleaseMarker) {
4932 MDString *
ID = dyn_cast_or_null<MDString>(
Op->getOperand(0));
4935 ID->getString().split(ValueComp,
"#");
4936 if (ValueComp.
size() == 2) {
4937 std::string NewValue = ValueComp[0].str() +
";" + ValueComp[1].str();
4941 M.eraseNamedMetadata(ModRetainReleaseMarker);
4952 auto UpgradeToIntrinsic = [&](
const char *OldFunc,
4954 Function *Fn = M.getFunction(OldFunc);
4962 CallInst *CI = dyn_cast<CallInst>(U);
4977 bool InvalidCast =
false;
4979 for (
unsigned I = 0, E = CI->
arg_size();
I != E; ++
I) {
4984 if (I < NewFuncTy->getNumParams()) {
4994 Args.push_back(Arg);
5019 UpgradeToIntrinsic(
"clang.arc.use", llvm::Intrinsic::objc_clang_arc_use);
5027 std::pair<const char *, llvm::Intrinsic::ID> RuntimeFuncs[] = {
5028 {
"objc_autorelease", llvm::Intrinsic::objc_autorelease},
5029 {
"objc_autoreleasePoolPop", llvm::Intrinsic::objc_autoreleasePoolPop},
5030 {
"objc_autoreleasePoolPush", llvm::Intrinsic::objc_autoreleasePoolPush},
5031 {
"objc_autoreleaseReturnValue",
5032 llvm::Intrinsic::objc_autoreleaseReturnValue},
5033 {
"objc_copyWeak", llvm::Intrinsic::objc_copyWeak},
5034 {
"objc_destroyWeak", llvm::Intrinsic::objc_destroyWeak},
5035 {
"objc_initWeak", llvm::Intrinsic::objc_initWeak},
5036 {
"objc_loadWeak", llvm::Intrinsic::objc_loadWeak},
5037 {
"objc_loadWeakRetained", llvm::Intrinsic::objc_loadWeakRetained},
5038 {
"objc_moveWeak", llvm::Intrinsic::objc_moveWeak},
5039 {
"objc_release", llvm::Intrinsic::objc_release},
5040 {
"objc_retain", llvm::Intrinsic::objc_retain},
5041 {
"objc_retainAutorelease", llvm::Intrinsic::objc_retainAutorelease},
5042 {
"objc_retainAutoreleaseReturnValue",
5043 llvm::Intrinsic::objc_retainAutoreleaseReturnValue},
5044 {
"objc_retainAutoreleasedReturnValue",
5045 llvm::Intrinsic::objc_retainAutoreleasedReturnValue},
5046 {
"objc_retainBlock", llvm::Intrinsic::objc_retainBlock},
5047 {
"objc_storeStrong", llvm::Intrinsic::objc_storeStrong},
5048 {
"objc_storeWeak", llvm::Intrinsic::objc_storeWeak},
5049 {
"objc_unsafeClaimAutoreleasedReturnValue",
5050 llvm::Intrinsic::objc_unsafeClaimAutoreleasedReturnValue},
5051 {
"objc_retainedObject", llvm::Intrinsic::objc_retainedObject},
5052 {
"objc_unretainedObject", llvm::Intrinsic::objc_unretainedObject},
5053 {
"objc_unretainedPointer", llvm::Intrinsic::objc_unretainedPointer},
5054 {
"objc_retain_autorelease", llvm::Intrinsic::objc_retain_autorelease},
5055 {
"objc_sync_enter", llvm::Intrinsic::objc_sync_enter},
5056 {
"objc_sync_exit", llvm::Intrinsic::objc_sync_exit},
5057 {
"objc_arc_annotation_topdown_bbstart",
5058 llvm::Intrinsic::objc_arc_annotation_topdown_bbstart},
5059 {
"objc_arc_annotation_topdown_bbend",
5060 llvm::Intrinsic::objc_arc_annotation_topdown_bbend},
5061 {
"objc_arc_annotation_bottomup_bbstart",
5062 llvm::Intrinsic::objc_arc_annotation_bottomup_bbstart},
5063 {
"objc_arc_annotation_bottomup_bbend",
5064 llvm::Intrinsic::objc_arc_annotation_bottomup_bbend}};
5066 for (
auto &
I : RuntimeFuncs)
5067 UpgradeToIntrinsic(
I.first,
I.second);
5071 NamedMDNode *ModFlags = M.getModuleFlagsMetadata();
5075 bool HasObjCFlag =
false, HasClassProperties =
false, Changed =
false;
5076 bool HasSwiftVersionFlag =
false;
5077 uint8_t SwiftMajorVersion, SwiftMinorVersion;
5086 MDString *
ID = dyn_cast_or_null<MDString>(
Op->getOperand(1));
5098 if (
ID->getString() ==
"Objective-C Image Info Version")
5100 if (
ID->getString() ==
"Objective-C Class Properties")
5101 HasClassProperties =
true;
5103 if (
ID->getString() ==
"PIC Level") {
5104 if (
auto *Behavior =
5105 mdconst::dyn_extract_or_null<ConstantInt>(
Op->getOperand(0))) {
5106 uint64_t V = Behavior->getLimitedValue();
5112 if (
ID->getString() ==
"PIE Level")
5113 if (
auto *Behavior =
5114 mdconst::dyn_extract_or_null<ConstantInt>(
Op->getOperand(0)))
5120 if (
ID->getString() ==
"branch-target-enforcement" ||
5121 ID->getString().starts_with(
"sign-return-address")) {
5122 if (
auto *Behavior =
5123 mdconst::dyn_extract_or_null<ConstantInt>(
Op->getOperand(0))) {
5128 Op->getOperand(1),
Op->getOperand(2)};
5138 if (
ID->getString() ==
"Objective-C Image Info Section") {
5139 if (
auto *
Value = dyn_cast_or_null<MDString>(
Op->getOperand(2))) {
5141 Value->getString().split(ValueComp,
" ");
5142 if (ValueComp.
size() != 1) {
5143 std::string NewValue;
5144 for (
auto &S : ValueComp)
5145 NewValue += S.str();
5146 Metadata *Ops[3] = {
Op->getOperand(0),
Op->getOperand(1),
5156 if (
ID->getString() ==
"Objective-C Garbage Collection") {
5157 auto Md = dyn_cast<ConstantAsMetadata>(
Op->getOperand(2));
5159 assert(Md->getValue() &&
"Expected non-empty metadata");
5160 auto Type = Md->getValue()->getType();
5163 unsigned Val = Md->getValue()->getUniqueInteger().getZExtValue();
5164 if ((Val & 0xff) != Val) {
5165 HasSwiftVersionFlag =
true;
5166 SwiftABIVersion = (Val & 0xff00) >> 8;
5167 SwiftMajorVersion = (Val & 0xff000000) >> 24;
5168 SwiftMinorVersion = (Val & 0xff0000) >> 16;
5179 if (
ID->getString() ==
"amdgpu_code_object_version") {
5182 MDString::get(M.getContext(),
"amdhsa_code_object_version"),
5194 if (HasObjCFlag && !HasClassProperties) {
5200 if (HasSwiftVersionFlag) {
5204 ConstantInt::get(Int8Ty, SwiftMajorVersion));
5206 ConstantInt::get(Int8Ty, SwiftMinorVersion));
5214 auto TrimSpaces = [](
StringRef Section) -> std::string {
5216 Section.split(Components,
',');
5221 for (
auto Component : Components)
5222 OS <<
',' << Component.trim();
5224 return std::string(
OS.str().substr(1));
5227 for (
auto &GV : M.globals()) {
5228 if (!GV.hasSection())
5233 if (!Section.starts_with(
"__DATA, __objc_catlist"))
5238 GV.setSection(TrimSpaces(Section));
5254struct StrictFPUpgradeVisitor :
public InstVisitor<StrictFPUpgradeVisitor> {
5255 StrictFPUpgradeVisitor() =
default;
5258 if (!Call.isStrictFP())
5260 if (isa<ConstrainedFPIntrinsic>(&Call))
5264 Call.removeFnAttr(Attribute::StrictFP);
5265 Call.addFnAttr(Attribute::NoBuiltin);
5273 if (!
F.isDeclaration() && !
F.hasFnAttribute(Attribute::StrictFP)) {
5274 StrictFPUpgradeVisitor SFPV;
5280 for (
auto &Arg :
F.args())
5285 if (
Attribute A =
F.getFnAttribute(
"implicit-section-name");
5286 A.isValid() &&
A.isStringAttribute()) {
5287 F.setSection(
A.getValueAsString());
5288 F.removeFnAttr(
"implicit-section-name");
5293 auto *
T = dyn_cast_or_null<MDTuple>(MD);
5296 if (
T->getNumOperands() < 1)
5298 auto *S = dyn_cast_or_null<MDString>(
T->getOperand(0));
5301 return S->getString().starts_with(
"llvm.vectorizer.");
5305 StringRef OldPrefix =
"llvm.vectorizer.";
5308 if (OldTag ==
"llvm.vectorizer.unroll")
5317 auto *
T = dyn_cast_or_null<MDTuple>(MD);
5320 if (
T->getNumOperands() < 1)
5322 auto *OldTag = dyn_cast_or_null<MDString>(
T->getOperand(0));
5325 if (!OldTag->getString().starts_with(
"llvm.vectorizer."))
5332 for (
unsigned I = 1, E =
T->getNumOperands();
I != E; ++
I)
5339 auto *
T = dyn_cast<MDTuple>(&
N);
5358 if (((
T.isAMDGPU() && !
T.isAMDGCN()) ||
5359 (
T.isSPIR() || (
T.isSPIRV() && !
T.isSPIRVLogical()))) &&
5360 !
DL.contains(
"-G") && !
DL.starts_with(
"G")) {
5361 return DL.
empty() ? std::string(
"G1") : (
DL +
"-G1").str();
5364 if (
T.isRISCV64()) {
5366 auto I =
DL.find(
"-n64-");
5368 return (
DL.take_front(
I) +
"-n32:64-" +
DL.drop_front(
I + 5)).str();
5372 std::string Res =
DL.str();
5376 if (!
DL.contains(
"-G") && !
DL.starts_with(
"G"))
5377 Res.append(Res.empty() ?
"G1" :
"-G1");
5382 if (!
DL.contains(
"-ni") && !
DL.starts_with(
"ni"))
5383 Res.append(
"-ni:7:8:9");
5385 if (
DL.ends_with(
"ni:7"))
5387 if (
DL.ends_with(
"ni:7:8"))
5392 if (!
DL.contains(
"-p7") && !
DL.starts_with(
"p7"))
5393 Res.append(
"-p7:160:256:256:32");
5394 if (!
DL.contains(
"-p8") && !
DL.starts_with(
"p8"))
5395 Res.append(
"-p8:128:128");
5396 if (!
DL.contains(
"-p9") && !
DL.starts_with(
"p9"))
5397 Res.append(
"-p9:192:256:256:32");
5407 std::string AddrSpaces =
"-p270:32:32-p271:32:32-p272:64:64";
5410 Regex R(
"(e-m:[a-z](-p:32:32)?)(-[if]64:.*$)");
5411 if (R.match(Res, &
Groups))
5421 if (!
T.isOSIAMCU()) {
5422 std::string I128 =
"-i128:128";
5425 Regex R(
"^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
5426 if (R.match(Res, &
Groups))
5434 if (
T.isWindowsMSVCEnvironment() && !
T.isArch64Bit()) {
5436 auto I =
Ref.find(
"-f80:32-");
5438 Res = (
Ref.take_front(
I) +
"-f80:128-" +
Ref.drop_front(
I + 8)).str();
5446 Attribute A =
B.getAttribute(
"no-frame-pointer-elim");
5449 FramePointer =
A.getValueAsString() ==
"true" ?
"all" :
"none";
5450 B.removeAttribute(
"no-frame-pointer-elim");
5452 if (
B.contains(
"no-frame-pointer-elim-non-leaf")) {
5454 if (FramePointer !=
"all")
5455 FramePointer =
"non-leaf";
5456 B.removeAttribute(
"no-frame-pointer-elim-non-leaf");
5458 if (!FramePointer.
empty())
5459 B.addAttribute(
"frame-pointer", FramePointer);
5461 A =
B.getAttribute(
"null-pointer-is-valid");
5464 bool NullPointerIsValid =
A.getValueAsString() ==
"true";
5465 B.removeAttribute(
"null-pointer-is-valid");
5466 if (NullPointerIsValid)
5467 B.addAttribute(Attribute::NullPointerIsValid);
5477 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.