1 //===- MergeFunctions.cpp - Merge identical functions ---------------------===// 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 pass looks for equivalent functions that are mergable and folds them. 11 // 12 // A hash is computed from the function, based on its type and number of 13 // basic blocks. 14 // 15 // Once all hashes are computed, we perform an expensive equality comparison 16 // on each function pair. This takes n^2/2 comparisons per bucket, so it's 17 // important that the hash function be high quality. The equality comparison 18 // iterates through each instruction in each basic block. 19 // 20 // When a match is found the functions are folded. If both functions are 21 // overridable, we move the functionality into a new internal function and 22 // leave two overridable thunks to it. 23 // 24 //===----------------------------------------------------------------------===// 25 // 26 // Future work: 27 // 28 // * virtual functions. 29 // 30 // Many functions have their address taken by the virtual function table for 31 // the object they belong to. However, as long as it's only used for a lookup 32 // and call, this is irrelevant, and we'd like to fold such functions. 33 // 34 // * switch from n^2 pair-wise comparisons to an n-way comparison for each 35 // bucket. 36 // 37 // * be smarter about bitcasts. 38 // 39 // In order to fold functions, we will sometimes add either bitcast instructions 40 // or bitcast constant expressions. Unfortunately, this can confound further 41 // analysis since the two functions differ where one has a bitcast and the 42 // other doesn't. We should learn to look through bitcasts. 43 // 44 //===----------------------------------------------------------------------===// 45 46 #define DEBUG_TYPE "mergefunc" 47 #include "llvm/Transforms/IPO.h" 48 #include "llvm/ADT/DenseSet.h" 49 #include "llvm/ADT/FoldingSet.h" 50 #include "llvm/ADT/SmallSet.h" 51 #include "llvm/ADT/Statistic.h" 52 #include "llvm/ADT/STLExtras.h" 53 #include "llvm/Constants.h" 54 #include "llvm/InlineAsm.h" 55 #include "llvm/Instructions.h" 56 #include "llvm/LLVMContext.h" 57 #include "llvm/Module.h" 58 #include "llvm/Pass.h" 59 #include "llvm/Support/CallSite.h" 60 #include "llvm/Support/Debug.h" 61 #include "llvm/Support/ErrorHandling.h" 62 #include "llvm/Support/IRBuilder.h" 63 #include "llvm/Support/ValueHandle.h" 64 #include "llvm/Support/raw_ostream.h" 65 #include "llvm/Target/TargetData.h" 66 #include <vector> 67 using namespace llvm; 68 69 STATISTIC(NumFunctionsMerged, "Number of functions merged"); 70 STATISTIC(NumThunksWritten, "Number of thunks generated"); 71 STATISTIC(NumDoubleWeak, "Number of new functions created"); 72 73 /// ProfileFunction - Creates a hash-code for the function which is the same 74 /// for any two functions that will compare equal, without looking at the 75 /// instructions inside the function. 76 static unsigned ProfileFunction(const Function *F) { 77 const FunctionType *FTy = F->getFunctionType(); 78 79 FoldingSetNodeID ID; 80 ID.AddInteger(F->size()); 81 ID.AddInteger(F->getCallingConv()); 82 ID.AddBoolean(F->hasGC()); 83 ID.AddBoolean(FTy->isVarArg()); 84 ID.AddInteger(FTy->getReturnType()->getTypeID()); 85 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) 86 ID.AddInteger(FTy->getParamType(i)->getTypeID()); 87 return ID.ComputeHash(); 88 } 89 90 namespace { 91 92 class ComparableFunction { 93 public: 94 static const ComparableFunction EmptyKey; 95 static const ComparableFunction TombstoneKey; 96 97 ComparableFunction(Function *Func, TargetData *TD) 98 : Func(Func), Hash(ProfileFunction(Func)), TD(TD) {} 99 100 Function *getFunc() const { return Func; } 101 unsigned getHash() const { return Hash; } 102 TargetData *getTD() const { return TD; } 103 104 // Drops AssertingVH reference to the function. Outside of debug mode, this 105 // does nothing. 106 void release() { 107 assert(Func && 108 "Attempted to release function twice, or release empty/tombstone!"); 109 Func = NULL; 110 } 111 112 private: 113 explicit ComparableFunction(unsigned Hash) 114 : Func(NULL), Hash(Hash), TD(NULL) {} 115 116 AssertingVH<Function> Func; 117 unsigned Hash; 118 TargetData *TD; 119 }; 120 121 const ComparableFunction ComparableFunction::EmptyKey = ComparableFunction(0); 122 const ComparableFunction ComparableFunction::TombstoneKey = 123 ComparableFunction(1); 124 125 } 126 127 namespace llvm { 128 template <> 129 struct DenseMapInfo<ComparableFunction> { 130 static ComparableFunction getEmptyKey() { 131 return ComparableFunction::EmptyKey; 132 } 133 static ComparableFunction getTombstoneKey() { 134 return ComparableFunction::TombstoneKey; 135 } 136 static unsigned getHashValue(const ComparableFunction &CF) { 137 return CF.getHash(); 138 } 139 static bool isEqual(const ComparableFunction &LHS, 140 const ComparableFunction &RHS); 141 }; 142 } 143 144 namespace { 145 146 /// MergeFunctions finds functions which will generate identical machine code, 147 /// by considering all pointer types to be equivalent. Once identified, 148 /// MergeFunctions will fold them by replacing a call to one to a call to a 149 /// bitcast of the other. 150 /// 151 class MergeFunctions : public ModulePass { 152 public: 153 static char ID; 154 MergeFunctions() : ModulePass(ID) { 155 initializeMergeFunctionsPass(*PassRegistry::getPassRegistry()); 156 } 157 158 bool runOnModule(Module &M); 159 160 private: 161 typedef DenseSet<ComparableFunction> FnSetType; 162 163 /// A work queue of functions that may have been modified and should be 164 /// analyzed again. 165 std::vector<WeakVH> Deferred; 166 167 /// Insert a ComparableFunction into the FnSet, or merge it away if it's 168 /// equal to one that's already present. 169 bool Insert(ComparableFunction &NewF); 170 171 /// Remove a Function from the FnSet and queue it up for a second sweep of 172 /// analysis. 173 void Remove(Function *F); 174 175 /// Find the functions that use this Value and remove them from FnSet and 176 /// queue the functions. 177 void RemoveUsers(Value *V); 178 179 /// MergeTwoFunctions - Merge two equivalent functions. Upon completion, G 180 /// may be deleted, or may be converted into a thunk. In either case, it 181 /// should never be visited again. 182 void MergeTwoFunctions(Function *F, Function *G); 183 184 /// WriteThunk - Replace G with a simple tail call to bitcast(F). Also 185 /// replace direct uses of G with bitcast(F). Deletes G. 186 void WriteThunk(Function *F, Function *G); 187 188 /// The set of all distinct functions. Use the Insert and Remove methods to 189 /// modify it. 190 FnSetType FnSet; 191 192 /// TargetData for more accurate GEP comparisons. May be NULL. 193 TargetData *TD; 194 }; 195 196 } // end anonymous namespace 197 198 char MergeFunctions::ID = 0; 199 INITIALIZE_PASS(MergeFunctions, "mergefunc", "Merge Functions", false, false) 200 201 ModulePass *llvm::createMergeFunctionsPass() { 202 return new MergeFunctions(); 203 } 204 205 namespace { 206 /// FunctionComparator - Compares two functions to determine whether or not 207 /// they will generate machine code with the same behaviour. TargetData is 208 /// used if available. The comparator always fails conservatively (erring on the 209 /// side of claiming that two functions are different). 210 class FunctionComparator { 211 public: 212 FunctionComparator(const TargetData *TD, const Function *F1, 213 const Function *F2) 214 : F1(F1), F2(F2), TD(TD), IDMap1Count(0), IDMap2Count(0) {} 215 216 /// Compare - test whether the two functions have equivalent behaviour. 217 bool Compare(); 218 219 private: 220 /// Compare - test whether two basic blocks have equivalent behaviour. 221 bool Compare(const BasicBlock *BB1, const BasicBlock *BB2); 222 223 /// Enumerate - Assign or look up previously assigned numbers for the two 224 /// values, and return whether the numbers are equal. Numbers are assigned in 225 /// the order visited. 226 bool Enumerate(const Value *V1, const Value *V2); 227 228 /// isEquivalentOperation - Compare two Instructions for equivalence, similar 229 /// to Instruction::isSameOperationAs but with modifications to the type 230 /// comparison. 231 bool isEquivalentOperation(const Instruction *I1, 232 const Instruction *I2) const; 233 234 /// isEquivalentGEP - Compare two GEPs for equivalent pointer arithmetic. 235 bool isEquivalentGEP(const GEPOperator *GEP1, const GEPOperator *GEP2); 236 bool isEquivalentGEP(const GetElementPtrInst *GEP1, 237 const GetElementPtrInst *GEP2) { 238 return isEquivalentGEP(cast<GEPOperator>(GEP1), cast<GEPOperator>(GEP2)); 239 } 240 241 /// isEquivalentType - Compare two Types, treating all pointer types as equal. 242 bool isEquivalentType(const Type *Ty1, const Type *Ty2) const; 243 244 // The two functions undergoing comparison. 245 const Function *F1, *F2; 246 247 const TargetData *TD; 248 249 typedef DenseMap<const Value *, unsigned long> IDMap; 250 IDMap Map1, Map2; 251 unsigned long IDMap1Count, IDMap2Count; 252 }; 253 } 254 255 /// isEquivalentType - any two pointers in the same address space are 256 /// equivalent. Otherwise, standard type equivalence rules apply. 257 bool FunctionComparator::isEquivalentType(const Type *Ty1, 258 const Type *Ty2) const { 259 if (Ty1 == Ty2) 260 return true; 261 if (Ty1->getTypeID() != Ty2->getTypeID()) 262 return false; 263 264 switch(Ty1->getTypeID()) { 265 default: 266 llvm_unreachable("Unknown type!"); 267 // Fall through in Release mode. 268 case Type::IntegerTyID: 269 case Type::OpaqueTyID: 270 // Ty1 == Ty2 would have returned true earlier. 271 return false; 272 273 case Type::VoidTyID: 274 case Type::FloatTyID: 275 case Type::DoubleTyID: 276 case Type::X86_FP80TyID: 277 case Type::FP128TyID: 278 case Type::PPC_FP128TyID: 279 case Type::LabelTyID: 280 case Type::MetadataTyID: 281 return true; 282 283 case Type::PointerTyID: { 284 const PointerType *PTy1 = cast<PointerType>(Ty1); 285 const PointerType *PTy2 = cast<PointerType>(Ty2); 286 return PTy1->getAddressSpace() == PTy2->getAddressSpace(); 287 } 288 289 case Type::StructTyID: { 290 const StructType *STy1 = cast<StructType>(Ty1); 291 const StructType *STy2 = cast<StructType>(Ty2); 292 if (STy1->getNumElements() != STy2->getNumElements()) 293 return false; 294 295 if (STy1->isPacked() != STy2->isPacked()) 296 return false; 297 298 for (unsigned i = 0, e = STy1->getNumElements(); i != e; ++i) { 299 if (!isEquivalentType(STy1->getElementType(i), STy2->getElementType(i))) 300 return false; 301 } 302 return true; 303 } 304 305 case Type::FunctionTyID: { 306 const FunctionType *FTy1 = cast<FunctionType>(Ty1); 307 const FunctionType *FTy2 = cast<FunctionType>(Ty2); 308 if (FTy1->getNumParams() != FTy2->getNumParams() || 309 FTy1->isVarArg() != FTy2->isVarArg()) 310 return false; 311 312 if (!isEquivalentType(FTy1->getReturnType(), FTy2->getReturnType())) 313 return false; 314 315 for (unsigned i = 0, e = FTy1->getNumParams(); i != e; ++i) { 316 if (!isEquivalentType(FTy1->getParamType(i), FTy2->getParamType(i))) 317 return false; 318 } 319 return true; 320 } 321 322 case Type::ArrayTyID: { 323 const ArrayType *ATy1 = cast<ArrayType>(Ty1); 324 const ArrayType *ATy2 = cast<ArrayType>(Ty2); 325 return ATy1->getNumElements() == ATy2->getNumElements() && 326 isEquivalentType(ATy1->getElementType(), ATy2->getElementType()); 327 } 328 329 case Type::VectorTyID: { 330 const VectorType *VTy1 = cast<VectorType>(Ty1); 331 const VectorType *VTy2 = cast<VectorType>(Ty2); 332 return VTy1->getNumElements() == VTy2->getNumElements() && 333 isEquivalentType(VTy1->getElementType(), VTy2->getElementType()); 334 } 335 } 336 } 337 338 /// isEquivalentOperation - determine whether the two operations are the same 339 /// except that pointer-to-A and pointer-to-B are equivalent. This should be 340 /// kept in sync with Instruction::isSameOperationAs. 341 bool FunctionComparator::isEquivalentOperation(const Instruction *I1, 342 const Instruction *I2) const { 343 if (I1->getOpcode() != I2->getOpcode() || 344 I1->getNumOperands() != I2->getNumOperands() || 345 !isEquivalentType(I1->getType(), I2->getType()) || 346 !I1->hasSameSubclassOptionalData(I2)) 347 return false; 348 349 // We have two instructions of identical opcode and #operands. Check to see 350 // if all operands are the same type 351 for (unsigned i = 0, e = I1->getNumOperands(); i != e; ++i) 352 if (!isEquivalentType(I1->getOperand(i)->getType(), 353 I2->getOperand(i)->getType())) 354 return false; 355 356 // Check special state that is a part of some instructions. 357 if (const LoadInst *LI = dyn_cast<LoadInst>(I1)) 358 return LI->isVolatile() == cast<LoadInst>(I2)->isVolatile() && 359 LI->getAlignment() == cast<LoadInst>(I2)->getAlignment(); 360 if (const StoreInst *SI = dyn_cast<StoreInst>(I1)) 361 return SI->isVolatile() == cast<StoreInst>(I2)->isVolatile() && 362 SI->getAlignment() == cast<StoreInst>(I2)->getAlignment(); 363 if (const CmpInst *CI = dyn_cast<CmpInst>(I1)) 364 return CI->getPredicate() == cast<CmpInst>(I2)->getPredicate(); 365 if (const CallInst *CI = dyn_cast<CallInst>(I1)) 366 return CI->isTailCall() == cast<CallInst>(I2)->isTailCall() && 367 CI->getCallingConv() == cast<CallInst>(I2)->getCallingConv() && 368 CI->getAttributes().getRawPointer() == 369 cast<CallInst>(I2)->getAttributes().getRawPointer(); 370 if (const InvokeInst *CI = dyn_cast<InvokeInst>(I1)) 371 return CI->getCallingConv() == cast<InvokeInst>(I2)->getCallingConv() && 372 CI->getAttributes().getRawPointer() == 373 cast<InvokeInst>(I2)->getAttributes().getRawPointer(); 374 if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(I1)) { 375 if (IVI->getNumIndices() != cast<InsertValueInst>(I2)->getNumIndices()) 376 return false; 377 for (unsigned i = 0, e = IVI->getNumIndices(); i != e; ++i) 378 if (IVI->idx_begin()[i] != cast<InsertValueInst>(I2)->idx_begin()[i]) 379 return false; 380 return true; 381 } 382 if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(I1)) { 383 if (EVI->getNumIndices() != cast<ExtractValueInst>(I2)->getNumIndices()) 384 return false; 385 for (unsigned i = 0, e = EVI->getNumIndices(); i != e; ++i) 386 if (EVI->idx_begin()[i] != cast<ExtractValueInst>(I2)->idx_begin()[i]) 387 return false; 388 return true; 389 } 390 391 return true; 392 } 393 394 /// isEquivalentGEP - determine whether two GEP operations perform the same 395 /// underlying arithmetic. 396 bool FunctionComparator::isEquivalentGEP(const GEPOperator *GEP1, 397 const GEPOperator *GEP2) { 398 // When we have target data, we can reduce the GEP down to the value in bytes 399 // added to the address. 400 if (TD && GEP1->hasAllConstantIndices() && GEP2->hasAllConstantIndices()) { 401 SmallVector<Value *, 8> Indices1(GEP1->idx_begin(), GEP1->idx_end()); 402 SmallVector<Value *, 8> Indices2(GEP2->idx_begin(), GEP2->idx_end()); 403 uint64_t Offset1 = TD->getIndexedOffset(GEP1->getPointerOperandType(), 404 Indices1.data(), Indices1.size()); 405 uint64_t Offset2 = TD->getIndexedOffset(GEP2->getPointerOperandType(), 406 Indices2.data(), Indices2.size()); 407 return Offset1 == Offset2; 408 } 409 410 if (GEP1->getPointerOperand()->getType() != 411 GEP2->getPointerOperand()->getType()) 412 return false; 413 414 if (GEP1->getNumOperands() != GEP2->getNumOperands()) 415 return false; 416 417 for (unsigned i = 0, e = GEP1->getNumOperands(); i != e; ++i) { 418 if (!Enumerate(GEP1->getOperand(i), GEP2->getOperand(i))) 419 return false; 420 } 421 422 return true; 423 } 424 425 /// Enumerate - Compare two values used by the two functions under pair-wise 426 /// comparison. If this is the first time the values are seen, they're added to 427 /// the mapping so that we will detect mismatches on next use. 428 bool FunctionComparator::Enumerate(const Value *V1, const Value *V2) { 429 // Check for function @f1 referring to itself and function @f2 referring to 430 // itself, or referring to each other, or both referring to either of them. 431 // They're all equivalent if the two functions are otherwise equivalent. 432 if (V1 == F1 && V2 == F2) 433 return true; 434 if (V1 == F2 && V2 == F1) 435 return true; 436 437 // TODO: constant expressions with GEP or references to F1 or F2. 438 if (isa<Constant>(V1)) 439 return V1 == V2; 440 441 if (isa<InlineAsm>(V1) && isa<InlineAsm>(V2)) { 442 const InlineAsm *IA1 = cast<InlineAsm>(V1); 443 const InlineAsm *IA2 = cast<InlineAsm>(V2); 444 return IA1->getAsmString() == IA2->getAsmString() && 445 IA1->getConstraintString() == IA2->getConstraintString(); 446 } 447 448 unsigned long &ID1 = Map1[V1]; 449 if (!ID1) 450 ID1 = ++IDMap1Count; 451 452 unsigned long &ID2 = Map2[V2]; 453 if (!ID2) 454 ID2 = ++IDMap2Count; 455 456 return ID1 == ID2; 457 } 458 459 /// Compare - test whether two basic blocks have equivalent behaviour. 460 bool FunctionComparator::Compare(const BasicBlock *BB1, const BasicBlock *BB2) { 461 BasicBlock::const_iterator F1I = BB1->begin(), F1E = BB1->end(); 462 BasicBlock::const_iterator F2I = BB2->begin(), F2E = BB2->end(); 463 464 do { 465 if (!Enumerate(F1I, F2I)) 466 return false; 467 468 if (const GetElementPtrInst *GEP1 = dyn_cast<GetElementPtrInst>(F1I)) { 469 const GetElementPtrInst *GEP2 = dyn_cast<GetElementPtrInst>(F2I); 470 if (!GEP2) 471 return false; 472 473 if (!Enumerate(GEP1->getPointerOperand(), GEP2->getPointerOperand())) 474 return false; 475 476 if (!isEquivalentGEP(GEP1, GEP2)) 477 return false; 478 } else { 479 if (!isEquivalentOperation(F1I, F2I)) 480 return false; 481 482 assert(F1I->getNumOperands() == F2I->getNumOperands()); 483 for (unsigned i = 0, e = F1I->getNumOperands(); i != e; ++i) { 484 Value *OpF1 = F1I->getOperand(i); 485 Value *OpF2 = F2I->getOperand(i); 486 487 if (!Enumerate(OpF1, OpF2)) 488 return false; 489 490 if (OpF1->getValueID() != OpF2->getValueID() || 491 !isEquivalentType(OpF1->getType(), OpF2->getType())) 492 return false; 493 } 494 } 495 496 ++F1I, ++F2I; 497 } while (F1I != F1E && F2I != F2E); 498 499 return F1I == F1E && F2I == F2E; 500 } 501 502 /// Compare - test whether the two functions have equivalent behaviour. 503 bool FunctionComparator::Compare() { 504 // We need to recheck everything, but check the things that weren't included 505 // in the hash first. 506 507 if (F1->getAttributes() != F2->getAttributes()) 508 return false; 509 510 if (F1->hasGC() != F2->hasGC()) 511 return false; 512 513 if (F1->hasGC() && F1->getGC() != F2->getGC()) 514 return false; 515 516 if (F1->hasSection() != F2->hasSection()) 517 return false; 518 519 if (F1->hasSection() && F1->getSection() != F2->getSection()) 520 return false; 521 522 if (F1->isVarArg() != F2->isVarArg()) 523 return false; 524 525 // TODO: if it's internal and only used in direct calls, we could handle this 526 // case too. 527 if (F1->getCallingConv() != F2->getCallingConv()) 528 return false; 529 530 if (!isEquivalentType(F1->getFunctionType(), F2->getFunctionType())) 531 return false; 532 533 assert(F1->arg_size() == F2->arg_size() && 534 "Identically typed functions have different numbers of args!"); 535 536 // Visit the arguments so that they get enumerated in the order they're 537 // passed in. 538 for (Function::const_arg_iterator f1i = F1->arg_begin(), 539 f2i = F2->arg_begin(), f1e = F1->arg_end(); f1i != f1e; ++f1i, ++f2i) { 540 if (!Enumerate(f1i, f2i)) 541 llvm_unreachable("Arguments repeat!"); 542 } 543 544 // We do a CFG-ordered walk since the actual ordering of the blocks in the 545 // linked list is immaterial. Our walk starts at the entry block for both 546 // functions, then takes each block from each terminator in order. As an 547 // artifact, this also means that unreachable blocks are ignored. 548 SmallVector<const BasicBlock *, 8> F1BBs, F2BBs; 549 SmallSet<const BasicBlock *, 128> VisitedBBs; // in terms of F1. 550 551 F1BBs.push_back(&F1->getEntryBlock()); 552 F2BBs.push_back(&F2->getEntryBlock()); 553 554 VisitedBBs.insert(F1BBs[0]); 555 while (!F1BBs.empty()) { 556 const BasicBlock *F1BB = F1BBs.pop_back_val(); 557 const BasicBlock *F2BB = F2BBs.pop_back_val(); 558 559 if (!Enumerate(F1BB, F2BB) || !Compare(F1BB, F2BB)) 560 return false; 561 562 const TerminatorInst *F1TI = F1BB->getTerminator(); 563 const TerminatorInst *F2TI = F2BB->getTerminator(); 564 565 assert(F1TI->getNumSuccessors() == F2TI->getNumSuccessors()); 566 for (unsigned i = 0, e = F1TI->getNumSuccessors(); i != e; ++i) { 567 if (!VisitedBBs.insert(F1TI->getSuccessor(i))) 568 continue; 569 570 F1BBs.push_back(F1TI->getSuccessor(i)); 571 F2BBs.push_back(F2TI->getSuccessor(i)); 572 } 573 } 574 return true; 575 } 576 577 /// WriteThunk - Replace G with a simple tail call to bitcast(F). Also replace 578 /// direct uses of G with bitcast(F). Deletes G. 579 void MergeFunctions::WriteThunk(Function *F, Function *G) { 580 if (!G->mayBeOverridden()) { 581 // Redirect direct callers of G to F. 582 Constant *BitcastF = ConstantExpr::getBitCast(F, G->getType()); 583 for (Value::use_iterator UI = G->use_begin(), UE = G->use_end(); 584 UI != UE;) { 585 Value::use_iterator TheIter = UI; 586 ++UI; 587 CallSite CS(*TheIter); 588 if (CS && CS.isCallee(TheIter)) { 589 Remove(CS.getInstruction()->getParent()->getParent()); 590 TheIter.getUse().set(BitcastF); 591 } 592 } 593 } 594 595 // If G was internal then we may have replaced all uses of G with F. If so, 596 // stop here and delete G. There's no need for a thunk. 597 if (G->hasLocalLinkage() && G->use_empty()) { 598 G->eraseFromParent(); 599 return; 600 } 601 602 Function *NewG = Function::Create(G->getFunctionType(), G->getLinkage(), "", 603 G->getParent()); 604 BasicBlock *BB = BasicBlock::Create(F->getContext(), "", NewG); 605 IRBuilder<false> Builder(BB); 606 607 SmallVector<Value *, 16> Args; 608 unsigned i = 0; 609 const FunctionType *FFTy = F->getFunctionType(); 610 for (Function::arg_iterator AI = NewG->arg_begin(), AE = NewG->arg_end(); 611 AI != AE; ++AI) { 612 Args.push_back(Builder.CreateBitCast(AI, FFTy->getParamType(i))); 613 ++i; 614 } 615 616 CallInst *CI = Builder.CreateCall(F, Args.begin(), Args.end()); 617 CI->setTailCall(); 618 CI->setCallingConv(F->getCallingConv()); 619 if (NewG->getReturnType()->isVoidTy()) { 620 Builder.CreateRetVoid(); 621 } else { 622 Builder.CreateRet(Builder.CreateBitCast(CI, NewG->getReturnType())); 623 } 624 625 NewG->copyAttributesFrom(G); 626 NewG->takeName(G); 627 RemoveUsers(G); 628 G->replaceAllUsesWith(NewG); 629 G->eraseFromParent(); 630 631 DEBUG(dbgs() << "WriteThunk: " << NewG->getName() << '\n'); 632 ++NumThunksWritten; 633 } 634 635 /// MergeTwoFunctions - Merge two equivalent functions. Upon completion, 636 /// Function G is deleted. 637 void MergeFunctions::MergeTwoFunctions(Function *F, Function *G) { 638 if (F->mayBeOverridden()) { 639 assert(G->mayBeOverridden()); 640 641 // Make them both thunks to the same internal function. 642 Function *H = Function::Create(F->getFunctionType(), F->getLinkage(), "", 643 F->getParent()); 644 H->copyAttributesFrom(F); 645 H->takeName(F); 646 RemoveUsers(F); 647 F->replaceAllUsesWith(H); 648 649 unsigned MaxAlignment = std::max(G->getAlignment(), H->getAlignment()); 650 651 WriteThunk(F, G); 652 WriteThunk(F, H); 653 654 F->setAlignment(MaxAlignment); 655 F->setLinkage(GlobalValue::PrivateLinkage); 656 657 ++NumDoubleWeak; 658 } else { 659 WriteThunk(F, G); 660 } 661 662 ++NumFunctionsMerged; 663 } 664 665 // Insert - Insert a ComparableFunction into the FnSet, or merge it away if 666 // equal to one that's already inserted. 667 bool MergeFunctions::Insert(ComparableFunction &NewF) { 668 std::pair<FnSetType::iterator, bool> Result = FnSet.insert(NewF); 669 if (Result.second) 670 return false; 671 672 const ComparableFunction &OldF = *Result.first; 673 674 // Never thunk a strong function to a weak function. 675 assert(!OldF.getFunc()->mayBeOverridden() || 676 NewF.getFunc()->mayBeOverridden()); 677 678 DEBUG(dbgs() << " " << OldF.getFunc()->getName() << " == " 679 << NewF.getFunc()->getName() << '\n'); 680 681 Function *DeleteF = NewF.getFunc(); 682 NewF.release(); 683 MergeTwoFunctions(OldF.getFunc(), DeleteF); 684 return true; 685 } 686 687 // Remove - Remove a function from FnSet. If it was already in FnSet, add it to 688 // Deferred so that we'll look at it in the next round. 689 void MergeFunctions::Remove(Function *F) { 690 ComparableFunction CF = ComparableFunction(F, TD); 691 if (FnSet.erase(CF)) { 692 Deferred.push_back(F); 693 } 694 } 695 696 // RemoveUsers - For each instruction used by the value, Remove() the function 697 // that contains the instruction. This should happen right before a call to RAUW. 698 void MergeFunctions::RemoveUsers(Value *V) { 699 std::vector<Value *> Worklist; 700 Worklist.push_back(V); 701 while (!Worklist.empty()) { 702 Value *V = Worklist.back(); 703 Worklist.pop_back(); 704 705 for (Value::use_iterator UI = V->use_begin(), UE = V->use_end(); 706 UI != UE; ++UI) { 707 Use &U = UI.getUse(); 708 if (Instruction *I = dyn_cast<Instruction>(U.getUser())) { 709 Remove(I->getParent()->getParent()); 710 } else if (isa<GlobalValue>(U.getUser())) { 711 // do nothing 712 } else if (Constant *C = dyn_cast<Constant>(U.getUser())) { 713 for (Value::use_iterator CUI = C->use_begin(), CUE = C->use_end(); 714 CUI != CUE; ++CUI) 715 Worklist.push_back(*CUI); 716 } 717 } 718 } 719 } 720 721 bool MergeFunctions::runOnModule(Module &M) { 722 bool Changed = false; 723 TD = getAnalysisIfAvailable<TargetData>(); 724 725 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { 726 Deferred.push_back(WeakVH(I)); 727 } 728 729 do { 730 std::vector<WeakVH> Worklist; 731 Deferred.swap(Worklist); 732 733 DEBUG(dbgs() << "size of module: " << M.size() << '\n'); 734 DEBUG(dbgs() << "size of worklist: " << Worklist.size() << '\n'); 735 736 // Insert only strong functions and merge them. Strong function merging 737 // always deletes one of them. 738 for (std::vector<WeakVH>::iterator I = Worklist.begin(), 739 E = Worklist.end(); I != E; ++I) { 740 if (!*I) continue; 741 Function *F = cast<Function>(*I); 742 if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage() && 743 !F->mayBeOverridden()) { 744 ComparableFunction CF = ComparableFunction(F, TD); 745 Changed |= Insert(CF); 746 } 747 } 748 749 // Insert only weak functions and merge them. By doing these second we 750 // create thunks to the strong function when possible. When two weak 751 // functions are identical, we create a new strong function with two weak 752 // weak thunks to it which are identical but not mergable. 753 for (std::vector<WeakVH>::iterator I = Worklist.begin(), 754 E = Worklist.end(); I != E; ++I) { 755 if (!*I) continue; 756 Function *F = cast<Function>(*I); 757 if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage() && 758 F->mayBeOverridden()) { 759 ComparableFunction CF = ComparableFunction(F, TD); 760 Changed |= Insert(CF); 761 } 762 } 763 DEBUG(dbgs() << "size of FnSet: " << FnSet.size() << '\n'); 764 } while (!Deferred.empty()); 765 766 FnSet.clear(); 767 768 return Changed; 769 } 770 771 bool DenseMapInfo<ComparableFunction>::isEqual(const ComparableFunction &LHS, 772 const ComparableFunction &RHS) { 773 if (LHS.getFunc() == RHS.getFunc() && 774 LHS.getHash() == RHS.getHash()) 775 return true; 776 if (!LHS.getFunc() || !RHS.getFunc()) 777 return false; 778 assert(LHS.getTD() == RHS.getTD() && 779 "Comparing functions for different targets"); 780 return FunctionComparator(LHS.getTD(), 781 LHS.getFunc(), RHS.getFunc()).Compare(); 782 } 783