From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24452 invoked by alias); 8 Jan 2003 14:26:04 -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 24420 invoked by uid 71); 8 Jan 2003 14:26:03 -0000 Resent-Date: 8 Jan 2003 14:26:03 -0000 Resent-Message-ID: <20030108142603.24419.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, schwab@suse.de Received: (qmail 22894 invoked from network); 8 Jan 2003 14:23:58 -0000 Received: from unknown (HELO Cantor.suse.de) (213.95.15.193) by 209.249.29.67 with SMTP; 8 Jan 2003 14:23:58 -0000 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id BBEE114ABA for ; Wed, 8 Jan 2003 15:23:43 +0100 (MET) Message-Id: <20030108142342.E032A20F821@sykes.suse.de> Date: Wed, 08 Jan 2003 14:26:00 -0000 From: schwab@suse.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: 3.113 Subject: optimization/9226: GCSE breaking argument passing X-SW-Source: 2003-01/txt/msg00535.txt.bz2 List-Id: >Number: 9226 >Category: optimization >Synopsis: GCSE breaking argument passing >Confidential: no >Severity: critical >Priority: medium >Responsible: unassigned >State: open >Class: wrong-code >Submitter-Id: net >Arrival-Date: Wed Jan 08 06:26:01 PST 2003 >Closed-Date: >Last-Modified: >Originator: >Release: 3.4 20030107 (experimental) >Organization: >Environment: System: Linux sykes 2.4.19-SMP #1 SMP Wed Dec 11 22:55:37 UTC 2002 ia64 unknown unknown GNU/Linux Architecture: ia64 host: ia64-unknown-linux-gnu build: ia64-unknown-linux-gnu target: m68k-unknown-linux-gnu configured with: /cvs/gcc/configure --with-gcc-version-trigger=/cvs/gcc/gcc/version.c --host=ia64-unknown-linux --target=m68k-linux --prefix=/usr/local/m68k-linux --enable-languages=c++ --with-ld=/usr/local/m68k-linux/m68k-linux/bin/ld --with-as=/usr/local/m68k-linux/m68k-linux/bin/as --enable-shared >Description: GCSE is replacing references to the stack pointer by a different register during argument passing. Before GCSE: (insn 24 23 28 0 0x2000000002410840 (set (reg/v/f:SI 36) (reg/f:SI 15 %sp)) 29 {*m68k.md:978} (nil) (nil)) (insn 28 24 29 0 0x2000000002410840 (set (mem/f:SI (pre_dec:SI (reg/f:SI 15 %sp)) [0 S4 A16]) (reg/v:SI 33)) 29 {*m68k.md:978} (nil) (nil)) (insn 29 28 30 0 0x2000000002410840 (set (mem/f:SI (pre_dec:SI (reg/f:SI 15 %sp)) [0 S4 A16]) (reg/v/f:SI 29)) 29 {*m68k.md:978} (nil) (nil)) (insn 30 29 31 0 0x2000000002410840 (set (mem/f:SI (pre_dec:SI (reg/f:SI 15 %sp)) [0 S4 A16]) (reg/v/f:SI 36)) 29 {*m68k.md:978} (nil) (nil)) (insn 31 30 32 0 0x2000000002410840 (set (reg/f:SI 44) (symbol_ref:SI ("memcpy"))) 29 {*m68k.md:978} (nil) (expr_list:REG_EQUAL (symbol_ref:SI ("memcpy")) (nil))) After GCSE: (insn 24 23 28 0 0x2000000002410840 (set (reg/v/f:SI 36) (reg/f:SI 15 %sp)) 29 {*m68k.md:978} (nil) (nil)) (insn 28 24 29 0 0x2000000002410840 (set (mem/f:SI (pre_dec:SI (reg/f:SI 15 %sp)) [0 S4 A16]) (reg/v:SI 33)) 29 {*m68k.md:978} (nil) (nil)) (insn 29 28 30 0 0x2000000002410840 (set (mem/f:SI (pre_dec:SI (reg/v/f:SI 36)) [0 S4 A16]) (reg/v/f:SI 29)) 29 {*m68k.md:978} (nil) (nil)) (insn 30 29 31 0 0x2000000002410840 (set (mem/f:SI (pre_dec:SI (reg/v/f:SI 36)) [0 S4 A16]) (reg/v/f:SI 36)) 29 {*m68k.md:978} (nil) (nil)) (insn 31 30 32 0 0x2000000002410840 (set (reg/f:SI 44) (symbol_ref:SI ("memcpy"))) 29 {*m68k.md:978} (nil) (expr_list:REG_EQUAL (symbol_ref:SI ("memcpy")) (nil))) (reg 36) is not a valid replacement for (reg 15). >How-To-Repeat: $ cat alloca.c typedef unsigned int size_t; void *memcpy (void *__restrict, const void *__restrict, size_t); size_t strlen (const char *); int printf (const char *, ...); # define strdupa(s) \ (__extension__ \ ({ \ __const char *__old = (s); \ size_t __len = strlen (__old) + 1; \ char *__new = (char *) __builtin_alloca (__len); \ (char *) memcpy (__new, __old, __len); \ })) void foo (const char *x) { size_t nx; char *y = strdupa (x); nx = 1; while (*y) { if (*y == ':' || *y == ';') ++nx; y++; } printf ("%s %zu", y, nx); } $ m68k-linux-gcc -S -O2 alloca.c >Fix: >Release-Note: >Audit-Trail: >Unformatted: