A call to a function marked 'noinline' is not an inline candidate. The sole
authorNick Lewycky <nicholas@mxc.ca>
Wed, 21 Dec 2011 06:06:30 +0000 (06:06 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Wed, 21 Dec 2011 06:06:30 +0000 (06:06 +0000)
call site of an intrinsic is also not an inline candidate. While here, make it
more obvious that this code ignores all intrinsics. Noticed by inspection!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147037 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/InlineCost.cpp

index 7f0b0cc3bf1bb32e661c4b1646498e7b7abdb4e7..14bdd40efcfcf1ede843a035e757397876ffbf64 100644 (file)
@@ -63,8 +63,8 @@ void CodeMetrics::analyzeBasicBlock(const BasicBlock *BB,
 
     // Special handling for calls.
     if (isa<CallInst>(II) || isa<InvokeInst>(II)) {
-      if (isa<DbgInfoIntrinsic>(II))
-        continue;  // Debug intrinsics don't count as size.
+      if (isa<IntrinsicInst>(II))
+        continue;  // Intrinsics have no argument setup and can't be inlined.
 
       ImmutableCallSite CS(cast<Instruction>(II));
 
@@ -72,7 +72,7 @@ void CodeMetrics::analyzeBasicBlock(const BasicBlock *BB,
         // If a function is both internal and has a single use, then it is
         // extremely likely to get inlined in the future (it was probably
         // exposed by an interleaved devirtualization pass).
-        if (F->hasInternalLinkage() && F->hasOneUse())
+        if (!CS.isNoInline() && F->hasInternalLinkage() && F->hasOneUse())
           ++NumInlineCandidates;
 
         // If this call is to function itself, then the function is recursive.
@@ -83,7 +83,7 @@ void CodeMetrics::analyzeBasicBlock(const BasicBlock *BB,
           isRecursive = true;
       }
 
-      if (!isa<IntrinsicInst>(II) && !callIsSmall(CS.getCalledFunction())) {
+      if (!callIsSmall(CS.getCalledFunction())) {
         // Each argument to a call takes on average one instruction to set up.
         NumInsts += CS.arg_size();