[llvm-commits] [llvm] r67311 - in /llvm/trunk: include/llvm/Transforms/IPO/InlinerPass.h lib/Analysis/IPA/CallGraph.cpp lib/Transforms/IPO/Inliner.cpp lib/Transforms/IPO/PruneEH.cpp

Evan Cheng echeng at apple.com
Thu Mar 19 11:49:19 PDT 2009


Ah. Very good catch. Does this fix the compile time issue you saw?  
Should this use SmallPtrSet instead of std::set?

Thanks,

Evan

On Mar 19, 2009, at 11:03 AM, Dale Johannesen wrote:

> Author: johannes
> Date: Thu Mar 19 13:03:56 2009
> New Revision: 67311
>
> URL: http://llvm.org/viewvc/llvm-project?rev=67311&view=rev
> Log:
> Clear the cached cost when removing a function in
> the inliner; prevents nondeterministic behavior
> when the same address is reallocated.
> Don't build call graph nodes for debug intrinsic calls;
> they're useless, and there were typically a lot of them.
>
>
> Modified:
>    llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h
>    llvm/trunk/lib/Analysis/IPA/CallGraph.cpp
>    llvm/trunk/lib/Transforms/IPO/Inliner.cpp
>    llvm/trunk/lib/Transforms/IPO/PruneEH.cpp
>
> Modified: llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h?rev=67311&r1=67310&r2=67311&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h (original)
> +++ llvm/trunk/include/llvm/Transforms/IPO/InlinerPass.h Thu Mar 19  
> 13:03:56 2009
> @@ -19,6 +19,9 @@
>
> #include "llvm/CallGraphSCCPass.h"
> #include "llvm/Transforms/Utils/InlineCost.h"
> +#include "llvm/Target/TargetData.h"
> +#include <set>
> +
>
> namespace llvm {
>   class CallSite;
> @@ -43,6 +46,10 @@
>   // processing to avoid breaking the SCC traversal.
>   virtual bool doFinalization(CallGraph &CG);
>
> +  // InlineCallIfPossible
> +  bool InlineCallIfPossible(CallSite CS, CallGraph &CG,
> +                            const std::set<Function*> &SCCFunctions,
> +                            const TargetData &TD);
>
>   /// This method returns the value specified by the -inline- 
> threshold value,
>   /// specified on the command line.  This is typically not directly  
> needed.
>
> Modified: llvm/trunk/lib/Analysis/IPA/CallGraph.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/CallGraph.cpp?rev=67311&r1=67310&r2=67311&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Analysis/IPA/CallGraph.cpp (original)
> +++ llvm/trunk/lib/Analysis/IPA/CallGraph.cpp Thu Mar 19 13:03:56 2009
> @@ -15,6 +15,7 @@
> #include "llvm/Analysis/CallGraph.h"
> #include "llvm/Module.h"
> #include "llvm/Instructions.h"
> +#include "llvm/IntrinsicInst.h"
> #include "llvm/Support/CallSite.h"
> #include "llvm/Support/Compiler.h"
> #include "llvm/Support/Streams.h"
> @@ -143,7 +144,7 @@
>       for (BasicBlock::iterator II = BB->begin(), IE = BB->end();
>            II != IE; ++II) {
>         CallSite CS = CallSite::get(II);
> -        if (CS.getInstruction()) {
> +        if (CS.getInstruction() && !isa<DbgInfoIntrinsic>(II)) {
>           const Function *Callee = CS.getCalledFunction();
>           if (Callee)
>             Node->addCalledFunction(CS, getOrInsertFunction(Callee));
>
> Modified: llvm/trunk/lib/Transforms/IPO/Inliner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/Inliner.cpp?rev=67311&r1=67310&r2=67311&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Transforms/IPO/Inliner.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/Inliner.cpp Thu Mar 19 13:03:56 2009
> @@ -16,6 +16,7 @@
> #define DEBUG_TYPE "inline"
> #include "llvm/Module.h"
> #include "llvm/Instructions.h"
> +#include "llvm/IntrinsicInst.h"
> #include "llvm/Analysis/CallGraph.h"
> #include "llvm/Support/CallSite.h"
> #include "llvm/Target/TargetData.h"
> @@ -50,7 +51,7 @@
>
> // InlineCallIfPossible - If it is possible to inline the specified  
> call site,
> // do so and update the CallGraph for this operation.
> -static bool InlineCallIfPossible(CallSite CS, CallGraph &CG,
> +bool Inliner::InlineCallIfPossible(CallSite CS, CallGraph &CG,
>                                  const std::set<Function*>  
> &SCCFunctions,
>                                  const TargetData &TD) {
>   Function *Callee = CS.getCalledFunction();
> @@ -76,6 +77,8 @@
>     // Remove any call graph edges from the callee to its callees.
>     CalleeNode->removeAllCalledFunctions();
>
> +    resetCachedCostInfo(CalleeNode->getFunction());
> +
>     // Removing the node for callee from the call graph and delete it.
>     delete CG.removeFunctionFromModule(CalleeNode);
>     ++NumDeleted;
> @@ -123,6 +126,7 @@
>
> bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
>   CallGraph &CG = getAnalysis<CallGraph>();
> +  TargetData &TD = getAnalysis<TargetData>();
>
>   std::set<Function*> SCCFunctions;
>   DOUT << "Inliner visiting SCC:";
> @@ -142,7 +146,8 @@
>       for (Function::iterator BB = F->begin(), E = F->end(); BB !=  
> E; ++BB)
>         for (BasicBlock::iterator I = BB->begin(); I != BB->end(); + 
> +I) {
>           CallSite CS = CallSite::get(I);
> -          if (CS.getInstruction() && (!CS.getCalledFunction() ||
> +          if (CS.getInstruction() && !isa<DbgInfoIntrinsic>(I) &&
> +                                     (!CS.getCalledFunction() ||
>                                       !CS.getCalledFunction()- 
> >isDeclaration()))
>             CallSites.push_back(CS);
>         }
> @@ -186,11 +191,10 @@
>         if (shouldInline(CS)) {
>           Function *Caller = CS.getCaller();
>           // Attempt to inline the function...
> -          if (InlineCallIfPossible(CS, CG, SCCFunctions,
> -                                   getAnalysis<TargetData>())) {
> -            // Remove any cached cost info for this caller, as  
> inlining the callee
> -            // has increased the size of the caller (which may be  
> the same as the
> -            // callee).
> +          if (InlineCallIfPossible(CS, CG, SCCFunctions, TD)) {
> +            // Remove any cached cost info for this caller, as  
> inlining the
> +            // callee has increased the size of the caller (which  
> may be the
> +            // same as the callee).
>             resetCachedCostInfo(Caller);
>
>             // Remove this call site from the list.  If possible, use
> @@ -263,6 +267,7 @@
>   bool Changed = false;
>   for (std::set<CallGraphNode*>::iterator I =  
> FunctionsToRemove.begin(),
>          E = FunctionsToRemove.end(); I != E; ++I) {
> +    resetCachedCostInfo((*I)->getFunction());
>     delete CG.removeFunctionFromModule(*I);
>     ++NumDeleted;
>     Changed = true;
>
> Modified: llvm/trunk/lib/Transforms/IPO/PruneEH.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PruneEH.cpp?rev=67311&r1=67310&r2=67311&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Transforms/IPO/PruneEH.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/PruneEH.cpp Thu Mar 19 13:03:56 2009
> @@ -20,6 +20,7 @@
> #include "llvm/Constants.h"
> #include "llvm/Function.h"
> #include "llvm/Instructions.h"
> +#include "llvm/IntrinsicInst.h"
> #include "llvm/Analysis/CallGraph.h"
> #include "llvm/ADT/SmallPtrSet.h"
> #include "llvm/ADT/SmallVector.h"
> @@ -235,9 +236,10 @@
>   CallGraphNode *CGN = CG[BB->getParent()];
>   for (BasicBlock::iterator I = BB->end(), E = BB->begin(); I !=  
> E; ) {
>     --I;
> -    if (CallInst *CI = dyn_cast<CallInst>(I))
> -      CGN->removeCallEdgeFor(CI);
> -    else if (InvokeInst *II = dyn_cast<InvokeInst>(I))
> +    if (CallInst *CI = dyn_cast<CallInst>(I)) {
> +      if (!isa<DbgInfoIntrinsic>(I))
> +        CGN->removeCallEdgeFor(CI);
> +    } else if (InvokeInst *II = dyn_cast<InvokeInst>(I))
>       CGN->removeCallEdgeFor(II);
>     if (!I->use_empty())
>       I->replaceAllUsesWith(UndefValue::get(I->getType()));
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list