[fpc-devel] inline... and philosophy
Florian Klämpfl
florian at freepascal.org
Sun Nov 10 19:24:23 CET 2019
Am 10.11.19 um 18:01 schrieb J. Gareth Moreton:
> Fair enough - thank you.
>
> This is a bit of a micro-optimisation for the compiler in regards to
> what I've just done, but I've noticed that, a couple of times, commands
> to the effect of the following appear:
>
> tasmlabel(symbol).decrefs;
> if tasmlabel(symbol).getrefs = 0 then
> ...
>
> That is... dereference a label, and then do something if it turns into a
> dead label (usually remove it). Would it be permissible to change the
> decrefs method so it returns a Boolean expression, namely True if the
> reference falls to zero and False otherwise? Given the function already
> checks to see if the reference count is less than zero (to raise an
> internal error), it should have negligable performance loss, and if
> anything, the new jump optimisations will help a lot.
>
> In the meantime, I've just taken a quick look at my code, and noticed
> something possibly a little risky (compiler/x86/aoptx86.pas, line 3540):
>
> { Remove label xxx (it will have a ref of zero due to the initial check }
> StripLabelFast(hp4);
>
> { Now we can safely decrement it }
> tasmlabel(symbol).decrefs; >
> There's nothing actually buggy with the code because it's known that the
> label has a reference count of 1 at this point, but "StripLabelFast"
> removes the label while it's still live, something that I even said in
> the procedure's comments that you shouldn't do! i.e. I broke my own
> rule! To be safe, these two commands should probably be switched
Committed.
More information about the fpc-devel
mailing list