Summary
fixnum arithmetic is ignored
Metadata
- Id: acfd26ee7cc1088326d426645d069448f61fa187
- Trac id: 1604
- Type: defect
- Reporter: sjamaan
- Owner:
- Cc:
- Status: closed
- Component: compiler
- Estimated difficulty: medium
- Resolution: fixed
- Priority: major
- Milestone: 5.1
- Version: 5.0.0
- Changetime: 2019-05-29 16:41:33 UTC
- Created: 2019-04-10 10:52:32 UTC
- Keywords:
Description
As reported by chickendan on IRC:
;; csc -O5 -strict-types -fixnum-arithmetic: 7.964s
;; csc -O5 -strict-types: 8.105s
;; csc -O5 -strict-types (and fx functions): 0.246s
;;; c/nim -O3 baseline: 0.211s
(define (fib n)
(if (or (= n 0) (= n 1))
n
(+ (fib (- n 1)) (fib (- n 2)))))
(let loop ((n 0))
(when (< n 35)
(print "n=" n " => " (fib n))
(loop (+ n 1))))
This program should use fixnum ops when declaring fixnum arithmetic. Also, when wrapping `fib`'s body in an `assume`, it still compiles to `C_s_a_i_plus` calls rather than `C_a_i_fixnum_plus` or even just `C_s_a_u_i_integer_plus`.
I think we should take a look before releasing 5.1, the fact `fixnum-arithmetic` is ignored may not be a big issue, but it is rather worrying that the specializations aren't used.
Changes and comments
[2019-04-10 10:52:59 UTC] sjamaan changed description
[2019-04-10 11:22:51 UTC] megane wrote:
The scrutinizer cannot handle recursion. The type of `fib` is `*` inside `fib`. This leads to the `+` being called with `*` arguments, so no specialization can happen.
You can wrap the body of `fib` in `assume` with `fib` declared as `(fixnum -> fixnum)`. I get `C_a_i_fixnum_plus` specializations with master this way.
Maybe `fixnum-arithmetic` is still broken, though.
[2019-05-29 16:41:33 UTC] sjamaan changed status from new to closed
[2019-05-29 16:41:33 UTC] sjamaan set resolution to fixed
[2019-05-29 16:41:33 UTC] sjamaan wrote:
The worst of this has been fixed by removing the scrutiny rewrites for `(* *)` in bc72c05f.
I've created new tickets to fix the remaining issues in 5.2 and beyond: See #1619 and #1620.