Login  Register

Re: A minor issue with register allocator

Posted by Bryce Kampjes on Jul 02, 2007; 10:02pm
URL: https://forum.world.st/A-minor-issue-with-register-allocator-tp133467p133473.html

sig writes:
 > Another observation:
 >
 > Something prevents to make full optimisation of following intermediate
 >
 > #(#block 1 #(#push #ebp) #(#mov #esp #ebp))
 > #(#block 3 #(#mov #(#mem #(#add #ebp -4)) 't1') #(#mov #(#mem #(#add
 > #ebp -8)) 't2'))
 > #(#block 5 #(#mov #(#add 't1' 't2') 't3') #(#jmp #block4))
 > #(#block 4)
 > #(#block 6 #(#mov 't3' #eax) #(#jmp #block2))
 > #(#block 2 #(#mov #ebp #esp) #(#pop #ebp) #(#ret))
 >
 > into just:
 > #(#(#block 1 #(#push #ebp) #(#mov #esp #ebp))
 > #(#block 3 #(#mov #(-8 #ebp) #eax) #(#add #(-4 #ebp) #eax))
 > #(#block 2 #(#mov #ebp #esp) #(#pop #ebp) #(#ret)))
 >
 > it generates following instead:
 > #(#(#block 1 #(#push #ebp) #(#mov #esp #ebp))
 > #(#block 3 #(#mov #(-4 #ebp) #ebx) #(#mov #(-8 #ebp) #eax))
 > #(#block 5 #(#add #ebx #eax))
 > #(#block 4)
 > #(#block 6)
 > #(#block 2 #(#mov #ebp #esp) #(#pop #ebp) #(#ret)))
 >
 > which uses 1 extra register and 1 more instruction comparing to
 > previous output. Its not very important, i'm just curious what can
 > prevent it from optimizing ? is this because movs and add placed in
 > separate blocks, or because there is jumps (which is removed later,
 > but prevent to fully optimize the code)? Maybe its better to put jumps
 > remover before register allocation?

I'm guessing the question is why's (add ebx eax) a simple instruction
rather (add (-4 ebp) eax) thus potentually saving the instruction
and the register used to load (-4 eax).

The answer is the instruction selector only looks at the expression
trees, it doesn't do whole method analysis so because (-4 eax) is
loaded into a register it doesn't recognise that it's only used in
one place.

Bryce
_______________________________________________
Exupery mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/exupery