Jonas Maebe wrote: > > On 10 okt 2006, at 10:34, Florian Klaempfl wrote: > >> Not really. I didn't try it yet but it shouldn't mess up much. The >> optimziation >> is done completely on the node level, the pascal code would look like >> http://www.hu.freepascal.org/fpcircbot/cgipastebin?msgid=156 except >> that there >> are temps involved to calculate the new parameters because calculating >> one >> parameter could require the original value of another one. > > Which means that the parameter values cannot be properly seen in the > debugger, no?
This is a hidden step, but the callstack window isn't done properly, that's true. > Also, do you actually insert goto/label nodes? That would > degrade the performance of the register variable assignment because of > the current limitations concerning flow analysis (i.e., for sufficiently > complex routines, the tail recursion optimization may currently result > in performance degradation rather than improvement compared to using > regvars without it). The recursive call is usually inside an if anyways so the ssa optimizer is lost anyways, no? But as I said, for the usual benchmark case it works great (the code is almost on pair with gcc after a quick look at it): .balign 16,0x90 .globl P$ACKERMAN_ACK$LONGINT$LONGINT$$LONGINT P$ACKERMAN_ACK$LONGINT$LONGINT$$LONGINT: # Temps allocated between esp+0 and esp+16 # [ackermann.pp] # [8] begin subl $16,%esp # Var M located in register ebx # Var N located in register esi # Var $result located in register edi movl %ebx,(%esp) movl %esi,4(%esp) movl %edi,8(%esp) movl %eax,%ebx movl %edx,%esi .Lj5: # [9] if M = 0 then Ack := N+1 testl %ebx,%ebx jne .Lj7 movl %esi,%eax incl %eax movl %eax,%edi jmp .Lj10 .Lj7: # [10] else if N = 0 then Ack := Ack(M-1, 1) testl %esi,%esi jne .Lj12 movl $1,%edx decl %ebx movl %edx,%esi jmp .Lj5 .Lj12: # [11] else Ack := Ack(M-1, Ack(M, N-1)); movl %esi,%edx decl %edx movl %ebx,%eax call P$ACKERMAN_ACK$LONGINT$LONGINT$$LONGINT decl %ebx movl %eax,%esi jmp .Lj5 .Lj21: .Lj10: # [12] end; movl %edi,%eax movl (%esp),%ebx movl 4(%esp),%esi movl 8(%esp),%edi addl $16,%esp ret BTW: Does the assembler optimizer track flag usage? Then we could remove some of the movl %esi,%eax incl %eax like pairs. > >>> e.g., we >>> could add -Oonostackframe at the end of the compiler switches for the >>> RTL's object unit when compiling for x86). >> >> What we still need are switches in the sources to enable particular >> optimizations. > > {$optimization nostackframe} > > should work. Didn't know about it :) _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel