Files
wasmtime/cranelift/filetests/filetests/egraph/algebraic.clif
Jamey Sharp ac4d28f4dd Constant-fold icmp instructions (#5666)
We found examples of icmp instructions with both operands constant in
spidermonkey.wasm.
2023-02-01 21:55:36 +00:00

213 lines
4.3 KiB
Plaintext

test optimize
set opt_level=speed
set use_egraphs=true
target x86_64
function %f0(i32) -> i32 {
block0(v0: i32):
v1 = iconst.i32 2
v2 = imul v0, v1
; check: v5 = ishl v0, v4 ; v4 = 1
; check: return v5
return v2
}
function %f1() -> i64 {
block0:
v0 = iconst.i32 0xffff_ffff_9876_5432
v1 = uextend.i64 v0
return v1
; check: v2 = iconst.i64 0x9876_5432
; check: return v2 ; v2 = 0x9876_5432
}
function %unsigned_shift_right_shift_left_i8(i8) -> i8 {
block0(v0: i8):
v1 = iconst.i8 5
v2 = ushr v0, v1
v3 = ishl v2, v1
return v3
; check: v4 = iconst.i8 224
; check: v5 = band v0, v4
; return v5
}
function %unsigned_shift_right_shift_left_i32(i32) -> i32 {
block0(v0: i32):
v1 = iconst.i32 5
v2 = ushr v0, v1
v3 = ishl v2, v1
return v3
; check: v4 = iconst.i32 0xffff_ffe0
; check: v5 = band v0, v4
; check: return v5
}
function %unsigned_shift_right_shift_left_i64(i64) -> i64 {
block0(v0: i64):
v1 = iconst.i64 5
v2 = ushr v0, v1
v3 = ishl v2, v1
return v3
; check: v4 = iconst.i64 -32
; check: v5 = band v0, v4
; return v5
}
function %signed_shift_right_shift_left_i8(i8) -> i8 {
block0(v0: i8):
v1 = iconst.i8 5
v2 = sshr v0, v1
v3 = ishl v2, v1
return v3
; check: v4 = iconst.i8 224
; check: v5 = band v0, v4
; return v5
}
function %signed_shift_right_shift_left_i32(i32) -> i32 {
block0(v0: i32):
v1 = iconst.i32 5
v2 = sshr v0, v1
v3 = ishl v2, v1
return v3
; check: v4 = iconst.i32 0xffff_ffe0
; check: v5 = band v0, v4
; return v5
}
function %signed_shift_right_shift_left_i64(i64) -> i64 {
block0(v0: i64):
v1 = iconst.i64 5
v2 = sshr v0, v1
v3 = ishl v2, v1
return v3
; check: v4 = iconst.i64 -32
; check: v5 = band v0, v4
; return v5
}
function %or_and_y_with_not_y_i8(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = band v0, v1
v3 = bnot v1
v4 = bor v2, v3
return v4
; check: v5 = bor v0, v3
; check: return v5
}
function %or_and_constant_with_not_constant_i8(i8) -> i8 {
block0(v0: i8):
v1 = iconst.i8 -4
v2 = band v0, v1
v3 = iconst.i8 3
v4 = bor v2, v3
return v4
; check: v5 = bor v0, v3
; check: return v5
}
function %or_and_y_with_not_y_i8(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = band v0, v1
v3 = bnot v1
v4 = bor v3, v2
return v4
; check: v5 = bor v0, v3
; check: return v5
}
function %or_and_constant_with_not_constant_i8(i8) -> i8 {
block0(v0: i8):
v1 = iconst.i8 -4
v2 = band v0, v1
v3 = iconst.i8 3
v4 = bor v3, v2
return v4
; check: v6 = bor v0, v3
; check: return v6
}
function %or_and_constant_with_any_constant_should_not_apply_rule_i8(i8) -> i8 {
block0(v0: i8):
v1 = iconst.i8 -4
v2 = band v0, v1
;; `v3` is not `bnot(v1)` so the rewrite should not apply.
v3 = iconst.i8 -5
v4 = bor v2, v3
return v4
; check: return v4
}
function %or_and_y_with_not_y_i64(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = band v0, v1
v3 = bnot v1
v4 = bor v2, v3
return v4
; check: v5 = bor v0, v3
; check: return v5
}
function %or_and_constant_with_not_constant_i64(i64) -> i64 {
block0(v0: i64):
v1 = iconst.i64 -4
v2 = band v0, v1
v3 = iconst.i64 3
v4 = bor v2, v3
return v4
; check: v5 = bor v0, v3
; check: return v5
}
function %or_and_y_with_not_y_i64(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = band v0, v1
v3 = bnot v1
v4 = bor v3, v2
return v4
; check: v5 = bor v0, v3
; check: return v5
}
function %or_and_constant_with_not_constant_i64(i64) -> i64 {
block0(v0: i64):
v1 = iconst.i64 -4
v2 = band v0, v1
v3 = iconst.i64 3
v4 = bor v3, v2
return v4
; check: v6 = bor v0, v3
; check: return v6
}
function %or_and_constant_with_any_constant_should_not_apply_rule_i64(i64) -> i64 {
block0(v0: i64):
v1 = iconst.i64 -4
v2 = band v0, v1
;; `v3` is not `bnot(v1)` so the rewrite should not apply.
v3 = iconst.i64 -5
v4 = bor v2, v3
return v4
; check: return v4
}
function %f2(i8) -> i8 {
block0(v1: i8):
v2 = icmp eq v1, v1
return v2
}
; check: v3 = iconst.i8 1
; check: return v3
function %f3(i8) -> i8 {
block0(v1: i8):
v2 = icmp ne v1, v1
return v2
}
; check: v3 = iconst.i8 0
; check: return v3