Skip to content

Commit 5b7f8b8

Browse files
authored
egraphs: Const propagate bitwise float operations (#8625)
* egraphs: Const propagate bitwise float operations * egraphs: Move float bitwise operations to prelude.isle
1 parent c477424 commit 5b7f8b8

4 files changed

Lines changed: 117 additions & 0 deletions

File tree

cranelift/codegen/src/isle_prelude.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,5 +953,29 @@ macro_rules! isle_common_prelude_methods {
953953
None
954954
}
955955
}
956+
957+
fn f32_neg(&mut self, n: Ieee32) -> Ieee32 {
958+
n.neg()
959+
}
960+
961+
fn f32_abs(&mut self, n: Ieee32) -> Ieee32 {
962+
n.abs()
963+
}
964+
965+
fn f32_copysign(&mut self, a: Ieee32, b: Ieee32) -> Ieee32 {
966+
a.copysign(b)
967+
}
968+
969+
fn f64_neg(&mut self, n: Ieee64) -> Ieee64 {
970+
n.neg()
971+
}
972+
973+
fn f64_abs(&mut self, n: Ieee64) -> Ieee64 {
974+
n.abs()
975+
}
976+
977+
fn f64_copysign(&mut self, a: Ieee64, b: Ieee64) -> Ieee64 {
978+
a.copysign(b)
979+
}
956980
};
957981
}

cranelift/codegen/src/opts/cprop.isle

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,3 +279,19 @@
279279
(extern constructor u64_bswap32 u64_bswap32)
280280
(decl pure u64_bswap64 (u64) u64)
281281
(extern constructor u64_bswap64 u64_bswap64)
282+
283+
;; Constant fold bitwise float operations (fneg/fabs/fcopysign)
284+
(rule (simplify (fneg $F32 (f32const $F32 n)))
285+
(subsume (f32const $F32 (f32_neg n))))
286+
(rule (simplify (fneg $F64 (f64const $F64 n)))
287+
(subsume (f64const $F64 (f64_neg n))))
288+
289+
(rule (simplify (fabs $F32 (f32const $F32 n)))
290+
(subsume (f32const $F32 (f32_abs n))))
291+
(rule (simplify (fabs $F64 (f64const $F64 n)))
292+
(subsume (f64const $F64 (f64_abs n))))
293+
294+
(rule (simplify (fcopysign $F32 (f32const $F32 n) (f32const $F32 m)))
295+
(subsume (f32const $F32 (f32_copysign n m))))
296+
(rule (simplify (fcopysign $F64 (f64const $F64 n) (f64const $F64 m)))
297+
(subsume (f64const $F64 (f64_copysign n m))))

cranelift/codegen/src/prelude.isle

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,21 @@
234234
(decl u16_replicated_u8 (u8) u64)
235235
(extern extractor u16_replicated_u8 u16_replicated_u8)
236236

237+
;; Floating point operations
238+
239+
(decl pure f32_neg (Ieee32) Ieee32)
240+
(extern constructor f32_neg f32_neg)
241+
(decl pure f32_abs (Ieee32) Ieee32)
242+
(extern constructor f32_abs f32_abs)
243+
(decl pure f32_copysign (Ieee32 Ieee32) Ieee32)
244+
(extern constructor f32_copysign f32_copysign)
245+
(decl pure f64_neg (Ieee64) Ieee64)
246+
(extern constructor f64_neg f64_neg)
247+
(decl pure f64_abs (Ieee64) Ieee64)
248+
(extern constructor f64_abs f64_abs)
249+
(decl pure f64_copysign (Ieee64 Ieee64) Ieee64)
250+
(extern constructor f64_copysign f64_copysign)
251+
237252
;;;; `cranelift_codegen::ir::Type` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
238253

239254
(extern const $I8 Type)

cranelift/filetests/filetests/egraph/cprop.clif

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,3 +312,65 @@ block0:
312312

313313
; check: v2 = iconst.i64 0xf0de_bc9a_7856_3412
314314
; nextln: return v2
315+
316+
function %f32_fneg() -> f32 {
317+
block0:
318+
v1 = f32const 0.0
319+
v2 = fneg v1
320+
return v2
321+
}
322+
323+
; check: v3 = f32const -0.0
324+
; check: return v3 ; v3 = -0.0
325+
326+
function %f32_fabs() -> f32 {
327+
block0:
328+
v1 = f32const -0.0
329+
v2 = fabs v1
330+
return v2
331+
}
332+
333+
; check: v3 = f32const 0.0
334+
; check: return v3 ; v3 = 0.0
335+
336+
function %f32_fabs() -> f32 {
337+
block0:
338+
v1 = f32const -0.0
339+
v2 = f32const NaN
340+
v3 = fcopysign v2, v1
341+
return v3
342+
}
343+
344+
; check: v4 = f32const -NaN
345+
; check: return v4 ; v4 = -NaN
346+
347+
function %f64_fneg() -> f64 {
348+
block0:
349+
v1 = f64const 0.0
350+
v2 = fneg v1
351+
return v2
352+
}
353+
354+
; check: v3 = f64const -0.0
355+
; check: return v3 ; v3 = -0.0
356+
357+
function %f64_fabs() -> f64 {
358+
block0:
359+
v1 = f64const -0.0
360+
v2 = fabs v1
361+
return v2
362+
}
363+
364+
; check: v3 = f64const 0.0
365+
; check: return v3 ; v3 = 0.0
366+
367+
function %f64_fabs() -> f64 {
368+
block0:
369+
v1 = f64const -0.0
370+
v2 = f64const NaN
371+
v3 = fcopysign v2, v1
372+
return v3
373+
}
374+
375+
; check: v4 = f64const -NaN
376+
; check: return v4 ; v4 = -NaN

0 commit comments

Comments
 (0)