bytecodealliance / bytecodealliance/wasmtime

cranelift: ISLE wrapper for constructing constants

Open
#6,038 0 comments 0 reactions 0 assignees View on GitHub
cranelift cranelift:E-easy cranelift:mid-end good first issue
Dominant language
Rust
Stars
18.6k
Forks
1.8k
Avg merge
1d 19h
Merged PRs (30d)
121

Description

#### 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:

```lisp
(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.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.