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