respect inline=never and inline=always notes.
authorDevang Patel <dpatel@apple.com>
Tue, 2 Sep 2008 22:16:13 +0000 (22:16 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 2 Sep 2008 22:16:13 +0000 (22:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55673 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/Inliner.cpp
test/Transforms/Inline/2008-09-02-AlwaysInline.ll [new file with mode: 0644]
test/Transforms/Inline/2008-09-02-NoInline.ll [new file with mode: 0644]

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 {
diff --git a/test/Transforms/Inline/2008-09-02-AlwaysInline.ll b/test/Transforms/Inline/2008-09-02-AlwaysInline.ll
new file mode 100644 (file)
index 0000000..188d4c9
--- /dev/null
@@ -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 (file)
index 0000000..1d37b08
--- /dev/null
@@ -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
+}