|
| 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