LLVM 22.0.0git
SimplifyLibCalls.cpp
Go to the documentation of this file.
1//===------ SimplifyLibCalls.cpp - Library calls simplifier ---------------===//
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 the library calls simplifier. It does not implement
10// any pass, but can be used by other passes to do simplifications.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APSInt.h"
20#include "llvm/Analysis/Loads.h"
26#include "llvm/IR/DataLayout.h"
27#include "llvm/IR/Function.h"
28#include "llvm/IR/IRBuilder.h"
30#include "llvm/IR/Intrinsics.h"
31#include "llvm/IR/Module.h"
42
43#include <cmath>
44
45using namespace llvm;
46using namespace PatternMatch;
47
48static cl::opt<bool>
49 EnableUnsafeFPShrink("enable-double-float-shrink", cl::Hidden,
50 cl::init(false),
51 cl::desc("Enable unsafe double to float "
52 "shrinking for math lib calls"));
53
54// Enable conversion of operator new calls with a MemProf hot or cold hint
55// to an operator new call that takes a hot/cold hint. Off by default since
56// not all allocators currently support this extension.
57static cl::opt<bool>
58 OptimizeHotColdNew("optimize-hot-cold-new", cl::Hidden, cl::init(false),
59 cl::desc("Enable hot/cold operator new library calls"));
61 "optimize-existing-hot-cold-new", cl::Hidden, cl::init(false),
63 "Enable optimization of existing hot/cold operator new library calls"));
65 "optimize-nobuiltin-hot-cold-new-new", cl::Hidden, cl::init(false),
66 cl::desc("Enable transformation of nobuiltin operator new library calls"));
67
68namespace {
69
70// Specialized parser to ensure the hint is an 8 bit value (we can't specify
71// uint8_t to opt<> as that is interpreted to mean that we are passing a char
72// option with a specific set of values.
73struct HotColdHintParser : public cl::parser<unsigned> {
74 HotColdHintParser(cl::Option &O) : cl::parser<unsigned>(O) {}
75
76 bool parse(cl::Option &O, StringRef ArgName, StringRef Arg, unsigned &Value) {
77 if (Arg.getAsInteger(0, Value))
78 return O.error("'" + Arg + "' value invalid for uint argument!");
79
80 if (Value > 255)
81 return O.error("'" + Arg + "' value must be in the range [0, 255]!");
82
83 return false;
84 }
85};
86
87} // end anonymous namespace
88
89// Hot/cold operator new takes an 8 bit hotness hint, where 0 is the coldest
90// and 255 is the hottest. Default to 1 value away from the coldest and hottest
91// hints, so that the compiler hinted allocations are slightly less strong than
92// manually inserted hints at the two extremes.
94 "cold-new-hint-value", cl::Hidden, cl::init(1),
95 cl::desc("Value to pass to hot/cold operator new for cold allocation"));
97 NotColdNewHintValue("notcold-new-hint-value", cl::Hidden, cl::init(128),
98 cl::desc("Value to pass to hot/cold operator new for "
99 "notcold (warm) allocation"));
101 "hot-new-hint-value", cl::Hidden, cl::init(254),
102 cl::desc("Value to pass to hot/cold operator new for hot allocation"));
104 "ambiguous-new-hint-value", cl::Hidden, cl::init(222),
105 cl::desc(
106 "Value to pass to hot/cold operator new for ambiguous allocation"));
107
108//===----------------------------------------------------------------------===//
109// Helper Functions
110//===----------------------------------------------------------------------===//
111
112static bool ignoreCallingConv(LibFunc Func) {
113 return Func == LibFunc_abs || Func == LibFunc_labs ||
114 Func == LibFunc_llabs || Func == LibFunc_strlen;
115}
116
117/// Return true if it is only used in equality comparisons with With.
119 for (User *U : V->users()) {
120 if (ICmpInst *IC = dyn_cast<ICmpInst>(U))
121 if (IC->isEquality() && IC->getOperand(1) == With)
122 continue;
123 // Unknown instruction.
124 return false;
125 }
126 return true;
127}
128
130 return any_of(CI->operands(), [](const Use &OI) {
131 return OI->getType()->isFloatingPointTy();
132 });
133}
134
135static bool callHasFP128Argument(const CallInst *CI) {
136 return any_of(CI->operands(), [](const Use &OI) {
137 return OI->getType()->isFP128Ty();
138 });
139}
140
141// Convert the entire string Str representing an integer in Base, up to
142// the terminating nul if present, to a constant according to the rules
143// of strtoul[l] or, when AsSigned is set, of strtol[l]. On success
144// return the result, otherwise null.
145// The function assumes the string is encoded in ASCII and carefully
146// avoids converting sequences (including "") that the corresponding
147// library call might fail and set errno for.
148static Value *convertStrToInt(CallInst *CI, StringRef &Str, Value *EndPtr,
149 uint64_t Base, bool AsSigned, IRBuilderBase &B) {
150 if (Base < 2 || Base > 36)
151 if (Base != 0)
152 // Fail for an invalid base (required by POSIX).
153 return nullptr;
154
155 // Current offset into the original string to reflect in EndPtr.
156 size_t Offset = 0;
157 // Strip leading whitespace.
158 for ( ; Offset != Str.size(); ++Offset)
159 if (!isSpace((unsigned char)Str[Offset])) {
160 Str = Str.substr(Offset);
161 break;
162 }
163
164 if (Str.empty())
165 // Fail for empty subject sequences (POSIX allows but doesn't require
166 // strtol[l]/strtoul[l] to fail with EINVAL).
167 return nullptr;
168
169 // Strip but remember the sign.
170 bool Negate = Str[0] == '-';
171 if (Str[0] == '-' || Str[0] == '+') {
172 Str = Str.drop_front();
173 if (Str.empty())
174 // Fail for a sign with nothing after it.
175 return nullptr;
176 ++Offset;
177 }
178
179 // Set Max to the absolute value of the minimum (for signed), or
180 // to the maximum (for unsigned) value representable in the type.
181 Type *RetTy = CI->getType();
182 unsigned NBits = RetTy->getPrimitiveSizeInBits();
183 uint64_t Max = AsSigned && Negate ? 1 : 0;
184 Max += AsSigned ? maxIntN(NBits) : maxUIntN(NBits);
185
186 // Autodetect Base if it's zero and consume the "0x" prefix.
187 if (Str.size() > 1) {
188 if (Str[0] == '0') {
189 if (toUpper((unsigned char)Str[1]) == 'X') {
190 if (Str.size() == 2 || (Base && Base != 16))
191 // Fail if Base doesn't allow the "0x" prefix or for the prefix
192 // alone that implementations like BSD set errno to EINVAL for.
193 return nullptr;
194
195 Str = Str.drop_front(2);
196 Offset += 2;
197 Base = 16;
198 }
199 else if (Base == 0)
200 Base = 8;
201 } else if (Base == 0)
202 Base = 10;
203 }
204 else if (Base == 0)
205 Base = 10;
206
207 // Convert the rest of the subject sequence, not including the sign,
208 // to its uint64_t representation (this assumes the source character
209 // set is ASCII).
210 uint64_t Result = 0;
211 for (unsigned i = 0; i != Str.size(); ++i) {
212 unsigned char DigVal = Str[i];
213 if (isDigit(DigVal))
214 DigVal = DigVal - '0';
215 else {
216 DigVal = toUpper(DigVal);
217 if (isAlpha(DigVal))
218 DigVal = DigVal - 'A' + 10;
219 else
220 return nullptr;
221 }
222
223 if (DigVal >= Base)
224 // Fail if the digit is not valid in the Base.
225 return nullptr;
226
227 // Add the digit and fail if the result is not representable in
228 // the (unsigned form of the) destination type.
229 bool VFlow;
230 Result = SaturatingMultiplyAdd(Result, Base, (uint64_t)DigVal, &VFlow);
231 if (VFlow || Result > Max)
232 return nullptr;
233 }
234
235 if (EndPtr) {
236 // Store the pointer to the end.
237 Value *Off = B.getInt64(Offset + Str.size());
238 Value *StrBeg = CI->getArgOperand(0);
239 Value *StrEnd = B.CreateInBoundsGEP(B.getInt8Ty(), StrBeg, Off, "endptr");
240 B.CreateStore(StrEnd, EndPtr);
241 }
242
243 if (Negate)
244 // Unsigned negation doesn't overflow.
245 Result = -Result;
246
247 return ConstantInt::get(RetTy, Result);
248}
249
251 for (User *U : V->users()) {
252 if (ICmpInst *IC = dyn_cast<ICmpInst>(U))
253 if (Constant *C = dyn_cast<Constant>(IC->getOperand(1)))
254 if (C->isNullValue())
255 continue;
256 // Unknown instruction.
257 return false;
258 }
259 return true;
260}
261
262static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len,
263 const DataLayout &DL) {
265 return false;
266
267 if (!isDereferenceableAndAlignedPointer(Str, Align(1), APInt(64, Len), DL))
268 return false;
269
270 if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory))
271 return false;
272
273 return true;
274}
275
277 ArrayRef<unsigned> ArgNos,
278 uint64_t DereferenceableBytes) {
279 const Function *F = CI->getCaller();
280 if (!F)
281 return;
282 for (unsigned ArgNo : ArgNos) {
283 uint64_t DerefBytes = DereferenceableBytes;
284 unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace();
285 if (!llvm::NullPointerIsDefined(F, AS) ||
286 CI->paramHasAttr(ArgNo, Attribute::NonNull))
287 DerefBytes = std::max(CI->getParamDereferenceableOrNullBytes(ArgNo),
288 DereferenceableBytes);
289
290 if (CI->getParamDereferenceableBytes(ArgNo) < DerefBytes) {
291 CI->removeParamAttr(ArgNo, Attribute::Dereferenceable);
292 if (!llvm::NullPointerIsDefined(F, AS) ||
293 CI->paramHasAttr(ArgNo, Attribute::NonNull))
294 CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull);
296 CI->getContext(), DerefBytes));
297 }
298 }
299}
300
302 ArrayRef<unsigned> ArgNos) {
303 Function *F = CI->getCaller();
304 if (!F)
305 return;
306
307 for (unsigned ArgNo : ArgNos) {
308 if (!CI->paramHasAttr(ArgNo, Attribute::NoUndef))
309 CI->addParamAttr(ArgNo, Attribute::NoUndef);
310
311 if (!CI->paramHasAttr(ArgNo, Attribute::NonNull)) {
312 unsigned AS =
315 continue;
316 CI->addParamAttr(ArgNo, Attribute::NonNull);
317 }
318
319 annotateDereferenceableBytes(CI, ArgNo, 1);
320 }
321}
322
324 Value *Size, const DataLayout &DL) {
327 annotateDereferenceableBytes(CI, ArgNos, LenC->getZExtValue());
328 } else if (isKnownNonZero(Size, DL)) {
330 uint64_t X, Y;
331 uint64_t DerefMin = 1;
333 DerefMin = std::min(X, Y);
334 annotateDereferenceableBytes(CI, ArgNos, DerefMin);
335 }
336 }
337}
338
339// Copy CallInst "flags" like musttail, notail, and tail. Return New param for
340// easier chaining. Calls to emit* and B.createCall should probably be wrapped
341// in this function when New is created to replace Old. Callers should take
342// care to check Old.isMustTailCall() if they aren't replacing Old directly
343// with New.
344static Value *copyFlags(const CallInst &Old, Value *New) {
345 assert(!Old.isMustTailCall() && "do not copy musttail call flags");
346 assert(!Old.isNoTailCall() && "do not copy notail call flags");
347 if (auto *NewCI = dyn_cast_or_null<CallInst>(New))
348 NewCI->setTailCallKind(Old.getTailCallKind());
349 return New;
350}
351
352static Value *mergeAttributesAndFlags(CallInst *NewCI, const CallInst &Old) {
353 NewCI->setAttributes(AttributeList::get(
354 NewCI->getContext(), {NewCI->getAttributes(), Old.getAttributes()}));
355 NewCI->removeRetAttrs(AttributeFuncs::typeIncompatible(
356 NewCI->getType(), NewCI->getRetAttributes()));
357 for (unsigned I = 0; I < NewCI->arg_size(); ++I)
358 NewCI->removeParamAttrs(
359 I, AttributeFuncs::typeIncompatible(NewCI->getArgOperand(I)->getType(),
360 NewCI->getParamAttributes(I)));
361
362 return copyFlags(Old, NewCI);
363}
364
365// Helper to avoid truncating the length if size_t is 32-bits.
367 return Len >= Str.size() ? Str : Str.substr(0, Len);
368}
369
370//===----------------------------------------------------------------------===//
371// String and Memory Library Call Optimizations
372//===----------------------------------------------------------------------===//
373
374Value *LibCallSimplifier::optimizeStrCat(CallInst *CI, IRBuilderBase &B) {
375 // Extract some information from the instruction
376 Value *Dst = CI->getArgOperand(0);
377 Value *Src = CI->getArgOperand(1);
379
380 // See if we can get the length of the input string.
381 uint64_t Len = GetStringLength(Src);
382 if (Len)
384 else
385 return nullptr;
386 --Len; // Unbias length.
387
388 // Handle the simple, do-nothing case: strcat(x, "") -> x
389 if (Len == 0)
390 return Dst;
391
392 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, Len, B));
393}
394
395Value *LibCallSimplifier::emitStrLenMemCpy(Value *Src, Value *Dst, uint64_t Len,
396 IRBuilderBase &B) {
397 // We need to find the end of the destination string. That's where the
398 // memory is to be moved to. We just generate a call to strlen.
399 Value *DstLen = emitStrLen(Dst, B, DL, TLI);
400 if (!DstLen)
401 return nullptr;
402
403 // Now that we have the destination's length, we must index into the
404 // destination's pointer to get the actual memcpy destination (end of
405 // the string .. we're concatenating).
406 Value *CpyDst = B.CreateInBoundsGEP(B.getInt8Ty(), Dst, DstLen, "endptr");
407
408 // We have enough information to now generate the memcpy call to do the
409 // concatenation for us. Make a memcpy to copy the nul byte with align = 1.
410 B.CreateMemCpy(CpyDst, Align(1), Src, Align(1),
411 TLI->getAsSizeT(Len + 1, *B.GetInsertBlock()->getModule()));
412 return Dst;
413}
414
415Value *LibCallSimplifier::optimizeStrNCat(CallInst *CI, IRBuilderBase &B) {
416 // Extract some information from the instruction.
417 Value *Dst = CI->getArgOperand(0);
418 Value *Src = CI->getArgOperand(1);
419 Value *Size = CI->getArgOperand(2);
420 uint64_t Len;
422 if (isKnownNonZero(Size, DL))
424
425 // We don't do anything if length is not constant.
426 ConstantInt *LengthArg = dyn_cast<ConstantInt>(Size);
427 if (LengthArg) {
428 Len = LengthArg->getZExtValue();
429 // strncat(x, c, 0) -> x
430 if (!Len)
431 return Dst;
432 } else {
433 return nullptr;
434 }
435
436 // See if we can get the length of the input string.
437 uint64_t SrcLen = GetStringLength(Src);
438 if (SrcLen) {
439 annotateDereferenceableBytes(CI, 1, SrcLen);
440 --SrcLen; // Unbias length.
441 } else {
442 return nullptr;
443 }
444
445 // strncat(x, "", c) -> x
446 if (SrcLen == 0)
447 return Dst;
448
449 // We don't optimize this case.
450 if (Len < SrcLen)
451 return nullptr;
452
453 // strncat(x, s, c) -> strcat(x, s)
454 // s is constant so the strcat can be optimized further.
455 return copyFlags(*CI, emitStrLenMemCpy(Src, Dst, SrcLen, B));
456}
457
458// Helper to transform memchr(S, C, N) == S to N && *S == C and, when
459// NBytes is null, strchr(S, C) to *S == C. A precondition of the function
460// is that either S is dereferenceable or the value of N is nonzero.
462 IRBuilderBase &B, const DataLayout &DL)
463{
464 Value *Src = CI->getArgOperand(0);
465 Value *CharVal = CI->getArgOperand(1);
466
467 // Fold memchr(A, C, N) == A to N && *A == C.
468 Type *CharTy = B.getInt8Ty();
469 Value *Char0 = B.CreateLoad(CharTy, Src);
470 CharVal = B.CreateTrunc(CharVal, CharTy);
471 Value *Cmp = B.CreateICmpEQ(Char0, CharVal, "char0cmp");
472
473 if (NBytes) {
474 Value *Zero = ConstantInt::get(NBytes->getType(), 0);
475 Value *And = B.CreateICmpNE(NBytes, Zero);
476 Cmp = B.CreateLogicalAnd(And, Cmp);
477 }
478
479 Value *NullPtr = Constant::getNullValue(CI->getType());
480 return B.CreateSelect(Cmp, Src, NullPtr);
481}
482
483Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilderBase &B) {
484 Value *SrcStr = CI->getArgOperand(0);
485 Value *CharVal = CI->getArgOperand(1);
487
488 if (isOnlyUsedInEqualityComparison(CI, SrcStr))
489 return memChrToCharCompare(CI, nullptr, B, DL);
490
491 // If the second operand is non-constant, see if we can compute the length
492 // of the input string and turn this into memchr.
493 ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal);
494 if (!CharC) {
495 uint64_t Len = GetStringLength(SrcStr);
496 if (Len)
498 else
499 return nullptr;
500
502 FunctionType *FT = Callee->getFunctionType();
503 unsigned IntBits = TLI->getIntSize();
504 if (!FT->getParamType(1)->isIntegerTy(IntBits)) // memchr needs 'int'.
505 return nullptr;
506
507 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule());
508 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits);
509 return copyFlags(*CI,
510 emitMemChr(SrcStr, CharVal, // include nul.
511 ConstantInt::get(SizeTTy, Len), B,
512 DL, TLI));
513 }
514
515 if (CharC->isZero()) {
516 Value *NullPtr = Constant::getNullValue(CI->getType());
517 if (isOnlyUsedInEqualityComparison(CI, NullPtr))
518 // Pre-empt the transformation to strlen below and fold
519 // strchr(A, '\0') == null to false.
520 return B.CreateIntToPtr(B.getTrue(), CI->getType());
521 }
522
523 // Otherwise, the character is a constant, see if the first argument is
524 // a string literal. If so, we can constant fold.
525 StringRef Str;
526 if (!getConstantStringInfo(SrcStr, Str)) {
527 if (CharC->isZero()) // strchr(p, 0) -> p + strlen(p)
528 if (Value *StrLen = emitStrLen(SrcStr, B, DL, TLI))
529 return B.CreateInBoundsGEP(B.getInt8Ty(), SrcStr, StrLen, "strchr");
530 return nullptr;
531 }
532
533 // Compute the offset, make sure to handle the case when we're searching for
534 // zero (a weird way to spell strlen).
535 size_t I = (0xFF & CharC->getSExtValue()) == 0
536 ? Str.size()
537 : Str.find(CharC->getSExtValue());
538 if (I == StringRef::npos) // Didn't find the char. strchr returns null.
539 return Constant::getNullValue(CI->getType());
540
541 // strchr(s+n,c) -> gep(s+n+i,c)
542 return B.CreateInBoundsGEP(B.getInt8Ty(), SrcStr, B.getInt64(I), "strchr");
543}
544
545Value *LibCallSimplifier::optimizeStrRChr(CallInst *CI, IRBuilderBase &B) {
546 Value *SrcStr = CI->getArgOperand(0);
547 Value *CharVal = CI->getArgOperand(1);
548 ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal);
550
551 StringRef Str;
552 if (!getConstantStringInfo(SrcStr, Str)) {
553 // strrchr(s, 0) -> strchr(s, 0)
554 if (CharC && CharC->isZero())
555 return copyFlags(*CI, emitStrChr(SrcStr, '\0', B, TLI));
556 return nullptr;
557 }
558
559 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule());
560 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits);
561
562 // Try to expand strrchr to the memrchr nonstandard extension if it's
563 // available, or simply fail otherwise.
564 uint64_t NBytes = Str.size() + 1; // Include the terminating nul.
565 Value *Size = ConstantInt::get(SizeTTy, NBytes);
566 return copyFlags(*CI, emitMemRChr(SrcStr, CharVal, Size, B, DL, TLI));
567}
568
569Value *LibCallSimplifier::optimizeStrCmp(CallInst *CI, IRBuilderBase &B) {
570 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1);
571 if (Str1P == Str2P) // strcmp(x,x) -> 0
572 return ConstantInt::get(CI->getType(), 0);
573
574 StringRef Str1, Str2;
575 bool HasStr1 = getConstantStringInfo(Str1P, Str1);
576 bool HasStr2 = getConstantStringInfo(Str2P, Str2);
577
578 // strcmp(x, y) -> cnst (if both x and y are constant strings)
579 if (HasStr1 && HasStr2)
580 return ConstantInt::getSigned(CI->getType(),
581 std::clamp(Str1.compare(Str2), -1, 1));
582
583 if (HasStr1 && Str1.empty()) // strcmp("", x) -> -*x
584 return B.CreateNeg(B.CreateZExt(
585 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType()));
586
587 if (HasStr2 && Str2.empty()) // strcmp(x,"") -> *x
588 return B.CreateZExt(B.CreateLoad(B.getInt8Ty(), Str1P, "strcmpload"),
589 CI->getType());
590
591 // strcmp(P, "x") -> memcmp(P, "x", 2)
592 uint64_t Len1 = GetStringLength(Str1P);
593 if (Len1)
594 annotateDereferenceableBytes(CI, 0, Len1);
595 uint64_t Len2 = GetStringLength(Str2P);
596 if (Len2)
597 annotateDereferenceableBytes(CI, 1, Len2);
598
599 if (Len1 && Len2) {
600 return copyFlags(
601 *CI, emitMemCmp(Str1P, Str2P,
602 TLI->getAsSizeT(std::min(Len1, Len2), *CI->getModule()),
603 B, DL, TLI));
604 }
605
606 // strcmp to memcmp
607 if (!HasStr1 && HasStr2) {
608 if (canTransformToMemCmp(CI, Str1P, Len2, DL))
609 return copyFlags(*CI, emitMemCmp(Str1P, Str2P,
610 TLI->getAsSizeT(Len2, *CI->getModule()),
611 B, DL, TLI));
612 } else if (HasStr1 && !HasStr2) {
613 if (canTransformToMemCmp(CI, Str2P, Len1, DL))
614 return copyFlags(*CI, emitMemCmp(Str1P, Str2P,
615 TLI->getAsSizeT(Len1, *CI->getModule()),
616 B, DL, TLI));
617 }
618
620 return nullptr;
621}
622
623// Optimize a memcmp or, when StrNCmp is true, strncmp call CI with constant
624// arrays LHS and RHS and nonconstant Size.
626 Value *Size, bool StrNCmp,
627 IRBuilderBase &B, const DataLayout &DL);
628
629Value *LibCallSimplifier::optimizeStrNCmp(CallInst *CI, IRBuilderBase &B) {
630 Value *Str1P = CI->getArgOperand(0);
631 Value *Str2P = CI->getArgOperand(1);
632 Value *Size = CI->getArgOperand(2);
633 if (Str1P == Str2P) // strncmp(x,x,n) -> 0
634 return ConstantInt::get(CI->getType(), 0);
635
636 if (isKnownNonZero(Size, DL))
638 // Get the length argument if it is constant.
639 uint64_t Length;
640 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(Size))
641 Length = LengthArg->getZExtValue();
642 else
643 return optimizeMemCmpVarSize(CI, Str1P, Str2P, Size, true, B, DL);
644
645 if (Length == 0) // strncmp(x,y,0) -> 0
646 return ConstantInt::get(CI->getType(), 0);
647
648 if (Length == 1) // strncmp(x,y,1) -> memcmp(x,y,1)
649 return copyFlags(*CI, emitMemCmp(Str1P, Str2P, Size, B, DL, TLI));
650
651 StringRef Str1, Str2;
652 bool HasStr1 = getConstantStringInfo(Str1P, Str1);
653 bool HasStr2 = getConstantStringInfo(Str2P, Str2);
654
655 // strncmp(x, y) -> cnst (if both x and y are constant strings)
656 if (HasStr1 && HasStr2) {
657 // Avoid truncating the 64-bit Length to 32 bits in ILP32.
658 StringRef SubStr1 = substr(Str1, Length);
659 StringRef SubStr2 = substr(Str2, Length);
660 return ConstantInt::getSigned(CI->getType(),
661 std::clamp(SubStr1.compare(SubStr2), -1, 1));
662 }
663
664 if (HasStr1 && Str1.empty()) // strncmp("", x, n) -> -*x
665 return B.CreateNeg(B.CreateZExt(
666 B.CreateLoad(B.getInt8Ty(), Str2P, "strcmpload"), CI->getType()));
667
668 if (HasStr2 && Str2.empty()) // strncmp(x, "", n) -> *x
669 return B.CreateZExt(B.CreateLoad(B.getInt8Ty(), Str1P, "strcmpload"),
670 CI->getType());
671
672 uint64_t Len1 = GetStringLength(Str1P);
673 if (Len1)
674 annotateDereferenceableBytes(CI, 0, Len1);
675 uint64_t Len2 = GetStringLength(Str2P);
676 if (Len2)
677 annotateDereferenceableBytes(CI, 1, Len2);
678
679 // strncmp to memcmp
680 if (!HasStr1 && HasStr2) {
681 Len2 = std::min(Len2, Length);
682 if (canTransformToMemCmp(CI, Str1P, Len2, DL))
683 return copyFlags(*CI, emitMemCmp(Str1P, Str2P,
684 TLI->getAsSizeT(Len2, *CI->getModule()),
685 B, DL, TLI));
686 } else if (HasStr1 && !HasStr2) {
687 Len1 = std::min(Len1, Length);
688 if (canTransformToMemCmp(CI, Str2P, Len1, DL))
689 return copyFlags(*CI, emitMemCmp(Str1P, Str2P,
690 TLI->getAsSizeT(Len1, *CI->getModule()),
691 B, DL, TLI));
692 }
693
694 return nullptr;
695}
696
697Value *LibCallSimplifier::optimizeStrNDup(CallInst *CI, IRBuilderBase &B) {
698 Value *Src = CI->getArgOperand(0);
699 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1));
700 uint64_t SrcLen = GetStringLength(Src);
701 if (SrcLen && Size) {
702 annotateDereferenceableBytes(CI, 0, SrcLen);
703 if (SrcLen <= Size->getZExtValue() + 1)
704 return copyFlags(*CI, emitStrDup(Src, B, TLI));
705 }
706
707 return nullptr;
708}
709
710Value *LibCallSimplifier::optimizeStrCpy(CallInst *CI, IRBuilderBase &B) {
711 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1);
712 if (Dst == Src) // strcpy(x,x) -> x
713 return Src;
714
716 // See if we can get the length of the input string.
717 uint64_t Len = GetStringLength(Src);
718 if (Len)
720 else
721 return nullptr;
722
723 // We have enough information to now generate the memcpy call to do the
724 // copy for us. Make a memcpy to copy the nul byte with align = 1.
725 CallInst *NewCI = B.CreateMemCpy(Dst, Align(1), Src, Align(1),
726 TLI->getAsSizeT(Len, *CI->getModule()));
727 mergeAttributesAndFlags(NewCI, *CI);
728 return Dst;
729}
730
731Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilderBase &B) {
732 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1);
733
734 // stpcpy(d,s) -> strcpy(d,s) if the result is not used.
735 if (CI->use_empty())
736 return copyFlags(*CI, emitStrCpy(Dst, Src, B, TLI));
737
738 if (Dst == Src) { // stpcpy(x,x) -> x+strlen(x)
739 Value *StrLen = emitStrLen(Src, B, DL, TLI);
740 return StrLen ? B.CreateInBoundsGEP(B.getInt8Ty(), Dst, StrLen) : nullptr;
741 }
742
743 // See if we can get the length of the input string.
744 uint64_t Len = GetStringLength(Src);
745 if (Len)
747 else
748 return nullptr;
749
750 Value *LenV = TLI->getAsSizeT(Len, *CI->getModule());
751 Value *DstEnd = B.CreateInBoundsGEP(
752 B.getInt8Ty(), Dst, TLI->getAsSizeT(Len - 1, *CI->getModule()));
753
754 // We have enough information to now generate the memcpy call to do the
755 // copy for us. Make a memcpy to copy the nul byte with align = 1.
756 CallInst *NewCI = B.CreateMemCpy(Dst, Align(1), Src, Align(1), LenV);
757 mergeAttributesAndFlags(NewCI, *CI);
758 return DstEnd;
759}
760
761// Optimize a call to size_t strlcpy(char*, const char*, size_t).
762
763Value *LibCallSimplifier::optimizeStrLCpy(CallInst *CI, IRBuilderBase &B) {
764 Value *Size = CI->getArgOperand(2);
765 if (isKnownNonZero(Size, DL))
766 // Like snprintf, the function stores into the destination only when
767 // the size argument is nonzero.
769 // The function reads the source argument regardless of Size (it returns
770 // its length).
772
773 uint64_t NBytes;
774 if (ConstantInt *SizeC = dyn_cast<ConstantInt>(Size))
775 NBytes = SizeC->getZExtValue();
776 else
777 return nullptr;
778
779 Value *Dst = CI->getArgOperand(0);
780 Value *Src = CI->getArgOperand(1);
781 if (NBytes <= 1) {
782 if (NBytes == 1)
783 // For a call to strlcpy(D, S, 1) first store a nul in *D.
784 B.CreateStore(B.getInt8(0), Dst);
785
786 // Transform strlcpy(D, S, 0) to a call to strlen(S).
787 return copyFlags(*CI, emitStrLen(Src, B, DL, TLI));
788 }
789
790 // Try to determine the length of the source, substituting its size
791 // when it's not nul-terminated (as it's required to be) to avoid
792 // reading past its end.
793 StringRef Str;
794 if (!getConstantStringInfo(Src, Str, /*TrimAtNul=*/false))
795 return nullptr;
796
797 uint64_t SrcLen = Str.find('\0');
798 // Set if the terminating nul should be copied by the call to memcpy
799 // below.
800 bool NulTerm = SrcLen < NBytes;
801
802 if (NulTerm)
803 // Overwrite NBytes with the number of bytes to copy, including
804 // the terminating nul.
805 NBytes = SrcLen + 1;
806 else {
807 // Set the length of the source for the function to return to its
808 // size, and cap NBytes at the same.
809 SrcLen = std::min(SrcLen, uint64_t(Str.size()));
810 NBytes = std::min(NBytes - 1, SrcLen);
811 }
812
813 if (SrcLen == 0) {
814 // Transform strlcpy(D, "", N) to (*D = '\0, 0).
815 B.CreateStore(B.getInt8(0), Dst);
816 return ConstantInt::get(CI->getType(), 0);
817 }
818
819 // Transform strlcpy(D, S, N) to memcpy(D, S, N') where N' is the lower
820 // bound on strlen(S) + 1 and N, optionally followed by a nul store to
821 // D[N' - 1] if necessary.
822 CallInst *NewCI = B.CreateMemCpy(Dst, Align(1), Src, Align(1),
823 TLI->getAsSizeT(NBytes, *CI->getModule()));
824 mergeAttributesAndFlags(NewCI, *CI);
825
826 if (!NulTerm) {
827 Value *EndOff = ConstantInt::get(CI->getType(), NBytes);
828 Value *EndPtr = B.CreateInBoundsGEP(B.getInt8Ty(), Dst, EndOff);
829 B.CreateStore(B.getInt8(0), EndPtr);
830 }
831
832 // Like snprintf, strlcpy returns the number of nonzero bytes that would
833 // have been copied if the bound had been sufficiently big (which in this
834 // case is strlen(Src)).
835 return ConstantInt::get(CI->getType(), SrcLen);
836}
837
838// Optimize a call CI to either stpncpy when RetEnd is true, or to strncpy
839// otherwise.
840Value *LibCallSimplifier::optimizeStringNCpy(CallInst *CI, bool RetEnd,
841 IRBuilderBase &B) {
842 Value *Dst = CI->getArgOperand(0);
843 Value *Src = CI->getArgOperand(1);
844 Value *Size = CI->getArgOperand(2);
845
846 if (isKnownNonZero(Size, DL)) {
847 // Both st{p,r}ncpy(D, S, N) access the source and destination arrays
848 // only when N is nonzero.
851 }
852
853 // If the "bound" argument is known set N to it. Otherwise set it to
854 // UINT64_MAX and handle it later.
855 uint64_t N = UINT64_MAX;
856 if (ConstantInt *SizeC = dyn_cast<ConstantInt>(Size))
857 N = SizeC->getZExtValue();
858
859 if (N == 0)
860 // Fold st{p,r}ncpy(D, S, 0) to D.
861 return Dst;
862
863 if (N == 1) {
864 Type *CharTy = B.getInt8Ty();
865 Value *CharVal = B.CreateLoad(CharTy, Src, "stxncpy.char0");
866 B.CreateStore(CharVal, Dst);
867 if (!RetEnd)
868 // Transform strncpy(D, S, 1) to return (*D = *S), D.
869 return Dst;
870
871 // Transform stpncpy(D, S, 1) to return (*D = *S) ? D + 1 : D.
872 Value *ZeroChar = ConstantInt::get(CharTy, 0);
873 Value *Cmp = B.CreateICmpEQ(CharVal, ZeroChar, "stpncpy.char0cmp");
874
875 Value *Off1 = B.getInt32(1);
876 Value *EndPtr = B.CreateInBoundsGEP(CharTy, Dst, Off1, "stpncpy.end");
877 return B.CreateSelect(Cmp, Dst, EndPtr, "stpncpy.sel");
878 }
879
880 // If the length of the input string is known set SrcLen to it.
881 uint64_t SrcLen = GetStringLength(Src);
882 if (SrcLen)
883 annotateDereferenceableBytes(CI, 1, SrcLen);
884 else
885 return nullptr;
886
887 --SrcLen; // Unbias length.
888
889 if (SrcLen == 0) {
890 // Transform st{p,r}ncpy(D, "", N) to memset(D, '\0', N) for any N.
891 Align MemSetAlign =
892 CI->getAttributes().getParamAttrs(0).getAlignment().valueOrOne();
893 CallInst *NewCI = B.CreateMemSet(Dst, B.getInt8('\0'), Size, MemSetAlign);
894 AttrBuilder ArgAttrs(CI->getContext(), CI->getAttributes().getParamAttrs(0));
895 NewCI->setAttributes(NewCI->getAttributes().addParamAttributes(
896 CI->getContext(), 0, ArgAttrs));
897 copyFlags(*CI, NewCI);
898 return Dst;
899 }
900
901 if (N > SrcLen + 1) {
902 if (N > 128)
903 // Bail if N is large or unknown.
904 return nullptr;
905
906 // st{p,r}ncpy(D, "a", N) -> memcpy(D, "a\0\0\0", N) for N <= 128.
907 StringRef Str;
908 if (!getConstantStringInfo(Src, Str))
909 return nullptr;
910 std::string SrcStr = Str.str();
911 // Create a bigger, nul-padded array with the same length, SrcLen,
912 // as the original string.
913 SrcStr.resize(N, '\0');
914 Src = B.CreateGlobalString(SrcStr, "str", /*AddressSpace=*/0,
915 /*M=*/nullptr, /*AddNull=*/false);
916 }
917
918 // st{p,r}ncpy(D, S, N) -> memcpy(align 1 D, align 1 S, N) when both
919 // S and N are constant.
920 CallInst *NewCI = B.CreateMemCpy(Dst, Align(1), Src, Align(1),
921 TLI->getAsSizeT(N, *CI->getModule()));
922 mergeAttributesAndFlags(NewCI, *CI);
923 if (!RetEnd)
924 return Dst;
925
926 // stpncpy(D, S, N) returns the address of the first null in D if it writes
927 // one, otherwise D + N.
928 Value *Off = B.getInt64(std::min(SrcLen, N));
929 return B.CreateInBoundsGEP(B.getInt8Ty(), Dst, Off, "endptr");
930}
931
932Value *LibCallSimplifier::optimizeStringLength(CallInst *CI, IRBuilderBase &B,
933 unsigned CharSize,
934 Value *Bound) {
935 Value *Src = CI->getArgOperand(0);
936 Type *CharTy = B.getIntNTy(CharSize);
937
939 (!Bound || isKnownNonZero(Bound, DL))) {
940 // Fold strlen:
941 // strlen(x) != 0 --> *x != 0
942 // strlen(x) == 0 --> *x == 0
943 // and likewise strnlen with constant N > 0:
944 // strnlen(x, N) != 0 --> *x != 0
945 // strnlen(x, N) == 0 --> *x == 0
946 return B.CreateZExt(B.CreateLoad(CharTy, Src, "char0"),
947 CI->getType());
948 }
949
950 if (Bound) {
951 if (ConstantInt *BoundCst = dyn_cast<ConstantInt>(Bound)) {
952 if (BoundCst->isZero())
953 // Fold strnlen(s, 0) -> 0 for any s, constant or otherwise.
954 return ConstantInt::get(CI->getType(), 0);
955
956 if (BoundCst->isOne()) {
957 // Fold strnlen(s, 1) -> *s ? 1 : 0 for any s.
958 Value *CharVal = B.CreateLoad(CharTy, Src, "strnlen.char0");
959 Value *ZeroChar = ConstantInt::get(CharTy, 0);
960 Value *Cmp = B.CreateICmpNE(CharVal, ZeroChar, "strnlen.char0cmp");
961 return B.CreateZExt(Cmp, CI->getType());
962 }
963 }
964 }
965
966 if (uint64_t Len = GetStringLength(Src, CharSize)) {
967 Value *LenC = ConstantInt::get(CI->getType(), Len - 1);
968 // Fold strlen("xyz") -> 3 and strnlen("xyz", 2) -> 2
969 // and strnlen("xyz", Bound) -> min(3, Bound) for nonconstant Bound.
970 if (Bound)
971 return B.CreateBinaryIntrinsic(Intrinsic::umin, LenC, Bound);
972 return LenC;
973 }
974
975 if (Bound)
976 // Punt for strnlen for now.
977 return nullptr;
978
979 // If s is a constant pointer pointing to a string literal, we can fold
980 // strlen(s + x) to strlen(s) - x, when x is known to be in the range
981 // [0, strlen(s)] or the string has a single null terminator '\0' at the end.
982 // We only try to simplify strlen when the pointer s points to an array
983 // of CharSize elements. Otherwise, we would need to scale the offset x before
984 // doing the subtraction. This will make the optimization more complex, and
985 // it's not very useful because calling strlen for a pointer of other types is
986 // very uncommon.
987 if (GEPOperator *GEP = dyn_cast<GEPOperator>(Src)) {
988 unsigned BW = DL.getIndexTypeSizeInBits(GEP->getType());
989 SmallMapVector<Value *, APInt, 4> VarOffsets;
990 APInt ConstOffset(BW, 0);
991 assert(CharSize % 8 == 0 && "Expected a multiple of 8 sized CharSize");
992 // Check the gep is a single variable offset.
993 if (!GEP->collectOffset(DL, BW, VarOffsets, ConstOffset) ||
994 VarOffsets.size() != 1 || ConstOffset != 0 ||
995 VarOffsets.begin()->second != CharSize / 8)
996 return nullptr;
997
998 ConstantDataArraySlice Slice;
999 if (getConstantDataArrayInfo(GEP->getOperand(0), Slice, CharSize)) {
1000 uint64_t NullTermIdx;
1001 if (Slice.Array == nullptr) {
1002 NullTermIdx = 0;
1003 } else {
1004 NullTermIdx = ~((uint64_t)0);
1005 for (uint64_t I = 0, E = Slice.Length; I < E; ++I) {
1006 if (Slice.Array->getElementAsInteger(I + Slice.Offset) == 0) {
1007 NullTermIdx = I;
1008 break;
1009 }
1010 }
1011 // If the string does not have '\0', leave it to strlen to compute
1012 // its length.
1013 if (NullTermIdx == ~((uint64_t)0))
1014 return nullptr;
1015 }
1016
1017 Value *Offset = VarOffsets.begin()->first;
1018 KnownBits Known = computeKnownBits(Offset, DL, nullptr, CI, nullptr);
1019
1020 // If Offset is not provably in the range [0, NullTermIdx], we can still
1021 // optimize if we can prove that the program has undefined behavior when
1022 // Offset is outside that range. That is the case when GEP->getOperand(0)
1023 // is a pointer to an object whose memory extent is NullTermIdx+1.
1024 if ((Known.isNonNegative() && Known.getMaxValue().ule(NullTermIdx)) ||
1025 (isa<GlobalVariable>(GEP->getOperand(0)) &&
1026 NullTermIdx == Slice.Length - 1)) {
1027 Offset = B.CreateSExtOrTrunc(Offset, CI->getType());
1028 return B.CreateSub(ConstantInt::get(CI->getType(), NullTermIdx),
1029 Offset);
1030 }
1031 }
1032 }
1033
1034 // strlen(x?"foo":"bars") --> x ? 3 : 4
1035 if (SelectInst *SI = dyn_cast<SelectInst>(Src)) {
1036 uint64_t LenTrue = GetStringLength(SI->getTrueValue(), CharSize);
1037 uint64_t LenFalse = GetStringLength(SI->getFalseValue(), CharSize);
1038 if (LenTrue && LenFalse) {
1039 ORE.emit([&]() {
1040 return OptimizationRemark("instcombine", "simplify-libcalls", CI)
1041 << "folded strlen(select) to select of constants";
1042 });
1043 return B.CreateSelect(SI->getCondition(),
1044 ConstantInt::get(CI->getType(), LenTrue - 1),
1045 ConstantInt::get(CI->getType(), LenFalse - 1));
1046 }
1047 }
1048
1049 return nullptr;
1050}
1051
1052Value *LibCallSimplifier::optimizeStrLen(CallInst *CI, IRBuilderBase &B) {
1053 if (Value *V = optimizeStringLength(CI, B, 8))
1054 return V;
1056 return nullptr;
1057}
1058
1059Value *LibCallSimplifier::optimizeStrNLen(CallInst *CI, IRBuilderBase &B) {
1060 Value *Bound = CI->getArgOperand(1);
1061 if (Value *V = optimizeStringLength(CI, B, 8, Bound))
1062 return V;
1063
1064 if (isKnownNonZero(Bound, DL))
1066 return nullptr;
1067}
1068
1069Value *LibCallSimplifier::optimizeWcslen(CallInst *CI, IRBuilderBase &B) {
1070 Module &M = *CI->getModule();
1071 unsigned WCharSize = TLI->getWCharSize(M) * 8;
1072 // We cannot perform this optimization without wchar_size metadata.
1073 if (WCharSize == 0)
1074 return nullptr;
1075
1076 return optimizeStringLength(CI, B, WCharSize);
1077}
1078
1079Value *LibCallSimplifier::optimizeStrPBrk(CallInst *CI, IRBuilderBase &B) {
1080 StringRef S1, S2;
1081 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
1082 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
1083
1084 // strpbrk(s, "") -> nullptr
1085 // strpbrk("", s) -> nullptr
1086 if ((HasS1 && S1.empty()) || (HasS2 && S2.empty()))
1087 return Constant::getNullValue(CI->getType());
1088
1089 // Constant folding.
1090 if (HasS1 && HasS2) {
1091 size_t I = S1.find_first_of(S2);
1092 if (I == StringRef::npos) // No match.
1093 return Constant::getNullValue(CI->getType());
1094
1095 return B.CreateInBoundsGEP(B.getInt8Ty(), CI->getArgOperand(0),
1096 B.getInt64(I), "strpbrk");
1097 }
1098
1099 // strpbrk(s, "a") -> strchr(s, 'a')
1100 if (HasS2 && S2.size() == 1)
1101 return copyFlags(*CI, emitStrChr(CI->getArgOperand(0), S2[0], B, TLI));
1102
1103 return nullptr;
1104}
1105
1106Value *LibCallSimplifier::optimizeStrTo(CallInst *CI, IRBuilderBase &B) {
1107 Value *EndPtr = CI->getArgOperand(1);
1108 if (isa<ConstantPointerNull>(EndPtr)) {
1109 // With a null EndPtr, this function won't capture the main argument.
1110 // It would be readonly too, except that it still may write to errno.
1113 }
1114
1115 return nullptr;
1116}
1117
1118Value *LibCallSimplifier::optimizeStrSpn(CallInst *CI, IRBuilderBase &B) {
1119 StringRef S1, S2;
1120 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
1121 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
1122
1123 // strspn(s, "") -> 0
1124 // strspn("", s) -> 0
1125 if ((HasS1 && S1.empty()) || (HasS2 && S2.empty()))
1126 return Constant::getNullValue(CI->getType());
1127
1128 // Constant folding.
1129 if (HasS1 && HasS2) {
1130 size_t Pos = S1.find_first_not_of(S2);
1131 if (Pos == StringRef::npos)
1132 Pos = S1.size();
1133 return ConstantInt::get(CI->getType(), Pos);
1134 }
1135
1136 return nullptr;
1137}
1138
1139Value *LibCallSimplifier::optimizeStrCSpn(CallInst *CI, IRBuilderBase &B) {
1140 StringRef S1, S2;
1141 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
1142 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
1143
1144 // strcspn("", s) -> 0
1145 if (HasS1 && S1.empty())
1146 return Constant::getNullValue(CI->getType());
1147
1148 // Constant folding.
1149 if (HasS1 && HasS2) {
1150 size_t Pos = S1.find_first_of(S2);
1151 if (Pos == StringRef::npos)
1152 Pos = S1.size();
1153 return ConstantInt::get(CI->getType(), Pos);
1154 }
1155
1156 // strcspn(s, "") -> strlen(s)
1157 if (HasS2 && S2.empty())
1158 return copyFlags(*CI, emitStrLen(CI->getArgOperand(0), B, DL, TLI));
1159
1160 return nullptr;
1161}
1162
1163Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilderBase &B) {
1164 // fold strstr(x, x) -> x.
1165 if (CI->getArgOperand(0) == CI->getArgOperand(1))
1166 return CI->getArgOperand(0);
1167
1168 // fold strstr(a, b) == a -> strncmp(a, b, strlen(b)) == 0
1170 Value *StrLen = emitStrLen(CI->getArgOperand(1), B, DL, TLI);
1171 if (!StrLen)
1172 return nullptr;
1173 Value *StrNCmp = emitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1),
1174 StrLen, B, DL, TLI);
1175 if (!StrNCmp)
1176 return nullptr;
1177 for (User *U : llvm::make_early_inc_range(CI->users())) {
1178 ICmpInst *Old = cast<ICmpInst>(U);
1179 Value *Cmp =
1180 B.CreateICmp(Old->getPredicate(), StrNCmp,
1181 ConstantInt::getNullValue(StrNCmp->getType()), "cmp");
1182 replaceAllUsesWith(Old, Cmp);
1183 }
1184 return CI;
1185 }
1186
1187 // See if either input string is a constant string.
1188 StringRef SearchStr, ToFindStr;
1189 bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr);
1190 bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr);
1191
1192 // fold strstr(x, "") -> x.
1193 if (HasStr2 && ToFindStr.empty())
1194 return CI->getArgOperand(0);
1195
1196 // If both strings are known, constant fold it.
1197 if (HasStr1 && HasStr2) {
1198 size_t Offset = SearchStr.find(ToFindStr);
1199
1200 if (Offset == StringRef::npos) // strstr("foo", "bar") -> null
1201 return Constant::getNullValue(CI->getType());
1202
1203 // strstr("abcd", "bc") -> gep((char*)"abcd", 1)
1204 return B.CreateConstInBoundsGEP1_64(B.getInt8Ty(), CI->getArgOperand(0),
1205 Offset, "strstr");
1206 }
1207
1208 // fold strstr(x, "y") -> strchr(x, 'y').
1209 if (HasStr2 && ToFindStr.size() == 1) {
1210 return emitStrChr(CI->getArgOperand(0), ToFindStr[0], B, TLI);
1211 }
1212
1214 return nullptr;
1215}
1216
1217Value *LibCallSimplifier::optimizeMemRChr(CallInst *CI, IRBuilderBase &B) {
1218 Value *SrcStr = CI->getArgOperand(0);
1219 Value *Size = CI->getArgOperand(2);
1221 Value *CharVal = CI->getArgOperand(1);
1222 ConstantInt *LenC = dyn_cast<ConstantInt>(Size);
1223 Value *NullPtr = Constant::getNullValue(CI->getType());
1224
1225 if (LenC) {
1226 if (LenC->isZero())
1227 // Fold memrchr(x, y, 0) --> null.
1228 return NullPtr;
1229
1230 if (LenC->isOne()) {
1231 // Fold memrchr(x, y, 1) --> *x == y ? x : null for any x and y,
1232 // constant or otherwise.
1233 Value *Val = B.CreateLoad(B.getInt8Ty(), SrcStr, "memrchr.char0");
1234 // Slice off the character's high end bits.
1235 CharVal = B.CreateTrunc(CharVal, B.getInt8Ty());
1236 Value *Cmp = B.CreateICmpEQ(Val, CharVal, "memrchr.char0cmp");
1237 return B.CreateSelect(Cmp, SrcStr, NullPtr, "memrchr.sel");
1238 }
1239 }
1240
1241 StringRef Str;
1242 if (!getConstantStringInfo(SrcStr, Str, /*TrimAtNul=*/false))
1243 return nullptr;
1244
1245 if (Str.size() == 0)
1246 // If the array is empty fold memrchr(A, C, N) to null for any value
1247 // of C and N on the basis that the only valid value of N is zero
1248 // (otherwise the call is undefined).
1249 return NullPtr;
1250
1251 uint64_t EndOff = UINT64_MAX;
1252 if (LenC) {
1253 EndOff = LenC->getZExtValue();
1254 if (Str.size() < EndOff)
1255 // Punt out-of-bounds accesses to sanitizers and/or libc.
1256 return nullptr;
1257 }
1258
1259 if (ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal)) {
1260 // Fold memrchr(S, C, N) for a constant C.
1261 size_t Pos = Str.rfind(CharC->getZExtValue(), EndOff);
1262 if (Pos == StringRef::npos)
1263 // When the character is not in the source array fold the result
1264 // to null regardless of Size.
1265 return NullPtr;
1266
1267 if (LenC)
1268 // Fold memrchr(s, c, N) --> s + Pos for constant N > Pos.
1269 return B.CreateInBoundsGEP(B.getInt8Ty(), SrcStr, B.getInt64(Pos));
1270
1271 if (Str.find(Str[Pos]) == Pos) {
1272 // When there is just a single occurrence of C in S, i.e., the one
1273 // in Str[Pos], fold
1274 // memrchr(s, c, N) --> N <= Pos ? null : s + Pos
1275 // for nonconstant N.
1276 Value *Cmp = B.CreateICmpULE(Size, ConstantInt::get(Size->getType(), Pos),
1277 "memrchr.cmp");
1278 Value *SrcPlus = B.CreateInBoundsGEP(B.getInt8Ty(), SrcStr,
1279 B.getInt64(Pos), "memrchr.ptr_plus");
1280 return B.CreateSelect(Cmp, NullPtr, SrcPlus, "memrchr.sel");
1281 }
1282 }
1283
1284 // Truncate the string to search at most EndOff characters.
1285 Str = Str.substr(0, EndOff);
1286 if (Str.find_first_not_of(Str[0]) != StringRef::npos)
1287 return nullptr;
1288
1289 // If the source array consists of all equal characters, then for any
1290 // C and N (whether in bounds or not), fold memrchr(S, C, N) to
1291 // N != 0 && *S == C ? S + N - 1 : null
1292 Type *SizeTy = Size->getType();
1293 Type *Int8Ty = B.getInt8Ty();
1294 Value *NNeZ = B.CreateICmpNE(Size, ConstantInt::get(SizeTy, 0));
1295 // Slice off the sought character's high end bits.
1296 CharVal = B.CreateTrunc(CharVal, Int8Ty);
1297 Value *CEqS0 = B.CreateICmpEQ(ConstantInt::get(Int8Ty, Str[0]), CharVal);
1298 Value *And = B.CreateLogicalAnd(NNeZ, CEqS0);
1299 Value *SizeM1 = B.CreateSub(Size, ConstantInt::get(SizeTy, 1));
1300 Value *SrcPlus =
1301 B.CreateInBoundsGEP(Int8Ty, SrcStr, SizeM1, "memrchr.ptr_plus");
1302 return B.CreateSelect(And, SrcPlus, NullPtr, "memrchr.sel");
1303}
1304
1305Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilderBase &B) {
1306 Value *SrcStr = CI->getArgOperand(0);
1307 Value *Size = CI->getArgOperand(2);
1308
1309 if (isKnownNonZero(Size, DL)) {
1311 if (isOnlyUsedInEqualityComparison(CI, SrcStr))
1312 return memChrToCharCompare(CI, Size, B, DL);
1313 }
1314
1315 Value *CharVal = CI->getArgOperand(1);
1316 ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal);
1317 ConstantInt *LenC = dyn_cast<ConstantInt>(Size);
1318 Value *NullPtr = Constant::getNullValue(CI->getType());
1319
1320 // memchr(x, y, 0) -> null
1321 if (LenC) {
1322 if (LenC->isZero())
1323 return NullPtr;
1324
1325 if (LenC->isOne()) {
1326 // Fold memchr(x, y, 1) --> *x == y ? x : null for any x and y,
1327 // constant or otherwise.
1328 Value *Val = B.CreateLoad(B.getInt8Ty(), SrcStr, "memchr.char0");
1329 // Slice off the character's high end bits.
1330 CharVal = B.CreateTrunc(CharVal, B.getInt8Ty());
1331 Value *Cmp = B.CreateICmpEQ(Val, CharVal, "memchr.char0cmp");
1332 return B.CreateSelect(Cmp, SrcStr, NullPtr, "memchr.sel");
1333 }
1334 }
1335
1336 StringRef Str;
1337 if (!getConstantStringInfo(SrcStr, Str, /*TrimAtNul=*/false))
1338 return nullptr;
1339
1340 if (CharC) {
1341 size_t Pos = Str.find(CharC->getZExtValue());
1342 if (Pos == StringRef::npos)
1343 // When the character is not in the source array fold the result
1344 // to null regardless of Size.
1345 return NullPtr;
1346
1347 // Fold memchr(s, c, n) -> n <= Pos ? null : s + Pos
1348 // When the constant Size is less than or equal to the character
1349 // position also fold the result to null.
1350 Value *Cmp = B.CreateICmpULE(Size, ConstantInt::get(Size->getType(), Pos),
1351 "memchr.cmp");
1352 Value *SrcPlus = B.CreateInBoundsGEP(B.getInt8Ty(), SrcStr, B.getInt64(Pos),
1353 "memchr.ptr");
1354 return B.CreateSelect(Cmp, NullPtr, SrcPlus);
1355 }
1356
1357 if (Str.size() == 0)
1358 // If the array is empty fold memchr(A, C, N) to null for any value
1359 // of C and N on the basis that the only valid value of N is zero
1360 // (otherwise the call is undefined).
1361 return NullPtr;
1362
1363 if (LenC)
1364 Str = substr(Str, LenC->getZExtValue());
1365
1366 size_t Pos = Str.find_first_not_of(Str[0]);
1367 if (Pos == StringRef::npos
1368 || Str.find_first_not_of(Str[Pos], Pos) == StringRef::npos) {
1369 // If the source array consists of at most two consecutive sequences
1370 // of the same characters, then for any C and N (whether in bounds or
1371 // not), fold memchr(S, C, N) to
1372 // N != 0 && *S == C ? S : null
1373 // or for the two sequences to:
1374 // N != 0 && *S == C ? S : (N > Pos && S[Pos] == C ? S + Pos : null)
1375 // ^Sel2 ^Sel1 are denoted above.
1376 // The latter makes it also possible to fold strchr() calls with strings
1377 // of the same characters.
1378 Type *SizeTy = Size->getType();
1379 Type *Int8Ty = B.getInt8Ty();
1380
1381 // Slice off the sought character's high end bits.
1382 CharVal = B.CreateTrunc(CharVal, Int8Ty);
1383
1384 Value *Sel1 = NullPtr;
1385 if (Pos != StringRef::npos) {
1386 // Handle two consecutive sequences of the same characters.
1387 Value *PosVal = ConstantInt::get(SizeTy, Pos);
1388 Value *StrPos = ConstantInt::get(Int8Ty, Str[Pos]);
1389 Value *CEqSPos = B.CreateICmpEQ(CharVal, StrPos);
1390 Value *NGtPos = B.CreateICmp(ICmpInst::ICMP_UGT, Size, PosVal);
1391 Value *And = B.CreateAnd(CEqSPos, NGtPos);
1392 Value *SrcPlus = B.CreateInBoundsGEP(B.getInt8Ty(), SrcStr, PosVal);
1393 Sel1 = B.CreateSelect(And, SrcPlus, NullPtr, "memchr.sel1");
1394 }
1395
1396 Value *Str0 = ConstantInt::get(Int8Ty, Str[0]);
1397 Value *CEqS0 = B.CreateICmpEQ(Str0, CharVal);
1398 Value *NNeZ = B.CreateICmpNE(Size, ConstantInt::get(SizeTy, 0));
1399 Value *And = B.CreateAnd(NNeZ, CEqS0);
1400 return B.CreateSelect(And, SrcStr, Sel1, "memchr.sel2");
1401 }
1402
1403 if (!LenC) {
1404 if (isOnlyUsedInEqualityComparison(CI, SrcStr))
1405 // S is dereferenceable so it's safe to load from it and fold
1406 // memchr(S, C, N) == S to N && *S == C for any C and N.
1407 // TODO: This is safe even for nonconstant S.
1408 return memChrToCharCompare(CI, Size, B, DL);
1409
1410 // From now on we need a constant length and constant array.
1411 return nullptr;
1412 }
1413
1414 bool OptForSize = llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI,
1416
1417 // If the char is variable but the input str and length are not we can turn
1418 // this memchr call into a simple bit field test. Of course this only works
1419 // when the return value is only checked against null.
1420 //
1421 // It would be really nice to reuse switch lowering here but we can't change
1422 // the CFG at this point.
1423 //
1424 // memchr("\r\n", C, 2) != nullptr -> (1 << C & ((1 << '\r') | (1 << '\n')))
1425 // != 0
1426 // after bounds check.
1427 if (OptForSize || Str.empty() || !isOnlyUsedInZeroEqualityComparison(CI))
1428 return nullptr;
1429
1430 unsigned char Max =
1431 *std::max_element(reinterpret_cast<const unsigned char *>(Str.begin()),
1432 reinterpret_cast<const unsigned char *>(Str.end()));
1433
1434 // Make sure the bit field we're about to create fits in a register on the
1435 // target.
1436 // FIXME: On a 64 bit architecture this prevents us from using the
1437 // interesting range of alpha ascii chars. We could do better by emitting
1438 // two bitfields or shifting the range by 64 if no lower chars are used.
1439 if (!DL.fitsInLegalInteger(Max + 1)) {
1440 // Build chain of ORs
1441 // Transform:
1442 // memchr("abcd", C, 4) != nullptr
1443 // to:
1444 // (C == 'a' || C == 'b' || C == 'c' || C == 'd') != 0
1445 std::string SortedStr = Str.str();
1446 llvm::sort(SortedStr);
1447 // Compute the number of of non-contiguous ranges.
1448 unsigned NonContRanges = 1;
1449 for (size_t i = 1; i < SortedStr.size(); ++i) {
1450 if (SortedStr[i] > SortedStr[i - 1] + 1) {
1451 NonContRanges++;
1452 }
1453 }
1454
1455 // Restrict this optimization to profitable cases with one or two range
1456 // checks.
1457 if (NonContRanges > 2)
1458 return nullptr;
1459
1460 // Slice off the character's high end bits.
1461 CharVal = B.CreateTrunc(CharVal, B.getInt8Ty());
1462
1463 SmallVector<Value *> CharCompares;
1464 for (unsigned char C : SortedStr)
1465 CharCompares.push_back(B.CreateICmpEQ(CharVal, B.getInt8(C)));
1466
1467 return B.CreateIntToPtr(B.CreateOr(CharCompares), CI->getType());
1468 }
1469
1470 // For the bit field use a power-of-2 type with at least 8 bits to avoid
1471 // creating unnecessary illegal types.
1472 unsigned char Width = NextPowerOf2(std::max((unsigned char)7, Max));
1473
1474 // Now build the bit field.
1475 APInt Bitfield(Width, 0);
1476 for (char C : Str)
1477 Bitfield.setBit((unsigned char)C);
1478 Value *BitfieldC = B.getInt(Bitfield);
1479
1480 // Adjust width of "C" to the bitfield width, then mask off the high bits.
1481 Value *C = B.CreateZExtOrTrunc(CharVal, BitfieldC->getType());
1482 C = B.CreateAnd(C, B.getIntN(Width, 0xFF));
1483
1484 // First check that the bit field access is within bounds.
1485 Value *Bounds = B.CreateICmp(ICmpInst::ICMP_ULT, C, B.getIntN(Width, Width),
1486 "memchr.bounds");
1487
1488 // Create code that checks if the given bit is set in the field.
1489 Value *Shl = B.CreateShl(B.getIntN(Width, 1ULL), C);
1490 Value *Bits = B.CreateIsNotNull(B.CreateAnd(Shl, BitfieldC), "memchr.bits");
1491
1492 // Finally merge both checks and cast to pointer type. The inttoptr
1493 // implicitly zexts the i1 to intptr type.
1494 return B.CreateIntToPtr(B.CreateLogicalAnd(Bounds, Bits, "memchr"),
1495 CI->getType());
1496}
1497
1498// Optimize a memcmp or, when StrNCmp is true, strncmp call CI with constant
1499// arrays LHS and RHS and nonconstant Size.
1501 Value *Size, bool StrNCmp,
1502 IRBuilderBase &B, const DataLayout &DL) {
1503 if (LHS == RHS) // memcmp(s,s,x) -> 0
1504 return Constant::getNullValue(CI->getType());
1505
1506 StringRef LStr, RStr;
1507 if (!getConstantStringInfo(LHS, LStr, /*TrimAtNul=*/false) ||
1508 !getConstantStringInfo(RHS, RStr, /*TrimAtNul=*/false))
1509 return nullptr;
1510
1511 // If the contents of both constant arrays are known, fold a call to
1512 // memcmp(A, B, N) to
1513 // N <= Pos ? 0 : (A < B ? -1 : B < A ? +1 : 0)
1514 // where Pos is the first mismatch between A and B, determined below.
1515
1516 uint64_t Pos = 0;
1517 Value *Zero = ConstantInt::get(CI->getType(), 0);
1518 for (uint64_t MinSize = std::min(LStr.size(), RStr.size()); ; ++Pos) {
1519 if (Pos == MinSize ||
1520 (StrNCmp && (LStr[Pos] == '\0' && RStr[Pos] == '\0'))) {
1521 // One array is a leading part of the other of equal or greater
1522 // size, or for strncmp, the arrays are equal strings.
1523 // Fold the result to zero. Size is assumed to be in bounds, since
1524 // otherwise the call would be undefined.
1525 return Zero;
1526 }
1527
1528 if (LStr[Pos] != RStr[Pos])
1529 break;
1530 }
1531
1532 // Normalize the result.
1533 typedef unsigned char UChar;
1534 int IRes = UChar(LStr[Pos]) < UChar(RStr[Pos]) ? -1 : 1;
1535 Value *MaxSize = ConstantInt::get(Size->getType(), Pos);
1536 Value *Cmp = B.CreateICmp(ICmpInst::ICMP_ULE, Size, MaxSize);
1537 Value *Res = ConstantInt::getSigned(CI->getType(), IRes);
1538 return B.CreateSelect(Cmp, Zero, Res);
1539}
1540
1541// Optimize a memcmp call CI with constant size Len.
1543 uint64_t Len, IRBuilderBase &B,
1544 const DataLayout &DL) {
1545 if (Len == 0) // memcmp(s1,s2,0) -> 0
1546 return Constant::getNullValue(CI->getType());
1547
1548 // memcmp(S1,S2,1) -> *(unsigned char*)LHS - *(unsigned char*)RHS
1549 if (Len == 1) {
1550 Value *LHSV = B.CreateZExt(B.CreateLoad(B.getInt8Ty(), LHS, "lhsc"),
1551 CI->getType(), "lhsv");
1552 Value *RHSV = B.CreateZExt(B.CreateLoad(B.getInt8Ty(), RHS, "rhsc"),
1553 CI->getType(), "rhsv");
1554 return B.CreateSub(LHSV, RHSV, "chardiff");
1555 }
1556
1557 // memcmp(S1,S2,N/8)==0 -> (*(intN_t*)S1 != *(intN_t*)S2)==0
1558 // TODO: The case where both inputs are constants does not need to be limited
1559 // to legal integers or equality comparison. See block below this.
1560 if (DL.isLegalInteger(Len * 8) && isOnlyUsedInZeroEqualityComparison(CI)) {
1561 IntegerType *IntType = IntegerType::get(CI->getContext(), Len * 8);
1562 Align PrefAlignment = DL.getPrefTypeAlign(IntType);
1563
1564 // First, see if we can fold either argument to a constant.
1565 Value *LHSV = nullptr;
1566 if (auto *LHSC = dyn_cast<Constant>(LHS))
1567 LHSV = ConstantFoldLoadFromConstPtr(LHSC, IntType, DL);
1568
1569 Value *RHSV = nullptr;
1570 if (auto *RHSC = dyn_cast<Constant>(RHS))
1571 RHSV = ConstantFoldLoadFromConstPtr(RHSC, IntType, DL);
1572
1573 // Don't generate unaligned loads. If either source is constant data,
1574 // alignment doesn't matter for that source because there is no load.
1575 if ((LHSV || getKnownAlignment(LHS, DL, CI) >= PrefAlignment) &&
1576 (RHSV || getKnownAlignment(RHS, DL, CI) >= PrefAlignment)) {
1577 if (!LHSV)
1578 LHSV = B.CreateLoad(IntType, LHS, "lhsv");
1579 if (!RHSV)
1580 RHSV = B.CreateLoad(IntType, RHS, "rhsv");
1581 return B.CreateZExt(B.CreateICmpNE(LHSV, RHSV), CI->getType(), "memcmp");
1582 }
1583 }
1584
1585 return nullptr;
1586}
1587
1588// Most simplifications for memcmp also apply to bcmp.
1589Value *LibCallSimplifier::optimizeMemCmpBCmpCommon(CallInst *CI,
1590 IRBuilderBase &B) {
1591 Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1);
1592 Value *Size = CI->getArgOperand(2);
1593
1594 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL);
1595
1596 if (Value *Res = optimizeMemCmpVarSize(CI, LHS, RHS, Size, false, B, DL))
1597 return Res;
1598
1599 // Handle constant Size.
1600 ConstantInt *LenC = dyn_cast<ConstantInt>(Size);
1601 if (!LenC)
1602 return nullptr;
1603
1604 return optimizeMemCmpConstantSize(CI, LHS, RHS, LenC->getZExtValue(), B, DL);
1605}
1606
1607Value *LibCallSimplifier::optimizeMemCmp(CallInst *CI, IRBuilderBase &B) {
1608 Module *M = CI->getModule();
1609 if (Value *V = optimizeMemCmpBCmpCommon(CI, B))
1610 return V;
1611
1612 // memcmp(x, y, Len) == 0 -> bcmp(x, y, Len) == 0
1613 // bcmp can be more efficient than memcmp because it only has to know that
1614 // there is a difference, not how different one is to the other.
1615 if (isLibFuncEmittable(M, TLI, LibFunc_bcmp) &&
1617 Value *LHS = CI->getArgOperand(0);
1618 Value *RHS = CI->getArgOperand(1);
1619 Value *Size = CI->getArgOperand(2);
1620 return copyFlags(*CI, emitBCmp(LHS, RHS, Size, B, DL, TLI));
1621 }
1622
1623 return nullptr;
1624}
1625
1626Value *LibCallSimplifier::optimizeBCmp(CallInst *CI, IRBuilderBase &B) {
1627 return optimizeMemCmpBCmpCommon(CI, B);
1628}
1629
1630Value *LibCallSimplifier::optimizeMemCpy(CallInst *CI, IRBuilderBase &B) {
1631 Value *Size = CI->getArgOperand(2);
1632 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL);
1633 if (isa<IntrinsicInst>(CI))
1634 return nullptr;
1635
1636 // memcpy(x, y, n) -> llvm.memcpy(align 1 x, align 1 y, n)
1637 CallInst *NewCI = B.CreateMemCpy(CI->getArgOperand(0), Align(1),
1638 CI->getArgOperand(1), Align(1), Size);
1639 mergeAttributesAndFlags(NewCI, *CI);
1640 return CI->getArgOperand(0);
1641}
1642
1643Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilderBase &B) {
1644 Value *Dst = CI->getArgOperand(0);
1645 Value *Src = CI->getArgOperand(1);
1646 ConstantInt *StopChar = dyn_cast<ConstantInt>(CI->getArgOperand(2));
1647 ConstantInt *N = dyn_cast<ConstantInt>(CI->getArgOperand(3));
1648 StringRef SrcStr;
1649 if (CI->use_empty() && Dst == Src)
1650 return Dst;
1651 // memccpy(d, s, c, 0) -> nullptr
1652 if (N) {
1653 if (N->isNullValue())
1654 return Constant::getNullValue(CI->getType());
1655 if (!getConstantStringInfo(Src, SrcStr, /*TrimAtNul=*/false) ||
1656 // TODO: Handle zeroinitializer.
1657 !StopChar)
1658 return nullptr;
1659 } else {
1660 return nullptr;
1661 }
1662
1663 // Wrap arg 'c' of type int to char
1664 size_t Pos = SrcStr.find(StopChar->getSExtValue() & 0xFF);
1665 if (Pos == StringRef::npos) {
1666 if (N->getZExtValue() <= SrcStr.size()) {
1667 copyFlags(*CI, B.CreateMemCpy(Dst, Align(1), Src, Align(1),
1668 CI->getArgOperand(3)));
1669 return Constant::getNullValue(CI->getType());
1670 }
1671 return nullptr;
1672 }
1673
1674 Value *NewN =
1675 ConstantInt::get(N->getType(), std::min(uint64_t(Pos + 1), N->getZExtValue()));
1676 // memccpy -> llvm.memcpy
1677 copyFlags(*CI, B.CreateMemCpy(Dst, Align(1), Src, Align(1), NewN));
1678 return Pos + 1 <= N->getZExtValue()
1679 ? B.CreateInBoundsGEP(B.getInt8Ty(), Dst, NewN)
1681}
1682
1683Value *LibCallSimplifier::optimizeMemPCpy(CallInst *CI, IRBuilderBase &B) {
1684 Value *Dst = CI->getArgOperand(0);
1685 Value *N = CI->getArgOperand(2);
1686 // mempcpy(x, y, n) -> llvm.memcpy(align 1 x, align 1 y, n), x + n
1687 CallInst *NewCI =
1688 B.CreateMemCpy(Dst, Align(1), CI->getArgOperand(1), Align(1), N);
1689 // Propagate attributes, but memcpy has no return value, so make sure that
1690 // any return attributes are compliant.
1691 // TODO: Attach return value attributes to the 1st operand to preserve them?
1692 mergeAttributesAndFlags(NewCI, *CI);
1693 return B.CreateInBoundsGEP(B.getInt8Ty(), Dst, N);
1694}
1695
1696Value *LibCallSimplifier::optimizeMemMove(CallInst *CI, IRBuilderBase &B) {
1697 Value *Size = CI->getArgOperand(2);
1698 annotateNonNullAndDereferenceable(CI, {0, 1}, Size, DL);
1699 if (isa<IntrinsicInst>(CI))
1700 return nullptr;
1701
1702 // memmove(x, y, n) -> llvm.memmove(align 1 x, align 1 y, n)
1703 CallInst *NewCI = B.CreateMemMove(CI->getArgOperand(0), Align(1),
1704 CI->getArgOperand(1), Align(1), Size);
1705 mergeAttributesAndFlags(NewCI, *CI);
1706 return CI->getArgOperand(0);
1707}
1708
1709Value *LibCallSimplifier::optimizeMemSet(CallInst *CI, IRBuilderBase &B) {
1710 Value *Size = CI->getArgOperand(2);
1712 if (isa<IntrinsicInst>(CI))
1713 return nullptr;
1714
1715 // memset(p, v, n) -> llvm.memset(align 1 p, v, n)
1716 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false);
1717 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, Size, Align(1));
1718 mergeAttributesAndFlags(NewCI, *CI);
1719 return CI->getArgOperand(0);
1720}
1721
1722Value *LibCallSimplifier::optimizeRealloc(CallInst *CI, IRBuilderBase &B) {
1724 return copyFlags(*CI, emitMalloc(CI->getArgOperand(1), B, DL, TLI));
1725
1726 return nullptr;
1727}
1728
1729// Optionally allow optimization of nobuiltin calls to operator new and its
1730// variants.
1731Value *LibCallSimplifier::maybeOptimizeNoBuiltinOperatorNew(CallInst *CI,
1732 IRBuilderBase &B) {
1733 if (!OptimizeHotColdNew)
1734 return nullptr;
1736 if (!Callee)
1737 return nullptr;
1738 LibFunc Func;
1739 if (!TLI->getLibFunc(*Callee, Func))
1740 return nullptr;
1741 switch (Func) {
1742 case LibFunc_Znwm:
1743 case LibFunc_ZnwmRKSt9nothrow_t:
1744 case LibFunc_ZnwmSt11align_val_t:
1745 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1746 case LibFunc_Znam:
1747 case LibFunc_ZnamRKSt9nothrow_t:
1748 case LibFunc_ZnamSt11align_val_t:
1749 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1750 case LibFunc_size_returning_new:
1751 case LibFunc_size_returning_new_aligned:
1752 // By default normal operator new calls (not already passing a hot_cold_t
1753 // parameter) are not mutated if the call is not marked builtin. Optionally
1754 // enable that in cases where it is known to be safe.
1756 return nullptr;
1757 break;
1758 case LibFunc_Znwm12__hot_cold_t:
1759 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1760 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1761 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1762 case LibFunc_Znam12__hot_cold_t:
1763 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1764 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1765 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1766 case LibFunc_size_returning_new_hot_cold:
1767 case LibFunc_size_returning_new_aligned_hot_cold:
1768 // If the nobuiltin call already passes a hot_cold_t parameter, allow update
1769 // of that parameter when enabled.
1771 return nullptr;
1772 break;
1773 default:
1774 return nullptr;
1775 }
1776 return optimizeNew(CI, B, Func);
1777}
1778
1779// When enabled, replace operator new() calls marked with a hot or cold memprof
1780// attribute with an operator new() call that takes a __hot_cold_t parameter.
1781// Currently this is supported by the open source version of tcmalloc, see:
1782// https://github.com/google/tcmalloc/blob/master/tcmalloc/new_extension.h
1783Value *LibCallSimplifier::optimizeNew(CallInst *CI, IRBuilderBase &B,
1784 LibFunc &Func) {
1785 if (!OptimizeHotColdNew)
1786 return nullptr;
1787
1788 uint8_t HotCold;
1789 if (CI->getAttributes().getFnAttr("memprof").getValueAsString() == "cold")
1790 HotCold = ColdNewHintValue;
1791 else if (CI->getAttributes().getFnAttr("memprof").getValueAsString() ==
1792 "notcold")
1793 HotCold = NotColdNewHintValue;
1794 else if (CI->getAttributes().getFnAttr("memprof").getValueAsString() == "hot")
1795 HotCold = HotNewHintValue;
1796 else if (CI->getAttributes().getFnAttr("memprof").getValueAsString() ==
1797 "ambiguous")
1798 HotCold = AmbiguousNewHintValue;
1799 else
1800 return nullptr;
1801
1802 // For calls that already pass a hot/cold hint, only update the hint if
1803 // directed by OptimizeExistingHotColdNew. For other calls to new, add a hint
1804 // if cold or hot, and leave as-is for default handling if "notcold" aka warm.
1805 // Note that in cases where we decide it is "notcold", it might be slightly
1806 // better to replace the hinted call with a non hinted call, to avoid the
1807 // extra parameter and the if condition check of the hint value in the
1808 // allocator. This can be considered in the future.
1809 Value *NewCall = nullptr;
1810 switch (Func) {
1811 case LibFunc_Znwm12__hot_cold_t:
1813 NewCall = emitHotColdNew(CI->getArgOperand(0), B, TLI,
1814 LibFunc_Znwm12__hot_cold_t, HotCold);
1815 break;
1816 case LibFunc_Znwm:
1817 NewCall = emitHotColdNew(CI->getArgOperand(0), B, TLI,
1818 LibFunc_Znwm12__hot_cold_t, HotCold);
1819 break;
1820 case LibFunc_Znam12__hot_cold_t:
1822 NewCall = emitHotColdNew(CI->getArgOperand(0), B, TLI,
1823 LibFunc_Znam12__hot_cold_t, HotCold);
1824 break;
1825 case LibFunc_Znam:
1826 NewCall = emitHotColdNew(CI->getArgOperand(0), B, TLI,
1827 LibFunc_Znam12__hot_cold_t, HotCold);
1828 break;
1829 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
1831 NewCall = emitHotColdNewNoThrow(
1832 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1833 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotCold);
1834 break;
1835 case LibFunc_ZnwmRKSt9nothrow_t:
1836 NewCall = emitHotColdNewNoThrow(
1837 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1838 LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t, HotCold);
1839 break;
1840 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
1842 NewCall = emitHotColdNewNoThrow(
1843 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1844 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotCold);
1845 break;
1846 case LibFunc_ZnamRKSt9nothrow_t:
1847 NewCall = emitHotColdNewNoThrow(
1848 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1849 LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t, HotCold);
1850 break;
1851 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
1853 NewCall = emitHotColdNewAligned(
1854 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1855 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotCold);
1856 break;
1857 case LibFunc_ZnwmSt11align_val_t:
1858 NewCall = emitHotColdNewAligned(
1859 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1860 LibFunc_ZnwmSt11align_val_t12__hot_cold_t, HotCold);
1861 break;
1862 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
1864 NewCall = emitHotColdNewAligned(
1865 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1866 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotCold);
1867 break;
1868 case LibFunc_ZnamSt11align_val_t:
1869 NewCall = emitHotColdNewAligned(
1870 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1871 LibFunc_ZnamSt11align_val_t12__hot_cold_t, HotCold);
1872 break;
1873 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1876 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B,
1877 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1878 HotCold);
1879 break;
1880 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
1882 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B,
1883 TLI, LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t, HotCold);
1884 break;
1885 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
1888 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B,
1889 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t,
1890 HotCold);
1891 break;
1892 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
1894 CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), B,
1895 TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t, HotCold);
1896 break;
1897 case LibFunc_size_returning_new:
1898 NewCall = emitHotColdSizeReturningNew(CI->getArgOperand(0), B, TLI,
1899 LibFunc_size_returning_new_hot_cold,
1900 HotCold);
1901 break;
1902 case LibFunc_size_returning_new_hot_cold:
1904 NewCall = emitHotColdSizeReturningNew(CI->getArgOperand(0), B, TLI,
1905 LibFunc_size_returning_new_hot_cold,
1906 HotCold);
1907 break;
1908 case LibFunc_size_returning_new_aligned:
1910 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1911 LibFunc_size_returning_new_aligned_hot_cold, HotCold);
1912 break;
1913 case LibFunc_size_returning_new_aligned_hot_cold:
1916 CI->getArgOperand(0), CI->getArgOperand(1), B, TLI,
1917 LibFunc_size_returning_new_aligned_hot_cold, HotCold);
1918 break;
1919 default:
1920 return nullptr;
1921 }
1922
1923 if (auto *NewCI = dyn_cast_or_null<Instruction>(NewCall))
1924 NewCI->copyMetadata(*CI);
1925
1926 return NewCall;
1927}
1928
1929//===----------------------------------------------------------------------===//
1930// Math Library Optimizations
1931//===----------------------------------------------------------------------===//
1932
1933// Replace a libcall \p CI with a call to intrinsic \p IID
1935 Intrinsic::ID IID) {
1936 CallInst *NewCall = B.CreateUnaryIntrinsic(IID, CI->getArgOperand(0), CI);
1937 NewCall->takeName(CI);
1938 return copyFlags(*CI, NewCall);
1939}
1940
1941/// Return a variant of Val with float type.
1942/// Currently this works in two cases: If Val is an FPExtension of a float
1943/// value to something bigger, simply return the operand.
1944/// If Val is a ConstantFP but can be converted to a float ConstantFP without
1945/// loss of precision do so.
1947 if (FPExtInst *Cast = dyn_cast<FPExtInst>(Val)) {
1948 Value *Op = Cast->getOperand(0);
1949 if (Op->getType()->isFloatTy())
1950 return Op;
1951 }
1952 if (ConstantFP *Const = dyn_cast<ConstantFP>(Val)) {
1953 APFloat F = Const->getValueAPF();
1954 bool losesInfo;
1956 &losesInfo);
1957 if (!losesInfo)
1958 return ConstantFP::get(Const->getContext(), F);
1959 }
1960 return nullptr;
1961}
1962
1963/// Shrink double -> float functions.
1965 bool isBinary, const TargetLibraryInfo *TLI,
1966 bool isPrecise = false) {
1967 Function *CalleeFn = CI->getCalledFunction();
1968 if (!CI->getType()->isDoubleTy() || !CalleeFn)
1969 return nullptr;
1970
1971 // If not all the uses of the function are converted to float, then bail out.
1972 // This matters if the precision of the result is more important than the
1973 // precision of the arguments.
1974 if (isPrecise)
1975 for (User *U : CI->users()) {
1977 if (!Cast || !Cast->getType()->isFloatTy())
1978 return nullptr;
1979 }
1980
1981 // If this is something like 'g((double) float)', convert to 'gf(float)'.
1982 Value *V[2];
1984 V[1] = isBinary ? valueHasFloatPrecision(CI->getArgOperand(1)) : nullptr;
1985 if (!V[0] || (isBinary && !V[1]))
1986 return nullptr;
1987
1988 // If call isn't an intrinsic, check that it isn't within a function with the
1989 // same name as the float version of this call, otherwise the result is an
1990 // infinite loop. For example, from MinGW-w64:
1991 //
1992 // float expf(float val) { return (float) exp((double) val); }
1993 StringRef CalleeName = CalleeFn->getName();
1994 bool IsIntrinsic = CalleeFn->isIntrinsic();
1995 if (!IsIntrinsic) {
1996 StringRef CallerName = CI->getFunction()->getName();
1997 if (CallerName.ends_with('f') &&
1998 CallerName.size() == (CalleeName.size() + 1) &&
1999 CallerName.starts_with(CalleeName))
2000 return nullptr;
2001 }
2002
2003 // Propagate the math semantics from the current function to the new function.
2005 B.setFastMathFlags(CI->getFastMathFlags());
2006
2007 // g((double) float) -> (double) gf(float)
2008 Value *R;
2009 if (IsIntrinsic) {
2010 Intrinsic::ID IID = CalleeFn->getIntrinsicID();
2011 R = isBinary ? B.CreateIntrinsic(IID, B.getFloatTy(), V)
2012 : B.CreateIntrinsic(IID, B.getFloatTy(), V[0]);
2013 } else {
2014 AttributeList CalleeAttrs = CalleeFn->getAttributes();
2015 R = isBinary ? emitBinaryFloatFnCall(V[0], V[1], TLI, CalleeName, B,
2016 CalleeAttrs)
2017 : emitUnaryFloatFnCall(V[0], TLI, CalleeName, B, CalleeAttrs);
2018 }
2019 return B.CreateFPExt(R, B.getDoubleTy());
2020}
2021
2022/// Shrink double -> float for unary functions.
2024 const TargetLibraryInfo *TLI,
2025 bool isPrecise = false) {
2026 return optimizeDoubleFP(CI, B, false, TLI, isPrecise);
2027}
2028
2029/// Shrink double -> float for binary functions.
2031 const TargetLibraryInfo *TLI,
2032 bool isPrecise = false) {
2033 return optimizeDoubleFP(CI, B, true, TLI, isPrecise);
2034}
2035
2036// cabs(z) -> sqrt((creal(z)*creal(z)) + (cimag(z)*cimag(z)))
2037Value *LibCallSimplifier::optimizeCAbs(CallInst *CI, IRBuilderBase &B) {
2038 Value *Real, *Imag;
2039
2040 if (CI->arg_size() == 1) {
2041
2042 if (!CI->isFast())
2043 return nullptr;
2044
2045 Value *Op = CI->getArgOperand(0);
2046 assert(Op->getType()->isArrayTy() && "Unexpected signature for cabs!");
2047
2048 Real = B.CreateExtractValue(Op, 0, "real");
2049 Imag = B.CreateExtractValue(Op, 1, "imag");
2050
2051 } else {
2052 assert(CI->arg_size() == 2 && "Unexpected signature for cabs!");
2053
2054 Real = CI->getArgOperand(0);
2055 Imag = CI->getArgOperand(1);
2056
2057 // if real or imaginary part is zero, simplify to abs(cimag(z))
2058 // or abs(creal(z))
2059 Value *AbsOp = nullptr;
2060 if (ConstantFP *ConstReal = dyn_cast<ConstantFP>(Real)) {
2061 if (ConstReal->isZero())
2062 AbsOp = Imag;
2063
2064 } else if (ConstantFP *ConstImag = dyn_cast<ConstantFP>(Imag)) {
2065 if (ConstImag->isZero())
2066 AbsOp = Real;
2067 }
2068
2069 if (AbsOp)
2070 return copyFlags(
2071 *CI, B.CreateUnaryIntrinsic(Intrinsic::fabs, AbsOp, CI, "cabs"));
2072
2073 if (!CI->isFast())
2074 return nullptr;
2075 }
2076
2077 // Propagate fast-math flags from the existing call to new instructions.
2078 Value *RealReal = B.CreateFMulFMF(Real, Real, CI);
2079 Value *ImagImag = B.CreateFMulFMF(Imag, Imag, CI);
2080 return copyFlags(
2081 *CI, B.CreateUnaryIntrinsic(Intrinsic::sqrt,
2082 B.CreateFAddFMF(RealReal, ImagImag, CI), CI,
2083 "cabs"));
2084}
2085
2086// Return a properly extended integer (DstWidth bits wide) if the operation is
2087// an itofp.
2088static Value *getIntToFPVal(Value *I2F, IRBuilderBase &B, unsigned DstWidth) {
2089 if (isa<SIToFPInst>(I2F) || isa<UIToFPInst>(I2F)) {
2090 Value *Op = cast<Instruction>(I2F)->getOperand(0);
2091 // Make sure that the exponent fits inside an "int" of size DstWidth,
2092 // thus avoiding any range issues that FP has not.
2093 unsigned BitWidth = Op->getType()->getScalarSizeInBits();
2094 if (BitWidth < DstWidth || (BitWidth == DstWidth && isa<SIToFPInst>(I2F))) {
2095 Type *IntTy = Op->getType()->getWithNewBitWidth(DstWidth);
2096 return isa<SIToFPInst>(I2F) ? B.CreateSExt(Op, IntTy)
2097 : B.CreateZExt(Op, IntTy);
2098 }
2099 }
2100
2101 return nullptr;
2102}
2103
2104/// Use exp{,2}(x * y) for pow(exp{,2}(x), y);
2105/// ldexp(1.0, x) for pow(2.0, itofp(x)); exp2(n * x) for pow(2.0 ** n, x);
2106/// exp10(x) for pow(10.0, x); exp2(log2(n) * x) for pow(n, x).
2107Value *LibCallSimplifier::replacePowWithExp(CallInst *Pow, IRBuilderBase &B) {
2108 Module *M = Pow->getModule();
2109 Value *Base = Pow->getArgOperand(0), *Expo = Pow->getArgOperand(1);
2110 Type *Ty = Pow->getType();
2111 bool Ignored;
2112
2113 // Evaluate special cases related to a nested function as the base.
2114
2115 // pow(exp(x), y) -> exp(x * y)
2116 // pow(exp2(x), y) -> exp2(x * y)
2117 // If exp{,2}() is used only once, it is better to fold two transcendental
2118 // math functions into one. If used again, exp{,2}() would still have to be
2119 // called with the original argument, then keep both original transcendental
2120 // functions. However, this transformation is only safe with fully relaxed
2121 // math semantics, since, besides rounding differences, it changes overflow
2122 // and underflow behavior quite dramatically. For example:
2123 // pow(exp(1000), 0.001) = pow(inf, 0.001) = inf
2124 // Whereas:
2125 // exp(1000 * 0.001) = exp(1)
2126 // TODO: Loosen the requirement for fully relaxed math semantics.
2127 // TODO: Handle exp10() when more targets have it available.
2128 CallInst *BaseFn = dyn_cast<CallInst>(Base);
2129 if (BaseFn && BaseFn->hasOneUse() && BaseFn->isFast() && Pow->isFast()) {
2130 LibFunc LibFn;
2131
2132 Function *CalleeFn = BaseFn->getCalledFunction();
2133 if (CalleeFn && TLI->getLibFunc(CalleeFn->getName(), LibFn) &&
2134 isLibFuncEmittable(M, TLI, LibFn)) {
2135 StringRef ExpName;
2137 Value *ExpFn;
2138 LibFunc LibFnFloat, LibFnDouble, LibFnLongDouble;
2139
2140 switch (LibFn) {
2141 default:
2142 return nullptr;
2143 case LibFunc_expf:
2144 case LibFunc_exp:
2145 case LibFunc_expl:
2146 ExpName = TLI->getName(LibFunc_exp);
2147 ID = Intrinsic::exp;
2148 LibFnFloat = LibFunc_expf;
2149 LibFnDouble = LibFunc_exp;
2150 LibFnLongDouble = LibFunc_expl;
2151 break;
2152 case LibFunc_exp2f:
2153 case LibFunc_exp2:
2154 case LibFunc_exp2l:
2155 ExpName = TLI->getName(LibFunc_exp2);
2156 ID = Intrinsic::exp2;
2157 LibFnFloat = LibFunc_exp2f;
2158 LibFnDouble = LibFunc_exp2;
2159 LibFnLongDouble = LibFunc_exp2l;
2160 break;
2161 }
2162
2163 // Create new exp{,2}() with the product as its argument.
2164 Value *FMul = B.CreateFMul(BaseFn->getArgOperand(0), Expo, "mul");
2165 ExpFn = BaseFn->doesNotAccessMemory()
2166 ? B.CreateUnaryIntrinsic(ID, FMul, nullptr, ExpName)
2167 : emitUnaryFloatFnCall(FMul, TLI, LibFnDouble, LibFnFloat,
2168 LibFnLongDouble, B,
2169 BaseFn->getAttributes());
2170
2171 // Since the new exp{,2}() is different from the original one, dead code
2172 // elimination cannot be trusted to remove it, since it may have side
2173 // effects (e.g., errno). When the only consumer for the original
2174 // exp{,2}() is pow(), then it has to be explicitly erased.
2175 substituteInParent(BaseFn, ExpFn);
2176 return ExpFn;
2177 }
2178 }
2179
2180 // Evaluate special cases related to a constant base.
2181
2182 const APFloat *BaseF;
2183 if (!match(Base, m_APFloat(BaseF)))
2184 return nullptr;
2185
2186 AttributeList NoAttrs; // Attributes are only meaningful on the original call
2187
2188 const bool UseIntrinsic = Pow->doesNotAccessMemory();
2189
2190 // pow(2.0, itofp(x)) -> ldexp(1.0, x)
2191 if ((UseIntrinsic || !Ty->isVectorTy()) && BaseF->isExactlyValue(2.0) &&
2192 (isa<SIToFPInst>(Expo) || isa<UIToFPInst>(Expo)) &&
2193 (UseIntrinsic ||
2194 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2195
2196 // TODO: Shouldn't really need to depend on getIntToFPVal for intrinsic. Can
2197 // just directly use the original integer type.
2198 if (Value *ExpoI = getIntToFPVal(Expo, B, TLI->getIntSize())) {
2199 Constant *One = ConstantFP::get(Ty, 1.0);
2200
2201 if (UseIntrinsic) {
2202 return copyFlags(*Pow, B.CreateIntrinsic(Intrinsic::ldexp,
2203 {Ty, ExpoI->getType()},
2204 {One, ExpoI}, Pow, "exp2"));
2205 }
2206
2207 return copyFlags(*Pow, emitBinaryFloatFnCall(
2208 One, ExpoI, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2209 LibFunc_ldexpl, B, NoAttrs));
2210 }
2211 }
2212
2213 // pow(2.0 ** n, x) -> exp2(n * x)
2214 if (hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f, LibFunc_exp2l)) {
2215 APFloat BaseR = APFloat(1.0);
2216 BaseR.convert(BaseF->getSemantics(), APFloat::rmTowardZero, &Ignored);
2217 BaseR = BaseR / *BaseF;
2218 bool IsInteger = BaseF->isInteger(), IsReciprocal = BaseR.isInteger();
2219 const APFloat *NF = IsReciprocal ? &BaseR : BaseF;
2220 APSInt NI(64, false);
2221 if ((IsInteger || IsReciprocal) &&
2222 NF->convertToInteger(NI, APFloat::rmTowardZero, &Ignored) ==
2223 APFloat::opOK &&
2224 NI > 1 && NI.isPowerOf2()) {
2225 double N = NI.logBase2() * (IsReciprocal ? -1.0 : 1.0);
2226 Value *FMul = B.CreateFMul(Expo, ConstantFP::get(Ty, N), "mul");
2227 if (Pow->doesNotAccessMemory())
2228 return copyFlags(*Pow, B.CreateUnaryIntrinsic(Intrinsic::exp2, FMul,
2229 nullptr, "exp2"));
2230 else
2231 return copyFlags(*Pow, emitUnaryFloatFnCall(FMul, TLI, LibFunc_exp2,
2232 LibFunc_exp2f,
2233 LibFunc_exp2l, B, NoAttrs));
2234 }
2235 }
2236
2237 // pow(10.0, x) -> exp10(x)
2238 if (BaseF->isExactlyValue(10.0) &&
2239 hasFloatFn(M, TLI, Ty, LibFunc_exp10, LibFunc_exp10f, LibFunc_exp10l)) {
2240
2241 if (Pow->doesNotAccessMemory()) {
2242 CallInst *NewExp10 =
2243 B.CreateIntrinsic(Intrinsic::exp10, {Ty}, {Expo}, Pow, "exp10");
2244 return copyFlags(*Pow, NewExp10);
2245 }
2246
2247 return copyFlags(*Pow, emitUnaryFloatFnCall(Expo, TLI, LibFunc_exp10,
2248 LibFunc_exp10f, LibFunc_exp10l,
2249 B, NoAttrs));
2250 }
2251
2252 // pow(x, y) -> exp2(log2(x) * y)
2253 if (Pow->hasApproxFunc() && Pow->hasNoNaNs() && BaseF->isFiniteNonZero() &&
2254 !BaseF->isNegative()) {
2255 // pow(1, inf) is defined to be 1 but exp2(log2(1) * inf) evaluates to NaN.
2256 // Luckily optimizePow has already handled the x == 1 case.
2257 assert(!match(Base, m_FPOne()) &&
2258 "pow(1.0, y) should have been simplified earlier!");
2259
2260 Value *Log = nullptr;
2261 if (Ty->isFloatTy())
2262 Log = ConstantFP::get(Ty, std::log2(BaseF->convertToFloat()));
2263 else if (Ty->isDoubleTy())
2264 Log = ConstantFP::get(Ty, std::log2(BaseF->convertToDouble()));
2265
2266 if (Log) {
2267 Value *FMul = B.CreateFMul(Log, Expo, "mul");
2268 if (Pow->doesNotAccessMemory())
2269 return copyFlags(*Pow, B.CreateUnaryIntrinsic(Intrinsic::exp2, FMul,
2270 nullptr, "exp2"));
2271 else if (hasFloatFn(M, TLI, Ty, LibFunc_exp2, LibFunc_exp2f,
2272 LibFunc_exp2l))
2273 return copyFlags(*Pow, emitUnaryFloatFnCall(FMul, TLI, LibFunc_exp2,
2274 LibFunc_exp2f,
2275 LibFunc_exp2l, B, NoAttrs));
2276 }
2277 }
2278
2279 return nullptr;
2280}
2281
2282static Value *getSqrtCall(Value *V, AttributeList Attrs, bool NoErrno,
2283 Module *M, IRBuilderBase &B,
2284 const TargetLibraryInfo *TLI) {
2285 // If errno is never set, then use the intrinsic for sqrt().
2286 if (NoErrno)
2287 return B.CreateUnaryIntrinsic(Intrinsic::sqrt, V, nullptr, "sqrt");
2288
2289 // Otherwise, use the libcall for sqrt().
2290 if (hasFloatFn(M, TLI, V->getType(), LibFunc_sqrt, LibFunc_sqrtf,
2291 LibFunc_sqrtl))
2292 // TODO: We also should check that the target can in fact lower the sqrt()
2293 // libcall. We currently have no way to ask this question, so we ask if
2294 // the target has a sqrt() libcall, which is not exactly the same.
2295 return emitUnaryFloatFnCall(V, TLI, LibFunc_sqrt, LibFunc_sqrtf,
2296 LibFunc_sqrtl, B, Attrs);
2297
2298 return nullptr;
2299}
2300
2301/// Use square root in place of pow(x, +/-0.5).
2302Value *LibCallSimplifier::replacePowWithSqrt(CallInst *Pow, IRBuilderBase &B) {
2303 Value *Sqrt, *Base = Pow->getArgOperand(0), *Expo = Pow->getArgOperand(1);
2304 Module *Mod = Pow->getModule();
2305 Type *Ty = Pow->getType();
2306
2307 const APFloat *ExpoF;
2308 if (!match(Expo, m_APFloat(ExpoF)) ||
2309 (!ExpoF->isExactlyValue(0.5) && !ExpoF->isExactlyValue(-0.5)))
2310 return nullptr;
2311
2312 // Converting pow(X, -0.5) to 1/sqrt(X) may introduce an extra rounding step,
2313 // so that requires fast-math-flags (afn or reassoc).
2314 if (ExpoF->isNegative() && (!Pow->hasApproxFunc() && !Pow->hasAllowReassoc()))
2315 return nullptr;
2316
2317 // If we have a pow() library call (accesses memory) and we can't guarantee
2318 // that the base is not an infinity, give up:
2319 // pow(-Inf, 0.5) is optionally required to have a result of +Inf (not setting
2320 // errno), but sqrt(-Inf) is required by various standards to set errno.
2321 if (!Pow->doesNotAccessMemory() && !Pow->hasNoInfs() &&
2323 Base, SimplifyQuery(DL, TLI, DT, AC, Pow, true, true, DC)))
2324 return nullptr;
2325
2326 Sqrt = getSqrtCall(Base, AttributeList(), Pow->doesNotAccessMemory(), Mod, B,
2327 TLI);
2328 if (!Sqrt)
2329 return nullptr;
2330
2331 // Handle signed zero base by expanding to fabs(sqrt(x)).
2332 if (!Pow->hasNoSignedZeros())
2333 Sqrt = B.CreateUnaryIntrinsic(Intrinsic::fabs, Sqrt, nullptr, "abs");
2334
2335 Sqrt = copyFlags(*Pow, Sqrt);
2336
2337 // Handle non finite base by expanding to
2338 // (x == -infinity ? +infinity : sqrt(x)).
2339 if (!Pow->hasNoInfs()) {
2340 Value *PosInf = ConstantFP::getInfinity(Ty),
2341 *NegInf = ConstantFP::getInfinity(Ty, true);
2342 Value *FCmp = B.CreateFCmpOEQ(Base, NegInf, "isinf");
2343 Sqrt = B.CreateSelect(FCmp, PosInf, Sqrt);
2344 }
2345
2346 // If the exponent is negative, then get the reciprocal.
2347 if (ExpoF->isNegative())
2348 Sqrt = B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt, "reciprocal");
2349
2350 return Sqrt;
2351}
2352
2354 IRBuilderBase &B) {
2355 Value *Args[] = {Base, Expo};
2356 Type *Types[] = {Base->getType(), Expo->getType()};
2357 return B.CreateIntrinsic(Intrinsic::powi, Types, Args);
2358}
2359
2360Value *LibCallSimplifier::optimizePow(CallInst *Pow, IRBuilderBase &B) {
2361 Value *Base = Pow->getArgOperand(0);
2362 Value *Expo = Pow->getArgOperand(1);
2364 StringRef Name = Callee->getName();
2365 Type *Ty = Pow->getType();
2366 Module *M = Pow->getModule();
2367 bool AllowApprox = Pow->hasApproxFunc();
2368 bool Ignored;
2369
2370 // Propagate the math semantics from the call to any created instructions.
2371 IRBuilderBase::FastMathFlagGuard Guard(B);
2372 B.setFastMathFlags(Pow->getFastMathFlags());
2373 // Evaluate special cases related to the base.
2374
2375 // pow(1.0, x) -> 1.0
2376 if (match(Base, m_FPOne()))
2377 return Base;
2378
2379 if (Value *Exp = replacePowWithExp(Pow, B))
2380 return Exp;
2381
2382 // Evaluate special cases related to the exponent.
2383
2384 // pow(x, -1.0) -> 1.0 / x
2385 if (match(Expo, m_SpecificFP(-1.0)))
2386 return B.CreateFDiv(ConstantFP::get(Ty, 1.0), Base, "reciprocal");
2387
2388 // pow(x, +/-0.0) -> 1.0
2389 if (match(Expo, m_AnyZeroFP()))
2390 return ConstantFP::get(Ty, 1.0);
2391
2392 // pow(x, 1.0) -> x
2393 if (match(Expo, m_FPOne()))
2394 return Base;
2395
2396 // pow(x, 2.0) -> x * x
2397 if (match(Expo, m_SpecificFP(2.0)))
2398 return B.CreateFMul(Base, Base, "square");
2399
2400 if (Value *Sqrt = replacePowWithSqrt(Pow, B))
2401 return Sqrt;
2402
2403 // If we can approximate pow:
2404 // pow(x, n) -> powi(x, n) * sqrt(x) if n has exactly a 0.5 fraction
2405 // pow(x, n) -> powi(x, n) if n is a constant signed integer value
2406 const APFloat *ExpoF;
2407 if (AllowApprox && match(Expo, m_APFloat(ExpoF)) &&
2408 !ExpoF->isExactlyValue(0.5) && !ExpoF->isExactlyValue(-0.5)) {
2409 APFloat ExpoA(abs(*ExpoF));
2410 APFloat ExpoI(*ExpoF);
2411 Value *Sqrt = nullptr;
2412 if (!ExpoA.isInteger()) {
2413 APFloat Expo2 = ExpoA;
2414 // To check if ExpoA is an integer + 0.5, we add it to itself. If there
2415 // is no floating point exception and the result is an integer, then
2416 // ExpoA == integer + 0.5
2417 if (Expo2.add(ExpoA, APFloat::rmNearestTiesToEven) != APFloat::opOK)
2418 return nullptr;
2419
2420 if (!Expo2.isInteger())
2421 return nullptr;
2422
2423 if (ExpoI.roundToIntegral(APFloat::rmTowardNegative) !=
2425 return nullptr;
2426 if (!ExpoI.isInteger())
2427 return nullptr;
2428 ExpoF = &ExpoI;
2429
2430 Sqrt = getSqrtCall(Base, AttributeList(), Pow->doesNotAccessMemory(), M,
2431 B, TLI);
2432 if (!Sqrt)
2433 return nullptr;
2434 }
2435
2436 // 0.5 fraction is now optionally handled.
2437 // Do pow -> powi for remaining integer exponent
2438 APSInt IntExpo(TLI->getIntSize(), /*isUnsigned=*/false);
2439 if (ExpoF->isInteger() &&
2440 ExpoF->convertToInteger(IntExpo, APFloat::rmTowardZero, &Ignored) ==
2441 APFloat::opOK) {
2442 Value *PowI = copyFlags(
2443 *Pow,
2445 Base, ConstantInt::get(B.getIntNTy(TLI->getIntSize()), IntExpo),
2446 M, B));
2447
2448 if (PowI && Sqrt)
2449 return B.CreateFMul(PowI, Sqrt);
2450
2451 return PowI;
2452 }
2453 }
2454
2455 // powf(x, itofp(y)) -> powi(x, y)
2456 if (AllowApprox && (isa<SIToFPInst>(Expo) || isa<UIToFPInst>(Expo))) {
2457 if (Value *ExpoI = getIntToFPVal(Expo, B, TLI->getIntSize()))
2458 return copyFlags(*Pow, createPowWithIntegerExponent(Base, ExpoI, M, B));
2459 }
2460
2461 // Shrink pow() to powf() if the arguments are single precision,
2462 // unless the result is expected to be double precision.
2463 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) &&
2464 hasFloatVersion(M, Name)) {
2465 if (Value *Shrunk = optimizeBinaryDoubleFP(Pow, B, TLI, true))
2466 return Shrunk;
2467 }
2468
2469 return nullptr;
2470}
2471
2472Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) {
2473 Module *M = CI->getModule();
2475 StringRef Name = Callee->getName();
2476 Value *Ret = nullptr;
2477 if (UnsafeFPShrink && Name == TLI->getName(LibFunc_exp2) &&
2478 hasFloatVersion(M, Name))
2479 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true);
2480
2481 // If we have an llvm.exp2 intrinsic, emit the llvm.ldexp intrinsic. If we
2482 // have the libcall, emit the libcall.
2483 //
2484 // TODO: In principle we should be able to just always use the intrinsic for
2485 // any doesNotAccessMemory callsite.
2486
2487 const bool UseIntrinsic = Callee->isIntrinsic();
2488 // Bail out for vectors because the code below only expects scalars.
2489 Type *Ty = CI->getType();
2490 if (!UseIntrinsic && Ty->isVectorTy())
2491 return Ret;
2492
2493 // exp2(sitofp(x)) -> ldexp(1.0, sext(x)) if sizeof(x) <= IntSize
2494 // exp2(uitofp(x)) -> ldexp(1.0, zext(x)) if sizeof(x) < IntSize
2495 Value *Op = CI->getArgOperand(0);
2496 if ((isa<SIToFPInst>(Op) || isa<UIToFPInst>(Op)) &&
2497 (UseIntrinsic ||
2498 hasFloatFn(M, TLI, Ty, LibFunc_ldexp, LibFunc_ldexpf, LibFunc_ldexpl))) {
2499 if (Value *Exp = getIntToFPVal(Op, B, TLI->getIntSize())) {
2500 Constant *One = ConstantFP::get(Ty, 1.0);
2501
2502 if (UseIntrinsic) {
2503 return copyFlags(*CI, B.CreateIntrinsic(Intrinsic::ldexp,
2504 {Ty, Exp->getType()},
2505 {One, Exp}, CI));
2506 }
2507
2508 IRBuilderBase::FastMathFlagGuard Guard(B);
2509 B.setFastMathFlags(CI->getFastMathFlags());
2510 return copyFlags(*CI, emitBinaryFloatFnCall(
2511 One, Exp, TLI, LibFunc_ldexp, LibFunc_ldexpf,
2512 LibFunc_ldexpl, B, AttributeList()));
2513 }
2514 }
2515
2516 return Ret;
2517}
2518
2519Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilderBase &B) {
2520 Module *M = CI->getModule();
2521
2522 // If we can shrink the call to a float function rather than a double
2523 // function, do that first.
2525 StringRef Name = Callee->getName();
2526 if ((Name == "fmin" || Name == "fmax") && hasFloatVersion(M, Name))
2527 if (Value *Ret = optimizeBinaryDoubleFP(CI, B, TLI))
2528 return Ret;
2529
2530 // The LLVM intrinsics minnum/maxnum correspond to fmin/fmax. Canonicalize to
2531 // the intrinsics for improved optimization (for example, vectorization).
2532 // No-signed-zeros is implied by the definitions of fmax/fmin themselves.
2533 // From the C standard draft WG14/N1256:
2534 // "Ideally, fmax would be sensitive to the sign of zero, for example
2535 // fmax(-0.0, +0.0) would return +0; however, implementation in software
2536 // might be impractical."
2537 FastMathFlags FMF = CI->getFastMathFlags();
2538 FMF.setNoSignedZeros();
2539
2540 Intrinsic::ID IID = Callee->getName().starts_with("fmin") ? Intrinsic::minnum
2541 : Intrinsic::maxnum;
2542 return copyFlags(*CI, B.CreateBinaryIntrinsic(IID, CI->getArgOperand(0),
2543 CI->getArgOperand(1), FMF));
2544}
2545
2546Value *LibCallSimplifier::optimizeFMinimumnumFMaximumnum(CallInst *CI,
2547 IRBuilderBase &B) {
2548 Module *M = CI->getModule();
2549
2550 // If we can shrink the call to a float function rather than a double
2551 // function, do that first.
2553 StringRef Name = Callee->getName();
2554 if ((Name == "fminimum_num" || Name == "fmaximum_num") &&
2555 hasFloatVersion(M, Name))
2556 if (Value *Ret = optimizeBinaryDoubleFP(CI, B, TLI))
2557 return Ret;
2558
2559 // The new fminimum_num/fmaximum_num functions, unlike fmin/fmax, *are*
2560 // sensitive to the sign of zero, so we don't change the fast-math flags like
2561 // we did for those.
2562
2563 Intrinsic::ID IID = Callee->getName().starts_with("fminimum_num")
2564 ? Intrinsic::minimumnum
2565 : Intrinsic::maximumnum;
2566 return copyFlags(*CI, B.CreateBinaryIntrinsic(IID, CI->getArgOperand(0),
2567 CI->getArgOperand(1), CI));
2568}
2569
2570Value *LibCallSimplifier::optimizeLog(CallInst *Log, IRBuilderBase &B) {
2571 Function *LogFn = Log->getCalledFunction();
2572 StringRef LogNm = LogFn->getName();
2573 Intrinsic::ID LogID = LogFn->getIntrinsicID();
2574 Module *Mod = Log->getModule();
2575 Type *Ty = Log->getType();
2576
2577 if (UnsafeFPShrink && hasFloatVersion(Mod, LogNm))
2578 if (Value *Ret = optimizeUnaryDoubleFP(Log, B, TLI, true))
2579 return Ret;
2580
2581 LibFunc LogLb, ExpLb, Exp2Lb, Exp10Lb, PowLb;
2582
2583 // This is only applicable to log(), log2(), log10().
2584 if (TLI->getLibFunc(LogNm, LogLb)) {
2585 switch (LogLb) {
2586 case LibFunc_logf:
2587 LogID = Intrinsic::log;
2588 ExpLb = LibFunc_expf;
2589 Exp2Lb = LibFunc_exp2f;
2590 Exp10Lb = LibFunc_exp10f;
2591 PowLb = LibFunc_powf;
2592 break;
2593 case LibFunc_log:
2594 LogID = Intrinsic::log;
2595 ExpLb = LibFunc_exp;
2596 Exp2Lb = LibFunc_exp2;
2597 Exp10Lb = LibFunc_exp10;
2598 PowLb = LibFunc_pow;
2599 break;
2600 case LibFunc_logl:
2601 LogID = Intrinsic::log;
2602 ExpLb = LibFunc_expl;
2603 Exp2Lb = LibFunc_exp2l;
2604 Exp10Lb = LibFunc_exp10l;
2605 PowLb = LibFunc_powl;
2606 break;
2607 case LibFunc_log2f:
2608 LogID = Intrinsic::log2;
2609 ExpLb = LibFunc_expf;
2610 Exp2Lb = LibFunc_exp2f;
2611 Exp10Lb = LibFunc_exp10f;
2612 PowLb = LibFunc_powf;
2613 break;
2614 case LibFunc_log2:
2615 LogID = Intrinsic::log2;
2616 ExpLb = LibFunc_exp;
2617 Exp2Lb = LibFunc_exp2;
2618 Exp10Lb = LibFunc_exp10;
2619 PowLb = LibFunc_pow;
2620 break;
2621 case LibFunc_log2l:
2622 LogID = Intrinsic::log2;
2623 ExpLb = LibFunc_expl;
2624 Exp2Lb = LibFunc_exp2l;
2625 Exp10Lb = LibFunc_exp10l;
2626 PowLb = LibFunc_powl;
2627 break;
2628 case LibFunc_log10f:
2629 LogID = Intrinsic::log10;
2630 ExpLb = LibFunc_expf;
2631 Exp2Lb = LibFunc_exp2f;
2632 Exp10Lb = LibFunc_exp10f;
2633 PowLb = LibFunc_powf;
2634 break;
2635 case LibFunc_log10:
2636 LogID = Intrinsic::log10;
2637 ExpLb = LibFunc_exp;
2638 Exp2Lb = LibFunc_exp2;
2639 Exp10Lb = LibFunc_exp10;
2640 PowLb = LibFunc_pow;
2641 break;
2642 case LibFunc_log10l:
2643 LogID = Intrinsic::log10;
2644 ExpLb = LibFunc_expl;
2645 Exp2Lb = LibFunc_exp2l;
2646 Exp10Lb = LibFunc_exp10l;
2647 PowLb = LibFunc_powl;
2648 break;
2649 default:
2650 return nullptr;
2651 }
2652
2653 // Convert libcall to intrinsic if the value is known > 0.
2654 bool IsKnownNoErrno = Log->hasNoNaNs() && Log->hasNoInfs();
2655 if (!IsKnownNoErrno) {
2656 SimplifyQuery SQ(DL, TLI, DT, AC, Log, true, true, DC);
2657 KnownFPClass Known = computeKnownFPClass(
2658 Log->getOperand(0),
2660 Function *F = Log->getParent()->getParent();
2661 const fltSemantics &FltSem = Ty->getScalarType()->getFltSemantics();
2662 IsKnownNoErrno =
2664 Known.isKnownNeverLogicalZero(F->getDenormalMode(FltSem));
2665 }
2666 if (IsKnownNoErrno) {
2667 auto *NewLog = B.CreateUnaryIntrinsic(LogID, Log->getArgOperand(0), Log);
2668 NewLog->copyMetadata(*Log);
2669 return copyFlags(*Log, NewLog);
2670 }
2671 } else if (LogID == Intrinsic::log || LogID == Intrinsic::log2 ||
2672 LogID == Intrinsic::log10) {
2673 if (Ty->getScalarType()->isFloatTy()) {
2674 ExpLb = LibFunc_expf;
2675 Exp2Lb = LibFunc_exp2f;
2676 Exp10Lb = LibFunc_exp10f;
2677 PowLb = LibFunc_powf;
2678 } else if (Ty->getScalarType()->isDoubleTy()) {
2679 ExpLb = LibFunc_exp;
2680 Exp2Lb = LibFunc_exp2;
2681 Exp10Lb = LibFunc_exp10;
2682 PowLb = LibFunc_pow;
2683 } else
2684 return nullptr;
2685 } else
2686 return nullptr;
2687
2688 // The earlier call must also be 'fast' in order to do these transforms.
2689 CallInst *Arg = dyn_cast<CallInst>(Log->getArgOperand(0));
2690 if (!Log->isFast() || !Arg || !Arg->isFast() || !Arg->hasOneUse())
2691 return nullptr;
2692
2693 IRBuilderBase::FastMathFlagGuard Guard(B);
2694 B.setFastMathFlags(FastMathFlags::getFast());
2695
2696 Intrinsic::ID ArgID = Arg->getIntrinsicID();
2697 LibFunc ArgLb = NotLibFunc;
2698 TLI->getLibFunc(*Arg, ArgLb);
2699
2700 // log(pow(x,y)) -> y*log(x)
2701 AttributeList NoAttrs;
2702 if (ArgLb == PowLb || ArgID == Intrinsic::pow || ArgID == Intrinsic::powi) {
2703 Value *LogX =
2704 Log->doesNotAccessMemory()
2705 ? B.CreateUnaryIntrinsic(LogID, Arg->getOperand(0), nullptr, "log")
2706 : emitUnaryFloatFnCall(Arg->getOperand(0), TLI, LogNm, B, NoAttrs);
2707 Value *Y = Arg->getArgOperand(1);
2708 // Cast exponent to FP if integer.
2709 if (ArgID == Intrinsic::powi)
2710 Y = B.CreateSIToFP(Y, Ty, "cast");
2711 Value *MulY = B.CreateFMul(Y, LogX, "mul");
2712 // Since pow() may have side effects, e.g. errno,
2713 // dead code elimination may not be trusted to remove it.
2714 substituteInParent(Arg, MulY);
2715 return MulY;
2716 }
2717
2718 // log(exp{,2,10}(y)) -> y*log({e,2,10})
2719 // TODO: There is no exp10() intrinsic yet.
2720 if (ArgLb == ExpLb || ArgLb == Exp2Lb || ArgLb == Exp10Lb ||
2721 ArgID == Intrinsic::exp || ArgID == Intrinsic::exp2) {
2722 Constant *Eul;
2723 if (ArgLb == ExpLb || ArgID == Intrinsic::exp)
2724 // FIXME: Add more precise value of e for long double.
2725 Eul = ConstantFP::get(Log->getType(), numbers::e);
2726 else if (ArgLb == Exp2Lb || ArgID == Intrinsic::exp2)
2727 Eul = ConstantFP::get(Log->getType(), 2.0);
2728 else
2729 Eul = ConstantFP::get(Log->getType(), 10.0);
2730 Value *LogE = Log->doesNotAccessMemory()
2731 ? B.CreateUnaryIntrinsic(LogID, Eul, nullptr, "log")
2732 : emitUnaryFloatFnCall(Eul, TLI, LogNm, B, NoAttrs);
2733 Value *MulY = B.CreateFMul(Arg->getArgOperand(0), LogE, "mul");
2734 // Since exp() may have side effects, e.g. errno,
2735 // dead code elimination may not be trusted to remove it.
2736 substituteInParent(Arg, MulY);
2737 return MulY;
2738 }
2739
2740 return nullptr;
2741}
2742
2743// sqrt(exp(X)) -> exp(X * 0.5)
2744Value *LibCallSimplifier::mergeSqrtToExp(CallInst *CI, IRBuilderBase &B) {
2745 if (!CI->hasAllowReassoc())
2746 return nullptr;
2747
2748 Function *SqrtFn = CI->getCalledFunction();
2749 CallInst *Arg = dyn_cast<CallInst>(CI->getArgOperand(0));
2750 if (!Arg || !Arg->hasAllowReassoc() || !Arg->hasOneUse())
2751 return nullptr;
2752 Intrinsic::ID ArgID = Arg->getIntrinsicID();
2753 LibFunc ArgLb = NotLibFunc;
2754 TLI->getLibFunc(*Arg, ArgLb);
2755
2756 LibFunc SqrtLb, ExpLb, Exp2Lb, Exp10Lb;
2757
2758 if (TLI->getLibFunc(SqrtFn->getName(), SqrtLb))
2759 switch (SqrtLb) {
2760 case LibFunc_sqrtf:
2761 ExpLb = LibFunc_expf;
2762 Exp2Lb = LibFunc_exp2f;
2763 Exp10Lb = LibFunc_exp10f;
2764 break;
2765 case LibFunc_sqrt:
2766 ExpLb = LibFunc_exp;
2767 Exp2Lb = LibFunc_exp2;
2768 Exp10Lb = LibFunc_exp10;
2769 break;
2770 case LibFunc_sqrtl:
2771 ExpLb = LibFunc_expl;
2772 Exp2Lb = LibFunc_exp2l;
2773 Exp10Lb = LibFunc_exp10l;
2774 break;
2775 default:
2776 return nullptr;
2777 }
2778 else if (SqrtFn->getIntrinsicID() == Intrinsic::sqrt) {
2779 if (CI->getType()->getScalarType()->isFloatTy()) {
2780 ExpLb = LibFunc_expf;
2781 Exp2Lb = LibFunc_exp2f;
2782 Exp10Lb = LibFunc_exp10f;
2783 } else if (CI->getType()->getScalarType()->isDoubleTy()) {
2784 ExpLb = LibFunc_exp;
2785 Exp2Lb = LibFunc_exp2;
2786 Exp10Lb = LibFunc_exp10;
2787 } else
2788 return nullptr;
2789 } else
2790 return nullptr;
2791
2792 if (ArgLb != ExpLb && ArgLb != Exp2Lb && ArgLb != Exp10Lb &&
2793 ArgID != Intrinsic::exp && ArgID != Intrinsic::exp2)
2794 return nullptr;
2795
2796 IRBuilderBase::InsertPointGuard Guard(B);
2797 B.SetInsertPoint(Arg);
2798 auto *ExpOperand = Arg->getOperand(0);
2799 auto *FMul =
2800 B.CreateFMulFMF(ExpOperand, ConstantFP::get(ExpOperand->getType(), 0.5),
2801 CI, "merged.sqrt");
2802
2803 Arg->setOperand(0, FMul);
2804 return Arg;
2805}
2806
2807Value *LibCallSimplifier::optimizeSqrt(CallInst *CI, IRBuilderBase &B) {
2808 Module *M = CI->getModule();
2810 Value *Ret = nullptr;
2811 // TODO: Once we have a way (other than checking for the existince of the
2812 // libcall) to tell whether our target can lower @llvm.sqrt, relax the
2813 // condition below.
2814 if (isLibFuncEmittable(M, TLI, LibFunc_sqrtf) &&
2815 (Callee->getName() == "sqrt" ||
2816 Callee->getIntrinsicID() == Intrinsic::sqrt))
2817 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true);
2818
2819 if (Value *Opt = mergeSqrtToExp(CI, B))
2820 return Opt;
2821
2822 if (!CI->isFast())
2823 return Ret;
2824
2826 if (!I || I->getOpcode() != Instruction::FMul || !I->isFast())
2827 return Ret;
2828
2829 // We're looking for a repeated factor in a multiplication tree,
2830 // so we can do this fold: sqrt(x * x) -> fabs(x);
2831 // or this fold: sqrt((x * x) * y) -> fabs(x) * sqrt(y).
2832 Value *Op0 = I->getOperand(0);
2833 Value *Op1 = I->getOperand(1);
2834 Value *RepeatOp = nullptr;
2835 Value *OtherOp = nullptr;
2836 if (Op0 == Op1) {
2837 // Simple match: the operands of the multiply are identical.
2838 RepeatOp = Op0;
2839 } else {
2840 // Look for a more complicated pattern: one of the operands is itself
2841 // a multiply, so search for a common factor in that multiply.
2842 // Note: We don't bother looking any deeper than this first level or for
2843 // variations of this pattern because instcombine's visitFMUL and/or the
2844 // reassociation pass should give us this form.
2845 Value *MulOp;
2846 if (match(Op0, m_FMul(m_Value(MulOp), m_Deferred(MulOp))) &&
2847 cast<Instruction>(Op0)->isFast()) {
2848 // Pattern: sqrt((x * x) * z)
2849 RepeatOp = MulOp;
2850 OtherOp = Op1;
2851 } else if (match(Op1, m_FMul(m_Value(MulOp), m_Deferred(MulOp))) &&
2852 cast<Instruction>(Op1)->isFast()) {
2853 // Pattern: sqrt(z * (x * x))
2854 RepeatOp = MulOp;
2855 OtherOp = Op0;
2856 }
2857 }
2858 if (!RepeatOp)
2859 return Ret;
2860
2861 // Fast math flags for any created instructions should match the sqrt
2862 // and multiply.
2863
2864 // If we found a repeated factor, hoist it out of the square root and
2865 // replace it with the fabs of that factor.
2866 Value *FabsCall =
2867 B.CreateUnaryIntrinsic(Intrinsic::fabs, RepeatOp, I, "fabs");
2868 if (OtherOp) {
2869 // If we found a non-repeated factor, we still need to get its square
2870 // root. We then multiply that by the value that was simplified out
2871 // of the square root calculation.
2872 Value *SqrtCall =
2873 B.CreateUnaryIntrinsic(Intrinsic::sqrt, OtherOp, I, "sqrt");
2874 return copyFlags(*CI, B.CreateFMulFMF(FabsCall, SqrtCall, I));
2875 }
2876 return copyFlags(*CI, FabsCall);
2877}
2878
2879Value *LibCallSimplifier::optimizeFMod(CallInst *CI, IRBuilderBase &B) {
2880
2881 // fmod(x,y) can set errno if y == 0 or x == +/-inf, and returns Nan in those
2882 // case. If we know those do not happen, then we can convert the fmod into
2883 // frem.
2884 bool IsNoNan = CI->hasNoNaNs();
2885 if (!IsNoNan) {
2886 SimplifyQuery SQ(DL, TLI, DT, AC, CI, true, true, DC);
2887 KnownFPClass Known0 = computeKnownFPClass(CI->getOperand(0), fcInf, SQ);
2888 if (Known0.isKnownNeverInfinity()) {
2889 KnownFPClass Known1 =
2891 Function *F = CI->getParent()->getParent();
2892 const fltSemantics &FltSem =
2894 IsNoNan = Known1.isKnownNeverLogicalZero(F->getDenormalMode(FltSem));
2895 }
2896 }
2897
2898 if (IsNoNan) {
2899 Value *FRem = B.CreateFRemFMF(CI->getOperand(0), CI->getOperand(1), CI);
2900 if (auto *FRemI = dyn_cast<Instruction>(FRem))
2901 FRemI->setHasNoNaNs(true);
2902 return FRem;
2903 }
2904 return nullptr;
2905}
2906
2907Value *LibCallSimplifier::optimizeTrigInversionPairs(CallInst *CI,
2908 IRBuilderBase &B) {
2909 Module *M = CI->getModule();
2911 Value *Ret = nullptr;
2912 StringRef Name = Callee->getName();
2913 if (UnsafeFPShrink &&
2914 (Name == "tan" || Name == "atanh" || Name == "sinh" || Name == "cosh" ||
2915 Name == "asinh") &&
2916 hasFloatVersion(M, Name))
2917 Ret = optimizeUnaryDoubleFP(CI, B, TLI, true);
2918
2919 Value *Op1 = CI->getArgOperand(0);
2920 auto *OpC = dyn_cast<CallInst>(Op1);
2921 if (!OpC)
2922 return Ret;
2923
2924 // Both calls must be 'fast' in order to remove them.
2925 if (!CI->isFast() || !OpC->isFast())
2926 return Ret;
2927
2928 // tan(atan(x)) -> x
2929 // atanh(tanh(x)) -> x
2930 // sinh(asinh(x)) -> x
2931 // asinh(sinh(x)) -> x
2932 // cosh(acosh(x)) -> x
2933 LibFunc Func;
2934 Function *F = OpC->getCalledFunction();
2935 if (F && TLI->getLibFunc(F->getName(), Func) &&
2936 isLibFuncEmittable(M, TLI, Func)) {
2937 LibFunc inverseFunc = llvm::StringSwitch<LibFunc>(Callee->getName())
2938 .Case("tan", LibFunc_atan)
2939 .Case("atanh", LibFunc_tanh)
2940 .Case("sinh", LibFunc_asinh)
2941 .Case("cosh", LibFunc_acosh)
2942 .Case("tanf", LibFunc_atanf)
2943 .Case("atanhf", LibFunc_tanhf)
2944 .Case("sinhf", LibFunc_asinhf)
2945 .Case("coshf", LibFunc_acoshf)
2946 .Case("tanl", LibFunc_atanl)
2947 .Case("atanhl", LibFunc_tanhl)
2948 .Case("sinhl", LibFunc_asinhl)
2949 .Case("coshl", LibFunc_acoshl)
2950 .Case("asinh", LibFunc_sinh)
2951 .Case("asinhf", LibFunc_sinhf)
2952 .Case("asinhl", LibFunc_sinhl)
2953 .Default(NotLibFunc); // Used as error value
2954 if (Func == inverseFunc)
2955 Ret = OpC->getArgOperand(0);
2956 }
2957 return Ret;
2958}
2959
2960static bool isTrigLibCall(CallInst *CI) {
2961 // We can only hope to do anything useful if we can ignore things like errno
2962 // and floating-point exceptions.
2963 // We already checked the prototype.
2964 return CI->doesNotThrow() && CI->doesNotAccessMemory();
2965}
2966
2967static bool insertSinCosCall(IRBuilderBase &B, Function *OrigCallee, Value *Arg,
2968 bool UseFloat, Value *&Sin, Value *&Cos,
2969 Value *&SinCos, const TargetLibraryInfo *TLI) {
2970 Module *M = OrigCallee->getParent();
2971 Type *ArgTy = Arg->getType();
2972 Type *ResTy;
2973 StringRef Name;
2974
2975 Triple T(OrigCallee->getParent()->getTargetTriple());
2976 if (UseFloat) {
2977 Name = "__sincospif_stret";
2978
2979 assert(T.getArch() != Triple::x86 && "x86 messy and unsupported for now");
2980 // x86_64 can't use {float, float} since that would be returned in both
2981 // xmm0 and xmm1, which isn't what a real struct would do.
2982 ResTy = T.getArch() == Triple::x86_64
2983 ? static_cast<Type *>(FixedVectorType::get(ArgTy, 2))
2984 : static_cast<Type *>(StructType::get(ArgTy, ArgTy));
2985 } else {
2986 Name = "__sincospi_stret";
2987 ResTy = StructType::get(ArgTy, ArgTy);
2988 }
2989
2990 if (!isLibFuncEmittable(M, TLI, Name))
2991 return false;
2992 LibFunc TheLibFunc;
2993 TLI->getLibFunc(Name, TheLibFunc);
2995 M, *TLI, TheLibFunc, OrigCallee->getAttributes(), ResTy, ArgTy);
2996
2997 if (Instruction *ArgInst = dyn_cast<Instruction>(Arg)) {
2998 // If the argument is an instruction, it must dominate all uses so put our
2999 // sincos call there.
3000 B.SetInsertPoint(ArgInst->getParent(), ++ArgInst->getIterator());
3001 } else {
3002 // Otherwise (e.g. for a constant) the beginning of the function is as
3003 // good a place as any.
3004 BasicBlock &EntryBB = B.GetInsertBlock()->getParent()->getEntryBlock();
3005 B.SetInsertPoint(&EntryBB, EntryBB.begin());
3006 }
3007
3008 SinCos = B.CreateCall(Callee, Arg, "sincospi");
3009
3010 if (SinCos->getType()->isStructTy()) {
3011 Sin = B.CreateExtractValue(SinCos, 0, "sinpi");
3012 Cos = B.CreateExtractValue(SinCos, 1, "cospi");
3013 } else {
3014 Sin = B.CreateExtractElement(SinCos, ConstantInt::get(B.getInt32Ty(), 0),
3015 "sinpi");
3016 Cos = B.CreateExtractElement(SinCos, ConstantInt::get(B.getInt32Ty(), 1),
3017 "cospi");
3018 }
3019
3020 return true;
3021}
3022
3023static Value *optimizeSymmetricCall(CallInst *CI, bool IsEven,
3024 IRBuilderBase &B) {
3025 Value *X;
3026 Value *Src = CI->getArgOperand(0);
3027
3028 if (match(Src, m_OneUse(m_FNeg(m_Value(X))))) {
3029 auto *Call = B.CreateCall(CI->getCalledFunction(), {X});
3030 Call->copyFastMathFlags(CI);
3031 auto *CallInst = copyFlags(*CI, Call);
3032 if (IsEven) {
3033 // Even function: f(-x) = f(x)
3034 return CallInst;
3035 }
3036 // Odd function: f(-x) = -f(x)
3037 return B.CreateFNegFMF(CallInst, CI);
3038 }
3039
3040 // Even function: f(abs(x)) = f(x), f(copysign(x, y)) = f(x)
3041 if (IsEven && (match(Src, m_FAbs(m_Value(X))) ||
3042 match(Src, m_CopySign(m_Value(X), m_Value())))) {
3043 auto *Call = B.CreateCall(CI->getCalledFunction(), {X});
3044 Call->copyFastMathFlags(CI);
3045 return copyFlags(*CI, Call);
3046 }
3047
3048 return nullptr;
3049}
3050
3051Value *LibCallSimplifier::optimizeSymmetric(CallInst *CI, LibFunc Func,
3052 IRBuilderBase &B) {
3053 switch (Func) {
3054 case LibFunc_cos:
3055 case LibFunc_cosf:
3056 case LibFunc_cosl:
3057 return optimizeSymmetricCall(CI, /*IsEven*/ true, B);
3058
3059 case LibFunc_sin:
3060 case LibFunc_sinf:
3061 case LibFunc_sinl:
3062
3063 case LibFunc_tan:
3064 case LibFunc_tanf:
3065 case LibFunc_tanl:
3066
3067 case LibFunc_erf:
3068 case LibFunc_erff:
3069 case LibFunc_erfl:
3070 return optimizeSymmetricCall(CI, /*IsEven*/ false, B);
3071
3072 default:
3073 return nullptr;
3074 }
3075}
3076
3077Value *LibCallSimplifier::optimizeSinCosPi(CallInst *CI, bool IsSin, IRBuilderBase &B) {
3078 // Make sure the prototype is as expected, otherwise the rest of the
3079 // function is probably invalid and likely to abort.
3080 if (!isTrigLibCall(CI))
3081 return nullptr;
3082
3083 Value *Arg = CI->getArgOperand(0);
3084 if (isa<ConstantData>(Arg))
3085 return nullptr;
3086
3089 SmallVector<CallInst *, 1> SinCosCalls;
3090
3091 bool IsFloat = Arg->getType()->isFloatTy();
3092
3093 // Look for all compatible sinpi, cospi and sincospi calls with the same
3094 // argument. If there are enough (in some sense) we can make the
3095 // substitution.
3096 Function *F = CI->getFunction();
3097 for (User *U : Arg->users())
3098 classifyArgUse(U, F, IsFloat, SinCalls, CosCalls, SinCosCalls);
3099
3100 // It's only worthwhile if both sinpi and cospi are actually used.
3101 if (SinCalls.empty() || CosCalls.empty())
3102 return nullptr;
3103
3104 Value *Sin, *Cos, *SinCos;
3105 if (!insertSinCosCall(B, CI->getCalledFunction(), Arg, IsFloat, Sin, Cos,
3106 SinCos, TLI))
3107 return nullptr;
3108
3109 auto replaceTrigInsts = [this](SmallVectorImpl<CallInst *> &Calls,
3110 Value *Res) {
3111 for (CallInst *C : Calls)
3112 replaceAllUsesWith(C, Res);
3113 };
3114
3115 replaceTrigInsts(SinCalls, Sin);
3116 replaceTrigInsts(CosCalls, Cos);
3117 replaceTrigInsts(SinCosCalls, SinCos);
3118
3119 return IsSin ? Sin : Cos;
3120}
3121
3122void LibCallSimplifier::classifyArgUse(
3123 Value *Val, Function *F, bool IsFloat,
3126 SmallVectorImpl<CallInst *> &SinCosCalls) {
3127 auto *CI = dyn_cast<CallInst>(Val);
3128 if (!CI || CI->use_empty())
3129 return;
3130
3131 // Don't consider calls in other functions.
3132 if (CI->getFunction() != F)
3133 return;
3134
3135 Module *M = CI->getModule();
3137 LibFunc Func;
3138 if (!Callee || !TLI->getLibFunc(*Callee, Func) ||
3139 !isLibFuncEmittable(M, TLI, Func) ||
3140 !isTrigLibCall(CI))
3141 return;
3142
3143 if (IsFloat) {
3144 if (Func == LibFunc_sinpif)
3145 SinCalls.push_back(CI);
3146 else if (Func == LibFunc_cospif)
3147 CosCalls.push_back(CI);
3148 else if (Func == LibFunc_sincospif_stret)
3149 SinCosCalls.push_back(CI);
3150 } else {
3151 if (Func == LibFunc_sinpi)
3152 SinCalls.push_back(CI);
3153 else if (Func == LibFunc_cospi)
3154 CosCalls.push_back(CI);
3155 else if (Func == LibFunc_sincospi_stret)
3156 SinCosCalls.push_back(CI);
3157 }
3158}
3159
3160/// Constant folds remquo
3161Value *LibCallSimplifier::optimizeRemquo(CallInst *CI, IRBuilderBase &B) {
3162 const APFloat *X, *Y;
3163 if (!match(CI->getArgOperand(0), m_APFloat(X)) ||
3164 !match(CI->getArgOperand(1), m_APFloat(Y)))
3165 return nullptr;
3166
3167 APFloat::opStatus Status;
3168 APFloat Quot = *X;
3169 Status = Quot.divide(*Y, APFloat::rmNearestTiesToEven);
3170 if (Status != APFloat::opOK && Status != APFloat::opInexact)
3171 return nullptr;
3172 APFloat Rem = *X;
3173 if (Rem.remainder(*Y) != APFloat::opOK)
3174 return nullptr;
3175
3176 // TODO: We can only keep at least the three of the last bits of x/y
3177 unsigned IntBW = TLI->getIntSize();
3178 APSInt QuotInt(IntBW, /*isUnsigned=*/false);
3179 bool IsExact;
3180 Status =
3181 Quot.convertToInteger(QuotInt, APFloat::rmNearestTiesToEven, &IsExact);
3182 if (Status != APFloat::opOK && Status != APFloat::opInexact)
3183 return nullptr;
3184
3185 B.CreateAlignedStore(
3186 ConstantInt::getSigned(B.getIntNTy(IntBW), QuotInt.getExtValue()),
3187 CI->getArgOperand(2), CI->getParamAlign(2));
3188 return ConstantFP::get(CI->getType(), Rem);
3189}
3190
3191/// Constant folds fdim
3192Value *LibCallSimplifier::optimizeFdim(CallInst *CI, IRBuilderBase &B) {
3193 // Cannot perform the fold unless the call has attribute memory(none)
3194 if (!CI->doesNotAccessMemory())
3195 return nullptr;
3196
3197 // TODO : Handle undef values
3198 // Propagate poison if any
3199 if (isa<PoisonValue>(CI->getArgOperand(0)))
3200 return CI->getArgOperand(0);
3201 if (isa<PoisonValue>(CI->getArgOperand(1)))
3202 return CI->getArgOperand(1);
3203
3204 const APFloat *X, *Y;
3205 // Check if both values are constants
3206 if (!match(CI->getArgOperand(0), m_APFloat(X)) ||
3207 !match(CI->getArgOperand(1), m_APFloat(Y)))
3208 return nullptr;
3209
3210 APFloat Difference = *X;
3212
3213 APFloat MaxVal =
3214 maximum(Difference, APFloat::getZero(CI->getType()->getFltSemantics()));
3215 return ConstantFP::get(CI->getType(), MaxVal);
3216}
3217
3218//===----------------------------------------------------------------------===//
3219// Integer Library Call Optimizations
3220//===----------------------------------------------------------------------===//
3221
3222Value *LibCallSimplifier::optimizeFFS(CallInst *CI, IRBuilderBase &B) {
3223 // All variants of ffs return int which need not be 32 bits wide.
3224 // ffs{,l,ll}(x) -> x != 0 ? (int)llvm.cttz(x)+1 : 0
3225 Type *RetType = CI->getType();
3226 Value *Op = CI->getArgOperand(0);
3227 Type *ArgType = Op->getType();
3228 Value *V = B.CreateIntrinsic(Intrinsic::cttz, {ArgType}, {Op, B.getTrue()},
3229 nullptr, "cttz");
3230 V = B.CreateAdd(V, ConstantInt::get(V->getType(), 1));
3231 V = B.CreateIntCast(V, RetType, false);
3232
3233 Value *Cond = B.CreateICmpNE(Op, Constant::getNullValue(ArgType));
3234 return B.CreateSelect(Cond, V, ConstantInt::get(RetType, 0));
3235}
3236
3237Value *LibCallSimplifier::optimizeFls(CallInst *CI, IRBuilderBase &B) {
3238 // All variants of fls return int which need not be 32 bits wide.
3239 // fls{,l,ll}(x) -> (int)(sizeInBits(x) - llvm.ctlz(x, false))
3240 Value *Op = CI->getArgOperand(0);
3241 Type *ArgType = Op->getType();
3242 Value *V = B.CreateIntrinsic(Intrinsic::ctlz, {ArgType}, {Op, B.getFalse()},
3243 nullptr, "ctlz");
3244 V = B.CreateSub(ConstantInt::get(V->getType(), ArgType->getIntegerBitWidth()),
3245 V);
3246 return B.CreateIntCast(V, CI->getType(), false);
3247}
3248
3249Value *LibCallSimplifier::optimizeAbs(CallInst *CI, IRBuilderBase &B) {
3250 // abs(x) -> x <s 0 ? -x : x
3251 // The negation has 'nsw' because abs of INT_MIN is undefined.
3252 Value *X = CI->getArgOperand(0);
3253 Value *IsNeg = B.CreateIsNeg(X);
3254 Value *NegX = B.CreateNSWNeg(X, "neg");
3255 return B.CreateSelect(IsNeg, NegX, X);
3256}
3257
3258Value *LibCallSimplifier::optimizeIsDigit(CallInst *CI, IRBuilderBase &B) {
3259 // isdigit(c) -> (c-'0') <u 10
3260 Value *Op = CI->getArgOperand(0);
3261 Type *ArgType = Op->getType();
3262 Op = B.CreateSub(Op, ConstantInt::get(ArgType, '0'), "isdigittmp");
3263 Op = B.CreateICmpULT(Op, ConstantInt::get(ArgType, 10), "isdigit");
3264 return B.CreateZExt(Op, CI->getType());
3265}
3266
3267Value *LibCallSimplifier::optimizeIsAscii(CallInst *CI, IRBuilderBase &B) {
3268 // isascii(c) -> c <u 128
3269 Value *Op = CI->getArgOperand(0);
3270 Type *ArgType = Op->getType();
3271 Op = B.CreateICmpULT(Op, ConstantInt::get(ArgType, 128), "isascii");
3272 return B.CreateZExt(Op, CI->getType());
3273}
3274
3275Value *LibCallSimplifier::optimizeToAscii(CallInst *CI, IRBuilderBase &B) {
3276 // toascii(c) -> c & 0x7f
3277 return B.CreateAnd(CI->getArgOperand(0),
3278 ConstantInt::get(CI->getType(), 0x7F));
3279}
3280
3281// Fold calls to atoi, atol, and atoll.
3282Value *LibCallSimplifier::optimizeAtoi(CallInst *CI, IRBuilderBase &B) {
3283 StringRef Str;
3284 if (!getConstantStringInfo(CI->getArgOperand(0), Str))
3285 return nullptr;
3286
3287 return convertStrToInt(CI, Str, nullptr, 10, /*AsSigned=*/true, B);
3288}
3289
3290// Fold calls to strtol, strtoll, strtoul, and strtoull.
3291Value *LibCallSimplifier::optimizeStrToInt(CallInst *CI, IRBuilderBase &B,
3292 bool AsSigned) {
3293 Value *EndPtr = CI->getArgOperand(1);
3294 if (isa<ConstantPointerNull>(EndPtr)) {
3295 // With a null EndPtr, this function won't capture the main argument.
3296 // It would be readonly too, except that it still may write to errno.
3299 EndPtr = nullptr;
3300 } else if (!isKnownNonZero(EndPtr, DL))
3301 return nullptr;
3302
3303 StringRef Str;
3304 if (!getConstantStringInfo(CI->getArgOperand(0), Str))
3305 return nullptr;
3306
3307 if (ConstantInt *CInt = dyn_cast<ConstantInt>(CI->getArgOperand(2))) {
3308 return convertStrToInt(CI, Str, EndPtr, CInt->getSExtValue(), AsSigned, B);
3309 }
3310
3311 return nullptr;
3312}
3313
3314//===----------------------------------------------------------------------===//
3315// Formatting and IO Library Call Optimizations
3316//===----------------------------------------------------------------------===//
3317
3318static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg);
3319
3320Value *LibCallSimplifier::optimizeErrorReporting(CallInst *CI, IRBuilderBase &B,
3321 int StreamArg) {
3323 // Error reporting calls should be cold, mark them as such.
3324 // This applies even to non-builtin calls: it is only a hint and applies to
3325 // functions that the frontend might not understand as builtins.
3326
3327 // This heuristic was suggested in:
3328 // Improving Static Branch Prediction in a Compiler
3329 // Brian L. Deitrich, Ben-Chung Cheng, Wen-mei W. Hwu
3330 // Proceedings of PACT'98, Oct. 1998, IEEE
3331 if (!CI->hasFnAttr(Attribute::Cold) &&
3332 isReportingError(Callee, CI, StreamArg)) {
3333 CI->addFnAttr(Attribute::Cold);
3334 }
3335
3336 return nullptr;
3337}
3338
3339static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg) {
3340 if (!Callee || !Callee->isDeclaration())
3341 return false;
3342
3343 if (StreamArg < 0)
3344 return true;
3345
3346 // These functions might be considered cold, but only if their stream
3347 // argument is stderr.
3348
3349 if (StreamArg >= (int)CI->arg_size())
3350 return false;
3351 LoadInst *LI = dyn_cast<LoadInst>(CI->getArgOperand(StreamArg));
3352 if (!LI)
3353 return false;
3355 if (!GV || !GV->isDeclaration())
3356 return false;
3357 return GV->getName() == "stderr";
3358}
3359
3360Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilderBase &B) {
3361 // Check for a fixed format string.
3362 StringRef FormatStr;
3363 if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr))
3364 return nullptr;
3365
3366 // Empty format string -> noop.
3367 if (FormatStr.empty()) // Tolerate printf's declared void.
3368 return CI->use_empty() ? (Value *)CI : ConstantInt::get(CI->getType(), 0);
3369
3370 // Do not do any of the following transformations if the printf return value
3371 // is used, in general the printf return value is not compatible with either
3372 // putchar() or puts().
3373 if (!CI->use_empty())
3374 return nullptr;
3375
3376 Type *IntTy = CI->getType();
3377 // printf("x") -> putchar('x'), even for "%" and "%%".
3378 if (FormatStr.size() == 1 || FormatStr == "%%") {
3379 // Convert the character to unsigned char before passing it to putchar
3380 // to avoid host-specific sign extension in the IR. Putchar converts
3381 // it to unsigned char regardless.
3382 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)FormatStr[0]);
3383 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3384 }
3385
3386 // Try to remove call or emit putchar/puts.
3387 if (FormatStr == "%s" && CI->arg_size() > 1) {
3388 StringRef OperandStr;
3389 if (!getConstantStringInfo(CI->getOperand(1), OperandStr))
3390 return nullptr;
3391 // printf("%s", "") --> NOP
3392 if (OperandStr.empty())
3393 return (Value *)CI;
3394 // printf("%s", "a") --> putchar('a')
3395 if (OperandStr.size() == 1) {
3396 // Convert the character to unsigned char before passing it to putchar
3397 // to avoid host-specific sign extension in the IR. Putchar converts
3398 // it to unsigned char regardless.
3399 Value *IntChar = ConstantInt::get(IntTy, (unsigned char)OperandStr[0]);
3400 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3401 }
3402 // printf("%s", str"\n") --> puts(str)
3403 if (OperandStr.back() == '\n') {
3404 OperandStr = OperandStr.drop_back();
3405 Value *GV = B.CreateGlobalString(OperandStr, "str");
3406 return copyFlags(*CI, emitPutS(GV, B, TLI));
3407 }
3408 return nullptr;
3409 }
3410
3411 // printf("foo\n") --> puts("foo")
3412 if (FormatStr.back() == '\n' &&
3413 !FormatStr.contains('%')) { // No format characters.
3414 // Create a string literal with no \n on it. We expect the constant merge
3415 // pass to be run after this pass, to merge duplicate strings.
3416 FormatStr = FormatStr.drop_back();
3417 Value *GV = B.CreateGlobalString(FormatStr, "str");
3418 return copyFlags(*CI, emitPutS(GV, B, TLI));
3419 }
3420
3421 // Optimize specific format strings.
3422 // printf("%c", chr) --> putchar(chr)
3423 if (FormatStr == "%c" && CI->arg_size() > 1 &&
3424 CI->getArgOperand(1)->getType()->isIntegerTy()) {
3425 // Convert the argument to the type expected by putchar, i.e., int, which
3426 // need not be 32 bits wide but which is the same as printf's return type.
3427 Value *IntChar = B.CreateIntCast(CI->getArgOperand(1), IntTy, false);
3428 return copyFlags(*CI, emitPutChar(IntChar, B, TLI));
3429 }
3430
3431 // printf("%s\n", str) --> puts(str)
3432 if (FormatStr == "%s\n" && CI->arg_size() > 1 &&
3433 CI->getArgOperand(1)->getType()->isPointerTy())
3434 return copyFlags(*CI, emitPutS(CI->getArgOperand(1), B, TLI));
3435 return nullptr;
3436}
3437
3438Value *LibCallSimplifier::optimizePrintF(CallInst *CI, IRBuilderBase &B) {
3439
3440 Module *M = CI->getModule();
3442 FunctionType *FT = Callee->getFunctionType();
3443 if (Value *V = optimizePrintFString(CI, B)) {
3444 return V;
3445 }
3446
3448
3449 // printf(format, ...) -> iprintf(format, ...) if no floating point
3450 // arguments.
3451 if (isLibFuncEmittable(M, TLI, LibFunc_iprintf) &&
3453 FunctionCallee IPrintFFn = getOrInsertLibFunc(M, *TLI, LibFunc_iprintf, FT,
3454 Callee->getAttributes());
3455 CallInst *New = cast<CallInst>(CI->clone());
3456 New->setCalledFunction(IPrintFFn);
3457 B.Insert(New);
3458 return New;
3459 }
3460
3461 // printf(format, ...) -> __small_printf(format, ...) if no 128-bit floating point
3462 // arguments.
3463 if (isLibFuncEmittable(M, TLI, LibFunc_small_printf) &&
3464 !callHasFP128Argument(CI)) {
3465 auto SmallPrintFFn = getOrInsertLibFunc(M, *TLI, LibFunc_small_printf, FT,
3466 Callee->getAttributes());
3467 CallInst *New = cast<CallInst>(CI->clone());
3468 New->setCalledFunction(SmallPrintFFn);
3469 B.Insert(New);
3470 return New;
3471 }
3472
3473 return nullptr;
3474}
3475
3476Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI,
3477 IRBuilderBase &B) {
3478 // Check for a fixed format string.
3479 StringRef FormatStr;
3480 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr))
3481 return nullptr;
3482
3483 // If we just have a format string (nothing else crazy) transform it.
3484 Value *Dest = CI->getArgOperand(0);
3485 if (CI->arg_size() == 2) {
3486 // Make sure there's no % in the constant array. We could try to handle
3487 // %% -> % in the future if we cared.
3488 if (FormatStr.contains('%'))
3489 return nullptr; // we found a format specifier, bail out.
3490
3491 // sprintf(str, fmt) -> llvm.memcpy(align 1 str, align 1 fmt, strlen(fmt)+1)
3492 B.CreateMemCpy(Dest, Align(1), CI->getArgOperand(1), Align(1),
3493 // Copy the null byte.
3494 TLI->getAsSizeT(FormatStr.size() + 1, *CI->getModule()));
3495 return ConstantInt::get(CI->getType(), FormatStr.size());
3496 }
3497
3498 // The remaining optimizations require the format string to be "%s" or "%c"
3499 // and have an extra operand.
3500 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() < 3)
3501 return nullptr;
3502
3503 // Decode the second character of the format string.
3504 if (FormatStr[1] == 'c') {
3505 // sprintf(dst, "%c", chr) --> *(i8*)dst = chr; *((i8*)dst+1) = 0
3506 if (!CI->getArgOperand(2)->getType()->isIntegerTy())
3507 return nullptr;
3508 Value *V = B.CreateTrunc(CI->getArgOperand(2), B.getInt8Ty(), "char");
3509 Value *Ptr = Dest;
3510 B.CreateStore(V, Ptr);
3511 Ptr = B.CreateInBoundsGEP(B.getInt8Ty(), Ptr, B.getInt32(1), "nul");
3512 B.CreateStore(B.getInt8(0), Ptr);
3513
3514 return ConstantInt::get(CI->getType(), 1);
3515 }
3516
3517 if (FormatStr[1] == 's') {
3518 // sprintf(dest, "%s", str) -> llvm.memcpy(align 1 dest, align 1 str,
3519 // strlen(str)+1)
3520 if (!CI->getArgOperand(2)->getType()->isPointerTy())
3521 return nullptr;
3522
3523 if (CI->use_empty())
3524 // sprintf(dest, "%s", str) -> strcpy(dest, str)
3525 return copyFlags(*CI, emitStrCpy(Dest, CI->getArgOperand(2), B, TLI));
3526
3527 uint64_t SrcLen = GetStringLength(CI->getArgOperand(2));
3528 if (SrcLen) {
3529 B.CreateMemCpy(Dest, Align(1), CI->getArgOperand(2), Align(1),
3530 TLI->getAsSizeT(SrcLen, *CI->getModule()));
3531 // Returns total number of characters written without null-character.
3532 return ConstantInt::get(CI->getType(), SrcLen - 1);
3533 } else if (Value *V = emitStpCpy(Dest, CI->getArgOperand(2), B, TLI)) {
3534 // sprintf(dest, "%s", str) -> stpcpy(dest, str) - dest
3535 Value *PtrDiff = B.CreatePtrDiff(B.getInt8Ty(), V, Dest);
3536 return B.CreateIntCast(PtrDiff, CI->getType(), false);
3537 }
3538
3539 if (llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI,
3541 return nullptr;
3542
3543 Value *Len = emitStrLen(CI->getArgOperand(2), B, DL, TLI);
3544 if (!Len)
3545 return nullptr;
3546 Value *IncLen =
3547 B.CreateAdd(Len, ConstantInt::get(Len->getType(), 1), "leninc");
3548 B.CreateMemCpy(Dest, Align(1), CI->getArgOperand(2), Align(1), IncLen);
3549
3550 // The sprintf result is the unincremented number of bytes in the string.
3551 return B.CreateIntCast(Len, CI->getType(), false);
3552 }
3553 return nullptr;
3554}
3555
3556Value *LibCallSimplifier::optimizeSPrintF(CallInst *CI, IRBuilderBase &B) {
3557 Module *M = CI->getModule();
3559 FunctionType *FT = Callee->getFunctionType();
3560 if (Value *V = optimizeSPrintFString(CI, B)) {
3561 return V;
3562 }
3563
3565
3566 // sprintf(str, format, ...) -> siprintf(str, format, ...) if no floating
3567 // point arguments.
3568 if (isLibFuncEmittable(M, TLI, LibFunc_siprintf) &&
3570 FunctionCallee SIPrintFFn = getOrInsertLibFunc(M, *TLI, LibFunc_siprintf,
3571 FT, Callee->getAttributes());
3572 CallInst *New = cast<CallInst>(CI->clone());
3573 New->setCalledFunction(SIPrintFFn);
3574 B.Insert(New);
3575 return New;
3576 }
3577
3578 // sprintf(str, format, ...) -> __small_sprintf(str, format, ...) if no 128-bit
3579 // floating point arguments.
3580 if (isLibFuncEmittable(M, TLI, LibFunc_small_sprintf) &&
3581 !callHasFP128Argument(CI)) {
3582 auto SmallSPrintFFn = getOrInsertLibFunc(M, *TLI, LibFunc_small_sprintf, FT,
3583 Callee->getAttributes());
3584 CallInst *New = cast<CallInst>(CI->clone());
3585 New->setCalledFunction(SmallSPrintFFn);
3586 B.Insert(New);
3587 return New;
3588 }
3589
3590 return nullptr;
3591}
3592
3593// Transform an snprintf call CI with the bound N to format the string Str
3594// either to a call to memcpy, or to single character a store, or to nothing,
3595// and fold the result to a constant. A nonnull StrArg refers to the string
3596// argument being formatted. Otherwise the call is one with N < 2 and
3597// the "%c" directive to format a single character.
3598Value *LibCallSimplifier::emitSnPrintfMemCpy(CallInst *CI, Value *StrArg,
3599 StringRef Str, uint64_t N,
3600 IRBuilderBase &B) {
3601 assert(StrArg || (N < 2 && Str.size() == 1));
3602
3603 unsigned IntBits = TLI->getIntSize();
3604 uint64_t IntMax = maxIntN(IntBits);
3605 if (Str.size() > IntMax)
3606 // Bail if the string is longer than INT_MAX. POSIX requires
3607 // implementations to set errno to EOVERFLOW in this case, in
3608 // addition to when N is larger than that (checked by the caller).
3609 return nullptr;
3610
3611 Value *StrLen = ConstantInt::get(CI->getType(), Str.size());
3612 if (N == 0)
3613 return StrLen;
3614
3615 // Set to the number of bytes to copy fron StrArg which is also
3616 // the offset of the terinating nul.
3617 uint64_t NCopy;
3618 if (N > Str.size())
3619 // Copy the full string, including the terminating nul (which must
3620 // be present regardless of the bound).
3621 NCopy = Str.size() + 1;
3622 else
3623 NCopy = N - 1;
3624
3625 Value *DstArg = CI->getArgOperand(0);
3626 if (NCopy && StrArg)
3627 // Transform the call to lvm.memcpy(dst, fmt, N).
3628 copyFlags(*CI, B.CreateMemCpy(DstArg, Align(1), StrArg, Align(1),
3629 TLI->getAsSizeT(NCopy, *CI->getModule())));
3630
3631 if (N > Str.size())
3632 // Return early when the whole format string, including the final nul,
3633 // has been copied.
3634 return StrLen;
3635
3636 // Otherwise, when truncating the string append a terminating nul.
3637 Type *Int8Ty = B.getInt8Ty();
3638 Value *NulOff = B.getIntN(IntBits, NCopy);
3639 Value *DstEnd = B.CreateInBoundsGEP(Int8Ty, DstArg, NulOff, "endptr");
3640 B.CreateStore(ConstantInt::get(Int8Ty, 0), DstEnd);
3641 return StrLen;
3642}
3643
3644Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI,
3645 IRBuilderBase &B) {
3646 // Check for size
3647 ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1));
3648 if (!Size)
3649 return nullptr;
3650
3651 uint64_t N = Size->getZExtValue();
3652 uint64_t IntMax = maxIntN(TLI->getIntSize());
3653 if (N > IntMax)
3654 // Bail if the bound exceeds INT_MAX. POSIX requires implementations
3655 // to set errno to EOVERFLOW in this case.
3656 return nullptr;
3657
3658 Value *DstArg = CI->getArgOperand(0);
3659 Value *FmtArg = CI->getArgOperand(2);
3660
3661 // Check for a fixed format string.
3662 StringRef FormatStr;
3663 if (!getConstantStringInfo(FmtArg, FormatStr))
3664 return nullptr;
3665
3666 // If we just have a format string (nothing else crazy) transform it.
3667 if (CI->arg_size() == 3) {
3668 if (FormatStr.contains('%'))
3669 // Bail if the format string contains a directive and there are
3670 // no arguments. We could handle "%%" in the future.
3671 return nullptr;
3672
3673 return emitSnPrintfMemCpy(CI, FmtArg, FormatStr, N, B);
3674 }
3675
3676 // The remaining optimizations require the format string to be "%s" or "%c"
3677 // and have an extra operand.
3678 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() != 4)
3679 return nullptr;
3680
3681 // Decode the second character of the format string.
3682 if (FormatStr[1] == 'c') {
3683 if (N <= 1) {
3684 // Use an arbitary string of length 1 to transform the call into
3685 // either a nul store (N == 1) or a no-op (N == 0) and fold it
3686 // to one.
3687 StringRef CharStr("*");
3688 return emitSnPrintfMemCpy(CI, nullptr, CharStr, N, B);
3689 }
3690
3691 // snprintf(dst, size, "%c", chr) --> *(i8*)dst = chr; *((i8*)dst+1) = 0
3692 if (!CI->getArgOperand(3)->getType()->isIntegerTy())
3693 return nullptr;
3694 Value *V = B.CreateTrunc(CI->getArgOperand(3), B.getInt8Ty(), "char");
3695 Value *Ptr = DstArg;
3696 B.CreateStore(V, Ptr);
3697 Ptr = B.CreateInBoundsGEP(B.getInt8Ty(), Ptr, B.getInt32(1), "nul");
3698 B.CreateStore(B.getInt8(0), Ptr);
3699 return ConstantInt::get(CI->getType(), 1);
3700 }
3701
3702 if (FormatStr[1] != 's')
3703 return nullptr;
3704
3705 Value *StrArg = CI->getArgOperand(3);
3706 // snprintf(dest, size, "%s", str) to llvm.memcpy(dest, str, len+1, 1)
3707 StringRef Str;
3708 if (!getConstantStringInfo(StrArg, Str))
3709 return nullptr;
3710
3711 return emitSnPrintfMemCpy(CI, StrArg, Str, N, B);
3712}
3713
3714Value *LibCallSimplifier::optimizeSnPrintF(CallInst *CI, IRBuilderBase &B) {
3715 if (Value *V = optimizeSnPrintFString(CI, B)) {
3716 return V;
3717 }
3718
3719 if (isKnownNonZero(CI->getOperand(1), DL))
3721 return nullptr;
3722}
3723
3724Value *LibCallSimplifier::optimizeFPrintFString(CallInst *CI,
3725 IRBuilderBase &B) {
3726 optimizeErrorReporting(CI, B, 0);
3727
3728 // All the optimizations depend on the format string.
3729 StringRef FormatStr;
3730 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr))
3731 return nullptr;
3732
3733 // Do not do any of the following transformations if the fprintf return
3734 // value is used, in general the fprintf return value is not compatible
3735 // with fwrite(), fputc() or fputs().
3736 if (!CI->use_empty())
3737 return nullptr;
3738
3739 // fprintf(F, "foo") --> fwrite("foo", 3, 1, F)
3740 if (CI->arg_size() == 2) {
3741 // Could handle %% -> % if we cared.
3742 if (FormatStr.contains('%'))
3743 return nullptr; // We found a format specifier.
3744
3745 return copyFlags(
3746 *CI, emitFWrite(CI->getArgOperand(1),
3747 TLI->getAsSizeT(FormatStr.size(), *CI->getModule()),
3748 CI->getArgOperand(0), B, DL, TLI));
3749 }
3750
3751 // The remaining optimizations require the format string to be "%s" or "%c"
3752 // and have an extra operand.
3753 if (FormatStr.size() != 2 || FormatStr[0] != '%' || CI->arg_size() < 3)
3754 return nullptr;
3755
3756 // Decode the second character of the format string.
3757 if (FormatStr[1] == 'c') {
3758 // fprintf(F, "%c", chr) --> fputc((int)chr, F)
3759 if (!CI->getArgOperand(2)->getType()->isIntegerTy())
3760 return nullptr;
3761 Type *IntTy = B.getIntNTy(TLI->getIntSize());
3762 Value *V = B.CreateIntCast(CI->getArgOperand(2), IntTy, /*isSigned*/ true,
3763 "chari");
3764 return copyFlags(*CI, emitFPutC(V, CI->getArgOperand(0), B, TLI));
3765 }
3766
3767 if (FormatStr[1] == 's') {
3768 // fprintf(F, "%s", str) --> fputs(str, F)
3769 if (!CI->getArgOperand(2)->getType()->isPointerTy())
3770 return nullptr;
3771 return copyFlags(
3772 *CI, emitFPutS(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI));
3773 }
3774 return nullptr;
3775}
3776
3777Value *LibCallSimplifier::optimizeFPrintF(CallInst *CI, IRBuilderBase &B) {
3778 Module *M = CI->getModule();
3780 FunctionType *FT = Callee->getFunctionType();
3781 if (Value *V = optimizeFPrintFString(CI, B)) {
3782 return V;
3783 }
3784
3785 // fprintf(stream, format, ...) -> fiprintf(stream, format, ...) if no
3786 // floating point arguments.
3787 if (isLibFuncEmittable(M, TLI, LibFunc_fiprintf) &&
3789 FunctionCallee FIPrintFFn = getOrInsertLibFunc(M, *TLI, LibFunc_fiprintf,
3790 FT, Callee->getAttributes());
3791 CallInst *New = cast<CallInst>(CI->clone());
3792 New->setCalledFunction(FIPrintFFn);
3793 B.Insert(New);
3794 return New;
3795 }
3796
3797 // fprintf(stream, format, ...) -> __small_fprintf(stream, format, ...) if no
3798 // 128-bit floating point arguments.
3799 if (isLibFuncEmittable(M, TLI, LibFunc_small_fprintf) &&
3800 !callHasFP128Argument(CI)) {
3801 auto SmallFPrintFFn =
3802 getOrInsertLibFunc(M, *TLI, LibFunc_small_fprintf, FT,
3803 Callee->getAttributes());
3804 CallInst *New = cast<CallInst>(CI->clone());
3805 New->setCalledFunction(SmallFPrintFFn);
3806 B.Insert(New);
3807 return New;
3808 }
3809
3810 return nullptr;
3811}
3812
3813Value *LibCallSimplifier::optimizeFWrite(CallInst *CI, IRBuilderBase &B) {
3814 optimizeErrorReporting(CI, B, 3);
3815
3816 // Get the element size and count.
3817 ConstantInt *SizeC = dyn_cast<ConstantInt>(CI->getArgOperand(1));
3818 ConstantInt *CountC = dyn_cast<ConstantInt>(CI->getArgOperand(2));
3819 if (SizeC && CountC) {
3820 uint64_t Bytes = SizeC->getZExtValue() * CountC->getZExtValue();
3821
3822 // If this is writing zero records, remove the call (it's a noop).
3823 if (Bytes == 0)
3824 return ConstantInt::get(CI->getType(), 0);
3825
3826 // If this is writing one byte, turn it into fputc.
3827 // This optimisation is only valid, if the return value is unused.
3828 if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F)
3829 Value *Char = B.CreateLoad(B.getInt8Ty(), CI->getArgOperand(0), "char");
3830 Type *IntTy = B.getIntNTy(TLI->getIntSize());
3831 Value *Cast = B.CreateIntCast(Char, IntTy, /*isSigned*/ true, "chari");
3832 Value *NewCI = emitFPutC(Cast, CI->getArgOperand(3), B, TLI);
3833 return NewCI ? ConstantInt::get(CI->getType(), 1) : nullptr;
3834 }
3835 }
3836
3837 return nullptr;
3838}
3839
3840Value *LibCallSimplifier::optimizeFPuts(CallInst *CI, IRBuilderBase &B) {
3841 optimizeErrorReporting(CI, B, 1);
3842
3843 // Don't rewrite fputs to fwrite when optimising for size because fwrite
3844 // requires more arguments and thus extra MOVs are required.
3845 if (llvm::shouldOptimizeForSize(CI->getParent(), PSI, BFI,
3847 return nullptr;
3848
3849 // We can't optimize if return value is used.
3850 if (!CI->use_empty())
3851 return nullptr;
3852
3853 // fputs(s,F) --> fwrite(s,strlen(s),1,F)
3854 uint64_t Len = GetStringLength(CI->getArgOperand(0));
3855 if (!Len)
3856 return nullptr;
3857
3858 // Known to have no uses (see above).
3859 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule());
3860 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits);
3861 return copyFlags(
3862 *CI,
3864 ConstantInt::get(SizeTTy, Len - 1),
3865 CI->getArgOperand(1), B, DL, TLI));
3866}
3867
3868Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilderBase &B) {
3870 if (!CI->use_empty())
3871 return nullptr;
3872
3873 // Check for a constant string.
3874 // puts("") -> putchar('\n')
3875 StringRef Str;
3876 if (getConstantStringInfo(CI->getArgOperand(0), Str) && Str.empty()) {
3877 // putchar takes an argument of the same type as puts returns, i.e.,
3878 // int, which need not be 32 bits wide.
3879 Type *IntTy = CI->getType();
3880 return copyFlags(*CI, emitPutChar(ConstantInt::get(IntTy, '\n'), B, TLI));
3881 }
3882
3883 return nullptr;
3884}
3885
3886Value *LibCallSimplifier::optimizeExit(CallInst *CI) {
3887
3888 // Mark 'exit' as cold if its not exit(0) (success).
3889 const APInt *C;
3890 if (!CI->hasFnAttr(Attribute::Cold) &&
3891 match(CI->getArgOperand(0), m_APInt(C)) && !C->isZero()) {
3892 CI->addFnAttr(Attribute::Cold);
3893 }
3894 return nullptr;
3895}
3896
3897Value *LibCallSimplifier::optimizeBCopy(CallInst *CI, IRBuilderBase &B) {
3898 // bcopy(src, dst, n) -> llvm.memmove(dst, src, n)
3899 return copyFlags(*CI, B.CreateMemMove(CI->getArgOperand(1), Align(1),
3900 CI->getArgOperand(0), Align(1),
3901 CI->getArgOperand(2)));
3902}
3903
3904bool LibCallSimplifier::hasFloatVersion(const Module *M, StringRef FuncName) {
3905 SmallString<20> FloatFuncName = FuncName;
3906 FloatFuncName += 'f';
3907 return isLibFuncEmittable(M, TLI, FloatFuncName);
3908}
3909
3910Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI,
3911 IRBuilderBase &Builder) {
3912 Module *M = CI->getModule();
3913 LibFunc Func;
3915
3916 // Check for string/memory library functions.
3917 if (TLI->getLibFunc(*Callee, Func) && isLibFuncEmittable(M, TLI, Func)) {
3918 // Make sure we never change the calling convention.
3919 assert(
3920 (ignoreCallingConv(Func) ||
3922 "Optimizing string/memory libcall would change the calling convention");
3923 switch (Func) {
3924 case LibFunc_strcat:
3925 return optimizeStrCat(CI, Builder);
3926 case LibFunc_strncat:
3927 return optimizeStrNCat(CI, Builder);
3928 case LibFunc_strchr:
3929 return optimizeStrChr(CI, Builder);
3930 case LibFunc_strrchr:
3931 return optimizeStrRChr(CI, Builder);
3932 case LibFunc_strcmp:
3933 return optimizeStrCmp(CI, Builder);
3934 case LibFunc_strncmp:
3935 return optimizeStrNCmp(CI, Builder);
3936 case LibFunc_strcpy:
3937 return optimizeStrCpy(CI, Builder);
3938 case LibFunc_stpcpy:
3939 return optimizeStpCpy(CI, Builder);
3940 case LibFunc_strlcpy:
3941 return optimizeStrLCpy(CI, Builder);
3942 case LibFunc_stpncpy:
3943 return optimizeStringNCpy(CI, /*RetEnd=*/true, Builder);
3944 case LibFunc_strncpy:
3945 return optimizeStringNCpy(CI, /*RetEnd=*/false, Builder);
3946 case LibFunc_strlen:
3947 return optimizeStrLen(CI, Builder);
3948 case LibFunc_strnlen:
3949 return optimizeStrNLen(CI, Builder);
3950 case LibFunc_strpbrk:
3951 return optimizeStrPBrk(CI, Builder);
3952 case LibFunc_strndup:
3953 return optimizeStrNDup(CI, Builder);
3954 case LibFunc_strtol:
3955 case LibFunc_strtod:
3956 case LibFunc_strtof:
3957 case LibFunc_strtoul:
3958 case LibFunc_strtoll:
3959 case LibFunc_strtold:
3960 case LibFunc_strtoull:
3961 return optimizeStrTo(CI, Builder);
3962 case LibFunc_strspn:
3963 return optimizeStrSpn(CI, Builder);
3964 case LibFunc_strcspn:
3965 return optimizeStrCSpn(CI, Builder);
3966 case LibFunc_strstr:
3967 return optimizeStrStr(CI, Builder);
3968 case LibFunc_memchr:
3969 return optimizeMemChr(CI, Builder);
3970 case LibFunc_memrchr:
3971 return optimizeMemRChr(CI, Builder);
3972 case LibFunc_bcmp:
3973 return optimizeBCmp(CI, Builder);
3974 case LibFunc_memcmp:
3975 return optimizeMemCmp(CI, Builder);
3976 case LibFunc_memcpy:
3977 return optimizeMemCpy(CI, Builder);
3978 case LibFunc_memccpy:
3979 return optimizeMemCCpy(CI, Builder);
3980 case LibFunc_mempcpy:
3981 return optimizeMemPCpy(CI, Builder);
3982 case LibFunc_memmove:
3983 return optimizeMemMove(CI, Builder);
3984 case LibFunc_memset:
3985 return optimizeMemSet(CI, Builder);
3986 case LibFunc_realloc:
3987 return optimizeRealloc(CI, Builder);
3988 case LibFunc_wcslen:
3989 return optimizeWcslen(CI, Builder);
3990 case LibFunc_bcopy:
3991 return optimizeBCopy(CI, Builder);
3992 case LibFunc_Znwm:
3993 case LibFunc_ZnwmRKSt9nothrow_t:
3994 case LibFunc_ZnwmSt11align_val_t:
3995 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
3996 case LibFunc_Znam:
3997 case LibFunc_ZnamRKSt9nothrow_t:
3998 case LibFunc_ZnamSt11align_val_t:
3999 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
4000 case LibFunc_Znwm12__hot_cold_t:
4001 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
4002 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
4003 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4004 case LibFunc_Znam12__hot_cold_t:
4005 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
4006 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
4007 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
4008 case LibFunc_size_returning_new:
4009 case LibFunc_size_returning_new_hot_cold:
4010 case LibFunc_size_returning_new_aligned:
4011 case LibFunc_size_returning_new_aligned_hot_cold:
4012 return optimizeNew(CI, Builder, Func);
4013 default:
4014 break;
4015 }
4016 }
4017 return nullptr;
4018}
4019
4020/// Constant folding nan/nanf/nanl.
4022 StringRef CharSeq;
4023 if (!getConstantStringInfo(CI->getArgOperand(0), CharSeq))
4024 return nullptr;
4025
4026 APInt Fill;
4027 // Treat empty strings as if they were zero.
4028 if (CharSeq.empty())
4029 Fill = APInt(32, 0);
4030 else if (CharSeq.getAsInteger(0, Fill))
4031 return nullptr;
4032
4033 return ConstantFP::getQNaN(CI->getType(), /*Negative=*/false, &Fill);
4034}
4035
4036Value *LibCallSimplifier::optimizeFloatingPointLibCall(CallInst *CI,
4037 LibFunc Func,
4038 IRBuilderBase &Builder) {
4039 const Module *M = CI->getModule();
4040
4041 // Don't optimize calls that require strict floating point semantics.
4042 if (CI->isStrictFP())
4043 return nullptr;
4044
4045 if (Value *V = optimizeSymmetric(CI, Func, Builder))
4046 return V;
4047
4048 switch (Func) {
4049 case LibFunc_sinpif:
4050 case LibFunc_sinpi:
4051 return optimizeSinCosPi(CI, /*IsSin*/true, Builder);
4052 case LibFunc_cospif:
4053 case LibFunc_cospi:
4054 return optimizeSinCosPi(CI, /*IsSin*/false, Builder);
4055 case LibFunc_powf:
4056 case LibFunc_pow:
4057 case LibFunc_powl:
4058 return optimizePow(CI, Builder);
4059 case LibFunc_exp2l:
4060 case LibFunc_exp2:
4061 case LibFunc_exp2f:
4062 return optimizeExp2(CI, Builder);
4063 case LibFunc_fabsf:
4064 case LibFunc_fabs:
4065 case LibFunc_fabsl:
4066 return replaceUnaryCall(CI, Builder, Intrinsic::fabs);
4067 case LibFunc_sqrtf:
4068 case LibFunc_sqrt:
4069 case LibFunc_sqrtl:
4070 return optimizeSqrt(CI, Builder);
4071 case LibFunc_fmod:
4072 case LibFunc_fmodf:
4073 case LibFunc_fmodl:
4074 return optimizeFMod(CI, Builder);
4075 case LibFunc_logf:
4076 case LibFunc_log:
4077 case LibFunc_logl:
4078 case LibFunc_log10f:
4079 case LibFunc_log10:
4080 case LibFunc_log10l:
4081 case LibFunc_log1pf:
4082 case LibFunc_log1p:
4083 case LibFunc_log1pl:
4084 case LibFunc_log2f:
4085 case LibFunc_log2:
4086 case LibFunc_log2l:
4087 case LibFunc_logbf:
4088 case LibFunc_logb:
4089 case LibFunc_logbl:
4090 return optimizeLog(CI, Builder);
4091 case LibFunc_tan:
4092 case LibFunc_tanf:
4093 case LibFunc_tanl:
4094 case LibFunc_sinh:
4095 case LibFunc_sinhf:
4096 case LibFunc_sinhl:
4097 case LibFunc_asinh:
4098 case LibFunc_asinhf:
4099 case LibFunc_asinhl:
4100 case LibFunc_cosh:
4101 case LibFunc_coshf:
4102 case LibFunc_coshl:
4103 case LibFunc_atanh:
4104 case LibFunc_atanhf:
4105 case LibFunc_atanhl:
4106 return optimizeTrigInversionPairs(CI, Builder);
4107 case LibFunc_ceil:
4108 return replaceUnaryCall(CI, Builder, Intrinsic::ceil);
4109 case LibFunc_floor:
4110 return replaceUnaryCall(CI, Builder, Intrinsic::floor);
4111 case LibFunc_round:
4112 return replaceUnaryCall(CI, Builder, Intrinsic::round);
4113 case LibFunc_roundeven:
4114 return replaceUnaryCall(CI, Builder, Intrinsic::roundeven);
4115 case LibFunc_nearbyint:
4116 return replaceUnaryCall(CI, Builder, Intrinsic::nearbyint);
4117 case LibFunc_rint:
4118 return replaceUnaryCall(CI, Builder, Intrinsic::rint);
4119 case LibFunc_trunc:
4120 return replaceUnaryCall(CI, Builder, Intrinsic::trunc);
4121 case LibFunc_acos:
4122 case LibFunc_acosh:
4123 case LibFunc_asin:
4124 case LibFunc_atan:
4125 case LibFunc_cbrt:
4126 case LibFunc_exp:
4127 case LibFunc_exp10:
4128 case LibFunc_expm1:
4129 case LibFunc_cos:
4130 case LibFunc_sin:
4131 case LibFunc_tanh:
4132 if (UnsafeFPShrink && hasFloatVersion(M, CI->getCalledFunction()->getName()))
4133 return optimizeUnaryDoubleFP(CI, Builder, TLI, true);
4134 return nullptr;
4135 case LibFunc_copysign:
4136 if (hasFloatVersion(M, CI->getCalledFunction()->getName()))
4137 return optimizeBinaryDoubleFP(CI, Builder, TLI);
4138 return nullptr;
4139 case LibFunc_fdim:
4140 case LibFunc_fdimf:
4141 case LibFunc_fdiml:
4142 return optimizeFdim(CI, Builder);
4143 case LibFunc_fminf:
4144 case LibFunc_fmin:
4145 case LibFunc_fminl:
4146 case LibFunc_fmaxf:
4147 case LibFunc_fmax:
4148 case LibFunc_fmaxl:
4149 return optimizeFMinFMax(CI, Builder);
4150 case LibFunc_fminimum_numf:
4151 case LibFunc_fminimum_num:
4152 case LibFunc_fminimum_numl:
4153 case LibFunc_fmaximum_numf:
4154 case LibFunc_fmaximum_num:
4155 case LibFunc_fmaximum_numl:
4156 return optimizeFMinimumnumFMaximumnum(CI, Builder);
4157 case LibFunc_cabs:
4158 case LibFunc_cabsf:
4159 case LibFunc_cabsl:
4160 return optimizeCAbs(CI, Builder);
4161 case LibFunc_remquo:
4162 case LibFunc_remquof:
4163 case LibFunc_remquol:
4164 return optimizeRemquo(CI, Builder);
4165 case LibFunc_nan:
4166 case LibFunc_nanf:
4167 case LibFunc_nanl:
4168 return optimizeNaN(CI);
4169 default:
4170 return nullptr;
4171 }
4172}
4173
4175 Module *M = CI->getModule();
4176 assert(!CI->isMustTailCall() && "These transforms aren't musttail safe.");
4177
4178 // TODO: Split out the code below that operates on FP calls so that
4179 // we can all non-FP calls with the StrictFP attribute to be
4180 // optimized.
4181 if (CI->isNoBuiltin()) {
4182 // Optionally update operator new calls.
4183 return maybeOptimizeNoBuiltinOperatorNew(CI, Builder);
4184 }
4185
4186 LibFunc Func;
4187 Function *Callee = CI->getCalledFunction();
4188 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI);
4189
4191 CI->getOperandBundlesAsDefs(OpBundles);
4192
4194 Builder.setDefaultOperandBundles(OpBundles);
4195
4196 // Command-line parameter overrides instruction attribute.
4197 // This can't be moved to optimizeFloatingPointLibCall() because it may be
4198 // used by the intrinsic optimizations.
4199 if (EnableUnsafeFPShrink.getNumOccurrences() > 0)
4200 UnsafeFPShrink = EnableUnsafeFPShrink;
4201 else if (isa<FPMathOperator>(CI) && CI->isFast())
4202 UnsafeFPShrink = true;
4203
4204 // First, check for intrinsics.
4206 if (!IsCallingConvC)
4207 return nullptr;
4208 // The FP intrinsics have corresponding constrained versions so we don't
4209 // need to check for the StrictFP attribute here.
4210 switch (II->getIntrinsicID()) {
4211 case Intrinsic::pow:
4212 return optimizePow(CI, Builder);
4213 case Intrinsic::exp2:
4214 return optimizeExp2(CI, Builder);
4215 case Intrinsic::log:
4216 case Intrinsic::log2:
4217 case Intrinsic::log10:
4218 return optimizeLog(CI, Builder);
4219 case Intrinsic::sqrt:
4220 return optimizeSqrt(CI, Builder);
4221 case Intrinsic::memset:
4222 return optimizeMemSet(CI, Builder);
4223 case Intrinsic::memcpy:
4224 return optimizeMemCpy(CI, Builder);
4225 case Intrinsic::memmove:
4226 return optimizeMemMove(CI, Builder);
4227 case Intrinsic::sin:
4228 case Intrinsic::cos:
4229 if (UnsafeFPShrink)
4230 return optimizeUnaryDoubleFP(CI, Builder, TLI, /*isPrecise=*/true);
4231 return nullptr;
4232 default:
4233 return nullptr;
4234 }
4235 }
4236
4237 // Also try to simplify calls to fortified library functions.
4238 if (Value *SimplifiedFortifiedCI =
4239 FortifiedSimplifier.optimizeCall(CI, Builder))
4240 return SimplifiedFortifiedCI;
4241
4242 // Then check for known library functions.
4243 if (TLI->getLibFunc(*Callee, Func) && isLibFuncEmittable(M, TLI, Func)) {
4244 // We never change the calling convention.
4245 if (!ignoreCallingConv(Func) && !IsCallingConvC)
4246 return nullptr;
4247 if (Value *V = optimizeStringMemoryLibCall(CI, Builder))
4248 return V;
4249 if (Value *V = optimizeFloatingPointLibCall(CI, Func, Builder))
4250 return V;
4251 switch (Func) {
4252 case LibFunc_ffs:
4253 case LibFunc_ffsl:
4254 case LibFunc_ffsll:
4255 return optimizeFFS(CI, Builder);
4256 case LibFunc_fls:
4257 case LibFunc_flsl:
4258 case LibFunc_flsll:
4259 return optimizeFls(CI, Builder);
4260 case LibFunc_abs:
4261 case LibFunc_labs:
4262 case LibFunc_llabs:
4263 return optimizeAbs(CI, Builder);
4264 case LibFunc_isdigit:
4265 return optimizeIsDigit(CI, Builder);
4266 case LibFunc_isascii:
4267 return optimizeIsAscii(CI, Builder);
4268 case LibFunc_toascii:
4269 return optimizeToAscii(CI, Builder);
4270 case LibFunc_atoi:
4271 case LibFunc_atol:
4272 case LibFunc_atoll:
4273 return optimizeAtoi(CI, Builder);
4274 case LibFunc_strtol:
4275 case LibFunc_strtoll:
4276 return optimizeStrToInt(CI, Builder, /*AsSigned=*/true);
4277 case LibFunc_strtoul:
4278 case LibFunc_strtoull:
4279 return optimizeStrToInt(CI, Builder, /*AsSigned=*/false);
4280 case LibFunc_printf:
4281 return optimizePrintF(CI, Builder);
4282 case LibFunc_sprintf:
4283 return optimizeSPrintF(CI, Builder);
4284 case LibFunc_snprintf:
4285 return optimizeSnPrintF(CI, Builder);
4286 case LibFunc_fprintf:
4287 return optimizeFPrintF(CI, Builder);
4288 case LibFunc_fwrite:
4289 return optimizeFWrite(CI, Builder);
4290 case LibFunc_fputs:
4291 return optimizeFPuts(CI, Builder);
4292 case LibFunc_puts:
4293 return optimizePuts(CI, Builder);
4294 case LibFunc_perror:
4295 return optimizeErrorReporting(CI, Builder);
4296 case LibFunc_vfprintf:
4297 case LibFunc_fiprintf:
4298 return optimizeErrorReporting(CI, Builder, 0);
4299 case LibFunc_exit:
4300 case LibFunc_Exit:
4301 return optimizeExit(CI);
4302 default:
4303 return nullptr;
4304 }
4305 }
4306 return nullptr;
4307}
4308
4310 const DataLayout &DL, const TargetLibraryInfo *TLI, DominatorTree *DT,
4313 function_ref<void(Instruction *, Value *)> Replacer,
4314 function_ref<void(Instruction *)> Eraser)
4315 : FortifiedSimplifier(TLI), DL(DL), TLI(TLI), DT(DT), DC(DC), AC(AC),
4316 ORE(ORE), BFI(BFI), PSI(PSI), Replacer(Replacer), Eraser(Eraser) {}
4317
4318void LibCallSimplifier::replaceAllUsesWith(Instruction *I, Value *With) {
4319 // Indirect through the replacer used in this instance.
4320 Replacer(I, With);
4321}
4322
4323void LibCallSimplifier::eraseFromParent(Instruction *I) {
4324 Eraser(I);
4325}
4326
4327// TODO:
4328// Additional cases that we need to add to this file:
4329//
4330// cbrt:
4331// * cbrt(expN(X)) -> expN(x/3)
4332// * cbrt(sqrt(x)) -> pow(x,1/6)
4333// * cbrt(cbrt(x)) -> pow(x,1/9)
4334//
4335// exp, expf, expl:
4336// * exp(log(x)) -> x
4337//
4338// log, logf, logl:
4339// * log(exp(x)) -> x
4340// * log(exp(y)) -> y*log(e)
4341// * log(exp10(y)) -> y*log(10)
4342// * log(sqrt(x)) -> 0.5*log(x)
4343//
4344// pow, powf, powl:
4345// * pow(sqrt(x),y) -> pow(x,y*0.5)
4346// * pow(pow(x,y),z)-> pow(x,y*z)
4347//
4348// signbit:
4349// * signbit(cnst) -> cnst'
4350// * signbit(nncst) -> 0 (if pstv is a non-negative constant)
4351//
4352// sqrt, sqrtf, sqrtl:
4353// * sqrt(expN(x)) -> expN(x*0.5)
4354// * sqrt(Nroot(x)) -> pow(x,1/(2*N))
4355// * sqrt(pow(x,y)) -> pow(|x|,y*0.5)
4356//
4357
4358//===----------------------------------------------------------------------===//
4359// Fortified Library Call Optimizations
4360//===----------------------------------------------------------------------===//
4361
4362bool FortifiedLibCallSimplifier::isFortifiedCallFoldable(
4363 CallInst *CI, unsigned ObjSizeOp, std::optional<unsigned> SizeOp,
4364 std::optional<unsigned> StrOp, std::optional<unsigned> FlagOp) {
4365 // If this function takes a flag argument, the implementation may use it to
4366 // perform extra checks. Don't fold into the non-checking variant.
4367 if (FlagOp) {
4368 ConstantInt *Flag = dyn_cast<ConstantInt>(CI->getArgOperand(*FlagOp));
4369 if (!Flag || !Flag->isZero())
4370 return false;
4371 }
4372
4373 if (SizeOp && CI->getArgOperand(ObjSizeOp) == CI->getArgOperand(*SizeOp))
4374 return true;
4375
4376 if (ConstantInt *ObjSizeCI =
4377 dyn_cast<ConstantInt>(CI->getArgOperand(ObjSizeOp))) {
4378 if (ObjSizeCI->isMinusOne())
4379 return true;
4380 // If the object size wasn't -1 (unknown), bail out if we were asked to.
4381 if (OnlyLowerUnknownSize)
4382 return false;
4383 if (StrOp) {
4384 uint64_t Len = GetStringLength(CI->getArgOperand(*StrOp));
4385 // If the length is 0 we don't know how long it is and so we can't
4386 // remove the check.
4387 if (Len)
4388 annotateDereferenceableBytes(CI, *StrOp, Len);
4389 else
4390 return false;
4391 return ObjSizeCI->getZExtValue() >= Len;
4392 }
4393
4394 if (SizeOp) {
4395 if (ConstantInt *SizeCI =
4397 return ObjSizeCI->getZExtValue() >= SizeCI->getZExtValue();
4398 }
4399 }
4400 return false;
4401}
4402
4403Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI,
4404 IRBuilderBase &B) {
4405 if (isFortifiedCallFoldable(CI, 3, 2)) {
4406 CallInst *NewCI =
4407 B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(1),
4408 Align(1), CI->getArgOperand(2));
4409 mergeAttributesAndFlags(NewCI, *CI);
4410 return CI->getArgOperand(0);
4411 }
4412 return nullptr;
4413}
4414
4415Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(CallInst *CI,
4416 IRBuilderBase &B) {
4417 if (isFortifiedCallFoldable(CI, 3, 2)) {
4418 CallInst *NewCI =
4419 B.CreateMemMove(CI->getArgOperand(0), Align(1), CI->getArgOperand(1),
4420 Align(1), CI->getArgOperand(2));
4421 mergeAttributesAndFlags(NewCI, *CI);
4422 return CI->getArgOperand(0);
4423 }
4424 return nullptr;
4425}
4426
4427Value *FortifiedLibCallSimplifier::optimizeMemSetChk(CallInst *CI,
4428 IRBuilderBase &B) {
4429 if (isFortifiedCallFoldable(CI, 3, 2)) {
4430 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false);
4431 CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val,
4432 CI->getArgOperand(2), Align(1));
4433 mergeAttributesAndFlags(NewCI, *CI);
4434 return CI->getArgOperand(0);
4435 }
4436 return nullptr;
4437}
4438
4439Value *FortifiedLibCallSimplifier::optimizeMemPCpyChk(CallInst *CI,
4440 IRBuilderBase &B) {
4441 const DataLayout &DL = CI->getDataLayout();
4442 if (isFortifiedCallFoldable(CI, 3, 2))
4443 if (Value *Call = emitMemPCpy(CI->getArgOperand(0), CI->getArgOperand(1),
4444 CI->getArgOperand(2), B, DL, TLI)) {
4446 }
4447 return nullptr;
4448}
4449
4450Value *FortifiedLibCallSimplifier::optimizeStrpCpyChk(CallInst *CI,
4452 LibFunc Func) {
4453 const DataLayout &DL = CI->getDataLayout();
4454 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1),
4455 *ObjSize = CI->getArgOperand(2);
4456
4457 // __stpcpy_chk(x,x,...) -> x+strlen(x)
4458 if (Func == LibFunc_stpcpy_chk && !OnlyLowerUnknownSize && Dst == Src) {
4459 Value *StrLen = emitStrLen(Src, B, DL, TLI);
4460 return StrLen ? B.CreateInBoundsGEP(B.getInt8Ty(), Dst, StrLen) : nullptr;
4461 }
4462
4463 // If a) we don't have any length information, or b) we know this will
4464 // fit then just lower to a plain st[rp]cpy. Otherwise we'll keep our
4465 // st[rp]cpy_chk call which may fail at runtime if the size is too long.
4466 // TODO: It might be nice to get a maximum length out of the possible
4467 // string lengths for varying.
4468 if (isFortifiedCallFoldable(CI, 2, std::nullopt, 1)) {
4469 if (Func == LibFunc_strcpy_chk)
4470 return copyFlags(*CI, emitStrCpy(Dst, Src, B, TLI));
4471 else
4472 return copyFlags(*CI, emitStpCpy(Dst, Src, B, TLI));
4473 }
4474
4475 if (OnlyLowerUnknownSize)
4476 return nullptr;
4477
4478 // Maybe we can stil fold __st[rp]cpy_chk to __memcpy_chk.
4479 uint64_t Len = GetStringLength(Src);
4480 if (Len)
4481 annotateDereferenceableBytes(CI, 1, Len);
4482 else
4483 return nullptr;
4484
4485 unsigned SizeTBits = TLI->getSizeTSize(*CI->getModule());
4486 Type *SizeTTy = IntegerType::get(CI->getContext(), SizeTBits);
4487 Value *LenV = ConstantInt::get(SizeTTy, Len);
4488 Value *Ret = emitMemCpyChk(Dst, Src, LenV, ObjSize, B, DL, TLI);
4489 // If the function was an __stpcpy_chk, and we were able to fold it into
4490 // a __memcpy_chk, we still need to return the correct end pointer.
4491 if (Ret && Func == LibFunc_stpcpy_chk)
4492 return B.CreateInBoundsGEP(B.getInt8Ty(), Dst,
4493 ConstantInt::get(SizeTTy, Len - 1));
4494 return copyFlags(*CI, cast<CallInst>(Ret));
4495}
4496
4497Value *FortifiedLibCallSimplifier::optimizeStrLenChk(CallInst *CI,
4498 IRBuilderBase &B) {
4499 if (isFortifiedCallFoldable(CI, 1, std::nullopt, 0))
4500 return copyFlags(*CI, emitStrLen(CI->getArgOperand(0), B,
4501 CI->getDataLayout(), TLI));
4502 return nullptr;
4503}
4504
4505Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(CallInst *CI,
4507 LibFunc Func) {
4508 if (isFortifiedCallFoldable(CI, 3, 2)) {
4509 if (Func == LibFunc_strncpy_chk)
4510 return copyFlags(*CI,
4512 CI->getArgOperand(2), B, TLI));
4513 else
4514 return copyFlags(*CI,
4516 CI->getArgOperand(2), B, TLI));
4517 }
4518
4519 return nullptr;
4520}
4521
4522Value *FortifiedLibCallSimplifier::optimizeMemCCpyChk(CallInst *CI,
4523 IRBuilderBase &B) {
4524 if (isFortifiedCallFoldable(CI, 4, 3))
4525 return copyFlags(
4526 *CI, emitMemCCpy(CI->getArgOperand(0), CI->getArgOperand(1),
4527 CI->getArgOperand(2), CI->getArgOperand(3), B, TLI));
4528
4529 return nullptr;
4530}
4531
4532Value *FortifiedLibCallSimplifier::optimizeSNPrintfChk(CallInst *CI,
4533 IRBuilderBase &B) {
4534 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2)) {
4535 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 5));
4536 return copyFlags(*CI,
4538 CI->getArgOperand(4), VariadicArgs, B, TLI));
4539 }
4540
4541 return nullptr;
4542}
4543
4544Value *FortifiedLibCallSimplifier::optimizeSPrintfChk(CallInst *CI,
4545 IRBuilderBase &B) {
4546 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1)) {
4547 SmallVector<Value *, 8> VariadicArgs(drop_begin(CI->args(), 4));
4548 return copyFlags(*CI,
4550 VariadicArgs, B, TLI));
4551 }
4552
4553 return nullptr;
4554}
4555
4556Value *FortifiedLibCallSimplifier::optimizeStrCatChk(CallInst *CI,
4557 IRBuilderBase &B) {
4558 if (isFortifiedCallFoldable(CI, 2))
4559 return copyFlags(
4560 *CI, emitStrCat(CI->getArgOperand(0), CI->getArgOperand(1), B, TLI));
4561
4562 return nullptr;
4563}
4564
4565Value *FortifiedLibCallSimplifier::optimizeStrLCat(CallInst *CI,
4566 IRBuilderBase &B) {
4567 if (isFortifiedCallFoldable(CI, 3))
4568 return copyFlags(*CI,
4570 CI->getArgOperand(2), B, TLI));
4571
4572 return nullptr;
4573}
4574
4575Value *FortifiedLibCallSimplifier::optimizeStrNCatChk(CallInst *CI,
4576 IRBuilderBase &B) {
4577 if (isFortifiedCallFoldable(CI, 3))
4578 return copyFlags(*CI,
4580 CI->getArgOperand(2), B, TLI));
4581
4582 return nullptr;
4583}
4584
4585Value *FortifiedLibCallSimplifier::optimizeStrLCpyChk(CallInst *CI,
4586 IRBuilderBase &B) {
4587 if (isFortifiedCallFoldable(CI, 3))
4588 return copyFlags(*CI,
4590 CI->getArgOperand(2), B, TLI));
4591
4592 return nullptr;
4593}
4594
4595Value *FortifiedLibCallSimplifier::optimizeVSNPrintfChk(CallInst *CI,
4596 IRBuilderBase &B) {
4597 if (isFortifiedCallFoldable(CI, 3, 1, std::nullopt, 2))
4598 return copyFlags(
4599 *CI, emitVSNPrintf(CI->getArgOperand(0), CI->getArgOperand(1),
4600 CI->getArgOperand(4), CI->getArgOperand(5), B, TLI));
4601
4602 return nullptr;
4603}
4604
4605Value *FortifiedLibCallSimplifier::optimizeVSPrintfChk(CallInst *CI,
4606 IRBuilderBase &B) {
4607 if (isFortifiedCallFoldable(CI, 2, std::nullopt, std::nullopt, 1))
4608 return copyFlags(*CI,
4610 CI->getArgOperand(4), B, TLI));
4611
4612 return nullptr;
4613}
4614
4616 IRBuilderBase &Builder) {
4617 // FIXME: We shouldn't be changing "nobuiltin" or TLI unavailable calls here.
4618 // Some clang users checked for _chk libcall availability using:
4619 // __has_builtin(__builtin___memcpy_chk)
4620 // When compiling with -fno-builtin, this is always true.
4621 // When passing -ffreestanding/-mkernel, which both imply -fno-builtin, we
4622 // end up with fortified libcalls, which isn't acceptable in a freestanding
4623 // environment which only provides their non-fortified counterparts.
4624 //
4625 // Until we change clang and/or teach external users to check for availability
4626 // differently, disregard the "nobuiltin" attribute and TLI::has.
4627 //
4628 // PR23093.
4629
4630 LibFunc Func;
4631 Function *Callee = CI->getCalledFunction();
4632 bool IsCallingConvC = TargetLibraryInfoImpl::isCallingConvCCompatible(CI);
4633
4635 CI->getOperandBundlesAsDefs(OpBundles);
4636
4638 Builder.setDefaultOperandBundles(OpBundles);
4639
4640 // First, check that this is a known library functions and that the prototype
4641 // is correct.
4642 if (!TLI->getLibFunc(*Callee, Func))
4643 return nullptr;
4644
4645 // We never change the calling convention.
4646 if (!ignoreCallingConv(Func) && !IsCallingConvC)
4647 return nullptr;
4648
4649 switch (Func) {
4650 case LibFunc_memcpy_chk:
4651 return optimizeMemCpyChk(CI, Builder);
4652 case LibFunc_mempcpy_chk:
4653 return optimizeMemPCpyChk(CI, Builder);
4654 case LibFunc_memmove_chk:
4655 return optimizeMemMoveChk(CI, Builder);
4656 case LibFunc_memset_chk:
4657 return optimizeMemSetChk(CI, Builder);
4658 case LibFunc_stpcpy_chk:
4659 case LibFunc_strcpy_chk:
4660 return optimizeStrpCpyChk(CI, Builder, Func);
4661 case LibFunc_strlen_chk:
4662 return optimizeStrLenChk(CI, Builder);
4663 case LibFunc_stpncpy_chk:
4664 case LibFunc_strncpy_chk:
4665 return optimizeStrpNCpyChk(CI, Builder, Func);
4666 case LibFunc_memccpy_chk:
4667 return optimizeMemCCpyChk(CI, Builder);
4668 case LibFunc_snprintf_chk:
4669 return optimizeSNPrintfChk(CI, Builder);
4670 case LibFunc_sprintf_chk:
4671 return optimizeSPrintfChk(CI, Builder);
4672 case LibFunc_strcat_chk:
4673 return optimizeStrCatChk(CI, Builder);
4674 case LibFunc_strlcat_chk:
4675 return optimizeStrLCat(CI, Builder);
4676 case LibFunc_strncat_chk:
4677 return optimizeStrNCatChk(CI, Builder);
4678 case LibFunc_strlcpy_chk:
4679 return optimizeStrLCpyChk(CI, Builder);
4680 case LibFunc_vsnprintf_chk:
4681 return optimizeVSNPrintfChk(CI, Builder);
4682 case LibFunc_vsprintf_chk:
4683 return optimizeVSPrintfChk(CI, Builder);
4684 default:
4685 break;
4686 }
4687 return nullptr;
4688}
4689
4691 const TargetLibraryInfo *TLI, bool OnlyLowerUnknownSize)
4692 : TLI(TLI), OnlyLowerUnknownSize(OnlyLowerUnknownSize) {}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
constexpr LLT S1
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Hexagon Common GEP
Module.h This file contains the declarations for the Module class.
static llvm::Error parse(DataExtractor &Data, uint64_t BaseAddr, LineEntryCallback const &Callback)
Definition LineTable.cpp:54
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
#define T
uint64_t IntrinsicInst * II
static bool isBinary(MachineInstr &MI)
if(PassOpts->AAPipeline)
const SmallVectorImpl< MachineOperand > & Cond
static bool isOnlyUsedInEqualityComparison(Value *V, Value *With)
Return true if it is only used in equality comparisons with With.
static void annotateNonNullAndDereferenceable(CallInst *CI, ArrayRef< unsigned > ArgNos, Value *Size, const DataLayout &DL)
static cl::opt< unsigned, false, HotColdHintParser > ColdNewHintValue("cold-new-hint-value", cl::Hidden, cl::init(1), cl::desc("Value to pass to hot/cold operator new for cold allocation"))
static bool insertSinCosCall(IRBuilderBase &B, Function *OrigCallee, Value *Arg, bool UseFloat, Value *&Sin, Value *&Cos, Value *&SinCos, const TargetLibraryInfo *TLI)
static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, const DataLayout &DL)
static Value * mergeAttributesAndFlags(CallInst *NewCI, const CallInst &Old)
static cl::opt< bool > OptimizeHotColdNew("optimize-hot-cold-new", cl::Hidden, cl::init(false), cl::desc("Enable hot/cold operator new library calls"))
static Value * optimizeBinaryDoubleFP(CallInst *CI, IRBuilderBase &B, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float for binary functions.
static bool ignoreCallingConv(LibFunc Func)
static cl::opt< bool > OptimizeExistingHotColdNew("optimize-existing-hot-cold-new", cl::Hidden, cl::init(false), cl::desc("Enable optimization of existing hot/cold operator new library calls"))
static void annotateDereferenceableBytes(CallInst *CI, ArrayRef< unsigned > ArgNos, uint64_t DereferenceableBytes)
static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg)
static Value * optimizeDoubleFP(CallInst *CI, IRBuilderBase &B, bool isBinary, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float functions.
static Value * optimizeSymmetricCall(CallInst *CI, bool IsEven, IRBuilderBase &B)
static Value * getSqrtCall(Value *V, AttributeList Attrs, bool NoErrno, Module *M, IRBuilderBase &B, const TargetLibraryInfo *TLI)
static Value * valueHasFloatPrecision(Value *Val)
Return a variant of Val with float type.
static Value * optimizeMemCmpConstantSize(CallInst *CI, Value *LHS, Value *RHS, uint64_t Len, IRBuilderBase &B, const DataLayout &DL)
static Value * createPowWithIntegerExponent(Value *Base, Value *Expo, Module *M, IRBuilderBase &B)
static Value * convertStrToInt(CallInst *CI, StringRef &Str, Value *EndPtr, uint64_t Base, bool AsSigned, IRBuilderBase &B)
static Value * memChrToCharCompare(CallInst *CI, Value *NBytes, IRBuilderBase &B, const DataLayout &DL)
static Value * copyFlags(const CallInst &Old, Value *New)
static StringRef substr(StringRef Str, uint64_t Len)
static cl::opt< unsigned, false, HotColdHintParser > HotNewHintValue("hot-new-hint-value", cl::Hidden, cl::init(254), cl::desc("Value to pass to hot/cold operator new for hot allocation"))
static bool isTrigLibCall(CallInst *CI)
static Value * optimizeNaN(CallInst *CI)
Constant folding nan/nanf/nanl.
static bool isOnlyUsedInComparisonWithZero(Value *V)
static Value * replaceUnaryCall(CallInst *CI, IRBuilderBase &B, Intrinsic::ID IID)
static bool callHasFloatingPointArgument(const CallInst *CI)
static Value * optimizeUnaryDoubleFP(CallInst *CI, IRBuilderBase &B, const TargetLibraryInfo *TLI, bool isPrecise=false)
Shrink double -> float for unary functions.
static bool callHasFP128Argument(const CallInst *CI)
static cl::opt< bool > OptimizeNoBuiltinHotColdNew("optimize-nobuiltin-hot-cold-new-new", cl::Hidden, cl::init(false), cl::desc("Enable transformation of nobuiltin operator new library calls"))
static cl::opt< unsigned, false, HotColdHintParser > AmbiguousNewHintValue("ambiguous-new-hint-value", cl::Hidden, cl::init(222), cl::desc("Value to pass to hot/cold operator new for ambiguous allocation"))
static void annotateNonNullNoUndefBasedOnAccess(CallInst *CI, ArrayRef< unsigned > ArgNos)
static Value * optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS, Value *Size, bool StrNCmp, IRBuilderBase &B, const DataLayout &DL)
static Value * getIntToFPVal(Value *I2F, IRBuilderBase &B, unsigned DstWidth)
static cl::opt< bool > EnableUnsafeFPShrink("enable-double-float-shrink", cl::Hidden, cl::init(false), cl::desc("Enable unsafe double to float " "shrinking for math lib calls"))
static cl::opt< unsigned, false, HotColdHintParser > NotColdNewHintValue("notcold-new-hint-value", cl::Hidden, cl::init(128), cl::desc("Value to pass to hot/cold operator new for " "notcold (warm) allocation"))
This file defines the SmallString class.
This file contains some functions that are useful when dealing with strings.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:347
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:360
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1190
bool isFiniteNonZero() const
Definition APFloat.h:1441
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:6053
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1172
bool isNegative() const
Definition APFloat.h:1431
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
Definition APFloat.cpp:6112
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
Definition APFloat.h:1414
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1163
const fltSemantics & getSemantics() const
Definition APFloat.h:1439
LLVM_ABI float convertToFloat() const
Converts this APFloat to host float value.
Definition APFloat.cpp:6143
opStatus remainder(const APFloat &RHS)
Definition APFloat.h:1199
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1314
bool isInteger() const
Definition APFloat.h:1448
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Definition APFloat.h:1061
Class for arbitrary precision integers.
Definition APInt.h:78
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1151
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A cache of @llvm.assume calls within a function.
static LLVM_ABI Attribute getWithDereferenceableBytes(LLVMContext &Context, uint64_t Bytes)
static LLVM_ABI Attribute getWithCaptureInfo(LLVMContext &Context, CaptureInfo CI)
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:459
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
void addFnAttr(Attribute::AttrKind Kind)
Adds the attribute to the function.
void removeParamAttrs(unsigned ArgNo, const AttributeMask &AttrsToRemove)
Removes the attributes from the given argument.
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
bool isNoBuiltin() const
Return true if the call should not be treated as a call to a builtin.
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Removes the attribute from the given argument.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool doesNotAccessMemory(unsigned OpNo) const
void removeRetAttrs(const AttributeMask &AttrsToRemove)
Removes the attributes from the return value.
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
bool isStrictFP() const
Determine if the call requires strict floating point semantics.
AttributeSet getParamAttributes(unsigned ArgNo) const
Return the param attributes for this call.
uint64_t getParamDereferenceableBytes(unsigned i) const
Extract the number of dereferenceable bytes for a call or parameter (0=unknown).
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
MaybeAlign getParamAlign(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
AttributeSet getRetAttributes() const
Return the return attributes for this call.
void setAttributes(AttributeList A)
Set the attributes for this call.
bool doesNotThrow() const
Determine if the call cannot unwind.
Value * getArgOperand(unsigned i) const
uint64_t getParamDereferenceableOrNullBytes(unsigned i) const
Extract the number of dereferenceable_or_null bytes for a parameter (0=unknown).
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
This class represents a function call, abstracting a target machine's calling convention.
bool isNoTailCall() const
TailCallKind getTailCallKind() const
bool isMustTailCall() const
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
Definition ModRef.h:372
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:699
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:701
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:702
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:765
LLVM_ABI uint64_t getElementAsInteger(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:282
static LLVM_ABI Constant * getInfinity(Type *Ty, bool Negative=false)
static LLVM_ABI Constant * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition Constants.h:225
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:136
int64_t getSExtValue() const
Return the constant as a 64-bit integer value after it has been sign extended as appropriate for the ...
Definition Constants.h:174
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:164
This class represents an extension of floating point types.
This class represents a truncation of floating point types.
void setNoSignedZeros(bool B=true)
Definition FMF.h:84
static FastMathFlags getFast()
Definition FMF.h:50
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:802
FortifiedLibCallSimplifier(const TargetLibraryInfo *TLI, bool OnlyLowerUnknownSize=false)
Value * optimizeCall(CallInst *CI, IRBuilderBase &B)
Take the given call instruction and return a more optimal value to replace the instruction with or 0 ...
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:244
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:352
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:249
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:730
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition Globals.cpp:328
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI bool isFast() const LLVM_READONLY
Determine whether all fast-math-flags are set.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI bool hasApproxFunc() const LLVM_READONLY
Determine whether the approximate-math-functions flag is set.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
LLVM_ABI bool hasAllowReassoc() const LLVM_READONLY
Determine whether the allow-reassociation flag is set.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:318
A wrapper class for inspecting calls to intrinsic functions.
LibCallSimplifier(const DataLayout &DL, const TargetLibraryInfo *TLI, DominatorTree *DT, DomConditionCache *DC, AssumptionCache *AC, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, function_ref< void(Instruction *, Value *)> Replacer=&replaceAllUsesWithDefault, function_ref< void(Instruction *)> Eraser=&eraseFromParentDefault)
Value * optimizeCall(CallInst *CI, IRBuilderBase &B)
optimizeCall - Take the given call instruction and return a more optimal value to replace the instruc...
An instruction for reading from memory.
Value * getPointerOperand()
iterator begin()
Definition MapVector.h:65
size_type size() const
Definition MapVector.h:56
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
Definition Module.h:281
The optimization diagnostic interface.
Analysis providing profile information.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
static constexpr size_t npos
Definition StringRef.h:57
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition StringRef.h:472
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:261
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
char back() const
back - Get the last character in the string.
Definition StringRef.h:155
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:146
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition StringRef.h:426
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Definition StringRef.h:293
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
Definition StringRef.h:273
int compare(StringRef RHS) const
compare - Compare two strings; the result is negative, zero, or positive if this string is lexicograp...
Definition StringRef.h:179
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition Type.cpp:413
static LLVM_ABI bool isCallingConvCCompatible(CallBase *CI)
Returns true if call site / callee has cdecl-compatible calling conventions.
Provides information about what library functions are available for the current target.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition Type.h:153
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:294
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
bool isStructTy() const
True if this is an instance of StructType.
Definition Type.h:261
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition Type.h:156
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:300
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:106
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:292
void setOperand(unsigned i, Value *Val)
Definition User.h:237
Value * getOperand(unsigned i) const
Definition User.h:232
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
iterator_range< user_iterator > users()
Definition Value.h:426
bool use_empty() const
Definition Value.h:346
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1099
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
CallInst * Call
#define UINT64_MAX
Definition DataTypes.h:77
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
Flag
These should be considered private to the implementation of the MCInstrDesc class.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::FMul > m_FMul(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
specific_fpval m_FPOne()
Match a float 1.0 or vector with all elements equal to 1.0.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_CopySign(const Opnd0 &Op0, const Opnd1 &Op1)
This namespace contains all of the command line option processing machinery.
Definition CommandLine.h:53
initializer< Ty > init(const Ty &Val)
constexpr double e
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
@ Offset
Definition DWP.cpp:532
@ Length
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
LLVM_ABI Value * emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs)
Emit a call to the unary function named 'Name' (e.g.
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
LLVM_ABI Value * emitStrChr(Value *Ptr, char C, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strchr function to the builder, for the specified pointer and character.
constexpr uint64_t maxUIntN(uint64_t N)
Gets the maximum value for a N-bit unsigned integer.
Definition MathExtras.h:207
LLVM_ABI Value * emitPutChar(Value *Char, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the putchar function. This assumes that Char is an 'int'.
LLVM_ABI Value * emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the __memcpy_chk function to the builder.
LLVM_ABI Value * emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strncpy function to the builder, for the specified pointer arguments and length.
LLVM_ABI bool isKnownNeverInfinity(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if the floating-point scalar value is not an infinity or if the floating-point vector val...
LLVM_ABI bool isOnlyUsedInZeroEqualityComparison(const Instruction *CxtI)
LLVM_ABI Value * emitHotColdNewAlignedNoThrow(Value *Num, Value *Align, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
APFloat abs(APFloat X)
Returns the absolute value of the argument.
Definition APFloat.h:1545
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str, bool TrimAtNul=true)
This function computes the length of a null-terminated C string pointed to by V.
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:229
LLVM_ABI Value * emitSPrintf(Value *Dest, Value *Fmt, ArrayRef< Value * > VariadicArgs, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the sprintf function.
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI Value * emitMemRChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memrchr function, analogously to emitMemChr.
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1625
LLVM_ABI Value * emitStrLCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strlcat function.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:632
LLVM_ABI bool hasFloatFn(const Module *M, const TargetLibraryInfo *TLI, Type *Ty, LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn)
Check whether the overloaded floating point function corresponding to Ty is available.
LLVM_ABI Value * emitStrNCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strncat function.
LLVM_ABI bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, LibFunc TheLibFunc)
Check whether the library function is available on target and also that it in the current Module is a...
LLVM_ABI Value * emitVSNPrintf(Value *Dest, Value *Size, Value *Fmt, Value *VAList, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the vsnprintf function.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
Align getKnownAlignment(Value *V, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to infer an alignment for the specified pointer.
Definition Local.h:252
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1744
LLVM_ABI Value * emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the strncmp function to the builder.
LLVM_ABI Value * emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memcmp function.
LLVM_ABI Value * emitBinaryFloatFnCall(Value *Op1, Value *Op2, const TargetLibraryInfo *TLI, StringRef Name, IRBuilderBase &B, const AttributeList &Attrs)
Emit a call to the binary function named 'Name' (e.g.
bool isAlpha(char C)
Checks if character C is a valid letter as classified by "C" locale.
LLVM_ABI Value * emitFPutS(Value *Str, Value *File, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the fputs function.
LLVM_ABI Value * emitStrDup(Value *Ptr, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strdup function to the builder, for the specified pointer.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1634
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI Value * emitBCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the bcmp function.
bool isDigit(char C)
Checks if character C is one of the 10 decimal digits.
std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingMultiplyAdd(T X, T Y, T A, bool *ResultOverflowed=nullptr)
Multiply two unsigned integers, X and Y, and add the unsigned integer, A to the product.
Definition MathExtras.h:684
LLVM_ABI uint64_t GetStringLength(const Value *V, unsigned CharSize=8)
If we can compute the length of the string pointed to by the specified pointer, return 'len+1'.
LLVM_ABI FunctionCallee getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, LibFunc TheLibFunc, FunctionType *T, AttributeList AttributeList)
Calls getOrInsertFunction() and then makes sure to add mandatory argument attributes.
LLVM_ABI Value * emitStrLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the strlen function to the builder, for the specified pointer.
LLVM_ABI Value * emitFPutC(Value *Char, Value *File, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the fputc function.
LLVM_ABI Value * emitStpNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the stpncpy function to the builder, for the specified pointer arguments and length.
LLVM_ABI Value * emitStrCat(Value *Dest, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strcat function.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI Value * emitVSPrintf(Value *Dest, Value *Fmt, Value *VAList, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the vsprintf function.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
LLVM_ABI Value * emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the fwrite function.
LLVM_ABI Value * emitSNPrintf(Value *Dest, Value *Size, Value *Fmt, ArrayRef< Value * > Args, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the snprintf function.
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
LLVM_ABI Value * emitStpCpy(Value *Dst, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the stpcpy function to the builder, for the specified pointer arguments.
@ FMul
Product of floats.
@ And
Bitwise or logical AND of integers.
char toUpper(char x)
Returns the corresponding uppercase character if x is lowercase.
DWARFExpression::Operation Op
@ NearestTiesToEven
roundTiesToEven.
constexpr int64_t maxIntN(int64_t N)
Gets the maximum value for a N-bit signed integer.
Definition MathExtras.h:232
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI Value * emitHotColdNewNoThrow(Value *Num, Value *NoThrow, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitMalloc(Value *Num, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the malloc function.
LLVM_ABI Value * emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the memchr function.
LLVM_ABI Value * emitHotColdNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
bool isSpace(char C)
Checks whether character C is whitespace in the "C" locale.
LLVM_ABI Value * emitPutS(Value *Str, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the puts function. This assumes that Str is some pointer.
LLVM_ABI Value * emitMemCCpy(Value *Ptr1, Value *Ptr2, Value *Val, Value *Len, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the memccpy function.
LLVM_ABI Value * emitHotColdSizeReturningNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitHotColdNew(Value *Num, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
Emit a call to the hot/cold operator new function.
LLVM_ABI Constant * ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, APInt Offset, const DataLayout &DL)
Return the value that a load from C with offset Offset would produce if it is constant and determinab...
LLVM_ABI Value * emitStrLCpy(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strlcpy function.
LLVM_ABI Value * emitHotColdSizeReturningNewAligned(Value *Num, Value *Align, IRBuilderBase &B, const TargetLibraryInfo *TLI, LibFunc NewFunc, uint8_t HotCold)
LLVM_ABI Value * emitStrCpy(Value *Dst, Value *Src, IRBuilderBase &B, const TargetLibraryInfo *TLI)
Emit a call to the strcpy function to the builder, for the specified pointer arguments.
LLVM_ABI Value * emitMemPCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B, const DataLayout &DL, const TargetLibraryInfo *TLI)
Emit a call to the mempcpy function.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:373
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
const ConstantDataArray * Array
ConstantDataArray pointer.
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:108
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:145
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
static constexpr FPClassTest OrderedLessThanZeroMask
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's know this can never be interpreted as a zero.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
Matching combinators.