Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cranelift/codegen/src/opts/bitops.isle
Original file line number Diff line number Diff line change
Expand Up @@ -545,3 +545,9 @@
(rule (simplify (bor ty y (band ty x (bnot ty y)))) (bor ty y x))
(rule (simplify (bor ty (band ty x (bnot ty y)) y)) (bor ty y x))


;; (x & ~y) ^ ~x --> ~(x & y)
(rule (simplify (bxor ty (band ty x (bnot ty y)) (bnot ty x))) (bnot ty (band ty x y)))
(rule (simplify (bxor ty (bnot ty x) (band ty x (bnot ty y)))) (bnot ty (band ty x y)))
(rule (simplify (bxor ty (band ty (bnot ty y) x) (bnot ty x))) (bnot ty (band ty x y)))
(rule (simplify (bxor ty (bnot ty x) (band ty (bnot ty y) x))) (bnot ty (band ty x y)))
167 changes: 166 additions & 1 deletion cranelift/filetests/filetests/egraph/arithmetic-precise.clif
Original file line number Diff line number Diff line change
Expand Up @@ -83,4 +83,169 @@ block0(v0: i128):
; v3 = iconst.i64 -1
; v4 = sextend.i128 v3 ; v3 = -1
; return v4
; }
; }

;; ((x + y) - (x + z)) --> (y - z)
function %test_isub_iadd_iadd_cancel(i32, i32, i32) -> i32 fast {
block0(v0: i32, v1: i32, v2: i32):
v3 = iadd v0, v1
v4 = iadd v0, v2
v5 = isub v3, v4
return v5
}

; function %test_isub_iadd_iadd_cancel(i32, i32, i32) -> i32 fast {
; block0(v0: i32, v1: i32, v2: i32):
; v3 = iadd v0, v1
; v4 = iadd v0, v2
; v5 = isub v3, v4
; return v5
; }

;; ((x - z) - (y - z)) --> (x - y)
function %test_isub_isub_isub_cancel(i32, i32, i32) -> i32 fast {
block0(v0: i32, v1: i32, v2: i32):
v3 = isub v0, v2
v4 = isub v1, v2
v5 = isub v3, v4
return v5
}

; function %test_isub_isub_isub_cancel(i32, i32, i32) -> i32 fast {
; block0(v0: i32, v1: i32, v2: i32):
; v3 = isub v0, v2
; v4 = isub v1, v2
; v5 = isub v3, v4
; return v5
; }

;; ((x - y) - (x - z)) --> (z - y)
function %test_isub_isub_isub_swap_cancel(i32, i32, i32) -> i32 fast {
block0(v0: i32, v1: i32, v2: i32):
v3 = isub v0, v1
v4 = isub v0, v2
v5 = isub v3, v4
return v5
}

; function %test_isub_isub_isub_swap_cancel(i32, i32, i32) -> i32 fast {
; block0(v0: i32, v1: i32, v2: i32):
; v3 = isub v0, v1
; v4 = isub v0, v2
; v5 = isub v3, v4
; return v5
; }

;; umin(x, y) + umax(x, y) --> x + y
function %test_iadd_umin_umax(i32, i32) -> i32 fast {
block0(v0: i32, v1: i32):
v2 = umin v0, v1
v3 = umax v0, v1
v4 = iadd v2, v3
return v4
}

; function %test_iadd_umin_umax(i32, i32) -> i32 fast {
; block0(v0: i32, v1: i32):
; v2 = umin v0, v1
; v3 = umax v0, v1
; v4 = iadd v2, v3
; return v4
; }

;; smin(x, y) + smax(x, y) --> x + y
function %test_iadd_smin_smax(i32, i32) -> i32 fast {
block0(v0: i32, v1: i32):
v2 = smin v0, v1
v3 = smax v0, v1
v4 = iadd v2, v3
return v4
}

; function %test_iadd_smin_smax(i32, i32) -> i32 fast {
; block0(v0: i32, v1: i32):
; v2 = smin v0, v1
; v3 = smax v0, v1
; v4 = iadd v2, v3
; return v4
; }

;; ((x - y) + (y + z)) --> (x + z)
function %test_iadd_isub_iadd_cancel(i32, i32, i32) -> i32 fast {
block0(v0: i32, v1: i32, v2: i32):
v3 = isub v0, v1
v4 = iadd v1, v2
v5 = iadd v3, v4
return v5
}

; function %test_iadd_isub_iadd_cancel(i32, i32, i32) -> i32 fast {
; block0(v0: i32, v1: i32, v2: i32):
; v3 = isub v0, v1
; v4 = iadd v1, v2
; v5 = iadd v3, v4
; return v5
; }

;; (x - (x + y)) --> -y
function %test_isub_iadd_to_ineg(i32, i32) -> i32 fast {
block0(v0: i32, v1: i32):
v2 = iadd v0, v1
v3 = isub v0, v2
return v3
}

; function %test_isub_iadd_to_ineg(i32, i32) -> i32 fast {
; block0(v0: i32, v1: i32):
; v2 = iadd v0, v1
; v3 = isub v0, v2
; return v3
; }

;; (x + (y + (z - x))) --> (y + z)
function %test_iadd_iadd_isub_cancel(i32, i32, i32) -> i32 fast {
block0(v0: i32, v1: i32, v2: i32):
v3 = isub v2, v0
v4 = iadd v1, v3
v5 = iadd v0, v4
return v5
}

; function %test_iadd_iadd_isub_cancel(i32, i32, i32) -> i32 fast {
; block0(v0: i32, v1: i32, v2: i32):
; v3 = isub v2, v0
; v4 = iadd v1, v3
; v5 = iadd v0, v4
; return v5
; }

;; (eq ty (iadd cty x y) (iadd cty y x)) -> 1
function %simplify_icmp_eq_iadd_commute(i32, i32) -> i8 fast {
block0(v0: i32, v1: i32):
v2 = iadd v0, v1
v3 = iadd v1, v0
v4 = icmp eq v2, v3
return v4
}

; function %simplify_icmp_eq_iadd_commute(i32, i32) -> i8 fast {
; block0(v0: i32, v1: i32):
; v6 = iconst.i8 1
; return v6 ; v6 = 1
; }

;; (x - y) != x --> y != 0
function %simplify_icmp_ne_isub_x(i32, i32) -> i8 fast {
block0(v0: i32, v1: i32):
v2 = isub v0, v1
v3 = icmp ne v2, v0
return v3
}

; function %simplify_icmp_ne_isub_x(i32, i32) -> i8 fast {
; block0(v0: i32, v1: i32):
; v2 = isub v0, v1
; v3 = icmp ne v2, v0
; return v3
; }

Loading
Loading