Wanted: constant folding in arithmetic functions
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
SBCL |
Fix Released
|
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))
description: | updated |
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 |
Changed in sbcl: | |
status: | Fix Committed → Fix Released |
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?