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
10 changes: 10 additions & 0 deletions cranelift/codegen/src/opts/extends.isle
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,13 @@
(uextend ty x @ (value_type (ty_int narrow)))
(uextend ty y @ (value_type narrow))))
(ult rty x y))

;; sextend(x) OP sextend(y) --> x OP y, where OP = {==, <s}.
(rule (simplify (eq rty
(sextend ty x @ (value_type (ty_int narrow)))
(sextend ty y @ (value_type narrow))))
(eq rty x y))
(rule (simplify (slt rty
(sextend ty x @ (value_type (ty_int narrow)))
(sextend ty y @ (value_type narrow))))
(slt rty x y))
4 changes: 4 additions & 0 deletions cranelift/codegen/src/opts/icmp.isle
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,10 @@
(rule (simplify (eq ty (rotl cty x k) (rotl cty y k)))
(subsume (eq ty x y)))

;; rotr(x, k) == rotr(y, k) --> x == y.
(rule (simplify (eq ty (rotr cty x k) (rotr cty y k)))
(subsume (eq ty x y)))

;; (x >=s 0) & (x <s N) --> x <u N, 0 < N < 2^(B - 1).
(rule (simplify (band rty
(sge rty x (all_zero ty))
Expand Down
40 changes: 40 additions & 0 deletions cranelift/codegen/src/opts/selects.isle
Original file line number Diff line number Diff line change
Expand Up @@ -212,3 +212,43 @@
;; (x != y) ? (x - y) : 0 ==> x - y
(rule (simplify (select ty (ne cty x y) (isub ty x y) (all_zero ty)))
(isub ty x y))

;; (c ? x : y) OP (c ? y : x) --> x OP y, where OP = {&, |, ^}.
(rule (simplify (band ty (select ty c x y) (select ty c y x)))
(subsume (band ty x y)))
(rule (simplify (bor ty (select ty c x y) (select ty c y x)))
(subsume (bor ty x y)))
(rule (simplify (bxor ty (select ty c x y) (select ty c y x)))
(subsume (bxor ty x y)))

;; (x == y) ? 0 : (x ^ y) --> x ^ y, and its variants
(rule (simplify (select ty (eq cty x y) (all_zero ty) (bxor ty x y)))
(bxor ty x y))
(rule (simplify (select ty (eq cty x y) (all_zero ty) (bxor ty y x)))
(bxor ty x y))
(rule (simplify (select ty (ne cty x y) (bxor ty x y) (all_zero ty)))
(bxor ty x y))
(rule (simplify (select ty (ne cty x y) (bxor ty y x) (all_zero ty)))
(bxor ty x y))

;; (k == 0) ? x : (x shift k) --> x shift k
(rule (simplify (select ty (eq cty k (all_zero _)) x (ishl ty x k)))
(ishl ty x k))
(rule (simplify (select ty (ne cty k (all_zero _)) (ishl ty x k) x))
(ishl ty x k))
(rule (simplify (select ty (eq cty k (all_zero _)) x (ushr ty x k)))
(ushr ty x k))
(rule (simplify (select ty (ne cty k (all_zero _)) (ushr ty x k) x))
(ushr ty x k))
(rule (simplify (select ty (eq cty k (all_zero _)) x (sshr ty x k)))
(sshr ty x k))
(rule (simplify (select ty (ne cty k (all_zero _)) (sshr ty x k) x))
(sshr ty x k))
(rule (simplify (select ty (eq cty k (all_zero _)) x (rotl ty x k)))
(rotl ty x k))
(rule (simplify (select ty (ne cty k (all_zero _)) (rotl ty x k) x))
(rotl ty x k))
(rule (simplify (select ty (eq cty k (all_zero _)) x (rotr ty x k)))
(rotr ty x k))
(rule (simplify (select ty (ne cty k (all_zero _)) (rotr ty x k) x))
(rotr ty x k))
116 changes: 116 additions & 0 deletions cranelift/filetests/filetests/egraph/extends.clif
Original file line number Diff line number Diff line change
Expand Up @@ -305,3 +305,119 @@ block0(v0: i8, v1: i16):
; check: uextend.i32 v0
; check: uextend.i32 v1
; check: icmp ult v2, v3

function %eq_sextend_i8_i32(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = sextend.i32 v0
v3 = sextend.i32 v1
v4 = icmp eq v2, v3
return v4
}
; check: v5 = icmp eq v0, v1
; check: return v5

function %slt_sextend_i8_i32(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = sextend.i32 v0
v3 = sextend.i32 v1
v4 = icmp slt v2, v3
return v4
}
; check: v5 = icmp slt v0, v1
; check: return v5

function %eq_sextend_i16_i64(i16, i16) -> i8 {
block0(v0: i16, v1: i16):
v2 = sextend.i64 v0
v3 = sextend.i64 v1
v4 = icmp eq v2, v3
return v4
}
; check: v5 = icmp eq v0, v1
; check: return v5

function %slt_sextend_i16_i64(i16, i16) -> i8 {
block0(v0: i16, v1: i16):
v2 = sextend.i64 v0
v3 = sextend.i64 v1
v4 = icmp slt v2, v3
return v4
}
; check: v5 = icmp slt v0, v1
; check: return v5

function %eq_sextend_i32_i64(i32, i32) -> i8 {
block0(v0: i32, v1: i32):
v2 = sextend.i64 v0
v3 = sextend.i64 v1
v4 = icmp eq v2, v3
return v4
}
; check: v5 = icmp eq v0, v1
; check: return v5

function %slt_sextend_i32_i64(i32, i32) -> i8 {
block0(v0: i32, v1: i32):
v2 = sextend.i64 v0
v3 = sextend.i64 v1
v4 = icmp slt v2, v3
return v4
}
; check: v5 = icmp slt v0, v1
; check: return v5

function %eq_sextend_i64_i128(i64, i64) -> i8 {
block0(v0: i64, v1: i64):
v2 = sextend.i128 v0
v3 = sextend.i128 v1
v4 = icmp eq v2, v3
return v4
}
; check: v5 = icmp eq v0, v1
; check: return v5

function %slt_sextend_i64_i128(i64, i64) -> i8 {
block0(v0: i64, v1: i64):
v2 = sextend.i128 v0
v3 = sextend.i128 v1
v4 = icmp slt v2, v3
return v4
}
; check: v5 = icmp slt v0, v1
; check: return v5

function %eq_sextend_different_input_types(i8, i16) -> i8 {
block0(v0: i8, v1: i16):
v2 = sextend.i32 v0
v3 = sextend.i32 v1
v4 = icmp eq v2, v3
return v4
}
; check: v2 = sextend.i32 v0
; check: v3 = sextend.i32 v1
; check: v4 = icmp eq v2, v3
; check: return v4

function %slt_sextend_different_input_types(i8, i16) -> i8 {
block0(v0: i8, v1: i16):
v2 = sextend.i32 v0
v3 = sextend.i32 v1
v4 = icmp slt v2, v3
return v4
}
; check: v2 = sextend.i32 v0
; check: v3 = sextend.i32 v1
; check: v4 = icmp slt v2, v3
; check: return v4

function %eq_mixed_sign_and_zero_extend(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = sextend.i32 v0
v3 = uextend.i32 v1
v4 = icmp eq v2, v3
return v4
}
; check: v2 = sextend.i32 v0
; check: v3 = uextend.i32 v1
; check: v4 = icmp eq v2, v3
; check: return v4
73 changes: 73 additions & 0 deletions cranelift/filetests/filetests/egraph/icmp.clif
Original file line number Diff line number Diff line change
Expand Up @@ -1286,3 +1286,76 @@ block0(v0: i32, v1: i32):
; v7 = icmp eq v0, v6
; return v7
; }

function %eq_rotr_i32(i32, i32, i32) -> i8 {
block0(v0: i32, v1: i32, v2: i32):
v3 = rotr v0, v2
v4 = rotr v1, v2
v5 = icmp eq v3, v4
return v5
}

; function %eq_rotr_i32(i32, i32, i32) -> i8 fast {
; block0(v0: i32, v1: i32, v2: i32):
; v6 = icmp eq v0, v1
; return v6
; }

function %eq_rotr_i64(i64, i64, i64) -> i8 {
block0(v0: i64, v1: i64, v2: i64):
v3 = rotr v0, v2
v4 = rotr v1, v2
v5 = icmp eq v3, v4
return v5
}

; function %eq_rotr_i64(i64, i64, i64) -> i8 fast {
; block0(v0: i64, v1: i64, v2: i64):
; v6 = icmp eq v0, v1
; return v6
; }

function %eq_rotr_i32_i8_count(i32, i32, i8) -> i8 {
block0(v0: i32, v1: i32, v2: i8):
v3 = rotr v0, v2
v4 = rotr v1, v2
v5 = icmp eq v3, v4
return v5
}

; function %eq_rotr_i32_i8_count(i32, i32, i8) -> i8 fast {
; block0(v0: i32, v1: i32, v2: i8):
; v6 = icmp eq v0, v1
; return v6
; }

function %eq_rotr_different_counts(i32, i32, i32, i32) -> i8 {
block0(v0: i32, v1: i32, v2: i32, v3: i32):
v4 = rotr v0, v2
v5 = rotr v1, v3
v6 = icmp eq v4, v5
return v6
}

; function %eq_rotr_different_counts(i32, i32, i32, i32) -> i8 fast {
; block0(v0: i32, v1: i32, v2: i32, v3: i32):
; v4 = rotr v0, v2
; v5 = rotr v1, v3
; v6 = icmp eq v4, v5
; return v6
; }

function %eq_rotr_shared(i32, i32, i32) -> i8, i32 {
block0(v0: i32, v1: i32, v2: i32):
v3 = rotr v0, v2
v4 = rotr v1, v2
v5 = icmp eq v3, v4
return v5, v3
}

; function %eq_rotr_shared(i32, i32, i32) -> i8, i32 fast {
; block0(v0: i32, v1: i32, v2: i32):
; v6 = icmp eq v0, v1
; v3 = rotr v0, v2
; return v6, v3
; }
Loading
Loading