This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug other/17104] New: Non-optimal code generation for bitfield initialization
- From: "gcc-bugzilla at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 19 Aug 2004 14:59:18 -0000
- Subject: [Bug other/17104] New: Non-optimal code generation for bitfield initialization
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
Description:
A non-optimal code sequence is illustrated. Duplicate using gcc 3.5 and
command line:
gcc -O3 -m32/-m64 -c test.c
Testcase:
struct {
int f1 : 1;
int f2 : 1;
int f3 : 1;
int f4 : 1;
int f5 : 1;
int f6 : 1;
int f7 : 1;
int f8 : 1;
int f9 : 1;
int f10 : 1;
int f11 : 1;
int f12 : 1;
int f13 : 1;
int f14 : 1;
int f15 : 1;
int f16 : 1;
int f17 : 2;
int f18 : 2;
int f19 : 2;
int f20 : 2;
int f21 : 2;
int f22 : 2;
int f23 : 2;
int f24 : 2;
} s;
void foo ()
{
s.f1 = 0;
s.f2 = 0;
s.f3 = 0;
s.f4 = 0;
s.f5 = 0;
s.f6 = 0;
s.f7 = 0;
s.f8 = 0;
s.f9 = 0;
s.f10 = 0;
s.f11 = 0;
s.f12 = 0;
s.f13 = 0;
s.f14 = 0;
s.f15 = 0;
s.f16 = 0;
s.f17 = 0;
s.f18 = 0;
s.f19 = 0;
s.f20 = 0;
s.f21 = 0;
s.f22 = 0;
s.f23 = 0;
s.f24 = 0;
}
Assembly:
GCC 3.5 currently generates the following using:
-m32 -O3
foo:
lis 9,s@ha
li 11,0
lwz 0,s@l(9)
rlwinm 0,0,0,30,31
rlwimi 0,11,0,30,31
stw 0,s@l(9)
blr
which could be simplified to:
foo:
lis 9,s@ha
li 11,0
stw 11,s@l(9)
blr
the real problem, however, lies in the code generated
for 64 bit:
-m64 -O3
.foo:
ld 11,.LC0@toc(2)
lwz 0,0(11)
rlwinm 0,0,0,1,31
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,1,1,31
rlwinm 9,9,31,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,2,1,31
rlwinm 0,0,30,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,3,1,31
rlwinm 9,9,29,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,4,1,31
rlwinm 0,0,28,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,5,1,31
rlwinm 9,9,27,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,6,1,31
rlwinm 0,0,26,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,7,1,31
rlwinm 9,9,25,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,8,1,31
rlwinm 0,0,24,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,9,1,31
rlwinm 9,9,23,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,10,1,31
rlwinm 0,0,22,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,11,1,31
rlwinm 9,9,21,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,12,1,31
rlwinm 0,0,20,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,13,1,31
rlwinm 9,9,19,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,14,1,31
rlwinm 0,0,18,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,15,1,31
rlwinm 9,9,17,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,16,2,31
rlwinm 0,0,16,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,18,2,31
rlwinm 9,9,14,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,20,2,31
rlwinm 0,0,12,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,22,2,31
rlwinm 9,9,10,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,24,2,31
rlwinm 0,0,8,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,26,2,31
rlwinm 9,9,6,0xffffffff
stw 9,0(11)
lwz 0,0(11)
rlwinm 0,0,28,2,31
rlwinm 0,0,4,0xffffffff
stw 0,0(11)
lwz 9,0(11)
rlwinm 9,9,0,0,29
stw 9,0(11)
blr
--
Summary: Non-optimal code generation for bitfield initialization
Product: gcc
Version: 3.5.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P1
Component: other
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: steinmtz at us dot ibm dot com
CC: gcc-bugs at gcc dot gnu dot org,steinmtz at us dot ibm
dot com
GCC build triplet: powerpc64-linux
GCC host triplet: powerpc64-linux
GCC target triplet: powerpc64-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17104