diff options
-rw-r--r-- | lib/Transforms/IPO/Inliner.cpp | 9 | ||||
-rw-r--r-- | test/Transforms/Inline/2008-09-02-AlwaysInline.ll | 10 | ||||
-rw-r--r-- | test/Transforms/Inline/2008-09-02-NoInline.ll | 10 |
3 files changed, 28 insertions, 1 deletions
diff --git a/lib/Transforms/IPO/Inliner.cpp b/lib/Transforms/IPO/Inliner.cpp index 1c3d5a81f3..e9ae21f795 100644 --- a/lib/Transforms/IPO/Inliner.cpp +++ b/lib/Transforms/IPO/Inliner.cpp @@ -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 { diff --git a/test/Transforms/Inline/2008-09-02-AlwaysInline.ll b/test/Transforms/Inline/2008-09-02-AlwaysInline.ll new file mode 100644 index 0000000000..188d4c9470 --- /dev/null +++ b/test/Transforms/Inline/2008-09-02-AlwaysInline.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | opt -inline-threshold=0 -inline | llvm-dis | not grep call + +define i32 @fn2() notes(inline=always) { + ret i32 1 +} + +define i32 @fn3() { + %r = call i32 @fn2() + ret i32 %r +} diff --git a/test/Transforms/Inline/2008-09-02-NoInline.ll b/test/Transforms/Inline/2008-09-02-NoInline.ll new file mode 100644 index 0000000000..1d37b08ac7 --- /dev/null +++ b/test/Transforms/Inline/2008-09-02-NoInline.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | opt -inline | llvm-dis | grep call | count 1 + +define i32 @fn2() notes(inline=never) { + ret i32 1 +} + +define i32 @fn3() { + %r = call i32 @fn2() + ret i32 %r +} |