File tree Expand file tree Collapse file tree 2 files changed +26
-0
lines changed
filetests/filetests/runtests Expand file tree Collapse file tree 2 files changed +26
-0
lines changed Original file line number Diff line number Diff line change 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))))
Original file line number Diff line number Diff line change 11test interpret
22test run
3+ ;; if opt_level=none, none of the constant denominator optimisations fire
4+ set opt_level=speed
35target aarch64
46target s390x
57target 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+
You can’t perform that action at this time.
0 commit comments