Hi everyone, My laptop is in the repair shop again unfortunately due to a jammed cooling fan, so this e-mail may have indentation problems in the mailing list.
That aside, I'm taking the opportunity to look at some optimisations for AArch64, and in the process I rediscovered the problem with labels having incorrect reference counts, which ultimately means I cannot reliably detect if a label only has a single reference. After some investigation, I found out this is due to how AArch64 creates jumps in the code generator: ---- procedure tcgaarch64.a_jmp_always(list: TAsmList; l: TAsmLabel); var ai: taicpu; begin ai:=TAiCpu.op_sym(A_B,current_asmdata.RefAsmSymbol(l.name,AT_FUNCTION)); ai.is_jmp:=true; list.Concat(ai); end; ---- Nothing too out of the ordinary. However, the problem comes from reading the "name" property, since this calls the virtual method GetName, which is overridden in TAsmLabel: ---- function TAsmLabel.getname:TSymStr; begin getname:=inherited getname; increfs; end; ---- Every time you want to get the name of the label, its reference count is incremented. Coupled with tai_cpu_abstract.loadref incrementing the reference count for a symbol, this has the result for increasing the reference count by 2 for each jump. This is very undesirable because it has the side-effect of increasing the reference count whenever you want to find out the label's name, which also has the side-effect of increasing the reference count when writing the assembly dumps (as evidenced when DEBUG_LABEL Is defined). At the moment I can't just simply remove the overridden method because other parts of the compiler depend on the reference count being incremented, as evidenced when I try to build for aarch64-linux: ---- as -o /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/gprt0.o aarch64/gprt0.as /home/pi/Documents/source/fpc/compiler/ppc1 -Ur -Ur -Xs -O2 -n -Fi../inc -Fi../aarch64 -Fi../unix -Fiaarch64 -FE. -FU/home/pi/Documents/source/fpc/rtl/units/aarch64-linux -Fl/usr/lib/gcc/aarch64-linux-gnu/8 -a -O4 - DD2022/05/07 -daarch64 -dRELEASE -Us -Sg system.pp /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/system.s: Assembler messages: /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/system.s: Error: .size expression for .Ld17$strlab does not evaluate to a constant /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/system.s: Error: .size expression for .Ld41$strlab does not evaluate to a constant /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/system.s: Error: .size expression for .Ld42$strlab does not evaluate to a constant /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/system.s: Error: .size expression for .Ld43$strlab does not evaluate to a constant /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/system.s: Error: .size expression for .Ld44$strlab does not evaluate to a constant /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/system.s: Error: .size expression for .Ld45$strlab does not evaluate to a constant /home/pi/Documents/source/fpc/rtl/units/aarch64-linux/system.s: Error: .size expression for .Ld46$strlab does not evaluate to a constant system.pp(737) Error: Error while assembling exitcode 1 system.pp(737) Fatal: There were 2 errors compiling module, stopping Fatal: Compilation aborted ---- In conclusion, I would like to refactor the compiler so simply reading the label name does not automatically increase its reference count, and correct the parts of the compiler that depend on this behaviour. Without accurate reference counts, it is very difficult to make reliable optimisations for AArch64 related to branches, and probably other platforms too. Gareth aka. Kit _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel