respect inline=never and inline=always notes.
[oota-llvm.git] / lib / Transforms / IPO / Inliner.cpp
index 1c3d5a81f36967a49c58398a2d0be62ae93a8f07..e9ae21f79517e4ed167ea4ed4998033f6b6632ea 100644 (file)
@@ -140,7 +140,14 @@ bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
         int InlineCost = getInlineCost(CS);
         float FudgeFactor = getInlineFudgeFactor(CS);
 
-        if (InlineCost >= (int)(InlineThreshold * FudgeFactor)) {
+        Function *Fn = CS.getCalledFunction();
+        bool AlwaysInline = false;
+        if (Fn && (Fn->getNotes() & FP_AlwaysInline))
+          AlwaysInline = true;
+        if (Fn && (Fn->getNotes() & FP_NoInline))
+          DOUT << "NOT Inlining: inline=never is set" << *CS.getInstruction();
+        else if (!AlwaysInline 
+                 && InlineCost >= (int)(InlineThreshold * FudgeFactor)) {
           DOUT << "    NOT Inlining: cost=" << InlineCost
                << ", Call: " << *CS.getInstruction();
         } else {