From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7063 invoked by alias); 18 May 2010 18:06:00 -0000 Received: (qmail 7050 invoked by uid 22791); 18 May 2010 18:05:59 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED,SPF_HELO_PASS,TW_BJ,T_RP_MATCHES_RCVD,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from lo.gmane.org (HELO lo.gmane.org) (80.91.229.12) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 18 May 2010 18:05:54 +0000 Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1OERAr-0001S3-QS for gcc@gcc.gnu.org; Tue, 18 May 2010 20:05:50 +0200 Received: from c-71-197-164-172.hsd1.wa.comcast.net ([71.197.164.172]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 18 May 2010 20:05:49 +0200 Received: from jhaberman by c-71-197-164-172.hsd1.wa.comcast.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 18 May 2010 20:05:49 +0200 To: gcc@gcc.gnu.org connect(): No such file or directory From: Joshua Haberman Subject: useless stores generated when returning a struct -- bug? Date: Tue, 18 May 2010 18:06:00 -0000 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit User-Agent: Loom/3.14 (http://gmane.org/) X-IsSubscribed: yes Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org X-SW-Source: 2010-05/txt/msg00335.txt.bz2 I have a case where I think useless stores are being generated, but I want to be sure before I file a bug. This is with gcc 4.4.3 on Ubuntu 10.04, x86-64. I have been experimenting with returning structs from functions instead of passing pointers to "out" parameters. This seems like it should be more optimizer-friendly because you can avoid taking addresses of local variables, which prevents them from possibly being aliased. However in this test case, gcc is generating four stores that appear to be completely useless: #include struct twoints { uint64_t a, b; } foo(); void bar(uint64_t a, uint64_t b); void func() { struct twoints s = foo(); bar(s.a, s.b); } $ gcc -Wall -c -o testbad.o -msse2 -O3 -fomit-frame-pointer testbad.c- $ objdump -d -r -M intel testbad.o testbad.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 : 0: 48 83 ec 28 sub rsp,0x28 4: 31 c0 xor eax,eax 6: e8 00 00 00 00 call b 7: R_X86_64_PC32 foo-0x4 b: 48 89 04 24 mov QWORD PTR [rsp],rax f: 48 89 54 24 08 mov QWORD PTR [rsp+0x8],rdx 14: 48 89 d6 mov rsi,rdx 17: 48 89 44 24 10 mov QWORD PTR [rsp+0x10],rax 1c: 48 89 54 24 18 mov QWORD PTR [rsp+0x18],rdx 21: 48 89 c7 mov rdi,rax 24: 48 83 c4 28 add rsp,0x28 28: e9 00 00 00 00 jmp 2d 29: R_X86_64_PC32 bar-0x4 Why is it storing rax and rdx to the stack twice? These stores are never used AFAICS. Josh