如何使LLVM Opt工具报告每个优化-O1、-O2等成功使用的分析通过



我想知道是否可以让LLVMopt工具详细报告在每个优化级别(如-O1-O2等(中成功使用了哪些优化通道。

例如,这里是文件foo.bc:的原始位代码

define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 1, i32* %2, align 4
store i32 1, i32* %3, align 4
%4 = load i32, i32* %2, align 4
ret i32 %4
}

这是运行opt -O1 foo.bc -o foo.opt.bc后获得的比特码

; Function Attrs: noinline norecurse nounwind readnone uwtable
define dso_local i32 @main() local_unnamed_addr #0 {
ret i32 1
}

如何获取LLVMopt在上述优化中应用的通行证信息?

我尝试使用LLVM 10.0的opt的几个标志,如--pass-remarks-filter--debugify-each--verify-each--lto-pass-remarks-filter等,但都不起作用。

有人知道如何获得此类信息吗?

请参阅-debug-pass系列选项:

opt --help-list-hidden | grep debug-pass -A 5
--debug-pass=<value>                                            - Print PassManager debugging information
=Disabled                                                     -   disable debug output
=Arguments                                                    -   print pass arguments to pass to 'opt'
=Structure                                                    -   print pass structure before run()
=Executions                                                   -   print pass name before it is executed
=Details                                                      -   print pass details when it is executed

示例:

=参数

$ opt -O1 foo.bc -debug-pass=Arguments -o /dev/null
Pass Arguments:  -tti -tbaa -scoped-noalias -assumption-cache-tracker -targetlibinfo -verify -ee-instrument -simplifycfg -domtree -sroa -early-cse -lower-expect
Pass Arguments:  -targetlibinfo -tti -targetpassconfig -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-propagation -attributor -globalopt -domtree -mem2reg -deadargelim -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -domtree -sroa -basicaa -aa -memoryssa -early-cse-memssa -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -libcalls-shrinkwrap -loops -branch-prob -block-freq -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -pgo-memop-opt -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -loop-rotate -memoryssa -licm -loop-unswitch -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -indvars -loop-idiom -loop-deletion -loop-unroll -phi-values -memdep -memcpyopt -sccp -demanded-bits -bdce -basicaa -aa -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -postdomtree -adce -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -barrier -basiccg -rpo-functionattrs -globalopt -globaldce -basiccg -globals-aa -domtree -float2int -lower-constant-intrinsics -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -loop-rotate -loop-accesses -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-distribute -branch-prob -block-freq -scalar-evolution -basicaa -aa -loop-accesses -demanded-bits -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-vectorize -loop-simplify -scalar-evolution -aa -loop-accesses -lazy-branch-prob -lazy-block-freq -loop-load-elim -basicaa -aa -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -loop-unroll -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -memoryssa -loop-simplify -lcssa-verification -lcssa -scalar-evolution -licm -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -transform-warning -alignment-from-assumptions -strip-dead-prototypes -domtree -loops -branch-prob -block-freq -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -block-freq -loop-sink -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instsimplify -div-rem-pairs -simplifycfg -verify -write-bitcode
Pass Arguments:  -domtree
Pass Arguments:  -targetlibinfo -domtree -loops -branch-prob -block-freq
Pass Arguments:  -targetlibinfo -domtree -loops -branch-prob -block-freq

=结构

$ opt -O1 foo.bc -debug-pass=Structure -o /dev/null
Pass Arguments:  -tti -tbaa -scoped-noalias -assumption-cache-tracker -targetlibinfo -verify -ee-instrument -simplifycfg -domtree -sroa -early-cse -lower-expect
Target Transform Information
Type-Based Alias Analysis
Scoped NoAlias Alias Analysis
Assumption Cache Tracker
Target Library Information
FunctionPass Manager
Module Verifier
Instrument function entry/exit with calls to e.g. mcount() (pre inlining)
Simplify the CFG
Dominator Tree Construction
SROA
Early CSE
Lower 'expect' Intrinsics
Pass Arguments:  -targetlibinfo -tti -targetpassconfig -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-propagation -attributor -globalopt -domtree -mem2reg -deadargelim -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -domtree -sroa -basicaa -aa -memoryssa -early-cse-memssa -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -libcalls-shrinkwrap -loops -branch-prob -block-freq -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -pgo-memop-opt -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -loop-rotate -memoryssa -licm -loop-unswitch -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -indvars -loop-idiom -loop-deletion -loop-unroll -phi-values -memdep -memcpyopt -sccp -demanded-bits -bdce -basicaa -aa -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -postdomtree -adce -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -barrier -basiccg -rpo-functionattrs -globalopt -globaldce -basiccg -globals-aa -domtree -float2int -lower-constant-intrinsics -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -loop-rotate -loop-accesses -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-distribute -branch-prob -block-freq -scalar-evolution -basicaa -aa -loop-accesses -demanded-bits -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-vectorize -loop-simplify -scalar-evolution -aa -loop-accesses -lazy-branch-prob -lazy-block-freq -loop-load-elim -basicaa -aa -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -loop-unroll -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -memoryssa -loop-simplify -lcssa-verification -lcssa -scalar-evolution -licm -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -transform-warning -alignment-from-assumptions -strip-dead-prototypes -domtree -loops -branch-prob -block-freq -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -block-freq -loop-sink -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instsimplify -div-rem-pairs -simplifycfg -verify -write-bitcode
Target Library Information
Target Transform Information
Target Pass Configuration
Type-Based Alias Analysis
Scoped NoAlias Alias Analysis
Assumption Cache Tracker
Profile summary info
ModulePass Manager
Force set function attributes
Infer set function attributes
Interprocedural Sparse Conditional Constant Propagation
FunctionPass Manager
Dominator Tree Construction
Called Value Propagation
Deduce and propagate attributes
Global Variable Optimizer
FunctionPass Manager
Dominator Tree Construction
Natural Loop Information
Branch Probability Analysis
Block Frequency Analysis
FunctionPass Manager
Dominator Tree Construction
Promote Memory to Register
Dead Argument Elimination
FunctionPass Manager
Dominator Tree Construction
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Natural Loop Information
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Combine redundant instructions
Simplify the CFG
CallGraph Construction
Globals Alias Analysis
Call Graph SCC Pass Manager
Remove unused exception handling info
Inliner for always_inline functions
Deduce function attributes
FunctionPass Manager
Dominator Tree Construction
SROA
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Memory SSA
Early CSE w/ MemorySSA
Simplify the CFG
Dominator Tree Construction
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Natural Loop Information
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Combine redundant instructions
Conditionally eliminate dead library calls
Natural Loop Information
Branch Probability Analysis
Block Frequency Analysis
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
PGOMemOPSize
Simplify the CFG
Reassociate expressions
Dominator Tree Construction
Natural Loop Information
Canonicalize natural loops
LCSSA Verifier
Loop-Closed SSA Form Pass
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Scalar Evolution Analysis
Loop Pass Manager
Rotate Loops
Memory SSA
Loop Pass Manager
Loop Invariant Code Motion
Unswitch loops
Simplify the CFG
Dominator Tree Construction
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Natural Loop Information
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Combine redundant instructions
Canonicalize natural loops
LCSSA Verifier
Loop-Closed SSA Form Pass
Scalar Evolution Analysis
Loop Pass Manager
Induction Variable Simplification
Recognize loop idioms
Delete dead loops
Unroll loops
Phi Values Analysis
Memory Dependence Analysis
MemCpy Optimization
Sparse Conditional Constant Propagation
Demanded bits analysis
Bit-Tracking Dead Code Elimination
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Combine redundant instructions
Post-Dominator Tree Construction
Aggressive Dead Code Elimination
Simplify the CFG
Dominator Tree Construction
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Natural Loop Information
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Combine redundant instructions
A No-Op Barrier Pass
CallGraph Construction
Deduce function attributes in RPO
Global Variable Optimizer
FunctionPass Manager
Dominator Tree Construction
Natural Loop Information
Branch Probability Analysis
Block Frequency Analysis
Dead Global Elimination
CallGraph Construction
Globals Alias Analysis
FunctionPass Manager
Dominator Tree Construction
Float to int
Lower constant intrinsics
Dominator Tree Construction
Natural Loop Information
Canonicalize natural loops
LCSSA Verifier
Loop-Closed SSA Form Pass
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Scalar Evolution Analysis
Loop Pass Manager
Rotate Loops
Loop Access Analysis
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Loop Distribution
Branch Probability Analysis
Block Frequency Analysis
Scalar Evolution Analysis
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Loop Access Analysis
Demanded bits analysis
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Loop Vectorization
Canonicalize natural loops
Scalar Evolution Analysis
Function Alias Analysis Results
Loop Access Analysis
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Loop Load Elimination
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Combine redundant instructions
Simplify the CFG
Dominator Tree Construction
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Natural Loop Information
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Combine redundant instructions
Canonicalize natural loops
LCSSA Verifier
Loop-Closed SSA Form Pass
Scalar Evolution Analysis
Loop Pass Manager
Unroll loops
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Combine redundant instructions
Memory SSA
Canonicalize natural loops
LCSSA Verifier
Loop-Closed SSA Form Pass
Scalar Evolution Analysis
Loop Pass Manager
Loop Invariant Code Motion
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Warn about non-applied transformations
Alignment from assumptions
Strip Unused Function Prototypes
FunctionPass Manager
Dominator Tree Construction
Natural Loop Information
Branch Probability Analysis
Block Frequency Analysis
Canonicalize natural loops
LCSSA Verifier
Loop-Closed SSA Form Pass
Basic Alias Analysis (stateless AA impl)
Function Alias Analysis Results
Scalar Evolution Analysis
Block Frequency Analysis
Loop Pass Manager
Loop Sink
Lazy Branch Probability Analysis
Lazy Block Frequency Analysis
Optimization Remark Emitter
Remove redundant instructions
Hoist/decompose integer division and remainder
Simplify the CFG
Module Verifier
Bitcode Writer
Pass Arguments:  -domtree
FunctionPass Manager
Dominator Tree Construction
Pass Arguments:  -targetlibinfo -domtree -loops -branch-prob -block-freq
Target Library Information
FunctionPass Manager
Dominator Tree Construction
Natural Loop Information
Branch Probability Analysis
Block Frequency Analysis
Pass Arguments:  -targetlibinfo -domtree -loops -branch-prob -block-freq
Target Library Information
FunctionPass Manager
Dominator Tree Construction
Natural Loop Information
Branch Probability Analysis
Block Frequency Analysis

=执行

$ opt -O1 foo.bc -debug-pass=Executions -o /dev/null
… (includes previous levels)
[2020-07-15 12:09:58.850749079] 0x559a227eda10   Executing Pass 'Force set function attributes' on Module 'foo.bc'...
[2020-07-15 12:09:58.850794318] 0x559a227eda10    Freeing Pass 'Force set function attributes' on Module 'foo.bc'...
[2020-07-15 12:09:58.850834995] 0x559a227eda10   Executing Pass 'Infer set function attributes' on Module 'foo.bc'...
[2020-07-15 12:09:58.850877016] 0x559a227eda10    Freeing Pass 'Infer set function attributes' on Module 'foo.bc'...
[2020-07-15 12:09:58.850917851] 0x559a227eda10   Executing Pass 'Interprocedural Sparse Conditional Constant Propagation' on Module 'foo.bc'...
[2020-07-15 12:09:58.850967874] 0x559a227cb5c0   Executing Pass 'Dominator Tree Construction' on Function 'main'...
[2020-07-15 12:09:58.851024434] 0x559a227cb5c0   Executing Pass 'Dominator Tree Construction' on Function 'f'...
[2020-07-15 12:09:58.851078626] 0x559a227eda10    Freeing Pass 'Interprocedural Sparse Conditional Constant Propagation' on Module 'foo.bc'...
[2020-07-15 12:09:58.851118672] 0x559a227eda10   Executing Pass 'Called Value Propagation' on Module 'foo.bc'...
[2020-07-15 12:09:58.851176380] 0x559a227eda10    Freeing Pass 'Called Value Propagation' on Module 'foo.bc'...
[2020-07-15 12:09:58.851195948] 0x559a227eda10   Executing Pass 'Deduce and propagate attributes' on Module 'foo.bc'...
[2020-07-15 12:09:58.851222525] 0x559a227eda10    Freeing Pass 'Deduce and propagate attributes' on Module 'foo.bc'...
[2020-07-15 12:09:58.851252769] 0x559a227eda10   Executing Pass 'Global Variable Optimizer' on Module 'foo.bc'...
[2020-07-15 12:09:58.851285163] 0x559a227eda10   Made Modification 'Global Variable Optimizer' on Module 'foo.bc'...
[2020-07-15 12:09:58.851306058] 0x559a227eda10    Freeing Pass 'Global Variable Optimizer' on Module 'foo.bc'...
[2020-07-15 12:09:58.851332678] 0x559a227eda10   Executing Pass 'Function Pass Manager' on Module 'foo.bc'...
[2020-07-15 12:09:58.851361051] 0x559a2281c6c0     Executing Pass 'Dominator Tree Construction' on Function 'main'...
[2020-07-15 12:09:58.851390305] 0x559a2281c6c0     Executing Pass 'Promote Memory to Register' on Function 'main'...
[2020-07-15 12:09:58.851419137] 0x559a2281c6c0      Freeing Pass 'Dominator Tree Construction' on Function 'main'...
…

=详细信息

$ opt -O1 foo.bc -debug-pass=Details -o /dev/null
… (includes Structure level)
[2020-07-15 12:12:50.727901681] 0x55963d24ca10   Executing Pass 'Force set function attributes' on Module 'foo.bc'...
-*- 'Force set function attributes' is the last user of following pass instances. Free these instances
[2020-07-15 12:12:50.727919514] 0x55963d24ca10    Freeing Pass 'Force set function attributes' on Module 'foo.bc'...
[2020-07-15 12:12:50.727930575] 0x55963d24ca10   Executing Pass 'Infer set function attributes' on Module 'foo.bc'...
0x55963d229c20     Required Analyses: Target Library Information
-*- 'Infer set function attributes' is the last user of following pass instances. Free these instances
[2020-07-15 12:12:50.727951877] 0x55963d24ca10    Freeing Pass 'Infer set function attributes' on Module 'foo.bc'...
[2020-07-15 12:12:50.727962569] 0x55963d24ca10   Executing Pass 'Interprocedural Sparse Conditional Constant Propagation' on Module 'foo.bc'...
0x55963d229c80     Required Analyses: Assumption Cache Tracker, Dominator Tree Construction, Target Library Information
[2020-07-15 12:12:50.727991878] 0x55963d22aa00   Executing Pass 'Dominator Tree Construction' on Function 'main'...
[2020-07-15 12:12:50.728019459] 0x55963d22aa00   Executing Pass 'Dominator Tree Construction' on Function 'f'...
-*- 'Interprocedural Sparse Conditional Constant Propagation' is the last user of following pass instances. Free these instances
[2020-07-15 12:12:50.728048312] 0x55963d24ca10    Freeing Pass 'Interprocedural Sparse Conditional Constant Propagation' on Module 'foo.bc'...
[2020-07-15 12:12:50.728059628] 0x55963d24ca10   Executing Pass 'Called Value Propagation' on Module 'foo.bc'...
-*- 'Called Value Propagation' is the last user of following pass instances. Free these instances
[2020-07-15 12:12:50.728087385] 0x55963d24ca10    Freeing Pass 'Called Value Propagation' on Module 'foo.bc'...
[2020-07-15 12:12:50.728098125] 0x55963d24ca10   Executing Pass 'Deduce and propagate attributes' on Module 'foo.bc'...
0x55963d22c270     Required Analyses: Target Library Information
-*- 'Deduce and propagate attributes' is the last user of following pass instances. Free these instances
[2020-07-15 12:12:50.728123960] 0x55963d24ca10    Freeing Pass 'Deduce and propagate attributes' on Module 'foo.bc'...
[2020-07-15 12:12:50.728134651] 0x55963d24ca10   Executing Pass 'Global Variable Optimizer' on Module 'foo.bc'...
0x55963d22c2d0     Required Analyses: Target Library Information, Target Transform Information, Dominator Tree Construction, Block Frequency Analysis
[2020-07-15 12:12:50.728178301] 0x55963d24ca10   Made Modification 'Global Variable Optimizer' on Module 'foo.bc'...
-*- 'Global Variable Optimizer' is the last user of following pass instances. Free these instances
[2020-07-15 12:12:50.728193095] 0x55963d24ca10    Freeing Pass 'Global Variable Optimizer' on Module 'foo.bc'...
[2020-07-15 12:12:50.728203671] 0x55963d24ca10   Executing Pass 'Function Pass Manager' on Module 'foo.bc'...
[2020-07-15 12:12:50.728214720] 0x55963d27bb00     Executing Pass 'Dominator Tree Construction' on Function 'main'...
[2020-07-15 12:12:50.728227201] 0x55963d27bb00     Executing Pass 'Promote Memory to Register' on Function 'main'...
0x55963d27b620       Required Analyses: Assumption Cache Tracker, Dominator Tree Construction
…

-time-passes选项提供了这一点(以及每次通过所花费的时间(。

此选项在许多LLVM工具中都可用,但手册中没有列出,因为它是编译器/过程作者的调试工具。

自LLVM-13发布以来,默认情况下会打开新的通行证管理器。

这似乎是建议的选项之一,-debug-pass=<value>不再工作。

还有另一个选项-debug-pass-manager,可用于列出所有正在运行的通行证。

最新更新