Skip to documentation
SLOP

tiny.choir.PassManager

Reference tiny.choir PassManager

Defined in tiny.choir.

API (27)

Actions

Public operations.

Fields and members

Public fields and members.

No direct callersNo direct callstiny.choirPassManager
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/choir/src/passes/pass/manager.zig:771

zig
pub const PassManager = struct {    allocator: std.mem.Allocator,    root: OpPassManager,    stats: PassManagerStats,    instrumentor: ?PassInstrumentor,    verifier_enabled: bool,    verifier_options: ir.verify.VerifyOptions,    last_verifier_failure: ?PassVerifierFailure,    last_failure_reproducer: ?PassFailureReproducer,    pub fn init(allocator: std.mem.Allocator) PassManager {        return .{            .allocator = allocator,            .root = OpPassManager.init(allocator, null),            .stats = .{},            .instrumentor = null,            .verifier_enabled = false,            .verifier_options = ir.verify.default_options,            .last_verifier_failure = null,            .last_failure_reproducer = null,        };    }    pub fn deinit(self: *PassManager) void {        self.clearLastFailureReproducer();        if (self.instrumentor) |*inst| {            inst.deinit();        }        self.root.deinit();    }    pub fn addPass(self: *PassManager, pass: Pass) !void {        try self.root.addPass(pass);    }    pub fn nest(self: *PassManager, op_name: []const u8) !*OpPassManager {        return self.root.nest(op_name);    }    pub fn nestAny(self: *PassManager) !*OpPassManager {        return self.root.nestAny();    }    pub fn resetStats(self: *PassManager) void {        self.stats.reset();    }    pub fn addInstrumentation(self: *PassManager, inst: PassInstrumentation) !void {        if (self.instrumentor == null) {            self.instrumentor = PassInstrumentor.init(self.allocator);        }        try self.instrumentor.?.addInstrumentation(inst);    }    pub fn getInstrumentor(self: *PassManager) ?*const PassInstrumentor {        if (self.instrumentor) |*inst| {            return inst;        }        return null;    }    pub fn enableVerifier(self: *PassManager) void {        self.enableVerifierWithOptions(ir.verify.default_options);    }    pub fn enableVerifierWithOptions(self: *PassManager, options: ir.verify.VerifyOptions) void {        self.verifier_enabled = true;        self.verifier_options = options;        self.last_verifier_failure = null;    }    pub fn disableVerifier(self: *PassManager) void {        self.verifier_enabled = false;        self.last_verifier_failure = null;    }    pub fn verifierEnabled(self: *const PassManager) bool {        return self.verifier_enabled;    }    pub fn getLastVerifierFailure(self: *const PassManager) ?PassVerifierFailure {        return self.last_verifier_failure;    }    pub fn getLastFailureReproducer(self: *const PassManager) ?*const PassFailureReproducer {        if (self.last_failure_reproducer) |*reproducer| return reproducer;        return null;    }    pub fn run(self: *PassManager, op: *ir.Operation, ir_ctx: *ir.Context) PassResult {        return self.runWithOptions(op, ir_ctx, .{});    }    pub fn runWithOptions(        self: *PassManager,        op: *ir.Operation,        ir_ctx: *ir.Context,        options: PassManagerRunOptions,    ) PassResult {        var analysis_cache = AnalysisCache.init(self.allocator, null);        defer analysis_cache.deinit();        return self.runWithAnalysisCache(op, ir_ctx, &analysis_cache, options);    }    pub fn runWithAnalysisCache(        self: *PassManager,        op: *ir.Operation,        ir_ctx: *ir.Context,        analysis_cache: *AnalysisCache,        options: PassManagerRunOptions,    ) PassResult {        if (analysis_cache.accounting) |ledger| {            if (ledger.view().outcome != .running) return .failure;        }        self.clearLastFailureReproducer();        self.last_verifier_failure = null;        if (analysis_cache.accounting) |ledger| {            if (options.max_threads != 1 or options.worker_allocator != null) {                ledger.missingContract();                ledger.fail(.rejected);                self.captureFailureReproducer(op, options, .{                    .kind = .target,                    .target_op_name = op.name.name,                    .target_symbol_name = ir.SymbolTable.getSymbolName(op),                });                return .failure;            }        }        if (self.prepareDependentDialects(ir_ctx) == .failure) {            self.captureFailureReproducer(op, options, null);            return .failure;        }        const previous_stats = analysis_cache.stats;        analysis_cache.stats = &self.stats;        defer analysis_cache.stats = previous_stats;        const inst_ptr: ?*const PassInstrumentor = if (self.instrumentor) |*inst| inst else null;        var verifier_config = self.beginVerifierRun();        const verifier_ptr: ?*PassVerifierConfig = if (verifier_config) |*config| config else null;        const pass_runs_before = self.stats.pass_runs;        defer ir_ctx.recordPassRuns(self.stats.pass_runs - pass_runs_before);        var failure: ?CapturedPassFailure = null;        const result = self.root.runOnOperation(            op,            ir_ctx,            analysis_cache,            &self.stats,            inst_ptr,            verifier_ptr,            &failure,            options,            self.allocator,        );        if (result == .failure) self.captureFailureReproducer(op, options, failure);        return result;    }    pub fn runToFixedPoint(        self: *PassManager,        op: *ir.Operation,        ir_ctx: *ir.Context,        max_iterations: usize,    ) PassManagerFixedPointResult {        return self.runToFixedPointWithOptions(op, ir_ctx, max_iterations, .{});    }    pub fn runToFixedPointWithOptions(        self: *PassManager,        op: *ir.Operation,        ir_ctx: *ir.Context,        max_iterations: usize,        options: PassManagerRunOptions,    ) PassManagerFixedPointResult {        var fixed_point: PassManagerFixedPointResult = .{};        self.clearLastFailureReproducer();        self.last_verifier_failure = null;        if (self.prepareDependentDialects(ir_ctx) == .failure) {            fixed_point.result = .failure;            self.captureFailureReproducer(op, options, null);            return fixed_point;        }        var analysis_cache = AnalysisCache.init(self.allocator, &self.stats);        defer analysis_cache.deinit();        const inst_ptr: ?*const PassInstrumentor = if (self.instrumentor) |*inst| inst else null;        var verifier_config = self.beginVerifierRun();        const verifier_ptr: ?*PassVerifierConfig = if (verifier_config) |*config| config else null;        const pass_runs_before = self.stats.pass_runs;        defer ir_ctx.recordPassRuns(self.stats.pass_runs - pass_runs_before);        for (0..max_iterations) |_| {            const before_modified = self.stats.passes_modified;            fixed_point.iterations += 1;            var failure: ?CapturedPassFailure = null;            const result = self.root.runOnOperation(                op,                ir_ctx,                &analysis_cache,                &self.stats,                inst_ptr,                verifier_ptr,                &failure,                options,                self.allocator,            );            if (result == .failure) {                fixed_point.result = .failure;                self.captureFailureReproducer(op, options, failure);                return fixed_point;            }            const iteration_changed = self.stats.passes_modified != before_modified;            fixed_point.changed = fixed_point.changed or iteration_changed;            if (!iteration_changed) break;        }        return fixed_point;    }    fn clearLastFailureReproducer(self: *PassManager) void {        if (self.last_failure_reproducer) |*reproducer| {            reproducer.deinit(self.allocator);            self.last_failure_reproducer = null;        }    }    fn captureFailureReproducer(        self: *PassManager,        op: *ir.Operation,        options: PassManagerRunOptions,        failure: ?CapturedPassFailure,    ) void {        self.clearLastFailureReproducer();        const pipeline_text = textual_pipeline.formatPassManagerPipelineAlloc(            self.allocator,            self,        ) catch return;        const ir_text = ir.dump.operationAlloc(self.allocator, op) catch {            self.allocator.free(pipeline_text);            return;        };        var reproducer = PassFailureReproducer{            .pipeline = pipeline_text,            .ir = ir_text,            .max_threads = options.max_threads,            .worker_count = if (failure) |captured| captured.worker_count else 1,            .verifier_enabled = self.verifier_enabled,        };        var stored = false;        defer if (!stored) reproducer.deinit(self.allocator);        if (failure) |captured| {            reproducer.failure_kind = captured.kind;            if (captured.pass_name) |name| {                reproducer.pass_name = self.allocator.dupe(u8, name) catch return;            }            reproducer.target_op_name = self.allocator.dupe(                u8,                captured.target_op_name,            ) catch return;            if (captured.target_symbol_name) |name| {                reproducer.target_symbol_name = self.allocator.dupe(u8, name) catch return;            }            reproducer.verifier_error = captured.verifier_error;            if (captured.verifier_error) |err| {                reproducer.verifier_error_name = self.allocator.dupe(                    u8,                    @errorName(err),                ) catch return;            }        }        self.last_failure_reproducer = reproducer;        stored = true;    }    fn beginVerifierRun(self: *PassManager) ?PassVerifierConfig {        if (!self.verifier_enabled) return null;        return .{            .options = self.verifier_options,            .failure = &self.last_verifier_failure,        };    }    fn prepareDependentDialects(self: *PassManager, ir_ctx: *ir.Context) PassResult {        var names: std.ArrayListUnmanaged([]const u8) = .empty;        defer names.deinit(self.allocator);        self.root.collectDependentDialects(self.allocator, &names) catch return .failure;        for (names.items) |name| {            _ = ir_ctx.getOrLoadDialect(name) catch return .failure;        }        return .success;    }};

Source: lib/choir/src/root.zig:57

zig
pub const PassManager = passes.PassManager;
Called byCallsprivate sourcelib.choir.src.passes.pass.testexpectFailedMutationCachetest sourcelib.choir.src.passes.pass.testtest: PassContext reports pass statis...test sourcelib.choir.src.passes.pass.testtest: PassManager skips a fixed-point...test sourcelib.choir.src.passes.pass.testtest: PassManager timing instrumentat...test sourcelib.choir.src.passes.pass.testtest: PassManager with instrumentatio...+2 morepasses.PassInstrumentorinitPassManageraddInstrumentation
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.choir.src.passes.pass.testcheckContextPassFailureprivate sourcelib.choir.src.passes.pass.testexpectFailedMutationCachetest sourcelib.choir.src.passes.pass.testtest: IR context census counts each P...test sourcelib.choir.src.passes.pass.testtest: OpPassManager collects dependen...test sourcelib.choir.src.passes.pass.testtest: PassContext reports pass statis...+25 morepasses.OpPassManageraddPassPassManageraddPass
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.choir.src.passes.pass.testcheckContextPassFailureprivate sourcelib.choir.src.passes.pass.testexpectFailedMutationCachetest sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager propa...test sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager rejec...test sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager runs ...+47 morepasses.OpPassManagerdeinitprivate sourcelib.choir.src.passes.pass.manager.PassManagerclearLastFailureReproducerPassManagerdeinit
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallstest sourcelib.choir.src.passes.pass.test.test_PassManagerrunToFixedPoint stops on verifier fai...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions keeps read-only target...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions merges parallel verifi...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions stresses read-only par...test sourcelib.choir.src.passes.pass.testtest: PassManager verifier stops pipe...PassManagerenableVerifierWithOptionsPassManagerenableVerifier
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsPassManagerenableVerifierPassManagerenableVerifierWithOptions
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.choir.src.passes.pass.testcheckContextPassFailuretest sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions captures parallel pass...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions stresses read-only par...test sourcelib.choir.src.passes.pass.testtest: PassManager captures serial pas...test sourcelib.choir.src.passes.pass.testtest: PassManager verifier stops pipe...+3 morePassManagergetLastFailureReproducer
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.choir.src.passes.pass.test.test_PassManagerrunToFixedPoint stops on verifier fai...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions keeps read-only target...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions merges parallel verifi...test sourcelib.choir.src.passes.pass.testtest: PassManager verifier is opt-intest sourcelib.choir.src.passes.pass.testtest: PassManager verifier stops pipe...PassManagergetLastVerifierFailure
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.choir.src.passes.pass.testcheckContextPassFailureprivate sourcelib.choir.src.passes.pass.testexpectFailedMutationCachetest sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager propa...test sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager rejec...test sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager runs ...+47 morepasses.OpPassManagerinitPassManagerinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager propa...test sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager rejec...test sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager runs ...test sourcelib.choir.src.passes.pass.testtest: Multiple passes in nested manag...test sourcelib.choir.src.passes.pass.testtest: OpPassManager collects dependen...+16 morepasses.OpPassManagernestPassManagernest
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.choir.src.passes.pass.test.test_PassManagernestAny creates op-agnostic nested pi...test sourcelib.choir.src.passes.pass.test.test_PassManagernestAny runs registered isolated targ...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions merges parallel verifi...passes.OpPassManagernestAnyPassManagernestAny
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callerspasses.PassManagerStatsresetPassManagerresetStats
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager propa...test sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager rejec...test sourcelib.choir.src.passes.pass.testtest: Hierarchical pass manager runs ...test sourcelib.choir.src.passes.pass.testtest: IR context census counts each P...test sourcelib.choir.src.passes.pass.testtest: Multiple passes in nested manag...+18 morePassManagerrunWithOptionsPassManagerrun
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.choir.src.passes.pass.testtest: IR context census counts each P...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunToFixedPoint preloads dependent di...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunToFixedPoint reports failuretest sourcelib.choir.src.passes.pass.test.test_PassManagerrunToFixedPoint stops after stable it...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunToFixedPoint stops on verifier fai...PassManagerrunToFixedPointWithOptionsPassManagerrunToFixedPoint
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsPassManagerrunToFixedPointpasses.AnalysisCachedeinitpasses.AnalysisCacheinitpasses.OpPassManagerrunOnOperationprivate sourcelib.choir.src.passes.pass.manager.PassManagerbeginVerifierRunprivate sourcelib.choir.src.passes.pass.manager.PassManagercaptureFailureReproducer+2 morePassManagerrunToFixedPointWithOptions
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsPassManagerrunWithOptionsprivate sourcelib.choir.src.passes.pass.testcheckContextPassFailureprivate sourcelib.choir.src.passes.pass.testexpectFailedMutationCachetest sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithAnalysisCache leaves caller ca...test sourcelib.choir.src.passes.pass.testtest: U0 pass accounting executes rep...+5 morepasses.OpPassManagerrunOnOperationprivate sourcelib.choir.src.passes.pass.manager.PassManagerbeginVerifierRunprivate sourcelib.choir.src.passes.pass.manager.PassManagercaptureFailureReproducerprivate sourcelib.choir.src.passes.pass.manager.PassManagerclearLastFailureReproducerprivate sourcelib.choir.src.passes.pass.manager.PassManagerprepareDependentDialectsPassManagerrunWithAnalysisCache
Static calls · unresolved targets: 0 · external targets: 5.
Called byCallsPassManagerruntest sourcelib.choir.src.passes.pass.testtest: IR context census counts each P...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions blocks context storage...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions captures parallel pass...test sourcelib.choir.src.passes.pass.test.test_PassManagerrunWithOptions clones stateful read-o...+10 morepasses.AnalysisCachedeinitpasses.AnalysisCacheinitPassManagerrunWithAnalysisCachePassManagerrunWithOptions
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.choir.src.passes.pass.testtest: PassManager verifier is opt-intest sourcelib.choir.src.passes.pass.testtest: PassManager verifier stops pipe...PassManagerverifierEnabled
Static calls · unresolved targets: 0 · external targets: 0.

Also reachable as

passes.PassManager, passes.pass.PassManager.

Complete caller list for PassManager.addInstrumentation

7 direct callers.

Complete caller list for PassManager.addPass

30 direct callers.

Complete caller list for PassManager.deinit

52 direct callers.

Complete caller list for PassManager.getLastFailureReproducer

8 direct callers.

Complete caller list for PassManager.init

52 direct callers.

Complete caller list for PassManager.nest

21 direct callers.

Complete caller list for PassManager.run

23 direct callers.

Complete call list for PassManager.runToFixedPointWithOptions

7 direct calls.

Complete caller list for PassManager.runWithAnalysisCache

10 direct callers.

Complete caller list for PassManager.runWithOptions

15 direct callers.

Audit

Definitions20
Public names60
Members8
Version26.7.0
Revisiondaab053ee433