Opened 6 years ago
Closed 6 years ago
#1604 closed defect (fixed)
fixnum arithmetic is ignored
Reported by: | sjamaan | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | 5.1 |
Component: | compiler | Version: | 5.0.0 |
Keywords: | Cc: | ||
Estimated difficulty: | medium |
Description (last modified by )
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.
Change History (3)
comment:1 Changed 6 years ago by
Description: | modified (diff) |
---|
comment:2 Changed 6 years ago by
comment:3 Changed 6 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
Note: See
TracTickets for help on using
tickets.
The scrutinizer cannot handle recursion. The type of
fib
is*
insidefib
. This leads to the+
being called with*
arguments, so no specialization can happen.You can wrap the body of
fib
inassume
withfib
declared as(fixnum -> fixnum)
. I getC_a_i_fixnum_plus
specializations with master this way.Maybe
fixnum-arithmetic
is still broken, though.