[Bug c/68360] New: GCC bitfield processing code is very inefficient
vorfeed.canal at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sun Nov 15 14:43:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68360
Bug ID: 68360
Summary: GCC bitfield processing code is very inefficient
Product: gcc
Version: 5.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: vorfeed.canal at gmail dot com
Target Milestone: ---
It looks like GCC couldn't generate efficient code where clang could. I'm not
talking about something extremely complicated - just the code where few bits
must be copied without modifications.
E.g.
$ cat test.c
#include <string.h>
struct test {
unsigned :32;
unsigned :2;
unsigned a:2;
unsigned :2;
unsigned b:1;
unsigned :1;
};
void bar(struct test*);
void foo(unsigned int i) {
struct test a;
a.a = (i >> 2) & 0x3;
a.b = (i >> 6) & 0x1;
bar(&a);
}
$ clang -O3 -S test2.c -o-
.text
.file "test2.c"
.globl foo
.align 16, 0x90
.type foo,@function
foo: # @foo
# BB#0:
subl $28, %esp
movl 32(%esp), %eax
andl $76, %eax
movl %eax, 20(%esp)
movl $0, 16(%esp)
leal 16(%esp), %eax
movl %eax, (%esp)
calll bar
addl $28, %esp
retl
.Lfunc_end0:
.size foo, .Lfunc_end0-foo
.ident "clang version 3.6 "
.section ".note.GNU-stack","",@progbits
$ g++ -O3 -S test2.c -o-
.file "test2.c"
.section .text.unlikely,"ax",@progbits
.LCOLDB0:
.text
.LHOTB0:
.p2align 4,,15
.globl _Z3fooj
.type _Z3fooj, @function
_Z3fooj:
.LFB14:
.cfi_startproc
subq $24, %rsp
.cfi_def_cfa_offset 32
movl %edi, %edx
shrl $6, %edi
movzbl 4(%rsp), %ecx
shrl $2, %edx
andl $1, %edi
andl $3, %edx
movl %edi, %eax
sall $2, %edx
sall $6, %eax
andl $-77, %ecx
orl %edx, %ecx
movl %ecx, %edi
orl %eax, %edi
movb %dil, 4(%rsp)
movq %rsp, %rdi
call _Z3barP4test
addq $24, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE14:
.size _Z3fooj, .-_Z3fooj
.section .text.unlikely
.LCOLDE0:
.text
.LHOTE0:
.ident "GCC: (GNU) 5.2.0"
.section .note.GNU-stack,"",@progbits
More information about the Gcc-bugs
mailing list