From 57c2f25429b7a112da066653fce22a53d0105069 Mon Sep 17 00:00:00 2001 From: Gonzalosilvalde Date: Sat, 5 Apr 2025 17:12:54 +0200 Subject: [PATCH 1/4] cranelift: ISLE wrapper for constructing constants --- cranelift/codegen/src/isle_prelude.rs | 9 +++++++++ cranelift/codegen/src/prelude.isle | 4 ++++ cranelift/codegen/src/prelude_opt.isle | 9 +++++++++ 3 files changed, 22 insertions(+) diff --git a/cranelift/codegen/src/isle_prelude.rs b/cranelift/codegen/src/isle_prelude.rs index 6a9a57db40bf..65b87b1fa595 100644 --- a/cranelift/codegen/src/isle_prelude.rs +++ b/cranelift/codegen/src/isle_prelude.rs @@ -449,6 +449,15 @@ macro_rules! isle_common_prelude_methods { } } + #[inline] + fn ty_vec(&mut self, ty: Type) -> Option { + if ty.is_vector() { + Some(ty) + } else { + None + } + } + #[inline] fn ty_vec64_int(&mut self, ty: Type) -> Option { if ty.is_vector() && ty.bits() == 64 && ty.lane_type().is_int() { diff --git a/cranelift/codegen/src/prelude.isle b/cranelift/codegen/src/prelude.isle index f6493c7987f7..6bd7d0dc80e3 100644 --- a/cranelift/codegen/src/prelude.isle +++ b/cranelift/codegen/src/prelude.isle @@ -464,6 +464,10 @@ (decl ty_dyn_vec128 (Type) Type) (extern extractor ty_dyn_vec128 ty_dyn_vec128) +;; An extractor that only matches vector. +(decl ty_vec (Type) Type) +(extern extractor ty_vec ty_vec) + ;; An extractor that only matches 64-bit vector types with integer ;; lanes (I8X8, I16X4, I32X2) (decl ty_vec64_int (Type) Type) diff --git a/cranelift/codegen/src/prelude_opt.isle b/cranelift/codegen/src/prelude_opt.isle index e9b9dcdc0d6e..f11b644ba6e7 100644 --- a/cranelift/codegen/src/prelude_opt.isle +++ b/cranelift/codegen/src/prelude_opt.isle @@ -154,6 +154,15 @@ (iconst ty (imm64 c))) (rule 1 (iconst_u $I128 c) (uextend $I128 (iconst_u $I64 c))) +;; Constructs a constant value node from a 64-bit immediate, adapting it +;; to the specified type. For 128-bit integers, the immediate is zero-extended; +;; for other integer types, a direct iconst is generated; and for vector types, +;; the constant is splatted across all lanes. +(decl const (Type Imm64) 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))) + ;; These take `Value`, rather than going through `inst_data_value_tupled`, ;; because most of the time they want to return the original `Value`, and it ;; would be a waste to need to re-GVN the instruction data in those cases. From 522bdeebf950336ba53d1dd31813aba674867855 Mon Sep 17 00:00:00 2001 From: Jerry Yang Date: Wed, 8 Oct 2025 15:46:26 -0700 Subject: [PATCH 2/4] cranelift: replace iconst to const for RHS rules --- cranelift/codegen/src/opts/cprop.isle | 43 ++++++++++++++------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/cranelift/codegen/src/opts/cprop.isle b/cranelift/codegen/src/opts/cprop.isle index e6ec5c84db40..d5e0d4eb991a 100644 --- a/cranelift/codegen/src/opts/cprop.isle +++ b/cranelift/codegen/src/opts/cprop.isle @@ -3,96 +3,96 @@ (rule (simplify (clz (fits_in_64 ty) (iconst ty kx))) - (subsume (iconst ty (imm64_clz ty kx)))) + (subsume (const ty (imm64_clz ty kx)))) (rule (simplify (ctz (fits_in_64 ty) (iconst ty kx))) - (subsume (iconst ty (imm64_ctz ty kx)))) + (subsume (const ty (imm64_ctz ty kx)))) (rule (simplify (iadd (fits_in_64 ty) (iconst ty (u64_from_imm64 k1)) (iconst ty (u64_from_imm64 k2)))) - (subsume (iconst ty (imm64_masked ty (u64_wrapping_add k1 k2))))) + (subsume (const ty (imm64_masked ty (u64_wrapping_add k1 k2))))) (rule (simplify (isub (fits_in_64 ty) (iconst ty (u64_from_imm64 k1)) (iconst ty (u64_from_imm64 k2)))) - (subsume (iconst ty (imm64_masked ty (u64_wrapping_sub k1 k2))))) + (subsume (const ty (imm64_masked ty (u64_wrapping_sub k1 k2))))) (rule (simplify (imul (fits_in_64 ty) (iconst ty (u64_from_imm64 k1)) (iconst ty (u64_from_imm64 k2)))) - (subsume (iconst ty (imm64_masked ty (u64_wrapping_mul k1 k2))))) + (subsume (const ty (imm64_masked ty (u64_wrapping_mul k1 k2))))) (rule (simplify_skeleton (sdiv (iconst ty k1) (iconst ty k2))) (if-let d (imm64_sdiv ty k1 k2)) - (iconst ty d)) + (const ty d)) (rule (simplify_skeleton (srem (iconst ty k1) (iconst ty k2))) (if-let d (imm64_srem ty k1 k2)) - (iconst ty d)) + (const ty d)) (rule (simplify_skeleton (udiv (iconst_u ty k1) (iconst_u ty k2))) (if-let d (u64_checked_div k1 k2)) - (iconst ty (imm64_masked ty d))) + (const ty (imm64_masked ty d))) (rule (simplify_skeleton (urem (iconst_u ty k1) (iconst_u ty k2))) (if-let d (u64_checked_rem k1 k2)) - (iconst ty (imm64_masked ty d))) + (const ty (imm64_masked ty d))) (rule (simplify (bor (fits_in_64 ty) (iconst ty (u64_from_imm64 k1)) (iconst ty (u64_from_imm64 k2)))) - (subsume (iconst ty (imm64_masked ty (u64_or k1 k2))))) + (subsume (const ty (imm64_masked ty (u64_or k1 k2))))) (rule (simplify (band (fits_in_64 ty) (iconst ty (u64_from_imm64 k1)) (iconst ty (u64_from_imm64 k2)))) - (subsume (iconst ty (imm64_masked ty (u64_and k1 k2))))) + (subsume (const ty (imm64_masked ty (u64_and k1 k2))))) (rule (simplify (bxor (fits_in_64 ty) (iconst ty (u64_from_imm64 k1)) (iconst ty (u64_from_imm64 k2)))) - (subsume (iconst ty (imm64_masked ty (u64_xor k1 k2))))) + (subsume (const ty (imm64_masked ty (u64_xor k1 k2))))) (rule (simplify (bnot (fits_in_64 ty) (iconst ty (u64_from_imm64 k)))) - (subsume (iconst ty (imm64_masked ty (u64_not k))))) + (subsume (const ty (imm64_masked ty (u64_not k))))) (rule (simplify (ishl (fits_in_64 ty) (iconst ty k1) (iconst _ k2))) - (subsume (iconst ty (imm64_shl ty k1 k2)))) + (subsume (const ty (imm64_shl ty k1 k2)))) (rule (simplify (ushr (fits_in_64 ty) (iconst ty k1) (iconst _ k2))) - (subsume (iconst ty (imm64_ushr ty k1 k2)))) + (subsume (const ty (imm64_ushr ty k1 k2)))) (rule (simplify (sshr (fits_in_64 ty) (iconst ty k1) (iconst _ k2))) - (subsume (iconst ty (imm64_sshr ty k1 k2)))) + (subsume (const ty (imm64_sshr ty k1 k2)))) (rule (simplify (ireduce narrow (iconst (fits_in_64 _) (u64_from_imm64 imm)))) - (subsume (iconst narrow (imm64_masked narrow imm)))) + (subsume (const narrow (imm64_masked narrow imm)))) ;; iconst_[su] support $I128, but do so by extending, so restricting to ;; 64-bit or smaller keeps it from just remaking essentially the same thing. @@ -106,7 +106,7 @@ cc (iconst ty k1) (iconst ty k2))) - (subsume (iconst result_ty (imm64_icmp ty cc k1 k2)))) + (subsume (const result_ty (imm64_icmp ty cc k1 k2)))) ;; Canonicalize via commutativity: push immediates to the right. @@ -224,6 +224,7 @@ ;; A splat of a constant can become a direct `vconst` with the appropriate bit ;; pattern. +; TODO: replace vconst splat lines with `(subsume (const dst n)))` (rule (simplify (splat (ty_vec128 dst) (iconst $I8 n))) (vconst dst (splat8 (u64_uextend_imm64 $I8 n)))) (rule (simplify (splat (ty_vec128 dst) (iconst $I16 n))) @@ -305,11 +306,11 @@ ;; Constant fold bswap of a constant. (rule (simplify (bswap $I16 (iconst ty (u64_from_imm64 n)))) - (subsume (iconst $I16 (imm64 (u64_bswap16 n))))) + (subsume (const $I16 (imm64 (u64_bswap16 n))))) (rule (simplify (bswap $I32 (iconst ty (u64_from_imm64 n)))) - (subsume (iconst $I32 (imm64 (u64_bswap32 n))))) + (subsume (const $I32 (imm64 (u64_bswap32 n))))) (rule (simplify (bswap $I64 (iconst ty (u64_from_imm64 n)))) - (subsume (iconst $I64 (imm64 (u64_bswap64 n))))) + (subsume (const $I64 (imm64 (u64_bswap64 n))))) (decl pure u64_bswap16 (u64) u64) (extern constructor u64_bswap16 u64_bswap16) From 418191bc0b2b58ce78483eb5bea0603a2778071d Mon Sep 17 00:00:00 2001 From: Jerry Yang Date: Sat, 25 Oct 2025 11:45:41 -0700 Subject: [PATCH 3/4] cranelift: add ieee conversion helpers and rules for float/vector constants --- cranelift/codegen/src/isle_prelude.rs | 30 +++++++ cranelift/codegen/src/opts/cprop.isle | 89 ++++++++++--------- cranelift/codegen/src/prelude.isle | 16 ++++ cranelift/codegen/src/prelude_opt.isle | 17 +++- .../filetests/egraph/cprop-splat.clif | 15 ++++ .../filetests/filetests/egraph/cprop.clif | 20 +++++ 6 files changed, 142 insertions(+), 45 deletions(-) diff --git a/cranelift/codegen/src/isle_prelude.rs b/cranelift/codegen/src/isle_prelude.rs index 65b87b1fa595..79568e9f072a 100644 --- a/cranelift/codegen/src/isle_prelude.rs +++ b/cranelift/codegen/src/isle_prelude.rs @@ -557,6 +557,36 @@ macro_rules! isle_common_prelude_methods { val } + #[inline] + fn ieee16_from_imm64(&mut self, val: Imm64) -> Ieee16 { + Ieee16::with_bits(val.bits() as u16) + } + + #[inline] + fn ieee32_from_imm64(&mut self, val: Imm64) -> Ieee32 { + Ieee32::with_bits(val.bits() as u32) + } + + #[inline] + fn ieee64_from_imm64(&mut self, val: Imm64) -> Ieee64 { + Ieee64::with_bits(val.bits() as u64) + } + + #[inline] + fn imm64_from_ieee16(&mut self, val: Ieee16) -> Imm64 { + Imm64::new(val.bits() as i64) + } + + #[inline] + fn imm64_from_ieee32(&mut self, val: Ieee32) -> Imm64 { + Imm64::new(val.bits() as i64) + } + + #[inline] + fn imm64_from_ieee64(&mut self, val: Ieee64) -> Imm64 { + Imm64::new(val.bits() as i64) + } + fn not_vec32x2(&mut self, ty: Type) -> Option { if ty.lane_bits() == 32 && ty.lane_count() == 2 { None diff --git a/cranelift/codegen/src/opts/cprop.isle b/cranelift/codegen/src/opts/cprop.isle index d5e0d4eb991a..e4ac2856d614 100644 --- a/cranelift/codegen/src/opts/cprop.isle +++ b/cranelift/codegen/src/opts/cprop.isle @@ -224,19 +224,20 @@ ;; A splat of a constant can become a direct `vconst` with the appropriate bit ;; pattern. -; TODO: replace vconst splat lines with `(subsume (const dst n)))` (rule (simplify (splat (ty_vec128 dst) (iconst $I8 n))) - (vconst dst (splat8 (u64_uextend_imm64 $I8 n)))) + (const dst n)) (rule (simplify (splat (ty_vec128 dst) (iconst $I16 n))) - (vconst dst (splat16 (u64_uextend_imm64 $I16 n)))) + (const dst n)) (rule (simplify (splat (ty_vec128 dst) (iconst $I32 n))) - (vconst dst (splat32 (u64_uextend_imm64 $I32 n)))) + (const dst n)) (rule (simplify (splat (ty_vec128 dst) (iconst $I64 n))) - (vconst dst (splat64 (u64_uextend_imm64 $I64 n)))) + (const dst n)) +(rule (simplify (splat (ty_vec128 dst) (f16const _ (u16_from_ieee16 n)))) + (const dst (imm64 n))) (rule (simplify (splat (ty_vec128 dst) (f32const _ (u32_from_ieee32 n)))) - (vconst dst (splat32 n))) + (const dst (imm64 n))) (rule (simplify (splat (ty_vec128 dst) (f64const _ (u64_from_ieee64 n)))) - (vconst dst (splat64 n))) + (const dst (imm64 n))) (decl splat8 (u64) Constant) (rule (splat8 n) (splat16 (u64_or n (u64_shl n 8)))) @@ -287,13 +288,13 @@ ;; Constant fold int-to-float conversions. (rule (simplify (fcvt_from_uint $F32 (iconst_u _ n))) - (f32const $F32 (f32_from_uint n))) + (const $F32 (imm64_from_ieee32 (f32_from_uint n)))) (rule (simplify (fcvt_from_uint $F64 (iconst_u _ n))) - (f64const $F64 (f64_from_uint n))) + (const $F64 (imm64_from_ieee64 (f64_from_uint n)))) (rule (simplify (fcvt_from_sint $F32 (iconst_s _ n))) - (f32const $F32 (f32_from_sint n))) + (const $F32 (imm64_from_ieee32 (f32_from_sint n)))) (rule (simplify (fcvt_from_sint $F64 (iconst_s _ n))) - (f64const $F64 (f64_from_sint n))) + (const $F64 (imm64_from_ieee64 (f64_from_sint n)))) (decl f32_from_uint (u64) Ieee32) (extern constructor f32_from_uint f32_from_uint) @@ -330,117 +331,117 @@ ;; TODO: fcmp, fma, demote, promote, to-int ops (rule (simplify (fadd $F32 (f32const $F32 lhs) (f32const $F32 rhs))) (if-let r (f32_add lhs rhs)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (fadd $F64 (f64const $F64 lhs) (f64const $F64 rhs))) (if-let r (f64_add lhs rhs)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (fsub $F32 (f32const $F32 lhs) (f32const $F32 rhs))) (if-let r (f32_sub lhs rhs)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (fsub $F64 (f64const $F64 lhs) (f64const $F64 rhs))) (if-let r (f64_sub lhs rhs)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (fmul $F32 (f32const $F32 lhs) (f32const $F32 rhs))) (if-let r (f32_mul lhs rhs)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (fmul $F64 (f64const $F64 lhs) (f64const $F64 rhs))) (if-let r (f64_mul lhs rhs)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (fdiv $F32 (f32const $F32 lhs) (f32const $F32 rhs))) (if-let r (f32_div lhs rhs)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (fdiv $F64 (f64const $F64 lhs) (f64const $F64 rhs))) (if-let r (f64_div lhs rhs)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (sqrt $F32 (f32const $F32 n))) (if-let r (f32_sqrt n)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (sqrt $F64 (f64const $F64 n))) (if-let r (f64_sqrt n)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (ceil $F32 (f32const $F32 n))) (if-let r (f32_ceil n)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (ceil $F64 (f64const $F64 n))) (if-let r (f64_ceil n)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (floor $F32 (f32const $F32 n))) (if-let r (f32_floor n)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (floor $F64 (f64const $F64 n))) (if-let r (f64_floor n)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (trunc $F32 (f32const $F32 n))) (if-let r (f32_trunc n)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (trunc $F64 (f64const $F64 n))) (if-let r (f64_trunc n)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (nearest $F32 (f32const $F32 n))) (if-let r (f32_nearest n)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (nearest $F64 (f64const $F64 n))) (if-let r (f64_nearest n)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (fmin $F16 (f16const $F16 n) (f16const $F16 m))) (if-let r (f16_min n m)) - (subsume (f16const $F32 r))) + (subsume (const $F16 (imm64_from_ieee16 r)))) (rule (simplify (fmin $F32 (f32const $F32 n) (f32const $F32 m))) (if-let r (f32_min n m)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (fmin $F64 (f64const $F64 n) (f64const $F64 m))) (if-let r (f64_min n m)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (fmin $F128 (f128const $F128 (ieee128_constant n)) (f128const $F128 (ieee128_constant m)))) (if-let r (f128_min n m)) (subsume (f128const $F128 (ieee128_constant r)))) (rule (simplify (fmax $F16 (f16const $F16 n) (f16const $F16 m))) (if-let r (f16_max n m)) - (subsume (f16const $F16 r))) + (subsume (const $F16 (imm64_from_ieee16 r)))) (rule (simplify (fmax $F32 (f32const $F32 n) (f32const $F32 m))) (if-let r (f32_max n m)) - (subsume (f32const $F32 r))) + (subsume (const $F32 (imm64_from_ieee32 r)))) (rule (simplify (fmax $F64 (f64const $F64 n) (f64const $F64 m))) (if-let r (f64_max n m)) - (subsume (f64const $F64 r))) + (subsume (const $F64 (imm64_from_ieee64 r)))) (rule (simplify (fmax $F128 (f128const $F128 (ieee128_constant n)) (f128const $F128 (ieee128_constant m)))) (if-let r (f128_max n m)) (subsume (f128const $F128 (ieee128_constant r)))) (rule (simplify (fneg $F16 (f16const $F16 n))) - (subsume (f16const $F16 (f16_neg n)))) + (subsume (const $F16 (imm64_from_ieee16 (f16_neg n))))) (rule (simplify (fneg $F32 (f32const $F32 n))) - (subsume (f32const $F32 (f32_neg n)))) + (subsume (const $F32 (imm64_from_ieee32 (f32_neg n))))) (rule (simplify (fneg $F64 (f64const $F64 n))) - (subsume (f64const $F64 (f64_neg n)))) + (subsume (const $F64 (imm64_from_ieee64 (f64_neg n))))) (rule (simplify (fneg $F128 (f128const $F128 (ieee128_constant n)))) (subsume (f128const $F128 (ieee128_constant (f128_neg n))))) (rule (simplify (fabs $F16 (f16const $F16 n))) - (subsume (f16const $F16 (f16_abs n)))) + (subsume (const $F16 (imm64_from_ieee16 (f16_abs n))))) (rule (simplify (fabs $F32 (f32const $F32 n))) - (subsume (f32const $F32 (f32_abs n)))) + (subsume (const $F32 (imm64_from_ieee32 (f32_abs n))))) (rule (simplify (fabs $F64 (f64const $F64 n))) - (subsume (f64const $F64 (f64_abs n)))) + (subsume (const $F64 (imm64_from_ieee64 (f64_abs n))))) (rule (simplify (fabs $F128 (f128const $F128 (ieee128_constant n)))) (subsume (f128const $F128 (ieee128_constant (f128_abs n))))) (rule (simplify (fcopysign $F16 (f16const $F16 n) (f16const $F16 m))) - (subsume (f16const $F16 (f16_copysign n m)))) + (subsume (const $F16 (imm64_from_ieee16 (f16_copysign n m))))) (rule (simplify (fcopysign $F32 (f32const $F32 n) (f32const $F32 m))) - (subsume (f32const $F32 (f32_copysign n m)))) + (subsume (const $F32 (imm64_from_ieee32 (f32_copysign n m))))) (rule (simplify (fcopysign $F64 (f64const $F64 n) (f64const $F64 m))) - (subsume (f64const $F64 (f64_copysign n m)))) + (subsume (const $F64 (imm64_from_ieee64 (f64_copysign n m))))) (rule (simplify (fcopysign $F128 (f128const $F128 (ieee128_constant n)) (f128const $F128 (ieee128_constant m)))) (subsume (f128const $F128 (ieee128_constant (f128_copysign n m))))) diff --git a/cranelift/codegen/src/prelude.isle b/cranelift/codegen/src/prelude.isle index 6bd7d0dc80e3..9a3628fe61ca 100644 --- a/cranelift/codegen/src/prelude.isle +++ b/cranelift/codegen/src/prelude.isle @@ -531,6 +531,22 @@ (decl u64_from_ieee64 (u64) Ieee64) (extern extractor infallible u64_from_ieee64 u64_from_ieee64) +;; Construct Ieee* from raw low bits of an Imm64. +(decl ieee16_from_imm64 (Imm64) Ieee16) +(extern constructor ieee16_from_imm64 ieee16_from_imm64) +(decl ieee32_from_imm64 (Imm64) Ieee32) +(extern constructor ieee32_from_imm64 ieee32_from_imm64) +(decl ieee64_from_imm64 (Imm64) Ieee64) +(extern constructor ieee64_from_imm64 ieee64_from_imm64) + +;; Construct Imm64 from Ieee* by taking their raw low bits. +(decl imm64_from_ieee16 (Ieee16) Imm64) +(extern constructor imm64_from_ieee16 imm64_from_ieee16) +(decl imm64_from_ieee32 (Ieee32) Imm64) +(extern constructor imm64_from_ieee32 imm64_from_ieee32) +(decl imm64_from_ieee64 (Ieee64) Imm64) +(extern constructor imm64_from_ieee64 imm64_from_ieee64) + ;; Match a multi-lane type, extracting (# bits per lane, # lanes) from the given ;; type. Will only match when there is more than one lane. (decl multi_lane (u32 u32) Type) diff --git a/cranelift/codegen/src/prelude_opt.isle b/cranelift/codegen/src/prelude_opt.isle index f11b644ba6e7..44895ed53db9 100644 --- a/cranelift/codegen/src/prelude_opt.isle +++ b/cranelift/codegen/src/prelude_opt.isle @@ -159,9 +159,24 @@ ;; for other integer types, a direct iconst is generated; and for vector types, ;; the constant is splatted across all lanes. (decl const (Type Imm64) Value) +(rule 3 (const (ty_scalar_float ty) n) (const_scalar_float ty n)) (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))) +(rule 0 (const (ty_vec128 ty) n) (const_vec128 ty n)) + +(decl const_scalar_float (Type Imm64) Value) +(rule 2 (const_scalar_float $F16 n) (f16const $F16 (ieee16_from_imm64 n))) +(rule 1 (const_scalar_float $F32 n) (f32const $F32 (ieee32_from_imm64 n))) +(rule 0 (const_scalar_float $F64 n) (f64const $F64 (ieee64_from_imm64 n))) + +(decl const_vec128 (Type Imm64) Value) +(rule (const_vec128 $I8X16 n) (vconst $I8X16 (splat8 (u64_uextend_imm64 $I8 n)))) +(rule (const_vec128 $I16X8 n) (vconst $I16X8 (splat16 (u64_uextend_imm64 $I16 n)))) +(rule (const_vec128 $I32X4 n) (vconst $I32X4 (splat32 (u64_uextend_imm64 $I32 n)))) +(rule (const_vec128 $I64X2 n) (vconst $I64X2 (splat64 (u64_uextend_imm64 $I64 n)))) +(rule (const_vec128 $F16X8 n) (vconst $F16X8 (splat16 (u64_uextend_imm64 $I16 n)))) +(rule (const_vec128 $F32X4 n) (vconst $F32X4 (splat32 (u64_uextend_imm64 $I32 n)))) +(rule (const_vec128 $F64X2 n) (vconst $F64X2 (splat64 (u64_uextend_imm64 $I64 n)))) ;; These take `Value`, rather than going through `inst_data_value_tupled`, ;; because most of the time they want to return the original `Value`, and it diff --git a/cranelift/filetests/filetests/egraph/cprop-splat.clif b/cranelift/filetests/filetests/egraph/cprop-splat.clif index 93f58b4bd958..4d5cdefb19a0 100644 --- a/cranelift/filetests/filetests/egraph/cprop-splat.clif +++ b/cranelift/filetests/filetests/egraph/cprop-splat.clif @@ -167,6 +167,21 @@ block0: ; return v3 ; v3 = const0 ; } +function %f16x8() -> f16x8 { +block0: + v1 = f16const 0x1.0p0 + v2 = splat.f16x8 v1 + return v2 +} + +; function %f16x8() -> f16x8 fast { +; const0 = 0x3c003c003c003c003c003c003c003c00 +; +; block0: +; v3 = vconst.f16x8 const0 +; return v3 ; v3 = const0 +; } + function %i8x8() -> i8x8 { block0: v1 = iconst.i8 0 diff --git a/cranelift/filetests/filetests/egraph/cprop.clif b/cranelift/filetests/filetests/egraph/cprop.clif index fd3d88cb2202..68d429fbe8d3 100644 --- a/cranelift/filetests/filetests/egraph/cprop.clif +++ b/cranelift/filetests/filetests/egraph/cprop.clif @@ -478,6 +478,16 @@ block0: ; check: v3 = f16const -0.0 ; check: return v3 ; v3 = -0.0 +function %f16_fneg_const() -> f16 { +block0: + v1 = f16const 0x1.5p2 + v2 = fneg v1 + return v2 +} + +; check: v3 = f16const -0x1.500p2 +; check: return v3 ; v3 = -0x1.500p2 + function %f16_fabs() -> f16 { block0: v1 = f16const -0.0 @@ -881,6 +891,16 @@ block0: ; check: v4 = f64const -NaN ; check: return v4 ; v4 = -NaN +function %u64_to_f64_const() -> f64 { +block0: + v1 = iconst.i64 42 + v2 = fcvt_from_uint.f64 v1 + return v2 +} + +; check: v3 = f64const 0x1.5000000000000p5 +; check: return v3 ; v3 = 0x1.5000000000000p5 + function %f128_fmin() -> f128 { block0: v1 = f128const 0x1.5p6 From 7da9069742afdd8397ee76b9ea7670597914eabe Mon Sep 17 00:00:00 2001 From: Jerry Yang Date: Sat, 25 Oct 2025 23:17:58 -0700 Subject: [PATCH 4/4] cranelift: clean up redundant code and update comments --- cranelift/codegen/src/isle_prelude.rs | 9 --------- cranelift/codegen/src/prelude.isle | 4 ---- cranelift/codegen/src/prelude_opt.isle | 4 ++-- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/cranelift/codegen/src/isle_prelude.rs b/cranelift/codegen/src/isle_prelude.rs index 79568e9f072a..c36e13a612c7 100644 --- a/cranelift/codegen/src/isle_prelude.rs +++ b/cranelift/codegen/src/isle_prelude.rs @@ -449,15 +449,6 @@ macro_rules! isle_common_prelude_methods { } } - #[inline] - fn ty_vec(&mut self, ty: Type) -> Option { - if ty.is_vector() { - Some(ty) - } else { - None - } - } - #[inline] fn ty_vec64_int(&mut self, ty: Type) -> Option { if ty.is_vector() && ty.bits() == 64 && ty.lane_type().is_int() { diff --git a/cranelift/codegen/src/prelude.isle b/cranelift/codegen/src/prelude.isle index 9a3628fe61ca..16bc69c35789 100644 --- a/cranelift/codegen/src/prelude.isle +++ b/cranelift/codegen/src/prelude.isle @@ -464,10 +464,6 @@ (decl ty_dyn_vec128 (Type) Type) (extern extractor ty_dyn_vec128 ty_dyn_vec128) -;; An extractor that only matches vector. -(decl ty_vec (Type) Type) -(extern extractor ty_vec ty_vec) - ;; An extractor that only matches 64-bit vector types with integer ;; lanes (I8X8, I16X4, I32X2) (decl ty_vec64_int (Type) Type) diff --git a/cranelift/codegen/src/prelude_opt.isle b/cranelift/codegen/src/prelude_opt.isle index 44895ed53db9..ea67659700d6 100644 --- a/cranelift/codegen/src/prelude_opt.isle +++ b/cranelift/codegen/src/prelude_opt.isle @@ -157,7 +157,7 @@ ;; Constructs a constant value node from a 64-bit immediate, adapting it ;; to the specified type. For 128-bit integers, the immediate is zero-extended; ;; for other integer types, a direct iconst is generated; and for vector types, -;; the constant is splatted across all lanes. +;; only the vec128 is involved, and the constant is splatted across all lanes. (decl const (Type Imm64) Value) (rule 3 (const (ty_scalar_float ty) n) (const_scalar_float ty n)) (rule 2 (const $I128 n) (uextend $I128 (iconst $I64 n))) @@ -170,7 +170,7 @@ (rule 0 (const_scalar_float $F64 n) (f64const $F64 (ieee64_from_imm64 n))) (decl const_vec128 (Type Imm64) Value) -(rule (const_vec128 $I8X16 n) (vconst $I8X16 (splat8 (u64_uextend_imm64 $I8 n)))) +(rule (const_vec128 $I8X16 n) (vconst $I8X16 (splat8 (u64_uextend_imm64 $I8 n)))) (rule (const_vec128 $I16X8 n) (vconst $I16X8 (splat16 (u64_uextend_imm64 $I16 n)))) (rule (const_vec128 $I32X4 n) (vconst $I32X4 (splat32 (u64_uextend_imm64 $I32 n)))) (rule (const_vec128 $I64X2 n) (vconst $I64X2 (splat64 (u64_uextend_imm64 $I64 n))))