[fpc-devel] More peephole

Martin Frb lazarus at mfriebe.de
Wed Jan 22 04:06:38 CET 2014


On 21/01/2014 23:27, Martin Frb wrote:
> On 21/01/2014 21:28, Florian Klämpfl wrote:
>> Am 20.01.2014 01:18, schrieb Martin:
>>
>>> It used
>>> (taicpu(p).oper[1]^.reg<>taicpu(hp1).oper[0]^^.ref^.base) and
>>> (taicpu(p).oper[1]^.reg<>taicpu(hp1).oper[0]^^.ref^.index) then
>>> but should only compare the supregister part
>>> I replaced that
>>> not(RegInOp(getsupreg(taicpu(p).oper[1]^.reg),taicpu(hp1).oper[0]^)) 
>>> then
>>>
>>> uncommented, and tested.
>>> It does catch a big lot of occurrences.
>> Can you post some example code? It might be worth to think about
>> improving this already in at the node level.
>>
>>
>
> I will try to find some. (I just enabled it, and put a writeln in 
> there, to see, if it was triggered. Then run the tests and buli Lazarus.

There are 100 or 1000nds of matches when compiling the IDE, not sure how 
many are triggered by the below, or by which other condition.


2 examples in below, but they only happen with -O- or -O1
In TFoo.Bar move the comment to the other statement, for 2nd example
(if init is called within Init, then different code is produced)

In both cases the 2nd register should not be needed at all. (but if 
present, is better loaded from

program project1; {$mode objfpc}
type  TFoo = class
     a,b : Integer;
     function Bar: Boolean;
     procedure Init; virtual;
   end;

function TFoo.Bar: Boolean;
begin
   Result := a = b;
//  Init;
end;
procedure TFoo.Init;  begin  end;
begin
end.

////////////   Result := a = b;
.section .text.n_p$project1$_$tfoo_$__$$_bar$$boolean,"x"
     .balign 16,0x90
.globl    P$PROJECT1$_$TFOO_$__$$_BAR$$BOOLEAN
P$PROJECT1$_$TFOO_$__$$_BAR$$BOOLEAN:
# Temps allocated between ebp-8 and ebp-8
# [project1.lpr]
# [14] begin
     pushl    %ebp
     movl    %esp,%ebp
     leal    -8(%esp),%esp
# Var $self located at ebp-4
# Var $result located at ebp-8
     movl    %eax,-4(%ebp)
# [15] Init;
     movl    -4(%ebp),%eax  // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
     movl    -4(%ebp),%edx // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
     movl    (%edx),%edx
     call    *100(%edx)
# [16] end;
     leave
     ret

///////////// INIT
.section .text.n_p$project1$_$tfoo_$__$$_bar$$boolean,"x"
     .balign 16,0x90
.globl    P$PROJECT1$_$TFOO_$__$$_BAR$$BOOLEAN
P$PROJECT1$_$TFOO_$__$$_BAR$$BOOLEAN:
# Temps allocated between ebp-8 and ebp-8
# [project1.lpr]
# [14] begin
     pushl    %ebp
     movl    %esp,%ebp
     leal    -8(%esp),%esp
# Var $self located at ebp-4
# Var $result located at ebp-8
     movl    %eax,-4(%ebp)
# [15] Init;
     movl    -4(%ebp),%eax
     movl    -4(%ebp),%edx
     movl    (%edx),%edx
     call    *100(%edx)
# [16] end;
     leave
     ret




More information about the fpc-devel mailing list