(very) rough draft

Matthew Fluet fluet@CS.Cornell.EDU
Wed, 21 Feb 2001 17:21:14 -0500 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-758783491-982794074=:18617
Content-Type: TEXT/PLAIN; charset=US-ASCII


Here's a rough draft of the framework, half of the transformation, and the
analyses sections.  I'll point out a few of the relevant changes:

1. The collection of tail and nontail calls are multisets.  I motivate
this by relating it to a reasonable implementation in which the sets are
never explicitly calculated; instead you iterate over the program. 

2. I added a function Dec: Jump -> Fun which relates a jump to its
declaring function.  Simple enough and it's useful to define cyclic and I
think it will be helpful in defining the transformation.

3. I thought the name Return would be more appropriate than RCont.  It
differentiates the term from what's used in Reppy's paper.  Also, I think
it's more accurate; a function either returns to a continuation or to a
function.

4. Safety now includes the condition
    *1 if not(Reach(f)), then A(f) = Uncalled
4.1 This meant eliminating the totally trivial analysis A(f) = Unknown,
because it wouldn't be safe.
4.2 This also meant that I could prove the lemma  
Reach(f) iff A(f) <> Uncalled for any safe analysis, instead of just for
Adom.
4.3 This in turn meant that we could return to the simple definition of
minimality: a safe analysis A is minimal if for all safe analyses B and
all f in Fun, B(f) <> Unknown => A(f) <> Unknown.   The old clause B(f) =
Uncalled => A(f) = Uncalled is implied by the previous lemma because both
A and B are safe analyses.

5. The change to safety also means that any safe analysis is acyclic.  I
also went to the most general definition of cyclic that I could think of:

An analysis A is cyclic if there exists l0,...,ln in Jump U Fun such that
l0 = ln and for each 0 <= i < n either (1) li in Fun and A(li) = li+1 or
(2) li in Jump and Dec(li) = li+1.

(Essentially, this allows cycles to run through the call graph of nontail
calls.)

5.1 I also moved the definition of cyclic to the transformation section.
Safety is a good concept for analyses, because you can just run through
the four conditions to prove that an analysis is safe.  Cyclicity is a
good concept for transformations, because cycles are what lead to
nonsensical transformations.



---559023410-758783491-982794074=:18617
Content-Type: APPLICATION/octet-stream; name="contify.tgz"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.1010221172114.18617D@hoho.cs.cornell.edu>
Content-Description: 

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

---559023410-758783491-982794074=:18617--