Skip to content

cranelift: ISLE wrapper for constructing constants #6038

Open
@jameysharp

Description

@jameysharp

Feature

In our mid-end optimization rules we sometimes need to construct new constants, where the constant's type comes from somewhere in the left-hand side pattern. We should add a helper term that constructs constants without having to know whether we need to use iconst, vconst, f32const, f64const, …

Benefit

We can write more general optimizations without needing a lot of special cases.

Implementation

I'm pretty sure this isn't quite right, but I'm thinking of an ISLE term something along these lines:

(decl pure const (Type u64) Value)
(rule 2 (const $I128 n) (uextend $I128 (iconst $I64 n))
(rule 1 (const (ty_int ty) n) (iconst ty n))
(rule 0 (const (ty_vec ty) n) (splat ty (const (lane_type ty) n)))

I don't know whether this should go in prelude-opt.isle or prelude.isle. It depends on whether it's useful in lowering as well as optimization. I think it probably isn't useful in lowering and should go in the optimization-specific prelude.

Thanks to @fitzgen for the general idea.

Metadata

Metadata

Assignees

No one assigned

    Labels

    craneliftIssues related to the Cranelift code generatorcranelift:E-easyIssues suitable for newcomers to investigate, including Rust newcomers!cranelift:mid-endclif-to-clif related passes, legalizations, etc...good first issueIssues that are good for new contributors to tackle!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions