# Wanted: constant folding in arithmetic functions

Bug #676414 reported by Heka Treep on 2010-11-17
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Wishlist
Unassigned

### Bug Description

Currently, Python does not reduce the constants in expressions such as:

(+ 3 a 5 b 7 c)

For fixnums this gives:

; A7: 83C203 ADD EDX, 3
; AA: 83C205 ADD EDX, 5
; AD: C1FF02 SAR EDI, 2
; B0: 01FA ADD EDX, EDI
; B2: 83C207 ADD EDX, 7
; B5: C1FE02 SAR ESI, 2
; B8: 8D0432 LEA EAX, [EDX+ESI]
; BB: 6BD004 IMUL EDX, EAX, 4
; BE: 7107 JNO L0
; C0: 8BD0 MOV EDX, EAX

and for generic numbers this generate five calls to GENERIC-+.

It would be nice to collect all numbers at compile-time, doing the following transformation:

(+ 3 a 5 b 7 c) -> (+ 15 a b c)

schematically:

(+ list) -> `(+ ,(fold-left '+ identity (filter const-p list))
,@(filter not-const-p list))

Tags: Edit Tag help
Heka Treep (zena-treep) on 2010-11-17
 description: updated
 Heka Treep (zena-treep) wrote on 2010-11-17: #1

I wrote a simple version. In the attached patch constants are collected by calling the `reduce-constants' function from the `source-transform-transitive' and `source-transform-intransitive' functions (which is used by `define-source-transform' forms for transitive and intransitive arithmetic functions) form compiler/srctran.lisp.

It works fine for building process and tests, but when I see this comment:

;;; Only safely applicable for exact numbers. For floating-point
;;; x, one would have to first show that neither x or y are signed
;;; 0s, and that x isn't an SNaN.

for (+ X 0) folder - it is safely to collect all type of numbers in compile time?

 Changed in sbcl: importance: Undecided → Wishlist status: New → Triaged tags: added: review Changed in sbcl: assignee: nobody → Nikodemus Siivola (nikodemus)
 tags: removed: review Changed in sbcl: status: Triaged → In Progress
 Nikodemus Siivola (nikodemus) wrote on 2011-02-12: #2

In 1.0.45.25.

 Changed in sbcl: assignee: Nikodemus Siivola (nikodemus) → nobody status: In Progress → Fix Committed
 Changed in sbcl: status: Fix Committed → Fix Released