1 //===- SimplifyLibCalls.cpp - Optimize specific well-known library calls --===// 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 file implements a simple pass that applies a variety of small 11 // optimizations for calls to specific well-known function calls (e.g. runtime 12 // library functions). Any optimization that takes the very simple form 13 // "replace call to library function with simpler code that provides the same 14 // result" belongs in this file. 15 // 16 //===----------------------------------------------------------------------===// 17 18 #define DEBUG_TYPE "simplify-libcalls" 19 #include "llvm/Transforms/Scalar.h" 20 #include "llvm/Transforms/Utils/BuildLibCalls.h" 21 #include "llvm/Intrinsics.h" 22 #include "llvm/LLVMContext.h" 23 #include "llvm/Module.h" 24 #include "llvm/Pass.h" 25 #include "llvm/Support/IRBuilder.h" 26 #include "llvm/Analysis/ValueTracking.h" 27 #include "llvm/Target/TargetData.h" 28 #include "llvm/Target/TargetLibraryInfo.h" 29 #include "llvm/ADT/SmallPtrSet.h" 30 #include "llvm/ADT/StringMap.h" 31 #include "llvm/ADT/Statistic.h" 32 #include "llvm/ADT/STLExtras.h" 33 #include "llvm/Support/Debug.h" 34 #include "llvm/Support/raw_ostream.h" 35 #include "llvm/Config/config.h" // FIXME: Shouldn't depend on host! 36 using namespace llvm; 37 38 STATISTIC(NumSimplified, "Number of library calls simplified"); 39 STATISTIC(NumAnnotated, "Number of attributes added to library functions"); 40 41 //===----------------------------------------------------------------------===// 42 // Optimizer Base Class 43 //===----------------------------------------------------------------------===// 44 45 /// This class is the abstract base class for the set of optimizations that 46 /// corresponds to one library call. 47 namespace { 48 class LibCallOptimization { 49 protected: 50 Function *Caller; 51 const TargetData *TD; 52 const TargetLibraryInfo *TLI; 53 LLVMContext* Context; 54 public: 55 LibCallOptimization() { } 56 virtual ~LibCallOptimization() {} 57 58 /// CallOptimizer - This pure virtual method is implemented by base classes to 59 /// do various optimizations. If this returns null then no transformation was 60 /// performed. If it returns CI, then it transformed the call and CI is to be 61 /// deleted. If it returns something else, replace CI with the new value and 62 /// delete CI. 63 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) 64 =0; 65 66 Value *OptimizeCall(CallInst *CI, const TargetData *TD, 67 const TargetLibraryInfo *TLI, IRBuilder<> &B) { 68 Caller = CI->getParent()->getParent(); 69 this->TD = TD; 70 this->TLI = TLI; 71 if (CI->getCalledFunction()) 72 Context = &CI->getCalledFunction()->getContext(); 73 74 // We never change the calling convention. 75 if (CI->getCallingConv() != llvm::CallingConv::C) 76 return NULL; 77 78 return CallOptimizer(CI->getCalledFunction(), CI, B); 79 } 80 }; 81 } // End anonymous namespace. 82 83 84 //===----------------------------------------------------------------------===// 85 // Helper Functions 86 //===----------------------------------------------------------------------===// 87 88 /// IsOnlyUsedInZeroEqualityComparison - Return true if it only matters that the 89 /// value is equal or not-equal to zero. 90 static bool IsOnlyUsedInZeroEqualityComparison(Value *V) { 91 for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); 92 UI != E; ++UI) { 93 if (ICmpInst *IC = dyn_cast<ICmpInst>(*UI)) 94 if (IC->isEquality()) 95 if (Constant *C = dyn_cast<Constant>(IC->getOperand(1))) 96 if (C->isNullValue()) 97 continue; 98 // Unknown instruction. 99 return false; 100 } 101 return true; 102 } 103 104 static bool CallHasFloatingPointArgument(const CallInst *CI) { 105 for (CallInst::const_op_iterator it = CI->op_begin(), e = CI->op_end(); 106 it != e; ++it) { 107 if ((*it)->getType()->isFloatingPointTy()) 108 return true; 109 } 110 return false; 111 } 112 113 /// IsOnlyUsedInEqualityComparison - Return true if it is only used in equality 114 /// comparisons with With. 115 static bool IsOnlyUsedInEqualityComparison(Value *V, Value *With) { 116 for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); 117 UI != E; ++UI) { 118 if (ICmpInst *IC = dyn_cast<ICmpInst>(*UI)) 119 if (IC->isEquality() && IC->getOperand(1) == With) 120 continue; 121 // Unknown instruction. 122 return false; 123 } 124 return true; 125 } 126 127 //===----------------------------------------------------------------------===// 128 // String and Memory LibCall Optimizations 129 //===----------------------------------------------------------------------===// 130 131 //===---------------------------------------===// 132 // 'strcat' Optimizations 133 namespace { 134 struct StrCatOpt : public LibCallOptimization { 135 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 136 // Verify the "strcat" function prototype. 137 FunctionType *FT = Callee->getFunctionType(); 138 if (FT->getNumParams() != 2 || 139 FT->getReturnType() != B.getInt8PtrTy() || 140 FT->getParamType(0) != FT->getReturnType() || 141 FT->getParamType(1) != FT->getReturnType()) 142 return 0; 143 144 // Extract some information from the instruction 145 Value *Dst = CI->getArgOperand(0); 146 Value *Src = CI->getArgOperand(1); 147 148 // See if we can get the length of the input string. 149 uint64_t Len = GetStringLength(Src); 150 if (Len == 0) return 0; 151 --Len; // Unbias length. 152 153 // Handle the simple, do-nothing case: strcat(x, "") -> x 154 if (Len == 0) 155 return Dst; 156 157 // These optimizations require TargetData. 158 if (!TD) return 0; 159 160 EmitStrLenMemCpy(Src, Dst, Len, B); 161 return Dst; 162 } 163 164 void EmitStrLenMemCpy(Value *Src, Value *Dst, uint64_t Len, IRBuilder<> &B) { 165 // We need to find the end of the destination string. That's where the 166 // memory is to be moved to. We just generate a call to strlen. 167 Value *DstLen = EmitStrLen(Dst, B, TD); 168 169 // Now that we have the destination's length, we must index into the 170 // destination's pointer to get the actual memcpy destination (end of 171 // the string .. we're concatenating). 172 Value *CpyDst = B.CreateGEP(Dst, DstLen, "endptr"); 173 174 // We have enough information to now generate the memcpy call to do the 175 // concatenation for us. Make a memcpy to copy the nul byte with align = 1. 176 B.CreateMemCpy(CpyDst, Src, 177 ConstantInt::get(TD->getIntPtrType(*Context), Len + 1), 1); 178 } 179 }; 180 181 //===---------------------------------------===// 182 // 'strncat' Optimizations 183 184 struct StrNCatOpt : public StrCatOpt { 185 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 186 // Verify the "strncat" function prototype. 187 FunctionType *FT = Callee->getFunctionType(); 188 if (FT->getNumParams() != 3 || 189 FT->getReturnType() != B.getInt8PtrTy() || 190 FT->getParamType(0) != FT->getReturnType() || 191 FT->getParamType(1) != FT->getReturnType() || 192 !FT->getParamType(2)->isIntegerTy()) 193 return 0; 194 195 // Extract some information from the instruction 196 Value *Dst = CI->getArgOperand(0); 197 Value *Src = CI->getArgOperand(1); 198 uint64_t Len; 199 200 // We don't do anything if length is not constant 201 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(CI->getArgOperand(2))) 202 Len = LengthArg->getZExtValue(); 203 else 204 return 0; 205 206 // See if we can get the length of the input string. 207 uint64_t SrcLen = GetStringLength(Src); 208 if (SrcLen == 0) return 0; 209 --SrcLen; // Unbias length. 210 211 // Handle the simple, do-nothing cases: 212 // strncat(x, "", c) -> x 213 // strncat(x, c, 0) -> x 214 if (SrcLen == 0 || Len == 0) return Dst; 215 216 // These optimizations require TargetData. 217 if (!TD) return 0; 218 219 // We don't optimize this case 220 if (Len < SrcLen) return 0; 221 222 // strncat(x, s, c) -> strcat(x, s) 223 // s is constant so the strcat can be optimized further 224 EmitStrLenMemCpy(Src, Dst, SrcLen, B); 225 return Dst; 226 } 227 }; 228 229 //===---------------------------------------===// 230 // 'strchr' Optimizations 231 232 struct StrChrOpt : public LibCallOptimization { 233 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 234 // Verify the "strchr" function prototype. 235 FunctionType *FT = Callee->getFunctionType(); 236 if (FT->getNumParams() != 2 || 237 FT->getReturnType() != B.getInt8PtrTy() || 238 FT->getParamType(0) != FT->getReturnType() || 239 !FT->getParamType(1)->isIntegerTy(32)) 240 return 0; 241 242 Value *SrcStr = CI->getArgOperand(0); 243 244 // If the second operand is non-constant, see if we can compute the length 245 // of the input string and turn this into memchr. 246 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); 247 if (CharC == 0) { 248 // These optimizations require TargetData. 249 if (!TD) return 0; 250 251 uint64_t Len = GetStringLength(SrcStr); 252 if (Len == 0 || !FT->getParamType(1)->isIntegerTy(32))// memchr needs i32. 253 return 0; 254 255 return EmitMemChr(SrcStr, CI->getArgOperand(1), // include nul. 256 ConstantInt::get(TD->getIntPtrType(*Context), Len), 257 B, TD); 258 } 259 260 // Otherwise, the character is a constant, see if the first argument is 261 // a string literal. If so, we can constant fold. 262 StringRef Str; 263 if (!getConstantStringInfo(SrcStr, Str)) 264 return 0; 265 266 // Compute the offset, make sure to handle the case when we're searching for 267 // zero (a weird way to spell strlen). 268 size_t I = CharC->getSExtValue() == 0 ? 269 Str.size() : Str.find(CharC->getSExtValue()); 270 if (I == StringRef::npos) // Didn't find the char. strchr returns null. 271 return Constant::getNullValue(CI->getType()); 272 273 // strchr(s+n,c) -> gep(s+n+i,c) 274 return B.CreateGEP(SrcStr, B.getInt64(I), "strchr"); 275 } 276 }; 277 278 //===---------------------------------------===// 279 // 'strrchr' Optimizations 280 281 struct StrRChrOpt : public LibCallOptimization { 282 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 283 // Verify the "strrchr" function prototype. 284 FunctionType *FT = Callee->getFunctionType(); 285 if (FT->getNumParams() != 2 || 286 FT->getReturnType() != B.getInt8PtrTy() || 287 FT->getParamType(0) != FT->getReturnType() || 288 !FT->getParamType(1)->isIntegerTy(32)) 289 return 0; 290 291 Value *SrcStr = CI->getArgOperand(0); 292 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); 293 294 // Cannot fold anything if we're not looking for a constant. 295 if (!CharC) 296 return 0; 297 298 StringRef Str; 299 if (!getConstantStringInfo(SrcStr, Str)) { 300 // strrchr(s, 0) -> strchr(s, 0) 301 if (TD && CharC->isZero()) 302 return EmitStrChr(SrcStr, '\0', B, TD); 303 return 0; 304 } 305 306 // Compute the offset. 307 size_t I = CharC->getSExtValue() == 0 ? 308 Str.size() : Str.rfind(CharC->getSExtValue()); 309 if (I == StringRef::npos) // Didn't find the char. Return null. 310 return Constant::getNullValue(CI->getType()); 311 312 // strrchr(s+n,c) -> gep(s+n+i,c) 313 return B.CreateGEP(SrcStr, B.getInt64(I), "strrchr"); 314 } 315 }; 316 317 //===---------------------------------------===// 318 // 'strcmp' Optimizations 319 320 struct StrCmpOpt : public LibCallOptimization { 321 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 322 // Verify the "strcmp" function prototype. 323 FunctionType *FT = Callee->getFunctionType(); 324 if (FT->getNumParams() != 2 || 325 !FT->getReturnType()->isIntegerTy(32) || 326 FT->getParamType(0) != FT->getParamType(1) || 327 FT->getParamType(0) != B.getInt8PtrTy()) 328 return 0; 329 330 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); 331 if (Str1P == Str2P) // strcmp(x,x) -> 0 332 return ConstantInt::get(CI->getType(), 0); 333 334 StringRef Str1, Str2; 335 bool HasStr1 = getConstantStringInfo(Str1P, Str1); 336 bool HasStr2 = getConstantStringInfo(Str2P, Str2); 337 338 // strcmp(x, y) -> cnst (if both x and y are constant strings) 339 if (HasStr1 && HasStr2) 340 return ConstantInt::get(CI->getType(), Str1.compare(Str2)); 341 342 if (HasStr1 && Str1.empty()) // strcmp("", x) -> -*x 343 return B.CreateNeg(B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"), 344 CI->getType())); 345 346 if (HasStr2 && Str2.empty()) // strcmp(x,"") -> *x 347 return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType()); 348 349 // strcmp(P, "x") -> memcmp(P, "x", 2) 350 uint64_t Len1 = GetStringLength(Str1P); 351 uint64_t Len2 = GetStringLength(Str2P); 352 if (Len1 && Len2) { 353 // These optimizations require TargetData. 354 if (!TD) return 0; 355 356 return EmitMemCmp(Str1P, Str2P, 357 ConstantInt::get(TD->getIntPtrType(*Context), 358 std::min(Len1, Len2)), B, TD); 359 } 360 361 return 0; 362 } 363 }; 364 365 //===---------------------------------------===// 366 // 'strncmp' Optimizations 367 368 struct StrNCmpOpt : public LibCallOptimization { 369 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 370 // Verify the "strncmp" function prototype. 371 FunctionType *FT = Callee->getFunctionType(); 372 if (FT->getNumParams() != 3 || 373 !FT->getReturnType()->isIntegerTy(32) || 374 FT->getParamType(0) != FT->getParamType(1) || 375 FT->getParamType(0) != B.getInt8PtrTy() || 376 !FT->getParamType(2)->isIntegerTy()) 377 return 0; 378 379 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); 380 if (Str1P == Str2P) // strncmp(x,x,n) -> 0 381 return ConstantInt::get(CI->getType(), 0); 382 383 // Get the length argument if it is constant. 384 uint64_t Length; 385 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(CI->getArgOperand(2))) 386 Length = LengthArg->getZExtValue(); 387 else 388 return 0; 389 390 if (Length == 0) // strncmp(x,y,0) -> 0 391 return ConstantInt::get(CI->getType(), 0); 392 393 if (TD && Length == 1) // strncmp(x,y,1) -> memcmp(x,y,1) 394 return EmitMemCmp(Str1P, Str2P, CI->getArgOperand(2), B, TD); 395 396 StringRef Str1, Str2; 397 bool HasStr1 = getConstantStringInfo(Str1P, Str1); 398 bool HasStr2 = getConstantStringInfo(Str2P, Str2); 399 400 // strncmp(x, y) -> cnst (if both x and y are constant strings) 401 if (HasStr1 && HasStr2) { 402 StringRef SubStr1 = Str1.substr(0, Length); 403 StringRef SubStr2 = Str2.substr(0, Length); 404 return ConstantInt::get(CI->getType(), SubStr1.compare(SubStr2)); 405 } 406 407 if (HasStr1 && Str1.empty()) // strncmp("", x, n) -> -*x 408 return B.CreateNeg(B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"), 409 CI->getType())); 410 411 if (HasStr2 && Str2.empty()) // strncmp(x, "", n) -> *x 412 return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType()); 413 414 return 0; 415 } 416 }; 417 418 419 //===---------------------------------------===// 420 // 'strcpy' Optimizations 421 422 struct StrCpyOpt : public LibCallOptimization { 423 bool OptChkCall; // True if it's optimizing a __strcpy_chk libcall. 424 425 StrCpyOpt(bool c) : OptChkCall(c) {} 426 427 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 428 // Verify the "strcpy" function prototype. 429 unsigned NumParams = OptChkCall ? 3 : 2; 430 FunctionType *FT = Callee->getFunctionType(); 431 if (FT->getNumParams() != NumParams || 432 FT->getReturnType() != FT->getParamType(0) || 433 FT->getParamType(0) != FT->getParamType(1) || 434 FT->getParamType(0) != B.getInt8PtrTy()) 435 return 0; 436 437 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); 438 if (Dst == Src) // strcpy(x,x) -> x 439 return Src; 440 441 // These optimizations require TargetData. 442 if (!TD) return 0; 443 444 // See if we can get the length of the input string. 445 uint64_t Len = GetStringLength(Src); 446 if (Len == 0) return 0; 447 448 // We have enough information to now generate the memcpy call to do the 449 // concatenation for us. Make a memcpy to copy the nul byte with align = 1. 450 if (OptChkCall) 451 EmitMemCpyChk(Dst, Src, 452 ConstantInt::get(TD->getIntPtrType(*Context), Len), 453 CI->getArgOperand(2), B, TD); 454 else 455 B.CreateMemCpy(Dst, Src, 456 ConstantInt::get(TD->getIntPtrType(*Context), Len), 1); 457 return Dst; 458 } 459 }; 460 461 //===---------------------------------------===// 462 // 'strncpy' Optimizations 463 464 struct StrNCpyOpt : public LibCallOptimization { 465 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 466 FunctionType *FT = Callee->getFunctionType(); 467 if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || 468 FT->getParamType(0) != FT->getParamType(1) || 469 FT->getParamType(0) != B.getInt8PtrTy() || 470 !FT->getParamType(2)->isIntegerTy()) 471 return 0; 472 473 Value *Dst = CI->getArgOperand(0); 474 Value *Src = CI->getArgOperand(1); 475 Value *LenOp = CI->getArgOperand(2); 476 477 // See if we can get the length of the input string. 478 uint64_t SrcLen = GetStringLength(Src); 479 if (SrcLen == 0) return 0; 480 --SrcLen; 481 482 if (SrcLen == 0) { 483 // strncpy(x, "", y) -> memset(x, '\0', y, 1) 484 B.CreateMemSet(Dst, B.getInt8('\0'), LenOp, 1); 485 return Dst; 486 } 487 488 uint64_t Len; 489 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(LenOp)) 490 Len = LengthArg->getZExtValue(); 491 else 492 return 0; 493 494 if (Len == 0) return Dst; // strncpy(x, y, 0) -> x 495 496 // These optimizations require TargetData. 497 if (!TD) return 0; 498 499 // Let strncpy handle the zero padding 500 if (Len > SrcLen+1) return 0; 501 502 // strncpy(x, s, c) -> memcpy(x, s, c, 1) [s and c are constant] 503 B.CreateMemCpy(Dst, Src, 504 ConstantInt::get(TD->getIntPtrType(*Context), Len), 1); 505 506 return Dst; 507 } 508 }; 509 510 //===---------------------------------------===// 511 // 'strlen' Optimizations 512 513 struct StrLenOpt : public LibCallOptimization { 514 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 515 FunctionType *FT = Callee->getFunctionType(); 516 if (FT->getNumParams() != 1 || 517 FT->getParamType(0) != B.getInt8PtrTy() || 518 !FT->getReturnType()->isIntegerTy()) 519 return 0; 520 521 Value *Src = CI->getArgOperand(0); 522 523 // Constant folding: strlen("xyz") -> 3 524 if (uint64_t Len = GetStringLength(Src)) 525 return ConstantInt::get(CI->getType(), Len-1); 526 527 // strlen(x) != 0 --> *x != 0 528 // strlen(x) == 0 --> *x == 0 529 if (IsOnlyUsedInZeroEqualityComparison(CI)) 530 return B.CreateZExt(B.CreateLoad(Src, "strlenfirst"), CI->getType()); 531 return 0; 532 } 533 }; 534 535 536 //===---------------------------------------===// 537 // 'strpbrk' Optimizations 538 539 struct StrPBrkOpt : public LibCallOptimization { 540 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 541 FunctionType *FT = Callee->getFunctionType(); 542 if (FT->getNumParams() != 2 || 543 FT->getParamType(0) != B.getInt8PtrTy() || 544 FT->getParamType(1) != FT->getParamType(0) || 545 FT->getReturnType() != FT->getParamType(0)) 546 return 0; 547 548 StringRef S1, S2; 549 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); 550 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); 551 552 // strpbrk(s, "") -> NULL 553 // strpbrk("", s) -> NULL 554 if ((HasS1 && S1.empty()) || (HasS2 && S2.empty())) 555 return Constant::getNullValue(CI->getType()); 556 557 // Constant folding. 558 if (HasS1 && HasS2) { 559 size_t I = S1.find_first_of(S2); 560 if (I == std::string::npos) // No match. 561 return Constant::getNullValue(CI->getType()); 562 563 return B.CreateGEP(CI->getArgOperand(0), B.getInt64(I), "strpbrk"); 564 } 565 566 // strpbrk(s, "a") -> strchr(s, 'a') 567 if (TD && HasS2 && S2.size() == 1) 568 return EmitStrChr(CI->getArgOperand(0), S2[0], B, TD); 569 570 return 0; 571 } 572 }; 573 574 //===---------------------------------------===// 575 // 'strto*' Optimizations. This handles strtol, strtod, strtof, strtoul, etc. 576 577 struct StrToOpt : public LibCallOptimization { 578 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 579 FunctionType *FT = Callee->getFunctionType(); 580 if ((FT->getNumParams() != 2 && FT->getNumParams() != 3) || 581 !FT->getParamType(0)->isPointerTy() || 582 !FT->getParamType(1)->isPointerTy()) 583 return 0; 584 585 Value *EndPtr = CI->getArgOperand(1); 586 if (isa<ConstantPointerNull>(EndPtr)) { 587 // With a null EndPtr, this function won't capture the main argument. 588 // It would be readonly too, except that it still may write to errno. 589 CI->addAttribute(1, Attribute::NoCapture); 590 } 591 592 return 0; 593 } 594 }; 595 596 //===---------------------------------------===// 597 // 'strspn' Optimizations 598 599 struct StrSpnOpt : public LibCallOptimization { 600 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 601 FunctionType *FT = Callee->getFunctionType(); 602 if (FT->getNumParams() != 2 || 603 FT->getParamType(0) != B.getInt8PtrTy() || 604 FT->getParamType(1) != FT->getParamType(0) || 605 !FT->getReturnType()->isIntegerTy()) 606 return 0; 607 608 StringRef S1, S2; 609 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); 610 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); 611 612 // strspn(s, "") -> 0 613 // strspn("", s) -> 0 614 if ((HasS1 && S1.empty()) || (HasS2 && S2.empty())) 615 return Constant::getNullValue(CI->getType()); 616 617 // Constant folding. 618 if (HasS1 && HasS2) { 619 size_t Pos = S1.find_first_not_of(S2); 620 if (Pos == StringRef::npos) Pos = S1.size(); 621 return ConstantInt::get(CI->getType(), Pos); 622 } 623 624 return 0; 625 } 626 }; 627 628 //===---------------------------------------===// 629 // 'strcspn' Optimizations 630 631 struct StrCSpnOpt : public LibCallOptimization { 632 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 633 FunctionType *FT = Callee->getFunctionType(); 634 if (FT->getNumParams() != 2 || 635 FT->getParamType(0) != B.getInt8PtrTy() || 636 FT->getParamType(1) != FT->getParamType(0) || 637 !FT->getReturnType()->isIntegerTy()) 638 return 0; 639 640 StringRef S1, S2; 641 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); 642 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); 643 644 // strcspn("", s) -> 0 645 if (HasS1 && S1.empty()) 646 return Constant::getNullValue(CI->getType()); 647 648 // Constant folding. 649 if (HasS1 && HasS2) { 650 size_t Pos = S1.find_first_of(S2); 651 if (Pos == StringRef::npos) Pos = S1.size(); 652 return ConstantInt::get(CI->getType(), Pos); 653 } 654 655 // strcspn(s, "") -> strlen(s) 656 if (TD && HasS2 && S2.empty()) 657 return EmitStrLen(CI->getArgOperand(0), B, TD); 658 659 return 0; 660 } 661 }; 662 663 //===---------------------------------------===// 664 // 'strstr' Optimizations 665 666 struct StrStrOpt : public LibCallOptimization { 667 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 668 FunctionType *FT = Callee->getFunctionType(); 669 if (FT->getNumParams() != 2 || 670 !FT->getParamType(0)->isPointerTy() || 671 !FT->getParamType(1)->isPointerTy() || 672 !FT->getReturnType()->isPointerTy()) 673 return 0; 674 675 // fold strstr(x, x) -> x. 676 if (CI->getArgOperand(0) == CI->getArgOperand(1)) 677 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); 678 679 // fold strstr(a, b) == a -> strncmp(a, b, strlen(b)) == 0 680 if (TD && IsOnlyUsedInEqualityComparison(CI, CI->getArgOperand(0))) { 681 Value *StrLen = EmitStrLen(CI->getArgOperand(1), B, TD); 682 Value *StrNCmp = EmitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1), 683 StrLen, B, TD); 684 for (Value::use_iterator UI = CI->use_begin(), UE = CI->use_end(); 685 UI != UE; ) { 686 ICmpInst *Old = cast<ICmpInst>(*UI++); 687 Value *Cmp = B.CreateICmp(Old->getPredicate(), StrNCmp, 688 ConstantInt::getNullValue(StrNCmp->getType()), 689 "cmp"); 690 Old->replaceAllUsesWith(Cmp); 691 Old->eraseFromParent(); 692 } 693 return CI; 694 } 695 696 // See if either input string is a constant string. 697 StringRef SearchStr, ToFindStr; 698 bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr); 699 bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr); 700 701 // fold strstr(x, "") -> x. 702 if (HasStr2 && ToFindStr.empty()) 703 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); 704 705 // If both strings are known, constant fold it. 706 if (HasStr1 && HasStr2) { 707 std::string::size_type Offset = SearchStr.find(ToFindStr); 708 709 if (Offset == StringRef::npos) // strstr("foo", "bar") -> null 710 return Constant::getNullValue(CI->getType()); 711 712 // strstr("abcd", "bc") -> gep((char*)"abcd", 1) 713 Value *Result = CastToCStr(CI->getArgOperand(0), B); 714 Result = B.CreateConstInBoundsGEP1_64(Result, Offset, "strstr"); 715 return B.CreateBitCast(Result, CI->getType()); 716 } 717 718 // fold strstr(x, "y") -> strchr(x, 'y'). 719 if (HasStr2 && ToFindStr.size() == 1) 720 return B.CreateBitCast(EmitStrChr(CI->getArgOperand(0), 721 ToFindStr[0], B, TD), CI->getType()); 722 return 0; 723 } 724 }; 725 726 727 //===---------------------------------------===// 728 // 'memcmp' Optimizations 729 730 struct MemCmpOpt : public LibCallOptimization { 731 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 732 FunctionType *FT = Callee->getFunctionType(); 733 if (FT->getNumParams() != 3 || !FT->getParamType(0)->isPointerTy() || 734 !FT->getParamType(1)->isPointerTy() || 735 !FT->getReturnType()->isIntegerTy(32)) 736 return 0; 737 738 Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1); 739 740 if (LHS == RHS) // memcmp(s,s,x) -> 0 741 return Constant::getNullValue(CI->getType()); 742 743 // Make sure we have a constant length. 744 ConstantInt *LenC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); 745 if (!LenC) return 0; 746 uint64_t Len = LenC->getZExtValue(); 747 748 if (Len == 0) // memcmp(s1,s2,0) -> 0 749 return Constant::getNullValue(CI->getType()); 750 751 // memcmp(S1,S2,1) -> *(unsigned char*)LHS - *(unsigned char*)RHS 752 if (Len == 1) { 753 Value *LHSV = B.CreateZExt(B.CreateLoad(CastToCStr(LHS, B), "lhsc"), 754 CI->getType(), "lhsv"); 755 Value *RHSV = B.CreateZExt(B.CreateLoad(CastToCStr(RHS, B), "rhsc"), 756 CI->getType(), "rhsv"); 757 return B.CreateSub(LHSV, RHSV, "chardiff"); 758 } 759 760 // Constant folding: memcmp(x, y, l) -> cnst (all arguments are constant) 761 StringRef LHSStr, RHSStr; 762 if (getConstantStringInfo(LHS, LHSStr) && 763 getConstantStringInfo(RHS, RHSStr)) { 764 // Make sure we're not reading out-of-bounds memory. 765 if (Len > LHSStr.size() || Len > RHSStr.size()) 766 return 0; 767 uint64_t Ret = memcmp(LHSStr.data(), RHSStr.data(), Len); 768 return ConstantInt::get(CI->getType(), Ret); 769 } 770 771 return 0; 772 } 773 }; 774 775 //===---------------------------------------===// 776 // 'memcpy' Optimizations 777 778 struct MemCpyOpt : public LibCallOptimization { 779 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 780 // These optimizations require TargetData. 781 if (!TD) return 0; 782 783 FunctionType *FT = Callee->getFunctionType(); 784 if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || 785 !FT->getParamType(0)->isPointerTy() || 786 !FT->getParamType(1)->isPointerTy() || 787 FT->getParamType(2) != TD->getIntPtrType(*Context)) 788 return 0; 789 790 // memcpy(x, y, n) -> llvm.memcpy(x, y, n, 1) 791 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1), 792 CI->getArgOperand(2), 1); 793 return CI->getArgOperand(0); 794 } 795 }; 796 797 //===---------------------------------------===// 798 // 'memmove' Optimizations 799 800 struct MemMoveOpt : public LibCallOptimization { 801 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 802 // These optimizations require TargetData. 803 if (!TD) return 0; 804 805 FunctionType *FT = Callee->getFunctionType(); 806 if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || 807 !FT->getParamType(0)->isPointerTy() || 808 !FT->getParamType(1)->isPointerTy() || 809 FT->getParamType(2) != TD->getIntPtrType(*Context)) 810 return 0; 811 812 // memmove(x, y, n) -> llvm.memmove(x, y, n, 1) 813 B.CreateMemMove(CI->getArgOperand(0), CI->getArgOperand(1), 814 CI->getArgOperand(2), 1); 815 return CI->getArgOperand(0); 816 } 817 }; 818 819 //===---------------------------------------===// 820 // 'memset' Optimizations 821 822 struct MemSetOpt : public LibCallOptimization { 823 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 824 // These optimizations require TargetData. 825 if (!TD) return 0; 826 827 FunctionType *FT = Callee->getFunctionType(); 828 if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || 829 !FT->getParamType(0)->isPointerTy() || 830 !FT->getParamType(1)->isIntegerTy() || 831 FT->getParamType(2) != TD->getIntPtrType(*Context)) 832 return 0; 833 834 // memset(p, v, n) -> llvm.memset(p, v, n, 1) 835 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); 836 B.CreateMemSet(CI->getArgOperand(0), Val, CI->getArgOperand(2), 1); 837 return CI->getArgOperand(0); 838 } 839 }; 840 841 //===----------------------------------------------------------------------===// 842 // Math Library Optimizations 843 //===----------------------------------------------------------------------===// 844 845 //===---------------------------------------===// 846 // 'cos*' Optimizations 847 848 struct CosOpt : public LibCallOptimization { 849 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 850 FunctionType *FT = Callee->getFunctionType(); 851 // Just make sure this has 1 argument of FP type, which matches the 852 // result type. 853 if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) || 854 !FT->getParamType(0)->isFloatingPointTy()) 855 return 0; 856 857 // cos(-x) -> cos(x) 858 Value *Op1 = CI->getArgOperand(0); 859 if (BinaryOperator::isFNeg(Op1)) { 860 BinaryOperator *BinExpr = cast<BinaryOperator>(Op1); 861 return B.CreateCall(Callee, BinExpr->getOperand(1), "cos"); 862 } 863 return 0; 864 } 865 }; 866 867 //===---------------------------------------===// 868 // 'pow*' Optimizations 869 870 struct PowOpt : public LibCallOptimization { 871 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 872 FunctionType *FT = Callee->getFunctionType(); 873 // Just make sure this has 2 arguments of the same FP type, which match the 874 // result type. 875 if (FT->getNumParams() != 2 || FT->getReturnType() != FT->getParamType(0) || 876 FT->getParamType(0) != FT->getParamType(1) || 877 !FT->getParamType(0)->isFloatingPointTy()) 878 return 0; 879 880 Value *Op1 = CI->getArgOperand(0), *Op2 = CI->getArgOperand(1); 881 if (ConstantFP *Op1C = dyn_cast<ConstantFP>(Op1)) { 882 if (Op1C->isExactlyValue(1.0)) // pow(1.0, x) -> 1.0 883 return Op1C; 884 if (Op1C->isExactlyValue(2.0)) // pow(2.0, x) -> exp2(x) 885 return EmitUnaryFloatFnCall(Op2, "exp2", B, Callee->getAttributes()); 886 } 887 888 ConstantFP *Op2C = dyn_cast<ConstantFP>(Op2); 889 if (Op2C == 0) return 0; 890 891 if (Op2C->getValueAPF().isZero()) // pow(x, 0.0) -> 1.0 892 return ConstantFP::get(CI->getType(), 1.0); 893 894 if (Op2C->isExactlyValue(0.5)) { 895 // Expand pow(x, 0.5) to (x == -infinity ? +infinity : fabs(sqrt(x))). 896 // This is faster than calling pow, and still handles negative zero 897 // and negative infinity correctly. 898 // TODO: In fast-math mode, this could be just sqrt(x). 899 // TODO: In finite-only mode, this could be just fabs(sqrt(x)). 900 Value *Inf = ConstantFP::getInfinity(CI->getType()); 901 Value *NegInf = ConstantFP::getInfinity(CI->getType(), true); 902 Value *Sqrt = EmitUnaryFloatFnCall(Op1, "sqrt", B, 903 Callee->getAttributes()); 904 Value *FAbs = EmitUnaryFloatFnCall(Sqrt, "fabs", B, 905 Callee->getAttributes()); 906 Value *FCmp = B.CreateFCmpOEQ(Op1, NegInf); 907 Value *Sel = B.CreateSelect(FCmp, Inf, FAbs); 908 return Sel; 909 } 910 911 if (Op2C->isExactlyValue(1.0)) // pow(x, 1.0) -> x 912 return Op1; 913 if (Op2C->isExactlyValue(2.0)) // pow(x, 2.0) -> x*x 914 return B.CreateFMul(Op1, Op1, "pow2"); 915 if (Op2C->isExactlyValue(-1.0)) // pow(x, -1.0) -> 1.0/x 916 return B.CreateFDiv(ConstantFP::get(CI->getType(), 1.0), 917 Op1, "powrecip"); 918 return 0; 919 } 920 }; 921 922 //===---------------------------------------===// 923 // 'exp2' Optimizations 924 925 struct Exp2Opt : public LibCallOptimization { 926 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 927 FunctionType *FT = Callee->getFunctionType(); 928 // Just make sure this has 1 argument of FP type, which matches the 929 // result type. 930 if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) || 931 !FT->getParamType(0)->isFloatingPointTy()) 932 return 0; 933 934 Value *Op = CI->getArgOperand(0); 935 // Turn exp2(sitofp(x)) -> ldexp(1.0, sext(x)) if sizeof(x) <= 32 936 // Turn exp2(uitofp(x)) -> ldexp(1.0, zext(x)) if sizeof(x) < 32 937 Value *LdExpArg = 0; 938 if (SIToFPInst *OpC = dyn_cast<SIToFPInst>(Op)) { 939 if (OpC->getOperand(0)->getType()->getPrimitiveSizeInBits() <= 32) 940 LdExpArg = B.CreateSExt(OpC->getOperand(0), B.getInt32Ty()); 941 } else if (UIToFPInst *OpC = dyn_cast<UIToFPInst>(Op)) { 942 if (OpC->getOperand(0)->getType()->getPrimitiveSizeInBits() < 32) 943 LdExpArg = B.CreateZExt(OpC->getOperand(0), B.getInt32Ty()); 944 } 945 946 if (LdExpArg) { 947 const char *Name; 948 if (Op->getType()->isFloatTy()) 949 Name = "ldexpf"; 950 else if (Op->getType()->isDoubleTy()) 951 Name = "ldexp"; 952 else 953 Name = "ldexpl"; 954 955 Constant *One = ConstantFP::get(*Context, APFloat(1.0f)); 956 if (!Op->getType()->isFloatTy()) 957 One = ConstantExpr::getFPExtend(One, Op->getType()); 958 959 Module *M = Caller->getParent(); 960 Value *Callee = M->getOrInsertFunction(Name, Op->getType(), 961 Op->getType(), 962 B.getInt32Ty(), NULL); 963 CallInst *CI = B.CreateCall2(Callee, One, LdExpArg); 964 if (const Function *F = dyn_cast<Function>(Callee->stripPointerCasts())) 965 CI->setCallingConv(F->getCallingConv()); 966 967 return CI; 968 } 969 return 0; 970 } 971 }; 972 973 //===---------------------------------------===// 974 // Double -> Float Shrinking Optimizations for Unary Functions like 'floor' 975 976 struct UnaryDoubleFPOpt : public LibCallOptimization { 977 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 978 FunctionType *FT = Callee->getFunctionType(); 979 if (FT->getNumParams() != 1 || !FT->getReturnType()->isDoubleTy() || 980 !FT->getParamType(0)->isDoubleTy()) 981 return 0; 982 983 // If this is something like 'floor((double)floatval)', convert to floorf. 984 FPExtInst *Cast = dyn_cast<FPExtInst>(CI->getArgOperand(0)); 985 if (Cast == 0 || !Cast->getOperand(0)->getType()->isFloatTy()) 986 return 0; 987 988 // floor((double)floatval) -> (double)floorf(floatval) 989 Value *V = Cast->getOperand(0); 990 V = EmitUnaryFloatFnCall(V, Callee->getName(), B, Callee->getAttributes()); 991 return B.CreateFPExt(V, B.getDoubleTy()); 992 } 993 }; 994 995 //===----------------------------------------------------------------------===// 996 // Integer Optimizations 997 //===----------------------------------------------------------------------===// 998 999 //===---------------------------------------===// 1000 // 'ffs*' Optimizations 1001 1002 struct FFSOpt : public LibCallOptimization { 1003 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1004 FunctionType *FT = Callee->getFunctionType(); 1005 // Just make sure this has 2 arguments of the same FP type, which match the 1006 // result type. 1007 if (FT->getNumParams() != 1 || 1008 !FT->getReturnType()->isIntegerTy(32) || 1009 !FT->getParamType(0)->isIntegerTy()) 1010 return 0; 1011 1012 Value *Op = CI->getArgOperand(0); 1013 1014 // Constant fold. 1015 if (ConstantInt *CI = dyn_cast<ConstantInt>(Op)) { 1016 if (CI->getValue() == 0) // ffs(0) -> 0. 1017 return Constant::getNullValue(CI->getType()); 1018 // ffs(c) -> cttz(c)+1 1019 return B.getInt32(CI->getValue().countTrailingZeros() + 1); 1020 } 1021 1022 // ffs(x) -> x != 0 ? (i32)llvm.cttz(x)+1 : 0 1023 Type *ArgType = Op->getType(); 1024 Value *F = Intrinsic::getDeclaration(Callee->getParent(), 1025 Intrinsic::cttz, ArgType); 1026 Value *V = B.CreateCall2(F, Op, B.getFalse(), "cttz"); 1027 V = B.CreateAdd(V, ConstantInt::get(V->getType(), 1)); 1028 V = B.CreateIntCast(V, B.getInt32Ty(), false); 1029 1030 Value *Cond = B.CreateICmpNE(Op, Constant::getNullValue(ArgType)); 1031 return B.CreateSelect(Cond, V, B.getInt32(0)); 1032 } 1033 }; 1034 1035 //===---------------------------------------===// 1036 // 'isdigit' Optimizations 1037 1038 struct IsDigitOpt : public LibCallOptimization { 1039 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1040 FunctionType *FT = Callee->getFunctionType(); 1041 // We require integer(i32) 1042 if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy() || 1043 !FT->getParamType(0)->isIntegerTy(32)) 1044 return 0; 1045 1046 // isdigit(c) -> (c-'0') <u 10 1047 Value *Op = CI->getArgOperand(0); 1048 Op = B.CreateSub(Op, B.getInt32('0'), "isdigittmp"); 1049 Op = B.CreateICmpULT(Op, B.getInt32(10), "isdigit"); 1050 return B.CreateZExt(Op, CI->getType()); 1051 } 1052 }; 1053 1054 //===---------------------------------------===// 1055 // 'isascii' Optimizations 1056 1057 struct IsAsciiOpt : public LibCallOptimization { 1058 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1059 FunctionType *FT = Callee->getFunctionType(); 1060 // We require integer(i32) 1061 if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy() || 1062 !FT->getParamType(0)->isIntegerTy(32)) 1063 return 0; 1064 1065 // isascii(c) -> c <u 128 1066 Value *Op = CI->getArgOperand(0); 1067 Op = B.CreateICmpULT(Op, B.getInt32(128), "isascii"); 1068 return B.CreateZExt(Op, CI->getType()); 1069 } 1070 }; 1071 1072 //===---------------------------------------===// 1073 // 'abs', 'labs', 'llabs' Optimizations 1074 1075 struct AbsOpt : public LibCallOptimization { 1076 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1077 FunctionType *FT = Callee->getFunctionType(); 1078 // We require integer(integer) where the types agree. 1079 if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy() || 1080 FT->getParamType(0) != FT->getReturnType()) 1081 return 0; 1082 1083 // abs(x) -> x >s -1 ? x : -x 1084 Value *Op = CI->getArgOperand(0); 1085 Value *Pos = B.CreateICmpSGT(Op, Constant::getAllOnesValue(Op->getType()), 1086 "ispos"); 1087 Value *Neg = B.CreateNeg(Op, "neg"); 1088 return B.CreateSelect(Pos, Op, Neg); 1089 } 1090 }; 1091 1092 1093 //===---------------------------------------===// 1094 // 'toascii' Optimizations 1095 1096 struct ToAsciiOpt : public LibCallOptimization { 1097 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1098 FunctionType *FT = Callee->getFunctionType(); 1099 // We require i32(i32) 1100 if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) || 1101 !FT->getParamType(0)->isIntegerTy(32)) 1102 return 0; 1103 1104 // isascii(c) -> c & 0x7f 1105 return B.CreateAnd(CI->getArgOperand(0), 1106 ConstantInt::get(CI->getType(),0x7F)); 1107 } 1108 }; 1109 1110 //===----------------------------------------------------------------------===// 1111 // Formatting and IO Optimizations 1112 //===----------------------------------------------------------------------===// 1113 1114 //===---------------------------------------===// 1115 // 'printf' Optimizations 1116 1117 struct PrintFOpt : public LibCallOptimization { 1118 Value *OptimizeFixedFormatString(Function *Callee, CallInst *CI, 1119 IRBuilder<> &B) { 1120 // Check for a fixed format string. 1121 StringRef FormatStr; 1122 if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr)) 1123 return 0; 1124 1125 // Empty format string -> noop. 1126 if (FormatStr.empty()) // Tolerate printf's declared void. 1127 return CI->use_empty() ? (Value*)CI : 1128 ConstantInt::get(CI->getType(), 0); 1129 1130 // Do not do any of the following transformations if the printf return value 1131 // is used, in general the printf return value is not compatible with either 1132 // putchar() or puts(). 1133 if (!CI->use_empty()) 1134 return 0; 1135 1136 // printf("x") -> putchar('x'), even for '%'. 1137 if (FormatStr.size() == 1) { 1138 Value *Res = EmitPutChar(B.getInt32(FormatStr[0]), B, TD); 1139 if (CI->use_empty()) return CI; 1140 return B.CreateIntCast(Res, CI->getType(), true); 1141 } 1142 1143 // printf("foo\n") --> puts("foo") 1144 if (FormatStr[FormatStr.size()-1] == '\n' && 1145 FormatStr.find('%') == std::string::npos) { // no format characters. 1146 // Create a string literal with no \n on it. We expect the constant merge 1147 // pass to be run after this pass, to merge duplicate strings. 1148 FormatStr = FormatStr.drop_back(); 1149 Value *GV = B.CreateGlobalString(FormatStr, "str"); 1150 EmitPutS(GV, B, TD); 1151 return CI->use_empty() ? (Value*)CI : 1152 ConstantInt::get(CI->getType(), FormatStr.size()+1); 1153 } 1154 1155 // Optimize specific format strings. 1156 // printf("%c", chr) --> putchar(chr) 1157 if (FormatStr == "%c" && CI->getNumArgOperands() > 1 && 1158 CI->getArgOperand(1)->getType()->isIntegerTy()) { 1159 Value *Res = EmitPutChar(CI->getArgOperand(1), B, TD); 1160 1161 if (CI->use_empty()) return CI; 1162 return B.CreateIntCast(Res, CI->getType(), true); 1163 } 1164 1165 // printf("%s\n", str) --> puts(str) 1166 if (FormatStr == "%s\n" && CI->getNumArgOperands() > 1 && 1167 CI->getArgOperand(1)->getType()->isPointerTy()) { 1168 EmitPutS(CI->getArgOperand(1), B, TD); 1169 return CI; 1170 } 1171 return 0; 1172 } 1173 1174 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1175 // Require one fixed pointer argument and an integer/void result. 1176 FunctionType *FT = Callee->getFunctionType(); 1177 if (FT->getNumParams() < 1 || !FT->getParamType(0)->isPointerTy() || 1178 !(FT->getReturnType()->isIntegerTy() || 1179 FT->getReturnType()->isVoidTy())) 1180 return 0; 1181 1182 if (Value *V = OptimizeFixedFormatString(Callee, CI, B)) { 1183 return V; 1184 } 1185 1186 // printf(format, ...) -> iprintf(format, ...) if no floating point 1187 // arguments. 1188 if (TLI->has(LibFunc::iprintf) && !CallHasFloatingPointArgument(CI)) { 1189 Module *M = B.GetInsertBlock()->getParent()->getParent(); 1190 Constant *IPrintFFn = 1191 M->getOrInsertFunction("iprintf", FT, Callee->getAttributes()); 1192 CallInst *New = cast<CallInst>(CI->clone()); 1193 New->setCalledFunction(IPrintFFn); 1194 B.Insert(New); 1195 return New; 1196 } 1197 return 0; 1198 } 1199 }; 1200 1201 //===---------------------------------------===// 1202 // 'sprintf' Optimizations 1203 1204 struct SPrintFOpt : public LibCallOptimization { 1205 Value *OptimizeFixedFormatString(Function *Callee, CallInst *CI, 1206 IRBuilder<> &B) { 1207 // Check for a fixed format string. 1208 StringRef FormatStr; 1209 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) 1210 return 0; 1211 1212 // If we just have a format string (nothing else crazy) transform it. 1213 if (CI->getNumArgOperands() == 2) { 1214 // Make sure there's no % in the constant array. We could try to handle 1215 // %% -> % in the future if we cared. 1216 for (unsigned i = 0, e = FormatStr.size(); i != e; ++i) 1217 if (FormatStr[i] == '%') 1218 return 0; // we found a format specifier, bail out. 1219 1220 // These optimizations require TargetData. 1221 if (!TD) return 0; 1222 1223 // sprintf(str, fmt) -> llvm.memcpy(str, fmt, strlen(fmt)+1, 1) 1224 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1), 1225 ConstantInt::get(TD->getIntPtrType(*Context), // Copy the 1226 FormatStr.size() + 1), 1); // nul byte. 1227 return ConstantInt::get(CI->getType(), FormatStr.size()); 1228 } 1229 1230 // The remaining optimizations require the format string to be "%s" or "%c" 1231 // and have an extra operand. 1232 if (FormatStr.size() != 2 || FormatStr[0] != '%' || 1233 CI->getNumArgOperands() < 3) 1234 return 0; 1235 1236 // Decode the second character of the format string. 1237 if (FormatStr[1] == 'c') { 1238 // sprintf(dst, "%c", chr) --> *(i8*)dst = chr; *((i8*)dst+1) = 0 1239 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) return 0; 1240 Value *V = B.CreateTrunc(CI->getArgOperand(2), B.getInt8Ty(), "char"); 1241 Value *Ptr = CastToCStr(CI->getArgOperand(0), B); 1242 B.CreateStore(V, Ptr); 1243 Ptr = B.CreateGEP(Ptr, B.getInt32(1), "nul"); 1244 B.CreateStore(B.getInt8(0), Ptr); 1245 1246 return ConstantInt::get(CI->getType(), 1); 1247 } 1248 1249 if (FormatStr[1] == 's') { 1250 // These optimizations require TargetData. 1251 if (!TD) return 0; 1252 1253 // sprintf(dest, "%s", str) -> llvm.memcpy(dest, str, strlen(str)+1, 1) 1254 if (!CI->getArgOperand(2)->getType()->isPointerTy()) return 0; 1255 1256 Value *Len = EmitStrLen(CI->getArgOperand(2), B, TD); 1257 Value *IncLen = B.CreateAdd(Len, 1258 ConstantInt::get(Len->getType(), 1), 1259 "leninc"); 1260 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(2), IncLen, 1); 1261 1262 // The sprintf result is the unincremented number of bytes in the string. 1263 return B.CreateIntCast(Len, CI->getType(), false); 1264 } 1265 return 0; 1266 } 1267 1268 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1269 // Require two fixed pointer arguments and an integer result. 1270 FunctionType *FT = Callee->getFunctionType(); 1271 if (FT->getNumParams() != 2 || !FT->getParamType(0)->isPointerTy() || 1272 !FT->getParamType(1)->isPointerTy() || 1273 !FT->getReturnType()->isIntegerTy()) 1274 return 0; 1275 1276 if (Value *V = OptimizeFixedFormatString(Callee, CI, B)) { 1277 return V; 1278 } 1279 1280 // sprintf(str, format, ...) -> siprintf(str, format, ...) if no floating 1281 // point arguments. 1282 if (TLI->has(LibFunc::siprintf) && !CallHasFloatingPointArgument(CI)) { 1283 Module *M = B.GetInsertBlock()->getParent()->getParent(); 1284 Constant *SIPrintFFn = 1285 M->getOrInsertFunction("siprintf", FT, Callee->getAttributes()); 1286 CallInst *New = cast<CallInst>(CI->clone()); 1287 New->setCalledFunction(SIPrintFFn); 1288 B.Insert(New); 1289 return New; 1290 } 1291 return 0; 1292 } 1293 }; 1294 1295 //===---------------------------------------===// 1296 // 'fwrite' Optimizations 1297 1298 struct FWriteOpt : public LibCallOptimization { 1299 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1300 // Require a pointer, an integer, an integer, a pointer, returning integer. 1301 FunctionType *FT = Callee->getFunctionType(); 1302 if (FT->getNumParams() != 4 || !FT->getParamType(0)->isPointerTy() || 1303 !FT->getParamType(1)->isIntegerTy() || 1304 !FT->getParamType(2)->isIntegerTy() || 1305 !FT->getParamType(3)->isPointerTy() || 1306 !FT->getReturnType()->isIntegerTy()) 1307 return 0; 1308 1309 // Get the element size and count. 1310 ConstantInt *SizeC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); 1311 ConstantInt *CountC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); 1312 if (!SizeC || !CountC) return 0; 1313 uint64_t Bytes = SizeC->getZExtValue()*CountC->getZExtValue(); 1314 1315 // If this is writing zero records, remove the call (it's a noop). 1316 if (Bytes == 0) 1317 return ConstantInt::get(CI->getType(), 0); 1318 1319 // If this is writing one byte, turn it into fputc. 1320 // This optimisation is only valid, if the return value is unused. 1321 if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F) 1322 Value *Char = B.CreateLoad(CastToCStr(CI->getArgOperand(0), B), "char"); 1323 EmitFPutC(Char, CI->getArgOperand(3), B, TD); 1324 return ConstantInt::get(CI->getType(), 1); 1325 } 1326 1327 return 0; 1328 } 1329 }; 1330 1331 //===---------------------------------------===// 1332 // 'fputs' Optimizations 1333 1334 struct FPutsOpt : public LibCallOptimization { 1335 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1336 // These optimizations require TargetData. 1337 if (!TD) return 0; 1338 1339 // Require two pointers. Also, we can't optimize if return value is used. 1340 FunctionType *FT = Callee->getFunctionType(); 1341 if (FT->getNumParams() != 2 || !FT->getParamType(0)->isPointerTy() || 1342 !FT->getParamType(1)->isPointerTy() || 1343 !CI->use_empty()) 1344 return 0; 1345 1346 // fputs(s,F) --> fwrite(s,1,strlen(s),F) 1347 uint64_t Len = GetStringLength(CI->getArgOperand(0)); 1348 if (!Len) return 0; 1349 EmitFWrite(CI->getArgOperand(0), 1350 ConstantInt::get(TD->getIntPtrType(*Context), Len-1), 1351 CI->getArgOperand(1), B, TD, TLI); 1352 return CI; // Known to have no uses (see above). 1353 } 1354 }; 1355 1356 //===---------------------------------------===// 1357 // 'fprintf' Optimizations 1358 1359 struct FPrintFOpt : public LibCallOptimization { 1360 Value *OptimizeFixedFormatString(Function *Callee, CallInst *CI, 1361 IRBuilder<> &B) { 1362 // All the optimizations depend on the format string. 1363 StringRef FormatStr; 1364 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) 1365 return 0; 1366 1367 // fprintf(F, "foo") --> fwrite("foo", 3, 1, F) 1368 if (CI->getNumArgOperands() == 2) { 1369 for (unsigned i = 0, e = FormatStr.size(); i != e; ++i) 1370 if (FormatStr[i] == '%') // Could handle %% -> % if we cared. 1371 return 0; // We found a format specifier. 1372 1373 // These optimizations require TargetData. 1374 if (!TD) return 0; 1375 1376 EmitFWrite(CI->getArgOperand(1), 1377 ConstantInt::get(TD->getIntPtrType(*Context), 1378 FormatStr.size()), 1379 CI->getArgOperand(0), B, TD, TLI); 1380 return ConstantInt::get(CI->getType(), FormatStr.size()); 1381 } 1382 1383 // The remaining optimizations require the format string to be "%s" or "%c" 1384 // and have an extra operand. 1385 if (FormatStr.size() != 2 || FormatStr[0] != '%' || 1386 CI->getNumArgOperands() < 3) 1387 return 0; 1388 1389 // Decode the second character of the format string. 1390 if (FormatStr[1] == 'c') { 1391 // fprintf(F, "%c", chr) --> fputc(chr, F) 1392 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) return 0; 1393 EmitFPutC(CI->getArgOperand(2), CI->getArgOperand(0), B, TD); 1394 return ConstantInt::get(CI->getType(), 1); 1395 } 1396 1397 if (FormatStr[1] == 's') { 1398 // fprintf(F, "%s", str) --> fputs(str, F) 1399 if (!CI->getArgOperand(2)->getType()->isPointerTy() || !CI->use_empty()) 1400 return 0; 1401 EmitFPutS(CI->getArgOperand(2), CI->getArgOperand(0), B, TD, TLI); 1402 return CI; 1403 } 1404 return 0; 1405 } 1406 1407 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1408 // Require two fixed paramters as pointers and integer result. 1409 FunctionType *FT = Callee->getFunctionType(); 1410 if (FT->getNumParams() != 2 || !FT->getParamType(0)->isPointerTy() || 1411 !FT->getParamType(1)->isPointerTy() || 1412 !FT->getReturnType()->isIntegerTy()) 1413 return 0; 1414 1415 if (Value *V = OptimizeFixedFormatString(Callee, CI, B)) { 1416 return V; 1417 } 1418 1419 // fprintf(stream, format, ...) -> fiprintf(stream, format, ...) if no 1420 // floating point arguments. 1421 if (TLI->has(LibFunc::fiprintf) && !CallHasFloatingPointArgument(CI)) { 1422 Module *M = B.GetInsertBlock()->getParent()->getParent(); 1423 Constant *FIPrintFFn = 1424 M->getOrInsertFunction("fiprintf", FT, Callee->getAttributes()); 1425 CallInst *New = cast<CallInst>(CI->clone()); 1426 New->setCalledFunction(FIPrintFFn); 1427 B.Insert(New); 1428 return New; 1429 } 1430 return 0; 1431 } 1432 }; 1433 1434 //===---------------------------------------===// 1435 // 'puts' Optimizations 1436 1437 struct PutsOpt : public LibCallOptimization { 1438 virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1439 // Require one fixed pointer argument and an integer/void result. 1440 FunctionType *FT = Callee->getFunctionType(); 1441 if (FT->getNumParams() < 1 || !FT->getParamType(0)->isPointerTy() || 1442 !(FT->getReturnType()->isIntegerTy() || 1443 FT->getReturnType()->isVoidTy())) 1444 return 0; 1445 1446 // Check for a constant string. 1447 StringRef Str; 1448 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) 1449 return 0; 1450 1451 if (Str.empty() && CI->use_empty()) { 1452 // puts("") -> putchar('\n') 1453 Value *Res = EmitPutChar(B.getInt32('\n'), B, TD); 1454 if (CI->use_empty()) return CI; 1455 return B.CreateIntCast(Res, CI->getType(), true); 1456 } 1457 1458 return 0; 1459 } 1460 }; 1461 1462 } // end anonymous namespace. 1463 1464 //===----------------------------------------------------------------------===// 1465 // SimplifyLibCalls Pass Implementation 1466 //===----------------------------------------------------------------------===// 1467 1468 namespace { 1469 /// This pass optimizes well known library functions from libc and libm. 1470 /// 1471 class SimplifyLibCalls : public FunctionPass { 1472 TargetLibraryInfo *TLI; 1473 1474 StringMap<LibCallOptimization*> Optimizations; 1475 // String and Memory LibCall Optimizations 1476 StrCatOpt StrCat; StrNCatOpt StrNCat; StrChrOpt StrChr; StrRChrOpt StrRChr; 1477 StrCmpOpt StrCmp; StrNCmpOpt StrNCmp; StrCpyOpt StrCpy; StrCpyOpt StrCpyChk; 1478 StrNCpyOpt StrNCpy; StrLenOpt StrLen; StrPBrkOpt StrPBrk; 1479 StrToOpt StrTo; StrSpnOpt StrSpn; StrCSpnOpt StrCSpn; StrStrOpt StrStr; 1480 MemCmpOpt MemCmp; MemCpyOpt MemCpy; MemMoveOpt MemMove; MemSetOpt MemSet; 1481 // Math Library Optimizations 1482 CosOpt Cos; PowOpt Pow; Exp2Opt Exp2; UnaryDoubleFPOpt UnaryDoubleFP; 1483 // Integer Optimizations 1484 FFSOpt FFS; AbsOpt Abs; IsDigitOpt IsDigit; IsAsciiOpt IsAscii; 1485 ToAsciiOpt ToAscii; 1486 // Formatting and IO Optimizations 1487 SPrintFOpt SPrintF; PrintFOpt PrintF; 1488 FWriteOpt FWrite; FPutsOpt FPuts; FPrintFOpt FPrintF; 1489 PutsOpt Puts; 1490 1491 bool Modified; // This is only used by doInitialization. 1492 public: 1493 static char ID; // Pass identification 1494 SimplifyLibCalls() : FunctionPass(ID), StrCpy(false), StrCpyChk(true) { 1495 initializeSimplifyLibCallsPass(*PassRegistry::getPassRegistry()); 1496 } 1497 void AddOpt(LibFunc::Func F, LibCallOptimization* Opt); 1498 void InitOptimizations(); 1499 bool runOnFunction(Function &F); 1500 1501 void setDoesNotAccessMemory(Function &F); 1502 void setOnlyReadsMemory(Function &F); 1503 void setDoesNotThrow(Function &F); 1504 void setDoesNotCapture(Function &F, unsigned n); 1505 void setDoesNotAlias(Function &F, unsigned n); 1506 bool doInitialization(Module &M); 1507 1508 void inferPrototypeAttributes(Function &F); 1509 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 1510 AU.addRequired<TargetLibraryInfo>(); 1511 } 1512 }; 1513 } // end anonymous namespace. 1514 1515 char SimplifyLibCalls::ID = 0; 1516 1517 INITIALIZE_PASS_BEGIN(SimplifyLibCalls, "simplify-libcalls", 1518 "Simplify well-known library calls", false, false) 1519 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo) 1520 INITIALIZE_PASS_END(SimplifyLibCalls, "simplify-libcalls", 1521 "Simplify well-known library calls", false, false) 1522 1523 // Public interface to the Simplify LibCalls pass. 1524 FunctionPass *llvm::createSimplifyLibCallsPass() { 1525 return new SimplifyLibCalls(); 1526 } 1527 1528 void SimplifyLibCalls::AddOpt(LibFunc::Func F, LibCallOptimization* Opt) { 1529 if (TLI->has(F)) 1530 Optimizations[TLI->getName(F)] = Opt; 1531 } 1532 1533 /// Optimizations - Populate the Optimizations map with all the optimizations 1534 /// we know. 1535 void SimplifyLibCalls::InitOptimizations() { 1536 // String and Memory LibCall Optimizations 1537 Optimizations["strcat"] = &StrCat; 1538 Optimizations["strncat"] = &StrNCat; 1539 Optimizations["strchr"] = &StrChr; 1540 Optimizations["strrchr"] = &StrRChr; 1541 Optimizations["strcmp"] = &StrCmp; 1542 Optimizations["strncmp"] = &StrNCmp; 1543 Optimizations["strcpy"] = &StrCpy; 1544 Optimizations["strncpy"] = &StrNCpy; 1545 Optimizations["strlen"] = &StrLen; 1546 Optimizations["strpbrk"] = &StrPBrk; 1547 Optimizations["strtol"] = &StrTo; 1548 Optimizations["strtod"] = &StrTo; 1549 Optimizations["strtof"] = &StrTo; 1550 Optimizations["strtoul"] = &StrTo; 1551 Optimizations["strtoll"] = &StrTo; 1552 Optimizations["strtold"] = &StrTo; 1553 Optimizations["strtoull"] = &StrTo; 1554 Optimizations["strspn"] = &StrSpn; 1555 Optimizations["strcspn"] = &StrCSpn; 1556 Optimizations["strstr"] = &StrStr; 1557 Optimizations["memcmp"] = &MemCmp; 1558 AddOpt(LibFunc::memcpy, &MemCpy); 1559 Optimizations["memmove"] = &MemMove; 1560 AddOpt(LibFunc::memset, &MemSet); 1561 1562 // _chk variants of String and Memory LibCall Optimizations. 1563 Optimizations["__strcpy_chk"] = &StrCpyChk; 1564 1565 // Math Library Optimizations 1566 Optimizations["cosf"] = &Cos; 1567 Optimizations["cos"] = &Cos; 1568 Optimizations["cosl"] = &Cos; 1569 Optimizations["powf"] = &Pow; 1570 Optimizations["pow"] = &Pow; 1571 Optimizations["powl"] = &Pow; 1572 Optimizations["llvm.pow.f32"] = &Pow; 1573 Optimizations["llvm.pow.f64"] = &Pow; 1574 Optimizations["llvm.pow.f80"] = &Pow; 1575 Optimizations["llvm.pow.f128"] = &Pow; 1576 Optimizations["llvm.pow.ppcf128"] = &Pow; 1577 Optimizations["exp2l"] = &Exp2; 1578 Optimizations["exp2"] = &Exp2; 1579 Optimizations["exp2f"] = &Exp2; 1580 Optimizations["llvm.exp2.ppcf128"] = &Exp2; 1581 Optimizations["llvm.exp2.f128"] = &Exp2; 1582 Optimizations["llvm.exp2.f80"] = &Exp2; 1583 Optimizations["llvm.exp2.f64"] = &Exp2; 1584 Optimizations["llvm.exp2.f32"] = &Exp2; 1585 1586 if (TLI->has(LibFunc::floor) && TLI->has(LibFunc::floorf)) 1587 Optimizations["floor"] = &UnaryDoubleFP; 1588 if (TLI->has(LibFunc::ceil) && TLI->has(LibFunc::ceilf)) 1589 Optimizations["ceil"] = &UnaryDoubleFP; 1590 if (TLI->has(LibFunc::round) && TLI->has(LibFunc::roundf)) 1591 Optimizations["round"] = &UnaryDoubleFP; 1592 if (TLI->has(LibFunc::rint) && TLI->has(LibFunc::rintf)) 1593 Optimizations["rint"] = &UnaryDoubleFP; 1594 if (TLI->has(LibFunc::nearbyint) && TLI->has(LibFunc::nearbyintf)) 1595 Optimizations["nearbyint"] = &UnaryDoubleFP; 1596 1597 // Integer Optimizations 1598 Optimizations["ffs"] = &FFS; 1599 Optimizations["ffsl"] = &FFS; 1600 Optimizations["ffsll"] = &FFS; 1601 Optimizations["abs"] = &Abs; 1602 Optimizations["labs"] = &Abs; 1603 Optimizations["llabs"] = &Abs; 1604 Optimizations["isdigit"] = &IsDigit; 1605 Optimizations["isascii"] = &IsAscii; 1606 Optimizations["toascii"] = &ToAscii; 1607 1608 // Formatting and IO Optimizations 1609 Optimizations["sprintf"] = &SPrintF; 1610 Optimizations["printf"] = &PrintF; 1611 AddOpt(LibFunc::fwrite, &FWrite); 1612 AddOpt(LibFunc::fputs, &FPuts); 1613 Optimizations["fprintf"] = &FPrintF; 1614 Optimizations["puts"] = &Puts; 1615 } 1616 1617 1618 /// runOnFunction - Top level algorithm. 1619 /// 1620 bool SimplifyLibCalls::runOnFunction(Function &F) { 1621 TLI = &getAnalysis<TargetLibraryInfo>(); 1622 1623 if (Optimizations.empty()) 1624 InitOptimizations(); 1625 1626 const TargetData *TD = getAnalysisIfAvailable<TargetData>(); 1627 1628 IRBuilder<> Builder(F.getContext()); 1629 1630 bool Changed = false; 1631 for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { 1632 for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) { 1633 // Ignore non-calls. 1634 CallInst *CI = dyn_cast<CallInst>(I++); 1635 if (!CI) continue; 1636 1637 // Ignore indirect calls and calls to non-external functions. 1638 Function *Callee = CI->getCalledFunction(); 1639 if (Callee == 0 || !Callee->isDeclaration() || 1640 !(Callee->hasExternalLinkage() || Callee->hasDLLImportLinkage())) 1641 continue; 1642 1643 // Ignore unknown calls. 1644 LibCallOptimization *LCO = Optimizations.lookup(Callee->getName()); 1645 if (!LCO) continue; 1646 1647 // Set the builder to the instruction after the call. 1648 Builder.SetInsertPoint(BB, I); 1649 1650 // Use debug location of CI for all new instructions. 1651 Builder.SetCurrentDebugLocation(CI->getDebugLoc()); 1652 1653 // Try to optimize this call. 1654 Value *Result = LCO->OptimizeCall(CI, TD, TLI, Builder); 1655 if (Result == 0) continue; 1656 1657 DEBUG(dbgs() << "SimplifyLibCalls simplified: " << *CI; 1658 dbgs() << " into: " << *Result << "\n"); 1659 1660 // Something changed! 1661 Changed = true; 1662 ++NumSimplified; 1663 1664 // Inspect the instruction after the call (which was potentially just 1665 // added) next. 1666 I = CI; ++I; 1667 1668 if (CI != Result && !CI->use_empty()) { 1669 CI->replaceAllUsesWith(Result); 1670 if (!Result->hasName()) 1671 Result->takeName(CI); 1672 } 1673 CI->eraseFromParent(); 1674 } 1675 } 1676 return Changed; 1677 } 1678 1679 // Utility methods for doInitialization. 1680 1681 void SimplifyLibCalls::setDoesNotAccessMemory(Function &F) { 1682 if (!F.doesNotAccessMemory()) { 1683 F.setDoesNotAccessMemory(); 1684 ++NumAnnotated; 1685 Modified = true; 1686 } 1687 } 1688 void SimplifyLibCalls::setOnlyReadsMemory(Function &F) { 1689 if (!F.onlyReadsMemory()) { 1690 F.setOnlyReadsMemory(); 1691 ++NumAnnotated; 1692 Modified = true; 1693 } 1694 } 1695 void SimplifyLibCalls::setDoesNotThrow(Function &F) { 1696 if (!F.doesNotThrow()) { 1697 F.setDoesNotThrow(); 1698 ++NumAnnotated; 1699 Modified = true; 1700 } 1701 } 1702 void SimplifyLibCalls::setDoesNotCapture(Function &F, unsigned n) { 1703 if (!F.doesNotCapture(n)) { 1704 F.setDoesNotCapture(n); 1705 ++NumAnnotated; 1706 Modified = true; 1707 } 1708 } 1709 void SimplifyLibCalls::setDoesNotAlias(Function &F, unsigned n) { 1710 if (!F.doesNotAlias(n)) { 1711 F.setDoesNotAlias(n); 1712 ++NumAnnotated; 1713 Modified = true; 1714 } 1715 } 1716 1717 1718 void SimplifyLibCalls::inferPrototypeAttributes(Function &F) { 1719 FunctionType *FTy = F.getFunctionType(); 1720 1721 StringRef Name = F.getName(); 1722 switch (Name[0]) { 1723 case 's': 1724 if (Name == "strlen") { 1725 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1726 return; 1727 setOnlyReadsMemory(F); 1728 setDoesNotThrow(F); 1729 setDoesNotCapture(F, 1); 1730 } else if (Name == "strchr" || 1731 Name == "strrchr") { 1732 if (FTy->getNumParams() != 2 || 1733 !FTy->getParamType(0)->isPointerTy() || 1734 !FTy->getParamType(1)->isIntegerTy()) 1735 return; 1736 setOnlyReadsMemory(F); 1737 setDoesNotThrow(F); 1738 } else if (Name == "strcpy" || 1739 Name == "stpcpy" || 1740 Name == "strcat" || 1741 Name == "strtol" || 1742 Name == "strtod" || 1743 Name == "strtof" || 1744 Name == "strtoul" || 1745 Name == "strtoll" || 1746 Name == "strtold" || 1747 Name == "strncat" || 1748 Name == "strncpy" || 1749 Name == "strtoull") { 1750 if (FTy->getNumParams() < 2 || 1751 !FTy->getParamType(1)->isPointerTy()) 1752 return; 1753 setDoesNotThrow(F); 1754 setDoesNotCapture(F, 2); 1755 } else if (Name == "strxfrm") { 1756 if (FTy->getNumParams() != 3 || 1757 !FTy->getParamType(0)->isPointerTy() || 1758 !FTy->getParamType(1)->isPointerTy()) 1759 return; 1760 setDoesNotThrow(F); 1761 setDoesNotCapture(F, 1); 1762 setDoesNotCapture(F, 2); 1763 } else if (Name == "strcmp" || 1764 Name == "strspn" || 1765 Name == "strncmp" || 1766 Name == "strcspn" || 1767 Name == "strcoll" || 1768 Name == "strcasecmp" || 1769 Name == "strncasecmp") { 1770 if (FTy->getNumParams() < 2 || 1771 !FTy->getParamType(0)->isPointerTy() || 1772 !FTy->getParamType(1)->isPointerTy()) 1773 return; 1774 setOnlyReadsMemory(F); 1775 setDoesNotThrow(F); 1776 setDoesNotCapture(F, 1); 1777 setDoesNotCapture(F, 2); 1778 } else if (Name == "strstr" || 1779 Name == "strpbrk") { 1780 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1781 return; 1782 setOnlyReadsMemory(F); 1783 setDoesNotThrow(F); 1784 setDoesNotCapture(F, 2); 1785 } else if (Name == "strtok" || 1786 Name == "strtok_r") { 1787 if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy()) 1788 return; 1789 setDoesNotThrow(F); 1790 setDoesNotCapture(F, 2); 1791 } else if (Name == "scanf" || 1792 Name == "setbuf" || 1793 Name == "setvbuf") { 1794 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy()) 1795 return; 1796 setDoesNotThrow(F); 1797 setDoesNotCapture(F, 1); 1798 } else if (Name == "strdup" || 1799 Name == "strndup") { 1800 if (FTy->getNumParams() < 1 || !FTy->getReturnType()->isPointerTy() || 1801 !FTy->getParamType(0)->isPointerTy()) 1802 return; 1803 setDoesNotThrow(F); 1804 setDoesNotAlias(F, 0); 1805 setDoesNotCapture(F, 1); 1806 } else if (Name == "stat" || 1807 Name == "sscanf" || 1808 Name == "sprintf" || 1809 Name == "statvfs") { 1810 if (FTy->getNumParams() < 2 || 1811 !FTy->getParamType(0)->isPointerTy() || 1812 !FTy->getParamType(1)->isPointerTy()) 1813 return; 1814 setDoesNotThrow(F); 1815 setDoesNotCapture(F, 1); 1816 setDoesNotCapture(F, 2); 1817 } else if (Name == "snprintf") { 1818 if (FTy->getNumParams() != 3 || 1819 !FTy->getParamType(0)->isPointerTy() || 1820 !FTy->getParamType(2)->isPointerTy()) 1821 return; 1822 setDoesNotThrow(F); 1823 setDoesNotCapture(F, 1); 1824 setDoesNotCapture(F, 3); 1825 } else if (Name == "setitimer") { 1826 if (FTy->getNumParams() != 3 || 1827 !FTy->getParamType(1)->isPointerTy() || 1828 !FTy->getParamType(2)->isPointerTy()) 1829 return; 1830 setDoesNotThrow(F); 1831 setDoesNotCapture(F, 2); 1832 setDoesNotCapture(F, 3); 1833 } else if (Name == "system") { 1834 if (FTy->getNumParams() != 1 || 1835 !FTy->getParamType(0)->isPointerTy()) 1836 return; 1837 // May throw; "system" is a valid pthread cancellation point. 1838 setDoesNotCapture(F, 1); 1839 } 1840 break; 1841 case 'm': 1842 if (Name == "malloc") { 1843 if (FTy->getNumParams() != 1 || 1844 !FTy->getReturnType()->isPointerTy()) 1845 return; 1846 setDoesNotThrow(F); 1847 setDoesNotAlias(F, 0); 1848 } else if (Name == "memcmp") { 1849 if (FTy->getNumParams() != 3 || 1850 !FTy->getParamType(0)->isPointerTy() || 1851 !FTy->getParamType(1)->isPointerTy()) 1852 return; 1853 setOnlyReadsMemory(F); 1854 setDoesNotThrow(F); 1855 setDoesNotCapture(F, 1); 1856 setDoesNotCapture(F, 2); 1857 } else if (Name == "memchr" || 1858 Name == "memrchr") { 1859 if (FTy->getNumParams() != 3) 1860 return; 1861 setOnlyReadsMemory(F); 1862 setDoesNotThrow(F); 1863 } else if (Name == "modf" || 1864 Name == "modff" || 1865 Name == "modfl" || 1866 Name == "memcpy" || 1867 Name == "memccpy" || 1868 Name == "memmove") { 1869 if (FTy->getNumParams() < 2 || 1870 !FTy->getParamType(1)->isPointerTy()) 1871 return; 1872 setDoesNotThrow(F); 1873 setDoesNotCapture(F, 2); 1874 } else if (Name == "memalign") { 1875 if (!FTy->getReturnType()->isPointerTy()) 1876 return; 1877 setDoesNotAlias(F, 0); 1878 } else if (Name == "mkdir" || 1879 Name == "mktime") { 1880 if (FTy->getNumParams() == 0 || 1881 !FTy->getParamType(0)->isPointerTy()) 1882 return; 1883 setDoesNotThrow(F); 1884 setDoesNotCapture(F, 1); 1885 } 1886 break; 1887 case 'r': 1888 if (Name == "realloc") { 1889 if (FTy->getNumParams() != 2 || 1890 !FTy->getParamType(0)->isPointerTy() || 1891 !FTy->getReturnType()->isPointerTy()) 1892 return; 1893 setDoesNotThrow(F); 1894 setDoesNotAlias(F, 0); 1895 setDoesNotCapture(F, 1); 1896 } else if (Name == "read") { 1897 if (FTy->getNumParams() != 3 || 1898 !FTy->getParamType(1)->isPointerTy()) 1899 return; 1900 // May throw; "read" is a valid pthread cancellation point. 1901 setDoesNotCapture(F, 2); 1902 } else if (Name == "rmdir" || 1903 Name == "rewind" || 1904 Name == "remove" || 1905 Name == "realpath") { 1906 if (FTy->getNumParams() < 1 || 1907 !FTy->getParamType(0)->isPointerTy()) 1908 return; 1909 setDoesNotThrow(F); 1910 setDoesNotCapture(F, 1); 1911 } else if (Name == "rename" || 1912 Name == "readlink") { 1913 if (FTy->getNumParams() < 2 || 1914 !FTy->getParamType(0)->isPointerTy() || 1915 !FTy->getParamType(1)->isPointerTy()) 1916 return; 1917 setDoesNotThrow(F); 1918 setDoesNotCapture(F, 1); 1919 setDoesNotCapture(F, 2); 1920 } 1921 break; 1922 case 'w': 1923 if (Name == "write") { 1924 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy()) 1925 return; 1926 // May throw; "write" is a valid pthread cancellation point. 1927 setDoesNotCapture(F, 2); 1928 } 1929 break; 1930 case 'b': 1931 if (Name == "bcopy") { 1932 if (FTy->getNumParams() != 3 || 1933 !FTy->getParamType(0)->isPointerTy() || 1934 !FTy->getParamType(1)->isPointerTy()) 1935 return; 1936 setDoesNotThrow(F); 1937 setDoesNotCapture(F, 1); 1938 setDoesNotCapture(F, 2); 1939 } else if (Name == "bcmp") { 1940 if (FTy->getNumParams() != 3 || 1941 !FTy->getParamType(0)->isPointerTy() || 1942 !FTy->getParamType(1)->isPointerTy()) 1943 return; 1944 setDoesNotThrow(F); 1945 setOnlyReadsMemory(F); 1946 setDoesNotCapture(F, 1); 1947 setDoesNotCapture(F, 2); 1948 } else if (Name == "bzero") { 1949 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 1950 return; 1951 setDoesNotThrow(F); 1952 setDoesNotCapture(F, 1); 1953 } 1954 break; 1955 case 'c': 1956 if (Name == "calloc") { 1957 if (FTy->getNumParams() != 2 || 1958 !FTy->getReturnType()->isPointerTy()) 1959 return; 1960 setDoesNotThrow(F); 1961 setDoesNotAlias(F, 0); 1962 } else if (Name == "chmod" || 1963 Name == "chown" || 1964 Name == "ctermid" || 1965 Name == "clearerr" || 1966 Name == "closedir") { 1967 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1968 return; 1969 setDoesNotThrow(F); 1970 setDoesNotCapture(F, 1); 1971 } 1972 break; 1973 case 'a': 1974 if (Name == "atoi" || 1975 Name == "atol" || 1976 Name == "atof" || 1977 Name == "atoll") { 1978 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1979 return; 1980 setDoesNotThrow(F); 1981 setOnlyReadsMemory(F); 1982 setDoesNotCapture(F, 1); 1983 } else if (Name == "access") { 1984 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 1985 return; 1986 setDoesNotThrow(F); 1987 setDoesNotCapture(F, 1); 1988 } 1989 break; 1990 case 'f': 1991 if (Name == "fopen") { 1992 if (FTy->getNumParams() != 2 || 1993 !FTy->getReturnType()->isPointerTy() || 1994 !FTy->getParamType(0)->isPointerTy() || 1995 !FTy->getParamType(1)->isPointerTy()) 1996 return; 1997 setDoesNotThrow(F); 1998 setDoesNotAlias(F, 0); 1999 setDoesNotCapture(F, 1); 2000 setDoesNotCapture(F, 2); 2001 } else if (Name == "fdopen") { 2002 if (FTy->getNumParams() != 2 || 2003 !FTy->getReturnType()->isPointerTy() || 2004 !FTy->getParamType(1)->isPointerTy()) 2005 return; 2006 setDoesNotThrow(F); 2007 setDoesNotAlias(F, 0); 2008 setDoesNotCapture(F, 2); 2009 } else if (Name == "feof" || 2010 Name == "free" || 2011 Name == "fseek" || 2012 Name == "ftell" || 2013 Name == "fgetc" || 2014 Name == "fseeko" || 2015 Name == "ftello" || 2016 Name == "fileno" || 2017 Name == "fflush" || 2018 Name == "fclose" || 2019 Name == "fsetpos" || 2020 Name == "flockfile" || 2021 Name == "funlockfile" || 2022 Name == "ftrylockfile") { 2023 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 2024 return; 2025 setDoesNotThrow(F); 2026 setDoesNotCapture(F, 1); 2027 } else if (Name == "ferror") { 2028 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 2029 return; 2030 setDoesNotThrow(F); 2031 setDoesNotCapture(F, 1); 2032 setOnlyReadsMemory(F); 2033 } else if (Name == "fputc" || 2034 Name == "fstat" || 2035 Name == "frexp" || 2036 Name == "frexpf" || 2037 Name == "frexpl" || 2038 Name == "fstatvfs") { 2039 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 2040 return; 2041 setDoesNotThrow(F); 2042 setDoesNotCapture(F, 2); 2043 } else if (Name == "fgets") { 2044 if (FTy->getNumParams() != 3 || 2045 !FTy->getParamType(0)->isPointerTy() || 2046 !FTy->getParamType(2)->isPointerTy()) 2047 return; 2048 setDoesNotThrow(F); 2049 setDoesNotCapture(F, 3); 2050 } else if (Name == "fread" || 2051 Name == "fwrite") { 2052 if (FTy->getNumParams() != 4 || 2053 !FTy->getParamType(0)->isPointerTy() || 2054 !FTy->getParamType(3)->isPointerTy()) 2055 return; 2056 setDoesNotThrow(F); 2057 setDoesNotCapture(F, 1); 2058 setDoesNotCapture(F, 4); 2059 } else if (Name == "fputs" || 2060 Name == "fscanf" || 2061 Name == "fprintf" || 2062 Name == "fgetpos") { 2063 if (FTy->getNumParams() < 2 || 2064 !FTy->getParamType(0)->isPointerTy() || 2065 !FTy->getParamType(1)->isPointerTy()) 2066 return; 2067 setDoesNotThrow(F); 2068 setDoesNotCapture(F, 1); 2069 setDoesNotCapture(F, 2); 2070 } 2071 break; 2072 case 'g': 2073 if (Name == "getc" || 2074 Name == "getlogin_r" || 2075 Name == "getc_unlocked") { 2076 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 2077 return; 2078 setDoesNotThrow(F); 2079 setDoesNotCapture(F, 1); 2080 } else if (Name == "getenv") { 2081 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 2082 return; 2083 setDoesNotThrow(F); 2084 setOnlyReadsMemory(F); 2085 setDoesNotCapture(F, 1); 2086 } else if (Name == "gets" || 2087 Name == "getchar") { 2088 setDoesNotThrow(F); 2089 } else if (Name == "getitimer") { 2090 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 2091 return; 2092 setDoesNotThrow(F); 2093 setDoesNotCapture(F, 2); 2094 } else if (Name == "getpwnam") { 2095 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 2096 return; 2097 setDoesNotThrow(F); 2098 setDoesNotCapture(F, 1); 2099 } 2100 break; 2101 case 'u': 2102 if (Name == "ungetc") { 2103 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 2104 return; 2105 setDoesNotThrow(F); 2106 setDoesNotCapture(F, 2); 2107 } else if (Name == "uname" || 2108 Name == "unlink" || 2109 Name == "unsetenv") { 2110 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 2111 return; 2112 setDoesNotThrow(F); 2113 setDoesNotCapture(F, 1); 2114 } else if (Name == "utime" || 2115 Name == "utimes") { 2116 if (FTy->getNumParams() != 2 || 2117 !FTy->getParamType(0)->isPointerTy() || 2118 !FTy->getParamType(1)->isPointerTy()) 2119 return; 2120 setDoesNotThrow(F); 2121 setDoesNotCapture(F, 1); 2122 setDoesNotCapture(F, 2); 2123 } 2124 break; 2125 case 'p': 2126 if (Name == "putc") { 2127 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 2128 return; 2129 setDoesNotThrow(F); 2130 setDoesNotCapture(F, 2); 2131 } else if (Name == "puts" || 2132 Name == "printf" || 2133 Name == "perror") { 2134 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 2135 return; 2136 setDoesNotThrow(F); 2137 setDoesNotCapture(F, 1); 2138 } else if (Name == "pread" || 2139 Name == "pwrite") { 2140 if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy()) 2141 return; 2142 // May throw; these are valid pthread cancellation points. 2143 setDoesNotCapture(F, 2); 2144 } else if (Name == "putchar") { 2145 setDoesNotThrow(F); 2146 } else if (Name == "popen") { 2147 if (FTy->getNumParams() != 2 || 2148 !FTy->getReturnType()->isPointerTy() || 2149 !FTy->getParamType(0)->isPointerTy() || 2150 !FTy->getParamType(1)->isPointerTy()) 2151 return; 2152 setDoesNotThrow(F); 2153 setDoesNotAlias(F, 0); 2154 setDoesNotCapture(F, 1); 2155 setDoesNotCapture(F, 2); 2156 } else if (Name == "pclose") { 2157 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 2158 return; 2159 setDoesNotThrow(F); 2160 setDoesNotCapture(F, 1); 2161 } 2162 break; 2163 case 'v': 2164 if (Name == "vscanf") { 2165 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 2166 return; 2167 setDoesNotThrow(F); 2168 setDoesNotCapture(F, 1); 2169 } else if (Name == "vsscanf" || 2170 Name == "vfscanf") { 2171 if (FTy->getNumParams() != 3 || 2172 !FTy->getParamType(1)->isPointerTy() || 2173 !FTy->getParamType(2)->isPointerTy()) 2174 return; 2175 setDoesNotThrow(F); 2176 setDoesNotCapture(F, 1); 2177 setDoesNotCapture(F, 2); 2178 } else if (Name == "valloc") { 2179 if (!FTy->getReturnType()->isPointerTy()) 2180 return; 2181 setDoesNotThrow(F); 2182 setDoesNotAlias(F, 0); 2183 } else if (Name == "vprintf") { 2184 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 2185 return; 2186 setDoesNotThrow(F); 2187 setDoesNotCapture(F, 1); 2188 } else if (Name == "vfprintf" || 2189 Name == "vsprintf") { 2190 if (FTy->getNumParams() != 3 || 2191 !FTy->getParamType(0)->isPointerTy() || 2192 !FTy->getParamType(1)->isPointerTy()) 2193 return; 2194 setDoesNotThrow(F); 2195 setDoesNotCapture(F, 1); 2196 setDoesNotCapture(F, 2); 2197 } else if (Name == "vsnprintf") { 2198 if (FTy->getNumParams() != 4 || 2199 !FTy->getParamType(0)->isPointerTy() || 2200 !FTy->getParamType(2)->isPointerTy()) 2201 return; 2202 setDoesNotThrow(F); 2203 setDoesNotCapture(F, 1); 2204 setDoesNotCapture(F, 3); 2205 } 2206 break; 2207 case 'o': 2208 if (Name == "open") { 2209 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy()) 2210 return; 2211 // May throw; "open" is a valid pthread cancellation point. 2212 setDoesNotCapture(F, 1); 2213 } else if (Name == "opendir") { 2214 if (FTy->getNumParams() != 1 || 2215 !FTy->getReturnType()->isPointerTy() || 2216 !FTy->getParamType(0)->isPointerTy()) 2217 return; 2218 setDoesNotThrow(F); 2219 setDoesNotAlias(F, 0); 2220 setDoesNotCapture(F, 1); 2221 } 2222 break; 2223 case 't': 2224 if (Name == "tmpfile") { 2225 if (!FTy->getReturnType()->isPointerTy()) 2226 return; 2227 setDoesNotThrow(F); 2228 setDoesNotAlias(F, 0); 2229 } else if (Name == "times") { 2230 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 2231 return; 2232 setDoesNotThrow(F); 2233 setDoesNotCapture(F, 1); 2234 } 2235 break; 2236 case 'h': 2237 if (Name == "htonl" || 2238 Name == "htons") { 2239 setDoesNotThrow(F); 2240 setDoesNotAccessMemory(F); 2241 } 2242 break; 2243 case 'n': 2244 if (Name == "ntohl" || 2245 Name == "ntohs") { 2246 setDoesNotThrow(F); 2247 setDoesNotAccessMemory(F); 2248 } 2249 break; 2250 case 'l': 2251 if (Name == "lstat") { 2252 if (FTy->getNumParams() != 2 || 2253 !FTy->getParamType(0)->isPointerTy() || 2254 !FTy->getParamType(1)->isPointerTy()) 2255 return; 2256 setDoesNotThrow(F); 2257 setDoesNotCapture(F, 1); 2258 setDoesNotCapture(F, 2); 2259 } else if (Name == "lchown") { 2260 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy()) 2261 return; 2262 setDoesNotThrow(F); 2263 setDoesNotCapture(F, 1); 2264 } 2265 break; 2266 case 'q': 2267 if (Name == "qsort") { 2268 if (FTy->getNumParams() != 4 || !FTy->getParamType(3)->isPointerTy()) 2269 return; 2270 // May throw; places call through function pointer. 2271 setDoesNotCapture(F, 4); 2272 } 2273 break; 2274 case '_': 2275 if (Name == "__strdup" || 2276 Name == "__strndup") { 2277 if (FTy->getNumParams() < 1 || 2278 !FTy->getReturnType()->isPointerTy() || 2279 !FTy->getParamType(0)->isPointerTy()) 2280 return; 2281 setDoesNotThrow(F); 2282 setDoesNotAlias(F, 0); 2283 setDoesNotCapture(F, 1); 2284 } else if (Name == "__strtok_r") { 2285 if (FTy->getNumParams() != 3 || 2286 !FTy->getParamType(1)->isPointerTy()) 2287 return; 2288 setDoesNotThrow(F); 2289 setDoesNotCapture(F, 2); 2290 } else if (Name == "_IO_getc") { 2291 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 2292 return; 2293 setDoesNotThrow(F); 2294 setDoesNotCapture(F, 1); 2295 } else if (Name == "_IO_putc") { 2296 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 2297 return; 2298 setDoesNotThrow(F); 2299 setDoesNotCapture(F, 2); 2300 } 2301 break; 2302 case 1: 2303 if (Name == "\1__isoc99_scanf") { 2304 if (FTy->getNumParams() < 1 || 2305 !FTy->getParamType(0)->isPointerTy()) 2306 return; 2307 setDoesNotThrow(F); 2308 setDoesNotCapture(F, 1); 2309 } else if (Name == "\1stat64" || 2310 Name == "\1lstat64" || 2311 Name == "\1statvfs64" || 2312 Name == "\1__isoc99_sscanf") { 2313 if (FTy->getNumParams() < 1 || 2314 !FTy->getParamType(0)->isPointerTy() || 2315 !FTy->getParamType(1)->isPointerTy()) 2316 return; 2317 setDoesNotThrow(F); 2318 setDoesNotCapture(F, 1); 2319 setDoesNotCapture(F, 2); 2320 } else if (Name == "\1fopen64") { 2321 if (FTy->getNumParams() != 2 || 2322 !FTy->getReturnType()->isPointerTy() || 2323 !FTy->getParamType(0)->isPointerTy() || 2324 !FTy->getParamType(1)->isPointerTy()) 2325 return; 2326 setDoesNotThrow(F); 2327 setDoesNotAlias(F, 0); 2328 setDoesNotCapture(F, 1); 2329 setDoesNotCapture(F, 2); 2330 } else if (Name == "\1fseeko64" || 2331 Name == "\1ftello64") { 2332 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 2333 return; 2334 setDoesNotThrow(F); 2335 setDoesNotCapture(F, 1); 2336 } else if (Name == "\1tmpfile64") { 2337 if (!FTy->getReturnType()->isPointerTy()) 2338 return; 2339 setDoesNotThrow(F); 2340 setDoesNotAlias(F, 0); 2341 } else if (Name == "\1fstat64" || 2342 Name == "\1fstatvfs64") { 2343 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 2344 return; 2345 setDoesNotThrow(F); 2346 setDoesNotCapture(F, 2); 2347 } else if (Name == "\1open64") { 2348 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy()) 2349 return; 2350 // May throw; "open" is a valid pthread cancellation point. 2351 setDoesNotCapture(F, 1); 2352 } 2353 break; 2354 } 2355 } 2356 2357 /// doInitialization - Add attributes to well-known functions. 2358 /// 2359 bool SimplifyLibCalls::doInitialization(Module &M) { 2360 Modified = false; 2361 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 2362 Function &F = *I; 2363 if (F.isDeclaration() && F.hasName()) 2364 inferPrototypeAttributes(F); 2365 } 2366 return Modified; 2367 } 2368 2369 // TODO: 2370 // Additional cases that we need to add to this file: 2371 // 2372 // cbrt: 2373 // * cbrt(expN(X)) -> expN(x/3) 2374 // * cbrt(sqrt(x)) -> pow(x,1/6) 2375 // * cbrt(sqrt(x)) -> pow(x,1/9) 2376 // 2377 // exp, expf, expl: 2378 // * exp(log(x)) -> x 2379 // 2380 // log, logf, logl: 2381 // * log(exp(x)) -> x 2382 // * log(x**y) -> y*log(x) 2383 // * log(exp(y)) -> y*log(e) 2384 // * log(exp2(y)) -> y*log(2) 2385 // * log(exp10(y)) -> y*log(10) 2386 // * log(sqrt(x)) -> 0.5*log(x) 2387 // * log(pow(x,y)) -> y*log(x) 2388 // 2389 // lround, lroundf, lroundl: 2390 // * lround(cnst) -> cnst' 2391 // 2392 // pow, powf, powl: 2393 // * pow(exp(x),y) -> exp(x*y) 2394 // * pow(sqrt(x),y) -> pow(x,y*0.5) 2395 // * pow(pow(x,y),z)-> pow(x,y*z) 2396 // 2397 // round, roundf, roundl: 2398 // * round(cnst) -> cnst' 2399 // 2400 // signbit: 2401 // * signbit(cnst) -> cnst' 2402 // * signbit(nncst) -> 0 (if pstv is a non-negative constant) 2403 // 2404 // sqrt, sqrtf, sqrtl: 2405 // * sqrt(expN(x)) -> expN(x*0.5) 2406 // * sqrt(Nroot(x)) -> pow(x,1/(2*N)) 2407 // * sqrt(pow(x,y)) -> pow(|x|,y*0.5) 2408 // 2409 // stpcpy: 2410 // * stpcpy(str, "literal") -> 2411 // llvm.memcpy(str,"literal",strlen("literal")+1,1) 2412 // 2413 // strchr: 2414 // * strchr(p, 0) -> strlen(p) 2415 // tan, tanf, tanl: 2416 // * tan(atan(x)) -> x 2417 // 2418 // trunc, truncf, truncl: 2419 // * trunc(cnst) -> cnst' 2420 // 2421 // 2422