Optimizations to egraph framework (#5391)
* Optimizations to egraph framework: - Save elaborated results by canonical value, not latest value (union value). Previously we were artificially skipping and re-elaborating some values we already had because we were not finding them in the map. - Make some changes to handling of icmp results: when icmp became I8-typed (when bools went away), many uses became `(uextend $I32 (icmp $I8 ...))`, and so patterns in lowering backends were no longer matching. This PR includes an x64-specific change to match `(brz (uextend (icmp ...)))` and similarly for `brnz`, but it also takes advantage of the ability to write rules easily in the egraph mid-end to rewrite selects with icmp inputs appropriately. - Extend constprop to understand selects in the egraph mid-end. With these changes, bz2.wasm sees a ~1% speedup, and spidermonkey.wasm with a fib.js input sees a 16.8% speedup: ``` $ time taskset 1 target/release/wasmtime run --allow-precompiled --dir=. ./spidermonkey.base.cwasm ./fib.js 1346269 taskset 1 target/release/wasmtime run --allow-precompiled --dir=. ./fib.js 2.14s user 0.01s system 99% cpu 2.148 total $ time taskset 1 target/release/wasmtime run --allow-precompiled --dir=. ./spidermonkey.egraphs.cwasm ./fib.js 1346269 taskset 1 target/release/wasmtime run --allow-precompiled --dir=. ./fib.js 1.78s user 0.01s system 99% cpu 1.788 total ``` * Review feedback.
This commit is contained in:
@@ -185,3 +185,25 @@
|
||||
(remat x))
|
||||
(rule (simplify x @ (f64const _ _))
|
||||
(remat x))
|
||||
|
||||
;; Optimize icmp-of-icmp.
|
||||
(rule (simplify (icmp ty
|
||||
(IntCC.NotEqual)
|
||||
(uextend _ inner @ (icmp ty _ _ _))
|
||||
(iconst _ (u64_from_imm64 0))))
|
||||
(subsume inner))
|
||||
|
||||
(rule (simplify (icmp ty
|
||||
(IntCC.Equal)
|
||||
(uextend _ (icmp ty cc x y))
|
||||
(iconst _ (u64_from_imm64 0))))
|
||||
(subsume (icmp ty (intcc_inverse cc) x y)))
|
||||
|
||||
;; Optimize select-of-uextend-of-icmp to select-of-icmp, because
|
||||
;; select can take an I8 condition too.
|
||||
(rule (simplify
|
||||
(select ty (uextend _ c @ (icmp _ _ _ _)) x y))
|
||||
(select ty c x y))
|
||||
(rule (simplify
|
||||
(select ty (uextend _ c @ (icmp _ _ _ _)) x y))
|
||||
(select ty c x y))
|
||||
|
||||
@@ -130,5 +130,12 @@
|
||||
(bxor ty (bxor ty x k1 @ (iconst ty _)) k2 @ (iconst ty _)))
|
||||
(bxor ty x (bxor ty k1 k2)))
|
||||
|
||||
(rule (simplify
|
||||
(select ty (iconst _ (u64_from_imm64 (u64_nonzero _))) x y))
|
||||
x)
|
||||
(rule (simplify
|
||||
(select ty (iconst _ (u64_from_imm64 0)) x y))
|
||||
y)
|
||||
|
||||
;; TODO: fadd, fsub, fmul, fdiv, fneg, fabs
|
||||
|
||||
|
||||
Reference in New Issue
Block a user