From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21091 invoked by alias); 4 Feb 2003 12:16:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 21066 invoked by uid 71); 4 Feb 2003 12:16:01 -0000 Resent-Date: 4 Feb 2003 12:16:01 -0000 Resent-Message-ID: <20030204121601.21062.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, osv@javad.ru Received: (qmail 18039 invoked by uid 48); 4 Feb 2003 12:07:49 -0000 Message-Id: <20030204120749.18038.qmail@sources.redhat.com> Date: Tue, 04 Feb 2003 12:16:00 -0000 From: osv@javad.ru Reply-To: osv@javad.ru To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: optimization/9567: Using struct fields produces worse code than stand-alone vars. X-SW-Source: 2003-02/txt/msg00184.txt.bz2 List-Id: >Number: 9567 >Category: optimization >Synopsis: Using struct fields produces worse code than stand-alone vars. >Confidential: no >Severity: serious >Priority: low >Responsible: unassigned >State: open >Class: pessimizes-code >Submitter-Id: net >Arrival-Date: Tue Feb 04 12:16:01 UTC 2003 >Closed-Date: >Last-Modified: >Originator: Sergei Organov >Release: gcc version 3.3 20030203 (prerelease) >Organization: >Environment: Linux 2.4.20 i686 >Description: In the code below functions f1() and f2() are equivalent, but assembly code produced for f1() is worse than those for f2(). The assembly below demonstrates the result for PowerPC, however similar result could be seen for ix86. The C/C++ code (note that the code is minimized to demonstrate the problem, so please ignore using of unitialized variables): struct A { char const* src; char* dest; }; void f1() { A a; for(int i = 0; i < 10; ++i) *++a.dest = *++a.src; } void f2() { char const* src; char* dest; for(int i = 0; i < 10; ++i) *++dest = *++src; } The resulting assembly for PowerPC (note the loop body is 4 vs 2 instructions): $ ~/try-3.2/tools/bin/ppc-rtems-gcc -c -O4 -save-temps -mregnames struct1.cc -o struct1.o $ cat struct1.s .file "struct1.cc" .section ".text" .align 2 .globl _Z2f1v .type _Z2f1v, @function _Z2f1v: .LFB4: li %r3,10 mtctr %r3 li %r7,0 li %r8,0 .L9: addi %r7,%r7,1 lbz %r4,0(%r7) addi %r8,%r8,1 stb %r4,0(%r8) bdnz .L9 blr .LFE4: .size _Z2f1v, .-_Z2f1v .align 2 .globl _Z2f2v .type _Z2f2v, @function _Z2f2v: .LFB5: li %r3,10 mtctr %r3 .L18: lbzu %r3,1(%r9) stbu %r3,1(%r11) bdnz .L18 blr .LFE5: .size _Z2f2v, .-_Z2f2v .ident "GCC: (GNU) 3.3 20030203 (prerelease)" >How-To-Repeat: Compile provided C/C++ code with '-O4 -save-temps' and look at resulting assembly. >Fix: >Release-Note: >Audit-Trail: >Unformatted: