Nicholas Clark writes:
> On Mon, Sep 15, 2003 at 11:19:22AM -0400, Dan Sugalski wrote:
> 
> > Changing a function from pure to impure, adding an overloaded operator, or 
> > changing the core structure of a class can all result in code that needs 
> > regeneration. That's no big deal for code you haven't executed yet, but if 
> > you have:
> > 
> >     a = 1;
> >     b = 12;
> >     foo();
> >     c = a + b;
> 
> > but if foo changes the rules of the game (adding an overloaded + to a or
> > b's class) then the code in that sub could be incorrect.
> > 
> > You can, of course, stop even potential optimization once the first "I can 
> > change the rules" operation is found, but since even assignment can change 
> > the rules that's where we are right now. We'd like to get better by 
> > optimizing based on what we can see at compile time, but that's a very, 
> > very difficult thing to do.
> 
> Sorry if this is a crack fuelled idea, and sorry that I don't have a patch
> handy to implement it, but might the following work:
> 
> 0: retain the original bytecode
> 1: JIT the above subroutine as if a and b remain integers
>    However, at all the "change the world" points
>    (presumably they are de facto sequence points, and will we need to
>     take the concept from C?)
>    put an op in the JIT stream "check if world changed"
> 2: If the world has changed, jump out of the JIT code back into the
>    bytecode interpreter at that point

No, I think Parrot will still only JIT I&N registers.  Optimization
includes way more than just JIT.

I was thinking, the compiler could emit two functions:  one that works
on regular PMC's, and one that works with I registers.  The latter would
then be JITted as usual, and JIT doesn't need to do anything special.

The focus here, I think, is the following problem class:

    sub twenty_five() { 25 }    # Optimized to inline
    sub foo() {
        print twenty_five;      # Inlined
        &twenty_five := { 36 };
        print twenty_five;      # Uh oh, inlined from before
    }

The problem is we need to somehow un-optimize while we're running.  That
is most likely a very very hard thing to do, so another solution is
probably needed.

Luke

Reply via email to