Opened 3 months ago

Closed 7 weeks 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 sjamaan)

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 3 months ago by sjamaan

  • Description modified (diff)

comment:2 Changed 3 months ago by megane

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.

comment:3 Changed 7 weeks ago by sjamaan

  • Resolution set to fixed
  • Status changed from new to closed

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.

Note: See TracTickets for help on using tickets.