Skip to content

Commit f95d2da

Browse files
fix(cranelift): fix sdiv by most negative number (#11931)
Co-authored-by: Thomas Athorne <thomas.athorne@trili.tech>
1 parent 1f2feaf commit f95d2da

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

cranelift/codegen/src/opts/arithmetic.isle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@
8686
;; Signed `x / d` when d is a power of two is a bit more involved...
8787
(rule (simplify_skeleton (sdiv x (iconst_u ty (u64_extract_power_of_two d))))
8888
(if-let true (u64_gt d 1))
89+
;; This rule musn't fire for the most negative number - which looks like
90+
;; a power of two (sign bit set and otherwise all zeros)
91+
(if-let true (u32_lt (u64_trailing_zeros d)
92+
(u32_sub (ty_bits ty) 1)))
8993
(let ((k u32 (u64_trailing_zeros d))
9094
(t1 Value (sshr ty x (iconst_u ty (u32_sub k 1))))
9195
(t2 Value (ushr ty t1 (iconst_u ty (u32_sub (ty_bits ty) k))))

cranelift/filetests/filetests/runtests/sdiv.clif

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
test interpret
22
test run
3+
;; if opt_level=none, none of the constant denominator optimisations fire
4+
set opt_level=speed
35
target aarch64
46
target s390x
57
target riscv64
@@ -190,3 +192,23 @@ block0(v0: i64):
190192
; run: %sdiv_by_const_neg_1337_i64(-56155) == 42
191193
; run: %sdiv_by_const_neg_1337_i64(-57490) == 42
192194
; run: %sdiv_by_const_neg_1337_i64(-57491) == 43
195+
196+
function %sdiv_by_const_neg_i64min_i64(i64) -> i64 {
197+
block0(v0: i64):
198+
v1 = iconst.i64 -9223372036854775808
199+
v2 = sdiv v0, v1
200+
return v2
201+
}
202+
203+
; run: %sdiv_by_const_neg_i64min_i64(-9223372036854775808) == 1
204+
205+
206+
function %sdiv_by_const_neg_i32min_i32(i32) -> i32 {
207+
block0(v0: i32):
208+
v1 = iconst.i32 -2147483648
209+
v2 = sdiv v0, v1
210+
return v2
211+
}
212+
213+
; run: %sdiv_by_const_neg_i32min_i32(-2147483648) == 1
214+

0 commit comments

Comments
 (0)