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/ADT/SmallString.h" 19 #include "llvm/ADT/StringMap.h" 20 #include "llvm/Analysis/ValueTracking.h" 21 #include "llvm/IR/DataLayout.h" 22 #include "llvm/IR/Function.h" 23 #include "llvm/IR/IRBuilder.h" 24 #include "llvm/IR/IntrinsicInst.h" 25 #include "llvm/IR/Intrinsics.h" 26 #include "llvm/IR/LLVMContext.h" 27 #include "llvm/IR/Module.h" 28 #include "llvm/Support/Allocator.h" 29 #include "llvm/Target/TargetLibraryInfo.h" 30 #include "llvm/Transforms/Utils/BuildLibCalls.h" 31 32 using namespace llvm; 33 34 /// This class is the abstract base class for the set of optimizations that 35 /// corresponds to one library call. 36 namespace { 37 class LibCallOptimization { 38 protected: 39 Function *Caller; 40 const DataLayout *TD; 41 const TargetLibraryInfo *TLI; 42 const LibCallSimplifier *LCS; 43 LLVMContext* Context; 44 public: 45 LibCallOptimization() { } 46 virtual ~LibCallOptimization() {} 47 48 /// callOptimizer - This pure virtual method is implemented by base classes to 49 /// do various optimizations. If this returns null then no transformation was 50 /// performed. If it returns CI, then it transformed the call and CI is to be 51 /// deleted. If it returns something else, replace CI with the new value and 52 /// delete CI. 53 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) 54 =0; 55 56 /// ignoreCallingConv - Returns false if this transformation could possibly 57 /// change the calling convention. 58 virtual bool ignoreCallingConv() { return false; } 59 60 Value *optimizeCall(CallInst *CI, const DataLayout *TD, 61 const TargetLibraryInfo *TLI, 62 const LibCallSimplifier *LCS, IRBuilder<> &B) { 63 Caller = CI->getParent()->getParent(); 64 this->TD = TD; 65 this->TLI = TLI; 66 this->LCS = LCS; 67 if (CI->getCalledFunction()) 68 Context = &CI->getCalledFunction()->getContext(); 69 70 // We never change the calling convention. 71 if (!ignoreCallingConv() && CI->getCallingConv() != llvm::CallingConv::C) 72 return NULL; 73 74 return callOptimizer(CI->getCalledFunction(), CI, B); 75 } 76 }; 77 78 //===----------------------------------------------------------------------===// 79 // Helper Functions 80 //===----------------------------------------------------------------------===// 81 82 /// isOnlyUsedInZeroEqualityComparison - Return true if it only matters that the 83 /// value is equal or not-equal to zero. 84 static bool isOnlyUsedInZeroEqualityComparison(Value *V) { 85 for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); 86 UI != E; ++UI) { 87 if (ICmpInst *IC = dyn_cast<ICmpInst>(*UI)) 88 if (IC->isEquality()) 89 if (Constant *C = dyn_cast<Constant>(IC->getOperand(1))) 90 if (C->isNullValue()) 91 continue; 92 // Unknown instruction. 93 return false; 94 } 95 return true; 96 } 97 98 /// isOnlyUsedInEqualityComparison - Return true if it is only used in equality 99 /// comparisons with With. 100 static bool isOnlyUsedInEqualityComparison(Value *V, Value *With) { 101 for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); 102 UI != E; ++UI) { 103 if (ICmpInst *IC = dyn_cast<ICmpInst>(*UI)) 104 if (IC->isEquality() && IC->getOperand(1) == With) 105 continue; 106 // Unknown instruction. 107 return false; 108 } 109 return true; 110 } 111 112 static bool callHasFloatingPointArgument(const CallInst *CI) { 113 for (CallInst::const_op_iterator it = CI->op_begin(), e = CI->op_end(); 114 it != e; ++it) { 115 if ((*it)->getType()->isFloatingPointTy()) 116 return true; 117 } 118 return false; 119 } 120 121 //===----------------------------------------------------------------------===// 122 // Fortified Library Call Optimizations 123 //===----------------------------------------------------------------------===// 124 125 struct FortifiedLibCallOptimization : public LibCallOptimization { 126 protected: 127 virtual bool isFoldable(unsigned SizeCIOp, unsigned SizeArgOp, 128 bool isString) const = 0; 129 }; 130 131 struct InstFortifiedLibCallOptimization : public FortifiedLibCallOptimization { 132 CallInst *CI; 133 134 bool isFoldable(unsigned SizeCIOp, unsigned SizeArgOp, bool isString) const { 135 if (CI->getArgOperand(SizeCIOp) == CI->getArgOperand(SizeArgOp)) 136 return true; 137 if (ConstantInt *SizeCI = 138 dyn_cast<ConstantInt>(CI->getArgOperand(SizeCIOp))) { 139 if (SizeCI->isAllOnesValue()) 140 return true; 141 if (isString) { 142 uint64_t Len = GetStringLength(CI->getArgOperand(SizeArgOp)); 143 // If the length is 0 we don't know how long it is and so we can't 144 // remove the check. 145 if (Len == 0) return false; 146 return SizeCI->getZExtValue() >= Len; 147 } 148 if (ConstantInt *Arg = dyn_cast<ConstantInt>( 149 CI->getArgOperand(SizeArgOp))) 150 return SizeCI->getZExtValue() >= Arg->getZExtValue(); 151 } 152 return false; 153 } 154 }; 155 156 struct MemCpyChkOpt : public InstFortifiedLibCallOptimization { 157 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 158 this->CI = CI; 159 FunctionType *FT = Callee->getFunctionType(); 160 LLVMContext &Context = CI->getParent()->getContext(); 161 162 // Check if this has the right signature. 163 if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) || 164 !FT->getParamType(0)->isPointerTy() || 165 !FT->getParamType(1)->isPointerTy() || 166 FT->getParamType(2) != TD->getIntPtrType(Context) || 167 FT->getParamType(3) != TD->getIntPtrType(Context)) 168 return 0; 169 170 if (isFoldable(3, 2, false)) { 171 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1), 172 CI->getArgOperand(2), 1); 173 return CI->getArgOperand(0); 174 } 175 return 0; 176 } 177 }; 178 179 struct MemMoveChkOpt : public InstFortifiedLibCallOptimization { 180 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 181 this->CI = CI; 182 FunctionType *FT = Callee->getFunctionType(); 183 LLVMContext &Context = CI->getParent()->getContext(); 184 185 // Check if this has the right signature. 186 if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) || 187 !FT->getParamType(0)->isPointerTy() || 188 !FT->getParamType(1)->isPointerTy() || 189 FT->getParamType(2) != TD->getIntPtrType(Context) || 190 FT->getParamType(3) != TD->getIntPtrType(Context)) 191 return 0; 192 193 if (isFoldable(3, 2, false)) { 194 B.CreateMemMove(CI->getArgOperand(0), CI->getArgOperand(1), 195 CI->getArgOperand(2), 1); 196 return CI->getArgOperand(0); 197 } 198 return 0; 199 } 200 }; 201 202 struct MemSetChkOpt : public InstFortifiedLibCallOptimization { 203 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 204 this->CI = CI; 205 FunctionType *FT = Callee->getFunctionType(); 206 LLVMContext &Context = CI->getParent()->getContext(); 207 208 // Check if this has the right signature. 209 if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) || 210 !FT->getParamType(0)->isPointerTy() || 211 !FT->getParamType(1)->isIntegerTy() || 212 FT->getParamType(2) != TD->getIntPtrType(Context) || 213 FT->getParamType(3) != TD->getIntPtrType(Context)) 214 return 0; 215 216 if (isFoldable(3, 2, false)) { 217 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), 218 false); 219 B.CreateMemSet(CI->getArgOperand(0), Val, CI->getArgOperand(2), 1); 220 return CI->getArgOperand(0); 221 } 222 return 0; 223 } 224 }; 225 226 struct StrCpyChkOpt : public InstFortifiedLibCallOptimization { 227 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 228 this->CI = CI; 229 StringRef Name = Callee->getName(); 230 FunctionType *FT = Callee->getFunctionType(); 231 LLVMContext &Context = CI->getParent()->getContext(); 232 233 // Check if this has the right signature. 234 if (FT->getNumParams() != 3 || 235 FT->getReturnType() != FT->getParamType(0) || 236 FT->getParamType(0) != FT->getParamType(1) || 237 FT->getParamType(0) != Type::getInt8PtrTy(Context) || 238 FT->getParamType(2) != TD->getIntPtrType(Context)) 239 return 0; 240 241 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); 242 if (Dst == Src) // __strcpy_chk(x,x) -> x 243 return Src; 244 245 // If a) we don't have any length information, or b) we know this will 246 // fit then just lower to a plain strcpy. Otherwise we'll keep our 247 // strcpy_chk call which may fail at runtime if the size is too long. 248 // TODO: It might be nice to get a maximum length out of the possible 249 // string lengths for varying. 250 if (isFoldable(2, 1, true)) { 251 Value *Ret = EmitStrCpy(Dst, Src, B, TD, TLI, Name.substr(2, 6)); 252 return Ret; 253 } else { 254 // Maybe we can stil fold __strcpy_chk to __memcpy_chk. 255 uint64_t Len = GetStringLength(Src); 256 if (Len == 0) return 0; 257 258 // This optimization require DataLayout. 259 if (!TD) return 0; 260 261 Value *Ret = 262 EmitMemCpyChk(Dst, Src, 263 ConstantInt::get(TD->getIntPtrType(Context), Len), 264 CI->getArgOperand(2), B, TD, TLI); 265 return Ret; 266 } 267 return 0; 268 } 269 }; 270 271 struct StpCpyChkOpt : public InstFortifiedLibCallOptimization { 272 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 273 this->CI = CI; 274 StringRef Name = Callee->getName(); 275 FunctionType *FT = Callee->getFunctionType(); 276 LLVMContext &Context = CI->getParent()->getContext(); 277 278 // Check if this has the right signature. 279 if (FT->getNumParams() != 3 || 280 FT->getReturnType() != FT->getParamType(0) || 281 FT->getParamType(0) != FT->getParamType(1) || 282 FT->getParamType(0) != Type::getInt8PtrTy(Context) || 283 FT->getParamType(2) != TD->getIntPtrType(FT->getParamType(0))) 284 return 0; 285 286 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); 287 if (Dst == Src) { // stpcpy(x,x) -> x+strlen(x) 288 Value *StrLen = EmitStrLen(Src, B, TD, TLI); 289 return StrLen ? B.CreateInBoundsGEP(Dst, StrLen) : 0; 290 } 291 292 // If a) we don't have any length information, or b) we know this will 293 // fit then just lower to a plain stpcpy. Otherwise we'll keep our 294 // stpcpy_chk call which may fail at runtime if the size is too long. 295 // TODO: It might be nice to get a maximum length out of the possible 296 // string lengths for varying. 297 if (isFoldable(2, 1, true)) { 298 Value *Ret = EmitStrCpy(Dst, Src, B, TD, TLI, Name.substr(2, 6)); 299 return Ret; 300 } else { 301 // Maybe we can stil fold __stpcpy_chk to __memcpy_chk. 302 uint64_t Len = GetStringLength(Src); 303 if (Len == 0) return 0; 304 305 // This optimization require DataLayout. 306 if (!TD) return 0; 307 308 Type *PT = FT->getParamType(0); 309 Value *LenV = ConstantInt::get(TD->getIntPtrType(PT), Len); 310 Value *DstEnd = B.CreateGEP(Dst, 311 ConstantInt::get(TD->getIntPtrType(PT), 312 Len - 1)); 313 if (!EmitMemCpyChk(Dst, Src, LenV, CI->getArgOperand(2), B, TD, TLI)) 314 return 0; 315 return DstEnd; 316 } 317 return 0; 318 } 319 }; 320 321 struct StrNCpyChkOpt : public InstFortifiedLibCallOptimization { 322 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 323 this->CI = CI; 324 StringRef Name = Callee->getName(); 325 FunctionType *FT = Callee->getFunctionType(); 326 LLVMContext &Context = CI->getParent()->getContext(); 327 328 // Check if this has the right signature. 329 if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) || 330 FT->getParamType(0) != FT->getParamType(1) || 331 FT->getParamType(0) != Type::getInt8PtrTy(Context) || 332 !FT->getParamType(2)->isIntegerTy() || 333 FT->getParamType(3) != TD->getIntPtrType(Context)) 334 return 0; 335 336 if (isFoldable(3, 2, false)) { 337 Value *Ret = EmitStrNCpy(CI->getArgOperand(0), CI->getArgOperand(1), 338 CI->getArgOperand(2), B, TD, TLI, 339 Name.substr(2, 7)); 340 return Ret; 341 } 342 return 0; 343 } 344 }; 345 346 //===----------------------------------------------------------------------===// 347 // String and Memory Library Call Optimizations 348 //===----------------------------------------------------------------------===// 349 350 struct StrCatOpt : public LibCallOptimization { 351 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 352 // Verify the "strcat" function prototype. 353 FunctionType *FT = Callee->getFunctionType(); 354 if (FT->getNumParams() != 2 || 355 FT->getReturnType() != B.getInt8PtrTy() || 356 FT->getParamType(0) != FT->getReturnType() || 357 FT->getParamType(1) != FT->getReturnType()) 358 return 0; 359 360 // Extract some information from the instruction 361 Value *Dst = CI->getArgOperand(0); 362 Value *Src = CI->getArgOperand(1); 363 364 // See if we can get the length of the input string. 365 uint64_t Len = GetStringLength(Src); 366 if (Len == 0) return 0; 367 --Len; // Unbias length. 368 369 // Handle the simple, do-nothing case: strcat(x, "") -> x 370 if (Len == 0) 371 return Dst; 372 373 // These optimizations require DataLayout. 374 if (!TD) return 0; 375 376 return emitStrLenMemCpy(Src, Dst, Len, B); 377 } 378 379 Value *emitStrLenMemCpy(Value *Src, Value *Dst, uint64_t Len, 380 IRBuilder<> &B) { 381 // We need to find the end of the destination string. That's where the 382 // memory is to be moved to. We just generate a call to strlen. 383 Value *DstLen = EmitStrLen(Dst, B, TD, TLI); 384 if (!DstLen) 385 return 0; 386 387 // Now that we have the destination's length, we must index into the 388 // destination's pointer to get the actual memcpy destination (end of 389 // the string .. we're concatenating). 390 Value *CpyDst = B.CreateGEP(Dst, DstLen, "endptr"); 391 392 // We have enough information to now generate the memcpy call to do the 393 // concatenation for us. Make a memcpy to copy the nul byte with align = 1. 394 B.CreateMemCpy(CpyDst, Src, 395 ConstantInt::get(TD->getIntPtrType(*Context), Len + 1), 1); 396 return Dst; 397 } 398 }; 399 400 struct StrNCatOpt : public StrCatOpt { 401 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 402 // Verify the "strncat" function prototype. 403 FunctionType *FT = Callee->getFunctionType(); 404 if (FT->getNumParams() != 3 || 405 FT->getReturnType() != B.getInt8PtrTy() || 406 FT->getParamType(0) != FT->getReturnType() || 407 FT->getParamType(1) != FT->getReturnType() || 408 !FT->getParamType(2)->isIntegerTy()) 409 return 0; 410 411 // Extract some information from the instruction 412 Value *Dst = CI->getArgOperand(0); 413 Value *Src = CI->getArgOperand(1); 414 uint64_t Len; 415 416 // We don't do anything if length is not constant 417 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(CI->getArgOperand(2))) 418 Len = LengthArg->getZExtValue(); 419 else 420 return 0; 421 422 // See if we can get the length of the input string. 423 uint64_t SrcLen = GetStringLength(Src); 424 if (SrcLen == 0) return 0; 425 --SrcLen; // Unbias length. 426 427 // Handle the simple, do-nothing cases: 428 // strncat(x, "", c) -> x 429 // strncat(x, c, 0) -> x 430 if (SrcLen == 0 || Len == 0) return Dst; 431 432 // These optimizations require DataLayout. 433 if (!TD) return 0; 434 435 // We don't optimize this case 436 if (Len < SrcLen) return 0; 437 438 // strncat(x, s, c) -> strcat(x, s) 439 // s is constant so the strcat can be optimized further 440 return emitStrLenMemCpy(Src, Dst, SrcLen, B); 441 } 442 }; 443 444 struct StrChrOpt : public LibCallOptimization { 445 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 446 // Verify the "strchr" function prototype. 447 FunctionType *FT = Callee->getFunctionType(); 448 if (FT->getNumParams() != 2 || 449 FT->getReturnType() != B.getInt8PtrTy() || 450 FT->getParamType(0) != FT->getReturnType() || 451 !FT->getParamType(1)->isIntegerTy(32)) 452 return 0; 453 454 Value *SrcStr = CI->getArgOperand(0); 455 456 // If the second operand is non-constant, see if we can compute the length 457 // of the input string and turn this into memchr. 458 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); 459 if (CharC == 0) { 460 // These optimizations require DataLayout. 461 if (!TD) return 0; 462 463 uint64_t Len = GetStringLength(SrcStr); 464 if (Len == 0 || !FT->getParamType(1)->isIntegerTy(32))// memchr needs i32. 465 return 0; 466 467 return EmitMemChr(SrcStr, CI->getArgOperand(1), // include nul. 468 ConstantInt::get(TD->getIntPtrType(*Context), Len), 469 B, TD, TLI); 470 } 471 472 // Otherwise, the character is a constant, see if the first argument is 473 // a string literal. If so, we can constant fold. 474 StringRef Str; 475 if (!getConstantStringInfo(SrcStr, Str)) 476 return 0; 477 478 // Compute the offset, make sure to handle the case when we're searching for 479 // zero (a weird way to spell strlen). 480 size_t I = CharC->getSExtValue() == 0 ? 481 Str.size() : Str.find(CharC->getSExtValue()); 482 if (I == StringRef::npos) // Didn't find the char. strchr returns null. 483 return Constant::getNullValue(CI->getType()); 484 485 // strchr(s+n,c) -> gep(s+n+i,c) 486 return B.CreateGEP(SrcStr, B.getInt64(I), "strchr"); 487 } 488 }; 489 490 struct StrRChrOpt : public LibCallOptimization { 491 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 492 // Verify the "strrchr" function prototype. 493 FunctionType *FT = Callee->getFunctionType(); 494 if (FT->getNumParams() != 2 || 495 FT->getReturnType() != B.getInt8PtrTy() || 496 FT->getParamType(0) != FT->getReturnType() || 497 !FT->getParamType(1)->isIntegerTy(32)) 498 return 0; 499 500 Value *SrcStr = CI->getArgOperand(0); 501 ConstantInt *CharC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); 502 503 // Cannot fold anything if we're not looking for a constant. 504 if (!CharC) 505 return 0; 506 507 StringRef Str; 508 if (!getConstantStringInfo(SrcStr, Str)) { 509 // strrchr(s, 0) -> strchr(s, 0) 510 if (TD && CharC->isZero()) 511 return EmitStrChr(SrcStr, '\0', B, TD, TLI); 512 return 0; 513 } 514 515 // Compute the offset. 516 size_t I = CharC->getSExtValue() == 0 ? 517 Str.size() : Str.rfind(CharC->getSExtValue()); 518 if (I == StringRef::npos) // Didn't find the char. Return null. 519 return Constant::getNullValue(CI->getType()); 520 521 // strrchr(s+n,c) -> gep(s+n+i,c) 522 return B.CreateGEP(SrcStr, B.getInt64(I), "strrchr"); 523 } 524 }; 525 526 struct StrCmpOpt : public LibCallOptimization { 527 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 528 // Verify the "strcmp" function prototype. 529 FunctionType *FT = Callee->getFunctionType(); 530 if (FT->getNumParams() != 2 || 531 !FT->getReturnType()->isIntegerTy(32) || 532 FT->getParamType(0) != FT->getParamType(1) || 533 FT->getParamType(0) != B.getInt8PtrTy()) 534 return 0; 535 536 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); 537 if (Str1P == Str2P) // strcmp(x,x) -> 0 538 return ConstantInt::get(CI->getType(), 0); 539 540 StringRef Str1, Str2; 541 bool HasStr1 = getConstantStringInfo(Str1P, Str1); 542 bool HasStr2 = getConstantStringInfo(Str2P, Str2); 543 544 // strcmp(x, y) -> cnst (if both x and y are constant strings) 545 if (HasStr1 && HasStr2) 546 return ConstantInt::get(CI->getType(), Str1.compare(Str2)); 547 548 if (HasStr1 && Str1.empty()) // strcmp("", x) -> -*x 549 return B.CreateNeg(B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"), 550 CI->getType())); 551 552 if (HasStr2 && Str2.empty()) // strcmp(x,"") -> *x 553 return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType()); 554 555 // strcmp(P, "x") -> memcmp(P, "x", 2) 556 uint64_t Len1 = GetStringLength(Str1P); 557 uint64_t Len2 = GetStringLength(Str2P); 558 if (Len1 && Len2) { 559 // These optimizations require DataLayout. 560 if (!TD) return 0; 561 562 return EmitMemCmp(Str1P, Str2P, 563 ConstantInt::get(TD->getIntPtrType(*Context), 564 std::min(Len1, Len2)), B, TD, TLI); 565 } 566 567 return 0; 568 } 569 }; 570 571 struct StrNCmpOpt : public LibCallOptimization { 572 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 573 // Verify the "strncmp" function prototype. 574 FunctionType *FT = Callee->getFunctionType(); 575 if (FT->getNumParams() != 3 || 576 !FT->getReturnType()->isIntegerTy(32) || 577 FT->getParamType(0) != FT->getParamType(1) || 578 FT->getParamType(0) != B.getInt8PtrTy() || 579 !FT->getParamType(2)->isIntegerTy()) 580 return 0; 581 582 Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1); 583 if (Str1P == Str2P) // strncmp(x,x,n) -> 0 584 return ConstantInt::get(CI->getType(), 0); 585 586 // Get the length argument if it is constant. 587 uint64_t Length; 588 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(CI->getArgOperand(2))) 589 Length = LengthArg->getZExtValue(); 590 else 591 return 0; 592 593 if (Length == 0) // strncmp(x,y,0) -> 0 594 return ConstantInt::get(CI->getType(), 0); 595 596 if (TD && Length == 1) // strncmp(x,y,1) -> memcmp(x,y,1) 597 return EmitMemCmp(Str1P, Str2P, CI->getArgOperand(2), B, TD, TLI); 598 599 StringRef Str1, Str2; 600 bool HasStr1 = getConstantStringInfo(Str1P, Str1); 601 bool HasStr2 = getConstantStringInfo(Str2P, Str2); 602 603 // strncmp(x, y) -> cnst (if both x and y are constant strings) 604 if (HasStr1 && HasStr2) { 605 StringRef SubStr1 = Str1.substr(0, Length); 606 StringRef SubStr2 = Str2.substr(0, Length); 607 return ConstantInt::get(CI->getType(), SubStr1.compare(SubStr2)); 608 } 609 610 if (HasStr1 && Str1.empty()) // strncmp("", x, n) -> -*x 611 return B.CreateNeg(B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"), 612 CI->getType())); 613 614 if (HasStr2 && Str2.empty()) // strncmp(x, "", n) -> *x 615 return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType()); 616 617 return 0; 618 } 619 }; 620 621 struct StrCpyOpt : public LibCallOptimization { 622 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 623 // Verify the "strcpy" function prototype. 624 FunctionType *FT = Callee->getFunctionType(); 625 if (FT->getNumParams() != 2 || 626 FT->getReturnType() != FT->getParamType(0) || 627 FT->getParamType(0) != FT->getParamType(1) || 628 FT->getParamType(0) != B.getInt8PtrTy()) 629 return 0; 630 631 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); 632 if (Dst == Src) // strcpy(x,x) -> x 633 return Src; 634 635 // These optimizations require DataLayout. 636 if (!TD) return 0; 637 638 // See if we can get the length of the input string. 639 uint64_t Len = GetStringLength(Src); 640 if (Len == 0) return 0; 641 642 // We have enough information to now generate the memcpy call to do the 643 // copy for us. Make a memcpy to copy the nul byte with align = 1. 644 B.CreateMemCpy(Dst, Src, 645 ConstantInt::get(TD->getIntPtrType(*Context), Len), 1); 646 return Dst; 647 } 648 }; 649 650 struct StpCpyOpt: public LibCallOptimization { 651 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 652 // Verify the "stpcpy" function prototype. 653 FunctionType *FT = Callee->getFunctionType(); 654 if (FT->getNumParams() != 2 || 655 FT->getReturnType() != FT->getParamType(0) || 656 FT->getParamType(0) != FT->getParamType(1) || 657 FT->getParamType(0) != B.getInt8PtrTy()) 658 return 0; 659 660 // These optimizations require DataLayout. 661 if (!TD) return 0; 662 663 Value *Dst = CI->getArgOperand(0), *Src = CI->getArgOperand(1); 664 if (Dst == Src) { // stpcpy(x,x) -> x+strlen(x) 665 Value *StrLen = EmitStrLen(Src, B, TD, TLI); 666 return StrLen ? B.CreateInBoundsGEP(Dst, StrLen) : 0; 667 } 668 669 // See if we can get the length of the input string. 670 uint64_t Len = GetStringLength(Src); 671 if (Len == 0) return 0; 672 673 Type *PT = FT->getParamType(0); 674 Value *LenV = ConstantInt::get(TD->getIntPtrType(PT), Len); 675 Value *DstEnd = B.CreateGEP(Dst, 676 ConstantInt::get(TD->getIntPtrType(PT), 677 Len - 1)); 678 679 // We have enough information to now generate the memcpy call to do the 680 // copy for us. Make a memcpy to copy the nul byte with align = 1. 681 B.CreateMemCpy(Dst, Src, LenV, 1); 682 return DstEnd; 683 } 684 }; 685 686 struct StrNCpyOpt : public LibCallOptimization { 687 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 688 FunctionType *FT = Callee->getFunctionType(); 689 if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || 690 FT->getParamType(0) != FT->getParamType(1) || 691 FT->getParamType(0) != B.getInt8PtrTy() || 692 !FT->getParamType(2)->isIntegerTy()) 693 return 0; 694 695 Value *Dst = CI->getArgOperand(0); 696 Value *Src = CI->getArgOperand(1); 697 Value *LenOp = CI->getArgOperand(2); 698 699 // See if we can get the length of the input string. 700 uint64_t SrcLen = GetStringLength(Src); 701 if (SrcLen == 0) return 0; 702 --SrcLen; 703 704 if (SrcLen == 0) { 705 // strncpy(x, "", y) -> memset(x, '\0', y, 1) 706 B.CreateMemSet(Dst, B.getInt8('\0'), LenOp, 1); 707 return Dst; 708 } 709 710 uint64_t Len; 711 if (ConstantInt *LengthArg = dyn_cast<ConstantInt>(LenOp)) 712 Len = LengthArg->getZExtValue(); 713 else 714 return 0; 715 716 if (Len == 0) return Dst; // strncpy(x, y, 0) -> x 717 718 // These optimizations require DataLayout. 719 if (!TD) return 0; 720 721 // Let strncpy handle the zero padding 722 if (Len > SrcLen+1) return 0; 723 724 Type *PT = FT->getParamType(0); 725 // strncpy(x, s, c) -> memcpy(x, s, c, 1) [s and c are constant] 726 B.CreateMemCpy(Dst, Src, 727 ConstantInt::get(TD->getIntPtrType(PT), Len), 1); 728 729 return Dst; 730 } 731 }; 732 733 struct StrLenOpt : public LibCallOptimization { 734 virtual bool ignoreCallingConv() { return true; } 735 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 736 FunctionType *FT = Callee->getFunctionType(); 737 if (FT->getNumParams() != 1 || 738 FT->getParamType(0) != B.getInt8PtrTy() || 739 !FT->getReturnType()->isIntegerTy()) 740 return 0; 741 742 Value *Src = CI->getArgOperand(0); 743 744 // Constant folding: strlen("xyz") -> 3 745 if (uint64_t Len = GetStringLength(Src)) 746 return ConstantInt::get(CI->getType(), Len-1); 747 748 // strlen(x) != 0 --> *x != 0 749 // strlen(x) == 0 --> *x == 0 750 if (isOnlyUsedInZeroEqualityComparison(CI)) 751 return B.CreateZExt(B.CreateLoad(Src, "strlenfirst"), CI->getType()); 752 return 0; 753 } 754 }; 755 756 struct StrPBrkOpt : public LibCallOptimization { 757 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 758 FunctionType *FT = Callee->getFunctionType(); 759 if (FT->getNumParams() != 2 || 760 FT->getParamType(0) != B.getInt8PtrTy() || 761 FT->getParamType(1) != FT->getParamType(0) || 762 FT->getReturnType() != FT->getParamType(0)) 763 return 0; 764 765 StringRef S1, S2; 766 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); 767 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); 768 769 // strpbrk(s, "") -> NULL 770 // strpbrk("", s) -> NULL 771 if ((HasS1 && S1.empty()) || (HasS2 && S2.empty())) 772 return Constant::getNullValue(CI->getType()); 773 774 // Constant folding. 775 if (HasS1 && HasS2) { 776 size_t I = S1.find_first_of(S2); 777 if (I == std::string::npos) // No match. 778 return Constant::getNullValue(CI->getType()); 779 780 return B.CreateGEP(CI->getArgOperand(0), B.getInt64(I), "strpbrk"); 781 } 782 783 // strpbrk(s, "a") -> strchr(s, 'a') 784 if (TD && HasS2 && S2.size() == 1) 785 return EmitStrChr(CI->getArgOperand(0), S2[0], B, TD, TLI); 786 787 return 0; 788 } 789 }; 790 791 struct StrToOpt : public LibCallOptimization { 792 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 793 FunctionType *FT = Callee->getFunctionType(); 794 if ((FT->getNumParams() != 2 && FT->getNumParams() != 3) || 795 !FT->getParamType(0)->isPointerTy() || 796 !FT->getParamType(1)->isPointerTy()) 797 return 0; 798 799 Value *EndPtr = CI->getArgOperand(1); 800 if (isa<ConstantPointerNull>(EndPtr)) { 801 // With a null EndPtr, this function won't capture the main argument. 802 // It would be readonly too, except that it still may write to errno. 803 CI->addAttribute(1, Attribute::NoCapture); 804 } 805 806 return 0; 807 } 808 }; 809 810 struct StrSpnOpt : public LibCallOptimization { 811 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 812 FunctionType *FT = Callee->getFunctionType(); 813 if (FT->getNumParams() != 2 || 814 FT->getParamType(0) != B.getInt8PtrTy() || 815 FT->getParamType(1) != FT->getParamType(0) || 816 !FT->getReturnType()->isIntegerTy()) 817 return 0; 818 819 StringRef S1, S2; 820 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); 821 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); 822 823 // strspn(s, "") -> 0 824 // strspn("", s) -> 0 825 if ((HasS1 && S1.empty()) || (HasS2 && S2.empty())) 826 return Constant::getNullValue(CI->getType()); 827 828 // Constant folding. 829 if (HasS1 && HasS2) { 830 size_t Pos = S1.find_first_not_of(S2); 831 if (Pos == StringRef::npos) Pos = S1.size(); 832 return ConstantInt::get(CI->getType(), Pos); 833 } 834 835 return 0; 836 } 837 }; 838 839 struct StrCSpnOpt : public LibCallOptimization { 840 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 841 FunctionType *FT = Callee->getFunctionType(); 842 if (FT->getNumParams() != 2 || 843 FT->getParamType(0) != B.getInt8PtrTy() || 844 FT->getParamType(1) != FT->getParamType(0) || 845 !FT->getReturnType()->isIntegerTy()) 846 return 0; 847 848 StringRef S1, S2; 849 bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1); 850 bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2); 851 852 // strcspn("", s) -> 0 853 if (HasS1 && S1.empty()) 854 return Constant::getNullValue(CI->getType()); 855 856 // Constant folding. 857 if (HasS1 && HasS2) { 858 size_t Pos = S1.find_first_of(S2); 859 if (Pos == StringRef::npos) Pos = S1.size(); 860 return ConstantInt::get(CI->getType(), Pos); 861 } 862 863 // strcspn(s, "") -> strlen(s) 864 if (TD && HasS2 && S2.empty()) 865 return EmitStrLen(CI->getArgOperand(0), B, TD, TLI); 866 867 return 0; 868 } 869 }; 870 871 struct StrStrOpt : public LibCallOptimization { 872 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 873 FunctionType *FT = Callee->getFunctionType(); 874 if (FT->getNumParams() != 2 || 875 !FT->getParamType(0)->isPointerTy() || 876 !FT->getParamType(1)->isPointerTy() || 877 !FT->getReturnType()->isPointerTy()) 878 return 0; 879 880 // fold strstr(x, x) -> x. 881 if (CI->getArgOperand(0) == CI->getArgOperand(1)) 882 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); 883 884 // fold strstr(a, b) == a -> strncmp(a, b, strlen(b)) == 0 885 if (TD && isOnlyUsedInEqualityComparison(CI, CI->getArgOperand(0))) { 886 Value *StrLen = EmitStrLen(CI->getArgOperand(1), B, TD, TLI); 887 if (!StrLen) 888 return 0; 889 Value *StrNCmp = EmitStrNCmp(CI->getArgOperand(0), CI->getArgOperand(1), 890 StrLen, B, TD, TLI); 891 if (!StrNCmp) 892 return 0; 893 for (Value::use_iterator UI = CI->use_begin(), UE = CI->use_end(); 894 UI != UE; ) { 895 ICmpInst *Old = cast<ICmpInst>(*UI++); 896 Value *Cmp = B.CreateICmp(Old->getPredicate(), StrNCmp, 897 ConstantInt::getNullValue(StrNCmp->getType()), 898 "cmp"); 899 LCS->replaceAllUsesWith(Old, Cmp); 900 } 901 return CI; 902 } 903 904 // See if either input string is a constant string. 905 StringRef SearchStr, ToFindStr; 906 bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr); 907 bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr); 908 909 // fold strstr(x, "") -> x. 910 if (HasStr2 && ToFindStr.empty()) 911 return B.CreateBitCast(CI->getArgOperand(0), CI->getType()); 912 913 // If both strings are known, constant fold it. 914 if (HasStr1 && HasStr2) { 915 std::string::size_type Offset = SearchStr.find(ToFindStr); 916 917 if (Offset == StringRef::npos) // strstr("foo", "bar") -> null 918 return Constant::getNullValue(CI->getType()); 919 920 // strstr("abcd", "bc") -> gep((char*)"abcd", 1) 921 Value *Result = CastToCStr(CI->getArgOperand(0), B); 922 Result = B.CreateConstInBoundsGEP1_64(Result, Offset, "strstr"); 923 return B.CreateBitCast(Result, CI->getType()); 924 } 925 926 // fold strstr(x, "y") -> strchr(x, 'y'). 927 if (HasStr2 && ToFindStr.size() == 1) { 928 Value *StrChr= EmitStrChr(CI->getArgOperand(0), ToFindStr[0], B, TD, TLI); 929 return StrChr ? B.CreateBitCast(StrChr, CI->getType()) : 0; 930 } 931 return 0; 932 } 933 }; 934 935 struct MemCmpOpt : public LibCallOptimization { 936 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 937 FunctionType *FT = Callee->getFunctionType(); 938 if (FT->getNumParams() != 3 || !FT->getParamType(0)->isPointerTy() || 939 !FT->getParamType(1)->isPointerTy() || 940 !FT->getReturnType()->isIntegerTy(32)) 941 return 0; 942 943 Value *LHS = CI->getArgOperand(0), *RHS = CI->getArgOperand(1); 944 945 if (LHS == RHS) // memcmp(s,s,x) -> 0 946 return Constant::getNullValue(CI->getType()); 947 948 // Make sure we have a constant length. 949 ConstantInt *LenC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); 950 if (!LenC) return 0; 951 uint64_t Len = LenC->getZExtValue(); 952 953 if (Len == 0) // memcmp(s1,s2,0) -> 0 954 return Constant::getNullValue(CI->getType()); 955 956 // memcmp(S1,S2,1) -> *(unsigned char*)LHS - *(unsigned char*)RHS 957 if (Len == 1) { 958 Value *LHSV = B.CreateZExt(B.CreateLoad(CastToCStr(LHS, B), "lhsc"), 959 CI->getType(), "lhsv"); 960 Value *RHSV = B.CreateZExt(B.CreateLoad(CastToCStr(RHS, B), "rhsc"), 961 CI->getType(), "rhsv"); 962 return B.CreateSub(LHSV, RHSV, "chardiff"); 963 } 964 965 // Constant folding: memcmp(x, y, l) -> cnst (all arguments are constant) 966 StringRef LHSStr, RHSStr; 967 if (getConstantStringInfo(LHS, LHSStr) && 968 getConstantStringInfo(RHS, RHSStr)) { 969 // Make sure we're not reading out-of-bounds memory. 970 if (Len > LHSStr.size() || Len > RHSStr.size()) 971 return 0; 972 // Fold the memcmp and normalize the result. This way we get consistent 973 // results across multiple platforms. 974 uint64_t Ret = 0; 975 int Cmp = memcmp(LHSStr.data(), RHSStr.data(), Len); 976 if (Cmp < 0) 977 Ret = -1; 978 else if (Cmp > 0) 979 Ret = 1; 980 return ConstantInt::get(CI->getType(), Ret); 981 } 982 983 return 0; 984 } 985 }; 986 987 struct MemCpyOpt : public LibCallOptimization { 988 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 989 // These optimizations require DataLayout. 990 if (!TD) return 0; 991 992 FunctionType *FT = Callee->getFunctionType(); 993 if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || 994 !FT->getParamType(0)->isPointerTy() || 995 !FT->getParamType(1)->isPointerTy() || 996 FT->getParamType(2) != TD->getIntPtrType(*Context)) 997 return 0; 998 999 // memcpy(x, y, n) -> llvm.memcpy(x, y, n, 1) 1000 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1), 1001 CI->getArgOperand(2), 1); 1002 return CI->getArgOperand(0); 1003 } 1004 }; 1005 1006 struct MemMoveOpt : public LibCallOptimization { 1007 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1008 // These optimizations require DataLayout. 1009 if (!TD) return 0; 1010 1011 FunctionType *FT = Callee->getFunctionType(); 1012 if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || 1013 !FT->getParamType(0)->isPointerTy() || 1014 !FT->getParamType(1)->isPointerTy() || 1015 FT->getParamType(2) != TD->getIntPtrType(*Context)) 1016 return 0; 1017 1018 // memmove(x, y, n) -> llvm.memmove(x, y, n, 1) 1019 B.CreateMemMove(CI->getArgOperand(0), CI->getArgOperand(1), 1020 CI->getArgOperand(2), 1); 1021 return CI->getArgOperand(0); 1022 } 1023 }; 1024 1025 struct MemSetOpt : public LibCallOptimization { 1026 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1027 // These optimizations require DataLayout. 1028 if (!TD) return 0; 1029 1030 FunctionType *FT = Callee->getFunctionType(); 1031 if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || 1032 !FT->getParamType(0)->isPointerTy() || 1033 !FT->getParamType(1)->isIntegerTy() || 1034 FT->getParamType(2) != TD->getIntPtrType(*Context)) 1035 return 0; 1036 1037 // memset(p, v, n) -> llvm.memset(p, v, n, 1) 1038 Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); 1039 B.CreateMemSet(CI->getArgOperand(0), Val, CI->getArgOperand(2), 1); 1040 return CI->getArgOperand(0); 1041 } 1042 }; 1043 1044 //===----------------------------------------------------------------------===// 1045 // Math Library Optimizations 1046 //===----------------------------------------------------------------------===// 1047 1048 //===----------------------------------------------------------------------===// 1049 // Double -> Float Shrinking Optimizations for Unary Functions like 'floor' 1050 1051 struct UnaryDoubleFPOpt : public LibCallOptimization { 1052 bool CheckRetType; 1053 UnaryDoubleFPOpt(bool CheckReturnType): CheckRetType(CheckReturnType) {} 1054 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1055 FunctionType *FT = Callee->getFunctionType(); 1056 if (FT->getNumParams() != 1 || !FT->getReturnType()->isDoubleTy() || 1057 !FT->getParamType(0)->isDoubleTy()) 1058 return 0; 1059 1060 if (CheckRetType) { 1061 // Check if all the uses for function like 'sin' are converted to float. 1062 for (Value::use_iterator UseI = CI->use_begin(); UseI != CI->use_end(); 1063 ++UseI) { 1064 FPTruncInst *Cast = dyn_cast<FPTruncInst>(*UseI); 1065 if (Cast == 0 || !Cast->getType()->isFloatTy()) 1066 return 0; 1067 } 1068 } 1069 1070 // If this is something like 'floor((double)floatval)', convert to floorf. 1071 FPExtInst *Cast = dyn_cast<FPExtInst>(CI->getArgOperand(0)); 1072 if (Cast == 0 || !Cast->getOperand(0)->getType()->isFloatTy()) 1073 return 0; 1074 1075 // floor((double)floatval) -> (double)floorf(floatval) 1076 Value *V = Cast->getOperand(0); 1077 V = EmitUnaryFloatFnCall(V, Callee->getName(), B, Callee->getAttributes()); 1078 return B.CreateFPExt(V, B.getDoubleTy()); 1079 } 1080 }; 1081 1082 struct UnsafeFPLibCallOptimization : public LibCallOptimization { 1083 bool UnsafeFPShrink; 1084 UnsafeFPLibCallOptimization(bool UnsafeFPShrink) { 1085 this->UnsafeFPShrink = UnsafeFPShrink; 1086 } 1087 }; 1088 1089 struct CosOpt : public UnsafeFPLibCallOptimization { 1090 CosOpt(bool UnsafeFPShrink) : UnsafeFPLibCallOptimization(UnsafeFPShrink) {} 1091 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1092 Value *Ret = NULL; 1093 if (UnsafeFPShrink && Callee->getName() == "cos" && 1094 TLI->has(LibFunc::cosf)) { 1095 UnaryDoubleFPOpt UnsafeUnaryDoubleFP(true); 1096 Ret = UnsafeUnaryDoubleFP.callOptimizer(Callee, CI, B); 1097 } 1098 1099 FunctionType *FT = Callee->getFunctionType(); 1100 // Just make sure this has 1 argument of FP type, which matches the 1101 // result type. 1102 if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) || 1103 !FT->getParamType(0)->isFloatingPointTy()) 1104 return Ret; 1105 1106 // cos(-x) -> cos(x) 1107 Value *Op1 = CI->getArgOperand(0); 1108 if (BinaryOperator::isFNeg(Op1)) { 1109 BinaryOperator *BinExpr = cast<BinaryOperator>(Op1); 1110 return B.CreateCall(Callee, BinExpr->getOperand(1), "cos"); 1111 } 1112 return Ret; 1113 } 1114 }; 1115 1116 struct PowOpt : public UnsafeFPLibCallOptimization { 1117 PowOpt(bool UnsafeFPShrink) : UnsafeFPLibCallOptimization(UnsafeFPShrink) {} 1118 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1119 Value *Ret = NULL; 1120 if (UnsafeFPShrink && Callee->getName() == "pow" && 1121 TLI->has(LibFunc::powf)) { 1122 UnaryDoubleFPOpt UnsafeUnaryDoubleFP(true); 1123 Ret = UnsafeUnaryDoubleFP.callOptimizer(Callee, CI, B); 1124 } 1125 1126 FunctionType *FT = Callee->getFunctionType(); 1127 // Just make sure this has 2 arguments of the same FP type, which match the 1128 // result type. 1129 if (FT->getNumParams() != 2 || FT->getReturnType() != FT->getParamType(0) || 1130 FT->getParamType(0) != FT->getParamType(1) || 1131 !FT->getParamType(0)->isFloatingPointTy()) 1132 return Ret; 1133 1134 Value *Op1 = CI->getArgOperand(0), *Op2 = CI->getArgOperand(1); 1135 if (ConstantFP *Op1C = dyn_cast<ConstantFP>(Op1)) { 1136 if (Op1C->isExactlyValue(1.0)) // pow(1.0, x) -> 1.0 1137 return Op1C; 1138 if (Op1C->isExactlyValue(2.0)) // pow(2.0, x) -> exp2(x) 1139 return EmitUnaryFloatFnCall(Op2, "exp2", B, Callee->getAttributes()); 1140 } 1141 1142 ConstantFP *Op2C = dyn_cast<ConstantFP>(Op2); 1143 if (Op2C == 0) return Ret; 1144 1145 if (Op2C->getValueAPF().isZero()) // pow(x, 0.0) -> 1.0 1146 return ConstantFP::get(CI->getType(), 1.0); 1147 1148 if (Op2C->isExactlyValue(0.5)) { 1149 // Expand pow(x, 0.5) to (x == -infinity ? +infinity : fabs(sqrt(x))). 1150 // This is faster than calling pow, and still handles negative zero 1151 // and negative infinity correctly. 1152 // TODO: In fast-math mode, this could be just sqrt(x). 1153 // TODO: In finite-only mode, this could be just fabs(sqrt(x)). 1154 Value *Inf = ConstantFP::getInfinity(CI->getType()); 1155 Value *NegInf = ConstantFP::getInfinity(CI->getType(), true); 1156 Value *Sqrt = EmitUnaryFloatFnCall(Op1, "sqrt", B, 1157 Callee->getAttributes()); 1158 Value *FAbs = EmitUnaryFloatFnCall(Sqrt, "fabs", B, 1159 Callee->getAttributes()); 1160 Value *FCmp = B.CreateFCmpOEQ(Op1, NegInf); 1161 Value *Sel = B.CreateSelect(FCmp, Inf, FAbs); 1162 return Sel; 1163 } 1164 1165 if (Op2C->isExactlyValue(1.0)) // pow(x, 1.0) -> x 1166 return Op1; 1167 if (Op2C->isExactlyValue(2.0)) // pow(x, 2.0) -> x*x 1168 return B.CreateFMul(Op1, Op1, "pow2"); 1169 if (Op2C->isExactlyValue(-1.0)) // pow(x, -1.0) -> 1.0/x 1170 return B.CreateFDiv(ConstantFP::get(CI->getType(), 1.0), 1171 Op1, "powrecip"); 1172 return 0; 1173 } 1174 }; 1175 1176 struct Exp2Opt : public UnsafeFPLibCallOptimization { 1177 Exp2Opt(bool UnsafeFPShrink) : UnsafeFPLibCallOptimization(UnsafeFPShrink) {} 1178 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1179 Value *Ret = NULL; 1180 if (UnsafeFPShrink && Callee->getName() == "exp2" && 1181 TLI->has(LibFunc::exp2)) { 1182 UnaryDoubleFPOpt UnsafeUnaryDoubleFP(true); 1183 Ret = UnsafeUnaryDoubleFP.callOptimizer(Callee, CI, B); 1184 } 1185 1186 FunctionType *FT = Callee->getFunctionType(); 1187 // Just make sure this has 1 argument of FP type, which matches the 1188 // result type. 1189 if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) || 1190 !FT->getParamType(0)->isFloatingPointTy()) 1191 return Ret; 1192 1193 Value *Op = CI->getArgOperand(0); 1194 // Turn exp2(sitofp(x)) -> ldexp(1.0, sext(x)) if sizeof(x) <= 32 1195 // Turn exp2(uitofp(x)) -> ldexp(1.0, zext(x)) if sizeof(x) < 32 1196 Value *LdExpArg = 0; 1197 if (SIToFPInst *OpC = dyn_cast<SIToFPInst>(Op)) { 1198 if (OpC->getOperand(0)->getType()->getPrimitiveSizeInBits() <= 32) 1199 LdExpArg = B.CreateSExt(OpC->getOperand(0), B.getInt32Ty()); 1200 } else if (UIToFPInst *OpC = dyn_cast<UIToFPInst>(Op)) { 1201 if (OpC->getOperand(0)->getType()->getPrimitiveSizeInBits() < 32) 1202 LdExpArg = B.CreateZExt(OpC->getOperand(0), B.getInt32Ty()); 1203 } 1204 1205 if (LdExpArg) { 1206 const char *Name; 1207 if (Op->getType()->isFloatTy()) 1208 Name = "ldexpf"; 1209 else if (Op->getType()->isDoubleTy()) 1210 Name = "ldexp"; 1211 else 1212 Name = "ldexpl"; 1213 1214 Constant *One = ConstantFP::get(*Context, APFloat(1.0f)); 1215 if (!Op->getType()->isFloatTy()) 1216 One = ConstantExpr::getFPExtend(One, Op->getType()); 1217 1218 Module *M = Caller->getParent(); 1219 Value *Callee = M->getOrInsertFunction(Name, Op->getType(), 1220 Op->getType(), 1221 B.getInt32Ty(), NULL); 1222 CallInst *CI = B.CreateCall2(Callee, One, LdExpArg); 1223 if (const Function *F = dyn_cast<Function>(Callee->stripPointerCasts())) 1224 CI->setCallingConv(F->getCallingConv()); 1225 1226 return CI; 1227 } 1228 return Ret; 1229 } 1230 }; 1231 1232 //===----------------------------------------------------------------------===// 1233 // Integer Library Call Optimizations 1234 //===----------------------------------------------------------------------===// 1235 1236 struct FFSOpt : public LibCallOptimization { 1237 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1238 FunctionType *FT = Callee->getFunctionType(); 1239 // Just make sure this has 2 arguments of the same FP type, which match the 1240 // result type. 1241 if (FT->getNumParams() != 1 || 1242 !FT->getReturnType()->isIntegerTy(32) || 1243 !FT->getParamType(0)->isIntegerTy()) 1244 return 0; 1245 1246 Value *Op = CI->getArgOperand(0); 1247 1248 // Constant fold. 1249 if (ConstantInt *CI = dyn_cast<ConstantInt>(Op)) { 1250 if (CI->isZero()) // ffs(0) -> 0. 1251 return B.getInt32(0); 1252 // ffs(c) -> cttz(c)+1 1253 return B.getInt32(CI->getValue().countTrailingZeros() + 1); 1254 } 1255 1256 // ffs(x) -> x != 0 ? (i32)llvm.cttz(x)+1 : 0 1257 Type *ArgType = Op->getType(); 1258 Value *F = Intrinsic::getDeclaration(Callee->getParent(), 1259 Intrinsic::cttz, ArgType); 1260 Value *V = B.CreateCall2(F, Op, B.getFalse(), "cttz"); 1261 V = B.CreateAdd(V, ConstantInt::get(V->getType(), 1)); 1262 V = B.CreateIntCast(V, B.getInt32Ty(), false); 1263 1264 Value *Cond = B.CreateICmpNE(Op, Constant::getNullValue(ArgType)); 1265 return B.CreateSelect(Cond, V, B.getInt32(0)); 1266 } 1267 }; 1268 1269 struct AbsOpt : public LibCallOptimization { 1270 virtual bool ignoreCallingConv() { return true; } 1271 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1272 FunctionType *FT = Callee->getFunctionType(); 1273 // We require integer(integer) where the types agree. 1274 if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy() || 1275 FT->getParamType(0) != FT->getReturnType()) 1276 return 0; 1277 1278 // abs(x) -> x >s -1 ? x : -x 1279 Value *Op = CI->getArgOperand(0); 1280 Value *Pos = B.CreateICmpSGT(Op, Constant::getAllOnesValue(Op->getType()), 1281 "ispos"); 1282 Value *Neg = B.CreateNeg(Op, "neg"); 1283 return B.CreateSelect(Pos, Op, Neg); 1284 } 1285 }; 1286 1287 struct IsDigitOpt : public LibCallOptimization { 1288 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1289 FunctionType *FT = Callee->getFunctionType(); 1290 // We require integer(i32) 1291 if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy() || 1292 !FT->getParamType(0)->isIntegerTy(32)) 1293 return 0; 1294 1295 // isdigit(c) -> (c-'0') <u 10 1296 Value *Op = CI->getArgOperand(0); 1297 Op = B.CreateSub(Op, B.getInt32('0'), "isdigittmp"); 1298 Op = B.CreateICmpULT(Op, B.getInt32(10), "isdigit"); 1299 return B.CreateZExt(Op, CI->getType()); 1300 } 1301 }; 1302 1303 struct IsAsciiOpt : public LibCallOptimization { 1304 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1305 FunctionType *FT = Callee->getFunctionType(); 1306 // We require integer(i32) 1307 if (FT->getNumParams() != 1 || !FT->getReturnType()->isIntegerTy() || 1308 !FT->getParamType(0)->isIntegerTy(32)) 1309 return 0; 1310 1311 // isascii(c) -> c <u 128 1312 Value *Op = CI->getArgOperand(0); 1313 Op = B.CreateICmpULT(Op, B.getInt32(128), "isascii"); 1314 return B.CreateZExt(Op, CI->getType()); 1315 } 1316 }; 1317 1318 struct ToAsciiOpt : public LibCallOptimization { 1319 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1320 FunctionType *FT = Callee->getFunctionType(); 1321 // We require i32(i32) 1322 if (FT->getNumParams() != 1 || FT->getReturnType() != FT->getParamType(0) || 1323 !FT->getParamType(0)->isIntegerTy(32)) 1324 return 0; 1325 1326 // toascii(c) -> c & 0x7f 1327 return B.CreateAnd(CI->getArgOperand(0), 1328 ConstantInt::get(CI->getType(),0x7F)); 1329 } 1330 }; 1331 1332 //===----------------------------------------------------------------------===// 1333 // Formatting and IO Library Call Optimizations 1334 //===----------------------------------------------------------------------===// 1335 1336 struct PrintFOpt : public LibCallOptimization { 1337 Value *optimizeFixedFormatString(Function *Callee, CallInst *CI, 1338 IRBuilder<> &B) { 1339 // Check for a fixed format string. 1340 StringRef FormatStr; 1341 if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr)) 1342 return 0; 1343 1344 // Empty format string -> noop. 1345 if (FormatStr.empty()) // Tolerate printf's declared void. 1346 return CI->use_empty() ? (Value*)CI : 1347 ConstantInt::get(CI->getType(), 0); 1348 1349 // Do not do any of the following transformations if the printf return value 1350 // is used, in general the printf return value is not compatible with either 1351 // putchar() or puts(). 1352 if (!CI->use_empty()) 1353 return 0; 1354 1355 // printf("x") -> putchar('x'), even for '%'. 1356 if (FormatStr.size() == 1) { 1357 Value *Res = EmitPutChar(B.getInt32(FormatStr[0]), B, TD, TLI); 1358 if (CI->use_empty() || !Res) return Res; 1359 return B.CreateIntCast(Res, CI->getType(), true); 1360 } 1361 1362 // printf("foo\n") --> puts("foo") 1363 if (FormatStr[FormatStr.size()-1] == '\n' && 1364 FormatStr.find('%') == std::string::npos) { // no format characters. 1365 // Create a string literal with no \n on it. We expect the constant merge 1366 // pass to be run after this pass, to merge duplicate strings. 1367 FormatStr = FormatStr.drop_back(); 1368 Value *GV = B.CreateGlobalString(FormatStr, "str"); 1369 Value *NewCI = EmitPutS(GV, B, TD, TLI); 1370 return (CI->use_empty() || !NewCI) ? 1371 NewCI : 1372 ConstantInt::get(CI->getType(), FormatStr.size()+1); 1373 } 1374 1375 // Optimize specific format strings. 1376 // printf("%c", chr) --> putchar(chr) 1377 if (FormatStr == "%c" && CI->getNumArgOperands() > 1 && 1378 CI->getArgOperand(1)->getType()->isIntegerTy()) { 1379 Value *Res = EmitPutChar(CI->getArgOperand(1), B, TD, TLI); 1380 1381 if (CI->use_empty() || !Res) return Res; 1382 return B.CreateIntCast(Res, CI->getType(), true); 1383 } 1384 1385 // printf("%s\n", str) --> puts(str) 1386 if (FormatStr == "%s\n" && CI->getNumArgOperands() > 1 && 1387 CI->getArgOperand(1)->getType()->isPointerTy()) { 1388 return EmitPutS(CI->getArgOperand(1), B, TD, TLI); 1389 } 1390 return 0; 1391 } 1392 1393 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1394 // Require one fixed pointer argument and an integer/void result. 1395 FunctionType *FT = Callee->getFunctionType(); 1396 if (FT->getNumParams() < 1 || !FT->getParamType(0)->isPointerTy() || 1397 !(FT->getReturnType()->isIntegerTy() || 1398 FT->getReturnType()->isVoidTy())) 1399 return 0; 1400 1401 if (Value *V = optimizeFixedFormatString(Callee, CI, B)) { 1402 return V; 1403 } 1404 1405 // printf(format, ...) -> iprintf(format, ...) if no floating point 1406 // arguments. 1407 if (TLI->has(LibFunc::iprintf) && !callHasFloatingPointArgument(CI)) { 1408 Module *M = B.GetInsertBlock()->getParent()->getParent(); 1409 Constant *IPrintFFn = 1410 M->getOrInsertFunction("iprintf", FT, Callee->getAttributes()); 1411 CallInst *New = cast<CallInst>(CI->clone()); 1412 New->setCalledFunction(IPrintFFn); 1413 B.Insert(New); 1414 return New; 1415 } 1416 return 0; 1417 } 1418 }; 1419 1420 struct SPrintFOpt : public LibCallOptimization { 1421 Value *OptimizeFixedFormatString(Function *Callee, CallInst *CI, 1422 IRBuilder<> &B) { 1423 // Check for a fixed format string. 1424 StringRef FormatStr; 1425 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) 1426 return 0; 1427 1428 // If we just have a format string (nothing else crazy) transform it. 1429 if (CI->getNumArgOperands() == 2) { 1430 // Make sure there's no % in the constant array. We could try to handle 1431 // %% -> % in the future if we cared. 1432 for (unsigned i = 0, e = FormatStr.size(); i != e; ++i) 1433 if (FormatStr[i] == '%') 1434 return 0; // we found a format specifier, bail out. 1435 1436 // These optimizations require DataLayout. 1437 if (!TD) return 0; 1438 1439 // sprintf(str, fmt) -> llvm.memcpy(str, fmt, strlen(fmt)+1, 1) 1440 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(1), 1441 ConstantInt::get(TD->getIntPtrType(*Context), // Copy the 1442 FormatStr.size() + 1), 1); // nul byte. 1443 return ConstantInt::get(CI->getType(), FormatStr.size()); 1444 } 1445 1446 // The remaining optimizations require the format string to be "%s" or "%c" 1447 // and have an extra operand. 1448 if (FormatStr.size() != 2 || FormatStr[0] != '%' || 1449 CI->getNumArgOperands() < 3) 1450 return 0; 1451 1452 // Decode the second character of the format string. 1453 if (FormatStr[1] == 'c') { 1454 // sprintf(dst, "%c", chr) --> *(i8*)dst = chr; *((i8*)dst+1) = 0 1455 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) return 0; 1456 Value *V = B.CreateTrunc(CI->getArgOperand(2), B.getInt8Ty(), "char"); 1457 Value *Ptr = CastToCStr(CI->getArgOperand(0), B); 1458 B.CreateStore(V, Ptr); 1459 Ptr = B.CreateGEP(Ptr, B.getInt32(1), "nul"); 1460 B.CreateStore(B.getInt8(0), Ptr); 1461 1462 return ConstantInt::get(CI->getType(), 1); 1463 } 1464 1465 if (FormatStr[1] == 's') { 1466 // These optimizations require DataLayout. 1467 if (!TD) return 0; 1468 1469 // sprintf(dest, "%s", str) -> llvm.memcpy(dest, str, strlen(str)+1, 1) 1470 if (!CI->getArgOperand(2)->getType()->isPointerTy()) return 0; 1471 1472 Value *Len = EmitStrLen(CI->getArgOperand(2), B, TD, TLI); 1473 if (!Len) 1474 return 0; 1475 Value *IncLen = B.CreateAdd(Len, 1476 ConstantInt::get(Len->getType(), 1), 1477 "leninc"); 1478 B.CreateMemCpy(CI->getArgOperand(0), CI->getArgOperand(2), IncLen, 1); 1479 1480 // The sprintf result is the unincremented number of bytes in the string. 1481 return B.CreateIntCast(Len, CI->getType(), false); 1482 } 1483 return 0; 1484 } 1485 1486 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1487 // Require two fixed pointer arguments and an integer result. 1488 FunctionType *FT = Callee->getFunctionType(); 1489 if (FT->getNumParams() != 2 || !FT->getParamType(0)->isPointerTy() || 1490 !FT->getParamType(1)->isPointerTy() || 1491 !FT->getReturnType()->isIntegerTy()) 1492 return 0; 1493 1494 if (Value *V = OptimizeFixedFormatString(Callee, CI, B)) { 1495 return V; 1496 } 1497 1498 // sprintf(str, format, ...) -> siprintf(str, format, ...) if no floating 1499 // point arguments. 1500 if (TLI->has(LibFunc::siprintf) && !callHasFloatingPointArgument(CI)) { 1501 Module *M = B.GetInsertBlock()->getParent()->getParent(); 1502 Constant *SIPrintFFn = 1503 M->getOrInsertFunction("siprintf", FT, Callee->getAttributes()); 1504 CallInst *New = cast<CallInst>(CI->clone()); 1505 New->setCalledFunction(SIPrintFFn); 1506 B.Insert(New); 1507 return New; 1508 } 1509 return 0; 1510 } 1511 }; 1512 1513 struct FPrintFOpt : public LibCallOptimization { 1514 Value *optimizeFixedFormatString(Function *Callee, CallInst *CI, 1515 IRBuilder<> &B) { 1516 // All the optimizations depend on the format string. 1517 StringRef FormatStr; 1518 if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr)) 1519 return 0; 1520 1521 // Do not do any of the following transformations if the fprintf return 1522 // value is used, in general the fprintf return value is not compatible 1523 // with fwrite(), fputc() or fputs(). 1524 if (!CI->use_empty()) 1525 return 0; 1526 1527 // fprintf(F, "foo") --> fwrite("foo", 3, 1, F) 1528 if (CI->getNumArgOperands() == 2) { 1529 for (unsigned i = 0, e = FormatStr.size(); i != e; ++i) 1530 if (FormatStr[i] == '%') // Could handle %% -> % if we cared. 1531 return 0; // We found a format specifier. 1532 1533 // These optimizations require DataLayout. 1534 if (!TD) return 0; 1535 1536 return EmitFWrite(CI->getArgOperand(1), 1537 ConstantInt::get(TD->getIntPtrType(*Context), 1538 FormatStr.size()), 1539 CI->getArgOperand(0), B, TD, TLI); 1540 } 1541 1542 // The remaining optimizations require the format string to be "%s" or "%c" 1543 // and have an extra operand. 1544 if (FormatStr.size() != 2 || FormatStr[0] != '%' || 1545 CI->getNumArgOperands() < 3) 1546 return 0; 1547 1548 // Decode the second character of the format string. 1549 if (FormatStr[1] == 'c') { 1550 // fprintf(F, "%c", chr) --> fputc(chr, F) 1551 if (!CI->getArgOperand(2)->getType()->isIntegerTy()) return 0; 1552 return EmitFPutC(CI->getArgOperand(2), CI->getArgOperand(0), B, TD, TLI); 1553 } 1554 1555 if (FormatStr[1] == 's') { 1556 // fprintf(F, "%s", str) --> fputs(str, F) 1557 if (!CI->getArgOperand(2)->getType()->isPointerTy()) 1558 return 0; 1559 return EmitFPutS(CI->getArgOperand(2), CI->getArgOperand(0), B, TD, TLI); 1560 } 1561 return 0; 1562 } 1563 1564 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1565 // Require two fixed paramters as pointers and integer result. 1566 FunctionType *FT = Callee->getFunctionType(); 1567 if (FT->getNumParams() != 2 || !FT->getParamType(0)->isPointerTy() || 1568 !FT->getParamType(1)->isPointerTy() || 1569 !FT->getReturnType()->isIntegerTy()) 1570 return 0; 1571 1572 if (Value *V = optimizeFixedFormatString(Callee, CI, B)) { 1573 return V; 1574 } 1575 1576 // fprintf(stream, format, ...) -> fiprintf(stream, format, ...) if no 1577 // floating point arguments. 1578 if (TLI->has(LibFunc::fiprintf) && !callHasFloatingPointArgument(CI)) { 1579 Module *M = B.GetInsertBlock()->getParent()->getParent(); 1580 Constant *FIPrintFFn = 1581 M->getOrInsertFunction("fiprintf", FT, Callee->getAttributes()); 1582 CallInst *New = cast<CallInst>(CI->clone()); 1583 New->setCalledFunction(FIPrintFFn); 1584 B.Insert(New); 1585 return New; 1586 } 1587 return 0; 1588 } 1589 }; 1590 1591 struct FWriteOpt : public LibCallOptimization { 1592 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1593 // Require a pointer, an integer, an integer, a pointer, returning integer. 1594 FunctionType *FT = Callee->getFunctionType(); 1595 if (FT->getNumParams() != 4 || !FT->getParamType(0)->isPointerTy() || 1596 !FT->getParamType(1)->isIntegerTy() || 1597 !FT->getParamType(2)->isIntegerTy() || 1598 !FT->getParamType(3)->isPointerTy() || 1599 !FT->getReturnType()->isIntegerTy()) 1600 return 0; 1601 1602 // Get the element size and count. 1603 ConstantInt *SizeC = dyn_cast<ConstantInt>(CI->getArgOperand(1)); 1604 ConstantInt *CountC = dyn_cast<ConstantInt>(CI->getArgOperand(2)); 1605 if (!SizeC || !CountC) return 0; 1606 uint64_t Bytes = SizeC->getZExtValue()*CountC->getZExtValue(); 1607 1608 // If this is writing zero records, remove the call (it's a noop). 1609 if (Bytes == 0) 1610 return ConstantInt::get(CI->getType(), 0); 1611 1612 // If this is writing one byte, turn it into fputc. 1613 // This optimisation is only valid, if the return value is unused. 1614 if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F) 1615 Value *Char = B.CreateLoad(CastToCStr(CI->getArgOperand(0), B), "char"); 1616 Value *NewCI = EmitFPutC(Char, CI->getArgOperand(3), B, TD, TLI); 1617 return NewCI ? ConstantInt::get(CI->getType(), 1) : 0; 1618 } 1619 1620 return 0; 1621 } 1622 }; 1623 1624 struct FPutsOpt : public LibCallOptimization { 1625 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1626 // These optimizations require DataLayout. 1627 if (!TD) return 0; 1628 1629 // Require two pointers. Also, we can't optimize if return value is used. 1630 FunctionType *FT = Callee->getFunctionType(); 1631 if (FT->getNumParams() != 2 || !FT->getParamType(0)->isPointerTy() || 1632 !FT->getParamType(1)->isPointerTy() || 1633 !CI->use_empty()) 1634 return 0; 1635 1636 // fputs(s,F) --> fwrite(s,1,strlen(s),F) 1637 uint64_t Len = GetStringLength(CI->getArgOperand(0)); 1638 if (!Len) return 0; 1639 // Known to have no uses (see above). 1640 return EmitFWrite(CI->getArgOperand(0), 1641 ConstantInt::get(TD->getIntPtrType(*Context), Len-1), 1642 CI->getArgOperand(1), B, TD, TLI); 1643 } 1644 }; 1645 1646 struct PutsOpt : public LibCallOptimization { 1647 virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { 1648 // Require one fixed pointer argument and an integer/void result. 1649 FunctionType *FT = Callee->getFunctionType(); 1650 if (FT->getNumParams() < 1 || !FT->getParamType(0)->isPointerTy() || 1651 !(FT->getReturnType()->isIntegerTy() || 1652 FT->getReturnType()->isVoidTy())) 1653 return 0; 1654 1655 // Check for a constant string. 1656 StringRef Str; 1657 if (!getConstantStringInfo(CI->getArgOperand(0), Str)) 1658 return 0; 1659 1660 if (Str.empty() && CI->use_empty()) { 1661 // puts("") -> putchar('\n') 1662 Value *Res = EmitPutChar(B.getInt32('\n'), B, TD, TLI); 1663 if (CI->use_empty() || !Res) return Res; 1664 return B.CreateIntCast(Res, CI->getType(), true); 1665 } 1666 1667 return 0; 1668 } 1669 }; 1670 1671 } // End anonymous namespace. 1672 1673 namespace llvm { 1674 1675 class LibCallSimplifierImpl { 1676 const DataLayout *TD; 1677 const TargetLibraryInfo *TLI; 1678 const LibCallSimplifier *LCS; 1679 bool UnsafeFPShrink; 1680 1681 // Math library call optimizations. 1682 CosOpt Cos; 1683 PowOpt Pow; 1684 Exp2Opt Exp2; 1685 public: 1686 LibCallSimplifierImpl(const DataLayout *TD, const TargetLibraryInfo *TLI, 1687 const LibCallSimplifier *LCS, 1688 bool UnsafeFPShrink = false) 1689 : Cos(UnsafeFPShrink), Pow(UnsafeFPShrink), Exp2(UnsafeFPShrink) { 1690 this->TD = TD; 1691 this->TLI = TLI; 1692 this->LCS = LCS; 1693 this->UnsafeFPShrink = UnsafeFPShrink; 1694 } 1695 1696 Value *optimizeCall(CallInst *CI); 1697 LibCallOptimization *lookupOptimization(CallInst *CI); 1698 bool hasFloatVersion(StringRef FuncName); 1699 }; 1700 1701 bool LibCallSimplifierImpl::hasFloatVersion(StringRef FuncName) { 1702 LibFunc::Func Func; 1703 SmallString<20> FloatFuncName = FuncName; 1704 FloatFuncName += 'f'; 1705 if (TLI->getLibFunc(FloatFuncName, Func)) 1706 return TLI->has(Func); 1707 return false; 1708 } 1709 1710 // Fortified library call optimizations. 1711 static MemCpyChkOpt MemCpyChk; 1712 static MemMoveChkOpt MemMoveChk; 1713 static MemSetChkOpt MemSetChk; 1714 static StrCpyChkOpt StrCpyChk; 1715 static StpCpyChkOpt StpCpyChk; 1716 static StrNCpyChkOpt StrNCpyChk; 1717 1718 // String library call optimizations. 1719 static StrCatOpt StrCat; 1720 static StrNCatOpt StrNCat; 1721 static StrChrOpt StrChr; 1722 static StrRChrOpt StrRChr; 1723 static StrCmpOpt StrCmp; 1724 static StrNCmpOpt StrNCmp; 1725 static StrCpyOpt StrCpy; 1726 static StpCpyOpt StpCpy; 1727 static StrNCpyOpt StrNCpy; 1728 static StrLenOpt StrLen; 1729 static StrPBrkOpt StrPBrk; 1730 static StrToOpt StrTo; 1731 static StrSpnOpt StrSpn; 1732 static StrCSpnOpt StrCSpn; 1733 static StrStrOpt StrStr; 1734 1735 // Memory library call optimizations. 1736 static MemCmpOpt MemCmp; 1737 static MemCpyOpt MemCpy; 1738 static MemMoveOpt MemMove; 1739 static MemSetOpt MemSet; 1740 1741 // Math library call optimizations. 1742 static UnaryDoubleFPOpt UnaryDoubleFP(false); 1743 static UnaryDoubleFPOpt UnsafeUnaryDoubleFP(true); 1744 1745 // Integer library call optimizations. 1746 static FFSOpt FFS; 1747 static AbsOpt Abs; 1748 static IsDigitOpt IsDigit; 1749 static IsAsciiOpt IsAscii; 1750 static ToAsciiOpt ToAscii; 1751 1752 // Formatting and IO library call optimizations. 1753 static PrintFOpt PrintF; 1754 static SPrintFOpt SPrintF; 1755 static FPrintFOpt FPrintF; 1756 static FWriteOpt FWrite; 1757 static FPutsOpt FPuts; 1758 static PutsOpt Puts; 1759 1760 LibCallOptimization *LibCallSimplifierImpl::lookupOptimization(CallInst *CI) { 1761 LibFunc::Func Func; 1762 Function *Callee = CI->getCalledFunction(); 1763 StringRef FuncName = Callee->getName(); 1764 1765 // Next check for intrinsics. 1766 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) { 1767 switch (II->getIntrinsicID()) { 1768 case Intrinsic::pow: 1769 return &Pow; 1770 case Intrinsic::exp2: 1771 return &Exp2; 1772 default: 1773 return 0; 1774 } 1775 } 1776 1777 // Then check for known library functions. 1778 if (TLI->getLibFunc(FuncName, Func) && TLI->has(Func)) { 1779 switch (Func) { 1780 case LibFunc::strcat: 1781 return &StrCat; 1782 case LibFunc::strncat: 1783 return &StrNCat; 1784 case LibFunc::strchr: 1785 return &StrChr; 1786 case LibFunc::strrchr: 1787 return &StrRChr; 1788 case LibFunc::strcmp: 1789 return &StrCmp; 1790 case LibFunc::strncmp: 1791 return &StrNCmp; 1792 case LibFunc::strcpy: 1793 return &StrCpy; 1794 case LibFunc::stpcpy: 1795 return &StpCpy; 1796 case LibFunc::strncpy: 1797 return &StrNCpy; 1798 case LibFunc::strlen: 1799 return &StrLen; 1800 case LibFunc::strpbrk: 1801 return &StrPBrk; 1802 case LibFunc::strtol: 1803 case LibFunc::strtod: 1804 case LibFunc::strtof: 1805 case LibFunc::strtoul: 1806 case LibFunc::strtoll: 1807 case LibFunc::strtold: 1808 case LibFunc::strtoull: 1809 return &StrTo; 1810 case LibFunc::strspn: 1811 return &StrSpn; 1812 case LibFunc::strcspn: 1813 return &StrCSpn; 1814 case LibFunc::strstr: 1815 return &StrStr; 1816 case LibFunc::memcmp: 1817 return &MemCmp; 1818 case LibFunc::memcpy: 1819 return &MemCpy; 1820 case LibFunc::memmove: 1821 return &MemMove; 1822 case LibFunc::memset: 1823 return &MemSet; 1824 case LibFunc::cosf: 1825 case LibFunc::cos: 1826 case LibFunc::cosl: 1827 return &Cos; 1828 case LibFunc::powf: 1829 case LibFunc::pow: 1830 case LibFunc::powl: 1831 return &Pow; 1832 case LibFunc::exp2l: 1833 case LibFunc::exp2: 1834 case LibFunc::exp2f: 1835 return &Exp2; 1836 case LibFunc::ffs: 1837 case LibFunc::ffsl: 1838 case LibFunc::ffsll: 1839 return &FFS; 1840 case LibFunc::abs: 1841 case LibFunc::labs: 1842 case LibFunc::llabs: 1843 return &Abs; 1844 case LibFunc::isdigit: 1845 return &IsDigit; 1846 case LibFunc::isascii: 1847 return &IsAscii; 1848 case LibFunc::toascii: 1849 return &ToAscii; 1850 case LibFunc::printf: 1851 return &PrintF; 1852 case LibFunc::sprintf: 1853 return &SPrintF; 1854 case LibFunc::fprintf: 1855 return &FPrintF; 1856 case LibFunc::fwrite: 1857 return &FWrite; 1858 case LibFunc::fputs: 1859 return &FPuts; 1860 case LibFunc::puts: 1861 return &Puts; 1862 case LibFunc::ceil: 1863 case LibFunc::fabs: 1864 case LibFunc::floor: 1865 case LibFunc::rint: 1866 case LibFunc::round: 1867 case LibFunc::nearbyint: 1868 case LibFunc::trunc: 1869 if (hasFloatVersion(FuncName)) 1870 return &UnaryDoubleFP; 1871 return 0; 1872 case LibFunc::acos: 1873 case LibFunc::acosh: 1874 case LibFunc::asin: 1875 case LibFunc::asinh: 1876 case LibFunc::atan: 1877 case LibFunc::atanh: 1878 case LibFunc::cbrt: 1879 case LibFunc::cosh: 1880 case LibFunc::exp: 1881 case LibFunc::exp10: 1882 case LibFunc::expm1: 1883 case LibFunc::log: 1884 case LibFunc::log10: 1885 case LibFunc::log1p: 1886 case LibFunc::log2: 1887 case LibFunc::logb: 1888 case LibFunc::sin: 1889 case LibFunc::sinh: 1890 case LibFunc::sqrt: 1891 case LibFunc::tan: 1892 case LibFunc::tanh: 1893 if (UnsafeFPShrink && hasFloatVersion(FuncName)) 1894 return &UnsafeUnaryDoubleFP; 1895 return 0; 1896 case LibFunc::memcpy_chk: 1897 return &MemCpyChk; 1898 default: 1899 return 0; 1900 } 1901 } 1902 1903 // Finally check for fortified library calls. 1904 if (FuncName.endswith("_chk")) { 1905 if (FuncName == "__memmove_chk") 1906 return &MemMoveChk; 1907 else if (FuncName == "__memset_chk") 1908 return &MemSetChk; 1909 else if (FuncName == "__strcpy_chk") 1910 return &StrCpyChk; 1911 else if (FuncName == "__stpcpy_chk") 1912 return &StpCpyChk; 1913 else if (FuncName == "__strncpy_chk") 1914 return &StrNCpyChk; 1915 else if (FuncName == "__stpncpy_chk") 1916 return &StrNCpyChk; 1917 } 1918 1919 return 0; 1920 1921 } 1922 1923 Value *LibCallSimplifierImpl::optimizeCall(CallInst *CI) { 1924 LibCallOptimization *LCO = lookupOptimization(CI); 1925 if (LCO) { 1926 IRBuilder<> Builder(CI); 1927 return LCO->optimizeCall(CI, TD, TLI, LCS, Builder); 1928 } 1929 return 0; 1930 } 1931 1932 LibCallSimplifier::LibCallSimplifier(const DataLayout *TD, 1933 const TargetLibraryInfo *TLI, 1934 bool UnsafeFPShrink) { 1935 Impl = new LibCallSimplifierImpl(TD, TLI, this, UnsafeFPShrink); 1936 } 1937 1938 LibCallSimplifier::~LibCallSimplifier() { 1939 delete Impl; 1940 } 1941 1942 Value *LibCallSimplifier::optimizeCall(CallInst *CI) { 1943 if (CI->isNoBuiltin()) return 0; 1944 return Impl->optimizeCall(CI); 1945 } 1946 1947 void LibCallSimplifier::replaceAllUsesWith(Instruction *I, Value *With) const { 1948 I->replaceAllUsesWith(With); 1949 I->eraseFromParent(); 1950 } 1951 1952 } 1953 1954 // TODO: 1955 // Additional cases that we need to add to this file: 1956 // 1957 // cbrt: 1958 // * cbrt(expN(X)) -> expN(x/3) 1959 // * cbrt(sqrt(x)) -> pow(x,1/6) 1960 // * cbrt(sqrt(x)) -> pow(x,1/9) 1961 // 1962 // exp, expf, expl: 1963 // * exp(log(x)) -> x 1964 // 1965 // log, logf, logl: 1966 // * log(exp(x)) -> x 1967 // * log(x**y) -> y*log(x) 1968 // * log(exp(y)) -> y*log(e) 1969 // * log(exp2(y)) -> y*log(2) 1970 // * log(exp10(y)) -> y*log(10) 1971 // * log(sqrt(x)) -> 0.5*log(x) 1972 // * log(pow(x,y)) -> y*log(x) 1973 // 1974 // lround, lroundf, lroundl: 1975 // * lround(cnst) -> cnst' 1976 // 1977 // pow, powf, powl: 1978 // * pow(exp(x),y) -> exp(x*y) 1979 // * pow(sqrt(x),y) -> pow(x,y*0.5) 1980 // * pow(pow(x,y),z)-> pow(x,y*z) 1981 // 1982 // round, roundf, roundl: 1983 // * round(cnst) -> cnst' 1984 // 1985 // signbit: 1986 // * signbit(cnst) -> cnst' 1987 // * signbit(nncst) -> 0 (if pstv is a non-negative constant) 1988 // 1989 // sqrt, sqrtf, sqrtl: 1990 // * sqrt(expN(x)) -> expN(x*0.5) 1991 // * sqrt(Nroot(x)) -> pow(x,1/(2*N)) 1992 // * sqrt(pow(x,y)) -> pow(|x|,y*0.5) 1993 // 1994 // strchr: 1995 // * strchr(p, 0) -> strlen(p) 1996 // tan, tanf, tanl: 1997 // * tan(atan(x)) -> x 1998 // 1999 // trunc, truncf, truncl: 2000 // * trunc(cnst) -> cnst' 2001 // 2002 // 2003