RE: [PATCH v6 4/4] libusbg: Add inline to gadget_write_string().

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Karol Lewandowski [mailto:k.lewandowsk@xxxxxxxxxxx]
> Subject: Re: [PATCH v6 4/4] libusbg: Add inline to
> gadget_write_string().
> 
> On 01/23/2014 11:13 AM, Krzysztof Opasiak wrote:
> >> -----Original Message-----
> >> From: David Laight [mailto:David.Laight@xxxxxxxxxx]>
> >> From: Of Stanislaw Wadas
> >>> Add inline to gadget_write_string().
> >> ...
> >>> -static void usbg_write_string(char *path, char *name, char
> >> *file, char *buf)
> >>> +static inline void usbg_write_string(char *path, char *name,
> >> char *file, char *buf)
> >>>  {
> >>>  	usbg_write_buf(path, name, file, buf);
> >>>  }
> >>
> >> Why?
> >> The compiler is very unlikely not to inline it anyway.
> >>
> >> If it doesn't inline it, then specifying 'inline' probably
> >> won't make any difference either.
> >>
> >
> > I agree that new version of gcc can do this without explicit
> inline, but
> > please think about some legacy systems and compilers. Older
> versions of
> > gcc or other compilers may not inline this function if there is
> no
> > keyword. We should write portable code and don't depend on any
> version
> > of compiler. So to do it good we should pass as much information
> to
> > compiler as possible.
> 
> Given different optimization flags (-Os vs -O3) compiler can
> generate
> completely different code.  Both will be "optimal" but by
> completely
> different criteria.
> 
> We should not try to outsmart compiler, it's usually way smarter
> than
> us.

As far as I know , compiler is not smart but only has a good heuristic.
In my opinion this heuristic is based also on inline keyword. Let's take
an example 2 simple functions:

void func(int *a, int b)
{
        int i =1;
        for(i=1; i < b; ++a);
}

static inline void func2(int* a, int b)
{
         func(a, b);
}

Then in main we have a set of 7 call to this functions. Using my gcc
4.6.3 with -01 flag I get different asm if I use inline keyword or not.
When using inline keyword I got func2 optimized out but if I don't use
inline keyword func2 is still present in code and called each time. Both
source and asm results you may found below this message.

I hope that you see now that using or not using inline may influent the
result of the compilation, so specifying inline makes a difference.

--
BR's
Krzysztof Opasiak
Samsung R&D Institute Poland
Samsung Electronics


--- 
test.c:
      
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void func(int *a, int b)
{
        int i =1;
        a++;
        for(i=1; i < b; ++a);
}

static inline void func2(int* a, int b)
{
         func(a, b);
}

int main(int argc, char** argv)
{

        int a =(int) (long)argv[0];
        int b =(int) (long)argv[1];

        func2(&a, b);
        func2(&a, b);
        func2(&a, b);
        func2(&a, b);
        func2(&a, b);
        func2(&a, b);
        func2(&a, b);

	  a++;
        return a;
}      
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
gcc -S test.c -O1 without func2 inline      
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	.file	"test.c"
	.text
	.globl	func
	.type	func, @function
func:
.LFB0:
	.cfi_startproc
	cmpl	$1, %esi
	jle	.L4
.L3:
	jmp	.L3
.L4:
	rep
	ret
	.cfi_endproc
.LFE0:
	.size	func, .-func
	.type	func2, @function
func2:
.LFB1:
	.cfi_startproc
	call	func
	rep
	ret
	.cfi_endproc
.LFE1:
	.size	func2, .-func2
	.globl	main
	.type	main, @function
main:
.LFB2:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	pushq	%rbx
	.cfi_def_cfa_offset 24
	.cfi_offset 3, -24
	subq	$16, %rsp
	.cfi_def_cfa_offset 40
	movq	%rsi, %rbx
	movq	8(%rsi), %rbp
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func2
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func2
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func2
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func2
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func2
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func2
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func2
	movq	(%rbx), %rax
	addl	$1, %eax
	addq	$16, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%rbp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE2:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
	.section	.note.GNU-stack,"",@progbit
      
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
gcc -S test.c -O1 with func2 inline
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

	.file	"test.c"
	.text
	.globl	func
	.type	func, @function
func:
.LFB0:
	.cfi_startproc
	cmpl	$1, %esi
	jle	.L4
.L3:
	jmp	.L3
.L4:
	rep
	ret
	.cfi_endproc
.LFE0:
	.size	func, .-func
	.globl	main
	.type	main, @function
main:
.LFB2:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	pushq	%rbx
	.cfi_def_cfa_offset 24
	.cfi_offset 3, -24
	subq	$16, %rsp
	.cfi_def_cfa_offset 40
	movq	%rsi, %rbx
	movq	8(%rsi), %rbp
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func
	movl	%ebp, %esi
	leaq	12(%rsp), %rdi
	call	func
	movq	(%rbx), %rax
	addl	$1, %eax
	addq	$16, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%rbp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE2:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
	.section	.note.GNU-stack,"",@progbits
      
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux