-// ShouldInlineFunction - The heuristic used to determine if we should inline
-// the function call or not.
-//
-static inline bool ShouldInlineFunction(CallSite CS) {
- Instruction *TheCall = CS.getInstruction();
- assert(TheCall->getParent() && TheCall->getParent()->getParent() &&
- "Call not embedded into a function!");
-
- const Function *Callee = CS.getCalledFunction();
- if (Callee == 0 || Callee->isExternal())
- return false; // Cannot inline an indirect call... or external function.
-
- // Don't inline a recursive call.
- const Function *Caller = TheCall->getParent()->getParent();
- if (Caller == Callee) return false;
-
- // InlineQuality - This value measures how good of an inline candidate this
- // call site is to inline. The initial value determines how aggressive the
- // inliner is. If this value is negative after the final computation,
- // inlining is not performed.
- //
- int InlineQuality = InlineLimit;
-
- // If there is only one call of the function, and it has internal linkage,
- // make it almost guaranteed to be inlined.
- //
- if (Callee->use_size() == 1 && Callee->hasInternalLinkage())
- InlineQuality += 30000;
-
- // Add to the inline quality for properties that make the call valueable to
- // inline. This includes factors that indicate that the result of inlining
- // the function will be optimizable. Currently this just looks at arguments
- // passed into the function.
- //
- for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end();
- I != E; ++I) {
- // Each argument passed in has a cost at both the caller and the callee
- // sides. This favors functions that take many arguments over functions
- // that take few arguments.
- InlineQuality += 20;
-
- // If this is a function being passed in, it is very likely that we will be
- // able to turn an indirect function call into a direct function call.
- if (isa<Function>(I))
- InlineQuality += 100;
-
- // If a constant, global variable or alloca is passed in, inlining this
- // function is likely to allow significant future optimization possibilities
- // (constant propagation, scalar promotion, and scalarization), so encourage
- // the inlining of the function.
- //
- else if (isa<Constant>(I) || isa<GlobalVariable>(I) || isa<AllocaInst>(I))
- InlineQuality += 60;