SimplifyLibCalls.cpp revision 30d8f0e9770db76f19273419c57fe112129b145a
1//===------ SimplifyLibCalls.cpp - Library calls simplifier ---------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This is a utility pass used for testing the InstructionSimplify analysis.
11// The analysis is applied to every instruction, and if it simplifies then the
12// instruction is replaced by the simplification.  If you are looking for a pass
13// that performs serious instruction folding, use the instcombine pass instead.
14//
15//===----------------------------------------------------------------------===//
16
17#include "llvm/Transforms/Utils/SimplifyLibCalls.h"
18#include "llvm/DataLayout.h"
19#include "llvm/ADT/StringMap.h"
20#include "llvm/Analysis/ValueTracking.h"
21#include "llvm/Function.h"
22#include "llvm/IRBuilder.h"
23#include "llvm/LLVMContext.h"
24#include "llvm/Target/TargetLibraryInfo.h"
25#include "llvm/Transforms/Utils/BuildLibCalls.h"
26
27using namespace llvm;
28
29/// This class is the abstract base class for the set of optimizations that
30/// corresponds to one library call.
31namespace {
32class LibCallOptimization {
33protected:
34  Function *Caller;
35  const DataLayout *TD;
36  const TargetLibraryInfo *TLI;
37  const LibCallSimplifier *LCS;
38  LLVMContext* Context;
39public:
40  LibCallOptimization() { }
41  virtual ~LibCallOptimization() {}
42
43  /// callOptimizer - This pure virtual method is implemented by base classes to
44  /// do various optimizations.  If this returns null then no transformation was
45  /// performed.  If it returns CI, then it transformed the call and CI is to be
46  /// deleted.  If it returns something else, replace CI with the new value and
47  /// delete CI.
48  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B)
49    =0;
50
51  Value *optimizeCall(CallInst *CI, const DataLayout *TD,
52                      const TargetLibraryInfo *TLI,
53                      const LibCallSimplifier *LCS, IRBuilder<> &B) {
54    Caller = CI->getParent()->getParent();
55    this->TD = TD;
56    this->TLI = TLI;
57    this->LCS = LCS;
58    if (CI->getCalledFunction())
59      Context = &CI->getCalledFunction()->getContext();
60
61    // We never change the calling convention.
62    if (CI->getCallingConv() != llvm::CallingConv::C)
63      return NULL;
64
65    return callOptimizer(CI->getCalledFunction(), CI, B);
66  }
67};
68
69//===----------------------------------------------------------------------===//
70// Helper Functions
71//===----------------------------------------------------------------------===//
72
73/// isOnlyUsedInZeroEqualityComparison - Return true if it only matters that the
74/// value is equal or not-equal to zero.
75static bool isOnlyUsedInZeroEqualityComparison(Value *V) {
76  for (Value::use_iterator UI = V->use_begin(), E = V->use_end();
77       UI != E; ++UI) {
78    if (ICmpInst *IC = dyn_cast<ICmpInst>(*UI))
79      if (IC->isEquality())
80        if (Constant *C = dyn_cast<Constant>(IC->getOperand(1)))
81          if (C->isNullValue())
82            continue;
83    // Unknown instruction.
84    return false;
85  }
86  return true;
87}
88
89/// isOnlyUsedInEqualityComparison - Return true if it is only used in equality
90/// comparisons with With.
91static bool isOnlyUsedInEqualityComparison(Value *V, Value *With) {
92  for (Value::use_iterator UI = V->use_begin(), E = V->use_end();
93       UI != E; ++UI) {
94    if (ICmpInst *IC = dyn_cast<ICmpInst>(*UI))
95      if (IC->isEquality() && IC->getOperand(1) == With)
96        continue;
97    // Unknown instruction.
98    return false;
99  }
100  return true;
101}
102
103//===----------------------------------------------------------------------===//
104// Fortified Library Call Optimizations
105//===----------------------------------------------------------------------===//
106
107struct FortifiedLibCallOptimization : public LibCallOptimization {
108protected:
109  virtual bool isFoldable(unsigned SizeCIOp, unsigned SizeArgOp,
110			  bool isString) const = 0;
111};
112
113struct InstFortifiedLibCallOptimization : public FortifiedLibCallOptimization {
114  CallInst *CI;
115
116  bool isFoldable(unsigned SizeCIOp, unsigned SizeArgOp, bool isString) const {
117    if (CI->getArgOperand(SizeCIOp) == CI->getArgOperand(SizeArgOp))
118      return true;
119    if (ConstantInt *SizeCI =
120                           dyn_cast<ConstantInt>(CI->getArgOperand(SizeCIOp))) {
121      if (SizeCI->isAllOnesValue())
122        return true;
123      if (isString) {
124        uint64_t Len = GetStringLength(CI->getArgOperand(SizeArgOp));
125        // If the length is 0 we don't know how long it is and so we can't
126        // remove the check.
127        if (Len == 0) return false;
128        return SizeCI->getZExtValue() >= Len;
129      }
130      if (ConstantInt *Arg = dyn_cast<ConstantInt>(
131                                                  CI->getArgOperand(SizeArgOp)))
132        return SizeCI->getZExtValue() >= Arg->getZExtValue();
133    }
134    return false;
135  }
136};
137
138struct MemCpyChkOpt : public InstFortifiedLibCallOptimization {
139  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
140    this->CI = CI;
141    FunctionType *FT = Callee->getFunctionType();
142    LLVMContext &Context = CI->getParent()->getContext();
143
144    // Check if this has the right signature.
145    if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
146        !FT->getParamType(0)->isPointerTy() ||
147        !FT->getParamType(1)->isPointerTy() ||
148        FT->getParamType(2) != TD->getIntPtrType(Context) ||
149        FT->getParamType(3) != TD->getIntPtrType(Context))
150      return 0;
151
152    if (isFoldable(3, 2, false)) {
153      B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1),
154                     CI->getArgOperand(2), 1);
155      return CI->getArgOperand(0);
156    }
157    return 0;
158  }
159};
160
161struct MemMoveChkOpt : public InstFortifiedLibCallOptimization {
162  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
163    this->CI = CI;
164    FunctionType *FT = Callee->getFunctionType();
165    LLVMContext &Context = CI->getParent()->getContext();
166
167    // Check if this has the right signature.
168    if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
169        !FT->getParamType(0)->isPointerTy() ||
170        !FT->getParamType(1)->isPointerTy() ||
171        FT->getParamType(2) != TD->getIntPtrType(Context) ||
172        FT->getParamType(3) != TD->getIntPtrType(Context))
173      return 0;
174
175    if (isFoldable(3, 2, false)) {
176      B.CreateMemMove(CI->getArgOperand(0), CI->getArgOperand(1),
177                      CI->getArgOperand(2), 1);
178      return CI->getArgOperand(0);
179    }
180    return 0;
181  }
182};
183
184struct MemSetChkOpt : public InstFortifiedLibCallOptimization {
185  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
186    this->CI = CI;
187    FunctionType *FT = Callee->getFunctionType();
188    LLVMContext &Context = CI->getParent()->getContext();
189
190    // Check if this has the right signature.
191    if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
192        !FT->getParamType(0)->isPointerTy() ||
193        !FT->getParamType(1)->isIntegerTy() ||
194        FT->getParamType(2) != TD->getIntPtrType(Context) ||
195        FT->getParamType(3) != TD->getIntPtrType(Context))
196      return 0;
197
198    if (isFoldable(3, 2, false)) {
199      Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(),
200                                   false);
201      B.CreateMemSet(CI->getArgOperand(0), Val, CI->getArgOperand(2), 1);
202      return CI->getArgOperand(0);
203    }
204    return 0;
205  }
206};
207
208struct StrCpyChkOpt : public InstFortifiedLibCallOptimization {
209  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
210    this->CI = CI;
211    StringRef Name = Callee->getName();
212    FunctionType *FT = Callee->getFunctionType();
213    LLVMContext &Context = CI->getParent()->getContext();
214
215    // Check if this has the right signature.
216    if (FT->getNumParams() != 3 ||
217        FT->getReturnType() != FT->getParamType(0) ||
218        FT->getParamType(0) != FT->getParamType(1) ||
219        FT->getParamType(0) != Type::getInt8PtrTy(Context) ||
220        FT->getParamType(2) != TD->getIntPtrType(Context))
221      return 0;
222
223    Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1);
224    if (Dst == Src)      // __strcpy_chk(x,x)  -> x
225      return Src;
226
227    // If a) we don't have any length information, or b) we know this will
228    // fit then just lower to a plain strcpy. Otherwise we'll keep our
229    // strcpy_chk call which may fail at runtime if the size is too long.
230    // TODO: It might be nice to get a maximum length out of the possible
231    // string lengths for varying.
232    if (isFoldable(2, 1, true)) {
233      Value *Ret = EmitStrCpy(Dst, Src, B, TD, TLI, Name.substr(2, 6));
234      return Ret;
235    } else {
236      // Maybe we can stil fold __strcpy_chk to __memcpy_chk.
237      uint64_t Len = GetStringLength(Src);
238      if (Len == 0) return 0;
239
240      // This optimization require DataLayout.
241      if (!TD) return 0;
242
243      Value *Ret =
244	EmitMemCpyChk(Dst, Src,
245                      ConstantInt::get(TD->getIntPtrType(Context), Len),
246                      CI->getArgOperand(2), B, TD, TLI);
247      return Ret;
248    }
249    return 0;
250  }
251};
252
253struct StpCpyChkOpt : public InstFortifiedLibCallOptimization {
254  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
255    this->CI = CI;
256    StringRef Name = Callee->getName();
257    FunctionType *FT = Callee->getFunctionType();
258    LLVMContext &Context = CI->getParent()->getContext();
259
260    // Check if this has the right signature.
261    if (FT->getNumParams() != 3 ||
262        FT->getReturnType() != FT->getParamType(0) ||
263        FT->getParamType(0) != FT->getParamType(1) ||
264        FT->getParamType(0) != Type::getInt8PtrTy(Context) ||
265        FT->getParamType(2) != TD->getIntPtrType(FT->getParamType(0)))
266      return 0;
267
268    Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1);
269    if (Dst == Src) {  // stpcpy(x,x)  -> x+strlen(x)
270      Value *StrLen = EmitStrLen(Src, B, TD, TLI);
271      return StrLen ? B.CreateInBoundsGEP(Dst, StrLen) : 0;
272    }
273
274    // If a) we don't have any length information, or b) we know this will
275    // fit then just lower to a plain stpcpy. Otherwise we'll keep our
276    // stpcpy_chk call which may fail at runtime if the size is too long.
277    // TODO: It might be nice to get a maximum length out of the possible
278    // string lengths for varying.
279    if (isFoldable(2, 1, true)) {
280      Value *Ret = EmitStrCpy(Dst, Src, B, TD, TLI, Name.substr(2, 6));
281      return Ret;
282    } else {
283      // Maybe we can stil fold __stpcpy_chk to __memcpy_chk.
284      uint64_t Len = GetStringLength(Src);
285      if (Len == 0) return 0;
286
287      // This optimization require DataLayout.
288      if (!TD) return 0;
289
290      Type *PT = FT->getParamType(0);
291      Value *LenV = ConstantInt::get(TD->getIntPtrType(PT), Len);
292      Value *DstEnd = B.CreateGEP(Dst,
293                                  ConstantInt::get(TD->getIntPtrType(PT),
294                                                   Len - 1));
295      if (!EmitMemCpyChk(Dst, Src, LenV, CI->getArgOperand(2), B, TD, TLI))
296        return 0;
297      return DstEnd;
298    }
299    return 0;
300  }
301};
302
303struct StrNCpyChkOpt : public InstFortifiedLibCallOptimization {
304  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
305    this->CI = CI;
306    StringRef Name = Callee->getName();
307    FunctionType *FT = Callee->getFunctionType();
308    LLVMContext &Context = CI->getParent()->getContext();
309
310    // Check if this has the right signature.
311    if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
312        FT->getParamType(0) != FT->getParamType(1) ||
313        FT->getParamType(0) != Type::getInt8PtrTy(Context) ||
314        !FT->getParamType(2)->isIntegerTy() ||
315        FT->getParamType(3) != TD->getIntPtrType(Context))
316      return 0;
317
318    if (isFoldable(3, 2, false)) {
319      Value *Ret = EmitStrNCpy(CI->getArgOperand(0), CI->getArgOperand(1),
320                               CI->getArgOperand(2), B, TD, TLI,
321                               Name.substr(2, 7));
322      return Ret;
323    }
324    return 0;
325  }
326};
327
328//===----------------------------------------------------------------------===//
329// String and Memory Library Call Optimizations
330//===----------------------------------------------------------------------===//
331
332struct StrCatOpt : public LibCallOptimization {
333  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
334    // Verify the "strcat" function prototype.
335    FunctionType *FT = Callee->getFunctionType();
336    if (FT->getNumParams() != 2 ||
337        FT->getReturnType() != B.getInt8PtrTy() ||
338        FT->getParamType(0) != FT->getReturnType() ||
339        FT->getParamType(1) != FT->getReturnType())
340      return 0;
341
342    // Extract some information from the instruction
343    Value *Dst = CI->getArgOperand(0);
344    Value *Src = CI->getArgOperand(1);
345
346    // See if we can get the length of the input string.
347    uint64_t Len = GetStringLength(Src);
348    if (Len == 0) return 0;
349    --Len;  // Unbias length.
350
351    // Handle the simple, do-nothing case: strcat(x, "") -> x
352    if (Len == 0)
353      return Dst;
354
355    // These optimizations require DataLayout.
356    if (!TD) return 0;
357
358    return emitStrLenMemCpy(Src, Dst, Len, B);
359  }
360
361  Value *emitStrLenMemCpy(Value *Src, Value *Dst, uint64_t Len,
362                          IRBuilder<> &B) {
363    // We need to find the end of the destination string.  That's where the
364    // memory is to be moved to. We just generate a call to strlen.
365    Value *DstLen = EmitStrLen(Dst, B, TD, TLI);
366    if (!DstLen)
367      return 0;
368
369    // Now that we have the destination's length, we must index into the
370    // destination's pointer to get the actual memcpy destination (end of
371    // the string .. we're concatenating).
372    Value *CpyDst = B.CreateGEP(Dst, DstLen, "endptr");
373
374    // We have enough information to now generate the memcpy call to do the
375    // concatenation for us.  Make a memcpy to copy the nul byte with align = 1.
376    B.CreateMemCpy(CpyDst, Src,
377                   ConstantInt::get(TD->getIntPtrType(*Context), Len + 1), 1);
378    return Dst;
379  }
380};
381
382struct StrNCatOpt : public StrCatOpt {
383  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
384    // Verify the "strncat" function prototype.
385    FunctionType *FT = Callee->getFunctionType();
386    if (FT->getNumParams() != 3 ||
387        FT->getReturnType() != B.getInt8PtrTy() ||
388        FT->getParamType(0) != FT->getReturnType() ||
389        FT->getParamType(1) != FT->getReturnType() ||
390        !FT->getParamType(2)->isIntegerTy())
391      return 0;
392
393    // Extract some information from the instruction
394    Value *Dst = CI->getArgOperand(0);
395    Value *Src = CI->getArgOperand(1);
396    uint64_t Len;
397
398    // We don't do anything if length is not constant
399    if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(CI->getArgOperand(2)))
400      Len = LengthArg->getZExtValue();
401    else
402      return 0;
403
404    // See if we can get the length of the input string.
405    uint64_t SrcLen = GetStringLength(Src);
406    if (SrcLen == 0) return 0;
407    --SrcLen;  // Unbias length.
408
409    // Handle the simple, do-nothing cases:
410    // strncat(x, "", c) -> x
411    // strncat(x,  c, 0) -> x
412    if (SrcLen == 0 || Len == 0) return Dst;
413
414    // These optimizations require DataLayout.
415    if (!TD) return 0;
416
417    // We don't optimize this case
418    if (Len < SrcLen) return 0;
419
420    // strncat(x, s, c) -> strcat(x, s)
421    // s is constant so the strcat can be optimized further
422    return emitStrLenMemCpy(Src, Dst, SrcLen, B);
423  }
424};
425
426struct StrChrOpt : public LibCallOptimization {
427  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
428    // Verify the "strchr" function prototype.
429    FunctionType *FT = Callee->getFunctionType();
430    if (FT->getNumParams() != 2 ||
431        FT->getReturnType() != B.getInt8PtrTy() ||
432        FT->getParamType(0) != FT->getReturnType() ||
433        !FT->getParamType(1)->isIntegerTy(32))
434      return 0;
435
436    Value *SrcStr = CI->getArgOperand(0);
437
438    // If the second operand is non-constant, see if we can compute the length
439    // of the input string and turn this into memchr.
440    ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1));
441    if (CharC == 0) {
442      // These optimizations require DataLayout.
443      if (!TD) return 0;
444
445      uint64_t Len = GetStringLength(SrcStr);
446      if (Len == 0 || !FT->getParamType(1)->isIntegerTy(32))// memchr needs i32.
447        return 0;
448
449      return EmitMemChr(SrcStr, CI->getArgOperand(1), // include nul.
450                        ConstantInt::get(TD->getIntPtrType(*Context), Len),
451                        B, TD, TLI);
452    }
453
454    // Otherwise, the character is a constant, see if the first argument is
455    // a string literal.  If so, we can constant fold.
456    StringRef Str;
457    if (!getConstantStringInfo(SrcStr, Str))
458      return 0;
459
460    // Compute the offset, make sure to handle the case when we're searching for
461    // zero (a weird way to spell strlen).
462    size_t I = CharC->getSExtValue() == 0 ?
463        Str.size() : Str.find(CharC->getSExtValue());
464    if (I == StringRef::npos) // Didn't find the char.  strchr returns null.
465      return Constant::getNullValue(CI->getType());
466
467    // strchr(s+n,c)  -> gep(s+n+i,c)
468    return B.CreateGEP(SrcStr, B.getInt64(I), "strchr");
469  }
470};
471
472struct StrRChrOpt : public LibCallOptimization {
473  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
474    // Verify the "strrchr" function prototype.
475    FunctionType *FT = Callee->getFunctionType();
476    if (FT->getNumParams() != 2 ||
477        FT->getReturnType() != B.getInt8PtrTy() ||
478        FT->getParamType(0) != FT->getReturnType() ||
479        !FT->getParamType(1)->isIntegerTy(32))
480      return 0;
481
482    Value *SrcStr = CI->getArgOperand(0);
483    ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1));
484
485    // Cannot fold anything if we're not looking for a constant.
486    if (!CharC)
487      return 0;
488
489    StringRef Str;
490    if (!getConstantStringInfo(SrcStr, Str)) {
491      // strrchr(s, 0) -> strchr(s, 0)
492      if (TD && CharC->isZero())
493        return EmitStrChr(SrcStr, '\0', B, TD, TLI);
494      return 0;
495    }
496
497    // Compute the offset.
498    size_t I = CharC->getSExtValue() == 0 ?
499        Str.size() : Str.rfind(CharC->getSExtValue());
500    if (I == StringRef::npos) // Didn't find the char. Return null.
501      return Constant::getNullValue(CI->getType());
502
503    // strrchr(s+n,c) -> gep(s+n+i,c)
504    return B.CreateGEP(SrcStr, B.getInt64(I), "strrchr");
505  }
506};
507
508struct StrCmpOpt : public LibCallOptimization {
509  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
510    // Verify the "strcmp" function prototype.
511    FunctionType *FT = Callee->getFunctionType();
512    if (FT->getNumParams() != 2 ||
513        !FT->getReturnType()->isIntegerTy(32) ||
514        FT->getParamType(0) != FT->getParamType(1) ||
515        FT->getParamType(0) != B.getInt8PtrTy())
516      return 0;
517
518    Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1);
519    if (Str1P == Str2P)      // strcmp(x,x)  -> 0
520      return ConstantInt::get(CI->getType(), 0);
521
522    StringRef Str1, Str2;
523    bool HasStr1 = getConstantStringInfo(Str1P, Str1);
524    bool HasStr2 = getConstantStringInfo(Str2P, Str2);
525
526    // strcmp(x, y)  -> cnst  (if both x and y are constant strings)
527    if (HasStr1 && HasStr2)
528      return ConstantInt::get(CI->getType(), Str1.compare(Str2));
529
530    if (HasStr1 && Str1.empty()) // strcmp("", x) -> -*x
531      return B.CreateNeg(B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"),
532                                      CI->getType()));
533
534    if (HasStr2 && Str2.empty()) // strcmp(x,"") -> *x
535      return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType());
536
537    // strcmp(P, "x") -> memcmp(P, "x", 2)
538    uint64_t Len1 = GetStringLength(Str1P);
539    uint64_t Len2 = GetStringLength(Str2P);
540    if (Len1 && Len2) {
541      // These optimizations require DataLayout.
542      if (!TD) return 0;
543
544      return EmitMemCmp(Str1P, Str2P,
545                        ConstantInt::get(TD->getIntPtrType(*Context),
546                        std::min(Len1, Len2)), B, TD, TLI);
547    }
548
549    return 0;
550  }
551};
552
553struct StrNCmpOpt : public LibCallOptimization {
554  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
555    // Verify the "strncmp" function prototype.
556    FunctionType *FT = Callee->getFunctionType();
557    if (FT->getNumParams() != 3 ||
558        !FT->getReturnType()->isIntegerTy(32) ||
559        FT->getParamType(0) != FT->getParamType(1) ||
560        FT->getParamType(0) != B.getInt8PtrTy() ||
561        !FT->getParamType(2)->isIntegerTy())
562      return 0;
563
564    Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1);
565    if (Str1P == Str2P)      // strncmp(x,x,n)  -> 0
566      return ConstantInt::get(CI->getType(), 0);
567
568    // Get the length argument if it is constant.
569    uint64_t Length;
570    if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(CI->getArgOperand(2)))
571      Length = LengthArg->getZExtValue();
572    else
573      return 0;
574
575    if (Length == 0) // strncmp(x,y,0)   -> 0
576      return ConstantInt::get(CI->getType(), 0);
577
578    if (TD && Length == 1) // strncmp(x,y,1) -> memcmp(x,y,1)
579      return EmitMemCmp(Str1P, Str2P, CI->getArgOperand(2), B, TD, TLI);
580
581    StringRef Str1, Str2;
582    bool HasStr1 = getConstantStringInfo(Str1P, Str1);
583    bool HasStr2 = getConstantStringInfo(Str2P, Str2);
584
585    // strncmp(x, y)  -> cnst  (if both x and y are constant strings)
586    if (HasStr1 && HasStr2) {
587      StringRef SubStr1 = Str1.substr(0, Length);
588      StringRef SubStr2 = Str2.substr(0, Length);
589      return ConstantInt::get(CI->getType(), SubStr1.compare(SubStr2));
590    }
591
592    if (HasStr1 && Str1.empty())  // strncmp("", x, n) -> -*x
593      return B.CreateNeg(B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"),
594                                      CI->getType()));
595
596    if (HasStr2 && Str2.empty())  // strncmp(x, "", n) -> *x
597      return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType());
598
599    return 0;
600  }
601};
602
603struct StrCpyOpt : public LibCallOptimization {
604  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
605    // Verify the "strcpy" function prototype.
606    FunctionType *FT = Callee->getFunctionType();
607    if (FT->getNumParams() != 2 ||
608        FT->getReturnType() != FT->getParamType(0) ||
609        FT->getParamType(0) != FT->getParamType(1) ||
610        FT->getParamType(0) != B.getInt8PtrTy())
611      return 0;
612
613    Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1);
614    if (Dst == Src)      // strcpy(x,x)  -> x
615      return Src;
616
617    // These optimizations require DataLayout.
618    if (!TD) return 0;
619
620    // See if we can get the length of the input string.
621    uint64_t Len = GetStringLength(Src);
622    if (Len == 0) return 0;
623
624    // We have enough information to now generate the memcpy call to do the
625    // copy for us.  Make a memcpy to copy the nul byte with align = 1.
626    B.CreateMemCpy(Dst, Src,
627		   ConstantInt::get(TD->getIntPtrType(*Context), Len), 1);
628    return Dst;
629  }
630};
631
632struct StpCpyOpt: public LibCallOptimization {
633  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
634    // Verify the "stpcpy" function prototype.
635    FunctionType *FT = Callee->getFunctionType();
636    if (FT->getNumParams() != 2 ||
637        FT->getReturnType() != FT->getParamType(0) ||
638        FT->getParamType(0) != FT->getParamType(1) ||
639        FT->getParamType(0) != B.getInt8PtrTy())
640      return 0;
641
642    // These optimizations require DataLayout.
643    if (!TD) return 0;
644
645    Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1);
646    if (Dst == Src) {  // stpcpy(x,x)  -> x+strlen(x)
647      Value *StrLen = EmitStrLen(Src, B, TD, TLI);
648      return StrLen ? B.CreateInBoundsGEP(Dst, StrLen) : 0;
649    }
650
651    // See if we can get the length of the input string.
652    uint64_t Len = GetStringLength(Src);
653    if (Len == 0) return 0;
654
655    Type *PT = FT->getParamType(0);
656    Value *LenV = ConstantInt::get(TD->getIntPtrType(PT), Len);
657    Value *DstEnd = B.CreateGEP(Dst,
658                                ConstantInt::get(TD->getIntPtrType(PT),
659                                                 Len - 1));
660
661    // We have enough information to now generate the memcpy call to do the
662    // copy for us.  Make a memcpy to copy the nul byte with align = 1.
663    B.CreateMemCpy(Dst, Src, LenV, 1);
664    return DstEnd;
665  }
666};
667
668struct StrNCpyOpt : public LibCallOptimization {
669  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
670    FunctionType *FT = Callee->getFunctionType();
671    if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) ||
672        FT->getParamType(0) != FT->getParamType(1) ||
673        FT->getParamType(0) != B.getInt8PtrTy() ||
674        !FT->getParamType(2)->isIntegerTy())
675      return 0;
676
677    Value *Dst = CI->getArgOperand(0);
678    Value *Src = CI->getArgOperand(1);
679    Value *LenOp = CI->getArgOperand(2);
680
681    // See if we can get the length of the input string.
682    uint64_t SrcLen = GetStringLength(Src);
683    if (SrcLen == 0) return 0;
684    --SrcLen;
685
686    if (SrcLen == 0) {
687      // strncpy(x, "", y) -> memset(x, '\0', y, 1)
688      B.CreateMemSet(Dst, B.getInt8('\0'), LenOp, 1);
689      return Dst;
690    }
691
692    uint64_t Len;
693    if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(LenOp))
694      Len = LengthArg->getZExtValue();
695    else
696      return 0;
697
698    if (Len == 0) return Dst; // strncpy(x, y, 0) -> x
699
700    // These optimizations require DataLayout.
701    if (!TD) return 0;
702
703    // Let strncpy handle the zero padding
704    if (Len > SrcLen+1) return 0;
705
706    Type *PT = FT->getParamType(0);
707    // strncpy(x, s, c) -> memcpy(x, s, c, 1) [s and c are constant]
708    B.CreateMemCpy(Dst, Src,
709                   ConstantInt::get(TD->getIntPtrType(PT), Len), 1);
710
711    return Dst;
712  }
713};
714
715struct StrLenOpt : public LibCallOptimization {
716  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
717    FunctionType *FT = Callee->getFunctionType();
718    if (FT->getNumParams() != 1 ||
719        FT->getParamType(0) != B.getInt8PtrTy() ||
720        !FT->getReturnType()->isIntegerTy())
721      return 0;
722
723    Value *Src = CI->getArgOperand(0);
724
725    // Constant folding: strlen("xyz") -> 3
726    if (uint64_t Len = GetStringLength(Src))
727      return ConstantInt::get(CI->getType(), Len-1);
728
729    // strlen(x) != 0 --> *x != 0
730    // strlen(x) == 0 --> *x == 0
731    if (isOnlyUsedInZeroEqualityComparison(CI))
732      return B.CreateZExt(B.CreateLoad(Src, "strlenfirst"), CI->getType());
733    return 0;
734  }
735};
736
737struct StrPBrkOpt : public LibCallOptimization {
738  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
739    FunctionType *FT = Callee->getFunctionType();
740    if (FT->getNumParams() != 2 ||
741        FT->getParamType(0) != B.getInt8PtrTy() ||
742        FT->getParamType(1) != FT->getParamType(0) ||
743        FT->getReturnType() != FT->getParamType(0))
744      return 0;
745
746    StringRef S1, S2;
747    bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
748    bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
749
750    // strpbrk(s, "") -> NULL
751    // strpbrk("", s) -> NULL
752    if ((HasS1 && S1.empty()) || (HasS2 && S2.empty()))
753      return Constant::getNullValue(CI->getType());
754
755    // Constant folding.
756    if (HasS1 && HasS2) {
757      size_t I = S1.find_first_of(S2);
758      if (I == std::string::npos) // No match.
759        return Constant::getNullValue(CI->getType());
760
761      return B.CreateGEP(CI->getArgOperand(0), B.getInt64(I), "strpbrk");
762    }
763
764    // strpbrk(s, "a") -> strchr(s, 'a')
765    if (TD && HasS2 && S2.size() == 1)
766      return EmitStrChr(CI->getArgOperand(0), S2[0], B, TD, TLI);
767
768    return 0;
769  }
770};
771
772struct StrToOpt : public LibCallOptimization {
773  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
774    FunctionType *FT = Callee->getFunctionType();
775    if ((FT->getNumParams() != 2 && FT->getNumParams() != 3) ||
776        !FT->getParamType(0)->isPointerTy() ||
777        !FT->getParamType(1)->isPointerTy())
778      return 0;
779
780    Value *EndPtr = CI->getArgOperand(1);
781    if (isa<ConstantPointerNull>(EndPtr)) {
782      // With a null EndPtr, this function won't capture the main argument.
783      // It would be readonly too, except that it still may write to errno.
784      CI->addAttribute(1, Attributes::get(Callee->getContext(),
785                                          Attributes::NoCapture));
786    }
787
788    return 0;
789  }
790};
791
792struct StrSpnOpt : public LibCallOptimization {
793  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
794    FunctionType *FT = Callee->getFunctionType();
795    if (FT->getNumParams() != 2 ||
796        FT->getParamType(0) != B.getInt8PtrTy() ||
797        FT->getParamType(1) != FT->getParamType(0) ||
798        !FT->getReturnType()->isIntegerTy())
799      return 0;
800
801    StringRef S1, S2;
802    bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
803    bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
804
805    // strspn(s, "") -> 0
806    // strspn("", s) -> 0
807    if ((HasS1 && S1.empty()) || (HasS2 && S2.empty()))
808      return Constant::getNullValue(CI->getType());
809
810    // Constant folding.
811    if (HasS1 && HasS2) {
812      size_t Pos = S1.find_first_not_of(S2);
813      if (Pos == StringRef::npos) Pos = S1.size();
814      return ConstantInt::get(CI->getType(), Pos);
815    }
816
817    return 0;
818  }
819};
820
821struct StrCSpnOpt : public LibCallOptimization {
822  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
823    FunctionType *FT = Callee->getFunctionType();
824    if (FT->getNumParams() != 2 ||
825        FT->getParamType(0) != B.getInt8PtrTy() ||
826        FT->getParamType(1) != FT->getParamType(0) ||
827        !FT->getReturnType()->isIntegerTy())
828      return 0;
829
830    StringRef S1, S2;
831    bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
832    bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
833
834    // strcspn("", s) -> 0
835    if (HasS1 && S1.empty())
836      return Constant::getNullValue(CI->getType());
837
838    // Constant folding.
839    if (HasS1 && HasS2) {
840      size_t Pos = S1.find_first_of(S2);
841      if (Pos == StringRef::npos) Pos = S1.size();
842      return ConstantInt::get(CI->getType(), Pos);
843    }
844
845    // strcspn(s, "") -> strlen(s)
846    if (TD && HasS2 && S2.empty())
847      return EmitStrLen(CI->getArgOperand(0), B, TD, TLI);
848
849    return 0;
850  }
851};
852
853struct StrStrOpt : public LibCallOptimization {
854  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
855    FunctionType *FT = Callee->getFunctionType();
856    if (FT->getNumParams() != 2 ||
857        !FT->getParamType(0)->isPointerTy() ||
858        !FT->getParamType(1)->isPointerTy() ||
859        !FT->getReturnType()->isPointerTy())
860      return 0;
861
862    // fold strstr(x, x) -> x.
863    if (CI->getArgOperand(0) == CI->getArgOperand(1))
864      return B.CreateBitCast(CI->getArgOperand(0), CI->getType());
865
866    // fold strstr(a, b) == a -> strncmp(a, b, strlen(b)) == 0
867    if (TD && isOnlyUsedInEqualityComparison(CI, CI->getArgOperand(0))) {
868      Value *StrLen = EmitStrLen(CI->getArgOperand(1), B, TD, TLI);
869      if (!StrLen)
870        return 0;
871      Value *StrNCmp = EmitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1),
872                                   StrLen, B, TD, TLI);
873      if (!StrNCmp)
874        return 0;
875      for (Value::use_iterator UI = CI->use_begin(), UE = CI->use_end();
876           UI != UE; ) {
877        ICmpInst *Old = cast<ICmpInst>(*UI++);
878        Value *Cmp = B.CreateICmp(Old->getPredicate(), StrNCmp,
879                                  ConstantInt::getNullValue(StrNCmp->getType()),
880                                  "cmp");
881        LCS->replaceAllUsesWith(Old, Cmp);
882      }
883      return CI;
884    }
885
886    // See if either input string is a constant string.
887    StringRef SearchStr, ToFindStr;
888    bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr);
889    bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr);
890
891    // fold strstr(x, "") -> x.
892    if (HasStr2 && ToFindStr.empty())
893      return B.CreateBitCast(CI->getArgOperand(0), CI->getType());
894
895    // If both strings are known, constant fold it.
896    if (HasStr1 && HasStr2) {
897      std::string::size_type Offset = SearchStr.find(ToFindStr);
898
899      if (Offset == StringRef::npos) // strstr("foo", "bar") -> null
900        return Constant::getNullValue(CI->getType());
901
902      // strstr("abcd", "bc") -> gep((char*)"abcd", 1)
903      Value *Result = CastToCStr(CI->getArgOperand(0), B);
904      Result = B.CreateConstInBoundsGEP1_64(Result, Offset, "strstr");
905      return B.CreateBitCast(Result, CI->getType());
906    }
907
908    // fold strstr(x, "y") -> strchr(x, 'y').
909    if (HasStr2 && ToFindStr.size() == 1) {
910      Value *StrChr= EmitStrChr(CI->getArgOperand(0), ToFindStr[0], B, TD, TLI);
911      return StrChr ? B.CreateBitCast(StrChr, CI->getType()) : 0;
912    }
913    return 0;
914  }
915};
916
917struct MemCmpOpt : public LibCallOptimization {
918  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
919    FunctionType *FT = Callee->getFunctionType();
920    if (FT->getNumParams() != 3 || !FT->getParamType(0)->isPointerTy() ||
921        !FT->getParamType(1)->isPointerTy() ||
922        !FT->getReturnType()->isIntegerTy(32))
923      return 0;
924
925    Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1);
926
927    if (LHS == RHS)  // memcmp(s,s,x) -> 0
928      return Constant::getNullValue(CI->getType());
929
930    // Make sure we have a constant length.
931    ConstantInt *LenC = dyn_cast<ConstantInt>(CI->getArgOperand(2));
932    if (!LenC) return 0;
933    uint64_t Len = LenC->getZExtValue();
934
935    if (Len == 0) // memcmp(s1,s2,0) -> 0
936      return Constant::getNullValue(CI->getType());
937
938    // memcmp(S1,S2,1) -> *(unsigned char*)LHS - *(unsigned char*)RHS
939    if (Len == 1) {
940      Value *LHSV = B.CreateZExt(B.CreateLoad(CastToCStr(LHS, B), "lhsc"),
941                                 CI->getType(), "lhsv");
942      Value *RHSV = B.CreateZExt(B.CreateLoad(CastToCStr(RHS, B), "rhsc"),
943                                 CI->getType(), "rhsv");
944      return B.CreateSub(LHSV, RHSV, "chardiff");
945    }
946
947    // Constant folding: memcmp(x, y, l) -> cnst (all arguments are constant)
948    StringRef LHSStr, RHSStr;
949    if (getConstantStringInfo(LHS, LHSStr) &&
950        getConstantStringInfo(RHS, RHSStr)) {
951      // Make sure we're not reading out-of-bounds memory.
952      if (Len > LHSStr.size() || Len > RHSStr.size())
953        return 0;
954      // Fold the memcmp and normalize the result.  This way we get consistent
955      // results across multiple platforms.
956      uint64_t Ret = 0;
957      int Cmp = memcmp(LHSStr.data(), RHSStr.data(), Len);
958      if (Cmp < 0)
959        Ret = -1;
960      else if (Cmp > 0)
961        Ret = 1;
962      return ConstantInt::get(CI->getType(), Ret);
963    }
964
965    return 0;
966  }
967};
968
969struct MemCpyOpt : public LibCallOptimization {
970  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
971    // These optimizations require DataLayout.
972    if (!TD) return 0;
973
974    FunctionType *FT = Callee->getFunctionType();
975    if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) ||
976        !FT->getParamType(0)->isPointerTy() ||
977        !FT->getParamType(1)->isPointerTy() ||
978        FT->getParamType(2) != TD->getIntPtrType(*Context))
979      return 0;
980
981    // memcpy(x, y, n) -> llvm.memcpy(x, y, n, 1)
982    B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1),
983                   CI->getArgOperand(2), 1);
984    return CI->getArgOperand(0);
985  }
986};
987
988struct MemMoveOpt : public LibCallOptimization {
989  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
990    // These optimizations require DataLayout.
991    if (!TD) return 0;
992
993    FunctionType *FT = Callee->getFunctionType();
994    if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) ||
995        !FT->getParamType(0)->isPointerTy() ||
996        !FT->getParamType(1)->isPointerTy() ||
997        FT->getParamType(2) != TD->getIntPtrType(*Context))
998      return 0;
999
1000    // memmove(x, y, n) -> llvm.memmove(x, y, n, 1)
1001    B.CreateMemMove(CI->getArgOperand(0), CI->getArgOperand(1),
1002                    CI->getArgOperand(2), 1);
1003    return CI->getArgOperand(0);
1004  }
1005};
1006
1007struct MemSetOpt : public LibCallOptimization {
1008  virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
1009    // These optimizations require DataLayout.
1010    if (!TD) return 0;
1011
1012    FunctionType *FT = Callee->getFunctionType();
1013    if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) ||
1014        !FT->getParamType(0)->isPointerTy() ||
1015        !FT->getParamType(1)->isIntegerTy() ||
1016        FT->getParamType(2) != TD->getIntPtrType(*Context))
1017      return 0;
1018
1019    // memset(p, v, n) -> llvm.memset(p, v, n, 1)
1020    Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false);
1021    B.CreateMemSet(CI->getArgOperand(0), Val, CI->getArgOperand(2), 1);
1022    return CI->getArgOperand(0);
1023  }
1024};
1025
1026} // End anonymous namespace.
1027
1028namespace llvm {
1029
1030class LibCallSimplifierImpl {
1031  const DataLayout *TD;
1032  const TargetLibraryInfo *TLI;
1033  const LibCallSimplifier *LCS;
1034  StringMap<LibCallOptimization*> Optimizations;
1035
1036  // Fortified library call optimizations.
1037  MemCpyChkOpt MemCpyChk;
1038  MemMoveChkOpt MemMoveChk;
1039  MemSetChkOpt MemSetChk;
1040  StrCpyChkOpt StrCpyChk;
1041  StpCpyChkOpt StpCpyChk;
1042  StrNCpyChkOpt StrNCpyChk;
1043
1044  // String library call optimizations.
1045  StrCatOpt StrCat;
1046  StrNCatOpt StrNCat;
1047  StrChrOpt StrChr;
1048  StrRChrOpt StrRChr;
1049  StrCmpOpt StrCmp;
1050  StrNCmpOpt StrNCmp;
1051  StrCpyOpt StrCpy;
1052  StpCpyOpt StpCpy;
1053  StrNCpyOpt StrNCpy;
1054  StrLenOpt StrLen;
1055  StrPBrkOpt StrPBrk;
1056  StrToOpt StrTo;
1057  StrSpnOpt StrSpn;
1058  StrCSpnOpt StrCSpn;
1059  StrStrOpt StrStr;
1060
1061  // Memory library call optimizations.
1062  MemCmpOpt MemCmp;
1063  MemCpyOpt MemCpy;
1064  MemMoveOpt MemMove;
1065  MemSetOpt MemSet;
1066
1067  void initOptimizations();
1068  void addOpt(LibFunc::Func F, LibCallOptimization* Opt);
1069public:
1070  LibCallSimplifierImpl(const DataLayout *TD, const TargetLibraryInfo *TLI,
1071                        const LibCallSimplifier *LCS) {
1072    this->TD = TD;
1073    this->TLI = TLI;
1074    this->LCS = LCS;
1075  }
1076
1077  Value *optimizeCall(CallInst *CI);
1078};
1079
1080void LibCallSimplifierImpl::initOptimizations() {
1081  // Fortified library call optimizations.
1082  Optimizations["__memcpy_chk"] = &MemCpyChk;
1083  Optimizations["__memmove_chk"] = &MemMoveChk;
1084  Optimizations["__memset_chk"] = &MemSetChk;
1085  Optimizations["__strcpy_chk"] = &StrCpyChk;
1086  Optimizations["__stpcpy_chk"] = &StpCpyChk;
1087  Optimizations["__strncpy_chk"] = &StrNCpyChk;
1088  Optimizations["__stpncpy_chk"] = &StrNCpyChk;
1089
1090  // String library call optimizations.
1091  addOpt(LibFunc::strcat, &StrCat);
1092  addOpt(LibFunc::strncat, &StrNCat);
1093  addOpt(LibFunc::strchr, &StrChr);
1094  addOpt(LibFunc::strrchr, &StrRChr);
1095  addOpt(LibFunc::strcmp, &StrCmp);
1096  addOpt(LibFunc::strncmp, &StrNCmp);
1097  addOpt(LibFunc::strcpy, &StrCpy);
1098  addOpt(LibFunc::stpcpy, &StpCpy);
1099  addOpt(LibFunc::strncpy, &StrNCpy);
1100  addOpt(LibFunc::strlen, &StrLen);
1101  addOpt(LibFunc::strpbrk, &StrPBrk);
1102  addOpt(LibFunc::strtol, &StrTo);
1103  addOpt(LibFunc::strtod, &StrTo);
1104  addOpt(LibFunc::strtof, &StrTo);
1105  addOpt(LibFunc::strtoul, &StrTo);
1106  addOpt(LibFunc::strtoll, &StrTo);
1107  addOpt(LibFunc::strtold, &StrTo);
1108  addOpt(LibFunc::strtoull, &StrTo);
1109  addOpt(LibFunc::strspn, &StrSpn);
1110  addOpt(LibFunc::strcspn, &StrCSpn);
1111  addOpt(LibFunc::strstr, &StrStr);
1112
1113  // Memory library call optimizations.
1114  addOpt(LibFunc::memcmp, &MemCmp);
1115  addOpt(LibFunc::memcpy, &MemCpy);
1116  addOpt(LibFunc::memmove, &MemMove);
1117  addOpt(LibFunc::memset, &MemSet);
1118}
1119
1120Value *LibCallSimplifierImpl::optimizeCall(CallInst *CI) {
1121  if (Optimizations.empty())
1122    initOptimizations();
1123
1124  Function *Callee = CI->getCalledFunction();
1125  LibCallOptimization *LCO = Optimizations.lookup(Callee->getName());
1126  if (LCO) {
1127    IRBuilder<> Builder(CI);
1128    return LCO->optimizeCall(CI, TD, TLI, LCS, Builder);
1129  }
1130  return 0;
1131}
1132
1133void LibCallSimplifierImpl::addOpt(LibFunc::Func F, LibCallOptimization* Opt) {
1134  if (TLI->has(F))
1135    Optimizations[TLI->getName(F)] = Opt;
1136}
1137
1138LibCallSimplifier::LibCallSimplifier(const DataLayout *TD,
1139                                     const TargetLibraryInfo *TLI) {
1140  Impl = new LibCallSimplifierImpl(TD, TLI, this);
1141}
1142
1143LibCallSimplifier::~LibCallSimplifier() {
1144  delete Impl;
1145}
1146
1147Value *LibCallSimplifier::optimizeCall(CallInst *CI) {
1148  return Impl->optimizeCall(CI);
1149}
1150
1151void LibCallSimplifier::replaceAllUsesWith(Instruction *I, Value *With) const {
1152  I->replaceAllUsesWith(With);
1153  I->eraseFromParent();
1154}
1155
1156}
1157