Performance regression 4.3 vs 4.4/4.5

Salvatore Filippone salvatore.filippone@uniroma2.it
Thu Nov 19 14:18:00 GMT 2009


Hello, 
A colleague of mine reported a sharp decrease in performance when moving
an application from 4.3.1 to 4.4.1/4.5.0.  I have performed some
testing/profiling and can confirm that the drop comes about from the
attached subroutine, which is extracted and slightly obfuscated. I am
attaching the assembler code generated by 4.3.1 and 4.4.1 on an x86_64;
with the 4.3 version the test case runs in abnout 31 s, with the 4.4 in
about 45. The 4.4 version with just this subroutine compiled by 4.3 and
linked in runs again in about 31 s. 
The compile options are in both cases
gfortran -O3 -Wuninitialized -fPIC -c 

With larger test cases the difference in time can be as much as 100%

Anybody got ideas? I cannot post the entire code, unfortunately. 

Salvatore

-------------- next part --------------
A non-text attachment was scrubbed...
Name: eval.f90
Type: text/x-fortran
Size: 647 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20091119/4240e3f2/attachment.bin>
-------------- next part --------------
	.file	"eval.f90"
	.text
	.p2align 4,,15
.globl eval_
	.type	eval_, @function
eval_:
.LFB2:
	pushq	%r15
.LCFI0:
	movq	%rdx, %r11
	pushq	%r14
.LCFI1:
	pushq	%r13
.LCFI2:
	movq	%r9, %r13
	pushq	%r12
.LCFI3:
	pushq	%rbp
.LCFI4:
	pushq	%rbx
.LCFI5:
	movq	56(%rsp), %rax
	movq	%rcx, %rbx
	movsd	(%rsi), %xmm5
	movq	%rdi, -16(%rsp)
	movsd	(%rcx), %xmm6
	movl	(%rax), %r12d
	movapd	%xmm5, %xmm0
	movq	%r8, -24(%rsp)
	mulsd	%xmm6, %xmm0
	cmpl	$1, %r12d
	movsd	%xmm0, (%rdx)
	jle	.L12
	movq	72(%rsp), %rax
	xorpd	%xmm4, %xmm4
	movl	$2, %r8d
	movl	$0, -8(%rsp)
	xorl	%ecx, %ecx
	movl	$8, %ebp
	movl	(%rax), %eax
	movl	%eax, -4(%rsp)
	leal	2(%r12), %eax
	cltq
	subq	$1, %rax
	movq	%rax, -48(%rsp)
	movslq	%r12d,%rax
	leaq	0(,%rax,8), %r9
	.p2align 4,,10
	.p2align 3
.L11:
	movl	-8(%rsp), %edx
	movsd	8(%rbx,%rcx,8), %xmm2
	movapd	%xmm5, %xmm0
	leal	-1(%rdx,%r8), %eax
	mulsd	%xmm2, %xmm0
	cmpl	-4(%rsp), %eax
	movsd	%xmm0, 8(%r11,%rcx,8)
	jg	.L3
	movl	%edx, %esi
	movq	-24(%rsp), %rdi
	addl	$1, %esi
	movapd	%xmm6, %xmm1
	movslq	%esi,%rax
	leaq	-8(%rdi,%rax,8), %rdx
	xorl	%eax, %eax
	jmp	.L5
	.p2align 4,,10
	.p2align 3
.L16:
	movsd	(%rbx,%rax), %xmm1
.L5:
	movsd	(%rdx), %xmm0
	addq	$8, %rdx
	mulsd	%xmm0, %xmm1
	mulsd	%xmm2, %xmm0
	addsd	8(%r11,%rcx,8), %xmm1
	movsd	%xmm1, 8(%r11,%rcx,8)
	addsd	(%r11,%rax), %xmm0
	movsd	%xmm0, (%r11,%rax)
	addq	$8, %rax
	cmpq	%rbp, %rax
	jne	.L16
	addl	%ecx, %esi
	addq	$8, %rbp
	addq	$1, %rcx
	cmpl	%r12d, %r8d
	movl	%esi, -8(%rsp)
	je	.L12
.L17:
	addl	$1, %r8d
	jmp	.L11
	.p2align 4,,10
	.p2align 3
.L3:
	movq	64(%rsp), %rax
	xorl	%edx, %edx
	xorl	%r10d, %r10d
	movl	$1, %edi
	movl	(%rax), %r14d
	movl	%r14d, %eax
	subl	%r8d, %eax
	divl	%r12d
	movq	-16(%rsp), %rdx
	movsd	(%rdx), %xmm3
	leal	(%r12,%r8), %edx
	movl	%eax, %r15d
	movq	-48(%rsp), %rax
	addq	%rcx, %rax
	leaq	(%r13,%rax,8), %rax
	movq	%rax, -32(%rsp)
	movl	%ecx, %eax
	notl	%eax
	addl	%edx, %eax
	cltq
	movq	%rax, -40(%rsp)
	.p2align 4,,10
	.p2align 3
.L10:
	cmpl	%r14d, %r8d
	movapd	%xmm4, %xmm1
	jg	.L8
	movsd	8(%r13,%rcx,8), %xmm1
	testl	%r15d, %r15d
	subsd	(%r13,%r10,8), %xmm1
	mulsd	%xmm1, %xmm1
	addsd	%xmm4, %xmm1
	je	.L8
	movq	-40(%rsp), %rdx
	movq	-32(%rsp), %rsi
	leaq	-1(%r10,%rdx), %rax
	leaq	(%r13,%rax,8), %rdx
	movl	%r15d, %eax
	.p2align 4,,10
	.p2align 3
.L9:
	movsd	(%rsi), %xmm0
	addq	%r9, %rsi
	subsd	(%rdx), %xmm0
	addq	%r9, %rdx
	subl	$1, %eax
	mulsd	%xmm0, %xmm0
	addsd	%xmm0, %xmm1
	jne	.L9
.L8:
	addsd	%xmm3, %xmm1
	addl	$1, %edi
	sqrtsd	%xmm1, %xmm1
	movapd	%xmm1, %xmm0
	mulsd	%xmm2, %xmm1
	mulsd	(%rbx,%r10,8), %xmm0
	addsd	8(%r11,%rcx,8), %xmm0
	movsd	%xmm0, 8(%r11,%rcx,8)
	addsd	(%r11,%r10,8), %xmm1
	movsd	%xmm1, (%r11,%r10,8)
	addq	$1, %r10
	cmpl	%edi, %r8d
	jne	.L10
	addq	$1, %rcx
	addq	$8, %rbp
	cmpl	%r12d, %r8d
	jne	.L17
.L12:
	popq	%rbx
	popq	%rbp
	popq	%r12
	popq	%r13
	popq	%r14
	popq	%r15
	ret
.LFE2:
	.size	eval_, .-eval_
	.section	.eh_frame,"a",@progbits
.Lframe1:
	.long	.LECIE1-.LSCIE1
.LSCIE1:
	.long	0x0
	.byte	0x1
	.string	"zR"
	.uleb128 0x1
	.sleb128 -8
	.byte	0x10
	.uleb128 0x1
	.byte	0x1b
	.byte	0xc
	.uleb128 0x7
	.uleb128 0x8
	.byte	0x90
	.uleb128 0x1
	.align 8
.LECIE1:
.LSFDE1:
	.long	.LEFDE1-.LASFDE1
.LASFDE1:
	.long	.LASFDE1-.Lframe1
	.long	.LFB2-.
	.long	.LFE2-.LFB2
	.uleb128 0x0
	.byte	0x4
	.long	.LCFI0-.LFB2
	.byte	0xe
	.uleb128 0x10
	.byte	0x4
	.long	.LCFI1-.LCFI0
	.byte	0xe
	.uleb128 0x18
	.byte	0x4
	.long	.LCFI2-.LCFI1
	.byte	0xe
	.uleb128 0x20
	.byte	0x8d
	.uleb128 0x4
	.byte	0x8e
	.uleb128 0x3
	.byte	0x8f
	.uleb128 0x2
	.byte	0x4
	.long	.LCFI3-.LCFI2
	.byte	0xe
	.uleb128 0x28
	.byte	0x4
	.long	.LCFI4-.LCFI3
	.byte	0xe
	.uleb128 0x30
	.byte	0x4
	.long	.LCFI5-.LCFI4
	.byte	0xe
	.uleb128 0x38
	.byte	0x83
	.uleb128 0x7
	.byte	0x86
	.uleb128 0x6
	.byte	0x8c
	.uleb128 0x5
	.align 8
.LEFDE1:
	.ident	"GCC: (GNU) 4.3.1"
	.section	.note.GNU-stack,"",@progbits
-------------- next part --------------
	.file	"eval.f90"
	.text
	.p2align 4,,15
.globl eval_
	.type	eval_, @function
eval_:
.LFB0:
	.cfi_startproc
	pushq	%r15
	.cfi_def_cfa_offset 16
	movsd	(%rcx), %xmm7
	pushq	%r14
	.cfi_def_cfa_offset 24
	pushq	%r13
	.cfi_def_cfa_offset 32
	pushq	%r12
	.cfi_def_cfa_offset 40
	pushq	%rbp
	.cfi_def_cfa_offset 48
	pushq	%rbx
	.cfi_def_cfa_offset 56
	movq	56(%rsp), %rax
	movsd	(%rsi), %xmm6
	movq	%rdi, -32(%rsp)
	movl	(%rax), %eax
	movq	%rdx, %rdi
	movq	%r8, -24(%rsp)
	movapd	%xmm6, %xmm0
	mulsd	%xmm7, %xmm0
	cmpl	$1, %eax
	movl	%eax, -64(%rsp)
	movsd	%xmm0, (%rdx)
	jle	.L12
	.cfi_offset 3, -56
	.cfi_offset 6, -48
	.cfi_offset 12, -40
	.cfi_offset 13, -32
	.cfi_offset 14, -24
	.cfi_offset 15, -16
	movq	72(%rsp), %rax
	xorpd	%xmm5, %xmm5
	xorl	%r12d, %r12d
	movl	$8, %r11d
	xorl	%r10d, %r10d
	xorl	%r14d, %r14d
	movl	(%rax), %eax
	movl	%eax, -36(%rsp)
	movl	-64(%rsp), %eax
	subl	$2, %eax
	leaq	8(,%rax,8), %rax
	movq	%rax, -48(%rsp)
	movslq	-64(%rsp), %rax
	leaq	2(%rax), %rdx
	leaq	0(,%rax,8), %rsi
	addq	$1, %rax
	movq	%rax, -8(%rsp)
	movq	%rdx, -16(%rsp)
	.p2align 4,,10
	.p2align 3
.L11:
	movl	$2, %r8d
	movsd	8(%rcx,%r10), %xmm3
	movapd	%xmm6, %xmm2
	subl	%r12d, %r8d
	leal	-1(%r14,%r8), %eax
	cmpl	-36(%rsp), %eax
	movl	%r12d, %edx
	mulsd	%xmm3, %xmm2
	movsd	%xmm2, 8(%rdi,%r10)
	jg	.L3
	movq	-24(%rsp), %rbp
	movslq	%r14d, %rax
	movapd	%xmm7, %xmm1
	leaq	0(%rbp,%rax,8), %rbx
	xorl	%eax, %eax
	jmp	.L5
	.p2align 4,,10
	.p2align 3
.L17:
	movsd	8(%rdi,%r10), %xmm2
	movsd	(%rcx,%rax), %xmm1
.L5:
	movsd	(%rbx), %xmm0
	addq	$8, %rbx
	mulsd	%xmm0, %xmm1
	mulsd	%xmm3, %xmm0
	addsd	%xmm2, %xmm1
	movsd	%xmm1, 8(%rdi,%r10)
	addsd	(%rdi,%rax), %xmm0
	movsd	%xmm0, (%rdi,%rax)
	addq	$8, %rax
	cmpq	%r11, %rax
	jne	.L17
	negl	%edx
	leal	1(%r14,%rdx), %r14d
.L6:
	addq	$8, %r10
	addq	$8, %r11
	subq	$1, %r12
	cmpq	-48(%rsp), %r10
	jne	.L11
.L12:
	popq	%rbx
	popq	%rbp
	popq	%r12
	popq	%r13
	popq	%r14
	popq	%r15
	ret
	.p2align 4,,10
	.p2align 3
.L3:
	movq	64(%rsp), %rax
	movq	-32(%rsp), %rdx
	xorl	%ebx, %ebx
	movapd	%xmm7, %xmm4
	movl	(%rax), %r13d
	movq	-16(%rsp), %rax
	movsd	(%rdx), %xmm8
	leaq	-2(%rax), %rbp
	movq	-8(%rsp), %rax
	movl	%r13d, %edx
	subl	%r8d, %edx
	movl	%edx, -60(%rsp)
	subq	%r12, %rax
	leaq	(%r9,%rax,8), %rax
	movq	%rax, -56(%rsp)
	.p2align 4,,10
	.p2align 3
.L10:
	cmpl	%r13d, %r8d
	movapd	%xmm5, %xmm1
	jg	.L8
	movsd	8(%r9,%r10), %xmm1
	xorl	%edx, %edx
	movl	-60(%rsp), %eax
	subsd	(%r9,%rbx), %xmm1
	divl	-64(%rsp)
	mulsd	%xmm1, %xmm1
	testl	%eax, %eax
	addsd	%xmm5, %xmm1
	je	.L8
	movq	-56(%rsp), %r15
	leaq	(%r9,%rbp,8), %rdx
	.p2align 4,,10
	.p2align 3
.L9:
	movsd	(%r15), %xmm0
	addq	%rsi, %r15
	subsd	(%rdx), %xmm0
	addq	%rsi, %rdx
	subl	$1, %eax
	mulsd	%xmm0, %xmm0
	addsd	%xmm0, %xmm1
	jne	.L9
.L8:
	addsd	%xmm8, %xmm1
	addq	$1, %rbp
	sqrtsd	%xmm1, %xmm1
	movapd	%xmm1, %xmm0
	mulsd	%xmm3, %xmm1
	mulsd	%xmm4, %xmm0
	addsd	%xmm2, %xmm0
	movsd	%xmm0, 8(%rdi,%r10)
	addsd	(%rdi,%rbx), %xmm1
	movsd	%xmm1, (%rdi,%rbx)
	addq	$8, %rbx
	cmpq	%r11, %rbx
	je	.L6
	movsd	8(%rdi,%r10), %xmm2
	movsd	(%rcx,%rbx), %xmm4
	jmp	.L10
	.cfi_endproc
.LFE0:
	.size	eval_, .-eval_
	.ident	"GCC: (GNU) 4.4.1 20090725 (Red Hat 4.4.1-2)"
	.section	.note.GNU-stack,"",@progbits


More information about the Fortran mailing list