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