import .CC:
    _typeinf,
    optimize

function CC._typeinf(analyzer::DispatchAnalyzer, frame::InferenceState)
    concrete_frame = analyzer.concrete_frame
    skip_nonconcrete_calls = !isnothing(concrete_frame)
    if skip_nonconcrete_calls
        analyzer.concrete_frame = isconcretedispatch(frame.linfo.specTypes)
    end

    ret = @invoke _typeinf(analyzer::AbstractAnalyzer, frame::InferenceState)

    if skip_nonconcrete_calls
        analyzer.concrete_frame = concrete_frame::Bool
    end

    return ret
end

function CC.optimize(analyzer::AbstractAnalyzer, opt::OptimizationState, params::OptimizationParams, @nospecialize(result))
    ret = @invoke optimize(analyzer::AbstractInterpreter, opt::OptimizationState, params::OptimizationParams, @nospecialize(result))

    concrete_frame = analyzer.concrete_frame
    if (isnothing(concrete_frame) || concrete_frame::Bool) && analyzer.frame_filter(opt)
        report_pass!(RuntimeDispatchReport, analyzer, opt)
    end

    return ret
end
