diff options
author | Brad Kaiser <bkaiser@acelink.net> | 2001-11-21 00:04:47 +0000 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2001-11-20 16:04:47 -0800 |
commit | 92a2114171f4ab907f94f3629f1412579a8d8584 (patch) | |
tree | 254f95bb18f5024720a10541c4c4bacfe2730a8f /gcc/testsuite | |
parent | da6ccf8361f36e7111cdf92dbc6afb637b3adf2c (diff) | |
download | gcc-92a2114171f4ab907f94f3629f1412579a8d8584.zip gcc-92a2114171f4ab907f94f3629f1412579a8d8584.tar.gz gcc-92a2114171f4ab907f94f3629f1412579a8d8584.tar.bz2 |
reload1.c (elimination_effects): Use function_invariant_p instead of CONSTANT_P when...
* reload1.c (elimination_effects): Use function_invariant_p
instead of CONSTANT_P when considering register equivalences.
From-SVN: r47226
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/gcc.dg/20011119-1.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/20011119-1.c b/gcc/testsuite/gcc.dg/20011119-1.c new file mode 100644 index 0000000..5b3c00c --- /dev/null +++ b/gcc/testsuite/gcc.dg/20011119-1.c @@ -0,0 +1,80 @@ +/* Test for reload failing to eliminate from argp to sp. */ +/* { dg-do run { target i?86-*-* } } */ +/* { dg-options "-O2 -fomit-frame-pointer" } */ + +static int ustrsize (const char *s); +static int (*ucwidth) (int c); +static int (*ugetxc) (const char **s); +static int (*usetc) (char *s, int c); + +char *ustrzcat(char *dest, int size, const char *src) +{ + int pos = ustrsize(dest); + int c; + + size -= pos + ucwidth(0); + + while ((c = ugetxc(&src)) != 0) { + size -= ucwidth(c); + if (size < 0) + break; + + pos += usetc(dest+pos, c); + } + + usetc(dest+pos, 0); + + return dest; +} + +static int __attribute__((noinline)) +ustrsize (const char *s) +{ + return 0; +} + +static int +ucwidth_ (int c) +{ + return 1; +} + +static int +ugetxc_ (const char **s) +{ + return '\0'; +} + +static int +usetc_ (char *s, int c) +{ + return 1; +} + +int +main() +{ + ucwidth = ucwidth_; + ugetxc = ugetxc_; + usetc = usetc_; + + /* ??? It is impossible to explicitly modify the hard frame pointer. + This will run afoul of code in flow.c that declines to mark regs + in eliminate_regs in regs_ever_used. Apparently, we have to wait + for reload to decide that it won't need a frame pointer before a + variable can be allocated to %ebp. + + So save, restore, and clobber %ebp by hand. */ + + asm ("pushl %%ebp\n\t" + "movl $-1, %%ebp\n\t" + "pushl $0\n\t" + "pushl $0\n\t" + "pushl $0\n\t" + "call %P0\n\t" + "addl $12, %%esp\n\t" + "popl %%ebp" + : : "i"(ustrzcat)); + + return 0; +} |