From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13493 invoked by alias); 18 Nov 2002 11:16:25 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 13480 invoked from network); 18 Nov 2002 11:16:20 -0000 Received: from unknown (HELO executor.cambridge.redhat.com) (195.224.55.237) by sources.redhat.com with SMTP; 18 Nov 2002 11:16:20 -0000 Received: from talisman.cambridge.redhat.com (talisman.cambridge.redhat.com [172.16.18.81]) by executor.cambridge.redhat.com (Postfix) with ESMTP id 77939ABAF8 for ; Mon, 18 Nov 2002 11:16:19 +0000 (GMT) Received: (from rsandifo@localhost) by talisman.cambridge.redhat.com (8.11.6/8.11.0) id gAIBGJO19970; Mon, 18 Nov 2002 11:16:19 GMT X-Authentication-Warning: talisman.cambridge.redhat.com: rsandifo set sender to rsandifo@redhat.com using -f To: gcc-patches@gcc.gnu.org Subject: Scheduler patch for HARD_REGNO_CALL_PART_CLOBBERED From: Richard Sandiford Date: Mon, 18 Nov 2002 03:16:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-11/txt/msg01008.txt.bz2 If an instruction modifies the clobbered part of a partly call-clobbered register, the scheduler might still move that instruction across a call. Patch tested on sh64-elf. Fixes the attached test case for -m5-32media. OK to install? Richard * sched-deps.c (sched_analyze): Check HARD_REGNO_CALL_PART_CLOBBERED. Index: sched-deps.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/sched-deps.c,v retrieving revision 1.48 diff -c -d -p -F^[(a-zA-Z0-9_^#] -r1.48 sched-deps.c *** sched-deps.c 27 Sep 2002 01:07:52 -0000 1.48 --- sched-deps.c 18 Nov 2002 11:10:25 -0000 *************** sched_analyze (deps, head, tail) *** 1287,1294 **** SET_REGNO_REG_SET (reg_pending_sets, i); SET_REGNO_REG_SET (reg_pending_uses, i); } ! /* Other call-clobbered hard regs may be clobbered. */ ! else if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)) SET_REGNO_REG_SET (reg_pending_clobbers, i); /* We don't know what set of fixed registers might be used by the function, but it is certain that the stack pointer --- 1287,1298 ---- SET_REGNO_REG_SET (reg_pending_sets, i); SET_REGNO_REG_SET (reg_pending_uses, i); } ! /* Other call-clobbered hard regs may be clobbered. ! Since we only have a choice between 'might be clobbered' ! and 'definitely not clobbered', we must include all ! partly call-clobbered registers here. */ ! else if (HARD_REGNO_CALL_PART_CLOBBERED (i, reg_raw_mode[i]) ! || TEST_HARD_REG_BIT (regs_invalidated_by_call, i)) SET_REGNO_REG_SET (reg_pending_clobbers, i); /* We don't know what set of fixed registers might be used by the function, but it is certain that the stack pointer *** /dev/null Tue Nov 14 21:44:43 2000 --- testsuite/gcc.c-torture/execute/20021112-5.c Fri Nov 15 16:39:39 2002 *************** *** 0 **** --- 1,26 ---- + /* Test whether a partly call-clobbered register will be moved over a call. + Although the original test case didn't use any GNUisms, it proved + difficult to reduce without the named register extension. */ + #if __SH64__ == 32 + #define LOC asm ("r10") + #else + #define LOC + #endif + + unsigned int foo (char *c, unsigned int x, unsigned int y) + { + register unsigned int z LOC; + + sprintf (c, "%d", x / y); + z = x + 1; + return z / (y + 1); + } + + int main () + { + char c[16]; + + if (foo (c, ~1U, 4) != (~0U / 5)) + abort (); + exit (0); + }