[LLVMdev] BasicCallGraph patch

Chris Lattner sabre at nondot.org
Mon Jul 16 23:42:10 PDT 2007


On Tue, 17 Jul 2007, Zhongxing Xu wrote:
> I am doing inter-procedural static analysis, so I need to do DFS of call
> graph. llvm-gcc sometimes generates this kind of call instruction, which
> cause the call graph to be incomplete.
>
> But thanks for your information, instcombine really solves the problem.

Happy to help.  You'll probably find that other optimizations help as 
well, such as simplifycfg (which deletes dead blocks).  Depending on what 
you are doing, using the LLVM IR can be tricky for this sort of stuff 
because it can get too far from the source level.

-Chris

> On 7/17/07, Chris Lattner <sabre at nondot.org> wrote:
>> 
>>  On Thu, 12 Jul 2007, Zhongxing Xu wrote:
>> >  The current BasicCallGraph will miss call sites like this:
>> >  %tmp86 = call i8* (...)* bitcast (i8* ()* @find_ispell to i8* (...)*)( )
>> >      ; <i8*> [#uses=1]
>> > 
>> >  Here the direct user of @find_ispell is a ConstantExpr.
>> >  I added several lines of code to address this case.
>> >  Below is the output of command: svn diff lib/Analysis/IPA/CallGraph.cpp
>> >  Attached is LLVM asm files with such function calls.
>> 
>>  This is problematic, because it's not checking for the type of constant
>>  expr (i.e. is it a bitcast, etc).  That can easily be fixed, but here's a
>>  basic question: when is this important?  The instcombine pass should fix
>>  up these bitcasts, so they shouldn't occur frequently in practice.  When
>>  have you found this to be important?
>> 
>>  Thanks,
>> 
>>  -Chris
>> 
>> >  Index: lib/Analysis/IPA/CallGraph.cpp
>> >  ===================================================================
>> >  --- lib/Analysis/IPA/CallGraph.cpp      (revision 39771)
>> >  +++ lib/Analysis/IPA/CallGraph.cpp      (working copy)
>> >  @@ -13,6 +13,7 @@
>> 
>> >   //===----------------------------------------------------------------------===//
>> > 
>> > 
>> >  #include "llvm/Analysis/CallGraph.h"
>> >  +#include "llvm/Constants.h"
>> > #  include "llvm/Module.h"
>> > #  include "llvm/Instructions.h"
>> > #  include "llvm/Support/CallSite.h"
>> >  @@ -150,6 +151,19 @@
>> > ->  addCalledFunction(CS, Node);
>> >           else
>> >           isUsedExternally = true;
>> >  +      } else if (ConstantExpr* CE = dyn_cast<ConstantExpr>(*I)) {
>> >  +        for (Value::use_iterator I = CE->use_begin(), E =
>>  CE->use_end();
>> >  +             I != E; ++I)
>> >  +          if (Instruction* Inst = dyn_cast<Instruction>(*I)) {
>> >  +            CallSite CS = CallSite::get(Inst);
>> >  +            if (isOnlyADirectCall(F, CS))
>> >  +              getOrInsertFunction(Inst->getParent()->getParent())
>> >  +                ->addCalledFunction(CS, Node);
>> >  +            else
>> >  +              isUsedExternally = true;
>> >  +          } else {
>> >  +            isUsedExternally = true;
>> >  +          }
>> >         } else if (GlobalValue *GV = dyn_cast<GlobalValue>(*I)) {
>> >           for (Value::use_iterator I = GV->use_begin(), E =
>>  GV->use_end();
>> >                I != E; ++I)
>> > 
>> > 
>> 
>>  -Chris
>> 
>>  --
>> http: //nondot.org/sabre/
>> http: //llvm.org/
>>  _______________________________________________
>>  LLVM Developers mailing list
>>  LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>  http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>> 
>

-Chris

-- 
http://nondot.org/sabre/
http://llvm.org/



More information about the llvm-dev mailing list