Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 1 | //===- InlineSimple.cpp - Code to perform simple function inlining --------===// |
John Criswell | 482202a | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file was developed by the LLVM research group and is distributed under |
| 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 9 | // |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 10 | // This file implements bottom-up inlining of functions into callees. |
Chris Lattner | 1c8d3f8 | 2002-04-18 18:52:03 +0000 | [diff] [blame] | 11 | // |
Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 12 | //===----------------------------------------------------------------------===// |
| 13 | |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 14 | #include "Inliner.h" |
| 15 | #include "llvm/Function.h" |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 16 | #include "llvm/iMemory.h" |
Chris Lattner | d367d05 | 2003-08-24 06:59:28 +0000 | [diff] [blame] | 17 | #include "llvm/Support/CallSite.h" |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 18 | #include "llvm/Transforms/IPO.h" |
Chris Lattner | 04805fa | 2002-02-26 21:46:54 +0000 | [diff] [blame] | 19 | |
Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame^] | 20 | namespace llvm { |
| 21 | |
Chris Lattner | 04805fa | 2002-02-26 21:46:54 +0000 | [diff] [blame] | 22 | namespace { |
Chris Lattner | 6dc0ae2 | 2003-10-06 15:52:43 +0000 | [diff] [blame] | 23 | // FunctionInfo - For each function, calculate the size of it in blocks and |
| 24 | // instructions. |
| 25 | struct FunctionInfo { |
| 26 | unsigned NumInsts, NumBlocks; |
| 27 | |
| 28 | FunctionInfo() : NumInsts(0), NumBlocks(0) {} |
| 29 | }; |
| 30 | |
| 31 | class SimpleInliner : public Inliner { |
| 32 | std::map<const Function*, FunctionInfo> CachedFunctionInfo; |
| 33 | public: |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 34 | int getInlineCost(CallSite CS); |
Chris Lattner | 04805fa | 2002-02-26 21:46:54 +0000 | [diff] [blame] | 35 | }; |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 36 | RegisterOpt<SimpleInliner> X("inline", "Function Integration/Inlining"); |
Chris Lattner | 04805fa | 2002-02-26 21:46:54 +0000 | [diff] [blame] | 37 | } |
| 38 | |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 39 | Pass *createFunctionInliningPass() { return new SimpleInliner(); } |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 40 | |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 41 | // getInlineCost - The heuristic used to determine if we should inline the |
| 42 | // function call or not. |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 43 | // |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 44 | int SimpleInliner::getInlineCost(CallSite CS) { |
Chris Lattner | d367d05 | 2003-08-24 06:59:28 +0000 | [diff] [blame] | 45 | Instruction *TheCall = CS.getInstruction(); |
Chris Lattner | d367d05 | 2003-08-24 06:59:28 +0000 | [diff] [blame] | 46 | const Function *Callee = CS.getCalledFunction(); |
Chris Lattner | d367d05 | 2003-08-24 06:59:28 +0000 | [diff] [blame] | 47 | const Function *Caller = TheCall->getParent()->getParent(); |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 48 | |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 49 | // Don't inline a directly recursive call. |
| 50 | if (Caller == Callee) return 2000000000; |
| 51 | |
| 52 | // InlineCost - This value measures how good of an inline candidate this call |
| 53 | // site is to inline. A lower inline cost make is more likely for the call to |
| 54 | // be inlined. This value may go negative. |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 55 | // |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 56 | int InlineCost = 0; |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 57 | |
| 58 | // If there is only one call of the function, and it has internal linkage, |
| 59 | // make it almost guaranteed to be inlined. |
| 60 | // |
Chris Lattner | 2d9c117 | 2003-10-20 05:54:26 +0000 | [diff] [blame] | 61 | if (Callee->hasInternalLinkage() && Callee->hasOneUse()) |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 62 | InlineCost -= 30000; |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 63 | |
Misha Brukman | 8b2bd4e | 2003-10-10 17:57:28 +0000 | [diff] [blame] | 64 | // Add to the inline quality for properties that make the call valuable to |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 65 | // inline. This includes factors that indicate that the result of inlining |
| 66 | // the function will be optimizable. Currently this just looks at arguments |
| 67 | // passed into the function. |
| 68 | // |
Chris Lattner | d367d05 | 2003-08-24 06:59:28 +0000 | [diff] [blame] | 69 | for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); |
| 70 | I != E; ++I) { |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 71 | // Each argument passed in has a cost at both the caller and the callee |
| 72 | // sides. This favors functions that take many arguments over functions |
| 73 | // that take few arguments. |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 74 | InlineCost -= 20; |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 75 | |
| 76 | // If this is a function being passed in, it is very likely that we will be |
| 77 | // able to turn an indirect function call into a direct function call. |
| 78 | if (isa<Function>(I)) |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 79 | InlineCost -= 100; |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 80 | |
| 81 | // If a constant, global variable or alloca is passed in, inlining this |
| 82 | // function is likely to allow significant future optimization possibilities |
| 83 | // (constant propagation, scalar promotion, and scalarization), so encourage |
| 84 | // the inlining of the function. |
| 85 | // |
| 86 | else if (isa<Constant>(I) || isa<GlobalVariable>(I) || isa<AllocaInst>(I)) |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 87 | InlineCost -= 60; |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 88 | } |
| 89 | |
| 90 | // Now that we have considered all of the factors that make the call site more |
| 91 | // likely to be inlined, look at factors that make us not want to inline it. |
Chris Lattner | 6dc0ae2 | 2003-10-06 15:52:43 +0000 | [diff] [blame] | 92 | FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 93 | |
Chris Lattner | 6dc0ae2 | 2003-10-06 15:52:43 +0000 | [diff] [blame] | 94 | // If we haven't calculated this information yet... |
| 95 | if (CalleeFI.NumBlocks == 0) { |
| 96 | unsigned NumInsts = 0, NumBlocks = 0; |
| 97 | |
| 98 | // Look at the size of the callee. Each basic block counts as 20 units, and |
| 99 | // each instruction counts as 10. |
| 100 | for (Function::const_iterator BB = Callee->begin(), E = Callee->end(); |
| 101 | BB != E; ++BB) { |
| 102 | NumInsts += BB->size(); |
| 103 | NumBlocks++; |
| 104 | } |
| 105 | CalleeFI.NumBlocks = NumBlocks; |
| 106 | CalleeFI.NumInsts = NumInsts; |
| 107 | } |
| 108 | |
Chris Lattner | f849253 | 2003-10-07 19:33:31 +0000 | [diff] [blame] | 109 | // Don't inline into something too big, which would make it bigger. Here, we |
| 110 | // count each basic block as a single unit. |
| 111 | InlineCost += Caller->size()*2; |
| 112 | |
| 113 | |
| 114 | // Look at the size of the callee. Each basic block counts as 20 units, and |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 115 | // each instruction counts as 10. |
Chris Lattner | 6dc0ae2 | 2003-10-06 15:52:43 +0000 | [diff] [blame] | 116 | InlineCost += CalleeFI.NumInsts*10 + CalleeFI.NumBlocks*20; |
Chris Lattner | d075cc2 | 2003-08-31 19:10:30 +0000 | [diff] [blame] | 117 | return InlineCost; |
Chris Lattner | 530d4bf | 2003-05-29 15:11:31 +0000 | [diff] [blame] | 118 | } |
Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame^] | 119 | |
| 120 | } // End llvm namespace |