[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 13:34:31 PDT 2009


On Mar 19, 2009, at 12:01 PM, Dale Johannesen wrote:

>
> On Mar 19, 2009, at 11:49 AMPDT, Evan Cheng wrote:
>
>> Ah. Very good catch. Does this fix the compile time issue you saw?
>
> No, although it seems to helps some.
>
>> Should this use SmallPtrSet instead of std::set?
>
> If I'm reading the doc right, iterating through a SmallPtrSet visits
> elements in nondeterministic order; we don't want that here.

Right. But I don't see SCCFunctions being iterated.

Evan

>
>
>> 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
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> 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