cubecl-llvm 0.11.0-pre.4

LLVM compiler for CubeCL
pub mod atomic;
pub mod cmp;
pub mod constant;
pub mod general;
pub mod insert;
pub mod math;
pub mod memory;
pub mod ty;
pub mod vector;

use crate::prelude::*;

pub mod prelude {
    pub use crate::prelude::*;
}

#[type_interface]
pub trait CubeToLLVMType {
    verify_ty_succ!();
    fn convert(&self, ctx: &Context) -> TypeHandle;
}

#[op_interface]
pub trait ToLLVMDialect {
    fn rewrite(
        &self,
        ctx: &mut Context,
        rewriter: &mut DialectConversionRewriter,
        operands_info: &OperandsInfo,
    ) -> Result<()>;

    fn verify(_op: &dyn Op, _ctx: &Context) -> Result<()>
    where
        Self: Sized,
    {
        Ok(())
    }
}

pub type CubeToLLVMPass = DialectConversionPass<CubeToLLVM>;

#[derive(Default, NamedRewrite)]
pub struct CubeToLLVM;

impl DialectConversion for CubeToLLVM {
    fn can_convert_op(&self, ctx: &Context, op: Ptr<Operation>) -> bool {
        op_impls::<dyn ToLLVMDialect>(&*Operation::get_op_dyn(op, ctx))
    }

    fn can_convert_type(&self, ctx: &Context, ty: TypeHandle) -> bool {
        type_cast::<dyn CubeToLLVMType>(&*ty.deref(ctx)).is_some()
    }

    fn convert_type(&mut self, ctx: &mut Context, ty: TypeHandle) -> Result<TypeHandle> {
        let ty = ty.deref(ctx);
        let ty = type_cast::<dyn CubeToLLVMType>(&*ty).unwrap();
        let ty = ty.convert(ctx);
        Ok(ty)
    }

    fn rewrite(
        &mut self,
        ctx: &mut Context,
        rewriter: &mut DialectConversionRewriter,
        op: Ptr<Operation>,
        operands_info: &OperandsInfo,
    ) -> Result<()> {
        let op_dyn = Operation::get_op_dyn(op, ctx);
        let to_llvm_op = op_cast::<dyn ToLLVMDialect>(&*op_dyn)
            .expect("Matched Op must implement ToLLVMDialect");
        to_llvm_op.rewrite(ctx, rewriter, operands_info)
    }
}