Number: 2029

Date: 31-Aug-84 10':37':36

Submitter: Sannella.PA

Source: Kahn.pa

Subject: Compiler doesn''t notice Tail recursion if PROG vars initialized

Assigned To: 

Attn: 

Status: Declined

In/By: 

Problem Type: Performance

Impact: Moderate

Difficulty: 

Frequency: 

Priority: Hopefully

System: Language Support

Subsystem: Compiler, Code Format

Machine: 

Disk: 

Lisp Version: 27-Aug-84 21':14':00

Source Files: 

Microcode Version: 5124

Memory Size: 3071

File Server: 

Server Software Version: 

Disposition: From': masinter.pa'
Date': 31-Aug-84 18':31':08 PDT'
Subject': "That''s not a bug-- its a feature!"'
To': Kahn'
cc': LispSupport, Bobrow'
'
The compiler cannot tell, in the first of your two examples below, that (FIE) does not use the variable A freely. If it were to use A freely, then tail recursion removal would cause it to see the wrong binding.'
'
Both examples *would* compile with tail recursion if either you declared A to be a localvar, or else (FIE) in fact consisted only of expressions that the compiler knew could access no free vriables. (There is currently no documented user interface for extending that set although it is easy.)'
'
'
["Masinter" " 2-Sep-84 14':46':32" Attn': Status':(Open->Declined) Machine':(1108->) Disposition':]

Description: '
Date': 30 Aug 84 17':06 PDT'
From': Kahn.pa'
Subject': Lisp': Tail recursion not noticed'
To': LispSupport.pa'
cc': Kahn.pa, Bobrow'
'
Lisp System Date': 23-Aug-84 18':52':49'
Machine': Dorado (DewDrop)'
Microcode version': 24,4'
Memory size': 10000'
Frequency': Always'
Impact': Serious'
'
The following function does not compile tail recursively'
'
(DEFINEQ (FOO (LAMBDA (X)'
   (PROG ((A (FIE)))'
     (COND (A (RETURN (FOO (SUB1 X))))'
                (T (RETURN T)]'
'
while the following version does'
'
(DEFINEQ (FOO (LAMBDA (X)'
   (PROG (A) (SETQ A (FIE))'
     (COND (A (RETURN (FOO (SUB1 X))))'
                (T (RETURN T)]'
'


Workaround: 

Test Case: 

Edit-By: Masinter

Edit-Date:  2-Sep-84 14':46':36