Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Optimization Pipeline (159 Phases)

All addresses in this page apply to ptxas v13.0.88 (CUDA 13.0). Other versions will differ.

The ptxas optimizer is a fixed-order pipeline of 159 compilation phases that transform Ori IR from its initial post-lowering form into scheduled, register-allocated SASS machine code. Unlike LLVM's PassManager -- which uses dependency-driven scheduling and analysis preservation -- ptxas runs every phase unconditionally in a predetermined order, relying on per-phase isNoOp() checks to skip inapplicable transformations. This design trades flexibility for predictability: the phase ordering is identical across all compilations, and architecture-specific behavior is injected through 16 "AdvancedPhase" hook points whose vtables are overridden per target.

Each phase is a polymorphic C++ object exactly 16 bytes in size, allocated from a memory pool by a 159-case factory switch. The PhaseManager constructs all 159 phase objects up front during initialization, stores them in a flat array, and iterates the array in a simple dispatch loop. Per-phase timing and memory consumption are optionally tracked for --stat=phase-wise output.

Key Facts

FieldValue
Total phases159 (indices 0--158)
Named phases (static table)139 (indices 0--138)
Dynamic phases (vtable names)20 (indices 139--158)
AdvancedPhase hook points16
Mercury sub-pipeline phases8 (phases 113--114, 117--122)
Phase object size16 bytes: {vtable_ptr, allocator_ptr}
Factory switchsub_C60D30 (3554 bytes, 159 cases)
PhaseManager constructorsub_C62720 (4734 bytes)
Dispatch loopsub_C64F70 (1455 bytes)
Phase name tableoff_22BD0C0 (159 entries, 1272 bytes)
Default ordering tableunk_22BEEA0 (159-entry index array)
Vtable rangeoff_22BD5C8..off_22BEE78 (40-byte stride)
NamedPhases option ID298
Pipeline orchestratorsub_7FB6C0

Phase Object Layout

Every phase is a 16-byte polymorphic object created by the factory:

struct Phase {
    void** vtable;       // +0: pointer to phase-specific vtable in .data.rel.ro
    void*  allocator;    // +8: memory pool used for allocation
};

The vtable provides three virtual methods common to all phases:

OffsetSignaturePurpose
+0execute(Phase*, CompilationContext*)Run the phase on the IR
+8isNoOp(Phase*) -> boolReturn true to skip execution
+16getName(Phase*) -> intReturn index into the phase name table

Additional vtable slots (+24 pool alloc, +32 pool free) are present but belong to the allocator interface, not the phase protocol.

Dispatch Loop

The dispatch loop at sub_C64F70 drives execution:

// sub_C64F70 -- simplified
void dispatch(PhaseManager* pm, int* phase_indices, int count) {
    MemorySnapshot baseline = take_snapshot();

    for (int i = 0; i < count; i++) {
        int idx = phase_indices[i];
        Phase* phase = pm->phase_list[idx];

        const char* name = pm->name_table[phase->getName()];

        if (!phase->isNoOp()) {
            MemorySnapshot before = take_snapshot();
            phase->execute(pm->compilation_unit);

            if (pm->timing_enabled) {
                report_phase_stats(pm, name, &before);
            }
        }
    }

    if (pm->timing_enabled) {
        report_summary(pm, "All Phases Summary", &baseline);
        report_pool_consumption(pm);
    }
}

Timing output format (to stderr when --stat=phase-wise):

  <phase_name>  ::  [Total 42 KB ]   [Freeable 8 KB ]   [Freeable Leaked 0 KB ] (0%)

Complete Phase Table

Group 1 -- Initial Setup (phases 0--13)

Program validation, recipe application, FP16 promotion, control flow analysis, macro instruction creation.

#Phase NameCategory
0OriCheckInitialProgramValidation
1ApplyNvOptRecipesRecipe application
2PromoteFP16Type promotion
3AnalyzeControlFlowCFG analysis
4AdvancedPhaseBeforeConvUnSupHook (no-op default)
5ConvertUnsupportedOpsLegalization
6SetControlFlowOpLastInBBCFG fixup
7AdvancedPhaseAfterConvUnSupHook (no-op default)
8OriCreateMacroInstsMacro expansion
9ReportInitialRepresentationDiagnostics
10EarlyOriSimpleLiveDeadEarly DCE
11ReplaceUniformsWithImmImmediate folding
12OriSanitizeIR validation
13GeneralOptimizeEarlyBundled early opts

Phase 0 validates the initial Ori IR for structural correctness. Phase 1 applies NvOptRecipe transformations (controlled by option 391, which allocates a 440-byte sub-manager at PhaseManager+56). Phase 2 promotes FP16 operations where profitable. Phases 4 and 7 are architecture hooks that bracket ConvertUnsupportedOps -- backends override them to inject target-specific pre/post-legalization logic.

Group 2 -- Early Optimization (phases 14--32)

Branch optimization, loop canonicalization, strength reduction, software pipelining, SSA formation.

#Phase NameCategory
14DoSwitchOptFirstSwitch optimization
15OriBranchOptBranch optimization
16OriPerformLiveDeadFirstLiveness / DCE
17OptimizeBindlessHeaderLoadsTexture header opt
18OriLoopSimplificationLoop canonicalization
19OriSplitLiveRangesLive range splitting
20PerformPGOProfile-guided opt
21OriStrengthReduceStrength reduction
22OriLoopUnrollingLoop unrolling
23GenerateMovPhiSSA phi insertion
24OriPipeliningSoftware pipelining
25StageAndFenceMemory fence insertion
26OriRemoveRedundantBarriersBarrier elimination
27AnalyzeUniformsForSpeculationUniform analysis
28SinkRematSink + rematerialization
29GeneralOptimizeBundled mid opts
30DoSwitchOptSecondSwitch optimization (2nd)
31OriLinearReplacementLinear scan replacement
32CompactLocalMemoryLocal memory compaction

The GeneralOptimize* phases (13, 29, 37, 46, 58, 65) are compound passes that bundle multiple small optimizations (copy propagation, constant folding, algebraic simplification) into a single fixed-point iteration. They appear at multiple pipeline positions to re-clean the IR after major transformations. Liveness/DCE also runs repeatedly (OriPerformLiveDead at phases 16, 33, 61, 84) to remove dead code exposed by intervening passes.

Group 3 -- Mid-Level Optimization (phases 33--52)

GVN-CSE, reassociation, shader constant extraction, CTA expansion, argument enforcement.

#Phase NameCategory
33OriPerformLiveDeadSecondLiveness / DCE (2nd)
34ExtractShaderConstsFirstShader constant extraction
35OriHoistInvariantsEarlyLICM (early)
36EmitPSIPSI emission
37GeneralOptimizeMidBundled mid opts
38OptimizeNestedCondBranchesNested branch opt
39ConvertVTGReadWriteVTG read/write conversion
40DoVirtualCTAExpansionVirtual CTA expansion
41MarkAdditionalColdBlocksCold block marking
42ExpandMbarrierMbarrier expansion
43ForwardProgressForward progress guarantee
44OptimizeUniformAtomicUniform atomic opt
45MidExpansionMid-level legalization
46GeneralOptimizeMid2Bundled mid opts (2nd)
47AdvancedPhaseEarlyEnforceArgsHook (no-op default)
48EnforceArgumentRestrictionsABI enforcement
49GvnCseGVN + CSE
50OriReassociateAndCommonReassociation + commoning
51ExtractShaderConstsFinalShader constants (final)
52OriReplaceEquivMultiDefMovRedundant move elimination

Shader constant extraction (phases 34, 51) identifies uniform values that can be loaded from constant memory rather than recomputed per-thread. GvnCse (phase 49) combines global value numbering with common subexpression elimination in a single pass. The MidExpansion (phase 45) performs target-dependent lowering of operations that must be expanded before register allocation but after high-level optimizations have had their chance.

Group 4 -- Late Optimization (phases 53--77)

Predication, rematerialization, loop fusion, varying propagation, sync optimization, phi destruction, uniform register conversion.

#Phase NameCategory
53OriPropagateVaryingFirstVarying propagation
54OriDoRematEarlyEarly rematerialization
55LateExpansionLate legalization
56SpeculativeHoistComInstsSpeculative hoisting
57RemoveASTToDefaultValuesAST cleanup
58GeneralOptimizeLateBundled late opts
59OriLoopFusionLoop fusion
60DoVTGMultiViewExpansionMulti-view expansion
61OriPerformLiveDeadThirdLiveness / DCE (3rd)
62OriRemoveRedundantMultiDefMovDead move elimination
63OriDoPredicationIf-conversion
64LateOriCommoningLate commoning
65GeneralOptimizeLate2Bundled late opts (2nd)
66OriHoistInvariantsLateLICM (late)
67DoKillMovementKill movement
68DoTexMovementTexture movement
69OriDoRematRematerialization
70OriPropagateVaryingSecondVarying propagation (2nd)
71OptimizeSyncInstructionsSync optimization
72LateExpandSyncInstructionsLate sync expansion
73ConvertAllMovPhiToMovPhi destruction
74ConvertToUniformRegUniform reg conversion
75LateArchOptimizeFirstArch-specific late opt
76UpdateAfterOptimizeIR update pass
77AdvancedPhaseLateConvUnSupHook (no-op default)

Predication (phase 63) converts short conditional branches into predicated instruction sequences, eliminating branch divergence. Rematerialization runs twice (phases 54 and 69) -- the early pass targets values that are cheap to recompute, while the late pass handles cases exposed by predication and loop fusion. Phase 73 (ConvertAllMovPhiToMov) destroys SSA form by converting phi nodes into move instructions, preparing the IR for register allocation. Phase 74 converts qualifying values to uniform registers (UR), reducing general register pressure.

Group 5 -- Legalization (phases 78--96)

Late unsupported-op expansion, backward copy propagation, GMMA fixup, register attribute setting, final inspection.

#Phase NameCategory
78LateExpansionUnsupportedOpsLate unsupported ops
79OriHoistInvariantsLate2LICM (late 2nd)
80ExpandJmxComputationJMX expansion
81LateArchOptimizeSecondArch-specific late opt (2nd)
82AdvancedPhaseBackPropVRegHook (no-op default)
83OriBackCopyPropagateBackward copy propagation
84OriPerformLiveDeadFourthLiveness / DCE (4th)
85OriPropagateGmmaGMMA propagation
86InsertPseudoUseDefForConvURUR pseudo use/def
87FixupGmmaSequenceGMMA sequence fixup
88OriHoistInvariantsLate3LICM (late 3rd)
89AdvancedPhaseSetRegAttrHook (no-op default)
90OriSetRegisterAttrRegister attribute setting
91OriCalcDependantTexTexture dependency calc
92AdvancedPhaseAfterSetRegAttrHook (no-op default)
93LateExpansionUnsupportedOps2Late unsupported ops (2nd)
94FinalInspectionPassFinal IR validation
95SetAfterLegalizationPost-legalization marker
96ReportBeforeSchedulingDiagnostics

GMMA (phases 85, 87) handles WGMMA (warp group matrix multiply-accumulate) instruction sequences that require specific register arrangements and ordering constraints. OriSetRegisterAttr (phase 90) annotates registers with scheduling attributes (latency class, bank assignment) consumed by the downstream scheduler. FinalInspectionPass (phase 94) is a validation gate that catches illegal IR patterns before the irreversible scheduling/RA phases.

Group 6 -- Pre-Scheduling and Register Allocation (phases 97--103)

Synchronization insertion, WAR fixup, register allocation, 64-bit register handling.

#Phase NameCategory
97AdvancedPhasePreSchedHook (no-op default)
98BackPropagateVEC2DVector back-propagation
99OriDoSyncronizationSynchronization insertion
100ApplyPostSyncronizationWarsPost-sync WAR fixup
101AdvancedPhaseAllocRegHook (no-op default)
102ReportAfterRegisterAllocationDiagnostics
103Get64bRegComponents64-bit register splitting

Phase 99 inserts the synchronization instructions (BAR, DEPBAR, MEMBAR) required by the GPU memory model. Phase 100 fixes write-after-read hazards exposed by sync insertion. Register allocation is driven through the hook at phase 101 -- the actual allocator is architecture-specific and invoked from the AdvancedPhase override. Phase 103 splits 64-bit register pairs into their 32-bit components for architectures that require it.

Group 7 -- Post-RA and Post-Scheduling (phases 104--116)

Post-expansion, NOP removal, hot/cold optimization, block placement, scoreboards.

#Phase NameCategory
104AdvancedPhasePostExpansionHook (no-op default)
105ApplyPostRegAllocWarsPost-RA WAR fixup
106AdvancedPhasePostSchedHook (no-op default)
107OriRemoveNopCodeNOP removal
108OptimizeHotColdInLoopHot/cold in loops
109OptimizeHotColdFlowHot/cold flow opt
110PostSchedulePost-scheduling
111AdvancedPhasePostFixUpHook (no-op default)
112PlaceBlocksInSourceOrderBlock layout
113PostFixForMercTargetsMercury target fixup
114FixUpTexDepBarAndSyncTexture barrier fixup
115AdvancedScoreboardsAndOpexesScoreboard generation
116ProcessO0WaitsAndSBsO0 wait/scoreboard

Hot/cold partitioning (phases 108--109) separates frequently executed blocks from cold paths, improving instruction cache locality. PlaceBlocksInSourceOrder (phase 112) determines the final layout of basic blocks in the emitted binary. The scoreboard sub-system has two paths: at -O1 and above, AdvancedScoreboardsAndOpexes (phase 115) performs full dependency analysis to compute the 23-bit control word per instruction (4-bit stall count, 1-bit yield, 3-bit write barrier, 6-bit read barrier mask, 6-bit wait barrier mask, plus reuse flags). At -O0, phase 115 is a no-op and ProcessO0WaitsAndSBs (phase 116) inserts conservative waits.

Group 8 -- Mercury Backend (phases 117--122)

SASS instruction encoding, expansion, WAR generation, opex computation, microcode emission.

#Phase NameCategory
117MercEncodeAndDecodeMercury encode/decode
118MercExpandInstructionsInstruction expansion
119MercGenerateWARs1WAR generation (1st pass)
120MercGenerateOpexOpex generation
121MercGenerateWARs2WAR generation (2nd pass)
122MercGenerateSassUCodeSASS microcode generation

"Mercury" is NVIDIA's internal name for the SASS encoding framework. Phase 117 converts Ori instructions into Mercury's intermediate encoding, then decodes them back to verify round-trip correctness. Phase 118 expands pseudo-instructions into their final SASS sequences. WAR generation runs in two passes (119, 121) because expansion in phase 118 can introduce new write-after-read hazards. Phase 120 generates "opex" (operation extension) annotations. Phase 122 produces the final SASS microcode bytes. The MercConverter infrastructure (sub_9F1A90, 35KB) drives the instruction-level legalization using a visitor pattern dispatched through a large opcode switch (sub_9ED2D0, 25KB).

Group 9 -- Post-Mercury (phases 123--131)

Register map, diagnostics, debug output.

#Phase NameCategory
123ComputeVCallRegUseVirtual call reg use
124CalcRegisterMapRegister map computation
125UpdateAfterPostRegAllocPost-RA update
126ReportFinalMemoryUsageDiagnostics
127AdvancedPhaseOriPhaseEncodingHook (no-op default)
128UpdateAfterFormatCodeListCode list formatting
129DumpNVuCodeTextSASS text dump
130DumpNVuCodeHexSASS hex dump
131DebuggerBreakDebugger breakpoint

CalcRegisterMap (phase 124) computes the final physical-to-logical register mapping emitted as EIATTR metadata in the output ELF. DumpNVuCodeText and DumpNVuCodeHex (phases 129--130) produce the human-readable SASS text and raw hex dumps used by cuobjdump and debugging workflows. DebuggerBreak (phase 131) is a development-only hook that triggers a breakpoint when a specific phase is reached.

Group 10 -- Finalization (phases 132--158)

Late merge operations, late unsupported-op expansion, high-pressure live range splitting, architecture-specific fixups.

#Phase NameCategory
132UpdateAfterConvertUnsupportedOpsPost-conversion update
133MergeEquivalentConditionalFlowConditional flow merge
134AdvancedPhaseAfterMidExpansionHook (no-op default)
135AdvancedPhaseLateExpandSyncInstructionsHook (no-op default)
136LateMergeEquivalentConditionalFlowLate conditional merge
137LateExpansionUnsupportedOpsMidLate unsupported mid
138OriSplitHighPressureLiveRangesHigh-pressure splitting
139--158(architecture-specific)Arch-specific fixups

Phases 132--138 handle late-breaking transformations that must run after the Mercury backend but before finalization. OriSplitHighPressureLiveRanges (phase 138) is a last-resort live range splitter that fires when register pressure exceeds hardware limits after the main allocation pass.

Phases 139--158 are 20 additional slots whose names are not in the static name table but are returned by their vtable getString() methods. These are architecture-specific phases registered in the factory switch (vtable addresses off_22BEB08..off_22BEE78) that target particular SM generations or compilation modes. They provide extensibility for new architectures without modifying the fixed 139-phase base table.

Optimization Level Gating

AdvancedPhase Hook Points

Sixteen phases serve as conditional extension points. Their isNoOp() method returns true by default, causing the dispatch loop to skip them. Architecture backends and optimization-level configurations override the vtable to activate these hooks:

PhaseNameGate Location
4AdvancedPhaseBeforeConvUnSupBefore unsupported-op conversion
7AdvancedPhaseAfterConvUnSupAfter unsupported-op conversion
47AdvancedPhaseEarlyEnforceArgsBefore argument enforcement
77AdvancedPhaseLateConvUnSupLate unsupported-op boundary
82AdvancedPhaseBackPropVRegBefore backward copy prop
89AdvancedPhaseSetRegAttrBefore register attr setting
92AdvancedPhaseAfterSetRegAttrAfter register attr setting
97AdvancedPhasePreSchedBefore scheduling
101AdvancedPhaseAllocRegRegister allocation driver
104AdvancedPhasePostExpansionAfter post-RA expansion
106AdvancedPhasePostSchedAfter post-scheduling
111AdvancedPhasePostFixUpAfter post-fixup
115AdvancedScoreboardsAndOpexesFull scoreboard analysis
127AdvancedPhaseOriPhaseEncodingPhase encoding hook
134AdvancedPhaseAfterMidExpansionAfter mid-expansion
135AdvancedPhaseLateExpandSyncInstructionsLate sync expansion

The pattern is consistent: AdvancedPhase hooks bracket major pipeline stages, allowing backends to insert target-specific transformations without altering the fixed phase ordering. Phase 101 (AdvancedPhaseAllocReg) is notable because register allocation itself is entirely driven through this hook -- the base pipeline has no hardcoded allocator.

O0 vs O1+ Behavior

At -O0, the pipeline skips most optimization phases via their individual isNoOp() checks. The critical difference is in scoreboard generation:

  • -O1 and above: Phase 115 (AdvancedScoreboardsAndOpexes) runs the full dependency analysis using sub_A36360 (52KB control word encoder) and sub_A23CF0 (54KB DAG list scheduler heuristic). Phase 116 is a no-op.
  • -O0: Phase 115 is a no-op. Phase 116 (ProcessO0WaitsAndSBs) inserts conservative stall counts and wait barriers -- every instruction gets the maximum stall, and barriers are placed at every potential hazard point. This produces correct but slow code.

Individual phases also check the optimization level internally via the compilation context. The scheduling infrastructure (sub_8D0640) reads the opt-level via sub_7DDB50 and selects between forward-pass scheduling (opt-level <= 2, register-pressure-reducing) and reverse-pass scheduling (opt-level > 2, latency-hiding).

NamedPhases Override (Option 298)

The NamedPhases mechanism allows complete replacement of the default 159-phase pipeline with a user-specified phase sequence, primarily used for debugging and performance investigation.

Activation

The pipeline orchestrator (sub_7FB6C0) checks option ID 298 via a vtable call at compilation context offset +72. When set, the orchestrator bypasses the default pipeline and delegates to sub_9F63D0 (NamedPhases entry point):

// sub_7FB6C0 -- simplified
void orchestrate(CompilationUnit* cu) {
    if (cu->config->getOption(298)) {
        // NamedPhases mode -- user-specified phase sequence
        NamedPhases_run(cu);              // sub_9F63D0
    } else {
        // Default mode -- fixed 159-phase pipeline
        PhaseManager* pm = PhaseManager_new(cu);  // sub_C62720
        int* ordering = get_default_ordering();    // sub_C60D20
        dispatch(pm, ordering, 159);               // sub_C64F70
        PhaseManager_destroy(pm);                  // sub_C61B20
    }
    // ... cleanup 17 data structures, refcounted objects ...
}

Configuration String Format

Option 298 is set via a knob string (environment variable or command-line). The string is stored at compilation context offset 21464 with a type indicator at offset 21456. The parser (sub_798B60, NamedPhases::ParsePhaseList) tokenizes the comma-delimited string:

"phase_name1,phase_name2=param,shuffle,swap1,..."

Maximum 256 entries. The parser populates three parallel arrays:

  • Phase name strings
  • Parameter value strings (parsed via strtol)
  • Full name=value pairs

Phase List Builder

The core builder (sub_9F4040, 49KB) processes the parsed configuration:

  1. Allocates a 0x2728-byte stack frame with 256-entry string tables
  2. Initializes a 158-entry phase descriptor table (zeroed 0x400 bytes)
  3. Resolves phase names to indices via sub_C641D0 (case-insensitive binary search)
  4. Recognized manipulation keywords:
    • shuffle -- randomize the phase ordering
    • swap1..swap6 -- swap specific phase pairs (for A/B testing)
    • OriPerformLiveDead -- override liveness pass placement
    • OriCopyProp -- override copy propagation placement
  5. Constructs the final phase index sequence and dispatches via sub_C64F70

Pass-Disable Integration

Individual passes can be disabled without reordering the pipeline. The check function sub_799250 (IsPassDisabled, 68 bytes) performs a case-insensitive substring match against the PTXAS_DISABLED_PASSES string at context offset 13328:

// sub_799250 -- simplified
bool is_pass_disabled(Context* ctx, const char* pass_name) {
    if (ctx->pass_disable_flag == 0) return false;  // offset 13320
    if (ctx->pass_disable_flag == 5) {
        return strcasestr(ctx->pass_disable_string, pass_name);  // offset 13328
    }
    return false;
}

This check is called from 16+ sites across the codebase, guarding passes like LoopMakeSingleEntry and SinkCodeIntoBlock. A more thorough variant (sub_7992A0, IsPassDisabledFull) uses FNV-1a hashing for function-specific override tables.

PhaseManager Data Structures

PhaseManager Object (~112 bytes)

Offset  Type       Field
------  ----       -----
+0      int64      compilation_unit pointer
+8      int64*     allocator
+16     void*      sorted_name_table (for binary search)
+24     int32      sorted_name_count
+28     int32      sorted_name_capacity
+32     int64*     allocator_copy
+40     void*      phase_list (array of 16-byte Phase entries)
+48     int32      phase_list_count
+52     int32      phase_list_capacity
+56     int64      nvopt_recipe_ptr (NvOptRecipe sub-manager, or NULL)
+64     int64      (reserved)
+72     bool       timing_enabled (from options[17928])
+76     int32      (flags)
+80     bool       flag_byte
+88     int64*     timing_allocator
+96     void*      phase_name_raw_table
+104    int32      phase_name_raw_count
+108    int32      phase_name_raw_capacity

Timing Record (32 bytes)

Offset  Type       Field
------  ----       -----
+0      int32      phase_index (-1 = sentinel)
+8      int64      phase_name_or_magic (0x2030007 = sentinel)
+16     int64      timing_value
+24     int32      memory_flags

NvOptRecipe Sub-Manager (440 bytes, at PhaseManager+56)

Created when option 391 is set. Contains timing records with 584-byte stride, a hash table for recipe lookup, sorted arrays, and ref-counted shared lists. The sub-manager inherits the phase chain from the previous execution context, enabling recipe-based pipeline modification across compilation units.

Function Map

AddressSizeIdentity
sub_C60D2016 BDefault phase table pointer
sub_C60D303554 BPhase factory (159-case switch)
sub_C60BD0334 BMulti-function phase invoker
sub_C61B201753 BPhaseManager destructor
sub_C62200888 BPool consumption reporter
sub_C62580253 BTiming record array resizer (1.5x growth)
sub_C62640223 BPhase list resizer (1.5x growth)
sub_C627204734 BPhaseManager constructor
sub_C639A01535 BCase-insensitive quicksort (median-of-3)
sub_C63FA0556 BPhase name table sort/rebuild
sub_C641D0305 BPhase name-to-index binary search
sub_C643103168 BPer-phase timing reporter
sub_C64F701455 BPhase dispatch loop
sub_7FB6C01193 BPipeline orchestrator (option 298 gate)
sub_798B601776 BNamedPhases::ParsePhaseList
sub_79925068 BIsPassDisabled (substring check)
sub_7992A0894 BIsPassDisabledFull (FNV-1a hash)
sub_9F40409093 BNamedPhases::parseAndBuild
sub_9F63D0342 BNamedPhases::run
sub_9F1A906310 BMercConverter main pass
sub_9F3340~7 KBMercConverter orchestrator
sub_9ED2D0~25 KBMercConverter opcode dispatch

Diagnostic Strings

StringLocationTrigger
"All Phases Summary"sub_C64F70End of dispatch loop (timing enabled)
"[Pool Consumption = "sub_C62200End of dispatch loop (timing enabled)
" :: "sub_C64310Per-phase timing line
"[Total ", "[Freeable ", "[Freeable Leaked "sub_C64310Memory delta columns
"Before ", "After "sub_C64F70Phase execution markers
"NamedPhases"sub_9F4040NamedPhases config parsing
"shuffle", "swap1".."swap6"sub_9F4040NamedPhases manipulation keywords
"After MercConverter"near sub_9F3340Post-MercConverter diagnostic
"CONVERTING"sub_9EF5E0During MercConverter lowering
"Internal compiler error."sub_9EB990ICE assertion (3 sites)

Cross-References