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