[LLVMdev] PassManager again...
Andreas Neustifter
astifter-llvm at gmx.at
Tue Nov 17 09:03:27 PST 2009
Hi,
I have trouble making my ProfileInfo-Analysis available in the backend, I have changed llc so it loads the ProfileInfo if requested, the PassManger gives this output:
> 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 Information
> Loop Pass Manager
> Canonicalize natural loops
> Scalar Evolution Analysis
> Loop Pass Manager
> Induction Variable Users
> Canonicalize natural loops
> Induction Variable Users
> Loop Strength Reduction
> Dominance Frontier Construction
> Exception handling preparation
> Lower Garbage Collection Instructions
> Remove unreachable blocks from the CFG
> Optimize for code generation
> Insert stack protectors
> Machine Function Analysis
> X86 DAG->DAG Instruction Selection
> X86 FP_REG_KILL inserter
...
Okay, so the ProfileInfoLoader is working, but when I examine the executions more closely I see that the ProfileInfo generated by the ProfileInfoLoader is immediately discarded, when the SelectionDAGISel kicks in the "No Profile Info"-Implementation is used:
> 0x1c1a740 Executing Pass 'Profiling information loader' on Module 'main.c-O0.ll.bc'...
> -*- 'Profiling information loader' is the last user of following pass instances. Free these instances
> 0x1c1a740 Freeing Pass 'Profiling information loader' on Module 'main.c-O0.ll.bc'...
> 0x1c1a740 Executing Pass 'Function Pass Manager' on Module 'main.c-O0.ll.bc'...
> 0x1c301a0 Executing Pass 'Preliminary module verification' on Function 'main'...
> 0x1c301a0 Executing Pass 'Dominator Tree Construction' on Function 'main'...
> 0x1c301a0 Executing Pass 'Module Verifier' on Function 'main'...
> 0x1c1ae50 Required Analyses: Preliminary module verification, Dominator Tree Construction
> -*- 'Module Verifier' is the last user of following pass instances. Free these instances
> 0x1c301a0 Freeing Pass 'Module Verifier' on Function 'main'...
> 0x1c301a0 Freeing Pass 'Preliminary module verification' on Function 'main'...
> 0x1c301a0 Executing Pass 'Natural Loop Information' on Function 'main'...
> 0x1c33000 Required Analyses: Dominator Tree Construction
> 0x1c301a0 Executing Pass 'Loop Pass Manager' on Function 'main'...
> 0x1c33460 Required Analyses: Natural Loop Information
> 0x1c301a0 Executing Pass 'Scalar Evolution Analysis' on Function 'main'...
> 0x1c33cb0 Required Analyses: Natural Loop Information
> 0x1c301a0 Executing Pass 'Loop Pass Manager' on Function 'main'...
> 0x1c359b0 Required Analyses: Natural Loop Information
> -*- 'Loop Pass Manager' is the last user of following pass instances. Free these instances
> 0x1c301a0 Freeing Pass 'Scalar Evolution Analysis' on Function 'main'...
> 0x1c301a0 Freeing Pass 'Natural Loop Information' on Function 'main'...
> 0x1c301a0 Executing Pass 'Dominance Frontier Construction' on Function 'main'...
> 0x1c370b0 Required Analyses: Dominator Tree Construction
> 0x1c301a0 Executing Pass 'Exception handling preparation' on Function 'main'...
> 0x1c36c70 Required Analyses: Dominator Tree Construction, Dominance Frontier Construction
> 0x1c36c70 Preserved Analyses: Dominator Tree Construction, Dominance Frontier Construction, Load profile information from llvmprof.out
> -*- 'Exception handling preparation' is the last user of following pass instances. Free these instances
> 0x1c301a0 Freeing Pass 'Exception handling preparation' on Function 'main'...
> 0x1c301a0 Freeing Pass 'Dominance Frontier Construction' on Function 'main'...
> 0x1c301a0 Freeing Pass 'Dominator Tree Construction' on Function 'main'...
> 0x1c301a0 Executing Pass 'Lower Garbage Collection Instructions' on Function 'main'...
> 0x1c1cec0 Required Analyses: Create Garbage Collector Module Metadata
> 0x1c1cec0 Preserved Analyses: Load profile information from llvmprof.out
> -*- 'Lower Garbage Collection Instructions' is the last user of following pass instances. Free these instances
> 0x1c301a0 Freeing Pass 'Lower Garbage Collection Instructions' on Function 'main'...
> 0x1c301a0 Executing Pass 'Remove unreachable blocks from the CFG' on Function 'main'...
> 0x1c36c00 Preserved Analyses: Load profile information from llvmprof.out
> -*- 'Remove unreachable blocks from the CFG' is the last user of following pass instances. Free these instances
> 0x1c301a0 Freeing Pass 'Remove unreachable blocks from the CFG' on Function 'main'...
> 0x1c301a0 Executing Pass 'Optimize for code generation' on Function 'main'...
> 0x1c38430 Preserved Analyses: Load profile information from llvmprof.out
> -*- 'Optimize for code generation' is the last user of following pass instances. Free these instances
> 0x1c301a0 Freeing Pass 'Optimize for code generation' on Function 'main'...
> 0x1c301a0 Executing Pass 'Insert stack protectors' on Function 'main'...
> 0x1c325a0 Preserved Analyses: Load profile information from llvmprof.out
> -*- 'Insert stack protectors' is the last user of following pass instances. Free these instances
> 0x1c301a0 Freeing Pass 'Insert stack protectors' on Function 'main'...
> 0x1c301a0 Executing Pass 'Machine Function Analysis' on Function 'main'...
> 0x1c301a0 Executing Pass 'X86 DAG->DAG Instruction Selection' on Function 'main'...
> 0x1c390d0 Required Analyses: No Alias Analysis (always returns 'may' alias), Create Garbage Collector Module Metadata, DWARF Information Writer, Load profile information from llvmprof.out, Machine Function Analysis
...
I was under the impression that it is possible to use the results form an Module-wide analysis in the following FunctionPasses, but in this case this is not working.
Also, I have modified all passes that run between the ProfileInfoLoader and the SelectionDAGISel to preserve the ProfileInfo, each pass reports this properly.
What really puzzles me is that the SelectionDAGISel reports the ProfileInfoLoader as required analysis (last line), so why is the PassManager assuming that the ProfileInfoLoader analysis is not used anymore?
I have tried to make the ProfileInfoLoader the default implementation (instead of "No ProfileInfo") but this gives an assertion while creating the passes:
> llc:.../include/llvm/PassSupport.h:111: llvm::Pass* llvm::PassInfo::createPass() const: Assertion `NormalCtor && "Cannot call createPass on PassInfo without default ctor!"' failed.
Can someone enlighten me please?
Andi
More information about the llvm-dev
mailing list