From 5720520fc703f006b311bdbd07bc503028c1dbbb Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 20 Nov 2002 10:03:36 +0000 Subject: [PATCH] * sched-deps.c (sched_analyze): Check HARD_REGNO_CALL_PART_CLOBBERED. From-SVN: r59300 --- gcc/ChangeLog | 4 +++ gcc/sched-deps.c | 8 ++++-- gcc/testsuite/ChangeLog | 4 +++ .../gcc.c-torture/execute/20021120-3.c | 26 +++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20021120-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 414a9475858f..5961678e5511 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2002-11-20 Richard Sandiford + + * sched-deps.c (sched_analyze): Check HARD_REGNO_CALL_PART_CLOBBERED. + 2002-11-20 Richard Sandiford * config/sh/sh.md (udivsi3): Don't put udivsi3_i4_media instructions diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index cf762cccb589..98b0732291b5 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -1287,8 +1287,12 @@ sched_analyze (deps, head, tail) 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)) + /* 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 01d9f4148adb..aef782623ad8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-11-20 Richard Sandiford + + * gcc.c-torture/execute/20021120-3.c: New test. + 2002-11-20 Richard Sandiford * gcc.c-torture/execute/20021120-2.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/20021120-3.c b/gcc/testsuite/gcc.c-torture/execute/20021120-3.c new file mode 100644 index 000000000000..e875f1f45c47 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20021120-3.c @@ -0,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); +}