use vyre_foundation::ir::Program;
use super::canonicalize_via_encoded::{gpu_canonicalize, CanonicalizeError};
use super::const_fold_via_encoded::{gpu_const_fold, ConstFoldError};
use super::dce_via_encoded::{gpu_dce, DceError};
use super::dispatcher::OptimizerDispatcher;
use super::pattern_match_via_encoded::{gpu_algebraic_identities, PatternMatchError};
use super::pipeline_resident::{gpu_pipeline_resident, PipelineError};
#[derive(Debug)]
pub enum GpuOptimizeError {
Persistent(PipelineError),
Canonicalize(CanonicalizeError),
ConstFold(ConstFoldError),
PatternMatch(PatternMatchError),
Dce(DceError),
}
impl std::fmt::Display for GpuOptimizeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Persistent(err) => write!(f, "gpu_optimize persistent path: {err}"),
Self::Canonicalize(err) => write!(f, "gpu_optimize canonicalize: {err}"),
Self::ConstFold(err) => write!(f, "gpu_optimize const-fold: {err}"),
Self::PatternMatch(err) => write!(f, "gpu_optimize pattern-match: {err}"),
Self::Dce(err) => write!(f, "gpu_optimize dce: {err}"),
}
}
}
impl std::error::Error for GpuOptimizeError {}
pub fn gpu_optimize(
program: Program,
dispatcher: &dyn OptimizerDispatcher,
) -> Result<Program, GpuOptimizeError> {
if dispatcher.supports_persistent() {
return gpu_pipeline_resident(program, dispatcher).map_err(GpuOptimizeError::Persistent);
}
let program = gpu_canonicalize(program, dispatcher).map_err(GpuOptimizeError::Canonicalize)?;
let program = gpu_const_fold(program, dispatcher).map_err(GpuOptimizeError::ConstFold)?;
let program =
gpu_algebraic_identities(program, dispatcher).map_err(GpuOptimizeError::PatternMatch)?;
let program = gpu_dce(program, dispatcher).map_err(GpuOptimizeError::Dce)?;
Ok(program)
}