Deoptimized calls fail in Cog (was Re: [squeak-dev] The Trunk:
Compiler-nice.189.mcz)
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Thu Mar 3 11:09:50 UTC 2011
2011/3/3 Juan Vuletich <juan at jvuletich.org>:
> Hi Folks,
>
> This works great with the examples provided earlier. But a bit more of
> testing show new issues (this new issues happen both with Cog and the
> interpreter):
>
> true
> ifTrue: [ Transcript cr; show: 'was true' ];
> ifFalse: [ Transcript cr; show: 'was false' ];
> ifTrue: [ Transcript cr; show: 'was true2' ] ifFalse: [ Transcript cr;
> show: 'was false2' ];
> ifFalse: [ Transcript cr; show: 'was false3' ] ifTrue: [ Transcript cr;
> show: 'was true3' ]
>
Thanks for testing.
I have not an image under my eyes, but I think that inlining probably
swap arguments in place.
Thus it also modifies the originalArguments.
Thus we must make a copy somewhere.
Nicolas
> prints:
> was true
> was true2
> was false3
>
> and this code:
> 7
> ifNil: [Transcript cr; show: 'nil' ];
> ifNotNil: [ Transcript cr; show: 'not nil' ];
> ifNil: [Transcript cr; show: 'nil2' ] ifNotNil: [ Transcript cr; show:
> 'not nil2' ];
> ifNotNil: [ Transcript cr; show: 'not nil3' ] ifNil: [Transcript cr;
> show: 'nil3' ]
>
> prints:
> not nil
> not nil2
> nil3
>
> Besides, if these expressions are put in a method, and I decompile it, and I
> get a dnu when decompiling the #ifTrue:ifFalse: call (UndefinedObject dnu
> #isMessage:receiver:arguments:). I remove that call, and I get swapped the
> blocks in the #ifNotNil:ifNil: and the #:ifFalse:ifTrue: calls.
>
> Thanks,
> Juan Vuletich
>
> Eliot Miranda wrote:
>>
>> Looks good to me. Thanks, Nicolas!
>>
>> On Wed, Mar 2, 2011 at 3:12 PM, Nicolas Cellier
>> <nicolas.cellier.aka.nice at gmail.com
>> <mailto:nicolas.cellier.aka.nice at gmail.com>> wrote:
>>
>> Oops, I always forget to select changes before filing out...
>>
>> Nicolas
>>
>> 2011/3/3 Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com
>> <mailto:nicolas.cellier.aka.nice at gmail.com>>:
>> > Then attached proof of concept may work.
>> >
>> > Nicolas
>> >
>> > 2011/3/3 Eliot Miranda <eliot.miranda at gmail.com
>> <mailto:eliot.miranda at gmail.com>>:
>> >>
>> >>
>> >> On Wed, Mar 2, 2011 at 3:02 PM, Nicolas Cellier
>> >> <nicolas.cellier.aka.nice at gmail.com
>> <mailto:nicolas.cellier.aka.nice at gmail.com>> wrote:
>> >>>
>> >>> One dumb way would be to retain a copy of
>> >>> originalSelector & originalArguments in MethodNode ivar at
>> creation,
>> >>> then let #ensureCanCascade: restore the originals.
>> >>
>> >> I like this. Not at all dumb.
>> >>
>> >>>
>> >>> Nicolas
>> >>>
>> >>> 2011/3/2 Eliot Miranda <eliot.miranda at gmail.com
>> <mailto:eliot.miranda at gmail.com>>:
>> >>> >
>> >>> >
>> >>> > On Wed, Mar 2, 2011 at 1:52 PM, Juan Vuletich
>> <juan at jvuletich.org <mailto:juan at jvuletich.org>>
>> >>> > wrote:
>> >>> >>
>> >>> >> Hi Eliot,
>> >>> >>
>> >>> >> Thanks for caring!
>> >>> >>
>> >>> >> The attached code fixed the case I reported first, but not
>> this:
>> >>> >>
>> >>> >> true ifTrue: [ 'was true' print ]; ifFalse: [ 'not true'
>> print ]
>> >>> >
>> >>> > Does the second one have to be unoptimized? I guess that in
>> this both
>> >>> > are
>> >>> > deoptimized right?
>> >>> >
>> >>> > true ifTrue: [ 'was true' print ]; ifFalse: [ 'not true'
>> print ];
>> >>> > yourself
>> >>> >>
>> >>> >> Thanks,
>> >>> >> Juan Vuletich
>> >>> >>
>> >>> >> Eliot Miranda wrote:
>> >>> >>>
>> >>> >>> Hi Juan,
>> >>> >>>
>> >>> >>> I think the deoptimize-after-the-fact approach has no
>> hope of
>> >>> >>> working
>> >>> >>> given the transformations for ifFalse:ifTrue: (swap
>> arguments and
>> >>> >>> transform
>> >>> >>> to ifTrue:ifFalse:), ifNil:ifNotNil: et al. Better is to
>> avoid
>> >>> >>> transforming
>> >>> >>> at all if in a cascade. So the attached is a start. It needs
>> >>> >>> cleaning up,
>> >>> >>> the older hack (ensureCanCascade:) removing and either all
>> uses of
>> >>> >>> receiver:selector:arguments:precedence:from:sourceRange:
>> should use
>> >>> >>>
>> receiver:selector:arguments:precedence:from:sourceRange:canTransform:,
>> >>> >>> or
>> >>> >>> implement
>> receiver:selector:arguments:precedence:from:sourceRange in
>> >>> >>> terms
>> >>> >>> of
>> >>> >>>
>> receiver:selector:arguments:precedence:from:sourceRange:canTransform.
>> >>> >>> Anyway, test this and see how you get on.
>> >>> >>>
>> >>> >>> cheers,
>> >>> >>> Eliot
>> >>> >>>
>> >>> >>> On Wed, Mar 2, 2011 at 11:46 AM, Juan Vuletich
>> <juan at jvuletich.org <mailto:juan at jvuletich.org>
>> >>> >>> <mailto:juan at jvuletich.org <mailto:juan at jvuletich.org>>>
>> wrote:
>> >>> >>>
>> >>> >>> Hi Folks,
>> >>> >>>
>> >>> >>> commits at source.squeak.org
>> <mailto:commits at source.squeak.org>
>> <mailto:commits at source.squeak.org
>> <mailto:commits at source.squeak.org>> wrote:
>> >>> >>>
>> >>> >>> Nicolas Cellier uploaded a new version of Compiler
>> to project
>> >>> >>> The Trunk:
>> >>> >>> http://source.squeak.org/trunk/Compiler-nice.189.mcz
>> >>> >>>
>> >>> >>> ==================== Summary ====================
>> >>> >>>
>> >>> >>> Name: Compiler-nice.189
>> >>> >>> Author: nice
>> >>> >>> Time: 13 February 2011, 7:44:38.363 pm
>> >>> >>> UUID: 3f6f02cd-1acf-48de-a388-b5ac55e27055
>> >>> >>> Ancestors: Compiler-nice.188
>> >>> >>>
>> >>> >>> Enable cascading of special messages by
>> deoptimizing, thanks
>> >>> >>> Eliot.
>> >>> >>> This is mostly useless, but it removes an arbitrary
>> limitation
>> >>> >>> of the language.
>> >>> >>>
>> >>> >>> =============== Diff against Compiler-nice.188
>> ===============
>> >>> >>>
>> >>> >>> I integrated this nice code in Cuis, and tried:
>> >>> >>>
>> >>> >>> true ifTrue: [ Transcript cr; show: 'was true' ]; yourself
>> >>> >>>
>> >>> >>> I found that this works ok with the interpreter but
>> does nothing
>> >>> >>> in Cog. A bug, right?
>> >>> >>>
>> >>> >>> Cheers,
>> >>> >>> Juan Vuletich
>> >>> >>>
>> >>> >>>
>> >>> >>>
>> >>> >>>
>>
>> ------------------------------------------------------------------------
>> >>> >>>
>> >>> >>>
>> >>> >>>
>> >>> >>>
>> >>> >>>
>>
>> ------------------------------------------------------------------------
>> >>> >>>
>> >>> >>> No virus found in this message.
>> >>> >>> Checked by AVG - www.avg.com <http://www.avg.com>
>> <http://www.avg.com>
>> >>> >>> Version: 10.0.1204 / Virus Database: 1435/3477 - Release Date:
>> >>> >>> 03/02/11
>> >>> >>>
>> >>> >>
>> >>> >>
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>>
>> >>
>> >>
>> >>
>> >>
>> >>
>> >
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> No virus found in this message.
>> Checked by AVG - www.avg.com <http://www.avg.com>
>> Version: 10.0.1204 / Virus Database: 1435/3477 - Release Date: 03/02/11
>>
>
>
>
More information about the Squeak-dev
mailing list
|