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