cubecl-ir 0.11.1

Intermediate representation for CubeCL
Documentation
use pliron::builtin::ops::ConstantOp;
use smallvec::SmallVec;

use crate::{
    PropagatesUniformity,
    interfaces::control_flow::{
        RegionBranchOpInterface, RegionBranchTerminatorOpInterface, RegionSuccessor,
    },
    prelude::*,
};

#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Default)]
pub enum Uniformity {
    #[default]
    Uninitialized = 4,
    Device = 3,
    Cube = 2,
    Plane = 1,
    None = 0,
}

#[op_interface]
pub trait UniformOpInterface {
    verify_op_succ!();
    fn uniformity(&self, ctx: &Context, operands: &[Uniformity]) -> Uniformity;
}

PropagatesUniformity!(ConstantOp);

#[op_interface]
pub trait UniformRegionOpInterface: RegionBranchOpInterface + SingleBlockRegionInterface {
    verify_op_succ!();
    fn result_uniformity(&self, ctx: &Context, operands: &[Uniformity]) -> Uniformity;
    fn entry_successor_region_uniformity(
        &self,
        ctx: &Context,
        operands: &[Uniformity],
    ) -> Vec<Uniformity>;
}

#[op_interface]
pub trait UniformRegionTerminatorOpInterface: RegionBranchTerminatorOpInterface {
    verify_op_succ!();
    fn all_successor_regions(&self, ctx: &Context) -> Vec<RegionSuccessor> {
        let operands = self
            .get_operation()
            .deref(ctx)
            .operands()
            .map(|_| None)
            .collect::<SmallVec<[_; 8]>>();
        self.successor_regions(ctx, &operands)
    }
    fn successor_region_uniformity(
        &self,
        ctx: &Context,
        operands: &[Uniformity],
    ) -> Vec<Uniformity>;
}