cubecl_opt/
transformers.rs1use std::rc::Rc;
2
3use cubecl_common::CubeDim;
4use cubecl_ir::{Instruction, Processor, Scope};
5
6use crate::Optimizer;
7
8#[derive(Default)]
10pub struct OptimizerBuilder {
11 transformers: Vec<Rc<dyn IrTransformer>>,
12 processors: Vec<Box<dyn Processor>>,
13}
14
15impl OptimizerBuilder {
16 pub fn with_transformer(mut self, transformer: impl IrTransformer + 'static) -> Self {
18 self.transformers.push(Rc::new(transformer));
19 self
20 }
21
22 pub fn with_processor(mut self, processor: impl Processor + 'static) -> Self {
23 self.processors.push(Box::new(processor));
24 self
25 }
26
27 pub fn optimize(self, expand: Scope, cube_dim: CubeDim) -> Optimizer {
29 Optimizer::new(expand, cube_dim, self.transformers, self.processors)
30 }
31}
32
33pub enum TransformAction {
35 Ignore,
37 Replace(Vec<Instruction>),
39 Remove,
41}
42
43pub trait IrTransformer: core::fmt::Debug {
45 fn maybe_transform(&self, scope: &mut Scope, inst: &Instruction) -> TransformAction;
47}