xref: /llvm-project/llvm/lib/Transforms/Utils/BuildLibCalls.cpp (revision 7e877fc0ac3492a195f2ca587837db79e3729fcc)
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_hypot:
1219   case LibFunc_hypotf:
1220   case LibFunc_hypotl:
1221   case LibFunc_isascii:
1222   case LibFunc_isdigit:
1223   case LibFunc_labs:
1224   case LibFunc_llabs:
1225   case LibFunc_log:
1226   case LibFunc_log10:
1227   case LibFunc_log10f:
1228   case LibFunc_log10l:
1229   case LibFunc_log1p:
1230   case LibFunc_log1pf:
1231   case LibFunc_log1pl:
1232   case LibFunc_log2:
1233   case LibFunc_log2f:
1234   case LibFunc_log2l:
1235   case LibFunc_logb:
1236   case LibFunc_logbf:
1237   case LibFunc_logbl:
1238   case LibFunc_ilogb:
1239   case LibFunc_ilogbf:
1240   case LibFunc_ilogbl:
1241   case LibFunc_logf:
1242   case LibFunc_logl:
1243   case LibFunc_nearbyint:
1244   case LibFunc_nearbyintf:
1245   case LibFunc_nearbyintl:
1246   case LibFunc_pow:
1247   case LibFunc_powf:
1248   case LibFunc_powl:
1249   case LibFunc_remainder:
1250   case LibFunc_remainderf:
1251   case LibFunc_remainderl:
1252   case LibFunc_rint:
1253   case LibFunc_rintf:
1254   case LibFunc_rintl:
1255   case LibFunc_round:
1256   case LibFunc_roundf:
1257   case LibFunc_roundl:
1258   case LibFunc_scalbln:
1259   case LibFunc_scalblnf:
1260   case LibFunc_scalblnl:
1261   case LibFunc_scalbn:
1262   case LibFunc_scalbnf:
1263   case LibFunc_scalbnl:
1264   case LibFunc_sin:
1265   case LibFunc_sincospif_stret:
1266   case LibFunc_sinf:
1267   case LibFunc_sinh:
1268   case LibFunc_sinhf:
1269   case LibFunc_sinhl:
1270   case LibFunc_sinl:
1271   case LibFunc_sinpi:
1272   case LibFunc_sinpif:
1273   case LibFunc_sqrt:
1274   case LibFunc_sqrtf:
1275   case LibFunc_sqrtl:
1276   case LibFunc_tan:
1277   case LibFunc_tanf:
1278   case LibFunc_tanh:
1279   case LibFunc_tanhf:
1280   case LibFunc_tanhl:
1281   case LibFunc_tanl:
1282   case LibFunc_toascii:
1283   case LibFunc_trunc:
1284   case LibFunc_truncf:
1285   case LibFunc_truncl:
1286     Changed |= setDoesNotThrow(F);
1287     Changed |= setDoesNotFreeMemory(F);
1288     Changed |= setOnlyWritesMemory(F);
1289     Changed |= setWillReturn(F);
1290     break;
1291   case LibFunc_sincos:
1292   case LibFunc_sincosf:
1293   case LibFunc_sincosl:
1294     Changed |= setDoesNotThrow(F);
1295     Changed |= setDoesNotFreeMemory(F);
1296     Changed |= setOnlyWritesMemory(F);
1297     Changed |= setOnlyWritesMemory(F, 1);
1298     Changed |= setOnlyWritesMemory(F, 2);
1299     Changed |= setDoesNotCapture(F, 1);
1300     Changed |= setDoesNotCapture(F, 2);
1301     Changed |= setWillReturn(F);
1302     break;
1303   default:
1304     // FIXME: It'd be really nice to cover all the library functions we're
1305     // aware of here.
1306     break;
1307   }
1308   // We have to do this step after AllocKind has been inferred on functions so
1309   // we can reliably identify free-like and realloc-like functions.
1310   if (!isLibFreeFunction(&F, TheLibFunc) && !isReallocLikeFn(&F))
1311     Changed |= setDoesNotFreeMemory(F);
1312   return Changed;
1313 }
1314 
1315 static void setArgExtAttr(Function &F, unsigned ArgNo,
1316                           const TargetLibraryInfo &TLI, bool Signed = true) {
1317   Attribute::AttrKind ExtAttr = TLI.getExtAttrForI32Param(Signed);
1318   if (ExtAttr != Attribute::None && !F.hasParamAttribute(ArgNo, ExtAttr))
1319     F.addParamAttr(ArgNo, ExtAttr);
1320 }
1321 
1322 static void setRetExtAttr(Function &F,
1323                           const TargetLibraryInfo &TLI, bool Signed = true) {
1324   Attribute::AttrKind ExtAttr = TLI.getExtAttrForI32Return(Signed);
1325   if (ExtAttr != Attribute::None && !F.hasRetAttribute(ExtAttr))
1326     F.addRetAttr(ExtAttr);
1327 }
1328 
1329 // Modeled after X86TargetLowering::markLibCallAttributes.
1330 void llvm::markRegisterParameterAttributes(Function *F) {
1331   if (!F->arg_size() || F->isVarArg())
1332     return;
1333 
1334   const CallingConv::ID CC = F->getCallingConv();
1335   if (CC != CallingConv::C && CC != CallingConv::X86_StdCall)
1336     return;
1337 
1338   const Module *M = F->getParent();
1339   unsigned N = M->getNumberRegisterParameters();
1340   if (!N)
1341     return;
1342 
1343   const DataLayout &DL = M->getDataLayout();
1344 
1345   for (Argument &A : F->args()) {
1346     Type *T = A.getType();
1347     if (!T->isIntOrPtrTy())
1348       continue;
1349 
1350     const TypeSize &TS = DL.getTypeAllocSize(T);
1351     if (TS > 8)
1352       continue;
1353 
1354     assert(TS <= 4 && "Need to account for parameters larger than word size");
1355     const unsigned NumRegs = TS > 4 ? 2 : 1;
1356     if (N < NumRegs)
1357       return;
1358 
1359     N -= NumRegs;
1360     F->addParamAttr(A.getArgNo(), Attribute::InReg);
1361   }
1362 }
1363 
1364 FunctionCallee llvm::getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI,
1365                                         LibFunc TheLibFunc, FunctionType *T,
1366                                         AttributeList AttributeList) {
1367   assert(TLI.has(TheLibFunc) &&
1368          "Creating call to non-existing library function.");
1369   StringRef Name = TLI.getName(TheLibFunc);
1370   FunctionCallee C = M->getOrInsertFunction(Name, T, AttributeList);
1371 
1372   // Make sure any mandatory argument attributes are added.
1373 
1374   // Any outgoing i32 argument should be handled with setArgExtAttr() which
1375   // will add an extension attribute if the target ABI requires it. Adding
1376   // argument extensions is typically done by the front end but when an
1377   // optimizer is building a library call on its own it has to take care of
1378   // this. Each such generated function must be handled here with sign or
1379   // zero extensions as needed.  F is retreived with cast<> because we demand
1380   // of the caller to have called isLibFuncEmittable() first.
1381   Function *F = cast<Function>(C.getCallee());
1382   assert(F->getFunctionType() == T && "Function type does not match.");
1383   switch (TheLibFunc) {
1384   case LibFunc_fputc:
1385   case LibFunc_putchar:
1386     setArgExtAttr(*F, 0, TLI);
1387     break;
1388   case LibFunc_ldexp:
1389   case LibFunc_ldexpf:
1390   case LibFunc_ldexpl:
1391   case LibFunc_memchr:
1392   case LibFunc_memrchr:
1393   case LibFunc_strchr:
1394     setArgExtAttr(*F, 1, TLI);
1395     break;
1396   case LibFunc_memccpy:
1397     setArgExtAttr(*F, 2, TLI);
1398     break;
1399 
1400     // These are functions that are known to not need any argument extension
1401     // on any target: A size_t argument (which may be an i32 on some targets)
1402     // should not trigger the assert below.
1403   case LibFunc_bcmp:
1404     setRetExtAttr(*F, TLI);
1405     break;
1406   case LibFunc_calloc:
1407   case LibFunc_fwrite:
1408   case LibFunc_malloc:
1409   case LibFunc_memcmp:
1410   case LibFunc_memcpy_chk:
1411   case LibFunc_mempcpy:
1412   case LibFunc_memset_pattern16:
1413   case LibFunc_snprintf:
1414   case LibFunc_stpncpy:
1415   case LibFunc_strlcat:
1416   case LibFunc_strlcpy:
1417   case LibFunc_strncat:
1418   case LibFunc_strncmp:
1419   case LibFunc_strncpy:
1420   case LibFunc_vsnprintf:
1421     break;
1422 
1423   default:
1424 #ifndef NDEBUG
1425     for (unsigned i = 0; i < T->getNumParams(); i++)
1426       assert(!isa<IntegerType>(T->getParamType(i)) &&
1427              "Unhandled integer argument.");
1428 #endif
1429     break;
1430   }
1431 
1432   markRegisterParameterAttributes(F);
1433 
1434   return C;
1435 }
1436 
1437 FunctionCallee llvm::getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI,
1438                                         LibFunc TheLibFunc, FunctionType *T) {
1439   return getOrInsertLibFunc(M, TLI, TheLibFunc, T, AttributeList());
1440 }
1441 
1442 bool llvm::isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI,
1443                               LibFunc TheLibFunc) {
1444   StringRef FuncName = TLI->getName(TheLibFunc);
1445   if (!TLI->has(TheLibFunc))
1446     return false;
1447 
1448   // Check if the Module already has a GlobalValue with the same name, in
1449   // which case it must be a Function with the expected type.
1450   if (GlobalValue *GV = M->getNamedValue(FuncName)) {
1451     if (auto *F = dyn_cast<Function>(GV))
1452       return TLI->isValidProtoForLibFunc(*F->getFunctionType(), TheLibFunc, *M);
1453     return false;
1454   }
1455 
1456   return true;
1457 }
1458 
1459 bool llvm::isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI,
1460                               StringRef Name) {
1461   LibFunc TheLibFunc;
1462   return TLI->getLibFunc(Name, TheLibFunc) &&
1463          isLibFuncEmittable(M, TLI, TheLibFunc);
1464 }
1465 
1466 bool llvm::hasFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty,
1467                       LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn) {
1468   switch (Ty->getTypeID()) {
1469   case Type::HalfTyID:
1470     return false;
1471   case Type::FloatTyID:
1472     return isLibFuncEmittable(M, TLI, FloatFn);
1473   case Type::DoubleTyID:
1474     return isLibFuncEmittable(M, TLI, DoubleFn);
1475   default:
1476     return isLibFuncEmittable(M, TLI, LongDoubleFn);
1477   }
1478 }
1479 
1480 StringRef llvm::getFloatFn(const Module *M, const TargetLibraryInfo *TLI,
1481                            Type *Ty, LibFunc DoubleFn, LibFunc FloatFn,
1482                            LibFunc LongDoubleFn, LibFunc &TheLibFunc) {
1483   assert(hasFloatFn(M, TLI, Ty, DoubleFn, FloatFn, LongDoubleFn) &&
1484          "Cannot get name for unavailable function!");
1485 
1486   switch (Ty->getTypeID()) {
1487   case Type::HalfTyID:
1488     llvm_unreachable("No name for HalfTy!");
1489   case Type::FloatTyID:
1490     TheLibFunc = FloatFn;
1491     return TLI->getName(FloatFn);
1492   case Type::DoubleTyID:
1493     TheLibFunc = DoubleFn;
1494     return TLI->getName(DoubleFn);
1495   default:
1496     TheLibFunc = LongDoubleFn;
1497     return TLI->getName(LongDoubleFn);
1498   }
1499 }
1500 
1501 //- Emit LibCalls ------------------------------------------------------------//
1502 
1503 static IntegerType *getIntTy(IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1504   return B.getIntNTy(TLI->getIntSize());
1505 }
1506 
1507 static IntegerType *getSizeTTy(IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1508   const Module *M = B.GetInsertBlock()->getModule();
1509   return B.getIntNTy(TLI->getSizeTSize(*M));
1510 }
1511 
1512 static Value *emitLibCall(LibFunc TheLibFunc, Type *ReturnType,
1513                           ArrayRef<Type *> ParamTypes,
1514                           ArrayRef<Value *> Operands, IRBuilderBase &B,
1515                           const TargetLibraryInfo *TLI,
1516                           bool IsVaArgs = false) {
1517   Module *M = B.GetInsertBlock()->getModule();
1518   if (!isLibFuncEmittable(M, TLI, TheLibFunc))
1519     return nullptr;
1520 
1521   StringRef FuncName = TLI->getName(TheLibFunc);
1522   FunctionType *FuncType = FunctionType::get(ReturnType, ParamTypes, IsVaArgs);
1523   FunctionCallee Callee = getOrInsertLibFunc(M, *TLI, TheLibFunc, FuncType);
1524   inferNonMandatoryLibFuncAttrs(M, FuncName, *TLI);
1525   CallInst *CI = B.CreateCall(Callee, Operands, FuncName);
1526   if (const Function *F =
1527           dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1528     CI->setCallingConv(F->getCallingConv());
1529   return CI;
1530 }
1531 
1532 Value *llvm::emitStrLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL,
1533                         const TargetLibraryInfo *TLI) {
1534   Type *CharPtrTy = B.getPtrTy();
1535   Type *SizeTTy = getSizeTTy(B, TLI);
1536   return emitLibCall(LibFunc_strlen, SizeTTy, CharPtrTy, Ptr, B, TLI);
1537 }
1538 
1539 Value *llvm::emitStrDup(Value *Ptr, IRBuilderBase &B,
1540                         const TargetLibraryInfo *TLI) {
1541   Type *CharPtrTy = B.getPtrTy();
1542   return emitLibCall(LibFunc_strdup, CharPtrTy, CharPtrTy, Ptr, B, TLI);
1543 }
1544 
1545 Value *llvm::emitStrChr(Value *Ptr, char C, IRBuilderBase &B,
1546                         const TargetLibraryInfo *TLI) {
1547   Type *CharPtrTy = B.getPtrTy();
1548   Type *IntTy = getIntTy(B, TLI);
1549   return emitLibCall(LibFunc_strchr, CharPtrTy, {CharPtrTy, IntTy},
1550                      {Ptr, ConstantInt::get(IntTy, C)}, B, TLI);
1551 }
1552 
1553 Value *llvm::emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1554                          const DataLayout &DL, const TargetLibraryInfo *TLI) {
1555   Type *CharPtrTy = B.getPtrTy();
1556   Type *IntTy = getIntTy(B, TLI);
1557   Type *SizeTTy = getSizeTTy(B, TLI);
1558   return emitLibCall(
1559       LibFunc_strncmp, IntTy,
1560       {CharPtrTy, CharPtrTy, SizeTTy},
1561       {Ptr1, Ptr2, Len}, B, TLI);
1562 }
1563 
1564 Value *llvm::emitStrCpy(Value *Dst, Value *Src, IRBuilderBase &B,
1565                         const TargetLibraryInfo *TLI) {
1566   Type *CharPtrTy = Dst->getType();
1567   return emitLibCall(LibFunc_strcpy, CharPtrTy, {CharPtrTy, CharPtrTy},
1568                      {Dst, Src}, B, TLI);
1569 }
1570 
1571 Value *llvm::emitStpCpy(Value *Dst, Value *Src, IRBuilderBase &B,
1572                         const TargetLibraryInfo *TLI) {
1573   Type *CharPtrTy = B.getPtrTy();
1574   return emitLibCall(LibFunc_stpcpy, CharPtrTy, {CharPtrTy, CharPtrTy},
1575                      {Dst, Src}, B, TLI);
1576 }
1577 
1578 Value *llvm::emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1579                          const TargetLibraryInfo *TLI) {
1580   Type *CharPtrTy = B.getPtrTy();
1581   Type *SizeTTy = getSizeTTy(B, TLI);
1582   return emitLibCall(LibFunc_strncpy, CharPtrTy, {CharPtrTy, CharPtrTy, SizeTTy},
1583                      {Dst, Src, Len}, B, TLI);
1584 }
1585 
1586 Value *llvm::emitStpNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1587                          const TargetLibraryInfo *TLI) {
1588   Type *CharPtrTy = B.getPtrTy();
1589   Type *SizeTTy = getSizeTTy(B, TLI);
1590   return emitLibCall(LibFunc_stpncpy, CharPtrTy, {CharPtrTy, CharPtrTy, SizeTTy},
1591                      {Dst, Src, Len}, B, TLI);
1592 }
1593 
1594 Value *llvm::emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize,
1595                            IRBuilderBase &B, const DataLayout &DL,
1596                            const TargetLibraryInfo *TLI) {
1597   Module *M = B.GetInsertBlock()->getModule();
1598   if (!isLibFuncEmittable(M, TLI, LibFunc_memcpy_chk))
1599     return nullptr;
1600 
1601   AttributeList AS;
1602   AS = AttributeList::get(M->getContext(), AttributeList::FunctionIndex,
1603                           Attribute::NoUnwind);
1604   Type *VoidPtrTy = B.getPtrTy();
1605   Type *SizeTTy = getSizeTTy(B, TLI);
1606   FunctionCallee MemCpy = getOrInsertLibFunc(M, *TLI, LibFunc_memcpy_chk,
1607       AttributeList::get(M->getContext(), AS), VoidPtrTy,
1608       VoidPtrTy, VoidPtrTy, SizeTTy, SizeTTy);
1609   CallInst *CI = B.CreateCall(MemCpy, {Dst, Src, Len, ObjSize});
1610   if (const Function *F =
1611           dyn_cast<Function>(MemCpy.getCallee()->stripPointerCasts()))
1612     CI->setCallingConv(F->getCallingConv());
1613   return CI;
1614 }
1615 
1616 Value *llvm::emitMemPCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1617                          const DataLayout &DL, const TargetLibraryInfo *TLI) {
1618   Type *VoidPtrTy = B.getPtrTy();
1619   Type *SizeTTy = getSizeTTy(B, TLI);
1620   return emitLibCall(LibFunc_mempcpy, VoidPtrTy,
1621                      {VoidPtrTy, VoidPtrTy, SizeTTy},
1622                      {Dst, Src, Len}, B, TLI);
1623 }
1624 
1625 Value *llvm::emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B,
1626                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
1627   Type *VoidPtrTy = B.getPtrTy();
1628   Type *IntTy = getIntTy(B, TLI);
1629   Type *SizeTTy = getSizeTTy(B, TLI);
1630   return emitLibCall(LibFunc_memchr, VoidPtrTy,
1631                      {VoidPtrTy, IntTy, SizeTTy},
1632                      {Ptr, Val, Len}, B, TLI);
1633 }
1634 
1635 Value *llvm::emitMemRChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B,
1636                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
1637   Type *VoidPtrTy = B.getPtrTy();
1638   Type *IntTy = getIntTy(B, TLI);
1639   Type *SizeTTy = getSizeTTy(B, TLI);
1640   return emitLibCall(LibFunc_memrchr, VoidPtrTy,
1641                      {VoidPtrTy, IntTy, SizeTTy},
1642                      {Ptr, Val, Len}, B, TLI);
1643 }
1644 
1645 Value *llvm::emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1646                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
1647   Type *VoidPtrTy = B.getPtrTy();
1648   Type *IntTy = getIntTy(B, TLI);
1649   Type *SizeTTy = getSizeTTy(B, TLI);
1650   return emitLibCall(LibFunc_memcmp, IntTy,
1651                      {VoidPtrTy, VoidPtrTy, SizeTTy},
1652                      {Ptr1, Ptr2, Len}, B, TLI);
1653 }
1654 
1655 Value *llvm::emitBCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1656                       const DataLayout &DL, const TargetLibraryInfo *TLI) {
1657   Type *VoidPtrTy = B.getPtrTy();
1658   Type *IntTy = getIntTy(B, TLI);
1659   Type *SizeTTy = getSizeTTy(B, TLI);
1660   return emitLibCall(LibFunc_bcmp, IntTy,
1661                      {VoidPtrTy, VoidPtrTy, SizeTTy},
1662                      {Ptr1, Ptr2, Len}, B, TLI);
1663 }
1664 
1665 Value *llvm::emitMemCCpy(Value *Ptr1, Value *Ptr2, Value *Val, Value *Len,
1666                          IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1667   Type *VoidPtrTy = B.getPtrTy();
1668   Type *IntTy = getIntTy(B, TLI);
1669   Type *SizeTTy = getSizeTTy(B, TLI);
1670   return emitLibCall(LibFunc_memccpy, VoidPtrTy,
1671                      {VoidPtrTy, VoidPtrTy, IntTy, SizeTTy},
1672                      {Ptr1, Ptr2, Val, Len}, B, TLI);
1673 }
1674 
1675 Value *llvm::emitSNPrintf(Value *Dest, Value *Size, Value *Fmt,
1676                           ArrayRef<Value *> VariadicArgs, IRBuilderBase &B,
1677                           const TargetLibraryInfo *TLI) {
1678   Type *CharPtrTy = B.getPtrTy();
1679   Type *IntTy = getIntTy(B, TLI);
1680   Type *SizeTTy = getSizeTTy(B, TLI);
1681   SmallVector<Value *, 8> Args{Dest, Size, Fmt};
1682   llvm::append_range(Args, VariadicArgs);
1683   return emitLibCall(LibFunc_snprintf, IntTy,
1684                      {CharPtrTy, SizeTTy, CharPtrTy},
1685                      Args, B, TLI, /*IsVaArgs=*/true);
1686 }
1687 
1688 Value *llvm::emitSPrintf(Value *Dest, Value *Fmt,
1689                          ArrayRef<Value *> VariadicArgs, IRBuilderBase &B,
1690                          const TargetLibraryInfo *TLI) {
1691   Type *CharPtrTy = B.getPtrTy();
1692   Type *IntTy = getIntTy(B, TLI);
1693   SmallVector<Value *, 8> Args{Dest, Fmt};
1694   llvm::append_range(Args, VariadicArgs);
1695   return emitLibCall(LibFunc_sprintf, IntTy,
1696                      {CharPtrTy, CharPtrTy}, Args, B, TLI,
1697                      /*IsVaArgs=*/true);
1698 }
1699 
1700 Value *llvm::emitStrCat(Value *Dest, Value *Src, IRBuilderBase &B,
1701                         const TargetLibraryInfo *TLI) {
1702   Type *CharPtrTy = B.getPtrTy();
1703   return emitLibCall(LibFunc_strcat, CharPtrTy,
1704                      {CharPtrTy, CharPtrTy},
1705                      {Dest, Src}, B, TLI);
1706 }
1707 
1708 Value *llvm::emitStrLCpy(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1709                          const TargetLibraryInfo *TLI) {
1710   Type *CharPtrTy = B.getPtrTy();
1711   Type *SizeTTy = getSizeTTy(B, TLI);
1712   return emitLibCall(LibFunc_strlcpy, SizeTTy,
1713                      {CharPtrTy, CharPtrTy, SizeTTy},
1714                      {Dest, Src, Size}, B, TLI);
1715 }
1716 
1717 Value *llvm::emitStrLCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1718                          const TargetLibraryInfo *TLI) {
1719   Type *CharPtrTy = B.getPtrTy();
1720   Type *SizeTTy = getSizeTTy(B, TLI);
1721   return emitLibCall(LibFunc_strlcat, SizeTTy,
1722                      {CharPtrTy, CharPtrTy, SizeTTy},
1723                      {Dest, Src, Size}, B, TLI);
1724 }
1725 
1726 Value *llvm::emitStrNCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1727                          const TargetLibraryInfo *TLI) {
1728   Type *CharPtrTy = B.getPtrTy();
1729   Type *SizeTTy = getSizeTTy(B, TLI);
1730   return emitLibCall(LibFunc_strncat, CharPtrTy,
1731                      {CharPtrTy, CharPtrTy, SizeTTy},
1732                      {Dest, Src, Size}, B, TLI);
1733 }
1734 
1735 Value *llvm::emitVSNPrintf(Value *Dest, Value *Size, Value *Fmt, Value *VAList,
1736                            IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1737   Type *CharPtrTy = B.getPtrTy();
1738   Type *IntTy = getIntTy(B, TLI);
1739   Type *SizeTTy = getSizeTTy(B, TLI);
1740   return emitLibCall(
1741       LibFunc_vsnprintf, IntTy,
1742       {CharPtrTy, SizeTTy, CharPtrTy, VAList->getType()},
1743       {Dest, Size, Fmt, VAList}, B, TLI);
1744 }
1745 
1746 Value *llvm::emitVSPrintf(Value *Dest, Value *Fmt, Value *VAList,
1747                           IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1748   Type *CharPtrTy = B.getPtrTy();
1749   Type *IntTy = getIntTy(B, TLI);
1750   return emitLibCall(LibFunc_vsprintf, IntTy,
1751                      {CharPtrTy, CharPtrTy, VAList->getType()},
1752                      {Dest, Fmt, VAList}, B, TLI);
1753 }
1754 
1755 /// Append a suffix to the function name according to the type of 'Op'.
1756 static void appendTypeSuffix(Value *Op, StringRef &Name,
1757                              SmallString<20> &NameBuffer) {
1758   if (!Op->getType()->isDoubleTy()) {
1759       NameBuffer += Name;
1760 
1761     if (Op->getType()->isFloatTy())
1762       NameBuffer += 'f';
1763     else
1764       NameBuffer += 'l';
1765 
1766     Name = NameBuffer;
1767   }
1768 }
1769 
1770 static Value *emitUnaryFloatFnCallHelper(Value *Op, LibFunc TheLibFunc,
1771                                          StringRef Name, IRBuilderBase &B,
1772                                          const AttributeList &Attrs,
1773                                          const TargetLibraryInfo *TLI) {
1774   assert((Name != "") && "Must specify Name to emitUnaryFloatFnCall");
1775 
1776   Module *M = B.GetInsertBlock()->getModule();
1777   FunctionCallee Callee = getOrInsertLibFunc(M, *TLI, TheLibFunc, Op->getType(),
1778                                              Op->getType());
1779   CallInst *CI = B.CreateCall(Callee, Op, Name);
1780 
1781   // The incoming attribute set may have come from a speculatable intrinsic, but
1782   // is being replaced with a library call which is not allowed to be
1783   // speculatable.
1784   CI->setAttributes(
1785       Attrs.removeFnAttribute(B.getContext(), Attribute::Speculatable));
1786   if (const Function *F =
1787           dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1788     CI->setCallingConv(F->getCallingConv());
1789 
1790   return CI;
1791 }
1792 
1793 Value *llvm::emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI,
1794                                   StringRef Name, IRBuilderBase &B,
1795                                   const AttributeList &Attrs) {
1796   SmallString<20> NameBuffer;
1797   appendTypeSuffix(Op, Name, NameBuffer);
1798 
1799   LibFunc TheLibFunc;
1800   TLI->getLibFunc(Name, TheLibFunc);
1801 
1802   return emitUnaryFloatFnCallHelper(Op, TheLibFunc, Name, B, Attrs, TLI);
1803 }
1804 
1805 Value *llvm::emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI,
1806                                   LibFunc DoubleFn, LibFunc FloatFn,
1807                                   LibFunc LongDoubleFn, IRBuilderBase &B,
1808                                   const AttributeList &Attrs) {
1809   // Get the name of the function according to TLI.
1810   Module *M = B.GetInsertBlock()->getModule();
1811   LibFunc TheLibFunc;
1812   StringRef Name = getFloatFn(M, TLI, Op->getType(), DoubleFn, FloatFn,
1813                               LongDoubleFn, TheLibFunc);
1814 
1815   return emitUnaryFloatFnCallHelper(Op, TheLibFunc, Name, B, Attrs, TLI);
1816 }
1817 
1818 static Value *emitBinaryFloatFnCallHelper(Value *Op1, Value *Op2,
1819                                           LibFunc TheLibFunc,
1820                                           StringRef Name, IRBuilderBase &B,
1821                                           const AttributeList &Attrs,
1822                                           const TargetLibraryInfo *TLI) {
1823   assert((Name != "") && "Must specify Name to emitBinaryFloatFnCall");
1824 
1825   Module *M = B.GetInsertBlock()->getModule();
1826   FunctionCallee Callee = getOrInsertLibFunc(M, *TLI, TheLibFunc, Op1->getType(),
1827                                              Op1->getType(), Op2->getType());
1828   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
1829   CallInst *CI = B.CreateCall(Callee, { Op1, Op2 }, Name);
1830 
1831   // The incoming attribute set may have come from a speculatable intrinsic, but
1832   // is being replaced with a library call which is not allowed to be
1833   // speculatable.
1834   CI->setAttributes(
1835       Attrs.removeFnAttribute(B.getContext(), Attribute::Speculatable));
1836   if (const Function *F =
1837           dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1838     CI->setCallingConv(F->getCallingConv());
1839 
1840   return CI;
1841 }
1842 
1843 Value *llvm::emitBinaryFloatFnCall(Value *Op1, Value *Op2,
1844                                    const TargetLibraryInfo *TLI,
1845                                    StringRef Name, IRBuilderBase &B,
1846                                    const AttributeList &Attrs) {
1847   assert((Name != "") && "Must specify Name to emitBinaryFloatFnCall");
1848 
1849   SmallString<20> NameBuffer;
1850   appendTypeSuffix(Op1, Name, NameBuffer);
1851 
1852   LibFunc TheLibFunc;
1853   TLI->getLibFunc(Name, TheLibFunc);
1854 
1855   return emitBinaryFloatFnCallHelper(Op1, Op2, TheLibFunc, Name, B, Attrs, TLI);
1856 }
1857 
1858 Value *llvm::emitBinaryFloatFnCall(Value *Op1, Value *Op2,
1859                                    const TargetLibraryInfo *TLI,
1860                                    LibFunc DoubleFn, LibFunc FloatFn,
1861                                    LibFunc LongDoubleFn, IRBuilderBase &B,
1862                                    const AttributeList &Attrs) {
1863   // Get the name of the function according to TLI.
1864   Module *M = B.GetInsertBlock()->getModule();
1865   LibFunc TheLibFunc;
1866   StringRef Name = getFloatFn(M, TLI, Op1->getType(), DoubleFn, FloatFn,
1867                               LongDoubleFn, TheLibFunc);
1868 
1869   return emitBinaryFloatFnCallHelper(Op1, Op2, TheLibFunc, Name, B, Attrs, TLI);
1870 }
1871 
1872 // Emit a call to putchar(int) with Char as the argument.  Char must have
1873 // the same precision as int, which need not be 32 bits.
1874 Value *llvm::emitPutChar(Value *Char, IRBuilderBase &B,
1875                          const TargetLibraryInfo *TLI) {
1876   Module *M = B.GetInsertBlock()->getModule();
1877   if (!isLibFuncEmittable(M, TLI, LibFunc_putchar))
1878     return nullptr;
1879 
1880   Type *IntTy = getIntTy(B, TLI);
1881   StringRef PutCharName = TLI->getName(LibFunc_putchar);
1882   FunctionCallee PutChar = getOrInsertLibFunc(M, *TLI, LibFunc_putchar,
1883                                               IntTy, IntTy);
1884   inferNonMandatoryLibFuncAttrs(M, PutCharName, *TLI);
1885   CallInst *CI = B.CreateCall(PutChar, Char, PutCharName);
1886 
1887   if (const Function *F =
1888           dyn_cast<Function>(PutChar.getCallee()->stripPointerCasts()))
1889     CI->setCallingConv(F->getCallingConv());
1890   return CI;
1891 }
1892 
1893 Value *llvm::emitPutS(Value *Str, IRBuilderBase &B,
1894                       const TargetLibraryInfo *TLI) {
1895   Module *M = B.GetInsertBlock()->getModule();
1896   if (!isLibFuncEmittable(M, TLI, LibFunc_puts))
1897     return nullptr;
1898 
1899   Type *IntTy = getIntTy(B, TLI);
1900   StringRef PutsName = TLI->getName(LibFunc_puts);
1901   FunctionCallee PutS = getOrInsertLibFunc(M, *TLI, LibFunc_puts, IntTy,
1902                                            B.getPtrTy());
1903   inferNonMandatoryLibFuncAttrs(M, PutsName, *TLI);
1904   CallInst *CI = B.CreateCall(PutS, Str, PutsName);
1905   if (const Function *F =
1906           dyn_cast<Function>(PutS.getCallee()->stripPointerCasts()))
1907     CI->setCallingConv(F->getCallingConv());
1908   return CI;
1909 }
1910 
1911 Value *llvm::emitFPutC(Value *Char, Value *File, IRBuilderBase &B,
1912                        const TargetLibraryInfo *TLI) {
1913   Module *M = B.GetInsertBlock()->getModule();
1914   if (!isLibFuncEmittable(M, TLI, LibFunc_fputc))
1915     return nullptr;
1916 
1917   Type *IntTy = getIntTy(B, TLI);
1918   StringRef FPutcName = TLI->getName(LibFunc_fputc);
1919   FunctionCallee F = getOrInsertLibFunc(M, *TLI, LibFunc_fputc, IntTy,
1920                                         IntTy, File->getType());
1921   if (File->getType()->isPointerTy())
1922     inferNonMandatoryLibFuncAttrs(M, FPutcName, *TLI);
1923   CallInst *CI = B.CreateCall(F, {Char, File}, FPutcName);
1924 
1925   if (const Function *Fn =
1926           dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1927     CI->setCallingConv(Fn->getCallingConv());
1928   return CI;
1929 }
1930 
1931 Value *llvm::emitFPutS(Value *Str, Value *File, IRBuilderBase &B,
1932                        const TargetLibraryInfo *TLI) {
1933   Module *M = B.GetInsertBlock()->getModule();
1934   if (!isLibFuncEmittable(M, TLI, LibFunc_fputs))
1935     return nullptr;
1936 
1937   Type *IntTy = getIntTy(B, TLI);
1938   StringRef FPutsName = TLI->getName(LibFunc_fputs);
1939   FunctionCallee F = getOrInsertLibFunc(M, *TLI, LibFunc_fputs, IntTy,
1940                                         B.getPtrTy(), File->getType());
1941   if (File->getType()->isPointerTy())
1942     inferNonMandatoryLibFuncAttrs(M, FPutsName, *TLI);
1943   CallInst *CI = B.CreateCall(F, {Str, File}, FPutsName);
1944 
1945   if (const Function *Fn =
1946           dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1947     CI->setCallingConv(Fn->getCallingConv());
1948   return CI;
1949 }
1950 
1951 Value *llvm::emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilderBase &B,
1952                         const DataLayout &DL, const TargetLibraryInfo *TLI) {
1953   Module *M = B.GetInsertBlock()->getModule();
1954   if (!isLibFuncEmittable(M, TLI, LibFunc_fwrite))
1955     return nullptr;
1956 
1957   Type *SizeTTy = getSizeTTy(B, TLI);
1958   StringRef FWriteName = TLI->getName(LibFunc_fwrite);
1959   FunctionCallee F = getOrInsertLibFunc(M, *TLI, LibFunc_fwrite,
1960                                         SizeTTy, B.getPtrTy(), SizeTTy,
1961                                         SizeTTy, File->getType());
1962 
1963   if (File->getType()->isPointerTy())
1964     inferNonMandatoryLibFuncAttrs(M, FWriteName, *TLI);
1965   CallInst *CI =
1966       B.CreateCall(F, {Ptr, Size,
1967                        ConstantInt::get(SizeTTy, 1), File});
1968 
1969   if (const Function *Fn =
1970           dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1971     CI->setCallingConv(Fn->getCallingConv());
1972   return CI;
1973 }
1974 
1975 Value *llvm::emitMalloc(Value *Num, IRBuilderBase &B, const DataLayout &DL,
1976                         const TargetLibraryInfo *TLI) {
1977   Module *M = B.GetInsertBlock()->getModule();
1978   if (!isLibFuncEmittable(M, TLI, LibFunc_malloc))
1979     return nullptr;
1980 
1981   StringRef MallocName = TLI->getName(LibFunc_malloc);
1982   Type *SizeTTy = getSizeTTy(B, TLI);
1983   FunctionCallee Malloc = getOrInsertLibFunc(M, *TLI, LibFunc_malloc,
1984                                              B.getPtrTy(), SizeTTy);
1985   inferNonMandatoryLibFuncAttrs(M, MallocName, *TLI);
1986   CallInst *CI = B.CreateCall(Malloc, Num, MallocName);
1987 
1988   if (const Function *F =
1989           dyn_cast<Function>(Malloc.getCallee()->stripPointerCasts()))
1990     CI->setCallingConv(F->getCallingConv());
1991 
1992   return CI;
1993 }
1994 
1995 Value *llvm::emitCalloc(Value *Num, Value *Size, IRBuilderBase &B,
1996                         const TargetLibraryInfo &TLI, unsigned AddrSpace) {
1997   Module *M = B.GetInsertBlock()->getModule();
1998   if (!isLibFuncEmittable(M, &TLI, LibFunc_calloc))
1999     return nullptr;
2000 
2001   StringRef CallocName = TLI.getName(LibFunc_calloc);
2002   Type *SizeTTy = getSizeTTy(B, &TLI);
2003   FunctionCallee Calloc = getOrInsertLibFunc(
2004       M, TLI, LibFunc_calloc, B.getPtrTy(AddrSpace), SizeTTy, SizeTTy);
2005   inferNonMandatoryLibFuncAttrs(M, CallocName, TLI);
2006   CallInst *CI = B.CreateCall(Calloc, {Num, Size}, CallocName);
2007 
2008   if (const auto *F =
2009           dyn_cast<Function>(Calloc.getCallee()->stripPointerCasts()))
2010     CI->setCallingConv(F->getCallingConv());
2011 
2012   return CI;
2013 }
2014 
2015 Value *llvm::emitHotColdSizeReturningNew(Value *Num, IRBuilderBase &B,
2016                                          const TargetLibraryInfo *TLI,
2017                                          LibFunc SizeFeedbackNewFunc,
2018                                          uint8_t HotCold) {
2019   Module *M = B.GetInsertBlock()->getModule();
2020   if (!isLibFuncEmittable(M, TLI, SizeFeedbackNewFunc))
2021     return nullptr;
2022 
2023   StringRef Name = TLI->getName(SizeFeedbackNewFunc);
2024 
2025   // __sized_ptr_t struct return type { void*, size_t }
2026   StructType *SizedPtrT =
2027       StructType::get(M->getContext(), {B.getPtrTy(), Num->getType()});
2028   FunctionCallee Func =
2029       M->getOrInsertFunction(Name, SizedPtrT, Num->getType(), B.getInt8Ty());
2030   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2031   CallInst *CI = B.CreateCall(Func, {Num, B.getInt8(HotCold)}, "sized_ptr");
2032 
2033   if (const Function *F = dyn_cast<Function>(Func.getCallee()))
2034     CI->setCallingConv(F->getCallingConv());
2035 
2036   return CI;
2037 }
2038 
2039 Value *llvm::emitHotColdSizeReturningNewAligned(Value *Num, Value *Align,
2040                                                 IRBuilderBase &B,
2041                                                 const TargetLibraryInfo *TLI,
2042                                                 LibFunc SizeFeedbackNewFunc,
2043                                                 uint8_t HotCold) {
2044   Module *M = B.GetInsertBlock()->getModule();
2045   if (!isLibFuncEmittable(M, TLI, SizeFeedbackNewFunc))
2046     return nullptr;
2047 
2048   StringRef Name = TLI->getName(SizeFeedbackNewFunc);
2049 
2050   // __sized_ptr_t struct return type { void*, size_t }
2051   StructType *SizedPtrT =
2052       StructType::get(M->getContext(), {B.getPtrTy(), Num->getType()});
2053   FunctionCallee Func = M->getOrInsertFunction(Name, SizedPtrT, Num->getType(),
2054                                                Align->getType(), B.getInt8Ty());
2055   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2056   CallInst *CI =
2057       B.CreateCall(Func, {Num, Align, B.getInt8(HotCold)}, "sized_ptr");
2058 
2059   if (const Function *F = dyn_cast<Function>(Func.getCallee()))
2060     CI->setCallingConv(F->getCallingConv());
2061 
2062   return CI;
2063 }
2064 
2065 Value *llvm::emitHotColdNew(Value *Num, IRBuilderBase &B,
2066                             const TargetLibraryInfo *TLI, LibFunc NewFunc,
2067                             uint8_t HotCold) {
2068   Module *M = B.GetInsertBlock()->getModule();
2069   if (!isLibFuncEmittable(M, TLI, NewFunc))
2070     return nullptr;
2071 
2072   StringRef Name = TLI->getName(NewFunc);
2073   FunctionCallee Func = M->getOrInsertFunction(Name, B.getPtrTy(),
2074                                                Num->getType(), B.getInt8Ty());
2075   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2076   CallInst *CI = B.CreateCall(Func, {Num, B.getInt8(HotCold)}, Name);
2077 
2078   if (const Function *F =
2079           dyn_cast<Function>(Func.getCallee()->stripPointerCasts()))
2080     CI->setCallingConv(F->getCallingConv());
2081 
2082   return CI;
2083 }
2084 
2085 Value *llvm::emitHotColdNewNoThrow(Value *Num, Value *NoThrow, IRBuilderBase &B,
2086                                    const TargetLibraryInfo *TLI,
2087                                    LibFunc NewFunc, uint8_t HotCold) {
2088   Module *M = B.GetInsertBlock()->getModule();
2089   if (!isLibFuncEmittable(M, TLI, NewFunc))
2090     return nullptr;
2091 
2092   StringRef Name = TLI->getName(NewFunc);
2093   FunctionCallee Func =
2094       M->getOrInsertFunction(Name, B.getPtrTy(), Num->getType(),
2095                              NoThrow->getType(), B.getInt8Ty());
2096   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2097   CallInst *CI = B.CreateCall(Func, {Num, NoThrow, B.getInt8(HotCold)}, Name);
2098 
2099   if (const Function *F =
2100           dyn_cast<Function>(Func.getCallee()->stripPointerCasts()))
2101     CI->setCallingConv(F->getCallingConv());
2102 
2103   return CI;
2104 }
2105 
2106 Value *llvm::emitHotColdNewAligned(Value *Num, Value *Align, IRBuilderBase &B,
2107                                    const TargetLibraryInfo *TLI,
2108                                    LibFunc NewFunc, uint8_t HotCold) {
2109   Module *M = B.GetInsertBlock()->getModule();
2110   if (!isLibFuncEmittable(M, TLI, NewFunc))
2111     return nullptr;
2112 
2113   StringRef Name = TLI->getName(NewFunc);
2114   FunctionCallee Func = M->getOrInsertFunction(
2115       Name, B.getPtrTy(), Num->getType(), Align->getType(), B.getInt8Ty());
2116   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2117   CallInst *CI = B.CreateCall(Func, {Num, Align, B.getInt8(HotCold)}, Name);
2118 
2119   if (const Function *F =
2120           dyn_cast<Function>(Func.getCallee()->stripPointerCasts()))
2121     CI->setCallingConv(F->getCallingConv());
2122 
2123   return CI;
2124 }
2125 
2126 Value *llvm::emitHotColdNewAlignedNoThrow(Value *Num, Value *Align,
2127                                           Value *NoThrow, IRBuilderBase &B,
2128                                           const TargetLibraryInfo *TLI,
2129                                           LibFunc NewFunc, uint8_t HotCold) {
2130   Module *M = B.GetInsertBlock()->getModule();
2131   if (!isLibFuncEmittable(M, TLI, NewFunc))
2132     return nullptr;
2133 
2134   StringRef Name = TLI->getName(NewFunc);
2135   FunctionCallee Func = M->getOrInsertFunction(
2136       Name, B.getPtrTy(), Num->getType(), Align->getType(),
2137       NoThrow->getType(), B.getInt8Ty());
2138   inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
2139   CallInst *CI =
2140       B.CreateCall(Func, {Num, Align, NoThrow, B.getInt8(HotCold)}, Name);
2141 
2142   if (const Function *F =
2143           dyn_cast<Function>(Func.getCallee()->stripPointerCasts()))
2144     CI->setCallingConv(F->getCallingConv());
2145 
2146   return CI;
2147 }
2148