Matthew Simpson | e363d2c | 2017-12-06 21:22:54 +0000 | [diff] [blame^] | 1 | //===- CallPromotionUtils.cpp - Utilities for call promotion ----*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file implements utilities useful for promoting indirect call sites to |
| 11 | // direct call sites. |
| 12 | // |
| 13 | //===----------------------------------------------------------------------===// |
| 14 | |
| 15 | #include "llvm/Transforms/Utils/CallPromotionUtils.h" |
| 16 | #include "llvm/IR/IRBuilder.h" |
| 17 | #include "llvm/Transforms/Utils/BasicBlockUtils.h" |
| 18 | |
| 19 | using namespace llvm; |
| 20 | |
| 21 | #define DEBUG_TYPE "call-promotion-utils" |
| 22 | |
| 23 | /// Fix-up phi nodes in an invoke instruction's normal destination. |
| 24 | /// |
| 25 | /// After versioning an invoke instruction, values coming from the original |
| 26 | /// block will now either be coming from the original block or the "else" block. |
| 27 | static void fixupPHINodeForNormalDest(InvokeInst *Invoke, BasicBlock *OrigBlock, |
| 28 | BasicBlock *ElseBlock, |
| 29 | Instruction *NewInst) { |
| 30 | for (auto &I : *Invoke->getNormalDest()) { |
| 31 | auto *Phi = dyn_cast<PHINode>(&I); |
| 32 | if (!Phi) |
| 33 | break; |
| 34 | int Idx = Phi->getBasicBlockIndex(OrigBlock); |
| 35 | if (Idx == -1) |
| 36 | continue; |
| 37 | Value *V = Phi->getIncomingValue(Idx); |
| 38 | if (dyn_cast<Instruction>(V) == Invoke) { |
| 39 | Phi->setIncomingBlock(Idx, ElseBlock); |
| 40 | Phi->addIncoming(NewInst, OrigBlock); |
| 41 | continue; |
| 42 | } |
| 43 | Phi->addIncoming(V, ElseBlock); |
| 44 | } |
| 45 | } |
| 46 | |
| 47 | /// Fix-up phi nodes in an invoke instruction's unwind destination. |
| 48 | /// |
| 49 | /// After versioning an invoke instruction, values coming from the original |
| 50 | /// block will now be coming from either the "then" block or the "else" block. |
| 51 | static void fixupPHINodeForUnwindDest(InvokeInst *Invoke, BasicBlock *OrigBlock, |
| 52 | BasicBlock *ThenBlock, |
| 53 | BasicBlock *ElseBlock) { |
| 54 | for (auto &I : *Invoke->getUnwindDest()) { |
| 55 | auto *Phi = dyn_cast<PHINode>(&I); |
| 56 | if (!Phi) |
| 57 | break; |
| 58 | int Idx = Phi->getBasicBlockIndex(OrigBlock); |
| 59 | if (Idx == -1) |
| 60 | continue; |
| 61 | auto *V = Phi->getIncomingValue(Idx); |
| 62 | Phi->setIncomingBlock(Idx, ThenBlock); |
| 63 | Phi->addIncoming(V, ElseBlock); |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | /// Get the phi node having the returned value of a call or invoke instruction |
| 68 | /// as it's operand. |
| 69 | static bool getRetPhiNode(Instruction *Inst, BasicBlock *Block) { |
| 70 | BasicBlock *FromBlock = Inst->getParent(); |
| 71 | for (auto &I : *Block) { |
| 72 | PHINode *PHI = dyn_cast<PHINode>(&I); |
| 73 | if (!PHI) |
| 74 | break; |
| 75 | int Idx = PHI->getBasicBlockIndex(FromBlock); |
| 76 | if (Idx == -1) |
| 77 | continue; |
| 78 | auto *V = PHI->getIncomingValue(Idx); |
| 79 | if (V == Inst) |
| 80 | return true; |
| 81 | } |
| 82 | return false; |
| 83 | } |
| 84 | |
| 85 | /// Create a phi node for the returned value of a call or invoke instruction. |
| 86 | /// |
| 87 | /// After versioning a call or invoke instruction that returns a value, we have |
| 88 | /// to merge the value of the original and new instructions. We do this by |
| 89 | /// creating a phi node and replacing uses of the original instruction with this |
| 90 | /// phi node. |
| 91 | static void createRetPHINode(Instruction *OrigInst, Instruction *NewInst) { |
| 92 | |
| 93 | if (OrigInst->getType()->isVoidTy() || OrigInst->use_empty()) |
| 94 | return; |
| 95 | |
| 96 | BasicBlock *RetValBB = NewInst->getParent(); |
| 97 | if (auto *Invoke = dyn_cast<InvokeInst>(NewInst)) |
| 98 | RetValBB = Invoke->getNormalDest(); |
| 99 | BasicBlock *PhiBB = RetValBB->getSingleSuccessor(); |
| 100 | |
| 101 | if (getRetPhiNode(OrigInst, PhiBB)) |
| 102 | return; |
| 103 | |
| 104 | IRBuilder<> Builder(&PhiBB->front()); |
| 105 | PHINode *Phi = Builder.CreatePHI(OrigInst->getType(), 0); |
| 106 | SmallVector<User *, 16> UsersToUpdate; |
| 107 | for (User *U : OrigInst->users()) |
| 108 | UsersToUpdate.push_back(U); |
| 109 | for (User *U : UsersToUpdate) |
| 110 | U->replaceUsesOfWith(OrigInst, Phi); |
| 111 | Phi->addIncoming(OrigInst, OrigInst->getParent()); |
| 112 | Phi->addIncoming(NewInst, RetValBB); |
| 113 | } |
| 114 | |
| 115 | /// Cast a call or invoke instruction to the given type. |
| 116 | /// |
| 117 | /// When promoting a call site, the return type of the call site might not match |
| 118 | /// that of the callee. If this is the case, we have to cast the returned value |
| 119 | /// to the correct type. The location of the cast depends on if we have a call |
| 120 | /// or invoke instruction. |
| 121 | Instruction *createRetBitCast(CallSite CS, Type *RetTy) { |
| 122 | |
| 123 | // Save the users of the calling instruction. These uses will be changed to |
| 124 | // use the bitcast after we create it. |
| 125 | SmallVector<User *, 16> UsersToUpdate; |
| 126 | for (User *U : CS.getInstruction()->users()) |
| 127 | UsersToUpdate.push_back(U); |
| 128 | |
| 129 | // Determine an appropriate location to create the bitcast for the return |
| 130 | // value. The location depends on if we have a call or invoke instruction. |
| 131 | Instruction *InsertBefore = nullptr; |
| 132 | if (auto *Invoke = dyn_cast<InvokeInst>(CS.getInstruction())) |
| 133 | InsertBefore = &*Invoke->getNormalDest()->getFirstInsertionPt(); |
| 134 | else |
| 135 | InsertBefore = &*std::next(CS.getInstruction()->getIterator()); |
| 136 | |
| 137 | // Bitcast the return value to the correct type. |
| 138 | auto *Cast = CastInst::Create(Instruction::BitCast, CS.getInstruction(), |
| 139 | RetTy, "", InsertBefore); |
| 140 | |
| 141 | // Replace all the original uses of the calling instruction with the bitcast. |
| 142 | for (User *U : UsersToUpdate) |
| 143 | U->replaceUsesOfWith(CS.getInstruction(), Cast); |
| 144 | |
| 145 | return Cast; |
| 146 | } |
| 147 | |
| 148 | /// Predicate and clone the given call site. |
| 149 | /// |
| 150 | /// This function creates an if-then-else structure at the location of the call |
| 151 | /// site. The "if" condition compares the call site's called value to the given |
| 152 | /// callee. The original call site is moved into the "else" block, and a clone |
| 153 | /// of the call site is placed in the "then" block. The cloned instruction is |
| 154 | /// returned. |
| 155 | static Instruction *versionCallSite(CallSite CS, Value *Callee, |
| 156 | MDNode *BranchWeights, |
| 157 | BasicBlock *&ThenBlock, |
| 158 | BasicBlock *&ElseBlock, |
| 159 | BasicBlock *&MergeBlock) { |
| 160 | |
| 161 | IRBuilder<> Builder(CS.getInstruction()); |
| 162 | Instruction *OrigInst = CS.getInstruction(); |
| 163 | |
| 164 | // Create the compare. The called value and callee must have the same type to |
| 165 | // be compared. |
| 166 | auto *LHS = |
| 167 | Builder.CreateBitCast(CS.getCalledValue(), Builder.getInt8PtrTy()); |
| 168 | auto *RHS = Builder.CreateBitCast(Callee, Builder.getInt8PtrTy()); |
| 169 | auto *Cond = Builder.CreateICmpEQ(LHS, RHS); |
| 170 | |
| 171 | // Create an if-then-else structure. The original instruction is moved into |
| 172 | // the "else" block, and a clone of the original instruction is placed in the |
| 173 | // "then" block. |
| 174 | TerminatorInst *ThenTerm = nullptr; |
| 175 | TerminatorInst *ElseTerm = nullptr; |
| 176 | SplitBlockAndInsertIfThenElse(Cond, CS.getInstruction(), &ThenTerm, &ElseTerm, |
| 177 | BranchWeights); |
| 178 | ThenBlock = ThenTerm->getParent(); |
| 179 | ElseBlock = ElseTerm->getParent(); |
| 180 | MergeBlock = OrigInst->getParent(); |
| 181 | |
| 182 | ThenBlock->setName("if.true.direct_targ"); |
| 183 | ElseBlock->setName("if.false.orig_indirect"); |
| 184 | MergeBlock->setName("if.end.icp"); |
| 185 | |
| 186 | Instruction *NewInst = OrigInst->clone(); |
| 187 | OrigInst->moveBefore(ElseTerm); |
| 188 | NewInst->insertBefore(ThenTerm); |
| 189 | |
| 190 | // If the original call site is an invoke instruction, we have extra work to |
| 191 | // do since invoke instructions are terminating. |
| 192 | if (auto *OrigInvoke = dyn_cast<InvokeInst>(OrigInst)) { |
| 193 | auto *NewInvoke = cast<InvokeInst>(NewInst); |
| 194 | |
| 195 | // Invoke instructions are terminating, so we don't need the terminator |
| 196 | // instructions that were just created. |
| 197 | ThenTerm->eraseFromParent(); |
| 198 | ElseTerm->eraseFromParent(); |
| 199 | |
| 200 | // Branch from the "merge" block to the original normal destination. |
| 201 | Builder.SetInsertPoint(MergeBlock); |
| 202 | Builder.CreateBr(OrigInvoke->getNormalDest()); |
| 203 | |
| 204 | // Now set the normal destination of new the invoke instruction to be the |
| 205 | // "merge" block. |
| 206 | NewInvoke->setNormalDest(MergeBlock); |
| 207 | } |
| 208 | |
| 209 | return NewInst; |
| 210 | } |
| 211 | |
| 212 | bool llvm::isLegalToPromote(CallSite CS, Function *Callee, |
| 213 | const char **FailureReason) { |
| 214 | assert(!CS.getCalledFunction() && "Only indirect call sites can be promoted"); |
| 215 | |
| 216 | // Check the return type. The callee's return value type must be bitcast |
| 217 | // compatible with the call site's type. |
| 218 | Type *CallRetTy = CS.getInstruction()->getType(); |
| 219 | Type *FuncRetTy = Callee->getReturnType(); |
| 220 | if (CallRetTy != FuncRetTy) |
| 221 | if (!CastInst::isBitCastable(FuncRetTy, CallRetTy)) { |
| 222 | if (FailureReason) |
| 223 | *FailureReason = "Return type mismatch"; |
| 224 | return false; |
| 225 | } |
| 226 | |
| 227 | // The number of formal arguments of the callee. |
| 228 | unsigned NumParams = Callee->getFunctionType()->getNumParams(); |
| 229 | |
| 230 | // Check the number of arguments. The callee and call site must agree on the |
| 231 | // number of arguments. |
| 232 | if (CS.arg_size() != NumParams && !Callee->isVarArg()) { |
| 233 | if (FailureReason) |
| 234 | *FailureReason = "The number of arguments mismatch"; |
| 235 | return false; |
| 236 | } |
| 237 | |
| 238 | // Check the argument types. The callee's formal argument types must be |
| 239 | // bitcast compatible with the corresponding actual argument types of the call |
| 240 | // site. |
| 241 | for (unsigned I = 0; I < NumParams; ++I) { |
| 242 | Type *FormalTy = Callee->getFunctionType()->getFunctionParamType(I); |
| 243 | Type *ActualTy = CS.getArgument(I)->getType(); |
| 244 | if (FormalTy == ActualTy) |
| 245 | continue; |
| 246 | if (!CastInst::isBitCastable(ActualTy, FormalTy)) { |
| 247 | if (FailureReason) |
| 248 | *FailureReason = "Argument type mismatch"; |
| 249 | return false; |
| 250 | } |
| 251 | } |
| 252 | |
| 253 | return true; |
| 254 | } |
| 255 | |
| 256 | static void promoteCall(CallSite CS, Function *Callee, Instruction *&Cast) { |
| 257 | assert(!CS.getCalledFunction() && "Only indirect call sites can be promoted"); |
| 258 | |
| 259 | // Set the called function of the call site to be the given callee. |
| 260 | CS.setCalledFunction(Callee); |
| 261 | |
| 262 | // Since the call site will no longer be direct, we must clear metadata that |
| 263 | // is only appropriate for indirect calls. This includes !prof and !callees |
| 264 | // metadata. |
| 265 | CS.getInstruction()->setMetadata(LLVMContext::MD_prof, nullptr); |
| 266 | CS.getInstruction()->setMetadata(LLVMContext::MD_callees, nullptr); |
| 267 | |
| 268 | // If the function type of the call site matches that of the callee, no |
| 269 | // additional work is required. |
| 270 | if (CS.getFunctionType() == Callee->getFunctionType()) |
| 271 | return; |
| 272 | |
| 273 | // Save the return types of the call site and callee. |
| 274 | Type *CallSiteRetTy = CS.getInstruction()->getType(); |
| 275 | Type *CalleeRetTy = Callee->getReturnType(); |
| 276 | |
| 277 | // Change the function type of the call site the match that of the callee. |
| 278 | CS.mutateFunctionType(Callee->getFunctionType()); |
| 279 | |
| 280 | // Inspect the arguments of the call site. If an argument's type doesn't |
| 281 | // match the corresponding formal argument's type in the callee, bitcast it |
| 282 | // to the correct type. |
| 283 | for (Use &U : CS.args()) { |
| 284 | unsigned ArgNo = CS.getArgumentNo(&U); |
| 285 | Type *FormalTy = Callee->getFunctionType()->getParamType(ArgNo); |
| 286 | Type *ActualTy = U.get()->getType(); |
| 287 | if (FormalTy != ActualTy) { |
| 288 | auto *Cast = CastInst::Create(Instruction::BitCast, U.get(), FormalTy, "", |
| 289 | CS.getInstruction()); |
| 290 | CS.setArgument(ArgNo, Cast); |
| 291 | } |
| 292 | } |
| 293 | |
| 294 | // If the return type of the call site doesn't match that of the callee, cast |
| 295 | // the returned value to the appropriate type. |
| 296 | if (!CallSiteRetTy->isVoidTy() && CallSiteRetTy != CalleeRetTy) |
| 297 | Cast = createRetBitCast(CS, CallSiteRetTy); |
| 298 | } |
| 299 | |
| 300 | Instruction *llvm::promoteCallWithIfThenElse(CallSite CS, Function *Callee, |
| 301 | MDNode *BranchWeights) { |
| 302 | |
| 303 | // Version the indirect call site. If the called value is equal to the given |
| 304 | // callee, 'NewInst' will be executed, otherwise the original call site will |
| 305 | // be executed. |
| 306 | BasicBlock *ThenBlock, *ElseBlock, *MergeBlock; |
| 307 | Instruction *NewInst = versionCallSite(CS, Callee, BranchWeights, ThenBlock, |
| 308 | ElseBlock, MergeBlock); |
| 309 | |
| 310 | // Promote 'NewInst' so that it directly calls the desired function. |
| 311 | Instruction *Cast = NewInst; |
| 312 | promoteCall(CallSite(NewInst), Callee, Cast); |
| 313 | |
| 314 | // If the original call site is an invoke instruction, we have to fix-up phi |
| 315 | // nodes in the invoke's normal and unwind destinations. |
| 316 | if (auto *OrigInvoke = dyn_cast<InvokeInst>(CS.getInstruction())) { |
| 317 | fixupPHINodeForNormalDest(OrigInvoke, MergeBlock, ElseBlock, Cast); |
| 318 | fixupPHINodeForUnwindDest(OrigInvoke, MergeBlock, ThenBlock, ElseBlock); |
| 319 | } |
| 320 | |
| 321 | // Create a phi node for the returned value of the call site. |
| 322 | createRetPHINode(CS.getInstruction(), Cast ? Cast : NewInst); |
| 323 | |
| 324 | // Return the new direct call. |
| 325 | return NewInst; |
| 326 | } |
| 327 | |
| 328 | #undef DEBUG_TYPE |