Skip to content

Commit

Permalink
cranelift: simplify fneg(fneg(x)) to x (#6034)
Browse files Browse the repository at this point in the history
  • Loading branch information
Kmeakin authored Mar 16, 2023
1 parent dccc2d6 commit d479951
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 0 deletions.
3 changes: 3 additions & 0 deletions cranelift/codegen/src/opts/algebraic.isle
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,9 @@
;; with the `bitselect` instruction, but the pattern is a bit more complicated
;; due to most bitselects-over-floats having bitcasts.

;; fneg(fneg(x)) == x.
(rule (simplify (fneg ty (fneg ty x))) (subsume x))

;; If both of the multiplied arguments to an `fma` are negated then remove
;; both of them since they cancel out.
(rule (simplify (fma ty (fneg ty x) (fneg ty y) z))
Expand Down
9 changes: 9 additions & 0 deletions cranelift/filetests/filetests/egraph/algebraic.clif
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,15 @@ block0(v1: i16):
; check: v4 = sextend.i64 v1
; check: return v4

function %double_fneg(f32) -> f32 {
block0(v1: f32):
v2 = fneg v1
v3 = fneg v2
return v3
}

; check: return v1

function %fma_double_fneg(f32, f32, f32) -> f32 {
block0(v1: f32, v2: f32, v3: f32):
v4 = fneg v1
Expand Down

0 comments on commit d479951

Please sign in to comment.