[fpc-devel]Re: changes to opt
Jonas Maebe
jonas at zeus.rug.ac.be
Fri Sep 22 16:35:40 CEST 2000
(CC'ing to fpc-devel since I think it may of interest to other people as
well)
>... After I ve also implemented register renaming the
> effect should be even better (afaik web bug 1088 will then even be
> optimized properly). I dont know about the slow down factor this adds.
>
>What do _current_ CSE changes in snapshot do?
CSE means "common subexpression elimination", ie. if part of an
expression occurs more than once within a number of instructions, it is
only evaluated once and the result is used twice (instead evaluating it
twice).
Curently, CSE only works for integers and pointer loads. The improvement
I did was that the CSE previously only looked at what the registers
contained at the moment the previous instruction was done to see whether
one of those registers contained the expression that was being calculated
starting with the current instruction (yes, that's a whole mouthful :)
Now, the CSE goes as far back as possible (this is not till the start of
the block of code unfortunately) to see whether at any given point this
expression was calculated instead of just at the previous instruction.
>What does/will register renaming do?
This has to do with how far you can go back to search for expressions.
E.g, suppose now the following code is generated:
movl 8(%ebp),%eax
addl 4(%ebp),%eax
movzwl 12(%ebp),%edx
cmpl %eax,%edx
jg .L1
movzwl 12(%ebp),%eax
movl 8(%ebp),%edx
addl 4(%ebp),%edx
movl (eax,edx),ebx
This would currently be optimized to
movl 8(%ebp),%eax
addl 4(%ebp),%eax
movzwl 12(%ebp),%edx
cmpl %eax,%edx
jg .L1
movl %edx,%eax
movl 8(%ebp),%edx
addl 4(%ebp),%edx
movl (eax,edx),ebx
The CSE in this case was that the "movzwl 12(%ebp),%eax" was eliminated
(and the value in edx was reused). The problem is that you can't
eliminate the second loading of edx by reusing the value that was already
in eax, because
a) after the "movl %edx,%eax", %eax doesn't contain the correct value
anymore
b) before the "movl %edx,%eax", you can store it in edx yet because the
current value of edx is still used in that "movl %edx,%eax" (the
optimizer isn't smart enough yet to allocate a new register to temporary
hold this value)
Register renaming in this case will simply mean that the above becomes
movl 8(%ebp),%eax
addl 4(%ebp),%eax
movzwl 12(%ebp),%edx
cmpl %eax,%edx
jg .L1
movl 8(%ebp),%eax
addl 4(%ebp),%eax
movl (edx,eax),eax
after which the next CSE pass can change it into
movl 8(%ebp),%eax
addl 4(%ebp),%eax
movzwl 12(%ebp),%edx
cmpl %eax,%edx
jg .L1
movl (edx,eax),eax
>Assume they imact is on integers only.. will they impact my
>fft?
No. For that, you'll have to wait for the CSE at the parse tree level.
Writing a CSE that works at the assembler level for the stack based 80x86
FPU would be a lot of work (it would be completely different from the
integer based CSE which we currently have).
>Please let me know how (when) to activate it & I'll try making compiler &
>IDE with it & see what slow down is & whether it works!
It's already automatically activated. There were some bugs in it though,
which I was fixing when I got your email :)
Jonas
More information about the fpc-devel
mailing list