Skip to content

Commit b450924

Browse files
authored
Fix divide-by-zero during optimizations (#12014)
This commit fixes a minor regression from #11994 where a divide-by-zero was happening in a fuzz-generated input.
1 parent 9174fcf commit b450924

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

cranelift/codegen/src/opts/arithmetic.isle

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -350,45 +350,43 @@
350350
;; (x * C) (==/!=) D --> x (==/!=) (D / C) when C is odd and divides D
351351
(rule
352352
(simplify (ne ty (iconst_u ty1 x) (imul ty1 y (iconst_u ty1 z))))
353-
(if-let 0 (u64_rem x z))
353+
(if-let 0 (u64_checked_rem x z))
354354
(if-let 1 (u64_rem z 2))
355355
(ne ty y (iconst ty1 (imm64 (u64_div x z)))))
356356
(rule
357357
(simplify (ne ty (iconst_u ty1 x) (imul ty1 (iconst_u ty1 y) z)))
358-
(if-let 0 (u64_rem x y))
358+
(if-let 0 (u64_checked_rem x y))
359359
(if-let 1 (u64_rem y 2))
360360
(ne ty z (iconst ty1 (imm64 (u64_div x y)))))
361361
(rule
362362
(simplify (ne ty (imul ty1 x (iconst_u ty1 y)) (iconst_u ty1 z)))
363-
(if-let 0 (u64_rem z y))
363+
(if-let 0 (u64_checked_rem z y))
364364
(if-let 1 (u64_rem y 2))
365365
(ne ty x (iconst ty1 (imm64 (u64_div z y)))))
366366
(rule
367367
(simplify (ne ty (imul ty1 (iconst_u ty1 x) y) (iconst_u ty1 z)))
368-
(if-let 0 (u64_rem z x))
368+
(if-let 0 (u64_checked_rem z x))
369369
(if-let 1 (u64_rem x 2))
370370
(ne ty y (iconst ty1 (imm64 (u64_div z x)))))
371371

372372

373373
(rule
374374
(simplify (eq ty (iconst_u ty1 x) (imul ty1 y (iconst_u ty1 z))))
375-
(if-let 0 (u64_rem x z))
375+
(if-let 0 (u64_checked_rem x z))
376376
(if-let 1 (u64_rem z 2))
377377
(eq ty y (iconst ty1 (imm64 (u64_div x z)))))
378378
(rule
379379
(simplify (eq ty (iconst_u ty1 x) (imul ty1 (iconst_u ty1 y) z)))
380-
(if-let 0 (u64_rem x y))
380+
(if-let 0 (u64_checked_rem x y))
381381
(if-let 1 (u64_rem y 2))
382382
(eq ty z (iconst ty1 (imm64 (u64_div x y)))))
383383
(rule
384384
(simplify (eq ty (imul ty1 x (iconst_u ty1 y)) (iconst_u ty1 z)))
385-
(if-let 0 (u64_rem z y))
385+
(if-let 0 (u64_checked_rem z y))
386386
(if-let 1 (u64_rem y 2))
387387
(eq ty x (iconst ty1 (imm64 (u64_div z y)))))
388388
(rule
389389
(simplify (eq ty (imul ty1 (iconst_u ty1 x) y) (iconst_u ty1 z)))
390-
(if-let 0 (u64_rem z x))
390+
(if-let 0 (u64_checked_rem z x))
391391
(if-let 1 (u64_rem x 2))
392392
(eq ty y (iconst ty1 (imm64 (u64_div z x)))))
393-
394-
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
(module
2+
(func (result i32)
3+
(local i64 i32 i32)
4+
i32.const 1
5+
i32.clz
6+
i32.clz
7+
i32.popcnt
8+
i64.extend_i32_s
9+
local.get 0
10+
i64.mul
11+
local.get 0
12+
i64.mul
13+
i32.wrap_i64
14+
i64.extend_i32_s
15+
local.get 1
16+
local.get 0
17+
i32.const 1
18+
i32.clz
19+
i32.clz
20+
i32.popcnt
21+
i64.extend_i32_s
22+
i64.mul
23+
i64.const 0
24+
i64.eq
25+
i32.rotl
26+
i64.extend_i32_s
27+
i64.mul
28+
i32.wrap_i64
29+
)
30+
)

0 commit comments

Comments
 (0)