xref: /llvm-project/llvm/lib/Transforms/Utils/BuildLibCalls.cpp (revision 0c1c37bfbed08c9d4e414a10f46cbed9a3e4c870)
1 //===- BuildLibCalls.cpp - Utility builder for libcalls -------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements some functions that will create standard C libcalls.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/Transforms/Utils/BuildLibCalls.h"
14 #include "llvm/ADT/SmallString.h"
15 #include "llvm/ADT/Statistic.h"
16 #include "llvm/Analysis/MemoryBuiltins.h"
17 #include "llvm/Analysis/TargetLibraryInfo.h"
18 #include "llvm/IR/Argument.h"
19 #include "llvm/IR/CallingConv.h"
20 #include "llvm/IR/Constants.h"
21 #include "llvm/IR/DataLayout.h"
22 #include "llvm/IR/DerivedTypes.h"
23 #include "llvm/IR/Function.h"
24 #include "llvm/IR/IRBuilder.h"
25 #include "llvm/IR/Module.h"
26 #include "llvm/IR/Type.h"
27 #include "llvm/Support/TypeSize.h"
28 #include <optional>
29 
30 using namespace llvm;
31 
32 #define DEBUG_TYPE "build-libcalls"
33 
34 //- Infer Attributes ---------------------------------------------------------//
35 
36 STATISTIC(NumReadNone, "Number of functions inferred as readnone");
37 STATISTIC(NumInaccessibleMemOnly,
38           "Number of functions inferred as inaccessiblememonly");
39 STATISTIC(NumReadOnly, "Number of functions inferred as readonly");
40 STATISTIC(NumWriteOnly, "Number of functions inferred as writeonly");
41 STATISTIC(NumArgMemOnly, "Number of functions inferred as argmemonly");
42 STATISTIC(NumInaccessibleMemOrArgMemOnly,
43           "Number of functions inferred as inaccessiblemem_or_argmemonly");
44 STATISTIC(NumNoUnwind, "Number of functions inferred as nounwind");
45 STATISTIC(NumNoCapture, "Number of arguments inferred as nocapture");
46 STATISTIC(NumWriteOnlyArg, "Number of arguments inferred as writeonly");
47 STATISTIC(NumReadOnlyArg, "Number of arguments inferred as readonly");
48 STATISTIC(NumNoAlias, "Number of function returns inferred as noalias");
49 STATISTIC(NumNoUndef, "Number of function returns inferred as noundef returns");
50 STATISTIC(NumReturnedArg, "Number of arguments inferred as returned");
51 STATISTIC(NumWillReturn, "Number of functions inferred as willreturn");
52 STATISTIC(NumCold, "Number of functions inferred as cold");
53 STATISTIC(NumNoReturn, "Number of functions inferred as no return");
54 
55 static bool setDoesNotAccessMemory(Function &F) {
56   if (F.doesNotAccessMemory())
57     return false;
58   F.setDoesNotAccessMemory();
59   ++NumReadNone;
60   return true;
61 }
62 
63 static bool setIsCold(Function &F) {
64   if (F.hasFnAttribute(Attribute::Cold))
65     return false;
66   F.addFnAttr(Attribute::Cold);
67   ++NumCold;
68   return true;
69 }
70 
71 static bool setNoReturn(Function &F) {
72   if (F.hasFnAttribute(Attribute::NoReturn))
73     return false;
74   F.addFnAttr(Attribute::NoReturn);
75   ++NumNoReturn;
76   return true;
77 }
78 
79 static bool setOnlyAccessesInaccessibleMemory(Function &F) {
80   if (F.onlyAccessesInaccessibleMemory())
81     return false;
82   F.setOnlyAccessesInaccessibleMemory();
83   ++NumInaccessibleMemOnly;
84   return true;
85 }
86 
87 static bool setOnlyReadsMemory(Function &F) {
88   if (F.onlyReadsMemory())
89     return false;
90   F.setOnlyReadsMemory();
91   ++NumReadOnly;
92   return true;
93 }
94 
95 static bool setOnlyWritesMemory(Function &F) {
96   if (F.onlyWritesMemory()) // writeonly or readnone
97     return false;
98   ++NumWriteOnly;
99   F.setOnlyWritesMemory();
100   return true;
101 }
102 
103 static bool setOnlyAccessesArgMemory(Function &F) {
104   if (F.onlyAccessesArgMemory())
105     return false;
106   F.setOnlyAccessesArgMemory();
107   ++NumArgMemOnly;
108   return true;
109 }
110 
111 static bool setOnlyAccessesInaccessibleMemOrArgMem(Function &F) {
112   if (F.onlyAccessesInaccessibleMemOrArgMem())
113     return false;
114   F.setOnlyAccessesInaccessibleMemOrArgMem();
115   ++NumInaccessibleMemOrArgMemOnly;
116   return true;
117 }
118 
119 static bool setDoesNotThrow(Function &F) {
120   if (F.doesNotThrow())
121     return false;
122   F.setDoesNotThrow();
123   ++NumNoUnwind;
124   return true;
125 }
126 
127 static bool setRetDoesNotAlias(Function &F) {
128   if (F.hasRetAttribute(Attribute::NoAlias))
129     return false;
130   F.addRetAttr(Attribute::NoAlias);
131   ++NumNoAlias;
132   return true;
133 }
134 
135 static bool setDoesNotCapture(Function &F, unsigned ArgNo) {
136   if (F.hasParamAttribute(ArgNo, Attribute::NoCapture))
137     return false;
138   F.addParamAttr(ArgNo, Attribute::NoCapture);
139   ++NumNoCapture;
140   return true;
141 }
142 
143 static bool setDoesNotAlias(Function &F, unsigned ArgNo) {
144   if (F.hasParamAttribute(ArgNo, Attribute::NoAlias))
145     return false;
146   F.addParamAttr(ArgNo, Attribute::NoAlias);
147   ++NumNoAlias;
148   return true;
149 }
150 
151 static bool setOnlyReadsMemory(Function &F, unsigned ArgNo) {
152   if (F.hasParamAttribute(ArgNo, Attribute::ReadOnly))
153     return false;
154   F.addParamAttr(ArgNo, Attribute::ReadOnly);
155   ++NumReadOnlyArg;
156   return true;
157 }
158 
159 static bool setOnlyWritesMemory(Function &F, unsigned ArgNo) {
160   if (F.hasParamAttribute(ArgNo, Attribute::WriteOnly))
161     return false;
162   F.addParamAttr(ArgNo, Attribute::WriteOnly);
163   ++NumWriteOnlyArg;
164   return true;
165 }
166 
167 static bool setRetNoUndef(Function &F) {
168   if (!F.getReturnType()->isVoidTy() &&
169       !F.hasRetAttribute(Attribute::NoUndef)) {
170     F.addRetAttr(Attribute::NoUndef);
171     ++NumNoUndef;
172     return true;
173   }
174   return false;
175 }
176 
177 static bool setArgsNoUndef(Function &F) {
178   bool Changed = false;
179   for (unsigned ArgNo = 0; ArgNo < F.arg_size(); ++ArgNo) {
180     if (!F.hasParamAttribute(ArgNo, Attribute::NoUndef)) {
181       F.addParamAttr(ArgNo, Attribute::NoUndef);
182       ++NumNoUndef;
183       Changed = true;
184     }
185   }
186   return Changed;
187 }
188 
189 static bool setArgNoUndef(Function &F, unsigned ArgNo) {
190   if (F.hasParamAttribute(ArgNo, Attribute::NoUndef))
191     return false;
192   F.addParamAttr(ArgNo, Attribute::NoUndef);
193   ++NumNoUndef;
194   return true;
195 }
196 
197 static bool setRetAndArgsNoUndef(Function &F) {
198   bool UndefAdded = false;
199   UndefAdded |= setRetNoUndef(F);
200   UndefAdded |= setArgsNoUndef(F);
201   return UndefAdded;
202 }
203 
204 static bool setReturnedArg(Function &F, unsigned ArgNo) {
205   if (F.hasParamAttribute(ArgNo, Attribute::Returned))
206     return false;
207   F.addParamAttr(ArgNo, Attribute::Returned);
208   ++NumReturnedArg;
209   return true;
210 }
211 
212 static bool setNonLazyBind(Function &F) {
213   if (F.hasFnAttribute(Attribute::NonLazyBind))
214     return false;
215   F.addFnAttr(Attribute::NonLazyBind);
216   return true;
217 }
218 
219 static bool setDoesNotFreeMemory(Function &F) {
220   if (F.hasFnAttribute(Attribute::NoFree))
221     return false;
222   F.addFnAttr(Attribute::NoFree);
223   return true;
224 }
225 
226 static bool setWillReturn(Function &F) {
227   if (F.hasFnAttribute(Attribute::WillReturn))
228     return false;
229   F.addFnAttr(Attribute::WillReturn);
230   ++NumWillReturn;
231   return true;
232 }
233 
234 static bool setAlignedAllocParam(Function &F, unsigned ArgNo) {
235   if (F.hasParamAttribute(ArgNo, Attribute::AllocAlign))
236     return false;
237   F.addParamAttr(ArgNo, Attribute::AllocAlign);
238   return true;
239 }
240 
241 static bool setAllocatedPointerParam(Function &F, unsigned ArgNo) {
242   if (F.hasParamAttribute(ArgNo, Attribute::AllocatedPointer))
243     return false;
244   F.addParamAttr(ArgNo, Attribute::AllocatedPointer);
245   return true;
246 }
247 
248 static bool setAllocSize(Function &F, unsigned ElemSizeArg,
249                          std::optional<unsigned> NumElemsArg) {
250   if (F.hasFnAttribute(Attribute::AllocSize))
251     return false;
252   F.addFnAttr(Attribute::getWithAllocSizeArgs(F.getContext(), ElemSizeArg,
253                                               NumElemsArg));
254   return true;
255 }
256 
257 static bool setAllocFamily(Function &F, StringRef Family) {
258   if (F.hasFnAttribute("alloc-family"))
259     return false;
260   F.addFnAttr("alloc-family", Family);
261   return true;
262 }
263 
264 static bool setAllocKind(Function &F, AllocFnKind K) {
265   if (F.hasFnAttribute(Attribute::AllocKind))
266     return false;
267   F.addFnAttr(
268       Attribute::get(F.getContext(), Attribute::AllocKind, uint64_t(K)));
269   return true;
270 }
271 
272 bool llvm::inferNonMandatoryLibFuncAttrs(Module *M, StringRef Name,
273                                          const TargetLibraryInfo &TLI) {
274   Function *F = M->getFunction(Name);
275   if (!F)
276     return false;
277   return inferNonMandatoryLibFuncAttrs(*F, TLI);
278 }
279 
280 bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
281                                          const TargetLibraryInfo &TLI) {
282   LibFunc TheLibFunc;
283   if (!(TLI.getLibFunc(F, TheLibFunc) && TLI.has(TheLibFunc)))
284     return false;
285 
286   bool Changed = false;
287 
288   if (F.getParent() != nullptr && F.getParent()->getRtLibUseGOT())
289     Changed |= setNonLazyBind(F);
290 
291   switch (TheLibFunc) {
292   case LibFunc_nan:
293   case LibFunc_nanf:
294   case LibFunc_nanl:
295   case LibFunc_strlen:
296   case LibFunc_strnlen:
297   case LibFunc_wcslen:
298     Changed |= setOnlyReadsMemory(F);
299     Changed |= setDoesNotThrow(F);
300     Changed |= setOnlyAccessesArgMemory(F);
301     Changed |= setWillReturn(F);
302     Changed |= setDoesNotCapture(F, 0);
303     break;
304   case LibFunc_strchr:
305   case LibFunc_strrchr:
306     Changed |= setOnlyAccessesArgMemory(F);
307     Changed |= setOnlyReadsMemory(F);
308     Changed |= setDoesNotThrow(F);
309     Changed |= setWillReturn(F);
310     break;
311   case LibFunc_strtol:
312   case LibFunc_strtod:
313   case LibFunc_strtof:
314   case LibFunc_strtoul:
315   case LibFunc_strtoll:
316   case LibFunc_strtold:
317   case LibFunc_strtoull:
318     Changed |= setDoesNotThrow(F);
319     Changed |= setWillReturn(F);
320     Changed |= setDoesNotCapture(F, 1);
321     Changed |= setOnlyReadsMemory(F, 0);
322     break;
323   case LibFunc_strcat:
324   case LibFunc_strncat:
325     Changed |= setOnlyAccessesArgMemory(F);
326     Changed |= setDoesNotThrow(F);
327     Changed |= setWillReturn(F);
328     Changed |= setReturnedArg(F, 0);
329     Changed |= setDoesNotCapture(F, 1);
330     Changed |= setOnlyReadsMemory(F, 1);
331     Changed |= setDoesNotAlias(F, 0);
332     Changed |= setDoesNotAlias(F, 1);
333     break;
334   case LibFunc_strcpy:
335   case LibFunc_strncpy:
336     Changed |= setReturnedArg(F, 0);
337     [[fallthrough]];
338   case LibFunc_stpcpy:
339   case LibFunc_stpncpy:
340     Changed |= setOnlyAccessesArgMemory(F);
341     Changed |= setDoesNotThrow(F);
342     Changed |= setWillReturn(F);
343     Changed |= setDoesNotCapture(F, 1);
344     Changed |= setOnlyWritesMemory(F, 0);
345     Changed |= setOnlyReadsMemory(F, 1);
346     Changed |= setDoesNotAlias(F, 0);
347     Changed |= setDoesNotAlias(F, 1);
348     break;
349   case LibFunc_strxfrm:
350     Changed |= setDoesNotThrow(F);
351     Changed |= setWillReturn(F);
352     Changed |= setDoesNotCapture(F, 0);
353     Changed |= setDoesNotCapture(F, 1);
354     Changed |= setOnlyReadsMemory(F, 1);
355     break;
356   case LibFunc_strcmp:      // 0,1
357   case LibFunc_strspn:      // 0,1
358   case LibFunc_strncmp:     // 0,1
359   case LibFunc_strcspn:     // 0,1
360     Changed |= setDoesNotThrow(F);
361     Changed |= setOnlyAccessesArgMemory(F);
362     Changed |= setWillReturn(F);
363     Changed |= setOnlyReadsMemory(F);
364     Changed |= setDoesNotCapture(F, 0);
365     Changed |= setDoesNotCapture(F, 1);
366     break;
367   case LibFunc_strcoll:
368   case LibFunc_strcasecmp:  // 0,1
369   case LibFunc_strncasecmp: //
370     // Those functions may depend on the locale, which may be accessed through
371     // global memory.
372     Changed |= setOnlyReadsMemory(F);
373     Changed |= setDoesNotThrow(F);
374     Changed |= setWillReturn(F);
375     Changed |= setDoesNotCapture(F, 0);
376     Changed |= setDoesNotCapture(F, 1);
377     break;
378   case LibFunc_strstr:
379   case LibFunc_strpbrk:
380     Changed |= setOnlyAccessesArgMemory(F);
381     Changed |= setOnlyReadsMemory(F);
382     Changed |= setDoesNotThrow(F);
383     Changed |= setWillReturn(F);
384     Changed |= setDoesNotCapture(F, 1);
385     break;
386   case LibFunc_strtok:
387   case LibFunc_strtok_r:
388     Changed |= setDoesNotThrow(F);
389     Changed |= setWillReturn(F);
390     Changed |= setDoesNotCapture(F, 1);
391     Changed |= setOnlyReadsMemory(F, 1);
392     break;
393   case LibFunc_scanf:
394     Changed |= setRetAndArgsNoUndef(F);
395     Changed |= setDoesNotThrow(F);
396     Changed |= setDoesNotCapture(F, 0);
397     Changed |= setOnlyReadsMemory(F, 0);
398     break;
399   case LibFunc_setbuf:
400   case LibFunc_setvbuf:
401     Changed |= setRetAndArgsNoUndef(F);
402     Changed |= setDoesNotThrow(F);
403     Changed |= setDoesNotCapture(F, 0);
404     break;
405   case LibFunc_strndup:
406     Changed |= setArgNoUndef(F, 1);
407     [[fallthrough]];
408   case LibFunc_strdup:
409     Changed |= setAllocFamily(F, "malloc");
410     Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
411     Changed |= setDoesNotThrow(F);
412     Changed |= setRetDoesNotAlias(F);
413     Changed |= setWillReturn(F);
414     Changed |= setDoesNotCapture(F, 0);
415     Changed |= setOnlyReadsMemory(F, 0);
416     break;
417   case LibFunc_stat:
418   case LibFunc_statvfs:
419     Changed |= setRetAndArgsNoUndef(F);
420     Changed |= setDoesNotThrow(F);
421     Changed |= setDoesNotCapture(F, 0);
422     Changed |= setDoesNotCapture(F, 1);
423     Changed |= setOnlyReadsMemory(F, 0);
424     break;
425   case LibFunc_sscanf:
426     Changed |= setRetAndArgsNoUndef(F);
427     Changed |= setDoesNotThrow(F);
428     Changed |= setDoesNotCapture(F, 0);
429     Changed |= setDoesNotCapture(F, 1);
430     Changed |= setOnlyReadsMemory(F, 0);
431     Changed |= setOnlyReadsMemory(F, 1);
432     break;
433   case LibFunc_sprintf:
434     Changed |= setRetAndArgsNoUndef(F);
435     Changed |= setDoesNotThrow(F);
436     Changed |= setDoesNotCapture(F, 0);
437     Changed |= setDoesNotAlias(F, 0);
438     Changed |= setOnlyWritesMemory(F, 0);
439     Changed |= setDoesNotCapture(F, 1);
440     Changed |= setOnlyReadsMemory(F, 1);
441     break;
442   case LibFunc_snprintf:
443     Changed |= setRetAndArgsNoUndef(F);
444     Changed |= setDoesNotThrow(F);
445     Changed |= setDoesNotCapture(F, 0);
446     Changed |= setDoesNotAlias(F, 0);
447     Changed |= setOnlyWritesMemory(F, 0);
448     Changed |= setDoesNotCapture(F, 2);
449     Changed |= setOnlyReadsMemory(F, 2);
450     break;
451   case LibFunc_setitimer:
452     Changed |= setRetAndArgsNoUndef(F);
453     Changed |= setDoesNotThrow(F);
454     Changed |= setWillReturn(F);
455     Changed |= setDoesNotCapture(F, 1);
456     Changed |= setDoesNotCapture(F, 2);
457     Changed |= setOnlyReadsMemory(F, 1);
458     break;
459   case LibFunc_system:
460     // May throw; "system" is a valid pthread cancellation point.
461     Changed |= setRetAndArgsNoUndef(F);
462     Changed |= setDoesNotCapture(F, 0);
463     Changed |= setOnlyReadsMemory(F, 0);
464     break;
465   case LibFunc_aligned_alloc:
466     Changed |= setAlignedAllocParam(F, 0);
467     Changed |= setAllocSize(F, 1, std::nullopt);
468     Changed |= setAllocKind(F, AllocFnKind::Alloc | AllocFnKind::Uninitialized | AllocFnKind::Aligned);
469     [[fallthrough]];
470   case LibFunc_valloc:
471   case LibFunc_malloc:
472   case LibFunc_vec_malloc:
473     Changed |= setAllocFamily(F, TheLibFunc == LibFunc_vec_malloc ? "vec_malloc"
474                                                                   : "malloc");
475     Changed |= setAllocKind(F, AllocFnKind::Alloc | AllocFnKind::Uninitialized);
476     Changed |= setAllocSize(F, 0, std::nullopt);
477     Changed |= setOnlyAccessesInaccessibleMemory(F);
478     Changed |= setRetAndArgsNoUndef(F);
479     Changed |= setDoesNotThrow(F);
480     Changed |= setRetDoesNotAlias(F);
481     Changed |= setWillReturn(F);
482     break;
483   case LibFunc_memcmp:
484     Changed |= setOnlyAccessesArgMemory(F);
485     Changed |= setOnlyReadsMemory(F);
486     Changed |= setDoesNotThrow(F);
487     Changed |= setWillReturn(F);
488     Changed |= setDoesNotCapture(F, 0);
489     Changed |= setDoesNotCapture(F, 1);
490     break;
491   case LibFunc_memchr:
492   case LibFunc_memrchr:
493     Changed |= setDoesNotThrow(F);
494     Changed |= setOnlyAccessesArgMemory(F);
495     Changed |= setOnlyReadsMemory(F);
496     Changed |= setWillReturn(F);
497     break;
498   case LibFunc_modf:
499   case LibFunc_modff:
500   case LibFunc_modfl:
501     Changed |= setDoesNotThrow(F);
502     Changed |= setWillReturn(F);
503     Changed |= setOnlyAccessesArgMemory(F);
504     Changed |= setOnlyWritesMemory(F);
505     Changed |= setDoesNotCapture(F, 1);
506     break;
507   case LibFunc_memcpy:
508     Changed |= setDoesNotThrow(F);
509     Changed |= setOnlyAccessesArgMemory(F);
510     Changed |= setWillReturn(F);
511     Changed |= setDoesNotAlias(F, 0);
512     Changed |= setReturnedArg(F, 0);
513     Changed |= setOnlyWritesMemory(F, 0);
514     Changed |= setDoesNotAlias(F, 1);
515     Changed |= setDoesNotCapture(F, 1);
516     Changed |= setOnlyReadsMemory(F, 1);
517     break;
518   case LibFunc_memmove:
519     Changed |= setDoesNotThrow(F);
520     Changed |= setOnlyAccessesArgMemory(F);
521     Changed |= setWillReturn(F);
522     Changed |= setReturnedArg(F, 0);
523     Changed |= setOnlyWritesMemory(F, 0);
524     Changed |= setDoesNotCapture(F, 1);
525     Changed |= setOnlyReadsMemory(F, 1);
526     break;
527   case LibFunc_mempcpy:
528   case LibFunc_memccpy:
529     Changed |= setWillReturn(F);
530     [[fallthrough]];
531   case LibFunc_memcpy_chk:
532     Changed |= setDoesNotThrow(F);
533     Changed |= setOnlyAccessesArgMemory(F);
534     Changed |= setDoesNotAlias(F, 0);
535     Changed |= setOnlyWritesMemory(F, 0);
536     Changed |= setDoesNotAlias(F, 1);
537     Changed |= setDoesNotCapture(F, 1);
538     Changed |= setOnlyReadsMemory(F, 1);
539     break;
540   case LibFunc_memalign:
541     Changed |= setAllocFamily(F, "malloc");
542     Changed |= setAllocKind(F, AllocFnKind::Alloc | AllocFnKind::Aligned |
543                                    AllocFnKind::Uninitialized);
544     Changed |= setAllocSize(F, 1, std::nullopt);
545     Changed |= setAlignedAllocParam(F, 0);
546     Changed |= setOnlyAccessesInaccessibleMemory(F);
547     Changed |= setRetNoUndef(F);
548     Changed |= setDoesNotThrow(F);
549     Changed |= setRetDoesNotAlias(F);
550     Changed |= setWillReturn(F);
551     break;
552   case LibFunc_mkdir:
553     Changed |= setRetAndArgsNoUndef(F);
554     Changed |= setDoesNotThrow(F);
555     Changed |= setDoesNotCapture(F, 0);
556     Changed |= setOnlyReadsMemory(F, 0);
557     break;
558   case LibFunc_mktime:
559     Changed |= setRetAndArgsNoUndef(F);
560     Changed |= setDoesNotThrow(F);
561     Changed |= setWillReturn(F);
562     Changed |= setDoesNotCapture(F, 0);
563     break;
564   case LibFunc_realloc:
565   case LibFunc_reallocf:
566   case LibFunc_vec_realloc:
567     Changed |= setAllocFamily(
568         F, TheLibFunc == LibFunc_vec_realloc ? "vec_malloc" : "malloc");
569     Changed |= setAllocKind(F, AllocFnKind::Realloc);
570     Changed |= setAllocatedPointerParam(F, 0);
571     Changed |= setAllocSize(F, 1, std::nullopt);
572     Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
573     Changed |= setRetNoUndef(F);
574     Changed |= setDoesNotThrow(F);
575     Changed |= setRetDoesNotAlias(F);
576     Changed |= setWillReturn(F);
577     Changed |= setDoesNotCapture(F, 0);
578     Changed |= setArgNoUndef(F, 1);
579     break;
580   case LibFunc_read:
581     // May throw; "read" is a valid pthread cancellation point.
582     Changed |= setRetAndArgsNoUndef(F);
583     Changed |= setDoesNotCapture(F, 1);
584     break;
585   case LibFunc_rewind:
586     Changed |= setRetAndArgsNoUndef(F);
587     Changed |= setDoesNotThrow(F);
588     Changed |= setDoesNotCapture(F, 0);
589     break;
590   case LibFunc_rmdir:
591   case LibFunc_remove:
592   case LibFunc_realpath:
593     Changed |= setRetAndArgsNoUndef(F);
594     Changed |= setDoesNotThrow(F);
595     Changed |= setDoesNotCapture(F, 0);
596     Changed |= setOnlyReadsMemory(F, 0);
597     break;
598   case LibFunc_rename:
599     Changed |= setRetAndArgsNoUndef(F);
600     Changed |= setDoesNotThrow(F);
601     Changed |= setDoesNotCapture(F, 0);
602     Changed |= setDoesNotCapture(F, 1);
603     Changed |= setOnlyReadsMemory(F, 0);
604     Changed |= setOnlyReadsMemory(F, 1);
605     break;
606   case LibFunc_readlink:
607     Changed |= setRetAndArgsNoUndef(F);
608     Changed |= setDoesNotThrow(F);
609     Changed |= setDoesNotCapture(F, 0);
610     Changed |= setDoesNotCapture(F, 1);
611     Changed |= setOnlyReadsMemory(F, 0);
612     break;
613   case LibFunc_write:
614     // May throw; "write" is a valid pthread cancellation point.
615     Changed |= setRetAndArgsNoUndef(F);
616     Changed |= setDoesNotCapture(F, 1);
617     Changed |= setOnlyReadsMemory(F, 1);
618     break;
619   case LibFunc_bcopy:
620     Changed |= setDoesNotThrow(F);
621     Changed |= setOnlyAccessesArgMemory(F);
622     Changed |= setWillReturn(F);
623     Changed |= setDoesNotCapture(F, 0);
624     Changed |= setOnlyReadsMemory(F, 0);
625     Changed |= setOnlyWritesMemory(F, 1);
626     Changed |= setDoesNotCapture(F, 1);
627     break;
628   case LibFunc_bcmp:
629     Changed |= setDoesNotThrow(F);
630     Changed |= setOnlyAccessesArgMemory(F);
631     Changed |= setOnlyReadsMemory(F);
632     Changed |= setWillReturn(F);
633     Changed |= setDoesNotCapture(F, 0);
634     Changed |= setDoesNotCapture(F, 1);
635     break;
636   case LibFunc_bzero:
637     Changed |= setDoesNotThrow(F);
638     Changed |= setOnlyAccessesArgMemory(F);
639     Changed |= setWillReturn(F);
640     Changed |= setDoesNotCapture(F, 0);
641     Changed |= setOnlyWritesMemory(F, 0);
642     break;
643   case LibFunc_calloc:
644   case LibFunc_vec_calloc:
645     Changed |= setAllocFamily(F, TheLibFunc == LibFunc_vec_calloc ? "vec_malloc"
646                                                                   : "malloc");
647     Changed |= setAllocKind(F, AllocFnKind::Alloc | AllocFnKind::Zeroed);
648     Changed |= setAllocSize(F, 0, 1);
649     Changed |= setOnlyAccessesInaccessibleMemory(F);
650     Changed |= setRetAndArgsNoUndef(F);
651     Changed |= setDoesNotThrow(F);
652     Changed |= setRetDoesNotAlias(F);
653     Changed |= setWillReturn(F);
654     break;
655   case LibFunc_chmod:
656   case LibFunc_chown:
657     Changed |= setRetAndArgsNoUndef(F);
658     Changed |= setDoesNotThrow(F);
659     Changed |= setDoesNotCapture(F, 0);
660     Changed |= setOnlyReadsMemory(F, 0);
661     break;
662   case LibFunc_ctermid:
663   case LibFunc_clearerr:
664   case LibFunc_closedir:
665     Changed |= setRetAndArgsNoUndef(F);
666     Changed |= setDoesNotThrow(F);
667     Changed |= setDoesNotCapture(F, 0);
668     break;
669   case LibFunc_atoi:
670   case LibFunc_atol:
671   case LibFunc_atof:
672   case LibFunc_atoll:
673     Changed |= setDoesNotThrow(F);
674     Changed |= setOnlyReadsMemory(F);
675     Changed |= setWillReturn(F);
676     Changed |= setDoesNotCapture(F, 0);
677     break;
678   case LibFunc_access:
679     Changed |= setRetAndArgsNoUndef(F);
680     Changed |= setDoesNotThrow(F);
681     Changed |= setDoesNotCapture(F, 0);
682     Changed |= setOnlyReadsMemory(F, 0);
683     break;
684   case LibFunc_fopen:
685     Changed |= setRetAndArgsNoUndef(F);
686     Changed |= setDoesNotThrow(F);
687     Changed |= setRetDoesNotAlias(F);
688     Changed |= setDoesNotCapture(F, 0);
689     Changed |= setDoesNotCapture(F, 1);
690     Changed |= setOnlyReadsMemory(F, 0);
691     Changed |= setOnlyReadsMemory(F, 1);
692     break;
693   case LibFunc_fdopen:
694     Changed |= setRetAndArgsNoUndef(F);
695     Changed |= setDoesNotThrow(F);
696     Changed |= setRetDoesNotAlias(F);
697     Changed |= setDoesNotCapture(F, 1);
698     Changed |= setOnlyReadsMemory(F, 1);
699     break;
700   case LibFunc_feof:
701     Changed |= setRetAndArgsNoUndef(F);
702     Changed |= setDoesNotThrow(F);
703     Changed |= setDoesNotCapture(F, 0);
704     break;
705   case LibFunc_free:
706   case LibFunc_vec_free:
707     Changed |= setAllocFamily(F, TheLibFunc == LibFunc_vec_free ? "vec_malloc"
708                                                                 : "malloc");
709     Changed |= setAllocKind(F, AllocFnKind::Free);
710     Changed |= setAllocatedPointerParam(F, 0);
711     Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
712     Changed |= setArgsNoUndef(F);
713     Changed |= setDoesNotThrow(F);
714     Changed |= setWillReturn(F);
715     Changed |= setDoesNotCapture(F, 0);
716     break;
717   case LibFunc_fseek:
718   case LibFunc_ftell:
719   case LibFunc_fgetc:
720   case LibFunc_fgetc_unlocked:
721   case LibFunc_fseeko:
722   case LibFunc_ftello:
723   case LibFunc_fileno:
724   case LibFunc_fflush:
725   case LibFunc_fclose:
726   case LibFunc_fsetpos:
727   case LibFunc_flockfile:
728   case LibFunc_funlockfile:
729   case LibFunc_ftrylockfile:
730     Changed |= setRetAndArgsNoUndef(F);
731     Changed |= setDoesNotThrow(F);
732     Changed |= setDoesNotCapture(F, 0);
733     break;
734   case LibFunc_ferror:
735     Changed |= setRetAndArgsNoUndef(F);
736     Changed |= setDoesNotThrow(F);
737     Changed |= setDoesNotCapture(F, 0);
738     Changed |= setOnlyReadsMemory(F);
739     break;
740   case LibFunc_fputc:
741   case LibFunc_fputc_unlocked:
742   case LibFunc_fstat:
743     Changed |= setRetAndArgsNoUndef(F);
744     Changed |= setDoesNotThrow(F);
745     Changed |= setDoesNotCapture(F, 1);
746     break;
747   case LibFunc_frexp:
748   case LibFunc_frexpf:
749   case LibFunc_frexpl:
750     Changed |= setDoesNotThrow(F);
751     Changed |= setWillReturn(F);
752     Changed |= setOnlyAccessesArgMemory(F);
753     Changed |= setOnlyWritesMemory(F);
754     Changed |= setDoesNotCapture(F, 1);
755     break;
756   case LibFunc_fstatvfs:
757     Changed |= setRetAndArgsNoUndef(F);
758     Changed |= setDoesNotThrow(F);
759     Changed |= setDoesNotCapture(F, 1);
760     break;
761   case LibFunc_fgets:
762   case LibFunc_fgets_unlocked:
763     Changed |= setRetAndArgsNoUndef(F);
764     Changed |= setDoesNotThrow(F);
765     Changed |= setDoesNotCapture(F, 2);
766     break;
767   case LibFunc_fread:
768   case LibFunc_fread_unlocked:
769     Changed |= setRetAndArgsNoUndef(F);
770     Changed |= setDoesNotThrow(F);
771     Changed |= setDoesNotCapture(F, 0);
772     Changed |= setDoesNotCapture(F, 3);
773     break;
774   case LibFunc_fwrite:
775   case LibFunc_fwrite_unlocked:
776     Changed |= setRetAndArgsNoUndef(F);
777     Changed |= setDoesNotThrow(F);
778     Changed |= setDoesNotCapture(F, 0);
779     Changed |= setDoesNotCapture(F, 3);
780     // FIXME: readonly #1?
781     break;
782   case LibFunc_fputs:
783   case LibFunc_fputs_unlocked:
784     Changed |= setRetAndArgsNoUndef(F);
785     Changed |= setDoesNotThrow(F);
786     Changed |= setDoesNotCapture(F, 0);
787     Changed |= setDoesNotCapture(F, 1);
788     Changed |= setOnlyReadsMemory(F, 0);
789     break;
790   case LibFunc_fscanf:
791   case LibFunc_fprintf:
792     Changed |= setRetAndArgsNoUndef(F);
793     Changed |= setDoesNotThrow(F);
794     Changed |= setDoesNotCapture(F, 0);
795     Changed |= setDoesNotCapture(F, 1);
796     Changed |= setOnlyReadsMemory(F, 1);
797     break;
798   case LibFunc_fgetpos:
799     Changed |= setRetAndArgsNoUndef(F);
800     Changed |= setDoesNotThrow(F);
801     Changed |= setDoesNotCapture(F, 0);
802     Changed |= setDoesNotCapture(F, 1);
803     break;
804   case LibFunc_getc:
805     Changed |= setRetAndArgsNoUndef(F);
806     Changed |= setDoesNotThrow(F);
807     Changed |= setDoesNotCapture(F, 0);
808     break;
809   case LibFunc_getlogin_r:
810     Changed |= setRetAndArgsNoUndef(F);
811     Changed |= setDoesNotThrow(F);
812     Changed |= setDoesNotCapture(F, 0);
813     break;
814   case LibFunc_getc_unlocked:
815     Changed |= setRetAndArgsNoUndef(F);
816     Changed |= setDoesNotThrow(F);
817     Changed |= setDoesNotCapture(F, 0);
818     break;
819   case LibFunc_getenv:
820     Changed |= setRetAndArgsNoUndef(F);
821     Changed |= setDoesNotThrow(F);
822     Changed |= setOnlyReadsMemory(F);
823     Changed |= setDoesNotCapture(F, 0);
824     break;
825   case LibFunc_gets:
826   case LibFunc_getchar:
827   case LibFunc_getchar_unlocked:
828     Changed |= setRetAndArgsNoUndef(F);
829     Changed |= setDoesNotThrow(F);
830     break;
831   case LibFunc_getitimer:
832     Changed |= setRetAndArgsNoUndef(F);
833     Changed |= setDoesNotThrow(F);
834     Changed |= setDoesNotCapture(F, 1);
835     break;
836   case LibFunc_getpwnam:
837     Changed |= setRetAndArgsNoUndef(F);
838     Changed |= setDoesNotThrow(F);
839     Changed |= setDoesNotCapture(F, 0);
840     Changed |= setOnlyReadsMemory(F, 0);
841     break;
842   case LibFunc_ungetc:
843     Changed |= setRetAndArgsNoUndef(F);
844     Changed |= setDoesNotThrow(F);
845     Changed |= setDoesNotCapture(F, 1);
846     break;
847   case LibFunc_uname:
848     Changed |= setRetAndArgsNoUndef(F);
849     Changed |= setDoesNotThrow(F);
850     Changed |= setDoesNotCapture(F, 0);
851     break;
852   case LibFunc_unlink:
853     Changed |= setRetAndArgsNoUndef(F);
854     Changed |= setDoesNotThrow(F);
855     Changed |= setDoesNotCapture(F, 0);
856     Changed |= setOnlyReadsMemory(F, 0);
857     break;
858   case LibFunc_unsetenv:
859     Changed |= setRetAndArgsNoUndef(F);
860     Changed |= setDoesNotThrow(F);
861     Changed |= setDoesNotCapture(F, 0);
862     Changed |= setOnlyReadsMemory(F, 0);
863     break;
864   case LibFunc_utime:
865   case LibFunc_utimes:
866     Changed |= setRetAndArgsNoUndef(F);
867     Changed |= setDoesNotThrow(F);
868     Changed |= setDoesNotCapture(F, 0);
869     Changed |= setDoesNotCapture(F, 1);
870     Changed |= setOnlyReadsMemory(F, 0);
871     Changed |= setOnlyReadsMemory(F, 1);
872     break;
873   case LibFunc_putc:
874   case LibFunc_putc_unlocked:
875     Changed |= setRetAndArgsNoUndef(F);
876     Changed |= setDoesNotThrow(F);
877     Changed |= setDoesNotCapture(F, 1);
878     break;
879   case LibFunc_puts:
880   case LibFunc_printf:
881   case LibFunc_perror:
882     Changed |= setRetAndArgsNoUndef(F);
883     Changed |= setDoesNotThrow(F);
884     Changed |= setDoesNotCapture(F, 0);
885     Changed |= setOnlyReadsMemory(F, 0);
886     break;
887   case LibFunc_pread:
888     // May throw; "pread" is a valid pthread cancellation point.
889     Changed |= setRetAndArgsNoUndef(F);
890     Changed |= setDoesNotCapture(F, 1);
891     break;
892   case LibFunc_pwrite:
893     // May throw; "pwrite" is a valid pthread cancellation point.
894     Changed |= setRetAndArgsNoUndef(F);
895     Changed |= setDoesNotCapture(F, 1);
896     Changed |= setOnlyReadsMemory(F, 1);
897     break;
898   case LibFunc_putchar:
899   case LibFunc_putchar_unlocked:
900     Changed |= setRetAndArgsNoUndef(F);
901     Changed |= setDoesNotThrow(F);
902     break;
903   case LibFunc_popen:
904     Changed |= setRetAndArgsNoUndef(F);
905     Changed |= setDoesNotThrow(F);
906     Changed |= setRetDoesNotAlias(F);
907     Changed |= setDoesNotCapture(F, 0);
908     Changed |= setDoesNotCapture(F, 1);
909     Changed |= setOnlyReadsMemory(F, 0);
910     Changed |= setOnlyReadsMemory(F, 1);
911     break;
912   case LibFunc_pclose:
913     Changed |= setRetAndArgsNoUndef(F);
914     Changed |= setDoesNotThrow(F);
915     Changed |= setDoesNotCapture(F, 0);
916     break;
917   case LibFunc_vscanf:
918     Changed |= setRetAndArgsNoUndef(F);
919     Changed |= setDoesNotThrow(F);
920     Changed |= setDoesNotCapture(F, 0);
921     Changed |= setOnlyReadsMemory(F, 0);
922     break;
923   case LibFunc_vsscanf:
924     Changed |= setRetAndArgsNoUndef(F);
925     Changed |= setDoesNotThrow(F);
926     Changed |= setDoesNotCapture(F, 0);
927     Changed |= setDoesNotCapture(F, 1);
928     Changed |= setOnlyReadsMemory(F, 0);
929     Changed |= setOnlyReadsMemory(F, 1);
930     break;
931   case LibFunc_vfscanf:
932     Changed |= setRetAndArgsNoUndef(F);
933     Changed |= setDoesNotThrow(F);
934     Changed |= setDoesNotCapture(F, 0);
935     Changed |= setDoesNotCapture(F, 1);
936     Changed |= setOnlyReadsMemory(F, 1);
937     break;
938   case LibFunc_vprintf:
939     Changed |= setRetAndArgsNoUndef(F);
940     Changed |= setDoesNotThrow(F);
941     Changed |= setDoesNotCapture(F, 0);
942     Changed |= setOnlyReadsMemory(F, 0);
943     break;
944   case LibFunc_vfprintf:
945   case LibFunc_vsprintf:
946     Changed |= setRetAndArgsNoUndef(F);
947     Changed |= setDoesNotThrow(F);
948     Changed |= setDoesNotCapture(F, 0);
949     Changed |= setDoesNotCapture(F, 1);
950     Changed |= setOnlyReadsMemory(F, 1);
951     break;
952   case LibFunc_vsnprintf:
953     Changed |= setRetAndArgsNoUndef(F);
954     Changed |= setDoesNotThrow(F);
955     Changed |= setDoesNotCapture(F, 0);
956     Changed |= setDoesNotCapture(F, 2);
957     Changed |= setOnlyReadsMemory(F, 2);
958     break;
959   case LibFunc_open:
960     // May throw; "open" is a valid pthread cancellation point.
961     Changed |= setRetAndArgsNoUndef(F);
962     Changed |= setDoesNotCapture(F, 0);
963     Changed |= setOnlyReadsMemory(F, 0);
964     break;
965   case LibFunc_opendir:
966     Changed |= setRetAndArgsNoUndef(F);
967     Changed |= setDoesNotThrow(F);
968     Changed |= setRetDoesNotAlias(F);
969     Changed |= setDoesNotCapture(F, 0);
970     Changed |= setOnlyReadsMemory(F, 0);
971     break;
972   case LibFunc_tmpfile:
973     Changed |= setRetAndArgsNoUndef(F);
974     Changed |= setDoesNotThrow(F);
975     Changed |= setRetDoesNotAlias(F);
976     break;
977   case LibFunc_times:
978     Changed |= setRetAndArgsNoUndef(F);
979     Changed |= setDoesNotThrow(F);
980     Changed |= setDoesNotCapture(F, 0);
981     break;
982   case LibFunc_htonl:
983   case LibFunc_htons:
984   case LibFunc_ntohl:
985   case LibFunc_ntohs:
986     Changed |= setDoesNotThrow(F);
987     Changed |= setDoesNotAccessMemory(F);
988     break;
989   case LibFunc_lstat:
990     Changed |= setRetAndArgsNoUndef(F);
991     Changed |= setDoesNotThrow(F);
992     Changed |= setDoesNotCapture(F, 0);
993     Changed |= setDoesNotCapture(F, 1);
994     Changed |= setOnlyReadsMemory(F, 0);
995     break;
996   case LibFunc_lchown:
997     Changed |= setRetAndArgsNoUndef(F);
998     Changed |= setDoesNotThrow(F);
999     Changed |= setDoesNotCapture(F, 0);
1000     Changed |= setOnlyReadsMemory(F, 0);
1001     break;
1002   case LibFunc_qsort:
1003     // May throw; places call through function pointer.
1004     // Cannot give undef pointer/size
1005     Changed |= setRetAndArgsNoUndef(F);
1006     Changed |= setDoesNotCapture(F, 3);
1007     break;
1008   case LibFunc_dunder_strndup:
1009     Changed |= setArgNoUndef(F, 1);
1010     [[fallthrough]];
1011   case LibFunc_dunder_strdup:
1012     Changed |= setDoesNotThrow(F);
1013     Changed |= setRetDoesNotAlias(F);
1014     Changed |= setWillReturn(F);
1015     Changed |= setDoesNotCapture(F, 0);
1016     Changed |= setOnlyReadsMemory(F, 0);
1017     break;
1018   case LibFunc_dunder_strtok_r:
1019     Changed |= setDoesNotThrow(F);
1020     Changed |= setDoesNotCapture(F, 1);
1021     Changed |= setOnlyReadsMemory(F, 1);
1022     break;
1023   case LibFunc_under_IO_getc:
1024     Changed |= setRetAndArgsNoUndef(F);
1025     Changed |= setDoesNotThrow(F);
1026     Changed |= setDoesNotCapture(F, 0);
1027     break;
1028   case LibFunc_under_IO_putc:
1029     Changed |= setRetAndArgsNoUndef(F);
1030     Changed |= setDoesNotThrow(F);
1031     Changed |= setDoesNotCapture(F, 1);
1032     break;
1033   case LibFunc_dunder_isoc99_scanf:
1034     Changed |= setRetAndArgsNoUndef(F);
1035     Changed |= setDoesNotThrow(F);
1036     Changed |= setDoesNotCapture(F, 0);
1037     Changed |= setOnlyReadsMemory(F, 0);
1038     break;
1039   case LibFunc_stat64:
1040   case LibFunc_lstat64:
1041   case LibFunc_statvfs64:
1042     Changed |= setRetAndArgsNoUndef(F);
1043     Changed |= setDoesNotThrow(F);
1044     Changed |= setDoesNotCapture(F, 0);
1045     Changed |= setDoesNotCapture(F, 1);
1046     Changed |= setOnlyReadsMemory(F, 0);
1047     break;
1048   case LibFunc_dunder_isoc99_sscanf:
1049     Changed |= setRetAndArgsNoUndef(F);
1050     Changed |= setDoesNotThrow(F);
1051     Changed |= setDoesNotCapture(F, 0);
1052     Changed |= setDoesNotCapture(F, 1);
1053     Changed |= setOnlyReadsMemory(F, 0);
1054     Changed |= setOnlyReadsMemory(F, 1);
1055     break;
1056   case LibFunc_fopen64:
1057     Changed |= setRetAndArgsNoUndef(F);
1058     Changed |= setDoesNotThrow(F);
1059     Changed |= setRetDoesNotAlias(F);
1060     Changed |= setDoesNotCapture(F, 0);
1061     Changed |= setDoesNotCapture(F, 1);
1062     Changed |= setOnlyReadsMemory(F, 0);
1063     Changed |= setOnlyReadsMemory(F, 1);
1064     break;
1065   case LibFunc_fseeko64:
1066   case LibFunc_ftello64:
1067     Changed |= setRetAndArgsNoUndef(F);
1068     Changed |= setDoesNotThrow(F);
1069     Changed |= setDoesNotCapture(F, 0);
1070     break;
1071   case LibFunc_tmpfile64:
1072     Changed |= setRetAndArgsNoUndef(F);
1073     Changed |= setDoesNotThrow(F);
1074     Changed |= setRetDoesNotAlias(F);
1075     break;
1076   case LibFunc_fstat64:
1077   case LibFunc_fstatvfs64:
1078     Changed |= setRetAndArgsNoUndef(F);
1079     Changed |= setDoesNotThrow(F);
1080     Changed |= setDoesNotCapture(F, 1);
1081     break;
1082   case LibFunc_open64:
1083     // May throw; "open" is a valid pthread cancellation point.
1084     Changed |= setRetAndArgsNoUndef(F);
1085     Changed |= setDoesNotCapture(F, 0);
1086     Changed |= setOnlyReadsMemory(F, 0);
1087     break;
1088   case LibFunc_gettimeofday:
1089     // Currently some platforms have the restrict keyword on the arguments to
1090     // gettimeofday. To be conservative, do not add noalias to gettimeofday's
1091     // arguments.
1092     Changed |= setRetAndArgsNoUndef(F);
1093     Changed |= setDoesNotThrow(F);
1094     Changed |= setDoesNotCapture(F, 0);
1095     Changed |= setDoesNotCapture(F, 1);
1096     break;
1097   case LibFunc_memset_pattern4:
1098   case LibFunc_memset_pattern8:
1099   case LibFunc_memset_pattern16:
1100     Changed |= setDoesNotCapture(F, 0);
1101     Changed |= setDoesNotCapture(F, 1);
1102     Changed |= setOnlyReadsMemory(F, 1);
1103     [[fallthrough]];
1104   case LibFunc_memset:
1105     Changed |= setWillReturn(F);
1106     [[fallthrough]];
1107   case LibFunc_memset_chk:
1108     Changed |= setOnlyAccessesArgMemory(F);
1109     Changed |= setOnlyWritesMemory(F, 0);
1110     Changed |= setDoesNotThrow(F);
1111     break;
1112   case LibFunc_abort:
1113     Changed |= setIsCold(F);
1114     break;
1115   case LibFunc_terminate:
1116     Changed |= setIsCold(F);
1117     Changed |= setNoReturn(F);
1118     break;
1119   case LibFunc_cxa_throw:
1120     Changed |= setIsCold(F);
1121     Changed |= setNoReturn(F);
1122     // Don't add `nofree` on `__cxa_throw`
1123     return Changed;
1124   // int __nvvm_reflect(const char *)
1125   case LibFunc_nvvm_reflect:
1126     Changed |= setRetAndArgsNoUndef(F);
1127     Changed |= setDoesNotAccessMemory(F);
1128     Changed |= setDoesNotThrow(F);
1129     break;
1130   case LibFunc_ldexp:
1131   case LibFunc_ldexpf:
1132   case LibFunc_ldexpl:
1133     Changed |= setWillReturn(F);
1134     break;
1135   case LibFunc_remquo:
1136   case LibFunc_remquof:
1137   case LibFunc_remquol:
1138     Changed |= setDoesNotCapture(F, 2);
1139     [[fallthrough]];
1140   case LibFunc_abs:
1141   case LibFunc_acos:
1142   case LibFunc_acosf:
1143   case LibFunc_acosh:
1144   case LibFunc_acoshf:
1145   case LibFunc_acoshl:
1146   case LibFunc_acosl:
1147   case LibFunc_asin:
1148   case LibFunc_asinf:
1149   case LibFunc_asinh:
1150   case LibFunc_asinhf:
1151   case LibFunc_asinhl:
1152   case LibFunc_asinl:
1153   case LibFunc_atan:
1154   case LibFunc_atan2:
1155   case LibFunc_atan2f:
1156   case LibFunc_atan2l:
1157   case LibFunc_atanf:
1158   case LibFunc_atanh:
1159   case LibFunc_atanhf:
1160   case LibFunc_atanhl:
1161   case LibFunc_atanl:
1162   case LibFunc_cbrt:
1163   case LibFunc_cbrtf:
1164   case LibFunc_cbrtl:
1165   case LibFunc_ceil:
1166   case LibFunc_ceilf:
1167   case LibFunc_ceill:
1168   case LibFunc_copysign:
1169   case LibFunc_copysignf:
1170   case LibFunc_copysignl:
1171   case LibFunc_cos:
1172   case LibFunc_cosh:
1173   case LibFunc_coshf:
1174   case LibFunc_coshl:
1175   case LibFunc_cosf:
1176   case LibFunc_cosl:
1177   case LibFunc_cospi:
1178   case LibFunc_cospif:
1179   case LibFunc_erf:
1180   case LibFunc_erff:
1181   case LibFunc_erfl:
1182   case LibFunc_tgamma:
1183   case LibFunc_tgammaf:
1184   case LibFunc_tgammal:
1185   case LibFunc_exp:
1186   case LibFunc_expf:
1187   case LibFunc_expl:
1188   case LibFunc_exp2:
1189   case LibFunc_exp2f:
1190   case LibFunc_exp2l:
1191   case LibFunc_expm1:
1192   case LibFunc_expm1f:
1193   case LibFunc_expm1l:
1194   case LibFunc_fabs:
1195   case LibFunc_fabsf:
1196   case LibFunc_fabsl:
1197   case LibFunc_fdim:
1198   case LibFunc_fdiml:
1199   case LibFunc_fdimf:
1200   case LibFunc_ffs:
1201   case LibFunc_ffsl:
1202   case LibFunc_ffsll:
1203   case LibFunc_floor:
1204   case LibFunc_floorf:
1205   case LibFunc_floorl:
1206   case LibFunc_fls:
1207   case LibFunc_flsl:
1208   case LibFunc_flsll:
1209   case LibFunc_fmax:
1210   case LibFunc_fmaxf:
1211   case LibFunc_fmaxl:
1212   case LibFunc_fmin:
1213   case LibFunc_fminf:
1214   case LibFunc_fminl:
1215   case LibFunc_fmod:
1216   case LibFunc_fmodf:
1217   case LibFunc_fmodl:
1218   case LibFunc_isascii:
1219   case LibFunc_isdigit:
1220   case LibFunc_labs:
1221   case LibFunc_llabs:
1222   case LibFunc_log:
1223   case LibFunc_log10:
1224   case LibFunc_log10f:
1225   case LibFunc_log10l:
1226   case LibFunc_log1p:
1227   case LibFunc_log1pf:
1228   case LibFunc_log1pl:
1229   case LibFunc_log2:
1230   case LibFunc_log2f:
1231   case LibFunc_log2l:
1232   case LibFunc_logb:
1233   case LibFunc_logbf:
1234   case LibFunc_logbl:
1235   case LibFunc_ilogb:
1236   case LibFunc_ilogbf:
1237   case LibFunc_ilogbl:
1238   case LibFunc_logf:
1239   case LibFunc_logl:
1240   case LibFunc_nearbyint:
1241   case LibFunc_nearbyintf:
1242   case LibFunc_nearbyintl:
1243   case LibFunc_pow:
1244   case LibFunc_powf:
1245   case LibFunc_powl:
1246   case LibFunc_remainder:
1247   case LibFunc_remainderf:
1248   case LibFunc_remainderl:
1249   case LibFunc_rint:
1250   case LibFunc_rintf:
1251   case LibFunc_rintl:
1252   case LibFunc_round:
1253   case LibFunc_roundf:
1254   case LibFunc_roundl:
1255   case LibFunc_scalbln:
1256   case LibFunc_scalblnf:
1257   case LibFunc_scalblnl:
1258   case LibFunc_scalbn:
1259   case LibFunc_scalbnf:
1260   case LibFunc_scalbnl:
1261   case LibFunc_sin:
1262   case LibFunc_sincospif_stret:
1263   case LibFunc_sinf:
1264   case LibFunc_sinh:
1265   case LibFunc_sinhf:
1266   case LibFunc_sinhl:
1267   case LibFunc_sinl:
1268   case LibFunc_sinpi:
1269   case LibFunc_sinpif:
1270   case LibFunc_sqrt:
1271   case LibFunc_sqrtf:
1272   case LibFunc_sqrtl:
1273   case LibFunc_tan:
1274   case LibFunc_tanf:
1275   case LibFunc_tanh:
1276   case LibFunc_tanhf:
1277   case LibFunc_tanhl:
1278   case LibFunc_tanl:
1279   case LibFunc_toascii:
1280   case LibFunc_trunc:
1281   case LibFunc_truncf:
1282   case LibFunc_truncl:
1283     Changed |= setDoesNotThrow(F);
1284     Changed |= setDoesNotFreeMemory(F);
1285     Changed |= setOnlyWritesMemory(F);
1286     Changed |= setWillReturn(F);
1287     break;
1288   case LibFunc_sincos:
1289   case LibFunc_sincosf:
1290   case LibFunc_sincosl:
1291     Changed |= setDoesNotThrow(F);
1292     Changed |= setDoesNotFreeMemory(F);
1293     Changed |= setOnlyWritesMemory(F);
1294     Changed |= setOnlyWritesMemory(F, 1);
1295     Changed |= setOnlyWritesMemory(F, 2);
1296     Changed |= setDoesNotCapture(F, 1);
1297     Changed |= setDoesNotCapture(F, 2);
1298     Changed |= setWillReturn(F);
1299     break;
1300   default:
1301     // FIXME: It'd be really nice to cover all the library functions we're
1302     // aware of here.
1303     break;
1304   }
1305   // We have to do this step after AllocKind has been inferred on functions so
1306   // we can reliably identify free-like and realloc-like functions.
1307   if (!isLibFreeFunction(&F, TheLibFunc) && !isReallocLikeFn(&F))
1308     Changed |= setDoesNotFreeMemory(F);
1309   return Changed;
1310 }
1311 
1312 static void setArgExtAttr(Function &F, unsigned ArgNo,
1313                           const TargetLibraryInfo &TLI, bool Signed = true) {
1314   Attribute::AttrKind ExtAttr = TLI.getExtAttrForI32Param(Signed);
1315   if (ExtAttr != Attribute::None && !F.hasParamAttribute(ArgNo, ExtAttr))
1316     F.addParamAttr(ArgNo, ExtAttr);
1317 }
1318 
1319 static void setRetExtAttr(Function &F,
1320                           const TargetLibraryInfo &TLI, bool Signed = true) {
1321   Attribute::AttrKind ExtAttr = TLI.getExtAttrForI32Return(Signed);
1322   if (ExtAttr != Attribute::None && !F.hasRetAttribute(ExtAttr))
1323     F.addRetAttr(ExtAttr);
1324 }
1325 
1326 // Modeled after X86TargetLowering::markLibCallAttributes.
1327 void llvm::markRegisterParameterAttributes(Function *F) {
1328   if (!F->arg_size() || F->isVarArg())
1329     return;
1330 
1331   const CallingConv::ID CC = F->getCallingConv();
1332   if (CC != CallingConv::C && CC != CallingConv::X86_StdCall)
1333     return;
1334 
1335   const Module *M = F->getParent();
1336   unsigned N = M->getNumberRegisterParameters();
1337   if (!N)
1338     return;
1339 
1340   const DataLayout &DL = M->getDataLayout();
1341 
1342   for (Argument &A : F->args()) {
1343     Type *T = A.getType();
1344     if (!T->isIntOrPtrTy())
1345       continue;
1346 
1347     const TypeSize &TS = DL.getTypeAllocSize(T);
1348     if (TS > 8)
1349       continue;
1350 
1351     assert(TS <= 4 && "Need to account for parameters larger than word size");
1352     const unsigned NumRegs = TS > 4 ? 2 : 1;
1353     if (N < NumRegs)
1354       return;
1355 
1356     N -= NumRegs;
1357     F->addParamAttr(A.getArgNo(), Attribute::InReg);
1358   }
1359 }
1360 
1361 FunctionCallee llvm::getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI,
1362                                         LibFunc TheLibFunc, FunctionType *T,
1363                                         AttributeList AttributeList) {
1364   assert(TLI.has(TheLibFunc) &&
1365          "Creating call to non-existing library function.");
1366   StringRef Name = TLI.getName(TheLibFunc);
1367   FunctionCallee C = M->getOrInsertFunction(Name, T, AttributeList);
1368 
1369   // Make sure any mandatory argument attributes are added.
1370 
1371   // Any outgoing i32 argument should be handled with setArgExtAttr() which
1372   // will add an extension attribute if the target ABI requires it. Adding
1373   // argument extensions is typically done by the front end but when an
1374   // optimizer is building a library call on its own it has to take care of
1375   // this. Each such generated function must be handled here with sign or
1376   // zero extensions as needed.  F is retreived with cast<> because we demand
1377   // of the caller to have called isLibFuncEmittable() first.
1378   Function *F = cast<Function>(C.getCallee());
1379   assert(F->getFunctionType() == T && "Function type does not match.");
1380   switch (TheLibFunc) {
1381   case LibFunc_fputc:
1382   case LibFunc_putchar:
1383     setArgExtAttr(*F, 0, TLI);
1384     break;
1385   case LibFunc_ldexp:
1386   case LibFunc_ldexpf:
1387   case LibFunc_ldexpl:
1388   case LibFunc_memchr:
1389   case LibFunc_memrchr:
1390   case LibFunc_strchr:
1391     setArgExtAttr(*F, 1, TLI);
1392     break;
1393   case LibFunc_memccpy:
1394     setArgExtAttr(*F, 2, TLI);
1395     break;
1396 
1397     // These are functions that are known to not need any argument extension
1398     // on any target: A size_t argument (which may be an i32 on some targets)
1399     // should not trigger the assert below.
1400   case LibFunc_bcmp:
1401     setRetExtAttr(*F, TLI);
1402     break;
1403   case LibFunc_calloc:
1404   case LibFunc_fwrite:
1405   case LibFunc_malloc:
1406   case LibFunc_memcmp:
1407   case LibFunc_memcpy_chk:
1408   case LibFunc_mempcpy:
1409   case LibFunc_memset_pattern16:
1410   case LibFunc_snprintf:
1411   case LibFunc_stpncpy:
1412   case LibFunc_strlcat:
1413   case LibFunc_strlcpy:
1414   case LibFunc_strncat:
1415   case LibFunc_strncmp:
1416   case LibFunc_strncpy:
1417   case LibFunc_vsnprintf:
1418     break;
1419 
1420   default:
1421 #ifndef NDEBUG
1422     for (unsigned i = 0; i < T->getNumParams(); i++)
1423       assert(!isa<IntegerType>(T->getParamType(i)) &&
1424              "Unhandled integer argument.");
1425 #endif
1426     break;
1427   }
1428 
1429   markRegisterParameterAttributes(F);
1430 
1431   return C;
1432 }
1433 
1434 FunctionCallee llvm::getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI,
1435                                         LibFunc TheLibFunc, FunctionType *T) {
1436   return getOrInsertLibFunc(M, TLI, TheLibFunc, T, AttributeList());
1437 }
1438 
1439 bool llvm::isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI,
1440                               LibFunc TheLibFunc) {
1441   StringRef FuncName = TLI->getName(TheLibFunc);
1442   if (!TLI->has(TheLibFunc))
1443     return false;
1444 
1445   // Check if the Module already has a GlobalValue with the same name, in
1446   // which case it must be a Function with the expected type.
1447   if (GlobalValue *GV = M->getNamedValue(FuncName)) {
1448     if (auto *F = dyn_cast<Function>(GV))
1449       return TLI->isValidProtoForLibFunc(*F->getFunctionType(), TheLibFunc, *M);
1450     return false;
1451   }
1452 
1453   return true;
1454 }
1455 
1456 bool llvm::isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI,
1457                               StringRef Name) {
1458   LibFunc TheLibFunc;
1459   return TLI->getLibFunc(Name, TheLibFunc) &&
1460          isLibFuncEmittable(M, TLI, TheLibFunc);
1461 }
1462 
1463 bool llvm::hasFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty,
1464                       LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn) {
1465   switch (Ty->getTypeID()) {
1466   case Type::HalfTyID:
1467     return false;
1468   case Type::FloatTyID:
1469     return isLibFuncEmittable(M, TLI, FloatFn);
1470   case Type::DoubleTyID:
1471     return isLibFuncEmittable(M, TLI, DoubleFn);
1472   default:
1473     return isLibFuncEmittable(M, TLI, LongDoubleFn);
1474   }
1475 }
1476 
1477 StringRef llvm::getFloatFn(const Module *M, const TargetLibraryInfo *TLI,
1478                            Type *Ty, LibFunc DoubleFn, LibFunc FloatFn,
1479                            LibFunc LongDoubleFn, LibFunc &TheLibFunc) {
1480   assert(hasFloatFn(M, TLI, Ty, DoubleFn, FloatFn, LongDoubleFn) &&
1481          "Cannot get name for unavailable function!");
1482 
1483   switch (Ty->getTypeID()) {
1484   case Type::HalfTyID:
1485     llvm_unreachable("No name for HalfTy!");
1486   case Type::FloatTyID:
1487     TheLibFunc = FloatFn;
1488     return TLI->getName(FloatFn);
1489   case Type::DoubleTyID:
1490     TheLibFunc = DoubleFn;
1491     return TLI->getName(DoubleFn);
1492   default:
1493     TheLibFunc = LongDoubleFn;
1494     return TLI->getName(LongDoubleFn);
1495   }
1496 }
1497 
1498 //- Emit LibCalls ------------------------------------------------------------//
1499 
1500 static IntegerType *getIntTy(IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1501   return B.getIntNTy(TLI->getIntSize());
1502 }
1503 
1504 static IntegerType *getSizeTTy(IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1505   const Module *M = B.GetInsertBlock()->getModule();
1506   return B.getIntNTy(TLI->getSizeTSize(*M));
1507 }
1508 
1509 static Value *emitLibCall(LibFunc TheLibFunc, Type *ReturnType,
1510                           ArrayRef<Type *> ParamTypes,
1511                           ArrayRef<Value *> Operands, IRBuilderBase &B,
1512                           const TargetLibraryInfo *TLI,
1513                           bool IsVaArgs = false) {
1514   Module *M = B.GetInsertBlock()->getModule();
1515   if (!isLibFuncEmittable(M, TLI, TheLibFunc))
1516     return nullptr;
1517 
1518   StringRef FuncName = TLI->getName(TheLibFunc);
1519   FunctionType *FuncType = FunctionType::get(ReturnType, ParamTypes, IsVaArgs);
1520   FunctionCallee Callee = getOrInsertLibFunc(M, *TLI, TheLibFunc, FuncType);
1521   inferNonMandatoryLibFuncAttrs(M, FuncName, *TLI);
1522   CallInst *CI = B.CreateCall(Callee, Operands, FuncName);
1523   if (const Function *F =
1524           dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1525     CI->setCallingConv(F->getCallingConv());
1526   return CI;
1527 }
1528 
1529 Value *llvm::emitStrLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL,
1530                         const TargetLibraryInfo *TLI) {
1531   Type *CharPtrTy = B.getPtrTy();
1532   Type *SizeTTy = getSizeTTy(B, TLI);
1533   return emitLibCall(LibFunc_strlen, SizeTTy, CharPtrTy, Ptr, B, TLI);
1534 }
1535 
1536 Value *llvm::emitStrDup(Value *Ptr, IRBuilderBase &B,
1537                         const TargetLibraryInfo *TLI) {
1538   Type *CharPtrTy = B.getPtrTy();
1539   return emitLibCall(LibFunc_strdup, CharPtrTy, CharPtrTy, Ptr, B, TLI);
1540 }
1541 
1542 Value *llvm::emitStrChr(Value *Ptr, char C, IRBuilderBase &B,
1543                         const TargetLibraryInfo *TLI) {
1544   Type *CharPtrTy = B.getPtrTy();
1545   Type *IntTy = getIntTy(B, TLI);
1546   return emitLibCall(LibFunc_strchr, CharPtrTy, {CharPtrTy, IntTy},
1547                      {Ptr, ConstantInt::get(IntTy, C)}, B, TLI);
1548 }
1549 
1550 Value *llvm::emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1551                          const DataLayout &DL, const TargetLibraryInfo *TLI) {
1552   Type *CharPtrTy = B.getPtrTy();
1553   Type *IntTy = getIntTy(B, TLI);
1554   Type *SizeTTy = getSizeTTy(B, TLI);
1555   return emitLibCall(
1556       LibFunc_strncmp, IntTy,
1557       {CharPtrTy, CharPtrTy, SizeTTy},
1558       {Ptr1, Ptr2, Len}, B, TLI);
1559 }
1560 
1561 Value *llvm::emitStrCpy(Value *Dst, Value *Src, IRBuilderBase &B,
1562                         const TargetLibraryInfo *TLI) {
1563   Type *CharPtrTy = Dst->getType();
1564   return emitLibCall(LibFunc_strcpy, CharPtrTy, {CharPtrTy, CharPtrTy},
1565                      {Dst, Src}, B, TLI);
1566 }
1567 
1568 Value *llvm::emitStpCpy(Value *Dst, Value *Src, IRBuilderBase &B,
1569                         const TargetLibraryInfo *TLI) {
1570   Type *CharPtrTy = B.getPtrTy();
1571   return emitLibCall(LibFunc_stpcpy, CharPtrTy, {CharPtrTy, CharPtrTy},
1572                      {Dst, Src}, B, TLI);
1573 }
1574 
1575 Value *llvm::emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1576                          const TargetLibraryInfo *TLI) {
1577   Type *CharPtrTy = B.getPtrTy();
1578   Type *SizeTTy = getSizeTTy(B, TLI);
1579   return emitLibCall(LibFunc_strncpy, CharPtrTy, {CharPtrTy, CharPtrTy, SizeTTy},
1580                      {Dst, Src, Len}, B, TLI);
1581 }
1582 
1583 Value *llvm::emitStpNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1584                          const TargetLibraryInfo *TLI) {
1585   Type *CharPtrTy = B.getPtrTy();
1586   Type *SizeTTy = getSizeTTy(B, TLI);
1587   return emitLibCall(LibFunc_stpncpy, CharPtrTy, {CharPtrTy, CharPtrTy, SizeTTy},
1588                      {Dst, Src, Len}, B, TLI);
1589 }
1590 
1591 Value *llvm::emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize,
1592                            IRBuilderBase &B, const DataLayout &DL,
1593                            const TargetLibraryInfo *TLI) {
1594   Module *M = B.GetInsertBlock()->getModule();
1595   if (!isLibFuncEmittable(M, TLI, LibFunc_memcpy_chk))
1596     return nullptr;
1597 
1598   AttributeList AS;
1599   AS = AttributeList::get(M->getContext(), AttributeList::FunctionIndex,
1600                           Attribute::NoUnwind);
1601   Type *VoidPtrTy = B.getPtrTy();
1602   Type *SizeTTy = getSizeTTy(B, TLI);
1603   FunctionCallee MemCpy = getOrInsertLibFunc(M, *TLI, LibFunc_memcpy_chk,
1604       AttributeList::get(M->getContext(), AS), VoidPtrTy,
1605       VoidPtrTy, VoidPtrTy, SizeTTy, SizeTTy);
1606   CallInst *CI = B.CreateCall(MemCpy, {Dst, Src, Len, ObjSize});
1607   if (const Function *F =
1608           dyn_cast<Function>(MemCpy.getCallee()->stripPointerCasts()))
1609     CI->setCallingConv(F->getCallingConv());
1610   return CI;
1611 }
1612 
1613 Value *llvm::emitMemPCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1614                          const DataLayout &DL, const TargetLibraryInfo *TLI) {
1615   Type *VoidPtrTy = B.getPtrTy();
1616   Type *SizeTTy = getSizeTTy(B, TLI);
1617   return emitLibCall(LibFunc_mempcpy, VoidPtrTy,
1618                      {VoidPtrTy, VoidPtrTy, SizeTTy},
1619                      {Dst, Src, Len}, B, TLI);
1620 }
1621 
1622 Value *llvm::emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B,
1623                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
1624   Type *VoidPtrTy = B.getPtrTy();
1625   Type *IntTy = getIntTy(B, TLI);
1626   Type *SizeTTy = getSizeTTy(B, TLI);
1627   return emitLibCall(LibFunc_memchr, VoidPtrTy,
1628                      {VoidPtrTy, IntTy, SizeTTy},
1629                      {Ptr, Val, Len}, B, TLI);
1630 }
1631 
1632 Value *llvm::emitMemRChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B,
1633                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
1634   Type *VoidPtrTy = B.getPtrTy();
1635   Type *IntTy = getIntTy(B, TLI);
1636   Type *SizeTTy = getSizeTTy(B, TLI);
1637   return emitLibCall(LibFunc_memrchr, VoidPtrTy,
1638                      {VoidPtrTy, IntTy, SizeTTy},
1639                      {Ptr, Val, Len}, B, TLI);
1640 }
1641 
1642 Value *llvm::emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1643                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
1644   Type *VoidPtrTy = B.getPtrTy();
1645   Type *IntTy = getIntTy(B, TLI);
1646   Type *SizeTTy = getSizeTTy(B, TLI);
1647   return emitLibCall(LibFunc_memcmp, IntTy,
1648                      {VoidPtrTy, VoidPtrTy, SizeTTy},
1649                      {Ptr1, Ptr2, Len}, B, TLI);
1650 }
1651 
1652 Value *llvm::emitBCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1653                       const DataLayout &DL, const TargetLibraryInfo *TLI) {
1654   Type *VoidPtrTy = B.getPtrTy();
1655   Type *IntTy = getIntTy(B, TLI);
1656   Type *SizeTTy = getSizeTTy(B, TLI);
1657   return emitLibCall(LibFunc_bcmp, IntTy,
1658                      {VoidPtrTy, VoidPtrTy, SizeTTy},
1659                      {Ptr1, Ptr2, Len}, B, TLI);
1660 }
1661 
1662 Value *llvm::emitMemCCpy(Value *Ptr1, Value *Ptr2, Value *Val, Value *Len,
1663                          IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1664   Type *VoidPtrTy = B.getPtrTy();
1665   Type *IntTy = getIntTy(B, TLI);
1666   Type *SizeTTy = getSizeTTy(B, TLI);
1667   return emitLibCall(LibFunc_memccpy, VoidPtrTy,
1668                      {VoidPtrTy, VoidPtrTy, IntTy, SizeTTy},
1669                      {Ptr1, Ptr2, Val, Len}, B, TLI);
1670 }
1671 
1672 Value *llvm::emitSNPrintf(Value *Dest, Value *Size, Value *Fmt,
1673                           ArrayRef<Value *> VariadicArgs, IRBuilderBase &B,
1674                           const TargetLibraryInfo *TLI) {
1675   Type *CharPtrTy = B.getPtrTy();
1676   Type *IntTy = getIntTy(B, TLI);
1677   Type *SizeTTy = getSizeTTy(B, TLI);
1678   SmallVector<Value *, 8> Args{Dest, Size, Fmt};
1679   llvm::append_range(Args, VariadicArgs);
1680   return emitLibCall(LibFunc_snprintf, IntTy,
1681                      {CharPtrTy, SizeTTy, CharPtrTy},
1682                      Args, B, TLI, /*IsVaArgs=*/true);
1683 }
1684 
1685 Value *llvm::emitSPrintf(Value *Dest, Value *Fmt,
1686                          ArrayRef<Value *> VariadicArgs, IRBuilderBase &B,
1687                          const TargetLibraryInfo *TLI) {
1688   Type *CharPtrTy = B.getPtrTy();
1689   Type *IntTy = getIntTy(B, TLI);
1690   SmallVector<Value *, 8> Args{Dest, Fmt};
1691   llvm::append_range(Args, VariadicArgs);
1692   return emitLibCall(LibFunc_sprintf, IntTy,
1693                      {CharPtrTy, CharPtrTy}, Args, B, TLI,
1694                      /*IsVaArgs=*/true);
1695 }
1696 
1697 Value *llvm::emitStrCat(Value *Dest, Value *Src, IRBuilderBase &B,
1698                         const TargetLibraryInfo *TLI) {
1699   Type *CharPtrTy = B.getPtrTy();
1700   return emitLibCall(LibFunc_strcat, CharPtrTy,
1701                      {CharPtrTy, CharPtrTy},
1702                      {Dest, Src}, B, TLI);
1703 }
1704 
1705 Value *llvm::emitStrLCpy(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1706                          const TargetLibraryInfo *TLI) {
1707   Type *CharPtrTy = B.getPtrTy();
1708   Type *SizeTTy = getSizeTTy(B, TLI);
1709   return emitLibCall(LibFunc_strlcpy, SizeTTy,
1710                      {CharPtrTy, CharPtrTy, SizeTTy},
1711                      {Dest, Src, Size}, B, TLI);
1712 }
1713 
1714 Value *llvm::emitStrLCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1715                          const TargetLibraryInfo *TLI) {
1716   Type *CharPtrTy = B.getPtrTy();
1717   Type *SizeTTy = getSizeTTy(B, TLI);
1718   return emitLibCall(LibFunc_strlcat, SizeTTy,
1719                      {CharPtrTy, CharPtrTy, SizeTTy},
1720                      {Dest, Src, Size}, B, TLI);
1721 }
1722 
1723 Value *llvm::emitStrNCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1724                          const TargetLibraryInfo *TLI) {
1725   Type *CharPtrTy = B.getPtrTy();
1726   Type *SizeTTy = getSizeTTy(B, TLI);
1727   return emitLibCall(LibFunc_strncat, CharPtrTy,
1728                      {CharPtrTy, CharPtrTy, SizeTTy},
1729                      {Dest, Src, Size}, B, TLI);
1730 }
1731 
1732 Value *llvm::emitVSNPrintf(Value *Dest, Value *Size, Value *Fmt, Value *VAList,
1733                            IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1734   Type *CharPtrTy = B.getPtrTy();
1735   Type *IntTy = getIntTy(B, TLI);
1736   Type *SizeTTy = getSizeTTy(B, TLI);
1737   return emitLibCall(
1738       LibFunc_vsnprintf, IntTy,
1739       {CharPtrTy, SizeTTy, CharPtrTy, VAList->getType()},
1740       {Dest, Size, Fmt, VAList}, B, TLI);
1741 }
1742 
1743 Value *llvm::emitVSPrintf(Value *Dest, Value *Fmt, Value *VAList,
1744                           IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1745   Type *CharPtrTy = B.getPtrTy();
1746   Type *IntTy = getIntTy(B, TLI);
1747   return emitLibCall(LibFunc_vsprintf, IntTy,
1748                      {CharPtrTy, CharPtrTy, VAList->getType()},
1749                      {Dest, Fmt, VAList}, B, TLI);
1750 }
1751 
1752 /// Append a suffix to the function name according to the type of 'Op'.
1753 static void appendTypeSuffix(Value *Op, StringRef &Name,
1754                              SmallString<20> &NameBuffer) {
1755   if (!Op->getType()->isDoubleTy()) {
1756       NameBuffer += Name;
1757 
1758     if (Op->getType()->isFloatTy())
1759       NameBuffer += 'f';
1760     else
1761       NameBuffer += 'l';
1762 
1763     Name = NameBuffer;
1764   }
1765 }
1766 
1767 static Value *emitUnaryFloatFnCallHelper(Value *Op, LibFunc TheLibFunc,
1768                                          StringRef Name, IRBuilderBase &B,
1769                                          const AttributeList &Attrs,
1770                                          const TargetLibraryInfo *TLI) {
1771   assert((Name != "") && "Must specify Name to emitUnaryFloatFnCall");
1772 
1773   Module *M = B.GetInsertBlock()->getModule();
1774   FunctionCallee Callee = getOrInsertLibFunc(M, *TLI, TheLibFunc, Op->getType(),
1775                                              Op->getType());
1776   CallInst *CI = B.CreateCall(Callee, Op, Name);
1777 
1778   // The incoming attribute set may have come from a speculatable intrinsic, but
1779   // is being replaced with a library call which is not allowed to be
1780   // speculatable.
1781   CI->setAttributes(
1782       Attrs.removeFnAttribute(B.getContext(), Attribute::Speculatable));
1783   if (const Function *F =
1784           dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1785     CI->setCallingConv(F->getCallingConv());
1786 
1787   return CI;
1788 }
1789 
1790 Value *llvm::emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI,
1791                                   StringRef Name, IRBuilderBase &B,
1792                                   const AttributeList &Attrs) {
1793   SmallString<20> NameBuffer;
1794   appendTypeSuffix(Op, Name, NameBuffer);
1795 
1796   LibFunc TheLibFunc;
1797   TLI->getLibFunc(Name, TheLibFunc);
1798 
1799   return emitUnaryFloatFnCallHelper(Op, TheLibFunc, Name, B, Attrs, TLI);
1800 }
1801 
1802 Value *llvm::emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI,
1803                                   LibFunc DoubleFn, LibFunc FloatFn,
1804                                   LibFunc LongDoubleFn, IRBuilderBase &B,
1805                                   const AttributeList &Attrs) {
1806   // Get the name of the function according to TLI.
1807   Module *M = B.GetInsertBlock()->getModule();
1808   LibFunc TheLibFunc;
1809   StringRef Name = getFloatFn(M, TLI, Op->getType(), DoubleFn, FloatFn,
1810                               LongDoubleFn, TheLibFunc);
1811 
1812   return emitUnaryFloatFnCallHelper(Op, TheLibFunc, Name, B, Attrs, TLI);
1813 }
1814 
1815 static Value *emitBinaryFloatFnCallHelper(Value *Op1, Value *Op2,
1816                                           LibFunc TheLibFunc,
1817                                           StringRef Name, IRBuilderBase &B,
1818                                           const AttributeList &Attrs,
1819                                           const TargetLibraryInfo *TLI) {
1820   assert((Name != "") && "Must specify Name to emitBinaryFloatFnCall");
1821 
1822   Module *M = B.GetInsertBlock()->getModule();
1823   FunctionCallee Callee = getOrInsertLibFunc(M, *TLI, TheLibFunc, Op1->getType(),
1824                                              Op1->getType(), Op2->getType());
1825   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
1826   CallInst *CI = B.CreateCall(Callee, { Op1, Op2 }, Name);
1827 
1828   // The incoming attribute set may have come from a speculatable intrinsic, but
1829   // is being replaced with a library call which is not allowed to be
1830   // speculatable.
1831   CI->setAttributes(
1832       Attrs.removeFnAttribute(B.getContext(), Attribute::Speculatable));
1833   if (const Function *F =
1834           dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1835     CI->setCallingConv(F->getCallingConv());
1836 
1837   return CI;
1838 }
1839 
1840 Value *llvm::emitBinaryFloatFnCall(Value *Op1, Value *Op2,
1841                                    const TargetLibraryInfo *TLI,
1842                                    StringRef Name, IRBuilderBase &B,
1843                                    const AttributeList &Attrs) {
1844   assert((Name != "") && "Must specify Name to emitBinaryFloatFnCall");
1845 
1846   SmallString<20> NameBuffer;
1847   appendTypeSuffix(Op1, Name, NameBuffer);
1848 
1849   LibFunc TheLibFunc;
1850   TLI->getLibFunc(Name, TheLibFunc);
1851 
1852   return emitBinaryFloatFnCallHelper(Op1, Op2, TheLibFunc, Name, B, Attrs, TLI);
1853 }
1854 
1855 Value *llvm::emitBinaryFloatFnCall(Value *Op1, Value *Op2,
1856                                    const TargetLibraryInfo *TLI,
1857                                    LibFunc DoubleFn, LibFunc FloatFn,
1858                                    LibFunc LongDoubleFn, IRBuilderBase &B,
1859                                    const AttributeList &Attrs) {
1860   // Get the name of the function according to TLI.
1861   Module *M = B.GetInsertBlock()->getModule();
1862   LibFunc TheLibFunc;
1863   StringRef Name = getFloatFn(M, TLI, Op1->getType(), DoubleFn, FloatFn,
1864                               LongDoubleFn, TheLibFunc);
1865 
1866   return emitBinaryFloatFnCallHelper(Op1, Op2, TheLibFunc, Name, B, Attrs, TLI);
1867 }
1868 
1869 // Emit a call to putchar(int) with Char as the argument.  Char must have
1870 // the same precision as int, which need not be 32 bits.
1871 Value *llvm::emitPutChar(Value *Char, IRBuilderBase &B,
1872                          const TargetLibraryInfo *TLI) {
1873   Module *M = B.GetInsertBlock()->getModule();
1874   if (!isLibFuncEmittable(M, TLI, LibFunc_putchar))
1875     return nullptr;
1876 
1877   Type *IntTy = getIntTy(B, TLI);
1878   StringRef PutCharName = TLI->getName(LibFunc_putchar);
1879   FunctionCallee PutChar = getOrInsertLibFunc(M, *TLI, LibFunc_putchar,
1880                                               IntTy, IntTy);
1881   inferNonMandatoryLibFuncAttrs(M, PutCharName, *TLI);
1882   CallInst *CI = B.CreateCall(PutChar, Char, PutCharName);
1883 
1884   if (const Function *F =
1885           dyn_cast<Function>(PutChar.getCallee()->stripPointerCasts()))
1886     CI->setCallingConv(F->getCallingConv());
1887   return CI;
1888 }
1889 
1890 Value *llvm::emitPutS(Value *Str, IRBuilderBase &B,
1891                       const TargetLibraryInfo *TLI) {
1892   Module *M = B.GetInsertBlock()->getModule();
1893   if (!isLibFuncEmittable(M, TLI, LibFunc_puts))
1894     return nullptr;
1895 
1896   Type *IntTy = getIntTy(B, TLI);
1897   StringRef PutsName = TLI->getName(LibFunc_puts);
1898   FunctionCallee PutS = getOrInsertLibFunc(M, *TLI, LibFunc_puts, IntTy,
1899                                            B.getPtrTy());
1900   inferNonMandatoryLibFuncAttrs(M, PutsName, *TLI);
1901   CallInst *CI = B.CreateCall(PutS, Str, PutsName);
1902   if (const Function *F =
1903           dyn_cast<Function>(PutS.getCallee()->stripPointerCasts()))
1904     CI->setCallingConv(F->getCallingConv());
1905   return CI;
1906 }
1907 
1908 Value *llvm::emitFPutC(Value *Char, Value *File, IRBuilderBase &B,
1909                        const TargetLibraryInfo *TLI) {
1910   Module *M = B.GetInsertBlock()->getModule();
1911   if (!isLibFuncEmittable(M, TLI, LibFunc_fputc))
1912     return nullptr;
1913 
1914   Type *IntTy = getIntTy(B, TLI);
1915   StringRef FPutcName = TLI->getName(LibFunc_fputc);
1916   FunctionCallee F = getOrInsertLibFunc(M, *TLI, LibFunc_fputc, IntTy,
1917                                         IntTy, File->getType());
1918   if (File->getType()->isPointerTy())
1919     inferNonMandatoryLibFuncAttrs(M, FPutcName, *TLI);
1920   CallInst *CI = B.CreateCall(F, {Char, File}, FPutcName);
1921 
1922   if (const Function *Fn =
1923           dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1924     CI->setCallingConv(Fn->getCallingConv());
1925   return CI;
1926 }
1927 
1928 Value *llvm::emitFPutS(Value *Str, Value *File, IRBuilderBase &B,
1929                        const TargetLibraryInfo *TLI) {
1930   Module *M = B.GetInsertBlock()->getModule();
1931   if (!isLibFuncEmittable(M, TLI, LibFunc_fputs))
1932     return nullptr;
1933 
1934   Type *IntTy = getIntTy(B, TLI);
1935   StringRef FPutsName = TLI->getName(LibFunc_fputs);
1936   FunctionCallee F = getOrInsertLibFunc(M, *TLI, LibFunc_fputs, IntTy,
1937                                         B.getPtrTy(), File->getType());
1938   if (File->getType()->isPointerTy())
1939     inferNonMandatoryLibFuncAttrs(M, FPutsName, *TLI);
1940   CallInst *CI = B.CreateCall(F, {Str, File}, FPutsName);
1941 
1942   if (const Function *Fn =
1943           dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1944     CI->setCallingConv(Fn->getCallingConv());
1945   return CI;
1946 }
1947 
1948 Value *llvm::emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilderBase &B,
1949                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
1950   Module *M = B.GetInsertBlock()->getModule();
1951   if (!isLibFuncEmittable(M, TLI, LibFunc_fwrite))
1952     return nullptr;
1953 
1954   Type *SizeTTy = getSizeTTy(B, TLI);
1955   StringRef FWriteName = TLI->getName(LibFunc_fwrite);
1956   FunctionCallee F = getOrInsertLibFunc(M, *TLI, LibFunc_fwrite,
1957                                         SizeTTy, B.getPtrTy(), SizeTTy,
1958                                         SizeTTy, File->getType());
1959 
1960   if (File->getType()->isPointerTy())
1961     inferNonMandatoryLibFuncAttrs(M, FWriteName, *TLI);
1962   CallInst *CI =
1963       B.CreateCall(F, {Ptr, Size,
1964                        ConstantInt::get(SizeTTy, 1), File});
1965 
1966   if (const Function *Fn =
1967           dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1968     CI->setCallingConv(Fn->getCallingConv());
1969   return CI;
1970 }
1971 
1972 Value *llvm::emitMalloc(Value *Num, IRBuilderBase &B, const DataLayout &DL,
1973                         const TargetLibraryInfo *TLI) {
1974   Module *M = B.GetInsertBlock()->getModule();
1975   if (!isLibFuncEmittable(M, TLI, LibFunc_malloc))
1976     return nullptr;
1977 
1978   StringRef MallocName = TLI->getName(LibFunc_malloc);
1979   Type *SizeTTy = getSizeTTy(B, TLI);
1980   FunctionCallee Malloc = getOrInsertLibFunc(M, *TLI, LibFunc_malloc,
1981                                              B.getPtrTy(), SizeTTy);
1982   inferNonMandatoryLibFuncAttrs(M, MallocName, *TLI);
1983   CallInst *CI = B.CreateCall(Malloc, Num, MallocName);
1984 
1985   if (const Function *F =
1986           dyn_cast<Function>(Malloc.getCallee()->stripPointerCasts()))
1987     CI->setCallingConv(F->getCallingConv());
1988 
1989   return CI;
1990 }
1991 
1992 Value *llvm::emitCalloc(Value *Num, Value *Size, IRBuilderBase &B,
1993                         const TargetLibraryInfo &TLI, unsigned AddrSpace) {
1994   Module *M = B.GetInsertBlock()->getModule();
1995   if (!isLibFuncEmittable(M, &TLI, LibFunc_calloc))
1996     return nullptr;
1997 
1998   StringRef CallocName = TLI.getName(LibFunc_calloc);
1999   Type *SizeTTy = getSizeTTy(B, &TLI);
2000   FunctionCallee Calloc = getOrInsertLibFunc(
2001       M, TLI, LibFunc_calloc, B.getPtrTy(AddrSpace), SizeTTy, SizeTTy);
2002   inferNonMandatoryLibFuncAttrs(M, CallocName, TLI);
2003   CallInst *CI = B.CreateCall(Calloc, {Num, Size}, CallocName);
2004 
2005   if (const auto *F =
2006           dyn_cast<Function>(Calloc.getCallee()->stripPointerCasts()))
2007     CI->setCallingConv(F->getCallingConv());
2008 
2009   return CI;
2010 }
2011 
2012 Value *llvm::emitHotColdSizeReturningNew(Value *Num, IRBuilderBase &B,
2013                                          const TargetLibraryInfo *TLI,
2014                                          LibFunc SizeFeedbackNewFunc,
2015                                          uint8_t HotCold) {
2016   Module *M = B.GetInsertBlock()->getModule();
2017   if (!isLibFuncEmittable(M, TLI, SizeFeedbackNewFunc))
2018     return nullptr;
2019 
2020   StringRef Name = TLI->getName(SizeFeedbackNewFunc);
2021 
2022   // __sized_ptr_t struct return type { void*, size_t }
2023   StructType *SizedPtrT =
2024       StructType::get(M->getContext(), {B.getPtrTy(), Num->getType()});
2025   FunctionCallee Func =
2026       M->getOrInsertFunction(Name, SizedPtrT, Num->getType(), B.getInt8Ty());
2027   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2028   CallInst *CI = B.CreateCall(Func, {Num, B.getInt8(HotCold)}, "sized_ptr");
2029 
2030   if (const Function *F = dyn_cast<Function>(Func.getCallee()))
2031     CI->setCallingConv(F->getCallingConv());
2032 
2033   return CI;
2034 }
2035 
2036 Value *llvm::emitHotColdSizeReturningNewAligned(Value *Num, Value *Align,
2037                                                 IRBuilderBase &B,
2038                                                 const TargetLibraryInfo *TLI,
2039                                                 LibFunc SizeFeedbackNewFunc,
2040                                                 uint8_t HotCold) {
2041   Module *M = B.GetInsertBlock()->getModule();
2042   if (!isLibFuncEmittable(M, TLI, SizeFeedbackNewFunc))
2043     return nullptr;
2044 
2045   StringRef Name = TLI->getName(SizeFeedbackNewFunc);
2046 
2047   // __sized_ptr_t struct return type { void*, size_t }
2048   StructType *SizedPtrT =
2049       StructType::get(M->getContext(), {B.getPtrTy(), Num->getType()});
2050   FunctionCallee Func = M->getOrInsertFunction(Name, SizedPtrT, Num->getType(),
2051                                                Align->getType(), B.getInt8Ty());
2052   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2053   CallInst *CI =
2054       B.CreateCall(Func, {Num, Align, B.getInt8(HotCold)}, "sized_ptr");
2055 
2056   if (const Function *F = dyn_cast<Function>(Func.getCallee()))
2057     CI->setCallingConv(F->getCallingConv());
2058 
2059   return CI;
2060 }
2061 
2062 Value *llvm::emitHotColdNew(Value *Num, IRBuilderBase &B,
2063                             const TargetLibraryInfo *TLI, LibFunc NewFunc,
2064                             uint8_t HotCold) {
2065   Module *M = B.GetInsertBlock()->getModule();
2066   if (!isLibFuncEmittable(M, TLI, NewFunc))
2067     return nullptr;
2068 
2069   StringRef Name = TLI->getName(NewFunc);
2070   FunctionCallee Func = M->getOrInsertFunction(Name, B.getPtrTy(),
2071                                                Num->getType(), B.getInt8Ty());
2072   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2073   CallInst *CI = B.CreateCall(Func, {Num, B.getInt8(HotCold)}, Name);
2074 
2075   if (const Function *F =
2076           dyn_cast<Function>(Func.getCallee()->stripPointerCasts()))
2077     CI->setCallingConv(F->getCallingConv());
2078 
2079   return CI;
2080 }
2081 
2082 Value *llvm::emitHotColdNewNoThrow(Value *Num, Value *NoThrow, IRBuilderBase &B,
2083                                    const TargetLibraryInfo *TLI,
2084                                    LibFunc NewFunc, uint8_t HotCold) {
2085   Module *M = B.GetInsertBlock()->getModule();
2086   if (!isLibFuncEmittable(M, TLI, NewFunc))
2087     return nullptr;
2088 
2089   StringRef Name = TLI->getName(NewFunc);
2090   FunctionCallee Func =
2091       M->getOrInsertFunction(Name, B.getPtrTy(), Num->getType(),
2092                              NoThrow->getType(), B.getInt8Ty());
2093   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2094   CallInst *CI = B.CreateCall(Func, {Num, NoThrow, B.getInt8(HotCold)}, Name);
2095 
2096   if (const Function *F =
2097           dyn_cast<Function>(Func.getCallee()->stripPointerCasts()))
2098     CI->setCallingConv(F->getCallingConv());
2099 
2100   return CI;
2101 }
2102 
2103 Value *llvm::emitHotColdNewAligned(Value *Num, Value *Align, IRBuilderBase &B,
2104                                    const TargetLibraryInfo *TLI,
2105                                    LibFunc NewFunc, uint8_t HotCold) {
2106   Module *M = B.GetInsertBlock()->getModule();
2107   if (!isLibFuncEmittable(M, TLI, NewFunc))
2108     return nullptr;
2109 
2110   StringRef Name = TLI->getName(NewFunc);
2111   FunctionCallee Func = M->getOrInsertFunction(
2112       Name, B.getPtrTy(), Num->getType(), Align->getType(), B.getInt8Ty());
2113   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2114   CallInst *CI = B.CreateCall(Func, {Num, Align, B.getInt8(HotCold)}, Name);
2115 
2116   if (const Function *F =
2117           dyn_cast<Function>(Func.getCallee()->stripPointerCasts()))
2118     CI->setCallingConv(F->getCallingConv());
2119 
2120   return CI;
2121 }
2122 
2123 Value *llvm::emitHotColdNewAlignedNoThrow(Value *Num, Value *Align,
2124                                           Value *NoThrow, IRBuilderBase &B,
2125                                           const TargetLibraryInfo *TLI,
2126                                           LibFunc NewFunc, uint8_t HotCold) {
2127   Module *M = B.GetInsertBlock()->getModule();
2128   if (!isLibFuncEmittable(M, TLI, NewFunc))
2129     return nullptr;
2130 
2131   StringRef Name = TLI->getName(NewFunc);
2132   FunctionCallee Func = M->getOrInsertFunction(
2133       Name, B.getPtrTy(), Num->getType(), Align->getType(),
2134       NoThrow->getType(), B.getInt8Ty());
2135   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2136   CallInst *CI =
2137       B.CreateCall(Func, {Num, Align, NoThrow, B.getInt8(HotCold)}, Name);
2138 
2139   if (const Function *F =
2140           dyn_cast<Function>(Func.getCallee()->stripPointerCasts()))
2141     CI->setCallingConv(F->getCallingConv());
2142 
2143   return CI;
2144 }
2145