[fpc-devel] Bad code generation on linux x86_64

C Western l at c-m-w.me.uk
Sat May 20 10:50:36 CEST 2017


The following revision seems to be generating bad code for me on 
linux/x86_64:

r36200 | florian | 2017-05-13 10:58:25 +0100 (Sat, 13 May 2017) | 1 line
Changed paths:
    M /trunk/compiler/i386/aoptcpu.pas
    M /trunk/compiler/x86/aoptx86.pas

* moved InstructionLoadsFromReg and RegReadByInstruction from 
TCpuAsmOptimizer (i386) to TX86AsmOptimizer

I am not sure how to generate a simple test case, but the code fragment 
that fails is below. As far as I can tell, r14 is used, but never 
loaded; I think r13 should have been used instead.

Colin

.section .text.n_logunit$_$tlogform_$__$$_formcreate$tobject
	.balign 16,0x90
.globl	LOGUNIT$_$TLOGFORM_$__$$_FORMCREATE$TOBJECT
	.type	LOGUNIT$_$TLOGFORM_$__$$_FORMCREATE$TOBJECT, at function
LOGUNIT$_$TLOGFORM_$__$$_FORMCREATE$TOBJECT:
.Lc1:
	# Register rsp allocated
.Ll1:
# [LogUnit.pas]
# [95] begin
	pushq	%rbx
	pushq	%r12
	pushq	%r13
	pushq	%r14
	pushq	%r15
.Lc3:
	# Register rdi,rsi,rax allocated
	movq	%rdi,%r15
# Var $self located in register rax
	# Register rsi released
# Var Sender located in register rsi
	# Register r15 allocated
	# Register rax released
# Var $self located in register r15
	# Register sil allocated
.Ll2:
# [96] DragAcceptFiles(Self, True);
	movb	$1,%sil
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 allocated
	call	WCOMPAT_$$_DRAGACCEPTFILES$TCUSTOMFORM$BOOLEAN at PLT
	# Register rcx,rdx,rsi,rdi,r8,r9,r10,r11 released
	# Register rax allocated
.Ll3:
# [98] OnDropFiles := @FormDropFiles;
	movq 
LOGUNIT$_$TLOGFORM_$__$$_FORMDROPFILES$TOBJECT$array_of_ANSISTRING at GOTPCREL(%rip),%rax
	movq	%rax,1736(%r15)
	# Register rax released
	movq	%r15,1744(%r15)
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 allocated
.Ll4:
# [100] 
GlobalMixture.GetEnumNames(GlobalMixture.IndexOfSetting('PrintLevel'),OutputComboBox.Items);
	call	GLOBAL_$$_GLOBALMIXTURE$$TMIXTURE at PLT
	# Register rcx,rdx,rsi,rdi,r8,r9,r10,r11 released
	# Register r13 allocated
	movq	%rax,%r13
	# Register rax released
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 allocated
	call	GLOBAL_$$_GLOBALMIXTURE$$TMIXTURE at PLT
	# Register rcx,rdx,rsi,r8,r9,r10,r11 released
	# Register rdi allocated
	movq	%rax,%rdi
	# Register rax released
	# Register rsi allocated
	leaq	.Ld2(%rip),%rsi
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 allocated
	call	MNODE$_$TMNODE_$__$$_INDEXOFSETTING$ANSISTRING$$LONGINT at PLT
	# Register rcx,rdx,rsi,rdi,r8,r9,r10,r11 released
	# Register r12d allocated
	movl	%eax,%r12d
	# Register eax released
	# Register rax allocated
	movq	2048(%r15),%rax
	# Register rbx allocated
	movq	1424(%rax),%rbx
	# Register rax released
	# Register rax,r14 allocated
	# Register rax released
	testq	%r13,%r13
	jne	.Lj6
	# Register rflags released
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 allocated
	call	fpc_objecterror at PLT
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 released
.Lj6:
	# Register rax allocated
	movq	(%r14),%r14
	# Register r14 released
	# Register r14 allocated
	# Register rax released
	# Register rdi allocated
	movq	%r14,%rdi
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 allocated
	call	fpc_check_object at PLT
	# Register rax,rcx,rdx,rsi,r8,r9,r10,r11 released
	# Register rdi allocated
	movq	%r13,%rdi
	# Register r13 released
	# Register rdx allocated
	movq	%rbx,%rdx
	# Register rbx released
	# Register esi allocated
	movl	%r12d,%esi
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 allocated
	call	*744(%r14)  <--------------------  Fail here
	# Register rax,rcx,rdx,rsi,rdi,r8,r9,r10,r11 allocated
.Ll5:



More information about the fpc-devel mailing list