Skip to content
This repository was archived by the owner on Sep 8, 2025. It is now read-only.

Commit 0e7fc1c

Browse files
authored
add rule and tests (#10978)
1 parent beca86b commit 0e7fc1c

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

cranelift/codegen/src/opts/skeleton.isle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,11 @@
3636
;; (rule (simplify_skeleton (sdiv _ (iconst_s ty 0)))
3737
;; (replace_with_val (trap (trap_code_division_by_zero))
3838
;; (iconst_s ty 0)))
39+
40+
(rule
41+
(simplify_skeleton (udiv y
42+
(select ty
43+
x
44+
(iconst ty (imm64_power_of_two n))
45+
(iconst ty (imm64_power_of_two m)))))
46+
(ushr ty y (select ty x (iconst ty (imm64 n)) (iconst ty (imm64 m)))))
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
test optimize precise-output
2+
set opt_level=speed
3+
target x86_64
4+
5+
6+
;; Case 1: i32 type, different powers of two
7+
function %udiv_select_pow2_to_ushr_select_exp_i32(i32, i8) -> i32 {
8+
block0(v0: i32, v1: i8):
9+
v2 = iconst.i32 8 ;; 2^3 (n=3)
10+
v3 = iconst.i32 32 ;; 2^5 (m=5)
11+
v4 = select v1, v2, v3 ;; divisor = v1 ? 8 : 32
12+
v5 = udiv v0, v4
13+
return v5
14+
}
15+
16+
; function %udiv_select_pow2_to_ushr_select_exp_i32(i32, i8) -> i32 fast {
17+
; block0(v0: i32, v1: i8):
18+
; v6 = iconst.i32 3
19+
; v7 = iconst.i32 5
20+
; v8 = select v1, v6, v7 ; v6 = 3, v7 = 5
21+
; v9 = ushr v0, v8
22+
; v5 -> v9
23+
; return v9
24+
; }
25+
26+
function %udiv_select_pow2_to_ushr_select_exp_i64(i64, i8) -> i64 {
27+
block0(v0: i64, v1: i8):
28+
v2 = iconst.i64 1 ;; 2^0 (n=0)
29+
v3 = iconst.i64 16 ;; 2^4 (m=4)
30+
v4 = select v1, v2, v3 ;; divisor = x ? 1 : 16
31+
v5 = udiv v0, v4
32+
return v5
33+
}
34+
35+
; function %udiv_select_pow2_to_ushr_select_exp_i64(i64, i8) -> i64 fast {
36+
; block0(v0: i64, v1: i8):
37+
; v6 = iconst.i64 0
38+
; v7 = iconst.i64 4
39+
; v8 = select v1, v6, v7 ; v6 = 0, v7 = 4
40+
; v9 = ushr v0, v8
41+
; v5 -> v9
42+
; return v9
43+
; }
44+

0 commit comments

Comments
 (0)