【问题标题】:How to make the LLVM Opt tool to report which analysis passes successfully used by each optimization -O1, -O2, etc?如何使 LLVM Opt 工具报告每个优化 -O1、-O2 等成功使用的分析通过?
【发布时间】:2020-11-04 04:00:51
【问题描述】:

我想知道是否可以让 LLVM opt 工具详细报告在每个优化级别(如 -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后得到的bitcode

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

如何获取上述优化中 LLVM opt 应用的 pass 信息?

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

有谁知道如何获取此类信息?

【问题讨论】:

  • -time-passes 选项为您提供了这一点(以及每次通过所花费的时间)。
  • @arnt:感谢您的回答。该选项确实有效。我猜它是内部的,因为opt --help 没有显示它。您想重新发布您的评论作为答案,以便我接受吗?
  • 您是否还知道任何可以报告每个分析过程的效率的选项,例如消除了多少条 IR 指令,或者它如何改变程序?
  • 有一个 -print-after-all 选项可以帮助你一点点。根据它的输出,计算指令数量的变化应该很简单。但我认为代码的效率与 IR 指令总数相差甚远。
  • @orestisf:哇,我不知道这些选项。非常感谢!

标签: optimization llvm llvm-clang llvm-ir bitcode


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    查看-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
    …
    

    【讨论】:

    • 非常感谢您的详细解答!缩进是否还暗示了优化传递如何被调用/执行的层次结构?
    • 我认为是这样,例如'main' 在 'foo.bc' 内
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多