[LLVMdev] Loading ProfileInfo in Backend. (Was: [PATCH] & Question: Preserving ProfileInfo for backend.)

Shuguang Feng shuguang.feng at gmail.com
Thu Sep 10 07:44:34 PDT 2009

> What does "llc -debug-pass=Structure" say? Is the ProfileLoaderPass
> really the last pass to touch the ProfileInfo before you are using it?

Below is the sequence of passes that I see.  Although the
NoProfileInfo pass is being run, it should be subsequently overridden
by ProfileInfoLoaderPass (LoaderPass) correct?

Target Data Layout
Create Garbage Collector Module Metadata
Basic Alias Analysis (default AA impl)
DWARF Information Writer
No Profile Information
Module Information
  ModulePass Manager
    Profiling information loader
    FunctionPass Manager
      Preliminary module verification
      Dominator Tree Construction
      Module Verifier
      Natural Loop Construction
      Canonicalize natural loops
      Scalar Evolution Analysis
      Loop Pass Manager
        Loop Strength Reduction
      Lower Garbage Collection Instructions
      Remove unreachable blocks from the CFG
      Optimize for code generation
      Insert stack protectors
      X86 DAG->DAG Instruction Selection
      X86 FP_REG_KILL inserter
      X86 Maximal Stack Alignment Calculator

> Also, does bb.getBasicBlock() for sure always returns a valid block
> refrerence?

Yes. I am printing bb and *bb.getBasicBlock() in order to compare the
contents of the IR in the BasicBlock and the target assembly in the

> You are getting the PI by getAnalysis<ProfileInfo>() I presume? Is this
> really the instance created by ProfileLoaderPass?

Yes, I have "PI = &getAnalysis<ProfileInfo>()" in my code (modeled
after BasicBlockPlacement.cpp).  However, when I run gdb the value of
the Pass* pointer returned by createProfileLoaderPass() does not match
the value of PI (of type ProfileInfo*) that I see inside my
MachineFunctionPass.  The abbreviated output of gdb is found below:

Breakpoint 1, main (argc=11, argv=0xbfffd394) at <path to llvm>/tools/
292	      Pass* tmp = createProfileLoaderPass();
(gdb) p tmp
$1 = (class llvm::Pass *) 0x3573000
(gdb) c

Breakpoint 2, main (argc=11, argv=0xbfffd394) at <path to llvm>/tools/
293	      Passes.add(tmp);
(gdb) p tmp
$2 = (class llvm::Pass *) 0x8feeaf0

So the address of the ProfileLoaderPass should be 0x8feeaf0 correct?
But I see the following inside my own pass:

Breakpoint 3, MyCodeGenPass::runOnMachineFunction (this=0x90be200,
MF=@0x90ca280) at <path to llvm>/lib/Target/X86/MyCodeGenPass.cpp:108
108	                   <random line of code after PI =
&getAnalysis<ProfileInfo>() executes>
(gdb) p PI
$3 = (class llvm::ProfileInfo *) 0x90be438

> (I guess for the last two questions its best to use gdb, are you
> familiar with it?)

I have a working knowledge :) but haven't used any bells and whistles.

Thanks for your help.

More information about the llvm-dev mailing list