common-subexpression elimination (cse)
   
    Henry Cejtin
     
    henry@sourcelight.com
       
    Tue, 24 Jul 2001 17:15:32 -0500
    
    
  
But  that  (just replacing latter occurances with the name bound to the first
result) isn't always correct.  There is, of course, side effect things  which
have  to  be duplicated, but the more serious example I was talking about was
the delay due to lambda.
Consider something like
    let val magic: (unit -> int) option ref = ref NONE
        fun f x =
               (magic := SOME (fn () => 1 div x);
                1 div x)
    in f 0
          handle _ => 0;
       valOf (! magic) ()
    end
You have to raise the exception twice.